coderadar 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,489 @@
1
+ *{margin:0;padding:0;box-sizing:border-box}
2
+ :root{--bg:#09090b;--s1:#18181b;--s2:#27272a;--bd:#3f3f46;--ac:#8b5cf6;--ac2:#7c3aed;
3
+ --ok:#22c55e;--warn:#eab308;--err:#ef4444;--info:#3b82f6;--txt:#fafafa;--mut:#a1a1aa;--dim:#71717a}
4
+ :root.light{--bg:#f8fafc;--s1:#ffffff;--s2:#f1f5f9;--bd:#e2e8f0;--txt:#0f172a;--mut:#64748b;--dim:#94a3b8}
5
+ body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;background:var(--bg);color:var(--txt);min-height:100vh;padding:1.5rem;transition:background .2s,color .2s}
6
+ .app{max-width:1600px;margin:0 auto}
7
+ button{font-family:inherit;cursor:pointer}
8
+ input[type="text"],input[type="search"]{font-family:inherit;background:var(--s1);color:var(--txt);border:1px solid var(--bd);border-radius:6px;padding:.4rem .7rem;font-size:.8rem}
9
+ input:focus{outline:none;border-color:var(--ac)}
10
+ textarea{font-family:inherit;background:var(--s1);color:var(--txt);border:1px solid var(--bd);border-radius:8px;padding:.75rem;width:100%;min-height:60px;resize:vertical;font-size:.85rem}
11
+ textarea:focus{outline:none;border-color:var(--ac)}
12
+ header{display:flex;align-items:center;gap:1rem;margin-bottom:1rem;padding-bottom:1rem;border-bottom:1px solid var(--bd);flex-wrap:wrap}
13
+ .brand{display:flex;align-items:center;gap:.6rem}
14
+ .brand-icon{width:32px;height:32px;background:linear-gradient(135deg,var(--ac),#6366f1);border-radius:8px;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:.85rem}
15
+ .brand h1{font-size:1.1rem;font-weight:700}
16
+ .brand h1 span{color:var(--dim);font-weight:400;font-size:.7rem;margin-left:.4rem}
17
+ .header-actions{display:flex;gap:.5rem;margin-left:auto;align-items:center}
18
+ .icon-btn{width:32px;height:32px;border-radius:6px;border:1px solid var(--bd);background:var(--s1);color:var(--mut);display:flex;align-items:center;justify-content:center;font-size:.8rem;transition:all .15s}
19
+ .icon-btn:hover{border-color:var(--ac);color:var(--ac)}
20
+ .icon-btn.tts-active{border-color:var(--ok);color:var(--ok);animation:tts-pulse 1.5s infinite}
21
+ @keyframes tts-pulse{0%,100%{opacity:1}50%{opacity:.5}}
22
+ .icon-btn{position:relative}
23
+ .sync-badge{position:absolute;top:-4px;right:-4px;background:var(--ac);color:white;font-size:.55rem;font-weight:700;min-width:14px;height:14px;border-radius:7px;display:flex;align-items:center;justify-content:center;padding:0 3px}
24
+ .icon-btn.syncing svg{animation:spin 1s linear infinite}
25
+ @keyframes spin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}
26
+ .stats-bar{display:flex;gap:1rem;padding:.75rem 1rem;background:var(--s1);border:1px solid var(--bd);border-radius:10px;margin-bottom:1rem;flex-wrap:wrap;align-items:center;transition:max-height .25s ease,opacity .2s,padding .25s,margin .25s;max-height:120px;overflow:hidden}
27
+ .stats-bar.collapsed{max-height:0;padding:0;margin:0;border-color:transparent;opacity:0}
28
+ .stats-toggle{background:none;border:none;color:var(--dim);cursor:pointer;font-size:.6rem;padding:0 .3rem;transition:transform .2s}
29
+ .stats-toggle.flipped{transform:rotate(180deg)}
30
+ .stat{display:flex;flex-direction:column;align-items:center;padding:0 .75rem}
31
+ .stat-val{font-size:1.25rem;font-weight:700;color:var(--ac)}
32
+ .stat-val.ok{color:var(--ok)}.stat-val.warn{color:var(--warn)}.stat-val.err{color:var(--err)}
33
+ .stat-label{font-size:.65rem;color:var(--dim);text-transform:uppercase}
34
+ .stat-divider{width:1px;height:30px;background:var(--bd)}
35
+ .stat-stacks{display:flex;gap:.3rem;flex-wrap:wrap}
36
+ .stat-stack{font-size:.65rem;padding:.15rem .4rem;border-radius:4px;background:var(--s2);color:var(--mut)}
37
+ /* Tab navigation */
38
+ .persistent-bar{display:flex;gap:.75rem;margin-bottom:1rem;align-items:center;flex-wrap:wrap}
39
+ .tab-bar{display:flex;gap:2px;background:var(--s1);border-radius:8px;border:1px solid var(--bd);padding:2px;flex-shrink:0}
40
+ .tab-nav{padding:.4rem .8rem;font-size:.75rem;border:none;background:transparent;color:var(--dim);font-weight:500;border-radius:6px;cursor:pointer;transition:all .15s;white-space:nowrap}
41
+ .tab-nav.active{background:var(--ac);color:white}
42
+ .tab-nav:hover:not(.active){background:var(--s2);color:var(--txt)}
43
+ .tab-panel{display:none}
44
+ .tab-panel.active{display:block}
45
+ .toolbar{display:flex;gap:.5rem;margin-bottom:1rem;flex-wrap:wrap;align-items:center}
46
+ .search-box{position:relative;flex:1;min-width:200px}
47
+ .search-box input{width:100%;padding-left:2rem}
48
+ .search-box::before{content:'O';position:absolute;left:.7rem;top:50%;transform:translateY(-50%);font-size:.7rem;opacity:.4}
49
+ .filter-group{display:flex;gap:2px;background:var(--s1);border-radius:6px;border:1px solid var(--bd);overflow:hidden}
50
+ .filter-btn{padding:.35rem .6rem;font-size:.7rem;border:none;background:transparent;color:var(--dim);font-weight:500;transition:all .15s}
51
+ .filter-btn.active{background:var(--ac);color:white}
52
+ .filter-btn:hover:not(.active){background:var(--s2);color:var(--txt)}
53
+ .toolbar-right{margin-left:auto;display:flex;gap:.5rem;align-items:center}
54
+ .sync-indicator{font-size:.65rem;color:var(--dim)}
55
+ .section{margin-bottom:1.5rem}
56
+ .section-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:.6rem}
57
+ .section-head h2{font-size:.7rem;font-weight:600;color:var(--mut);text-transform:uppercase;letter-spacing:.05em}
58
+ .tabs{display:flex;gap:2px;background:var(--s1);border-radius:6px;border:1px solid var(--bd);overflow:hidden}
59
+ .tab{padding:.3rem .6rem;font-size:.7rem;border:none;background:transparent;color:var(--dim);font-weight:500;transition:all .15s}
60
+ .tab.active{background:var(--ac);color:white}
61
+ .tab:hover:not(.active){background:var(--s2);color:var(--txt)}
62
+ .projects{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:.6rem}
63
+ .p-card{background:var(--s1);border:1px solid var(--bd);border-radius:10px;padding:.85rem;transition:all .15s;position:relative}
64
+ .p-card:hover{border-color:var(--ac)}
65
+ .p-card.warn-border{border-left:3px solid var(--warn)}
66
+ .p-card.err-border{border-left:3px solid var(--err)}
67
+ .p-card.fav{background:linear-gradient(135deg,rgba(139,92,246,.08),transparent)}
68
+ .p-card.hidden{display:none}
69
+ .p-fav{position:absolute;top:.6rem;right:.6rem;width:22px;height:22px;border-radius:5px;border:1px solid var(--bd);background:var(--bg);color:var(--dim);display:flex;align-items:center;justify-content:center;font-size:.7rem;cursor:pointer;transition:all .15s}
70
+ .p-fav:hover,.p-fav.active{color:var(--warn);border-color:var(--warn)}
71
+ .p-fav.active{background:rgba(234,179,8,.15)}
72
+ .p-top{display:flex;align-items:center;gap:.5rem;margin-bottom:.35rem;padding-right:28px}
73
+ .p-name{font-size:.95rem;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
74
+ .p-idx{font-size:.6rem;color:var(--dim);opacity:.6;margin-right:.2rem}
75
+ .p-stack{font-size:.6rem;padding:.12rem .35rem;background:rgba(139,92,246,.12);color:var(--ac);border-radius:4px;font-weight:500;white-space:nowrap}
76
+ .p-health{width:40px;height:4px;background:var(--bd);border-radius:2px;overflow:hidden;margin-left:auto}
77
+ .p-health-fill{height:100%;border-radius:2px;transition:width .3s}
78
+ .p-info{display:flex;flex-wrap:wrap;gap:.3rem;margin-bottom:.4rem;font-size:.65rem;color:var(--dim)}
79
+ .p-info .tag{padding:.1rem .35rem;border-radius:4px;border:1px solid var(--bd);background:var(--bg)}
80
+ .p-info .tag.ok{border-color:rgba(34,197,94,.3);color:var(--ok)}
81
+ .p-info .tag.bad{border-color:rgba(239,68,68,.3);color:var(--err)}
82
+ .p-info .tag.changed{border-color:rgba(234,179,8,.3);color:var(--warn)}
83
+ .p-info .tag.gh{border-color:rgba(139,92,246,.3);color:var(--ac)}
84
+ .p-commit{font-size:.65rem;color:var(--dim);margin-bottom:.35rem;font-style:italic;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
85
+ .p-next{font-size:.65rem;color:var(--info);margin-bottom:.5rem;padding:.25rem .4rem;background:rgba(59,130,246,.08);border-radius:4px;border-left:2px solid var(--info)}
86
+ .p-actions{display:flex;gap:.25rem}
87
+ .p-btn{flex:1;padding:.35rem;border-radius:5px;border:none;font-size:.65rem;font-weight:500;transition:all .12s;text-align:center}
88
+ .p-btn.primary{background:var(--ac);color:white}
89
+ .p-btn.primary:hover{background:var(--ac2)}
90
+ .p-btn.ghost{background:transparent;color:var(--dim);border:1px solid var(--bd)}
91
+ .p-btn.ghost:hover{color:var(--txt);border-color:var(--ac)}
92
+ .p-note-btn{width:28px;flex:none;font-size:.7rem}
93
+ .sessions{display:flex;gap:.4rem;overflow-x:auto;padding:.3rem 0}
94
+ .session{background:var(--s1);border:1px solid var(--bd);border-radius:6px;padding:.5rem .7rem;min-width:180px;cursor:pointer;transition:all .15s}
95
+ .session:hover{border-color:var(--ac)}
96
+ .session-title{font-size:.7rem;font-weight:600;margin-bottom:.15rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
97
+ .session-meta{font-size:.6rem;color:var(--dim)}
98
+ .ref-content{display:none;background:var(--s1);border:1px solid var(--bd);border-radius:10px;padding:1rem}
99
+ .ref-content.active{display:block}
100
+ .ref-content h3{font-size:.8rem;font-weight:600;margin-bottom:.4rem;color:var(--ac)}
101
+ .ref-content table{width:100%;border-collapse:collapse;font-size:.75rem}
102
+ .ref-content td{padding:.3rem .4rem;border-bottom:1px solid var(--bd);vertical-align:top}
103
+ .ref-content td:first-child{color:var(--ac);font-family:monospace;white-space:nowrap;width:38%}
104
+ .ref-content td:last-child{color:var(--mut)}
105
+ .prompts{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:.4rem}
106
+ .prompt{background:var(--s1);border:1px solid var(--bd);border-radius:8px;padding:.6rem;cursor:pointer;transition:all .15s;position:relative}
107
+ .prompt:hover{border-color:var(--ac);background:var(--s2)}
108
+ .prompt h4{font-size:.75rem;font-weight:600;margin-bottom:.2rem}
109
+ .prompt p{font-size:.65rem;color:var(--mut);font-family:monospace;line-height:1.3;max-height:2.6em;overflow:hidden}
110
+ .prompt .prompt-del{display:none;position:absolute;top:.35rem;right:.35rem;width:16px;height:16px;border-radius:4px;border:none;background:var(--bg);color:var(--dim);font-size:.55rem;align-items:center;justify-content:center}
111
+ .prompt:hover .prompt-del{display:flex}
112
+ .prompt .prompt-del:hover{color:var(--err)}
113
+ .links{display:flex;gap:.35rem;flex-wrap:wrap}
114
+ .link{display:flex;align-items:center;gap:.3rem;padding:.35rem .55rem;border-radius:5px;border:1px solid var(--bd);background:var(--s1);color:var(--txt);text-decoration:none;font-size:.7rem;transition:all .12s}
115
+ .link:hover{border-color:var(--ac);background:var(--s2)}
116
+ .last-session-card{display:flex;align-items:center;gap:.75rem;padding:.65rem 1rem;background:linear-gradient(135deg,rgba(139,92,246,.1),rgba(99,102,241,.05));border:1px solid var(--ac);border-radius:10px;margin-bottom:1rem;cursor:pointer;transition:all .15s}
117
+ .last-session-card:hover{background:linear-gradient(135deg,rgba(139,92,246,.18),rgba(99,102,241,.1))}
118
+ .recent-sessions{display:flex;flex-direction:column;gap:.4rem}
119
+ .rs-item{display:flex;align-items:center;gap:.6rem;padding:.5rem .75rem;background:var(--s1);border:1px solid var(--bd);border-radius:8px;cursor:pointer;transition:all .15s}
120
+ .rs-item:hover{border-color:var(--ac);background:var(--s2)}
121
+ .rs-summary{flex:1;font-size:.75rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
122
+ .rs-meta{display:flex;gap:.5rem;align-items:center;font-size:.65rem;color:var(--dim)}
123
+ .rs-date{color:var(--mut)}
124
+ .rs-msgs{color:var(--ac)}
125
+ .session-count{font-size:.7rem;color:var(--dim);margin-left:.5rem}
126
+ .insights-panel{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:1rem;margin-bottom:1rem}
127
+ .insight-card{background:linear-gradient(135deg,var(--s1),var(--s2));border:1px solid var(--bd);border-radius:12px;padding:.85rem}
128
+ .insight-card h4{font-size:.75rem;color:var(--ac);margin-bottom:.5rem;display:flex;align-items:center;gap:.4rem}
129
+ .insight-card h4::before{content:'';width:8px;height:8px;border-radius:50%}
130
+ .insight-card.wip h4::before{background:var(--warn)}
131
+ .insight-card.keypoints h4::before{background:var(--ok)}
132
+ .insight-card.tags h4::before{background:var(--info)}
133
+ .insight-card.patterns h4::before{background:linear-gradient(135deg,#f59e0b,#8b5cf6)}
134
+ .insight-card.capture h4::before{background:var(--ac)}
135
+ .pattern-item{display:flex;gap:.5rem;padding:.4rem .5rem;background:var(--bg);border-radius:6px;margin-bottom:.3rem;align-items:flex-start}
136
+ .pattern-icon{width:20px;height:20px;border-radius:4px;display:flex;align-items:center;justify-content:center;font-size:.65rem;flex-shrink:0;background:rgba(139,92,246,.15);color:var(--ac)}
137
+ .pattern-text{font-size:.7rem;color:var(--txt);line-height:1.35}
138
+ .pattern-empty{font-size:.7rem;color:var(--dim);font-style:italic;padding:.4rem}
139
+ .wip-item{padding:.4rem .6rem;background:var(--bg);border-radius:6px;margin-bottom:.35rem;cursor:pointer;transition:all .15s}
140
+ .wip-item:hover{border-left:2px solid var(--warn);padding-left:calc(.6rem - 2px)}
141
+ .wip-proj{font-size:.7rem;color:var(--warn);font-weight:600}
142
+ .wip-next{font-size:.65rem;color:var(--mut);margin-top:.15rem}
143
+ .wip-gh-btn{background:transparent;border:1px solid var(--bd);border-radius:4px;padding:2px 6px;cursor:pointer;color:var(--dim);transition:all .15s;display:flex;align-items:center}
144
+ .wip-gh-btn:hover{color:var(--fg);border-color:var(--ac);background:rgba(139,92,246,.1)}
145
+ .kp-item{display:flex;gap:.4rem;padding:.3rem 0;border-bottom:1px solid var(--bd)}
146
+ .kp-item:last-child{border-bottom:none}
147
+ .kp-bullet{color:var(--ok);font-weight:bold}
148
+ .kp-text{font-size:.7rem;flex:1}
149
+ .kp-proj{font-size:.6rem;color:var(--dim)}
150
+ .tag-cloud{display:flex;flex-wrap:wrap;gap:.3rem}
151
+ .tag-pill{padding:.2rem .5rem;background:var(--bg);border:1px solid var(--bd);border-radius:12px;font-size:.6rem;color:var(--mut);cursor:pointer;transition:all .15s}
152
+ .tag-pill:hover{border-color:var(--ac);color:var(--ac)}
153
+ .tag-count{font-size:.5rem;color:var(--dim);margin-left:.2rem}
154
+ .quick-capture{display:flex;gap:.4rem}
155
+ .quick-capture input{flex:1;padding:.4rem .6rem;font-size:.7rem}
156
+ .quick-capture button{padding:.4rem .8rem;background:var(--ac);color:white;border:none;border-radius:6px;font-size:.7rem;font-weight:500}
157
+ .insight-card.coach h4::before{background:linear-gradient(135deg,#f59e0b,#ef4444)}
158
+ .coach-item{display:flex;gap:.5rem;padding:.4rem .5rem;background:var(--bg);border-radius:6px;margin-bottom:.3rem;align-items:flex-start}
159
+ .coach-icon{width:20px;height:20px;border-radius:4px;display:flex;align-items:center;justify-content:center;font-size:.65rem;flex-shrink:0}
160
+ .coach-icon.warning{background:rgba(245,158,11,.15);color:#f59e0b}
161
+ .coach-icon.info{background:rgba(59,130,246,.15);color:#3b82f6}
162
+ .coach-icon.success{background:rgba(34,197,94,.15);color:#22c55e}
163
+ .coach-text{font-size:.7rem;color:var(--txt);line-height:1.35}
164
+ .coach-empty{font-size:.7rem;color:var(--dim);font-style:italic;padding:.4rem}
165
+ .ls-icon{width:28px;height:28px;background:var(--ac);color:white;border-radius:6px;display:flex;align-items:center;justify-content:center;font-size:.75rem;font-weight:700}
166
+ .ls-text{flex:1;font-size:.8rem;overflow:hidden}
167
+ .ls-text strong{color:var(--ac)}
168
+ .ls-text span{color:var(--mut);margin-left:.3rem}
169
+ .ls-date{font-size:.65rem;color:var(--dim)}
170
+ .toast-box{position:fixed;bottom:1.5rem;right:1.5rem;z-index:300;display:flex;flex-direction:column;gap:.3rem}
171
+ .toast{padding:.45rem .8rem;border-radius:6px;font-size:.7rem;font-weight:500;box-shadow:0 4px 16px rgba(0,0,0,.4);animation:slideIn .2s ease;background:#166534;color:#bbf7d0;border:1px solid #22c55e33}
172
+ @keyframes slideIn{from{transform:translateX(100%);opacity:0}to{transform:translateX(0);opacity:1}}
173
+ .add-btn{padding:.2rem .5rem;border-radius:5px;border:1px dashed var(--bd);background:transparent;color:var(--dim);font-size:.65rem;transition:all .15s}
174
+ .add-btn:hover{border-color:var(--ac);color:var(--ac)}
175
+ .modal-bg{position:fixed;inset:0;background:rgba(0,0,0,.7);display:none;align-items:center;justify-content:center;z-index:100;backdrop-filter:blur(3px)}
176
+ .modal-bg.open{display:flex}
177
+ .modal{background:var(--s1);border:1px solid var(--bd);border-radius:12px;padding:1.1rem;width:90%;max-width:480px;max-height:90vh;overflow-y:auto}
178
+ .modal h3{font-size:.95rem;margin-bottom:.65rem}
179
+ .modal-field{margin-bottom:.5rem}
180
+ .modal-field label{display:block;font-size:.65rem;color:var(--mut);margin-bottom:.15rem;font-weight:500}
181
+ .modal-field input,.modal-field textarea{font-family:inherit;background:var(--bg);color:var(--txt);border:1px solid var(--bd);border-radius:5px;padding:.35rem .5rem;font-size:.75rem;width:100%}
182
+ .modal-field input:focus,.modal-field textarea:focus{outline:none;border-color:var(--ac)}
183
+ .modal-actions{display:flex;gap:.35rem;justify-content:flex-end;margin-top:.85rem}
184
+ .modal-actions button{padding:.35rem .85rem;border-radius:6px;border:none;font-size:.75rem;font-weight:500}
185
+ .modal-actions .save{background:var(--ac);color:white}
186
+ .modal-actions .cancel{background:var(--s2);color:var(--mut)}
187
+ .kbd{display:inline-block;padding:.1rem .3rem;background:var(--bg);border:1px solid var(--bd);border-radius:3px;font-size:.6rem;font-family:monospace;color:var(--dim)}
188
+ .collapsible-head{cursor:pointer;user-select:none}
189
+ .collapsible-head::before{content:'V ';font-size:.6rem;opacity:.5}
190
+ .collapsible.closed .collapsible-head::before{content:'> '}
191
+ .collapsible.closed .collapsible-body{display:none}
192
+ /* Timeline v2 - List-based UX */
193
+ .timeline-container{background:var(--s1);border:1px solid var(--bd);border-radius:12px;padding:1rem;margin-bottom:.5rem}
194
+ .timeline-header{display:flex;align-items:center;gap:1rem;margin-bottom:.75rem;padding-bottom:.5rem;border-bottom:1px solid var(--bd)}
195
+ .timeline-filters{display:flex;gap:.3rem;flex:1}
196
+ .timeline-filter{padding:.3rem .6rem;font-size:.65rem;background:var(--bg);border:1px solid var(--bd);border-radius:4px;color:var(--mut);cursor:pointer;transition:all .15s}
197
+ .timeline-filter:hover,.timeline-filter.active{border-color:var(--ac);color:var(--ac);background:rgba(139,92,246,.1)}
198
+ .timeline-view-toggle{display:flex;gap:2px;background:var(--bg);border-radius:4px;padding:2px}
199
+ .timeline-view-btn{padding:.25rem .5rem;font-size:.6rem;background:transparent;border:none;color:var(--mut);cursor:pointer;border-radius:3px}
200
+ .timeline-view-btn.active{background:var(--ac);color:white}
201
+ .timeline-list{display:flex;flex-direction:column;gap:.25rem;max-height:320px;overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--ac) var(--s2)}
202
+ .timeline-list::-webkit-scrollbar{width:6px}
203
+ .timeline-list::-webkit-scrollbar-track{background:var(--s2);border-radius:3px}
204
+ .timeline-list::-webkit-scrollbar-thumb{background:var(--ac);border-radius:3px}
205
+ .timeline-day-header{font-size:.65rem;font-weight:600;color:var(--dim);padding:.4rem .5rem;background:var(--bg);border-radius:4px;margin-top:.5rem;position:sticky;top:0;z-index:10}
206
+ .timeline-day-header:first-child{margin-top:0}
207
+ .timeline-row{display:flex;align-items:center;gap:.5rem;padding:.4rem .5rem;background:var(--bg);border:1px solid transparent;border-radius:6px;cursor:pointer;transition:all .12s}
208
+ .timeline-row:hover{border-color:var(--ac);background:rgba(139,92,246,.08)}
209
+ .timeline-row-time{font-size:.65rem;color:var(--dim);min-width:40px;font-family:monospace}
210
+ .timeline-row-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0}
211
+ .timeline-row-project{font-size:.7rem;font-weight:600;color:var(--ac);min-width:120px;max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
212
+ .timeline-row-summary{font-size:.7rem;color:var(--txt);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
213
+ .timeline-row-actions{display:flex;gap:.2rem;opacity:0;transition:opacity .15s}
214
+ .timeline-row:hover .timeline-row-actions{opacity:1}
215
+ .timeline-row-btn{padding:.2rem .4rem;font-size:.55rem;background:var(--s2);border:1px solid var(--bd);border-radius:3px;color:var(--mut);cursor:pointer}
216
+ .timeline-row-btn:hover{border-color:var(--ac);color:var(--ac)}
217
+ /* Compact dots view */
218
+ .timeline-dots-view{display:none}
219
+ .timeline-dots-view.active{display:block}
220
+ .timeline-list-view{display:block}
221
+ .timeline-list-view.hidden{display:none}
222
+ .timeline-scroll{display:flex;gap:.4rem;overflow-x:auto;padding:.5rem 0;scrollbar-width:thin;scrollbar-color:var(--ac) var(--s2)}
223
+ .timeline-scroll::-webkit-scrollbar{height:5px}
224
+ .timeline-scroll::-webkit-scrollbar-track{background:var(--s2);border-radius:3px}
225
+ .timeline-scroll::-webkit-scrollbar-thumb{background:var(--ac);border-radius:3px}
226
+ .timeline-day{display:flex;flex-direction:column;align-items:center;min-width:65px;padding:.4rem;background:var(--bg);border:1px solid var(--bd);border-radius:8px;transition:all .15s}
227
+ .timeline-day:hover{border-color:var(--ac)}
228
+ .timeline-date{font-size:.6rem;font-weight:600;color:var(--txt);margin-bottom:.35rem}
229
+ .timeline-dots{display:flex;flex-wrap:wrap;gap:4px;justify-content:center;min-height:24px;align-items:center}
230
+ .timeline-dot{width:18px;height:18px;border-radius:50%;cursor:pointer;position:relative;display:flex;align-items:center;justify-content:center;font-size:.5rem;font-weight:700;color:white;text-shadow:0 1px 2px rgba(0,0,0,.5);transition:transform .1s}
231
+ .timeline-dot:hover{transform:scale(1.3)}
232
+ .timeline-mini-tip{position:fixed;background:var(--s1);border:1px solid var(--ac);border-radius:6px;padding:.35rem .5rem;font-size:.65rem;z-index:300;pointer-events:none;box-shadow:0 4px 12px rgba(0,0,0,.4);white-space:nowrap;display:none}
233
+ .timeline-mini-tip.show{display:block}
234
+ .timeline-mini-tip-proj{font-weight:600;color:var(--ac)}
235
+ .timeline-mini-tip-time{color:var(--dim);margin-left:.3rem}
236
+ .timeline-legend{display:flex;flex-wrap:wrap;gap:.5rem;padding-top:.5rem;margin-top:.5rem;border-top:1px solid var(--bd)}
237
+ .timeline-legend-item{display:flex;align-items:center;gap:.3rem;font-size:.6rem;color:var(--mut);cursor:pointer;padding:.2rem .4rem;border-radius:4px;transition:all .15s;border:1px solid transparent}
238
+ .timeline-legend-item:hover,.timeline-legend-item.active{background:var(--s2);border-color:var(--bd)}
239
+ .timeline-legend-item.dimmed{opacity:.3}
240
+ .timeline-legend-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}
241
+ /* GitHub-style heatmap */
242
+ .timeline-heatmap-view{display:none;padding:.5rem 0}
243
+ .timeline-heatmap-view.active{display:block}
244
+ .heatmap-container{display:flex;gap:.5rem;overflow-x:auto;padding-bottom:.5rem}
245
+ .heatmap-months{display:flex;font-size:.55rem;color:var(--dim);margin-bottom:.25rem;margin-left:28px}
246
+ .heatmap-month{text-align:center}
247
+ .heatmap-wrapper{display:flex;gap:3px}
248
+ .heatmap-days{display:flex;flex-direction:column;gap:3px;font-size:.5rem;color:var(--dim);padding-right:4px}
249
+ .heatmap-day-label{height:11px;line-height:11px;text-align:right}
250
+ .heatmap-grid{display:flex;gap:3px}
251
+ .heatmap-week{display:flex;flex-direction:column;gap:3px}
252
+ .heatmap-cell{width:11px;height:11px;border-radius:2px;background:var(--s2);cursor:pointer;transition:all .1s}
253
+ .heatmap-cell:hover{transform:scale(1.3);outline:2px solid var(--ac)}
254
+ .heatmap-cell.l0{background:var(--s2)}
255
+ .heatmap-cell.l1{background:rgba(139,92,246,.25)}
256
+ .heatmap-cell.l2{background:rgba(139,92,246,.5)}
257
+ .heatmap-cell.l3{background:rgba(139,92,246,.75)}
258
+ .heatmap-cell.l4{background:rgba(139,92,246,1)}
259
+ .heatmap-legend{display:flex;align-items:center;gap:.5rem;justify-content:flex-end;margin-top:.5rem;font-size:.55rem;color:var(--dim)}
260
+ .heatmap-legend-label{margin-right:.25rem}
261
+ .heatmap-legend-cells{display:flex;gap:2px}
262
+ .heatmap-legend-cell{width:11px;height:11px;border-radius:2px}
263
+ .heatmap-stats{display:flex;gap:1.5rem;margin-top:.75rem;padding-top:.5rem;border-top:1px solid var(--bd)}
264
+ .heatmap-stat{text-align:center}
265
+ .heatmap-stat-value{font-size:1.2rem;font-weight:700;color:var(--ac)}
266
+ .heatmap-stat-label{font-size:.6rem;color:var(--dim);margin-top:.15rem}
267
+ @media(max-width:768px){.projects{grid-template-columns:1fr}.prompts{grid-template-columns:1fr}.stats-bar{flex-direction:column;gap:.5rem}.stat-divider{display:none}.persistent-bar{flex-direction:column;align-items:stretch}.tab-bar{overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}.tab-bar::-webkit-scrollbar{display:none}.search-box{max-width:none}}
268
+ .search-results{position:absolute;top:100%;left:0;right:0;max-height:400px;overflow-y:auto;background:var(--s1);border:1px solid var(--bd);border-top:none;border-radius:0 0 8px 8px;z-index:50;display:none;box-shadow:0 4px 12px rgba(0,0,0,.3)}
269
+ .search-results.active{display:block}
270
+ .search-results-header{padding:.5rem .75rem;font-size:.65rem;color:var(--dim);border-bottom:1px solid var(--bd);display:flex;justify-content:space-between}
271
+ .search-result{padding:.6rem .75rem;border-bottom:1px solid var(--bd);cursor:pointer;transition:background .15s}
272
+ .search-result:hover{background:var(--s2)}
273
+ .search-result:last-child{border-bottom:none}
274
+ .sr-header{display:flex;align-items:center;gap:.5rem;margin-bottom:.25rem}
275
+ .sr-project{font-size:.7rem;font-weight:600;color:var(--ac)}
276
+ .sr-date{font-size:.6rem;color:var(--dim)}
277
+ .sr-tags{display:flex;gap:.2rem;margin-left:auto}
278
+ .sr-tag{font-size:.55rem;padding:.1rem .3rem;background:var(--s2);border-radius:3px;color:var(--mut)}
279
+ .sr-summary{font-size:.7rem;color:var(--mut);line-height:1.4}
280
+ .sr-summary mark{background:rgba(139,92,246,.3);color:var(--txt);padding:0 2px;border-radius:2px}
281
+ .sr-keypoint{font-size:.65rem;color:var(--info);margin-top:.2rem;padding-left:.5rem;border-left:2px solid var(--info)}
282
+ .sr-empty{padding:1rem;text-align:center;font-size:.75rem;color:var(--dim)}
283
+ .report-modal{max-width:700px}
284
+ .report-preview{background:white;color:#1a1a1a;padding:2rem;border-radius:8px;margin:.75rem 0;max-height:60vh;overflow-y:auto;font-size:.85rem;line-height:1.6}
285
+ .report-preview h1{font-size:1.4rem;color:#2d3748;border-bottom:2px solid #8b5cf6;padding-bottom:.5rem;margin-bottom:1rem}
286
+ .report-preview h2{font-size:1.1rem;color:#4a5568;margin-top:1.2rem;margin-bottom:.5rem;border-left:3px solid #8b5cf6;padding-left:.5rem}
287
+ .report-preview h3{font-size:.95rem;color:#718096;margin-top:.8rem}
288
+ .report-preview ul{list-style:disc;margin-left:1.5rem}
289
+ .report-preview li{margin:.3rem 0}
290
+ .report-preview .meta{color:#718096;font-size:.75rem;margin-top:1.5rem;padding-top:1rem;border-top:1px solid #e2e8f0}
291
+ .report-preview .total{background:#f7fafc;padding:.75rem;border-radius:6px;margin-top:1rem;font-weight:600}
292
+ .report-preview .tags{display:flex;flex-wrap:wrap;gap:.3rem;margin-top:.5rem}
293
+ .report-preview .tag{background:#e9d5ff;color:#7c3aed;padding:.15rem .4rem;border-radius:4px;font-size:.7rem}
294
+ .report-actions{display:flex;gap:.5rem;flex-wrap:wrap}
295
+ .report-actions button{padding:.5rem 1rem;border-radius:6px;border:none;font-size:.8rem;font-weight:500;cursor:pointer;transition:all .15s}
296
+ .report-actions .btn-pdf{background:linear-gradient(135deg,#ef4444,#dc2626);color:white}
297
+ .report-actions .btn-pdf:hover{transform:translateY(-1px)}
298
+ .report-actions .btn-md{background:linear-gradient(135deg,#3b82f6,#2563eb);color:white}
299
+ .report-actions .btn-md:hover{transform:translateY(-1px)}
300
+ .report-actions .btn-copy{background:var(--s2);color:var(--txt);border:1px solid var(--bd)}
301
+ @media print{.report-preview{max-height:none;box-shadow:none}}
302
+ /* Plugin Catalog */
303
+ .plugin-toolbar{display:flex;gap:.5rem;align-items:center;flex-wrap:wrap;margin-bottom:1rem}
304
+ .plugin-toolbar input[type=search]{flex:1;min-width:200px;padding:.5rem .75rem;border-radius:8px;border:1px solid var(--bd);background:var(--s2);color:var(--txt);font-size:.85rem}
305
+ .plugin-toolbar input[type=search]:focus{outline:none;border-color:var(--ac)}
306
+ .plugin-filter-group{display:flex;gap:.25rem;flex-wrap:wrap}
307
+ .plugin-filter-btn{padding:.35rem .65rem;border-radius:6px;border:1px solid var(--bd);background:var(--s2);color:var(--mut);font-size:.7rem;cursor:pointer;transition:all .15s;white-space:nowrap}
308
+ .plugin-filter-btn:hover{border-color:var(--ac);color:var(--txt)}
309
+ .plugin-filter-btn.active{background:var(--ac);color:white;border-color:var(--ac)}
310
+ .plugins-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(340px,1fr));gap:1rem}
311
+ .pl-card{background:var(--s1);border:1px solid var(--bd);border-radius:12px;padding:1rem;border-left:4px solid var(--ac);transition:all .2s;cursor:default;display:flex;flex-direction:column;gap:.5rem}
312
+ .pl-card:hover{border-color:var(--ac);box-shadow:0 4px 12px rgba(0,0,0,.15)}
313
+ .pl-card.disabled{opacity:.5}
314
+ .pl-card[data-type=mcp]{border-left-color:#14b8a6}
315
+ .pl-card[data-type=workflow]{border-left-color:#8b5cf6}
316
+ .pl-card[data-type=skill]{border-left-color:#22c55e}
317
+ .pl-card[data-type=command]{border-left-color:#3b82f6}
318
+ .pl-card[data-type=agent]{border-left-color:#f59e0b}
319
+ .pl-top{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap}
320
+ .pl-status{width:8px;height:8px;border-radius:50%;flex-shrink:0}
321
+ .pl-status.on{background:#22c55e}
322
+ .pl-status.off{background:#6b7280}
323
+ .pl-name{font-weight:600;font-size:.9rem;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
324
+ .pl-version{font-size:.65rem;color:var(--dim);background:var(--s2);padding:.15rem .4rem;border-radius:4px}
325
+ .pl-type-badge{font-size:.6rem;text-transform:uppercase;font-weight:700;padding:.15rem .4rem;border-radius:4px;color:white}
326
+ .pl-type-badge[data-t=mcp]{background:#14b8a6}
327
+ .pl-type-badge[data-t=workflow]{background:#8b5cf6}
328
+ .pl-type-badge[data-t=skill]{background:#22c55e}
329
+ .pl-type-badge[data-t=command]{background:#3b82f6}
330
+ .pl-type-badge[data-t=agent]{background:#f59e0b}
331
+ .pl-desc{font-size:.8rem;color:var(--mut);line-height:1.4;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
332
+ .pl-meta{display:flex;gap:.35rem;flex-wrap:wrap;align-items:center}
333
+ .pl-badge{font-size:.65rem;padding:.15rem .35rem;border-radius:4px;background:var(--s2);color:var(--dim);border:1px solid var(--bd)}
334
+ .pl-badge.highlight{background:rgba(139,92,246,.15);color:var(--ac);border-color:var(--ac)}
335
+ .pl-marketplace{font-size:.65rem;color:var(--dim);margin-left:auto}
336
+ .pl-actions{display:flex;gap:.4rem;margin-top:auto;padding-top:.5rem}
337
+ .pl-actions button{flex:1;padding:.4rem .5rem;border-radius:6px;border:1px solid var(--bd);background:var(--s2);color:var(--txt);font-size:.7rem;cursor:pointer;transition:all .15s;text-align:center}
338
+ .pl-actions button:hover{border-color:var(--ac);color:var(--ac)}
339
+ .pl-actions button.primary{background:var(--ac);color:white;border-color:var(--ac)}
340
+ .pl-actions button.primary:hover{background:var(--ac2)}
341
+ .pl-detail-section{margin-top:1rem}
342
+ .pl-detail-section h4{font-size:.85rem;margin-bottom:.5rem;color:var(--ac);display:flex;align-items:center;gap:.4rem}
343
+ .pl-detail-item{padding:.5rem .75rem;background:var(--s2);border-radius:8px;margin-bottom:.4rem;font-size:.8rem;display:flex;flex-direction:column;gap:.25rem}
344
+ .pl-detail-item .item-name{font-weight:600;display:flex;align-items:center;gap:.5rem}
345
+ .pl-detail-item .item-desc{color:var(--mut);font-size:.75rem}
346
+ .pl-detail-item .item-meta{font-size:.65rem;color:var(--dim)}
347
+ .pl-detail-item button{padding:.25rem .5rem;border-radius:4px;border:1px solid var(--bd);background:var(--bg);color:var(--txt);font-size:.65rem;cursor:pointer}
348
+ .pl-detail-item button:hover{border-color:var(--ac);color:var(--ac)}
349
+ .pl-keywords{display:flex;flex-wrap:wrap;gap:.25rem;margin-top:.5rem}
350
+ .pl-keywords span{background:rgba(139,92,246,.1);color:var(--ac);padding:.15rem .35rem;border-radius:4px;font-size:.65rem}
351
+ .pl-empty{text-align:center;padding:3rem 1rem;color:var(--dim);font-size:.9rem}
352
+ /* TTS Player Modal */
353
+ .tts-modal-bg{position:fixed;inset:0;background:rgba(0,0,0,.85);display:none;z-index:210;align-items:center;justify-content:center}
354
+ .tts-modal-bg.open{display:flex}
355
+ .tts-modal{width:90%;max-width:600px;background:var(--s1);border-radius:16px;border:1px solid var(--bd);overflow:hidden}
356
+ .tts-header{display:flex;align-items:center;gap:1rem;padding:1rem 1.5rem;background:var(--s2);border-bottom:1px solid var(--bd)}
357
+ .tts-title{flex:1;font-size:1rem;font-weight:600;display:flex;align-items:center;gap:.5rem}
358
+ .tts-title svg{width:20px;height:20px;fill:var(--ac)}
359
+ .tts-close{width:32px;height:32px;border-radius:8px;border:1px solid var(--bd);background:transparent;color:var(--txt);font-size:1rem;cursor:pointer}
360
+ .tts-close:hover{border-color:var(--err);color:var(--err)}
361
+ .tts-body{padding:1.5rem}
362
+ .tts-current{background:var(--bg);border-radius:12px;padding:1.25rem;font-size:1rem;line-height:1.6;min-height:80px;max-height:120px;overflow-y:auto;margin-bottom:1rem;border:1px solid var(--bd)}
363
+ .tts-progress-bar{height:6px;background:var(--s2);border-radius:3px;overflow:hidden;margin-bottom:1rem}
364
+ .tts-progress-fill{height:100%;background:linear-gradient(90deg,var(--ac),var(--ac2));border-radius:3px;transition:width .2s ease}
365
+ .tts-controls{display:flex;align-items:center;gap:.75rem;justify-content:center;margin-bottom:1rem}
366
+ .tts-btn{width:44px;height:44px;border-radius:50%;border:2px solid var(--bd);background:var(--s2);color:var(--txt);font-size:1rem;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .15s}
367
+ .tts-btn:hover{border-color:var(--ac);color:var(--ac)}
368
+ .tts-btn.play{width:56px;height:56px;font-size:1.2rem;background:var(--ac);border-color:var(--ac);color:white}
369
+ .tts-btn.play:hover{background:var(--ac2);border-color:var(--ac2)}
370
+ .tts-slider{flex:1;height:6px;-webkit-appearance:none;background:var(--s2);border-radius:3px;cursor:pointer}
371
+ .tts-slider::-webkit-slider-thumb{-webkit-appearance:none;width:14px;height:14px;border-radius:50%;background:var(--ac);cursor:pointer}
372
+ .tts-footer{display:flex;align-items:center;justify-content:space-between;padding-top:1rem;border-top:1px solid var(--bd)}
373
+ .tts-counter{font-size:.8rem;color:var(--dim)}
374
+ .tts-rate-control{display:flex;align-items:center;gap:.5rem}
375
+ .tts-rate-control label{font-size:.75rem;color:var(--dim)}
376
+ .tts-rate-select{padding:.4rem .6rem;border-radius:6px;border:1px solid var(--bd);background:var(--bg);color:var(--txt);font-size:.8rem;cursor:pointer}
377
+ .tts-rate-display{font-size:.8rem;color:var(--ac);font-weight:600;min-width:35px}
378
+ .tts-full-text{margin-top:1rem;padding:1rem;background:var(--bg);border-radius:8px;font-size:.75rem;color:var(--dim);max-height:100px;overflow-y:auto;line-height:1.5;border:1px solid var(--bd)}
379
+ .tts-full-text summary{cursor:pointer;font-weight:500;color:var(--txt);margin-bottom:.5rem}
380
+ /* TTS Advanced Config */
381
+ .tts-modal-advanced{max-width:700px}
382
+ .tts-config{padding:1.5rem;background:var(--bg);border-bottom:1px solid var(--bd)}
383
+ .tts-config-row{display:flex;gap:1rem;margin-bottom:1.25rem}
384
+ .tts-config-item{flex:1}
385
+ .tts-config-item label{display:block;font-size:.7rem;color:var(--dim);margin-bottom:.4rem;text-transform:uppercase;letter-spacing:.5px}
386
+ .tts-config-item select{width:100%;padding:.6rem .8rem;border-radius:8px;border:1px solid var(--bd);background:var(--s1);color:var(--txt);font-size:.85rem;cursor:pointer}
387
+ .tts-config-item select:focus{border-color:var(--ac);outline:none}
388
+ .tts-detail-section{margin-bottom:1.25rem}
389
+ .tts-detail-section>label{display:block;font-size:.7rem;color:var(--dim);margin-bottom:.75rem;text-transform:uppercase;letter-spacing:.5px}
390
+ .tts-detail-slider-wrap{position:relative;padding:0 .5rem}
391
+ .tts-detail-slider{width:100%;height:8px;-webkit-appearance:none;background:linear-gradient(90deg,var(--ok),var(--ac),var(--ac2));border-radius:4px;cursor:pointer}
392
+ .tts-detail-slider::-webkit-slider-thumb{-webkit-appearance:none;width:22px;height:22px;border-radius:50%;background:white;border:3px solid var(--ac);cursor:pointer;box-shadow:0 2px 6px rgba(0,0,0,.3)}
393
+ .tts-detail-labels{display:flex;justify-content:space-between;margin-top:.5rem}
394
+ .tts-detail-labels span{font-size:.65rem;color:var(--dim);transition:all .15s}
395
+ .tts-detail-labels span.active{color:var(--ac);font-weight:600}
396
+ .tts-detail-desc{text-align:center;font-size:.75rem;color:var(--txt);margin-top:.75rem;padding:.5rem;background:var(--s1);border-radius:6px}
397
+ .tts-generate-btn{width:100%;padding:.9rem;border-radius:10px;border:none;background:linear-gradient(135deg,var(--ac),var(--ac2));color:white;font-size:.95rem;font-weight:600;cursor:pointer;transition:all .2s;box-shadow:0 4px 12px rgba(139,92,246,.3)}
398
+ .tts-generate-btn:hover{transform:translateY(-2px);box-shadow:0 6px 16px rgba(139,92,246,.4)}
399
+ .tts-generate-btn:active{transform:translateY(0)}
400
+ /* Session Replay Modal */
401
+ .replay-modal-bg{position:fixed;inset:0;background:rgba(0,0,0,.9);display:none;z-index:200;flex-direction:column}
402
+ .replay-modal-bg.open{display:flex}
403
+ .replay-header{display:flex;align-items:center;gap:1rem;padding:1rem 1.5rem;background:var(--s1);border-bottom:1px solid var(--bd)}
404
+ .replay-title{flex:1;font-size:1rem;font-weight:600}
405
+ .replay-meta{font-size:.7rem;color:var(--dim)}
406
+ .replay-close{width:36px;height:36px;border-radius:8px;border:1px solid var(--bd);background:var(--bg);color:var(--txt);font-size:1.2rem;cursor:pointer;display:flex;align-items:center;justify-content:center}
407
+ .replay-close:hover{border-color:var(--err);color:var(--err)}
408
+ .replay-body{flex:1;overflow-y:auto;padding:1.5rem;display:flex;flex-direction:column;gap:.75rem}
409
+ .replay-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;gap:1rem;color:var(--dim)}
410
+ .replay-empty-icon{font-size:3rem;opacity:.3}
411
+ .replay-empty-text{font-size:.9rem}
412
+ .replay-load-btn{padding:.6rem 1.2rem;background:var(--ac);color:white;border:none;border-radius:8px;font-size:.85rem;font-weight:500;cursor:pointer}
413
+ .replay-load-btn:hover{background:var(--ac2)}
414
+ .replay-msg{max-width:85%;padding:.75rem 1rem;border-radius:12px;font-size:.85rem;line-height:1.5;animation:fadeInMsg .2s ease}
415
+ @keyframes fadeInMsg{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}
416
+ .replay-msg.user{align-self:flex-start;background:var(--info);color:white;border-bottom-left-radius:4px}
417
+ .replay-msg.assistant{align-self:flex-end;background:var(--s2);color:var(--txt);border-bottom-right-radius:4px}
418
+ .replay-msg.tool{align-self:center;background:var(--bg);color:var(--mut);font-family:monospace;font-size:.75rem;padding:.5rem .75rem;border:1px solid var(--bd);max-width:95%;overflow-x:auto}
419
+ .replay-msg-role{font-size:.6rem;text-transform:uppercase;opacity:.7;margin-bottom:.25rem;font-weight:600}
420
+ .replay-msg-content{white-space:pre-wrap;word-break:break-word}
421
+ .replay-msg-content code{background:rgba(0,0,0,.2);padding:.1rem .3rem;border-radius:3px;font-family:monospace;font-size:.8em}
422
+ .replay-msg-time{font-size:.55rem;opacity:.5;margin-top:.25rem;text-align:right}
423
+ .replay-controls{display:flex;align-items:center;gap:1rem;padding:1rem 1.5rem;background:var(--s1);border-top:1px solid var(--bd)}
424
+ .replay-btn{width:40px;height:40px;border-radius:8px;border:1px solid var(--bd);background:var(--bg);color:var(--txt);cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:1rem}
425
+ .replay-btn:hover{border-color:var(--ac);color:var(--ac)}
426
+ .replay-btn.active{background:var(--ac);color:white;border-color:var(--ac)}
427
+ .replay-slider{flex:1;height:6px;-webkit-appearance:none;background:var(--bd);border-radius:3px;cursor:pointer}
428
+ .replay-slider::-webkit-slider-thumb{-webkit-appearance:none;width:16px;height:16px;background:var(--ac);border-radius:50%;cursor:pointer}
429
+ .replay-slider::-moz-range-thumb{width:16px;height:16px;background:var(--ac);border-radius:50%;cursor:pointer;border:none}
430
+ .replay-progress{font-size:.75rem;color:var(--dim);min-width:80px;text-align:center}
431
+ .replay-speed{padding:.3rem .6rem;border-radius:4px;border:1px solid var(--bd);background:var(--bg);color:var(--txt);font-size:.7rem;cursor:pointer}
432
+ .replay-folder-info{padding:.5rem .75rem;background:var(--s2);border-radius:6px;font-size:.7rem;color:var(--mut);display:flex;align-items:center;gap:.5rem}
433
+ .replay-folder-info code{background:var(--bg);padding:.2rem .4rem;border-radius:4px;font-family:monospace}
434
+ .replay-tool-summary{background:var(--bg);border:1px solid var(--bd);border-radius:8px;padding:.5rem .75rem;margin:.25rem 0;font-size:.75rem}
435
+ .replay-tool-name{color:var(--ac);font-weight:600;font-family:monospace}
436
+ .replay-tool-params{color:var(--dim);font-size:.7rem;margin-top:.25rem;max-height:100px;overflow-y:auto}
437
+ .cost-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:.75rem;margin-bottom:1rem}
438
+ .cost-stat-card{background:var(--s1);border:1px solid var(--bd);border-radius:10px;padding:1rem;text-align:center}
439
+ .cost-stat-card .cost-val{font-size:1.4rem;font-weight:700;color:var(--txt)}
440
+ .cost-stat-card .cost-val.warn{color:var(--warn)}
441
+ .cost-stat-card .cost-val.err{color:var(--err)}
442
+ .cost-stat-card .cost-val.ok{color:var(--ok)}
443
+ .cost-stat-card .cost-label{font-size:.7rem;color:var(--mut);margin-top:.25rem}
444
+ .cost-charts-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:.75rem;margin-bottom:1rem}
445
+ .cost-period-bar{display:flex;gap:.4rem;justify-content:center;margin-bottom:.75rem;flex-wrap:wrap}
446
+ .btn-csv{background:var(--s2);color:var(--mut);border:1px solid var(--bd);border-radius:6px;padding:.3rem .6rem;font-size:.7rem;cursor:pointer;font-weight:500;transition:all .15s}
447
+ .btn-csv:hover{background:var(--ac);color:white;border-color:var(--ac)}
448
+ .compare-fab{position:fixed;bottom:1.5rem;left:50%;transform:translateX(-50%);background:var(--ac);color:white;border:none;border-radius:2rem;padding:.6rem 1.2rem;font-size:.85rem;font-weight:600;cursor:pointer;z-index:50;box-shadow:0 4px 12px rgba(139,92,246,.4);transition:all .2s}
449
+ .compare-fab:hover{box-shadow:0 6px 16px rgba(139,92,246,.5)}
450
+ .p-check{position:absolute;top:.5rem;left:.5rem;width:1.1rem;height:1.1rem;accent-color:var(--ac);cursor:pointer;z-index:2}
451
+ .compare-table{width:100%;border-collapse:collapse;font-size:.75rem}
452
+ .compare-table th{text-align:left;padding:.4rem .5rem;color:var(--dim);font-weight:500;border-bottom:1px solid var(--bd);white-space:nowrap}
453
+ .compare-table td{padding:.4rem .5rem;border-bottom:1px solid var(--bd)}
454
+ .compare-table .metric-label{color:var(--mut);font-weight:500}
455
+ .cost-chart-card{background:var(--s1);border:1px solid var(--bd);border-radius:10px;padding:1rem}
456
+ .cost-chart-card h4{font-size:.75rem;color:var(--mut);margin-bottom:.5rem}
457
+ .cost-chart-wrapper{height:220px;position:relative}
458
+ .cost-currency-toggle{padding:.3rem .5rem;border-radius:6px;border:1px solid var(--bd);background:var(--bg);color:var(--txt);font-size:.7rem;cursor:pointer;font-weight:600;appearance:none;-webkit-appearance:none;padding-right:1.2rem;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23888'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right .4rem center}
459
+ .cost-currency-toggle:hover,.cost-currency-toggle:focus{border-color:var(--ac);color:var(--ac);outline:none}
460
+ .cost-table{width:100%;border-collapse:collapse;font-size:.75rem}
461
+ .cost-table th{text-align:left;padding:.4rem .6rem;border-bottom:1px solid var(--bd);color:var(--mut);font-weight:600}
462
+ .cost-table td{padding:.4rem .6rem;border-bottom:1px solid var(--s2)}
463
+ .cost-plan-bar{height:18px;background:var(--s2);border-radius:4px;overflow:hidden;margin:.2rem 0}
464
+ .cost-plan-fill{height:100%;border-radius:4px;transition:width .3s}
465
+ .cost-plan-fill.ok{background:var(--ok)}
466
+ .cost-plan-fill.warn{background:var(--warn)}
467
+ .cost-plan-fill.err{background:var(--err)}
468
+ @media(max-width:768px){.cost-stats,.cost-charts-grid{grid-template-columns:1fr}}
469
+ .disk-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:.75rem;margin-bottom:1rem}
470
+ .disk-stat-card{background:var(--s1);border:1px solid var(--bd);border-radius:10px;padding:1rem;text-align:center}
471
+ .disk-stat-card .disk-val{font-size:1.4rem;font-weight:700;color:var(--txt)}
472
+ .disk-stat-card .disk-val.warn{color:var(--warn)}
473
+ .disk-stat-card .disk-val.err{color:var(--err)}
474
+ .disk-stat-card .disk-val.ok{color:var(--ok)}
475
+ .disk-stat-card .disk-label{font-size:.7rem;color:var(--mut);margin-top:.25rem}
476
+ .disk-charts-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:.75rem;margin-bottom:1rem}
477
+ .disk-chart-card{background:var(--s1);border:1px solid var(--bd);border-radius:10px;padding:1rem}
478
+ .disk-chart-card h4{font-size:.75rem;color:var(--mut);margin-bottom:.5rem}
479
+ .disk-chart-wrapper{height:220px;position:relative}
480
+ .disk-table{width:100%;border-collapse:collapse;font-size:.75rem}
481
+ .disk-table th{text-align:left;padding:.4rem .6rem;border-bottom:1px solid var(--bd);color:var(--mut);font-weight:600}
482
+ .disk-table td{padding:.4rem .6rem;border-bottom:1px solid var(--s2)}
483
+ .disk-gauge{height:22px;background:var(--s2);border-radius:6px;overflow:hidden;margin:.5rem 0;position:relative}
484
+ .disk-gauge-fill{height:100%;border-radius:6px;transition:width .3s}
485
+ .disk-gauge-fill.ok{background:var(--ok)}
486
+ .disk-gauge-fill.warn{background:var(--warn)}
487
+ .disk-gauge-fill.err{background:var(--err)}
488
+ .disk-gauge-text{position:absolute;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;font-size:.7rem;font-weight:600;color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.5)}
489
+ @media(max-width:768px){.disk-stats,.disk-charts-grid{grid-template-columns:1fr}}