clay-server 4.7.0-beta.1 → 4.7.0-beta.2
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/lib/project-connection.js +0 -14
- package/lib/project-sessions.js +0 -18
- package/lib/public/app.js +14 -14
- package/lib/public/css/pane.css +0 -1
- package/lib/public/css/projects-hub.css +75 -0
- package/lib/public/css/tui-attention.css +0 -407
- package/lib/public/index.html +3 -14
- package/lib/public/modules/app-home-hub.js +8 -3
- package/lib/public/modules/app-messages.js +0 -15
- package/lib/public/modules/app-projects.js +16 -11
- package/lib/public/modules/home-surface-boot.js +10 -3
- package/lib/public/modules/home-surface.js +13 -1
- package/lib/public/modules/projects-hub-view.js +62 -0
- package/lib/public/modules/projects-hub.js +105 -0
- package/lib/public/style.css +2 -0
- package/lib/server.js +1 -1
- package/lib/users-home-surface-preferences.js +4 -2
- package/lib/users-preferences.js +0 -36
- package/lib/users.js +0 -4
- package/lib/ws-schema.js +0 -3
- package/package.json +1 -1
- package/lib/public/modules/whats-new-article.js +0 -70
- package/lib/public/modules/whats-new.js +0 -264
- package/lib/whats-new-content.js +0 -84
- package/lib/whats-new.js +0 -57
|
@@ -219,20 +219,6 @@ function attachConnection(ctx) {
|
|
|
219
219
|
sendTo(ws, { type: "claude_open_mode_changed", claudeOpenMode: _comVal || "gui" });
|
|
220
220
|
}
|
|
221
221
|
|
|
222
|
-
// What's New: push the full entries list (for the home-page feed)
|
|
223
|
-
// plus the subset of unseen ids (for the auto-pop carousel). Content
|
|
224
|
-
// lives in lib/whats-new-content.js so adding an entry doesn't touch
|
|
225
|
-
// this file.
|
|
226
|
-
try {
|
|
227
|
-
var _wn = require("./whats-new");
|
|
228
|
-
var _wnUid = (wsUser && wsUser.id) || null;
|
|
229
|
-
var _wnState = _wnUid ? _wn.getStateForUser(_wnUid) : { entries: _wn.listEntries(), unseenIds: [] };
|
|
230
|
-
if (_wnState.entries.length > 0) {
|
|
231
|
-
sendTo(ws, { type: "whats_new_state", entries: _wnState.entries, unseenIds: _wnState.unseenIds });
|
|
232
|
-
}
|
|
233
|
-
} catch (e) {
|
|
234
|
-
if (debug) console.error("[project] whats_new send failed:", e && e.message);
|
|
235
|
-
}
|
|
236
222
|
_loop.sendConnectionState(ws);
|
|
237
223
|
if (_mcp) _mcp.sendConnectionState(ws);
|
|
238
224
|
if (_notifications) _notifications.sendConnectionState(ws, sendTo);
|
package/lib/project-sessions.js
CHANGED
|
@@ -2200,24 +2200,6 @@ function attachSessions(ctx) {
|
|
|
2200
2200
|
return true;
|
|
2201
2201
|
}
|
|
2202
2202
|
|
|
2203
|
-
if (msg.type === "whats_new_seen") {
|
|
2204
|
-
// Persist that the current user dismissed a What's New entry so it
|
|
2205
|
-
// is not shown again on future connects.
|
|
2206
|
-
var wnUserId = ws._clayUser ? ws._clayUser.id : null;
|
|
2207
|
-
if (!wnUserId) {
|
|
2208
|
-
sendTo(ws, { type: "whats_new_seen_result", ok: false, error: "no_user" });
|
|
2209
|
-
return true;
|
|
2210
|
-
}
|
|
2211
|
-
var wnSvc = require("./whats-new");
|
|
2212
|
-
var wnResult = wnSvc.markSeen(wnUserId, msg.id);
|
|
2213
|
-
if (wnResult && wnResult.ok) {
|
|
2214
|
-
sendTo(ws, { type: "whats_new_seen_result", ok: true, id: msg.id });
|
|
2215
|
-
} else {
|
|
2216
|
-
sendTo(ws, { type: "whats_new_seen_result", ok: false, error: (wnResult && wnResult.error) || "unknown" });
|
|
2217
|
-
}
|
|
2218
|
-
return true;
|
|
2219
|
-
}
|
|
2220
|
-
|
|
2221
2203
|
if (msg.type === "set_claude_open_mode") {
|
|
2222
2204
|
// Per-user preference: when Clay opens a Claude session, render it as
|
|
2223
2205
|
// the SDK-driven custom chat ("gui") or as an embedded `claude` TUI
|
package/lib/public/app.js
CHANGED
|
@@ -66,6 +66,7 @@ import { getWs as _getWsRef, setWs as _setWsRef } from './modules/ws-ref.js';
|
|
|
66
66
|
import { initHomeHub, showHomeHub as _hubShowHomeHub, hideHomeHub as _hubHideHomeHub, isHomeHubVisible, renderHomeMateSwitcher, updateHomeIconBadge } from './modules/app-home-hub.js';
|
|
67
67
|
import { initHomeSidebar } from './modules/home-sidebar.js';
|
|
68
68
|
import { openHomeMateAction } from './modules/home-mate-chat.js';
|
|
69
|
+
import { initProjectsHub, showProjectsHub, hideProjectsHub } from './modules/projects-hub.js';
|
|
69
70
|
import { initHomeSurfaceBoot } from './modules/home-surface-boot.js';
|
|
70
71
|
import { rememberHomePrimarySurface } from './modules/home-surface.js';
|
|
71
72
|
import { initRateLimit, handleRateLimitEvent as _rlHandleRateLimitEvent, updateRateLimitUsage as _rlUpdateRateLimitUsage, handleFastModeState as _rlHandleFastModeState, resetRateLimitState } from './modules/app-rate-limit.js';
|
|
@@ -83,8 +84,6 @@ import { initLoopUi, updateLoopInputVisibility as _loopUpdateLoopInputVisibility
|
|
|
83
84
|
import { initBackgroundTasksUi } from './modules/background-tasks-ui.js';
|
|
84
85
|
import { initPendingMessageQueue } from './modules/pending-message-queue.js';
|
|
85
86
|
import { initAppNotifications, handleNotificationsState as _notifHandleState, handleNotificationCreated as _notifHandleCreated, handleNotificationDismissed as _notifHandleDismissed, handleNotificationDismissedAll as _notifHandleDismissedAll } from './modules/app-notifications.js';
|
|
86
|
-
import { initWhatsNew, handleWhatsNewState as _wnHandleState, handleWhatsNewSeenResult as _wnHandleSeenResult } from './modules/whats-new.js';
|
|
87
|
-
import { initWhatsNewArticle, openArticle as openWhatsNewArticle } from './modules/whats-new-article.js';
|
|
88
87
|
import { initHeaderTuiFont } from './modules/header-tui-font.js';
|
|
89
88
|
import { createStore, store } from './modules/store.js';
|
|
90
89
|
import { initPanels, updateConfigChip as _panUpdateConfigChip, getModelEffortLevels as _panGetModelEffortLevels, accumulateUsage as _panAccumulateUsage, updateUsagePanel as _panUpdateUsagePanel, resetUsage as _panResetUsage, toggleUsagePanel as _panToggleUsagePanel, formatTokens as _panFormatTokens, updateStatusPanel as _panUpdateStatusPanel, requestProcessStats as _panRequestProcessStats, toggleStatusPanel as _panToggleStatusPanel, accumulateContext as _panAccumulateContext, updateContextPanel as _panUpdateContextPanel, resetContext as _panResetContext, resetContextData as _panResetContextData, minimizeContext as _panMinimizeContext, expandContext as _panExpandContext, toggleContextPanel as _panToggleContextPanel, getContextView as _panGetContextView, renderCtxPopover as _panRenderCtxPopover, hideCtxPopover as _panHideCtxPopover, formatBytes as _panFormatBytes, formatUptime as _panFormatUptime, getModelSupportsEffort as _panGetModelSupportsEffort, getSessionUsage, setSessionUsage, getContextData, setContextData, setContextView as _panSetContextView, applyContextView as _panApplyContextView } from './modules/app-panels.js';
|
|
@@ -296,6 +295,15 @@ import { initDebate, handleDebatePreparing, handleDebateStarted, handleDebateRes
|
|
|
296
295
|
splitGroupsProjectSlug: null,
|
|
297
296
|
socketPath: null,
|
|
298
297
|
pendingHomeProjectSlug: null,
|
|
298
|
+
projectsHubVisible: false,
|
|
299
|
+
projectsHubMarkup: null,
|
|
300
|
+
projectsHubList: [],
|
|
301
|
+
projectListLoaded: false,
|
|
302
|
+
projectsAccessLoaded: false,
|
|
303
|
+
projectsHubRestoreRequested: false,
|
|
304
|
+
projectsShowGuide: false,
|
|
305
|
+
onboardingStep: 'welcome',
|
|
306
|
+
onboardingIntent: null,
|
|
299
307
|
currentProjectOwnerId: null,
|
|
300
308
|
isOsUsers: false,
|
|
301
309
|
skipPermsEnabled: false,
|
|
@@ -814,17 +822,6 @@ import { initDebate, handleDebatePreparing, handleDebateStarted, handleDebateRes
|
|
|
814
822
|
// --- Notifications module ---
|
|
815
823
|
initAppNotifications();
|
|
816
824
|
|
|
817
|
-
// --- What's New viewer ---
|
|
818
|
-
initWhatsNewArticle();
|
|
819
|
-
initWhatsNew({
|
|
820
|
-
// "Read more" in the carousel opens the dedicated article viewer
|
|
821
|
-
// for the chosen entry, jumping straight to the body content
|
|
822
|
-
// (skipping the home list).
|
|
823
|
-
onReadMore: function (entryId) {
|
|
824
|
-
if (entryId) openWhatsNewArticle(entryId);
|
|
825
|
-
},
|
|
826
|
-
});
|
|
827
|
-
|
|
828
825
|
// --- Panels module ---
|
|
829
826
|
initPanels();
|
|
830
827
|
|
|
@@ -902,6 +899,8 @@ import { initDebate, handleDebatePreparing, handleDebateStarted, handleDebateRes
|
|
|
902
899
|
function switchProject(slug) { _projSwitchProject(slug); }
|
|
903
900
|
|
|
904
901
|
window.addEventListener("popstate", function () {
|
|
902
|
+
if (/^\/projects\/?$/.test(location.pathname)) { showProjectsHub(true); return; }
|
|
903
|
+
hideProjectsHub();
|
|
905
904
|
var m = location.pathname.match(/^\/p\/([a-z0-9_-]+)/);
|
|
906
905
|
var newSlug = m ? m[1] : null;
|
|
907
906
|
if (!newSlug) {
|
|
@@ -1053,7 +1052,7 @@ import { initDebate, handleDebatePreparing, handleDebateStarted, handleDebateRes
|
|
|
1053
1052
|
if (document.body) document.body.classList.add('is-multi-user');
|
|
1054
1053
|
}
|
|
1055
1054
|
if (d.user && d.user.id) { store.set({ myUserId: d.user.id }); requestDefaultVendor(); }
|
|
1056
|
-
|
|
1055
|
+
store.set({ permissions: d.permissions || null, projectsAccessLoaded: true });
|
|
1057
1056
|
if (d.mustChangePin) showForceChangePinOverlay();
|
|
1058
1057
|
// Single-user mode: clear user strip skeletons immediately (no presence message will arrive)
|
|
1059
1058
|
if (!store.get('isMultiUserMode')) {
|
|
@@ -1378,6 +1377,7 @@ import { initDebate, handleDebatePreparing, handleDebateStarted, handleDebateRes
|
|
|
1378
1377
|
// --- Home Hub module ---
|
|
1379
1378
|
initHomeHub();
|
|
1380
1379
|
initHomeSidebar();
|
|
1380
|
+
initProjectsHub();
|
|
1381
1381
|
initHomeSurfaceBoot();
|
|
1382
1382
|
|
|
1383
1383
|
// Mates live on the home hub now, so keep that pane and the C button
|
package/lib/public/css/pane.css
CHANGED
|
@@ -8,7 +8,6 @@ body.pane-mode #sidebar-resize-handle,
|
|
|
8
8
|
body.pane-mode #mate-sidebar-resize-handle,
|
|
9
9
|
body.pane-mode #sidebar-overlay,
|
|
10
10
|
body.pane-mode #home-hub,
|
|
11
|
-
body.pane-mode #whats-new-article,
|
|
12
11
|
body.pane-mode .title-bar-content,
|
|
13
12
|
body.pane-mode .dm-header-bar,
|
|
14
13
|
body.pane-mode #mobile-tab-bar,
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
body.projects-active #top-bar,
|
|
2
|
+
body.projects-active #icon-strip,
|
|
3
|
+
body.projects-active #sidebar-column,
|
|
4
|
+
body.projects-active #mate-sidebar-column,
|
|
5
|
+
body.projects-active #sidebar-resize-handle,
|
|
6
|
+
body.projects-active #mate-sidebar-resize-handle,
|
|
7
|
+
body.projects-active #sidebar-overlay,
|
|
8
|
+
body.projects-active #mobile-tab-bar,
|
|
9
|
+
body.projects-active .title-bar-content,
|
|
10
|
+
body.projects-active #user-island,
|
|
11
|
+
body.projects-active #main-area > :not(#projects-hub) { display: none !important; }
|
|
12
|
+
body.projects-active #main-area { border: 0; margin: 0; border-radius: 0; }
|
|
13
|
+
#projects-hub { position: absolute; inset: 0; overflow-y: auto; background: var(--bg); color: var(--text); padding: env(safe-area-inset-top) 0 env(safe-area-inset-bottom); }
|
|
14
|
+
#projects-hub.hidden { display: none; }
|
|
15
|
+
.projects-header { display: flex; align-items: center; justify-content: space-between; max-width: 1200px; margin: auto; padding: 24px 40px; gap: 20px; }
|
|
16
|
+
.projects-brand { display: inline-flex; align-items: center; gap: 10px; font-size: 16px; font-weight: 600; letter-spacing: -.6px; color: var(--text); text-decoration: none; }
|
|
17
|
+
.projects-brand img { width: 28px; height: 28px; }
|
|
18
|
+
.projects-header nav { display: flex; gap: 6px; }
|
|
19
|
+
.projects-main { width: min(100%, 1040px); margin: auto; padding: 48px 40px 64px; }
|
|
20
|
+
.projects-eyebrow { font-size: 11px; font-weight: 600; letter-spacing: 1.8px; color: var(--brand-clay); margin-bottom: 22px; }
|
|
21
|
+
#projects-title { font-size: clamp(32px, 4vw, 48px); letter-spacing: -1.7px; line-height: 1.1; font-weight: 500; outline: none; }
|
|
22
|
+
.projects-welcome #projects-title { font-size: clamp(44px, 6.5vw, 76px); letter-spacing: -3px; line-height: 1.02; }
|
|
23
|
+
.projects-lead { margin-top: 20px; font-size: 16px; line-height: 1.7; color: var(--text-muted); }
|
|
24
|
+
.projects-intro-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 48px; border-top: 1px solid var(--border); margin: 42px 0 32px; padding-top: 24px; max-width: 760px; }
|
|
25
|
+
.projects-intro-grid span { font-size: 10px; font-weight: 600; letter-spacing: 1.3px; color: var(--text-dimmer); }
|
|
26
|
+
.projects-intro-grid h2 { font-size: 17px; font-weight: 500; margin: 12px 0 8px; letter-spacing: -.3px; }
|
|
27
|
+
.projects-intro-grid p { font-size: 13px; line-height: 1.75; color: var(--text-muted); max-width: 330px; }
|
|
28
|
+
.projects-button { display: inline-flex; justify-content: center; align-items: center; gap: 10px; font: inherit; font-size: 13px; font-weight: 500; padding: 11px 16px; border: 1px solid var(--border); border-radius: 8px; background: var(--bg-alt); color: var(--text); cursor: pointer; }
|
|
29
|
+
.projects-button .lucide { width: 16px; height: 16px; }
|
|
30
|
+
.projects-button:hover { background: var(--border-subtle); }
|
|
31
|
+
.projects-button-primary { background: var(--text); color: var(--bg); border-color: var(--text); }
|
|
32
|
+
.projects-button-primary:hover { background: var(--text-secondary); }
|
|
33
|
+
.projects-button-quiet { background: transparent; border-color: transparent; color: var(--text-muted); }
|
|
34
|
+
.projects-welcome-actions { display: flex; align-items: center; flex-wrap: wrap; gap: 12px; }
|
|
35
|
+
.projects-footnote { font-size: 11px; color: var(--text-dimmer); margin-top: 18px; }
|
|
36
|
+
.projects-heading { display: flex; justify-content: space-between; align-items: flex-start; gap: 24px; margin-bottom: 32px; }
|
|
37
|
+
.projects-heading .projects-eyebrow { margin-bottom: 14px; }
|
|
38
|
+
.projects-heading .projects-lead { font-size: 14px; margin-top: 12px; }
|
|
39
|
+
.projects-setup-actions { border: 1px solid var(--border); border-radius: 12px; overflow: hidden; }
|
|
40
|
+
.projects-setup-action, .projects-list-item { display: flex; align-items: center; gap: 18px; width: 100%; text-align: left; padding: 23px 24px; border: 0; background: transparent; color: var(--text); font: inherit; cursor: pointer; }
|
|
41
|
+
.projects-setup-action + .projects-setup-action { border-top: 1px solid var(--border-subtle); }
|
|
42
|
+
.projects-setup-action:hover, .projects-list-item:hover { background: var(--bg-alt); }
|
|
43
|
+
.projects-setup-action strong, .projects-list-item strong { display: block; font-size: 15px; font-weight: 500; }
|
|
44
|
+
.projects-setup-action span span, .projects-list-item span span { display: block; color: var(--text-muted); font-size: 12px; margin-top: 6px; line-height: 1.5; overflow-wrap: anywhere; }
|
|
45
|
+
.projects-setup-action > .lucide, .projects-list-item > .lucide { margin-left: auto; width: 17px; height: 17px; flex-shrink: 0; color: var(--text-dimmer); }
|
|
46
|
+
.projects-action-icon { display: inline-flex; padding: 10px; border-radius: 10px; background: var(--bg-alt); color: var(--brand-clay); }
|
|
47
|
+
.projects-action-icon .lucide { width: 22px; height: 22px; }
|
|
48
|
+
.projects-next-step { font-size: 13px; color: var(--text-muted); line-height: 1.7; margin-top: 28px; max-width: 560px; }
|
|
49
|
+
.projects-next-step span { display: block; margin-bottom: 8px; font-size: 10px; letter-spacing: 1.4px; color: var(--text-dimmer); }
|
|
50
|
+
.projects-list { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; margin-bottom: 40px; }
|
|
51
|
+
.projects-list-item { border: 1px solid var(--border); border-radius: 12px; padding: 18px; min-width: 0; }
|
|
52
|
+
.projects-list-item > span:nth-child(2) { min-width: 0; }
|
|
53
|
+
.projects-section-title { font-size: 13px; font-weight: 500; margin-bottom: 14px; }
|
|
54
|
+
.projects-status, .projects-loading p { color: var(--text-muted); font-size: 13px; line-height: 1.6; margin: 20px 0; }
|
|
55
|
+
.projects-footer { max-width: 1040px; margin: auto; padding: 0 40px 28px; font-size: 11px; color: var(--text-dimmer); }
|
|
56
|
+
#projects-hub button:disabled { opacity: .5; cursor: default; }
|
|
57
|
+
#projects-hub button:focus-visible, #projects-hub a:focus-visible { outline: 2px solid var(--brand-clay); outline-offset: 3px; }
|
|
58
|
+
@media (max-width: 600px) {
|
|
59
|
+
.projects-header { padding: 20px; gap: 10px; }
|
|
60
|
+
.projects-brand { font-size: 14px; }
|
|
61
|
+
.projects-header .projects-button { padding: 9px; }
|
|
62
|
+
.projects-main { padding: 28px 22px 40px; }
|
|
63
|
+
.projects-welcome #projects-title { letter-spacing: -2px; }
|
|
64
|
+
.projects-intro-grid { grid-template-columns: 1fr; gap: 24px; margin-top: 30px; }
|
|
65
|
+
.projects-heading { flex-direction: column; gap: 12px; }
|
|
66
|
+
.projects-heading > .projects-button { padding-left: 0; }
|
|
67
|
+
.projects-list { grid-template-columns: 1fr; }
|
|
68
|
+
.projects-setup-action { padding: 20px 16px; gap: 12px; }
|
|
69
|
+
.projects-footer { padding: 0 22px 24px; }
|
|
70
|
+
}
|
|
71
|
+
@media (min-width: 601px) and (max-height: 760px) {
|
|
72
|
+
.projects-main { padding-top: 24px; }
|
|
73
|
+
.projects-welcome #projects-title { font-size: 60px; }
|
|
74
|
+
.projects-intro-grid { margin-top: 28px; margin-bottom: 24px; }
|
|
75
|
+
}
|
|
@@ -49,141 +49,6 @@ body.tui-suspended #tui-resume-bar {
|
|
|
49
49
|
.tui-resume-hint { display: none; }
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
/* Policy info modal. Themed via CSS vars so it follows light/dark.
|
|
53
|
-
The modal itself is gone; .tui-policy-modal-* rules stay because
|
|
54
|
-
What's New article bodies (lib/whats-new-content.js) still use the
|
|
55
|
-
-links class for their footer links. */
|
|
56
|
-
.tui-policy-modal-backdrop {
|
|
57
|
-
position: fixed;
|
|
58
|
-
inset: 0;
|
|
59
|
-
z-index: 9600;
|
|
60
|
-
background: rgba(0, 0, 0, 0.55);
|
|
61
|
-
display: flex;
|
|
62
|
-
align-items: center;
|
|
63
|
-
justify-content: center;
|
|
64
|
-
padding: 24px;
|
|
65
|
-
}
|
|
66
|
-
.tui-policy-modal-backdrop.hidden { display: none; }
|
|
67
|
-
.tui-policy-modal {
|
|
68
|
-
width: min(560px, 100%);
|
|
69
|
-
max-height: min(80vh, 720px);
|
|
70
|
-
background: var(--sidebar-bg);
|
|
71
|
-
border: 1px solid var(--border);
|
|
72
|
-
border-radius: 12px;
|
|
73
|
-
overflow: hidden;
|
|
74
|
-
display: flex;
|
|
75
|
-
flex-direction: column;
|
|
76
|
-
box-shadow: 0 12px 48px rgba(var(--shadow-rgb), 0.4);
|
|
77
|
-
color: var(--text);
|
|
78
|
-
}
|
|
79
|
-
.tui-policy-modal-header {
|
|
80
|
-
display: flex;
|
|
81
|
-
align-items: center;
|
|
82
|
-
justify-content: space-between;
|
|
83
|
-
padding: 14px 18px;
|
|
84
|
-
border-bottom: 1px solid var(--border);
|
|
85
|
-
flex-shrink: 0;
|
|
86
|
-
}
|
|
87
|
-
.tui-policy-modal-header h2 {
|
|
88
|
-
margin: 0;
|
|
89
|
-
font-size: 16px;
|
|
90
|
-
font-weight: 600;
|
|
91
|
-
color: var(--text);
|
|
92
|
-
}
|
|
93
|
-
.tui-policy-modal-close {
|
|
94
|
-
width: 28px;
|
|
95
|
-
height: 28px;
|
|
96
|
-
padding: 0;
|
|
97
|
-
border: none;
|
|
98
|
-
border-radius: 6px;
|
|
99
|
-
background: transparent;
|
|
100
|
-
color: var(--text-dimmer);
|
|
101
|
-
font-size: 20px;
|
|
102
|
-
cursor: pointer;
|
|
103
|
-
}
|
|
104
|
-
.tui-policy-modal-close:hover {
|
|
105
|
-
background: rgba(var(--overlay-rgb), 0.05);
|
|
106
|
-
color: var(--text);
|
|
107
|
-
}
|
|
108
|
-
.tui-policy-modal-body {
|
|
109
|
-
padding: 16px 18px 20px;
|
|
110
|
-
overflow-y: auto;
|
|
111
|
-
font-size: 13px;
|
|
112
|
-
line-height: 1.55;
|
|
113
|
-
color: var(--text-secondary);
|
|
114
|
-
}
|
|
115
|
-
.tui-policy-modal-body p {
|
|
116
|
-
margin: 0 0 12px;
|
|
117
|
-
}
|
|
118
|
-
.tui-policy-modal-body ul {
|
|
119
|
-
margin: 0 0 12px;
|
|
120
|
-
padding-left: 20px;
|
|
121
|
-
}
|
|
122
|
-
.tui-policy-modal-body li {
|
|
123
|
-
margin-bottom: 6px;
|
|
124
|
-
}
|
|
125
|
-
.tui-policy-modal-body code {
|
|
126
|
-
padding: 1px 5px;
|
|
127
|
-
border-radius: 4px;
|
|
128
|
-
background: var(--code-bg);
|
|
129
|
-
color: var(--accent);
|
|
130
|
-
font-size: 12px;
|
|
131
|
-
font-family: "Roboto Mono", monospace;
|
|
132
|
-
}
|
|
133
|
-
.tui-policy-modal-body strong {
|
|
134
|
-
color: var(--text);
|
|
135
|
-
}
|
|
136
|
-
.tui-policy-modal-body h3 {
|
|
137
|
-
margin: 18px 0 6px;
|
|
138
|
-
font-size: 13px;
|
|
139
|
-
font-weight: 600;
|
|
140
|
-
color: var(--text);
|
|
141
|
-
}
|
|
142
|
-
.tui-policy-modal-body ol {
|
|
143
|
-
margin: 0 0 12px;
|
|
144
|
-
padding-left: 20px;
|
|
145
|
-
}
|
|
146
|
-
.tui-policy-modal-body ol li {
|
|
147
|
-
margin-bottom: 6px;
|
|
148
|
-
}
|
|
149
|
-
.tui-policy-modal-body a {
|
|
150
|
-
color: var(--accent2);
|
|
151
|
-
}
|
|
152
|
-
.tui-policy-modal-body a:hover {
|
|
153
|
-
text-decoration: underline;
|
|
154
|
-
}
|
|
155
|
-
.tui-policy-modal-links {
|
|
156
|
-
margin-top: 16px;
|
|
157
|
-
font-size: 12px;
|
|
158
|
-
color: var(--text-dimmer);
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
/* Maintainer note: visually distinct from the technical explanation
|
|
162
|
-
above so it reads as a personal aside, not just more documentation. */
|
|
163
|
-
.tui-policy-maintainer-note {
|
|
164
|
-
margin-top: 18px;
|
|
165
|
-
padding: 14px 16px;
|
|
166
|
-
border-left: 3px solid var(--accent);
|
|
167
|
-
background: rgba(var(--overlay-rgb), 0.04);
|
|
168
|
-
border-radius: 0 8px 8px 0;
|
|
169
|
-
}
|
|
170
|
-
.tui-policy-maintainer-note h3 {
|
|
171
|
-
margin-top: 0;
|
|
172
|
-
}
|
|
173
|
-
.tui-policy-maintainer-note p {
|
|
174
|
-
margin-bottom: 10px;
|
|
175
|
-
color: var(--text-secondary);
|
|
176
|
-
}
|
|
177
|
-
.tui-policy-maintainer-note p:last-of-type {
|
|
178
|
-
margin-bottom: 0;
|
|
179
|
-
}
|
|
180
|
-
.tui-policy-signature {
|
|
181
|
-
margin-top: 12px !important;
|
|
182
|
-
color: var(--text-dimmer) !important;
|
|
183
|
-
font-style: italic;
|
|
184
|
-
font-size: 12px;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
52
|
/* tui-attention.css
|
|
188
53
|
Banner + modal for "claude TUI session needs your input" notifications.
|
|
189
54
|
The banner sits at the top of the viewport above any project content;
|
|
@@ -367,275 +232,3 @@ body.tui-suspended #tui-resume-bar {
|
|
|
367
232
|
padding: 4px;
|
|
368
233
|
background: #000;
|
|
369
234
|
}
|
|
370
|
-
|
|
371
|
-
/* ============================================================
|
|
372
|
-
What's New carousel
|
|
373
|
-
============================================================ */
|
|
374
|
-
.whats-new-backdrop {
|
|
375
|
-
position: fixed;
|
|
376
|
-
inset: 0;
|
|
377
|
-
z-index: 9600;
|
|
378
|
-
background: rgba(0, 0, 0, 0.55);
|
|
379
|
-
display: flex;
|
|
380
|
-
align-items: center;
|
|
381
|
-
justify-content: center;
|
|
382
|
-
padding: 24px;
|
|
383
|
-
opacity: 0;
|
|
384
|
-
transition: opacity 160ms ease;
|
|
385
|
-
}
|
|
386
|
-
.whats-new-backdrop.show { opacity: 1; }
|
|
387
|
-
.whats-new-card {
|
|
388
|
-
position: relative;
|
|
389
|
-
width: min(440px, 100%);
|
|
390
|
-
max-height: min(80vh, 640px);
|
|
391
|
-
background: var(--sidebar-bg);
|
|
392
|
-
border: 1px solid var(--border);
|
|
393
|
-
border-radius: 14px;
|
|
394
|
-
overflow: hidden;
|
|
395
|
-
display: flex;
|
|
396
|
-
flex-direction: column;
|
|
397
|
-
box-shadow: 0 12px 48px rgba(var(--shadow-rgb), 0.4);
|
|
398
|
-
color: var(--text);
|
|
399
|
-
}
|
|
400
|
-
.whats-new-close {
|
|
401
|
-
position: absolute;
|
|
402
|
-
top: 10px;
|
|
403
|
-
right: 10px;
|
|
404
|
-
width: 28px;
|
|
405
|
-
height: 28px;
|
|
406
|
-
padding: 0;
|
|
407
|
-
border: none;
|
|
408
|
-
border-radius: 6px;
|
|
409
|
-
background: rgba(var(--overlay-rgb), 0.08);
|
|
410
|
-
color: var(--text-dimmer);
|
|
411
|
-
cursor: pointer;
|
|
412
|
-
display: flex;
|
|
413
|
-
align-items: center;
|
|
414
|
-
justify-content: center;
|
|
415
|
-
z-index: 2;
|
|
416
|
-
}
|
|
417
|
-
.whats-new-close:hover {
|
|
418
|
-
background: rgba(var(--overlay-rgb), 0.15);
|
|
419
|
-
color: var(--text);
|
|
420
|
-
}
|
|
421
|
-
.whats-new-image-slot {
|
|
422
|
-
width: 100%;
|
|
423
|
-
aspect-ratio: 16 / 9;
|
|
424
|
-
background: linear-gradient(135deg, var(--accent) 0%, var(--accent2, var(--accent)) 100%);
|
|
425
|
-
flex-shrink: 0;
|
|
426
|
-
overflow: hidden;
|
|
427
|
-
display: block;
|
|
428
|
-
}
|
|
429
|
-
.whats-new-image-slot img {
|
|
430
|
-
width: 100%;
|
|
431
|
-
height: 100%;
|
|
432
|
-
object-fit: cover;
|
|
433
|
-
display: block;
|
|
434
|
-
}
|
|
435
|
-
.whats-new-image-slot.empty {
|
|
436
|
-
aspect-ratio: 16 / 6;
|
|
437
|
-
}
|
|
438
|
-
.whats-new-body {
|
|
439
|
-
padding: 18px 20px 14px;
|
|
440
|
-
display: flex;
|
|
441
|
-
flex-direction: column;
|
|
442
|
-
gap: 8px;
|
|
443
|
-
overflow-y: auto;
|
|
444
|
-
}
|
|
445
|
-
.whats-new-eyebrow {
|
|
446
|
-
font-size: 11px;
|
|
447
|
-
font-weight: 600;
|
|
448
|
-
letter-spacing: 0.06em;
|
|
449
|
-
text-transform: uppercase;
|
|
450
|
-
color: var(--text-dimmer);
|
|
451
|
-
}
|
|
452
|
-
.whats-new-title {
|
|
453
|
-
margin: 0;
|
|
454
|
-
font-size: 18px;
|
|
455
|
-
font-weight: 600;
|
|
456
|
-
line-height: 1.3;
|
|
457
|
-
color: var(--text);
|
|
458
|
-
}
|
|
459
|
-
.whats-new-summary {
|
|
460
|
-
margin: 0;
|
|
461
|
-
font-size: 13px;
|
|
462
|
-
line-height: 1.55;
|
|
463
|
-
color: var(--text-secondary);
|
|
464
|
-
}
|
|
465
|
-
.whats-new-read-more {
|
|
466
|
-
align-self: flex-start;
|
|
467
|
-
margin-top: 6px;
|
|
468
|
-
padding: 7px 14px;
|
|
469
|
-
font-size: 13px;
|
|
470
|
-
font-weight: 500;
|
|
471
|
-
border: none;
|
|
472
|
-
border-radius: 7px;
|
|
473
|
-
background: var(--accent);
|
|
474
|
-
color: var(--accent-contrast, #fff);
|
|
475
|
-
cursor: pointer;
|
|
476
|
-
display: inline-flex;
|
|
477
|
-
align-items: center;
|
|
478
|
-
}
|
|
479
|
-
.whats-new-read-more:hover {
|
|
480
|
-
filter: brightness(1.08);
|
|
481
|
-
}
|
|
482
|
-
.whats-new-nav {
|
|
483
|
-
display: flex;
|
|
484
|
-
align-items: center;
|
|
485
|
-
justify-content: space-between;
|
|
486
|
-
padding: 8px 16px 14px;
|
|
487
|
-
border-top: 1px solid var(--border);
|
|
488
|
-
flex-shrink: 0;
|
|
489
|
-
}
|
|
490
|
-
.whats-new-nav.hidden { display: none; }
|
|
491
|
-
.whats-new-prev,
|
|
492
|
-
.whats-new-next {
|
|
493
|
-
width: 30px;
|
|
494
|
-
height: 30px;
|
|
495
|
-
padding: 0;
|
|
496
|
-
border: none;
|
|
497
|
-
border-radius: 6px;
|
|
498
|
-
background: transparent;
|
|
499
|
-
color: var(--text-dimmer);
|
|
500
|
-
cursor: pointer;
|
|
501
|
-
display: flex;
|
|
502
|
-
align-items: center;
|
|
503
|
-
justify-content: center;
|
|
504
|
-
}
|
|
505
|
-
.whats-new-prev:hover,
|
|
506
|
-
.whats-new-next:hover {
|
|
507
|
-
background: rgba(var(--overlay-rgb), 0.08);
|
|
508
|
-
color: var(--text);
|
|
509
|
-
}
|
|
510
|
-
.whats-new-prev:disabled,
|
|
511
|
-
.whats-new-next:disabled {
|
|
512
|
-
opacity: 0.35;
|
|
513
|
-
cursor: default;
|
|
514
|
-
}
|
|
515
|
-
.whats-new-dots {
|
|
516
|
-
display: flex;
|
|
517
|
-
gap: 6px;
|
|
518
|
-
align-items: center;
|
|
519
|
-
}
|
|
520
|
-
.whats-new-dot {
|
|
521
|
-
width: 7px;
|
|
522
|
-
height: 7px;
|
|
523
|
-
padding: 0;
|
|
524
|
-
border: none;
|
|
525
|
-
border-radius: 50%;
|
|
526
|
-
background: var(--text-dimmer);
|
|
527
|
-
opacity: 0.35;
|
|
528
|
-
cursor: pointer;
|
|
529
|
-
transition: opacity 120ms ease, transform 120ms ease;
|
|
530
|
-
}
|
|
531
|
-
.whats-new-dot.active {
|
|
532
|
-
opacity: 1;
|
|
533
|
-
background: var(--accent);
|
|
534
|
-
transform: scale(1.2);
|
|
535
|
-
}
|
|
536
|
-
|
|
537
|
-
/* ============================================================
|
|
538
|
-
Whats New article (blog-style reading view)
|
|
539
|
-
============================================================
|
|
540
|
-
Mirrors #home-hub positioning: absolute inset:0 inside
|
|
541
|
-
#main-area so the icon strip, top bar, and any other chrome
|
|
542
|
-
outside #main-area stay visible. Sidebar-column (inside
|
|
543
|
-
main-area) is covered, same as home-hub. */
|
|
544
|
-
#whats-new-article {
|
|
545
|
-
position: absolute;
|
|
546
|
-
inset: 0;
|
|
547
|
-
z-index: 210;
|
|
548
|
-
background: var(--bg);
|
|
549
|
-
overflow-y: auto;
|
|
550
|
-
display: flex;
|
|
551
|
-
flex-direction: column;
|
|
552
|
-
border-top-left-radius: 8px;
|
|
553
|
-
}
|
|
554
|
-
#whats-new-article.hidden { display: none; }
|
|
555
|
-
.wna-toolbar {
|
|
556
|
-
position: sticky;
|
|
557
|
-
top: 0;
|
|
558
|
-
display: flex;
|
|
559
|
-
align-items: center;
|
|
560
|
-
padding: 12px 20px;
|
|
561
|
-
background: var(--bg);
|
|
562
|
-
border-bottom: 1px solid var(--border);
|
|
563
|
-
z-index: 1;
|
|
564
|
-
}
|
|
565
|
-
.wna-back {
|
|
566
|
-
display: inline-flex;
|
|
567
|
-
align-items: center;
|
|
568
|
-
gap: 8px;
|
|
569
|
-
padding: 6px 12px;
|
|
570
|
-
border: none;
|
|
571
|
-
border-radius: 6px;
|
|
572
|
-
background: transparent;
|
|
573
|
-
color: var(--text-secondary);
|
|
574
|
-
font-size: 13px;
|
|
575
|
-
cursor: pointer;
|
|
576
|
-
}
|
|
577
|
-
.wna-back:hover {
|
|
578
|
-
background: rgba(var(--overlay-rgb), 0.06);
|
|
579
|
-
color: var(--text);
|
|
580
|
-
}
|
|
581
|
-
.wna-content {
|
|
582
|
-
width: 100%;
|
|
583
|
-
max-width: 680px;
|
|
584
|
-
margin: 0 auto;
|
|
585
|
-
padding: 56px 32px 96px;
|
|
586
|
-
box-sizing: border-box;
|
|
587
|
-
}
|
|
588
|
-
.wna-date {
|
|
589
|
-
font-size: 12px;
|
|
590
|
-
color: var(--text-dimmer);
|
|
591
|
-
letter-spacing: 0.04em;
|
|
592
|
-
margin-bottom: 12px;
|
|
593
|
-
font-variant-numeric: tabular-nums;
|
|
594
|
-
}
|
|
595
|
-
.wna-title {
|
|
596
|
-
margin: 0 0 32px;
|
|
597
|
-
font-size: 32px;
|
|
598
|
-
font-weight: 700;
|
|
599
|
-
line-height: 1.2;
|
|
600
|
-
color: var(--text);
|
|
601
|
-
letter-spacing: -0.01em;
|
|
602
|
-
}
|
|
603
|
-
.wna-body {
|
|
604
|
-
font-size: 15px;
|
|
605
|
-
line-height: 1.7;
|
|
606
|
-
color: var(--text);
|
|
607
|
-
}
|
|
608
|
-
.wna-body p {
|
|
609
|
-
margin: 0 0 18px;
|
|
610
|
-
}
|
|
611
|
-
.wna-body p:last-child { margin-bottom: 0; }
|
|
612
|
-
.wna-body h3 {
|
|
613
|
-
margin: 36px 0 12px;
|
|
614
|
-
font-size: 18px;
|
|
615
|
-
font-weight: 600;
|
|
616
|
-
color: var(--text);
|
|
617
|
-
letter-spacing: -0.005em;
|
|
618
|
-
}
|
|
619
|
-
.wna-body ul, .wna-body ol {
|
|
620
|
-
margin: 0 0 18px;
|
|
621
|
-
padding-left: 22px;
|
|
622
|
-
}
|
|
623
|
-
.wna-body li {
|
|
624
|
-
margin-bottom: 8px;
|
|
625
|
-
}
|
|
626
|
-
.wna-body code {
|
|
627
|
-
padding: 2px 6px;
|
|
628
|
-
border-radius: 4px;
|
|
629
|
-
background: var(--code-bg);
|
|
630
|
-
color: var(--accent);
|
|
631
|
-
font-size: 13px;
|
|
632
|
-
font-family: "Roboto Mono", monospace;
|
|
633
|
-
}
|
|
634
|
-
.wna-body strong { color: var(--text); font-weight: 600; }
|
|
635
|
-
.wna-body em { color: var(--text-secondary); }
|
|
636
|
-
.wna-body a { color: var(--accent2); }
|
|
637
|
-
.wna-body a:hover { text-decoration: underline; }
|
|
638
|
-
@media (max-width: 640px) {
|
|
639
|
-
.wna-content { padding: 32px 20px 80px; }
|
|
640
|
-
.wna-title { font-size: 26px; }
|
|
641
|
-
}
|
package/lib/public/index.html
CHANGED
|
@@ -124,6 +124,7 @@
|
|
|
124
124
|
|
|
125
125
|
<!-- === Main Area (sidebar + resize-handle + main-column) === -->
|
|
126
126
|
<div id="main-area">
|
|
127
|
+
<section id="projects-hub" class="hidden" aria-label="Projects"></section>
|
|
127
128
|
<div id="home-hub" class="hidden">
|
|
128
129
|
<div class="home-hub-inner">
|
|
129
130
|
<button id="home-sidebar-backdrop" class="home-sidebar-backdrop" type="button" aria-label="Close Home navigation"></button>
|
|
@@ -136,6 +137,7 @@
|
|
|
136
137
|
</div>
|
|
137
138
|
</div>
|
|
138
139
|
<nav class="home-sidebar-primary-actions" aria-label="Home actions">
|
|
140
|
+
<button id="home-nav-projects" class="home-sidebar-action" type="button" title="Projects" aria-label="Projects"><span class="home-sidebar-action-icon" aria-hidden="true"><i data-lucide="folder"></i></span><span>Projects</span></button>
|
|
139
141
|
<button id="home-sidebar-new" class="home-sidebar-action home-sidebar-new" type="button" title="New Chat" aria-label="Start a new chat with the current Mate" disabled><span class="home-sidebar-action-icon" aria-hidden="true"><i data-lucide="message-square-plus"></i></span><span>New Chat</span></button>
|
|
140
142
|
<button id="home-sidebar-debate" class="home-sidebar-action" type="button" title="Browse debates" aria-label="Browse debates" aria-pressed="false"><span class="home-sidebar-action-icon" aria-hidden="true"><i data-lucide="messages-square"></i></span><span>Debates</span></button>
|
|
141
143
|
<button id="home-tools-btn" class="home-sidebar-action" type="button" title="Capsules" aria-label="Capsules" aria-expanded="false" aria-controls="home-tool-workbench"><span class="home-sidebar-action-icon" aria-hidden="true"><i data-lucide="box"></i></span><span id="home-tools-label">Capsules</span><span id="home-tools-activity" class="home-tools-activity" aria-hidden="true"></span></button>
|
|
@@ -157,7 +159,7 @@
|
|
|
157
159
|
</aside>
|
|
158
160
|
<div id="home-workspace" class="home-workspace">
|
|
159
161
|
<button id="home-sidebar-expand" class="home-sidebar-expand" type="button" title="Show sidebar" aria-label="Show Home sidebar" aria-describedby="home-sidebar-expand-brand-label"><i data-lucide="panel-left-open"></i><span id="home-sidebar-expand-brand-label" class="home-sidebar-brand-wordmark home-sidebar-expand-wordmark">Clay Studio</span></button>
|
|
160
|
-
<button id="home-close-control" class="home-close-control
|
|
162
|
+
<button id="home-close-control" class="home-close-control" type="button" title="Projects" aria-label="Projects"><i data-lucide="folder" aria-hidden="true"></i><span>Projects</span></button>
|
|
161
163
|
<div id="home-conversation-region" class="home-conversation-region">
|
|
162
164
|
<div id="home-mate-chat" class="home-mate-chat">
|
|
163
165
|
<div class="home-mate-chat-stage">
|
|
@@ -216,19 +218,6 @@
|
|
|
216
218
|
</div>
|
|
217
219
|
</div>
|
|
218
220
|
|
|
219
|
-
<div id="whats-new-article" class="hidden">
|
|
220
|
-
<header class="wna-toolbar">
|
|
221
|
-
<button type="button" class="wna-back" id="wna-back">
|
|
222
|
-
<svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="19" y1="12" x2="5" y2="12"></line><polyline points="12 19 5 12 12 5"></polyline></svg>
|
|
223
|
-
<span>Back</span>
|
|
224
|
-
</button>
|
|
225
|
-
</header>
|
|
226
|
-
<article class="wna-content">
|
|
227
|
-
<div class="wna-date" id="wna-date"></div>
|
|
228
|
-
<h1 class="wna-title" id="wna-title"></h1>
|
|
229
|
-
<div class="wna-body" id="wna-body"></div>
|
|
230
|
-
</article>
|
|
231
|
-
</div>
|
|
232
221
|
<div id="sidebar-column">
|
|
233
222
|
<div class="title-bar-sidebar">
|
|
234
223
|
<button class="title-bar-project-dropdown" id="title-bar-project-dropdown">
|