glad-web 1.0.28 → 1.0.30

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.
@@ -0,0 +1,377 @@
1
+ :root { --primary: #007aff; --bg: #000; --card-bg: #1c1c1e; --text: #fff; --text-dim: #8e8e93; --terminal-controls-rest-height: 108px; --chat-content-max: 900px; --control-content-max: 1100px; }
2
+ body, html { margin: 0; padding: 0; height: 100dvh; width: 100vw; background: var(--bg); color: var(--text); overflow: hidden; overflow-anchor: none; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; }
3
+ .view { display: none; height: 100%; width: 100%; flex-direction: column; }
4
+ .view.active { display: flex; }
5
+ #lobby { overflow-y: auto; padding: 20px; padding-top: env(safe-area-inset-top); box-sizing: border-box; }
6
+ .header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 24px; }
7
+ .header h1 { font-size: 28px; font-weight: 700; margin: 0; display: flex; align-items: center; gap: 10px; }
8
+ .header-logo { width: 32px; height: 32px; flex-shrink: 0; }
9
+ .btn-new { background: var(--primary); color: #fff; border: none; padding: 8px 11px; border-radius: 16px; font-weight: 700; font-size: 13px; cursor: pointer; display: inline-flex; align-items: center; gap: 4px; min-height: 32px; white-space: nowrap; }
10
+ .btn-retry { background: #333; color: #fff; border: none; padding: 8px 16px; border-radius: 20px; margin-top: 10px; cursor: pointer; }
11
+ .session-card { background: var(--card-bg); border-radius: 12px; padding: 16px; margin-bottom: 12px; display: flex; justify-content: space-between; align-items: center; transition: transform 0.1s; position: relative; }
12
+ .session-card:active { transform: scale(0.98); }
13
+ .completion-dot { width: 9px; height: 9px; border-radius: 50%; background: #ff3b30; flex-shrink: 0; }
14
+ .session-info { flex: 1; min-width: 0; }
15
+ .session-info h3 { margin: 0 0 4px 0; font-size: 17px; display: flex; align-items: center; gap: 8px; }
16
+ .session-info p { margin: 0; font-size: 13px; color: var(--text-dim); }
17
+ .timer-count-badge { display: inline-flex; align-items: center; gap: 3px; color: #fff; background: rgba(0,122,255,0.22); border: 1px solid rgba(0,122,255,0.34); border-radius: 999px; padding: 2px 7px; font-size: 11px; font-weight: 800; flex-shrink: 0; }
18
+ .session-dir-row { display: flex; align-items: center; gap: 6px; margin-top: 2px; }
19
+ .session-dir-row p { flex: 1; min-width: 0; font-family: monospace; overflow-wrap: anywhere; }
20
+ .copy-dir-btn { color: var(--text-dim); background: rgba(255,255,255,0.06); border: 1px solid rgba(255,255,255,0.08); border-radius: 8px; width: 28px; height: 28px; padding: 0; display: flex; align-items: center; justify-content: center; cursor: pointer; flex-shrink: 0; }
21
+ .copy-dir-btn:active { color: #fff; background: rgba(255,255,255,0.12); }
22
+ .session-actions { display: flex; gap: 12px; align-items: center; margin-left: 10px; }
23
+ .btn-join { background: rgba(255,255,255,0.1); border: none; color: var(--primary); padding: 8px 14px; border-radius: 18px; font-weight: 600; font-size: 14px; cursor: pointer; }
24
+ .icon-btn { color: var(--text-dim); background: none; border: none; padding: 4px; display: flex; align-items: center; justify-content: center; cursor: pointer; }
25
+ .icon-btn:active { color: var(--text); }
26
+ .btn-delete { color: #ff3b30; }
27
+ #modal-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.8); z-index: 10000; display: none; align-items: center; justify-content: center; padding: 20px; }
28
+ #tool-modal { background: var(--card-bg); width: 100%; max-width: 400px; border-radius: 16px; padding: 20px; box-shadow: 0 20px 40px rgba(0,0,0,0.4); }
29
+ .tool-item { padding: 12px; border-bottom: 1px solid #333; cursor: pointer; display: flex; align-items: center; border-radius: 8px; margin-top: 4px; }
30
+ .tool-item:hover { background: rgba(255,255,255,0.05); }
31
+ .tool-icon { width: 32px; height: 32px; background: #333; border-radius: 8px; margin-right: 12px; display: flex; align-items: center; justify-content: center; font-size: 18px; }
32
+ #terminal-view { background: #000; overflow-anchor: none; position: relative; }
33
+ #top-ui { flex-shrink: 0; background: #121212; border-bottom: 1px solid #222; z-index: 2000; padding-top: env(safe-area-inset-top); position: relative; }
34
+ #nav-bar { display: flex; align-items: center; padding: 8px 14px; border-bottom: 1px solid #222; }
35
+ #back-btn { color: var(--primary); font-size: 16px; font-weight: 500; display: flex; align-items: center; text-decoration: none; background: none; border: none; padding: 0; cursor: pointer; flex-shrink: 0; }
36
+ #session-title { flex: 1; text-align: center; font-weight: 600; font-size: 16px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; padding: 0 10px; min-width: 0; }
37
+ #terminal-controls { position: absolute; top: 100%; left: 0; right: 0; z-index: 2200; background: linear-gradient(180deg, rgba(18,18,18,0.98) 0%, rgba(18,18,18,0.92) 78%, rgba(18,18,18,0) 100%); border-bottom: 1px solid rgba(255,255,255,0.06); }
38
+ #terminal-controls-spacer { flex: 0 0 var(--terminal-controls-rest-height); height: var(--terminal-controls-rest-height); background: #000; }
39
+ #input-row { display: flex; align-items: flex-end; width: min(100%, var(--control-content-max)); margin: 0 auto; padding: 10px 14px 8px 14px; box-sizing: border-box; }
40
+ #cmd-input { flex: 1; min-height: 38px; max-height: 150px; background: rgba(255,255,255,0.08); border: 1px solid rgba(255,255,255,0.1); border-radius: 19px; color: #fff; padding: 9px 16px; font-size: 16px; outline: none; resize: none; overflow-y: auto; line-height: 20px; box-sizing: border-box; transition: background 0.18s ease, border-color 0.18s ease; }
41
+ #cmd-input::placeholder { color: rgba(255,255,255,0.45); }
42
+ #cmd-input:focus { background: rgba(255,255,255,0.1); border-color: rgba(0,122,255,0.42); color: #fff; }
43
+ #timer-btn { width: 38px; height: 38px; margin-left: 8px; background: rgba(255,255,255,0.08); border: 1px solid rgba(255,255,255,0.1); border-radius: 19px; color: #d1d5db; display: flex; align-items: center; justify-content: center; flex-shrink: 0; cursor: pointer; font-size: 24px; line-height: 1; }
44
+ #timer-btn.active { color: #fff; border-color: rgba(0,122,255,0.45); background: rgba(0,122,255,0.22); }
45
+ #send-btn { width: 44px; height: 38px; margin-left: 10px; background: #007aff; border: none; border-radius: 19px; color: #fff; display: flex; align-items: center; justify-content: center; flex-shrink: 0; cursor: pointer; }
46
+ #composer-menu { display: none; width: min(calc(100% - 28px), var(--control-content-max)); margin: -2px auto 8px auto; padding: 6px; border: 1px solid rgba(255,255,255,0.12); border-radius: 12px; background: rgba(38,38,42,0.98); box-shadow: 0 12px 28px rgba(0,0,0,0.28); box-sizing: border-box; }
47
+ #composer-menu.active { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 6px; }
48
+ .composer-menu-btn { min-height: 42px; border: 0; border-radius: 9px; background: rgba(255,255,255,0.08); color: #fff; font-size: 14px; font-weight: 650; cursor: pointer; }
49
+ .composer-menu-btn:hover { background: rgba(255,255,255,0.14); }
50
+ #attachment-strip { display: none; width: min(calc(100% - 28px), var(--control-content-max)); margin: -3px auto 2px auto; gap: 7px; overflow-x: auto; padding: 0 0 4px 0; box-sizing: border-box; scrollbar-width: none; }
51
+ #attachment-strip.active { display: flex; }
52
+ #attachment-strip::-webkit-scrollbar { display: none; }
53
+ .attachment-chip { min-width: 0; max-width: 210px; display: flex; align-items: center; gap: 7px; padding: 7px 9px; border: 1px solid rgba(0,122,255,0.45); border-radius: 10px; background: rgba(0,122,255,0.14); color: #e9f2ff; font-size: 12px; }
54
+ .attachment-chip.uploading { border-color: rgba(255,159,10,0.55); background: rgba(255,159,10,0.12); }
55
+ .attachment-chip-content { min-width: 0; flex: 1; }
56
+ .attachment-chip-name { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
57
+ .attachment-progress { display: block; height: 5px; margin-top: 5px; overflow: hidden; border-radius: 999px; background: rgba(255,255,255,0.16); }
58
+ .attachment-progress > span { display: block; height: 100%; border-radius: inherit; background: #ff9f0a; transition: width .15s ease; }
59
+ .attachment-progress.estimated > span { background: repeating-linear-gradient(90deg, #ff9f0a 0 12px, #ffd37b 12px 24px); background-size: 48px 100%; animation: attachment-upload-pulse .75s linear infinite; }
60
+ .attachment-status { display: block; margin-top: 3px; color: #ffd59a; font-size: 10px; }
61
+ @keyframes attachment-upload-pulse { from { background-position: 0 0; } to { background-position: 48px 0; } }
62
+ .attachment-remove { width: 19px; height: 19px; padding: 0; border: 0; border-radius: 50%; background: rgba(255,255,255,0.16); color: #fff; font-size: 15px; line-height: 18px; cursor: pointer; flex: 0 0 auto; }
63
+ #timed-send-panel { display: none; margin: 0 14px 10px 14px; padding: 12px; border: 1px solid rgba(255,255,255,0.1); border-radius: 12px; background: rgba(28,28,30,0.98); box-sizing: border-box; }
64
+ #timed-send-panel.active { display: block; }
65
+ .timed-row { display: grid; grid-template-columns: 1fr 1fr auto; gap: 8px; align-items: center; }
66
+ .timed-row select { min-width: 0; background: rgba(255,255,255,0.08); border: 1px solid rgba(255,255,255,0.1); color: #fff; border-radius: 8px; padding: 8px 9px; font-size: 13px; outline: none; box-sizing: border-box; }
67
+ .timed-preview { margin-top: 8px; color: #d1d5db; font-size: 12px; line-height: 1.4; }
68
+ .timed-editor-actions { display: flex; gap: 8px; justify-content: flex-end; margin-top: 10px; }
69
+ #timed-tag-rail { position: absolute; left: 4px; top: 58px; display: flex; flex-direction: column; gap: 6px; z-index: 2400; pointer-events: none; }
70
+ .timed-tag { width: 54px; min-height: 34px; border: 1px solid rgba(255,255,255,0.14); border-left: 0; border-radius: 0 11px 11px 0; background: rgba(0,122,255,0.24); color: #fff; backdrop-filter: blur(12px); font-size: 12px; font-weight: 800; letter-spacing: 0; cursor: pointer; display: flex; align-items: center; justify-content: center; text-align: center; line-height: 1.08; white-space: pre-line; box-shadow: 0 8px 20px rgba(0,0,0,0.25); pointer-events: auto; }
71
+ .timed-tag.active { background: rgba(0,122,255,0.42); border-color: rgba(255,255,255,0.28); }
72
+ .timed-tag:active { transform: scale(0.96); }
73
+ #shortcut-rail { display: flex; gap: 28px; overflow-x: auto; overscroll-behavior-x: contain; -webkit-overflow-scrolling: touch; scrollbar-width: none; scroll-snap-type: x mandatory; padding: 0 14px 12px 14px; box-sizing: border-box; scroll-padding-left: 14px; scroll-padding-right: 14px; }
74
+ #shortcut-rail::-webkit-scrollbar { display: none; }
75
+ .shortcut-group { flex: 0 0 calc(100vw - 28px); display: grid; gap: 8px; scroll-snap-align: start; }
76
+ .simple-shortcuts { grid-template-columns: repeat(6, minmax(0, 1fr)); }
77
+ .complex-shortcuts { grid-template-columns: repeat(6, minmax(0, 1fr)); }
78
+ .key-btn, .command-key { flex: 0 0 auto; min-width: 0; height: 40px; border: 1px solid rgba(255,255,255,0.11); border-radius: 12px; background: rgba(255,255,255,0.08); color: #d1d5db; font-size: 12px; font-weight: 700; letter-spacing: 0; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; box-sizing: border-box; white-space: nowrap; }
79
+ .key-btn { font-size: 11px; }
80
+ .shortcut-group .key-btn, .shortcut-group .command-key { width: 100%; }
81
+ .key-btn:active, .command-key:active { background: rgba(255,255,255,0.14); color: #fff; }
82
+ .key-btn.active { background: rgba(0, 122, 255, 0.25); border-color: #007aff; color: #00a2ff; }
83
+ #terminal-container { flex: 1; min-height: 0; width: 100%; background: #000; position: relative; overflow: hidden; overflow-anchor: none; }
84
+ #terminal { height: 100%; width: 100%; }
85
+ #claude-chat-container { display: none; flex: 1; min-height: 0; overflow-y: auto; background: #050505; padding: 12px 12px 24px 12px; box-sizing: border-box; -webkit-overflow-scrolling: touch; }
86
+ .claude-conversation { width: min(100%, var(--chat-content-max)); min-height: 100%; margin: 0 auto; }
87
+ #codex-chat-container { display: none; flex: 1; min-height: 0; overflow-y: auto; background: #050505; padding: 12px 12px 24px 12px; box-sizing: border-box; -webkit-overflow-scrolling: touch; }
88
+ .codex-conversation { width: min(100%, var(--chat-content-max)); margin: 0 auto; }
89
+ .codex-working-indicator, .claude-working-indicator { position: sticky; top: 0; z-index: 4; width: 28px; height: 28px; margin: 0 0 -28px auto; border: 1px solid rgba(255,255,255,.1); border-radius: 50%; background: rgba(28,28,30,.68); box-shadow: 0 5px 16px rgba(0,0,0,.24); backdrop-filter: blur(8px); pointer-events: none; }
90
+ .codex-working-indicator::after, .claude-working-indicator::after { content: ''; position: absolute; inset: 8px; border: 1.5px solid rgba(255,255,255,.7); border-top-color: transparent; border-radius: 50%; animation: codex-spin .8s linear infinite; }
91
+ .codex-message-block { max-width: 100%; margin: 0 0 12px; }
92
+ .codex-message-block.user { max-width: 92%; margin-left: auto; }
93
+ .codex-message { max-width: 100%; margin: 0; color: #f5f5f7; font-size: 14px; line-height: 1.45; overflow-wrap: anywhere; }
94
+ .codex-message.user { padding: 8px 12px; border: 1px solid rgba(0,122,255,.32); border-radius: 12px; background: rgba(0,122,255,.24); }
95
+ .codex-message.event { color: var(--text-dim); text-align: center; font-size: 12px; }
96
+ .codex-message-time { display: block; width: max-content; margin-top: 4px; padding: 0 2px; color: #8e8e93; font-size: 10px; font-weight: 500; line-height: 1; font-variant-numeric: tabular-nums; }
97
+ .codex-message-block.user .codex-message-time { margin-left: auto; }
98
+ .codex-status-card { margin: 10px 0 14px; border: 1px solid rgba(100,210,255,.2); border-radius: 10px; background: rgba(28,28,30,.72); padding: 11px; color: #f5f5f7; }
99
+ .codex-status-title { margin-bottom: 9px; color: #64d2ff; font-size: 12px; font-weight: 800; text-transform: uppercase; letter-spacing: .04em; }
100
+ .codex-status-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 7px; }
101
+ .codex-status-item { min-width: 0; border: 1px solid rgba(255,255,255,.07); border-radius: 8px; background: rgba(255,255,255,.035); padding: 8px; }
102
+ .codex-status-label { color: #8e8e93; font-size: 10px; font-weight: 800; text-transform: uppercase; }
103
+ .codex-status-value { margin-top: 3px; color: #f5f5f7; font-size: 12px; font-weight: 700; overflow-wrap: anywhere; }
104
+ .codex-tool { border: 1px solid rgba(255,255,255,.1); border-radius: 8px; background: rgba(255,255,255,.045); overflow: hidden; margin: 8px 0; color: #d1d5db; }
105
+ .codex-tool summary { list-style: none; cursor: pointer; }
106
+ .codex-tool summary::-webkit-details-marker { display: none; }
107
+ .codex-tool-header { display: flex; align-items: center; min-width: 0; gap: 8px; min-height: 34px; padding: 6px 9px; }
108
+ .codex-tool-icon { width: 19px; flex: 0 0 19px; color: #c7c7cc; font: 700 11px/1 ui-monospace, SFMono-Regular, Menlo, monospace; text-align: center; }
109
+ .codex-tool-title { flex: 0 1 auto; min-width: 0; color: #f5f5f7; font-size: 13px; font-weight: 700; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
110
+ .codex-tool-command { flex: 1; min-width: 0; color: #a9a9b0; font: 12px/1.3 ui-monospace, SFMono-Regular, Menlo, monospace; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
111
+ .codex-tool-state { flex: 0 0 auto; color: #8e8e93; font-size: 11px; }
112
+ .codex-tool-duration { flex: 0 0 auto; color: #6f6f76; font-size: 10px; font-variant-numeric: tabular-nums; }
113
+ .codex-tool-state.running::before { content: ''; display: inline-block; width: 9px; height: 9px; margin-right: 5px; border: 1.5px solid #8e8e93; border-top-color: transparent; border-radius: 50%; animation: codex-spin .8s linear infinite; vertical-align: -1px; }
114
+ .codex-tool.error { border-color: rgba(255,59,48,.38); background: rgba(255,59,48,.07); }
115
+ .codex-tool-body { border-top: 1px solid rgba(255,255,255,.08); padding: 9px 10px; }
116
+ .codex-tool-code { margin: 0; max-height: 320px; overflow: auto; color: #c7c7cc; white-space: pre-wrap; overflow-wrap: anywhere; font: 12px/1.42 ui-monospace, SFMono-Regular, Menlo, monospace; }
117
+ .codex-work-group { margin: 8px 0; border-left: 1px solid rgba(255,255,255,.12); padding-left: 8px; }
118
+ .codex-work-group > summary { list-style: none; display: flex; align-items: center; gap: 7px; min-height: 30px; color: #a9a9b0; cursor: pointer; font-size: 12px; }
119
+ .codex-work-group > summary::-webkit-details-marker { display: none; }
120
+ .codex-work-group > summary::before { content: '›'; width: 12px; color: #8e8e93; font-size: 17px; transform-origin: center; }
121
+ .codex-work-group[open] > summary::before { transform: rotate(90deg); }
122
+ .codex-work-group-body { padding-left: 2px; }
123
+ .codex-subagent-group { border-left-color: rgba(100,210,255,.24); }
124
+ .codex-subagent-group > summary { color: #8e9aa6; }
125
+ .codex-subagent-group > summary::before { color: #64a9d1; }
126
+ .codex-subagent-message { margin: 7px 0; padding: 7px 9px; border-left: 1px solid rgba(255,255,255,.1); color: #c7c7cc; font-size: 12px; line-height: 1.42; overflow-wrap: anywhere; }
127
+ .codex-subagent-message.task { color: #8e8e93; font-style: italic; }
128
+ .codex-patch-file { border-top: 1px solid rgba(255,255,255,.08); }
129
+ .codex-patch-file:first-child { border-top: 0; }
130
+ .codex-patch-file > summary { display: flex; align-items: center; gap: 8px; padding: 8px 10px; color: #d1d5db; font: 12px/1.35 ui-monospace, SFMono-Regular, Menlo, monospace; }
131
+ .codex-patch-file .path { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
132
+ .codex-patch-kind { color: #8e8e93; font-family: system-ui, sans-serif; }
133
+ .codex-diff { overflow-x: auto; border-top: 1px solid rgba(255,255,255,.08); background: rgba(0,0,0,.24); font: 11px/1.45 ui-monospace, SFMono-Regular, Menlo, monospace; }
134
+ .codex-diff-line { min-width: max-content; padding: 0 10px; white-space: pre; color: #c7c7cc; }
135
+ .codex-diff-line.add { color: #b7e4c7; background: rgba(52,199,89,.1); }
136
+ .codex-diff-line.del { color: #ffb3ad; background: rgba(255,59,48,.1); }
137
+ .codex-diff-line.hunk { color: #64b5f6; background: rgba(0,122,255,.08); }
138
+ .codex-permission-result { color: #a9a9b0; font-size: 12px; margin-top: 7px; }
139
+ .codex-inline-permission { border-top: 1px solid rgba(255,204,0,.28); padding: 9px 10px 10px; background: rgba(255,204,0,.055); }
140
+ .codex-inline-permission-title { color: #f5f5f7; font-size: 12px; font-weight: 700; }
141
+ .codex-inline-permission .claude-permission-actions { margin-top: 8px; }
142
+ .claude-approval-jump, .codex-approval-jump { cursor: pointer; font: inherit; line-height: 1; }
143
+ .claude-approval-jump:active,
144
+ .codex-approval-jump:active { background: rgba(255,204,0,0.18); transform: translateY(1px); }
145
+ .claude-approval-focus,
146
+ .codex-approval-focus { animation: codex-approval-focus 1.8s ease-out; scroll-margin: 120px 0 180px; }
147
+ @keyframes codex-approval-focus {
148
+ 0%, 28% { box-shadow: 0 0 0 3px rgba(255,204,0,.92), 0 0 28px rgba(255,204,0,.45); background-color: rgba(255,204,0,.18); }
149
+ 100% { box-shadow: 0 0 0 0 rgba(255,204,0,0); }
150
+ }
151
+ .claude-inline-permission { margin-top: 10px; padding: 10px; border-top: 1px solid rgba(255,204,0,0.22); background: rgba(255,204,0,0.04); }
152
+ .claude-inline-permission-title { margin-bottom: 7px; color: #ffcc00; font-weight: 800; }
153
+ @keyframes codex-spin { to { transform: rotate(360deg); } }
154
+ #codex-control-panel { display: none; width: min(100%, var(--control-content-max)); margin: 0 auto; padding: 8px 14px 10px; border-bottom: 1px solid #222; background: #121212; box-sizing: border-box; }
155
+ .codex-control-rail { display: flex; gap: 14px; overflow-x: auto; overscroll-behavior-x: contain; scroll-snap-type: x mandatory; scrollbar-width: none; -webkit-overflow-scrolling: touch; }
156
+ .codex-control-rail::-webkit-scrollbar { display: none; }
157
+ .codex-control-page { flex: 0 0 100%; display: grid; grid-template-columns: repeat(5, minmax(0, 116px)); grid-template-rows: auto; justify-content: center; gap: clamp(2px, .8vw, 7px); align-items: center; white-space: nowrap; scroll-snap-align: start; box-sizing: border-box; }
158
+ .codex-control-page > * { width: 100%; min-width: 0; overflow: hidden; }
159
+ .codex-control-page .claude-ctrl-btn, .codex-control-page .codex-select-label { padding-left: clamp(2px, 1vw, 10px); padding-right: clamp(2px, 1vw, 10px); font-size: clamp(8px, 2.2vw, 11px); text-overflow: ellipsis; overflow: hidden; }
160
+ .codex-select-control { position: relative; display: block; min-width: 0; height: 32px; }
161
+ .codex-select-label { display: flex; width: 100%; height: 100%; align-items: center; justify-content: center; box-sizing: border-box; border: 1px solid rgba(255,255,255,.1); border-radius: 16px; background: rgba(255,255,255,.08); color: #f5f5f7; font-size: 11px; font-weight: 800; white-space: nowrap; }
162
+ .codex-select-control:focus-within .codex-select-label { background: rgba(255,255,255,.14); border-color: rgba(0,122,255,.45); }
163
+ .codex-select { appearance: none; position: absolute; inset: 0; width: 100%; min-width: 0; height: 100%; opacity: 0; cursor: pointer; }
164
+ .codex-select option { background: #1c1c1e; color: #fff; }
165
+ #codex-model-panel, #codex-resume-panel, #codex-fork-panel { display: none; margin-top: 8px; border: 1px solid rgba(255,255,255,.1); background: rgba(28,28,30,.99); border-radius: 8px; box-shadow: 0 16px 36px rgba(0,0,0,.34); overflow: hidden; }
166
+ #codex-model-panel.active, #codex-resume-panel.active, #codex-fork-panel.active { display: block; }
167
+ #codex-model-panel { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); max-height: min(300px, 42dvh); }
168
+ #codex-model-panel.active { display: grid; }
169
+ .codex-picker-column { min-width: 0; overflow-y: auto; }
170
+ .codex-picker-column + .codex-picker-column { border-left: 1px solid rgba(255,255,255,.08); }
171
+ .codex-picker-option { display: block; width: 100%; min-height: 38px; padding: 8px 10px; border: 0; border-bottom: 1px solid rgba(255,255,255,.06); background: transparent; color: #f5f5f7; text-align: left; font-size: 12px; font-weight: 700; overflow-wrap: anywhere; }
172
+ .codex-picker-option.selected { background: rgba(0,122,255,.18); color: #fff; }
173
+ #codex-state-bar { display: flex; align-items: center; gap: 7px; min-height: 24px; margin-top: 8px; color: var(--text-dim); font-size: 11px; overflow-x: auto; scrollbar-width: none; white-space: nowrap; }
174
+ #codex-state-bar::-webkit-scrollbar { display: none; }
175
+ #codex-resume-panel, #codex-fork-panel { max-height: min(280px, 38dvh); overflow-y: auto; }
176
+ .claude-message { max-width: 92%; margin: 0 0 10px 0; padding: 10px 12px; border-radius: 8px; overflow-wrap: anywhere; line-height: 1.45; font-size: 14px; }
177
+ .claude-message-block { max-width: 100%; margin: 0 0 12px; }
178
+ .claude-message-block > .claude-message { margin-bottom: 0; }
179
+ .claude-message-block.user { max-width: 92%; margin-left: auto; }
180
+ .claude-message-block.user > .claude-message { max-width: 100%; }
181
+ .claude-message-time { display: block; width: max-content; margin-top: 4px; padding: 0 2px; color: #8e8e93; font-size: 10px; font-weight: 500; line-height: 1; font-variant-numeric: tabular-nums; }
182
+ .claude-message-block.user .claude-message-time { margin-left: auto; }
183
+ .claude-message-attachments { display: flex; flex-wrap: wrap; gap: 5px; margin-top: 6px; }
184
+ .claude-message-attachment { max-width: 100%; border: 1px solid rgba(255,255,255,.14); border-radius: 999px; padding: 3px 7px; color: #d1d5db; background: rgba(255,255,255,.07); font-size: 11px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
185
+ .claude-message.user { margin-left: auto; background: rgba(0,122,255,0.24); border: 1px solid rgba(0,122,255,0.32); color: #fff; border-radius: 12px; padding-top: 7px; padding-bottom: 7px; }
186
+ .claude-message.assistant { max-width: 100%; background: transparent; border: 0; color: #f5f5f7; padding: 0 4px; margin: 0 0 12px 0; }
187
+ .claude-message.event { max-width: 100%; background: transparent; border: 0; color: var(--text-dim); font-size: 12px; padding: 3px 2px; text-align: center; }
188
+ .claude-message.error { color: #ff6b61; }
189
+ .claude-usage-card.error, .claude-context-card.error { border-color: rgba(255,107,97,.3); }
190
+ .claude-usage-card.error .codex-status-title,
191
+ .claude-usage-card.error .codex-status-value,
192
+ .claude-context-card.error .codex-status-title,
193
+ .claude-context-card.error .codex-status-value { color: #ff6b61; }
194
+ .claude-md { white-space: normal; }
195
+ .claude-md > :first-child { margin-top: 0; }
196
+ .claude-md > :last-child { margin-bottom: 0; }
197
+ .claude-md p { margin: 0 0 8px 0; }
198
+ .claude-md h1, .claude-md h2, .claude-md h3, .claude-md h4 { margin: 12px 0 7px 0; line-height: 1.22; font-weight: 800; letter-spacing: 0; }
199
+ .claude-md h1 { font-size: 20px; }
200
+ .claude-md h2 { font-size: 18px; }
201
+ .claude-md h3 { font-size: 16px; }
202
+ .claude-md h4 { font-size: 15px; }
203
+ .claude-md ul, .claude-md ol { margin: 0 0 9px 0; padding-left: 20px; }
204
+ .claude-md li { margin: 4px 0; }
205
+ .claude-md code { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 0.92em; background: rgba(255,255,255,0.1); border: 1px solid rgba(255,255,255,0.08); border-radius: 4px; padding: 1px 4px; }
206
+ .claude-md pre { margin: 8px 0 10px 0; border: 1px solid rgba(255,255,255,0.1); background: rgba(0,0,0,0.34); border-radius: 8px; overflow: auto; }
207
+ .claude-md pre code { display: block; padding: 11px 12px; background: transparent; border: 0; border-radius: 0; white-space: pre; line-height: 1.45; }
208
+ .claude-md blockquote { margin: 8px 0; padding: 2px 0 2px 10px; border-left: 3px solid rgba(255,255,255,0.22); color: #c7c7cc; }
209
+ .claude-md table { width: 100%; border-collapse: collapse; margin: 8px 0 10px 0; font-size: 13px; display: block; overflow-x: auto; }
210
+ .claude-md th, .claude-md td { border: 1px solid rgba(255,255,255,0.12); padding: 6px 8px; text-align: left; vertical-align: top; }
211
+ .claude-md th { background: rgba(255,255,255,0.07); color: #fff; }
212
+ .claude-md a { color: #64b5ff; text-decoration: none; }
213
+ .claude-md img { max-width: 100%; border-radius: 8px; margin: 6px 0; }
214
+ .claude-md hr { border: 0; border-top: 1px solid rgba(255,255,255,0.12); margin: 12px 0; }
215
+ .claude-command-chip { display: inline-flex; align-items: center; max-width: 100%; border: 1px solid rgba(255,255,255,0.12); background: rgba(255,255,255,0.08); color: #f5f5f7; border-radius: 999px; padding: 4px 9px; font-size: 12px; font-weight: 800; }
216
+ .claude-tool { max-width: 100%; margin: 0 0 10px 0; border: 1px solid rgba(255,255,255,0.1); background: rgba(255,255,255,0.045); border-radius: 8px; color: #d1d5db; font-size: 13px; overflow: hidden; overflow-wrap: anywhere; }
217
+ .claude-tool strong { color: #fff; }
218
+ .claude-tool-card { display: block; }
219
+ .claude-tool-card summary { list-style: none; cursor: pointer; }
220
+ .claude-tool-card summary::-webkit-details-marker { display: none; }
221
+ .claude-tool-header { display: flex; align-items: center; gap: 8px; min-height: 30px; padding: 7px 9px; color: #f5f5f7; }
222
+ .claude-tool-icon { width: 18px; height: 18px; display: inline-flex; align-items: center; justify-content: center; color: var(--text-dim); flex: 0 0 auto; }
223
+ .claude-tool-icon::before { content: attr(data-icon); font-size: 11px; font-weight: 800; line-height: 1; }
224
+ .claude-tool-title { font-weight: 700; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 180px; }
225
+ .claude-tool-status { color: var(--text-dim); font-size: 12px; white-space: nowrap; }
226
+ .claude-tool-status.running::before { content: ''; display: inline-block; width: 9px; height: 9px; margin-right: 5px; border: 1.5px solid #8e8e93; border-top-color: transparent; border-radius: 50%; animation: codex-spin .8s linear infinite; vertical-align: -1px; }
227
+ .claude-tool-duration { flex: 0 0 auto; color: #6f6f76; font-size: 10px; font-variant-numeric: tabular-nums; }
228
+ .claude-tool-command { flex: 1; min-width: 0; color: var(--text-dim); font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
229
+ .claude-tool-body { padding: 0 10px 10px 10px; }
230
+ .claude-tool-section { margin-top: 8px; }
231
+ .claude-tool-section-title { color: var(--text-dim); font-size: 11px; font-weight: 800; text-transform: uppercase; letter-spacing: 0.04em; margin-bottom: 5px; }
232
+ .claude-tool-code { margin: 0; border: 1px solid rgba(255,255,255,0.1); background: rgba(0,0,0,0.32); border-radius: 7px; padding: 9px 10px; color: #d1d5db; white-space: pre-wrap; overflow-wrap: anywhere; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 12px; line-height: 1.42; overflow-x: auto; }
233
+ .claude-edit-body { border-top: 1px solid rgba(255,255,255,.08); }
234
+ .claude-edit-file > summary { display: flex; align-items: center; gap: 8px; padding: 8px 10px; color: #d1d5db; font: 12px/1.35 ui-monospace, SFMono-Regular, Menlo, monospace; }
235
+ .claude-edit-file .path { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
236
+ .claude-edit-body > .claude-tool-section { padding: 0 10px 10px; }
237
+ .claude-tool.error { border-color: rgba(255,107,97,0.38); background: rgba(255,59,48,0.07); }
238
+ .claude-work-group { max-width: 100%; margin: 0 0 10px 0; border: 1px solid rgba(255,255,255,0.09); background: rgba(255,255,255,0.035); border-radius: 8px; overflow: hidden; }
239
+ .claude-work-group summary { display: flex; align-items: center; gap: 8px; min-height: 32px; padding: 7px 10px; cursor: pointer; color: #d1d5db; list-style: none; }
240
+ .claude-work-group summary::-webkit-details-marker { display: none; }
241
+ .claude-work-group-title { flex: 1; min-width: 0; font-size: 13px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
242
+ .claude-work-group-body { padding: 2px 8px 8px 8px; }
243
+ .claude-permission { border-color: rgba(255,204,0,0.4); background: rgba(255,204,0,0.08); }
244
+ .claude-permission-actions { display: flex; gap: 8px; justify-content: flex-end; margin-top: 10px; flex-wrap: wrap; }
245
+ .claude-permission-actions .small-btn { min-height: 30px; max-width: 100%; white-space: normal; line-height: 1.2; }
246
+ #claude-control-panel { display: none; width: min(100%, var(--control-content-max)); margin: 0 auto; padding: 0 14px 10px 14px; box-sizing: border-box; }
247
+ .claude-control-rail { display: flex; gap: 14px; overflow-x: auto; overscroll-behavior-x: contain; scroll-snap-type: x mandatory; scrollbar-width: none; -webkit-overflow-scrolling: touch; }
248
+ .claude-control-rail::-webkit-scrollbar { display: none; }
249
+ .claude-control-page { flex: 0 0 100%; display: grid; grid-template-columns: repeat(6, minmax(0, 96px)); justify-content: center; gap: clamp(2px, .8vw, 7px); align-items: center; white-space: nowrap; scroll-snap-align: start; box-sizing: border-box; }
250
+ .claude-control-page.secondary { grid-template-columns: minmax(0, 116px); }
251
+ .claude-control-page > * { width: 100%; min-width: 0; overflow: hidden; }
252
+ .claude-control-page .claude-ctrl-btn, .claude-control-page .claude-select { padding-left: clamp(2px, 1vw, 10px); padding-right: clamp(2px, 1vw, 10px); font-size: clamp(8px, 2.2vw, 11px); text-overflow: ellipsis; overflow: hidden; }
253
+ .claude-select, .claude-ctrl-btn { min-width: 0; height: 32px; border: 1px solid rgba(255,255,255,0.1); border-radius: 16px; background: rgba(255,255,255,0.08); color: #f5f5f7; font-size: 11px; font-weight: 800; letter-spacing: 0; padding: 0 10px; outline: none; box-sizing: border-box; }
254
+ .claude-select { appearance: none; -webkit-appearance: none; text-align: center; text-align-last: center; }
255
+ .claude-picker-wrap { min-width: 0; position: relative; }
256
+ .claude-picker-wrap select { display: none; }
257
+ .claude-picker-btn { width: 100%; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
258
+ .claude-picker-btn.active { background: rgba(0,122,255,0.22); border-color: rgba(0,122,255,0.5); }
259
+ #claude-picker-panel { display: none; margin-top: 8px; border: 1px solid rgba(255,255,255,0.1); background: rgba(28,28,30,0.99); border-radius: 12px; max-height: min(280px, 42dvh); overflow-y: auto; box-shadow: 0 16px 36px rgba(0,0,0,0.34); }
260
+ #claude-picker-panel.active { display: block; }
261
+ #claude-picker-panel.combined.active { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
262
+ .claude-picker-column { min-width: 0; overflow-y: auto; }
263
+ .claude-picker-column + .claude-picker-column { border-left: 1px solid rgba(255,255,255,0.08); }
264
+ .claude-picker-title { padding: 9px 11px 7px 11px; color: var(--text-dim); font-size: 11px; font-weight: 800; text-transform: uppercase; letter-spacing: 0.04em; border-bottom: 1px solid rgba(255,255,255,0.06); }
265
+ .claude-picker-option { width: 100%; border: 0; border-bottom: 1px solid rgba(255,255,255,0.06); background: transparent; color: #f5f5f7; padding: 10px 11px; text-align: left; cursor: pointer; box-sizing: border-box; }
266
+ .claude-picker-option:last-child { border-bottom: 0; }
267
+ .claude-picker-option:active, .claude-picker-option.selected { background: rgba(0,122,255,0.18); }
268
+ .claude-picker-option-main { display: flex; align-items: center; justify-content: space-between; gap: 10px; font-size: 13px; font-weight: 800; }
269
+ .claude-picker-option-main .selected-label { color: var(--text-dim); font-size: 11px; font-weight: 800; text-transform: uppercase; flex: 0 0 auto; }
270
+ .claude-picker-option-value { min-width: 0; overflow-wrap: anywhere; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; color: #d1d5db; font-size: 12px; margin-top: 3px; line-height: 1.35; }
271
+ .claude-ctrl-btn { cursor: pointer; display: inline-flex; align-items: center; justify-content: center; white-space: nowrap; }
272
+ .claude-ctrl-btn:active, .claude-select:focus { background: rgba(255,255,255,0.14); border-color: rgba(0,122,255,0.45); }
273
+ .claude-ctrl-btn.danger { color: #ff6b61; background: rgba(255,59,48,0.12); }
274
+ .claude-ctrl-btn.primary { color: #fff; background: rgba(0,122,255,0.32); border-color: rgba(0,122,255,0.45); }
275
+ .claude-ctrl-btn:disabled { opacity: 0.45; cursor: default; }
276
+ #claude-state-bar { display: flex; align-items: center; gap: 7px; min-height: 24px; margin-top: 8px; color: var(--text-dim); font-size: 11px; overflow-x: auto; scrollbar-width: none; white-space: nowrap; }
277
+ #claude-state-bar::-webkit-scrollbar { display: none; }
278
+ .claude-state-pill { display: inline-flex; align-items: center; gap: 4px; border: 1px solid rgba(255,255,255,0.08); background: rgba(255,255,255,0.045); border-radius: 999px; padding: 3px 8px; flex: 0 0 auto; }
279
+ .claude-state-pill.warn { color: #ffcc00; border-color: rgba(255,204,0,0.24); background: rgba(255,204,0,0.08); }
280
+ .claude-state-pill.perm { margin-left: auto; }
281
+ .claude-state-pill.perm.acceptEdits { color: #34c759; border-color: rgba(52,199,89,0.26); background: rgba(52,199,89,0.08); }
282
+ .claude-state-pill.perm.bypassPermissions { color: #ff9f0a; border-color: rgba(255,159,10,0.26); background: rgba(255,159,10,0.08); }
283
+ .claude-state-pill.perm.plan { color: #64d2ff; border-color: rgba(100,210,255,0.26); background: rgba(100,210,255,0.08); }
284
+ #claude-resume-panel, #claude-fork-panel { display: none; margin-top: 8px; border: 1px solid rgba(255,255,255,0.1); background: rgba(28,28,30,0.98); border-radius: 12px; max-height: min(280px, 38dvh); overflow-y: auto; }
285
+ #claude-resume-panel.active, #claude-fork-panel.active { display: block; }
286
+ .claude-resume-item { width: 100%; text-align: left; border: 0; border-bottom: 1px solid rgba(255,255,255,0.06); background: transparent; color: #fff; padding: 10px 11px; cursor: pointer; box-sizing: border-box; }
287
+ .claude-resume-item:last-child { border-bottom: 0; }
288
+ .claude-resume-item:active { background: rgba(255,255,255,0.08); }
289
+ .claude-resume-title { display: flex; justify-content: space-between; gap: 8px; font-size: 12px; font-weight: 800; }
290
+ .codex-resume-question-secondary { min-height: 1.35em; color: var(--text-dim); font-size: 11px; margin-top: 3px; overflow-wrap: anywhere; }
291
+ .claude-resume-meta { color: var(--text-dim); font-size: 11px; margin-top: 3px; overflow-wrap: anywhere; }
292
+ #terminal .xterm, #terminal .xterm-viewport, #terminal .xterm-screen, #terminal .xterm-rows, #terminal .xterm-rows span { user-select: text !important; -webkit-user-select: text !important; -webkit-touch-callout: default; touch-action: pan-y; }
293
+ #terminal .xterm-viewport { overflow-anchor: none; }
294
+ #terminal .xterm-helper-textarea { user-select: none !important; -webkit-user-select: none !important; -webkit-touch-callout: none; }
295
+ #scroll-controls { position: fixed; right: 14px; top: 60%; transform: translateY(-50%); display: flex; flex-direction: column; gap: 18px; z-index: 3000; }
296
+ .scroll-btn { --charge: 0deg; width: 56px; height: 56px; background: rgba(30, 30, 30, 0.5); backdrop-filter: blur(15px); border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 28px; color: #fff; display: flex; align-items: center; justify-content: center; font-size: 20px; box-shadow: 0 8px 32px rgba(0,0,0,0.4); cursor: pointer; position: relative; overflow: hidden; touch-action: none; user-select: none; -webkit-user-select: none; }
297
+ .scroll-btn::before { content: ''; position: absolute; inset: 3px; border-radius: 50%; background: conic-gradient(var(--primary) var(--charge), transparent 0deg); opacity: 0; transition: opacity 0.12s ease; }
298
+ .scroll-btn::after { content: ''; position: absolute; inset: 7px; border-radius: 50%; background: rgba(30, 30, 30, 0.72); border: 1px solid rgba(255,255,255,0.08); }
299
+ .scroll-btn.charging::before { opacity: 1; }
300
+ .scroll-btn span { position: relative; z-index: 1; }
301
+ #debug-log { position: fixed; bottom: 0; left: 0; right: 0; max-height: 100px; background: rgba(0,0,0,0.8); color: #0f0; font-size: 10px; overflow-y: auto; padding: 5px; z-index: 9999; display: none; pointer-events: none; }
302
+
303
+ #history-content { flex: 1; background: #000; color: #d1d5db; padding: 14px; overflow-y: auto; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 13px; line-height: 1.5; white-space: pre-wrap; overflow-wrap: anywhere; user-select: text !important; -webkit-user-select: text !important; box-sizing: border-box; }
304
+ #history-content.nowrap { white-space: pre; overflow-wrap: normal; overflow-x: auto; }
305
+ .history-meta { color: var(--text-dim); font-size: 11px; padding: 8px 14px; border-bottom: 1px solid rgba(255,255,255,0.06); background: #0d0d0d; }
306
+
307
+ .tab-bar { display: flex; border-bottom: 1px solid rgba(255,255,255,0.1); background: var(--bg); }
308
+ .tab-btn { flex: 1; text-align: center; padding: 12px 0; font-size: 14px; font-weight: 600; color: var(--text-dim); background: none; border: none; cursor: pointer; position: relative; }
309
+ .tab-btn.active { color: var(--text); }
310
+ .tab-btn.active::after { content: ''; position: absolute; bottom: 0; left: 50%; transform: translateX(-50%); height: 2px; width: 40px; background: var(--primary); border-radius: 2px; }
311
+ .list-item { display: flex; align-items: center; padding: 12px 14px; border-bottom: 1px solid rgba(255,255,255,0.05); cursor: pointer; transition: background 0.2s; }
312
+ .list-item:hover { background: rgba(255,255,255,0.05); }
313
+ .dir-icon { color: var(--primary); margin-right: 12px; }
314
+ .file-icon { color: var(--text-dim); margin-right: 12px; }
315
+ .btn-toggle { background: var(--card-bg); border-radius: 6px; padding: 4px; display: flex; gap: 4px; margin: 10px; }
316
+ .btn-toggle button { flex: 1; padding: 6px 0; border-radius: 4px; border: none; background: transparent; color: var(--text-dim); font-size: 13px; font-weight: 600; cursor: pointer; }
317
+ .btn-toggle button.active { background: var(--primary); color: #fff; }
318
+ .lobby-tabs { display: flex; background: var(--card-bg); border-radius: 8px; padding: 4px; margin-bottom: 16px; gap: 4px; }
319
+ .lobby-tab { flex: 1; border: none; border-radius: 6px; background: transparent; color: var(--text-dim); padding: 8px; font-size: 14px; font-weight: 700; cursor: pointer; }
320
+ .lobby-tab.active { background: var(--primary); color: #fff; }
321
+ .schedule-card { background: var(--card-bg); border-radius: 12px; padding: 16px; margin-bottom: 12px; }
322
+ .schedule-row { display: flex; justify-content: space-between; gap: 12px; align-items: flex-start; }
323
+ .schedule-meta { margin-top: 6px; color: var(--text-dim); font-size: 12px; line-height: 1.5; overflow-wrap: anywhere; }
324
+ .schedule-actions { display: flex; gap: 8px; flex-wrap: wrap; justify-content: flex-end; }
325
+ .small-btn { border: none; border-radius: 16px; padding: 7px 10px; font-weight: 700; font-size: 12px; color: #fff; background: rgba(255,255,255,0.1); cursor: pointer; }
326
+ .small-btn.primary { background: var(--primary); }
327
+ .small-btn.danger { background: rgba(255,59,48,0.18); color: #ff6b61; }
328
+ .form-field { margin-bottom: 12px; }
329
+ .form-field label { display:block; margin-bottom: 6px; font-size: 13px; color: var(--text-dim); font-weight: 600; }
330
+ .form-field input, .form-field select, .form-field textarea { width: 100%; box-sizing: border-box; background: rgba(255,255,255,0.08); border: 1px solid rgba(255,255,255,0.1); color: #fff; border-radius: 8px; padding: 9px 10px; font-size: 14px; outline: none; }
331
+ .weekday-grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 6px; }
332
+ .weekday-btn { border: 1px solid rgba(255,255,255,0.12); background: rgba(255,255,255,0.05); color: var(--text-dim); border-radius: 8px; padding: 8px 0; font-size: 12px; font-weight: 700; cursor: pointer; }
333
+ .weekday-btn.active { border-color: var(--primary); background: rgba(0,122,255,0.25); color: #fff; }
334
+ #schedule-modal { background: var(--card-bg); width: 100%; max-width: 720px; max-height: 92dvh; overflow-y: auto; border-radius: 16px; padding: 18px; box-shadow: 0 20px 40px rgba(0,0,0,0.4); box-sizing: border-box; }
335
+ .step-card { border: 1px solid rgba(255,255,255,0.1); border-radius: 8px; padding: 10px; margin-bottom: 8px; background: rgba(255,255,255,0.04); }
336
+ .step-grid { display: grid; grid-template-columns: minmax(110px, 150px) 1fr auto; gap: 8px; align-items: center; }
337
+ @media (max-width: 640px) {
338
+ .schedule-row { flex-direction: column; }
339
+ .schedule-actions { justify-content: flex-start; }
340
+ .step-grid { grid-template-columns: 1fr; }
341
+ .timed-row { grid-template-columns: 1fr; }
342
+ }
343
+ @media (max-width: 480px) {
344
+ :root { --chat-content-max: 100%; --control-content-max: 100%; }
345
+ #nav-bar { padding: 8px 10px; }
346
+ #back-btn { font-size: 15px; }
347
+ #back-btn svg { width: 22px; height: 22px; }
348
+ #session-title { font-size: 15px; padding: 0 7px; }
349
+ #nav-bar > div:last-child { gap: 5px !important; }
350
+ #nav-bar > div:last-child .icon-btn { min-width: 34px; min-height: 30px; padding: 5px 7px !important; }
351
+ #input-row { padding-left: 10px; padding-right: 10px; }
352
+ #claude-control-panel { padding-left: 8px; padding-right: 8px; }
353
+ .claude-control-page { grid-template-columns: repeat(6, minmax(0, 1fr)); }
354
+ .claude-control-page.secondary { grid-template-columns: minmax(0, 1fr); }
355
+ .claude-control-page .claude-ctrl-btn, .claude-control-page .claude-select { height: 36px; padding-left: 4px; padding-right: 4px; }
356
+ #codex-control-panel { padding-left: 8px; padding-right: 8px; }
357
+ .codex-control-page { grid-template-columns: repeat(5, minmax(0, 1fr)); }
358
+ .codex-control-page .claude-ctrl-btn { height: 36px; padding-left: 4px; padding-right: 4px; }
359
+ .codex-select-control { height: 36px; }
360
+ #codex-chat-container { padding: 10px 10px calc(22px + env(safe-area-inset-bottom)); }
361
+ .codex-message-block.user { max-width: 94%; }
362
+ .claude-permission-actions { justify-content: flex-start; }
363
+ }
364
+ @media (max-width: 430px) {
365
+ #nav-bar > div:last-child .icon-btn:not(#codex-terminal-switch) { width: 34px; font-size: 0 !important; gap: 0 !important; }
366
+ #nav-bar > div:last-child .icon-btn:not(#codex-terminal-switch) svg { width: 16px; height: 16px; }
367
+ #codex-terminal-switch { padding-left: 8px !important; padding-right: 8px !important; }
368
+ }
369
+ @media (min-width: 768px) and (max-width: 1199px) {
370
+ :root { --chat-content-max: 780px; --control-content-max: 920px; }
371
+ #codex-chat-container { padding: 16px 18px 30px; }
372
+ #input-row, #claude-control-panel, #codex-control-panel { padding-left: 18px; padding-right: 18px; }
373
+ }
374
+ @media (min-width: 1200px) {
375
+ :root { --chat-content-max: 960px; --control-content-max: 1100px; }
376
+ #codex-chat-container { padding: 18px 22px 34px; }
377
+ }
@@ -0,0 +1,81 @@
1
+ const scrollChargeDurationMs = 6000;
2
+ let isScrolling = false, scrollDir = 0, scrollSpeed = 0, rafId = null;
3
+ let chargeBtn = null, chargeStartTime = 0, chargeRafId = null, chargePointerId = null, chargeCompleted = false;
4
+
5
+ function getTerminalViewport() {
6
+ return document.querySelector('.xterm-viewport');
7
+ }
8
+
9
+ function smoothScrollLoop() {
10
+ if (!isScrolling) return;
11
+ const viewport = getTerminalViewport();
12
+ if (viewport) { viewport.scrollTop += (scrollDir * scrollSpeed); scrollSpeed = Math.min(30, scrollSpeed + 0.2); }
13
+ rafId = requestAnimationFrame(smoothScrollLoop);
14
+ }
15
+ function startScroll(dir) { if (isScrolling) return; isScrolling = true; scrollDir = dir; scrollSpeed = 4; smoothScrollLoop(); }
16
+ function stopScroll() { isScrolling = false; if (rafId) cancelAnimationFrame(rafId); }
17
+
18
+ function jumpTerminalScroll(dir) {
19
+ const viewport = getTerminalViewport();
20
+ if (!viewport) return;
21
+ viewport.scrollTop = dir < 0 ? 0 : viewport.scrollHeight;
22
+ if (term) {
23
+ if (dir < 0) term.scrollToTop();
24
+ else term.scrollToBottom();
25
+ }
26
+ }
27
+
28
+ function resetChargeButton(btn) {
29
+ if (!btn) return;
30
+ btn.classList.remove('charging');
31
+ btn.style.setProperty('--charge', '0deg');
32
+ }
33
+
34
+ function stopScrollCharge() {
35
+ stopScroll();
36
+ if (chargeRafId) cancelAnimationFrame(chargeRafId);
37
+ if (chargeBtn && chargePointerId !== null) {
38
+ try { chargeBtn.releasePointerCapture(chargePointerId); } catch (_) {}
39
+ }
40
+ resetChargeButton(chargeBtn);
41
+ chargeBtn = null;
42
+ chargeStartTime = 0;
43
+ chargeRafId = null;
44
+ chargePointerId = null;
45
+ chargeCompleted = false;
46
+ }
47
+
48
+ function updateScrollCharge() {
49
+ if (!chargeBtn) return;
50
+ const elapsed = performance.now() - chargeStartTime;
51
+ const progress = Math.min(1, elapsed / scrollChargeDurationMs);
52
+ chargeBtn.style.setProperty('--charge', (progress * 360) + 'deg');
53
+ if (progress >= 1) {
54
+ chargeCompleted = true;
55
+ jumpTerminalScroll(scrollDir);
56
+ stopScrollCharge();
57
+ return;
58
+ }
59
+ chargeRafId = requestAnimationFrame(updateScrollCharge);
60
+ }
61
+
62
+ function startScrollCharge(e, dir) {
63
+ e.preventDefault();
64
+ stopScrollCharge();
65
+ chargeBtn = e.currentTarget;
66
+ chargePointerId = e.pointerId;
67
+ chargeStartTime = performance.now();
68
+ chargeCompleted = false;
69
+ chargeBtn.classList.add('charging');
70
+ chargeBtn.setPointerCapture(chargePointerId);
71
+ startScroll(dir);
72
+ updateScrollCharge();
73
+ }
74
+
75
+ document.getElementById('scroll-up').addEventListener('pointerdown', (e) => startScrollCharge(e, -1));
76
+ document.getElementById('scroll-down').addEventListener('pointerdown', (e) => startScrollCharge(e, 1));
77
+ window.addEventListener('pointerup', stopScrollCharge);
78
+ window.addEventListener('pointercancel', stopScrollCharge);
79
+ window.addEventListener('resize', syncLayout);
80
+
81
+ // Git Logic