sillyspec 3.7.13 → 3.7.14

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.
@@ -6,7 +6,7 @@
6
6
  <!-- Left: Status -->
7
7
  <div class="flex items-center gap-3">
8
8
  <div v-if="project" class="flex items-center gap-2">
9
- <span class="text-[11px] font-[JetBrains_Mono,monospace]" style="color: #525252;">{{ project.name }}</span>
9
+ <span class="text-[11px] font-[JetBrains_Mono,monospace]" style="color: #8B8FA3;">{{ project.name }}</span>
10
10
  <span style="color: #1F1F22;">|</span>
11
11
  <StageBadge v-if="project.state?.currentStage" :status="getProjectStatus()" :label="stageLabel()" />
12
12
  </div>
@@ -33,9 +33,9 @@
33
33
  <button
34
34
  @click="$emit('toggle-panel')"
35
35
  class="p-1.5 rounded-sm transition-colors duration-100"
36
- style="color: #525252;"
36
+ style="color: #8B8FA3;"
37
37
  @mouseenter="$event.target.style.color='#FBBF24';$event.target.style.background='rgba(251,191,36,0.06)'"
38
- @mouseleave="$event.target.style.color='#525252';$event.target.style.background='transparent'"
38
+ @mouseleave="$event.target.style.color='#8B8FA3';$event.target.style.background='transparent'"
39
39
  title="切换详情面板"
40
40
  >
41
41
  <svg :class="['w-3.5 h-3.5 transition-transform duration-200', { 'rotate-180': !isPanelOpen }]" fill="none" stroke="currentColor" viewBox="0 0 24 24">
@@ -55,9 +55,9 @@
55
55
  <button
56
56
  @click="$emit('open-palette')"
57
57
  class="p-1.5 rounded-sm transition-colors duration-100"
58
- style="color: #525252;"
58
+ style="color: #8B8FA3;"
59
59
  @mouseenter="$event.target.style.color='#FBBF24';$event.target.style.background='rgba(251,191,36,0.06)'"
60
- @mouseleave="$event.target.style.color='#525252';$event.target.style.background='transparent'"
60
+ @mouseleave="$event.target.style.color='#8B8FA3';$event.target.style.background='transparent'"
61
61
  title="命令面板 (⌘K)"
62
62
  >
63
63
  <svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
@@ -10,7 +10,7 @@
10
10
  <!-- Search -->
11
11
  <div class="px-4 py-3" style="border-bottom: 1px solid #1F1F22;">
12
12
  <div class="flex items-center gap-3">
13
- <svg class="w-3.5 h-3.5 flex-shrink-0" style="color: #525252;" fill="none" stroke="currentColor" viewBox="0 0 24 24">
13
+ <svg class="w-3.5 h-3.5 flex-shrink-0" style="color: #8B8FA3;" fill="none" stroke="currentColor" viewBox="0 0 24 24">
14
14
  <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"/>
15
15
  </svg>
16
16
  <input
@@ -22,7 +22,7 @@
22
22
  style="color: #E4E4E7;"
23
23
  @keydown="handleKeydown"
24
24
  />
25
- <kbd v-if="searchQuery" class="text-[9px] px-1 py-0.5 rounded-sm font-mono-log" style="color: #525252; background: #0A0A0B; border: 1px solid #2A2A2D;">ESC</kbd>
25
+ <kbd v-if="searchQuery" class="text-[9px] px-1 py-0.5 rounded-sm font-mono-log" style="color: #8B8FA3; background: #0A0A0B; border: 1px solid #2A2A2D;">ESC</kbd>
26
26
  </div>
27
27
  </div>
28
28
 
@@ -40,12 +40,12 @@
40
40
  @click="selectItem(item)"
41
41
  @mouseenter="selectedIndex = index"
42
42
  >
43
- <div class="w-6 h-6 rounded-sm flex items-center justify-center text-[10px] font-[JetBrains_Mono,monospace] flex-shrink-0" style="background: #0A0A0B; border: 1px solid #1F1F22; color: #525252;">
43
+ <div class="w-6 h-6 rounded-sm flex items-center justify-center text-[10px] font-[JetBrains_Mono,monospace] flex-shrink-0" style="background: #0A0A0B; border: 1px solid #1F1F22; color: #8B8FA3;">
44
44
  {{ item.type === 'project' ? '□' : '◇' }}
45
45
  </div>
46
46
  <div class="flex-1 min-w-0">
47
47
  <div class="text-[12px] font-medium truncate font-[JetBrains_Mono,monospace]" style="color: #E4E4E7;">{{ item.title }}</div>
48
- <div class="text-[10px] truncate" style="color: #525252;">{{ item.subtitle }}</div>
48
+ <div class="text-[10px] truncate" style="color: #8B8FA3;">{{ item.subtitle }}</div>
49
49
  </div>
50
50
  <StageBadge v-if="item.status" :status="item.status" size="sm" />
51
51
  </div>
@@ -5,11 +5,11 @@
5
5
  >
6
6
  <!-- Header -->
7
7
  <div class="px-4 py-3 flex items-center justify-between flex-shrink-0" style="border-bottom: 1px solid #1F1F22;">
8
- <h2 class="text-[11px] font-semibold uppercase tracking-[0.2em] font-[JetBrains_Mono,monospace]" style="color: #525252;">详情</h2>
8
+ <h2 class="text-[11px] font-semibold uppercase tracking-[0.2em] font-[JetBrains_Mono,monospace]" style="color: #8B8FA3;">详情</h2>
9
9
  <button
10
10
  @click="$emit('close')"
11
11
  class="p-1 rounded-sm transition-colors duration-100 hover:bg-white/5"
12
- style="color: #525252;"
12
+ style="color: #8B8FA3;"
13
13
  >
14
14
  <svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
15
15
  <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
@@ -45,47 +45,47 @@
45
45
 
46
46
  <!-- Description -->
47
47
  <div v-if="activeStep.description || activeStep.summary" class="px-4 py-3" style="border-bottom: 1px solid #1F1F22;">
48
- <h4 class="text-[9px] font-semibold uppercase tracking-[0.2em] mb-1.5 font-[JetBrains_Mono,monospace]" style="color: #525252;">描述</h4>
49
- <p class="text-[11px] leading-relaxed" style="color: #8B8B8E;">{{ activeStep.description || activeStep.summary }}</p>
48
+ <h4 class="text-[9px] font-semibold uppercase tracking-[0.2em] mb-1.5 font-[JetBrains_Mono,monospace]" style="color: #8B8FA3;">描述</h4>
49
+ <p class="text-[11px] leading-relaxed" style="color: #A0A4B5;">{{ activeStep.description || activeStep.summary }}</p>
50
50
  </div>
51
51
 
52
52
  <!-- Conclusion -->
53
53
  <div v-if="activeStep.conclusion" class="px-4 py-3" style="border-bottom: 1px solid #1F1F22;">
54
- <h4 class="text-[9px] font-semibold uppercase tracking-[0.2em] mb-1.5 font-[JetBrains_Mono,monospace]" style="color: #525252;">结论</h4>
54
+ <h4 class="text-[9px] font-semibold uppercase tracking-[0.2em] mb-1.5 font-[JetBrains_Mono,monospace]" style="color: #8B8FA3;">结论</h4>
55
55
  <p class="text-[11px] leading-relaxed" style="color: #E4E4E7;">{{ activeStep.conclusion }}</p>
56
56
  </div>
57
57
 
58
58
  <!-- Decision -->
59
59
  <div v-if="activeStep.decision" class="px-4 py-3" style="border-bottom: 1px solid #1F1F22;">
60
- <h4 class="text-[9px] font-semibold uppercase tracking-[0.2em] mb-1.5 font-[JetBrains_Mono,monospace]" style="color: #525252;">决策</h4>
60
+ <h4 class="text-[9px] font-semibold uppercase tracking-[0.2em] mb-1.5 font-[JetBrains_Mono,monospace]" style="color: #8B8FA3;">决策</h4>
61
61
  <p class="text-[11px] leading-relaxed" style="color: #E4E4E7;">{{ activeStep.decision }}</p>
62
62
  </div>
63
63
 
64
64
  <!-- User Query -->
65
65
  <div v-if="activeStep.userQuery" class="px-4 py-3" style="border-bottom: 1px solid #1F1F22;">
66
- <h4 class="text-[9px] font-semibold uppercase tracking-[0.2em] mb-1.5 font-[JetBrains_Mono,monospace]" style="color: #525252;">用户提问</h4>
66
+ <h4 class="text-[9px] font-semibold uppercase tracking-[0.2em] mb-1.5 font-[JetBrains_Mono,monospace]" style="color: #8B8FA3;">用户提问</h4>
67
67
  <div class="px-3 py-2 rounded-md" style="background: #0E0E10; border: 1px solid #1F1F22;">
68
- <p class="text-[11px] italic" style="color: #8B8B8E;">"{{ activeStep.userQuery }}"</p>
68
+ <p class="text-[11px] italic" style="color: #A0A4B5;">"{{ activeStep.userQuery }}"</p>
69
69
  </div>
70
70
  </div>
71
71
 
72
72
  <!-- Metadata -->
73
73
  <div v-if="activeStep.duration || activeStep.timestamp" class="px-4 py-3" style="border-bottom: 1px solid #1F1F22;">
74
- <h4 class="text-[9px] font-semibold uppercase tracking-[0.2em] mb-1.5 font-[JetBrains_Mono,monospace]" style="color: #525252;">元信息</h4>
75
- <div class="space-y-1 text-[11px]" style="color: #525252;">
76
- <div v-if="activeStep.duration"><span style="color: #8B8B8E;">耗时:</span> {{ activeStep.duration }}</div>
77
- <div v-if="activeStep.timestamp"><span style="color: #8B8B8E;">时间:</span> {{ formatTimestamp(activeStep.timestamp) }}</div>
74
+ <h4 class="text-[9px] font-semibold uppercase tracking-[0.2em] mb-1.5 font-[JetBrains_Mono,monospace]" style="color: #8B8FA3;">元信息</h4>
75
+ <div class="space-y-1 text-[11px]" style="color: #8B8FA3;">
76
+ <div v-if="activeStep.duration"><span style="color: #A0A4B5;">耗时:</span> {{ activeStep.duration }}</div>
77
+ <div v-if="activeStep.timestamp"><span style="color: #A0A4B5;">时间:</span> {{ formatTimestamp(activeStep.timestamp) }}</div>
78
78
  </div>
79
79
  </div>
80
80
 
81
81
  <!-- Output -->
82
82
  <div v-if="activeStep.output || activeStep.files" class="px-4 py-3" style="border-bottom: 1px solid #1F1F22;">
83
- <h4 class="text-[9px] font-semibold uppercase tracking-[0.2em] mb-1.5 font-[JetBrains_Mono,monospace]" style="color: #525252;">输出</h4>
83
+ <h4 class="text-[9px] font-semibold uppercase tracking-[0.2em] mb-1.5 font-[JetBrains_Mono,monospace]" style="color: #8B8FA3;">输出</h4>
84
84
  <div v-if="activeStep.output" class="px-3 py-2 rounded-md max-h-40 overflow-y-auto" style="background: #0E0E10; border: 1px solid #1F1F22;">
85
- <pre class="text-[10px] whitespace-pre-wrap font-mono-log" style="color: #8B8B8E;">{{ activeStep.output }}</pre>
85
+ <pre class="text-[10px] whitespace-pre-wrap font-mono-log" style="color: #A0A4B5;">{{ activeStep.output }}</pre>
86
86
  </div>
87
87
  <div v-if="activeStep.files" class="mt-2 space-y-1">
88
- <div v-for="(file, i) in activeStep.files" :key="i" class="flex items-center gap-2 text-[10px]" style="color: #525252;">
88
+ <div v-for="(file, i) in activeStep.files" :key="i" class="flex items-center gap-2 text-[10px]" style="color: #8B8FA3;">
89
89
  <svg class="w-3 h-3 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
90
90
  <path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/>
91
91
  </svg>
@@ -1,10 +1,10 @@
1
1
  <template>
2
2
  <div class="h-full overflow-y-auto px-6 py-4">
3
3
  <div v-if="!content && !loading" class="flex items-center justify-center h-full">
4
- <p class="text-[12px] font-[JetBrains_Mono,monospace]" style="color: #525252;">选择一个文档查看内容</p>
4
+ <p class="text-[12px] font-[JetBrains_Mono,monospace]" style="color: #8B8FA3;">选择一个文档查看内容</p>
5
5
  </div>
6
6
  <div v-else-if="loading" class="flex items-center justify-center h-full">
7
- <p class="text-[12px] font-[JetBrains_Mono,monospace]" style="color: #525252;">加载中...</p>
7
+ <p class="text-[12px] font-[JetBrains_Mono,monospace]" style="color: #8B8FA3;">加载中...</p>
8
8
  </div>
9
9
  <div v-else class="doc-preview" v-html="renderedContent"></div>
10
10
  </div>
@@ -34,8 +34,8 @@ function simpleMarkdown(md) {
34
34
  .replace(/\*\*([^*]+)\*\*/g, '<strong style="color:#E5E5E5;">$1</strong>')
35
35
  .replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2" style="color:#FBBF24;">$1</a>')
36
36
  .replace(/^- \[x\] (.+)$/gm, '<div style="color:#34D399;">☑ $1</div>')
37
- .replace(/^- \[ \] (.+)$/gm, '<div style="color:#8B8B8E;">☐ $1</div>')
38
- .replace(/^- (.+)$/gm, '<div style="padding-left:12px;color:#8B8B8E;">• $1</div>')
37
+ .replace(/^- \[ \] (.+)$/gm, '<div style="color:#A0A4B5;">☐ $1</div>')
38
+ .replace(/^- (.+)$/gm, '<div style="padding-left:12px;color:#A0A4B5;">• $1</div>')
39
39
  .replace(/\n\n/g, '<br/><br/>')
40
40
  .replace(/\n/g, '<br/>')
41
41
  return html
@@ -1,11 +1,11 @@
1
1
  <template>
2
2
  <div class="flex flex-col h-full">
3
3
  <div v-if="groups.length === 0" class="flex items-center justify-center h-full">
4
- <p class="text-[12px] font-[JetBrains_Mono,monospace]" style="color: #525252;">暂无文档</p>
4
+ <p class="text-[12px] font-[JetBrains_Mono,monospace]" style="color: #8B8FA3;">暂无文档</p>
5
5
  </div>
6
6
  <div v-else class="overflow-y-auto px-4 py-3 space-y-4">
7
7
  <div v-for="group in groups" :key="group.key">
8
- <div class="text-[10px] font-semibold uppercase tracking-[0.15em] font-[JetBrains_Mono,monospace] mb-2" style="color: #525252;">
8
+ <div class="text-[10px] font-semibold uppercase tracking-[0.15em] font-[JetBrains_Mono,monospace] mb-2" style="color: #8B8FA3;">
9
9
  {{ group.label }}
10
10
  </div>
11
11
  <div class="space-y-0.5">
@@ -15,7 +15,7 @@
15
15
  @click="$emit('select-file', file)"
16
16
  class="w-full text-left px-2.5 py-1.5 rounded text-[12px] font-[JetBrains_Mono,monospace] transition-colors"
17
17
  :style="{
18
- color: selectedFile?.path === file.path ? '#FBBF24' : '#8B8B8E',
18
+ color: selectedFile?.path === file.path ? '#FBBF24' : '#A0A4B5',
19
19
  background: selectedFile?.path === file.path ? 'rgba(251,191,36,0.08)' : 'transparent'
20
20
  }"
21
21
  >
@@ -7,12 +7,12 @@
7
7
  type="text"
8
8
  placeholder="过滤日志..."
9
9
  class="flex-1 px-2 py-1 rounded-sm text-[10px] font-mono-log outline-none transition-colors duration-100"
10
- style="background: #141416; border: 1px solid #1F1F22; color: #8B8B8E;"
10
+ style="background: #141416; border: 1px solid #1F1F22; color: #A0A4B5;"
11
11
  />
12
12
  <button
13
13
  @click="clearLogs"
14
14
  class="px-2 py-1 text-[10px] rounded-sm transition-colors duration-100"
15
- style="color: #525252; border: 1px solid #1F1F22;"
15
+ style="color: #8B8FA3; border: 1px solid #1F1F22;"
16
16
  >
17
17
  清空
18
18
  </button>
@@ -20,7 +20,7 @@
20
20
  @click="toggleAutoScroll"
21
21
  class="px-2 py-1 text-[10px] rounded-sm font-mono-log transition-colors duration-100"
22
22
  :style="{
23
- color: autoScroll ? '#FBBF24' : '#525252',
23
+ color: autoScroll ? '#FBBF24' : '#8B8FA3',
24
24
  background: autoScroll ? 'rgba(251,191,36,0.08)' : 'transparent',
25
25
  border: autoScroll ? '1px solid rgba(251,191,36,0.2)' : '1px solid #1F1F22'
26
26
  }"
@@ -69,7 +69,7 @@ const filteredLogs = computed(() => {
69
69
  function formatTime(ts) { if (!ts) return ''; const d = new Date(ts); return d.toLocaleTimeString('zh-CN', { hour12: false }) }
70
70
  function escapeHtml(t) { if (!t) return ''; return t.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;') }
71
71
  function logBg(t) { return t === 'error' ? 'rgba(239,68,68,0.05)' : t === 'warn' ? 'rgba(251,146,60,0.05)' : 'transparent' }
72
- function logColor(t) { return t === 'error' ? '#EF4444' : t === 'warn' ? '#FB923C' : t === 'debug' ? '#525252' : '#8B8B8E' }
72
+ function logColor(t) { return t === 'error' ? '#EF4444' : t === 'warn' ? '#FB923C' : t === 'debug' ? '#8B8FA3' : '#A0A4B5' }
73
73
  function clearLogs() { emit('clear') }
74
74
  function toggleAutoScroll() { autoScroll.value = !autoScroll.value; if (autoScroll.value) scrollToBottom() }
75
75
  function handleScroll() {
@@ -25,7 +25,7 @@
25
25
 
26
26
  <!-- Steps -->
27
27
  <div class="space-y-1">
28
- <div v-if="steps.length === 0" class="text-[11px] italic py-1" style="color: #525252;">
28
+ <div v-if="steps.length === 0" class="text-[11px] italic py-1" style="color: #8B8FA3;">
29
29
  No steps yet
30
30
  </div>
31
31
  <StepCard
@@ -3,19 +3,19 @@
3
3
  <!-- Header with Tabs -->
4
4
  <div class="px-6 pt-4 pb-0" style="border-bottom: 1px solid #1F1F22;">
5
5
  <div class="flex items-center gap-6">
6
- <h2 class="text-[11px] font-semibold uppercase tracking-[0.2em] font-[JetBrains_Mono,monospace]" style="color: #525252;">
6
+ <h2 class="text-[11px] font-semibold uppercase tracking-[0.2em] font-[JetBrains_Mono,monospace]" style="color: #8B8FA3;">
7
7
  {{ project?.name || '项目' }}
8
8
  </h2>
9
9
  <div class="flex gap-1">
10
10
  <button
11
11
  @click="$emit('switch-tab', 'pipeline')"
12
12
  class="px-3 py-1.5 text-[11px] font-[JetBrains_Mono,monospace] transition-colors rounded"
13
- :style="{ color: activeTab === 'pipeline' ? '#FBBF24' : '#525252', background: activeTab === 'pipeline' ? 'rgba(251,191,36,0.08)' : 'transparent' }"
13
+ :style="{ color: activeTab === 'pipeline' ? '#FBBF24' : '#8B8FA3', background: activeTab === 'pipeline' ? 'rgba(251,191,36,0.08)' : 'transparent' }"
14
14
  >流水线</button>
15
15
  <button
16
16
  @click="$emit('switch-tab', 'docs')"
17
17
  class="px-3 py-1.5 text-[11px] font-[JetBrains_Mono,monospace] transition-colors rounded"
18
- :style="{ color: activeTab === 'docs' ? '#FBBF24' : '#525252', background: activeTab === 'docs' ? 'rgba(251,191,36,0.08)' : 'transparent' }"
18
+ :style="{ color: activeTab === 'docs' ? '#FBBF24' : '#8B8FA3', background: activeTab === 'docs' ? 'rgba(251,191,36,0.08)' : 'transparent' }"
19
19
  >文档</button>
20
20
  </div>
21
21
  </div>
@@ -24,7 +24,7 @@
24
24
  <!-- Pipeline Tab -->
25
25
  <div v-if="activeTab === 'pipeline'" class="flex flex-col flex-1 overflow-hidden">
26
26
  <div class="px-6 pt-4 pb-2">
27
- <p v-if="project" class="text-[12px] font-[JetBrains_Mono,monospace]" style="color: #8B8B8E;">
27
+ <p v-if="project" class="text-[12px] font-[JetBrains_Mono,monospace]" style="color: #A0A4B5;">
28
28
  <span style="color: #FBBF24;">{{ currentStage }}</span>
29
29
  </p>
30
30
  </div>
@@ -33,11 +33,11 @@
33
33
  <div v-if="!project || !project.state" class="flex items-center justify-center flex-1">
34
34
  <div class="text-center">
35
35
  <div class="w-14 h-14 mx-auto mb-4 rounded-md flex items-center justify-center" style="border: 1px dashed #2A2A2D; transform: rotate(45deg);">
36
- <svg class="w-5 h-5" style="color: #525252; transform: rotate(-45deg);" fill="none" stroke="currentColor" viewBox="0 0 24 24">
36
+ <svg class="w-5 h-5" style="color: #8B8FA3; transform: rotate(-45deg);" fill="none" stroke="currentColor" viewBox="0 0 24 24">
37
37
  <path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10"/>
38
38
  </svg>
39
39
  </div>
40
- <p class="text-[12px] font-[JetBrains_Mono,monospace]" style="color: #525252;">选择一个项目查看流水线</p>
40
+ <p class="text-[12px] font-[JetBrains_Mono,monospace]" style="color: #8B8FA3;">选择一个项目查看流水线</p>
41
41
  </div>
42
42
  </div>
43
43
 
@@ -55,14 +55,14 @@
55
55
  <!-- Activity Log -->
56
56
  <div v-if="project?.state?.progress" style="border-top: 1px solid #1F1F22; background: rgba(10,10,11,0.6);">
57
57
  <div class="px-6 py-2.5 flex items-center justify-between">
58
- <div class="text-[9px] font-semibold uppercase tracking-[0.25em] font-[JetBrains_Mono,monospace]" style="color: #525252;">活动日志</div>
58
+ <div class="text-[9px] font-semibold uppercase tracking-[0.25em] font-[JetBrains_Mono,monospace]" style="color: #8B8FA3;">活动日志</div>
59
59
  <div class="text-[10px] font-mono-log" style="color: #3A3A3D;">{{ activityLogs.length }}</div>
60
60
  </div>
61
61
  <div class="px-6 pb-3 space-y-0.5 max-h-32 overflow-y-auto">
62
62
  <div v-for="(log, i) in activityLogs" :key="i" class="flex items-start gap-2.5 text-[11px] py-0.5">
63
63
  <span class="w-10 font-mono-log flex-shrink-0" style="color: #3A3A3D;">{{ log.time }}</span>
64
64
  <span :style="{ color: log.status === 'completed' ? '#34D399' : '#FBBF24' }">›</span>
65
- <span style="color: #8B8B8E;">{{ log.description }}</span>
65
+ <span style="color: #A0A4B5;">{{ log.description }}</span>
66
66
  </div>
67
67
  <div v-if="activityLogs.length === 0" class="text-[10px] py-1" style="color: #3A3A3D;">暂无活动记录</div>
68
68
  </div>
@@ -6,17 +6,18 @@
6
6
  <div class="w-8 h-8 rounded-md flex items-center justify-center" style="background: linear-gradient(135deg, #FBBF24 0%, #F59E0B 100%); clip-path: polygon(0 0, 100% 0, 85% 100%, 15% 100%);">
7
7
  <span class="text-[10px] font-bold text-black font-[JetBrains_Mono,monospace]">S</span>
8
8
  </div>
9
+ <img src="/logo.jpg" style="width:28px;height:28px;border-radius:6px;margin-right:8px;">
9
10
  <div class="flex-1">
10
11
  <h1 class="text-[13px] font-semibold tracking-tight font-[JetBrains_Mono,monospace]" style="color: #E4E4E7;">
11
12
  SillySpec
12
13
  </h1>
13
- <p class="text-[10px] tracking-widest uppercase" style="color: #525252;">控制台</p>
14
+ <p class="text-[10px] tracking-widest uppercase" style="color: #8B8FA3;">控制台</p>
14
15
  </div>
15
16
  <!-- Scan paths gear button -->
16
17
  <button
17
18
  @click="showScanPanel = !showScanPanel"
18
19
  class="p-1.5 rounded-sm transition-colors duration-100"
19
- :style="{ color: showScanPanel ? '#FBBF24' : '#525252', background: showScanPanel ? 'rgba(251,191,36,0.08)' : 'transparent' }"
20
+ :style="{ color: showScanPanel ? '#FBBF24' : '#8B8FA3', background: showScanPanel ? 'rgba(251,191,36,0.08)' : 'transparent' }"
20
21
  title="扫描路径设置"
21
22
  >
22
23
  <svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
@@ -29,12 +30,12 @@
29
30
  <!-- Scan paths panel (inline) -->
30
31
  <Transition name="slide">
31
32
  <div v-if="showScanPanel" class="mt-3 rounded-md p-3" style="background: #141416; border: 1px solid #1F1F22;">
32
- <div class="text-[10px] font-semibold uppercase tracking-[0.15em] mb-2 font-[JetBrains_Mono,monospace]" style="color: #525252;">扫描路径</div>
33
+ <div class="text-[10px] font-semibold uppercase tracking-[0.15em] mb-2 font-[JetBrains_Mono,monospace]" style="color: #8B8FA3;">扫描路径</div>
33
34
 
34
35
  <div v-if="scanPaths.length === 0" class="text-[10px] py-1" style="color: #3A3A3D;">暂无自定义路径</div>
35
36
  <div v-else class="space-y-1 mb-2">
36
37
  <div v-for="(p, i) in scanPaths" :key="i" class="flex items-center gap-2 text-[10px] group">
37
- <span class="flex-1 truncate font-mono-log" style="color: #8B8B8E;">{{ p }}</span>
38
+ <span class="flex-1 truncate font-mono-log" style="color: #A0A4B5;">{{ p }}</span>
38
39
  <button
39
40
  @click="removePath(p)"
40
41
  class="opacity-0 group-hover:opacity-100 transition-opacity text-[9px] px-1 rounded-sm"
@@ -61,7 +62,7 @@
61
62
  v-else
62
63
  @click="showAddInput = true"
63
64
  class="text-[10px] px-2 py-1 rounded-sm transition-colors duration-100"
64
- style="color: #525252; border: 1px dashed #2A2A2D;"
65
+ style="color: #8B8FA3; border: 1px dashed #2A2A2D;"
65
66
  >
66
67
  + 添加目录
67
68
  </button>
@@ -80,7 +81,7 @@
80
81
  <div class="h-3 rounded w-20 skeleton-shimmer mb-2"></div>
81
82
  <div class="h-2 rounded w-32 skeleton-shimmer"></div>
82
83
  </div>
83
- <p class="text-center text-[10px] mt-4 font-[JetBrains_Mono,monospace]" style="color: #525252;">
84
+ <p class="text-center text-[10px] mt-4 font-[JetBrains_Mono,monospace]" style="color: #8B8FA3;">
84
85
  正在扫描项目...
85
86
  </p>
86
87
  </div>
@@ -88,12 +89,12 @@
88
89
  <!-- Empty state -->
89
90
  <div v-else-if="projects.length === 0" class="px-4 py-12 text-center">
90
91
  <div class="w-10 h-10 mx-auto mb-3 rounded-full flex items-center justify-center" style="border: 1px dashed #2A2A2D;">
91
- <svg class="w-4 h-4" style="color: #525252;" fill="none" stroke="currentColor" viewBox="0 0 24 24">
92
+ <svg class="w-4 h-4" style="color: #8B8FA3;" fill="none" stroke="currentColor" viewBox="0 0 24 24">
92
93
  <path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"/>
93
94
  </svg>
94
95
  </div>
95
- <p class="text-[11px]" style="color: #8B8B8E;">未发现 SillySpec 项目</p>
96
- <p class="text-[10px] mt-1" style="color: #525252;">正在扫描项目目录...</p>
96
+ <p class="text-[11px]" style="color: #A0A4B5;">未发现 SillySpec 项目</p>
97
+ <p class="text-[10px] mt-1" style="color: #8B8FA3;">正在扫描项目目录...</p>
97
98
  </div>
98
99
 
99
100
  <!-- Projects -->
@@ -121,7 +122,7 @@
121
122
  >
122
123
  {{ project.name }}
123
124
  </h3>
124
- <p class="text-[10px] mt-0.5 truncate font-mono-log" style="color: #525252;">
125
+ <p class="text-[10px] mt-0.5 truncate font-mono-log" style="color: #8B8FA3;">
125
126
  {{ project.path }}
126
127
  </p>
127
128
  </div>
@@ -148,8 +149,8 @@
148
149
  <!-- Footer -->
149
150
  <div class="relative z-10 px-4 py-2.5" style="border-top: 1px solid #1F1F22;">
150
151
  <div class="flex items-center justify-between">
151
- <span class="text-[10px] font-[JetBrains_Mono,monospace]" style="color: #525252;">{{ projects.length }} 个项目</span>
152
- <kbd class="text-[9px] px-1.5 py-0.5 rounded font-mono-log" style="color: #525252; background: #141416; border: 1px solid #2A2A2D;">⌘K</kbd>
152
+ <span class="text-[10px] font-[JetBrains_Mono,monospace]" style="color: #8B8FA3;">{{ projects.length }} 个项目</span>
153
+ <kbd class="text-[9px] px-1.5 py-0.5 rounded font-mono-log" style="color: #8B8FA3; background: #141416; border: 1px solid #2A2A2D;">⌘K</kbd>
153
154
  </div>
154
155
  </div>
155
156
  </div>
@@ -31,7 +31,7 @@ const badgeStyle = computed(() => {
31
31
  'in-progress': { background: 'rgba(251,191,36,0.1)', color: '#FBBF24' },
32
32
  'blocked': { background: 'rgba(251,146,60,0.1)', color: '#FB923C' },
33
33
  'failed': { background: 'rgba(239,68,68,0.1)', color: '#EF4444' },
34
- 'pending': { background: 'rgba(82,82,82,0.15)', color: '#525252' }
34
+ 'pending': { background: 'rgba(82,82,82,0.15)', color: '#8B8FA3' }
35
35
  }
36
36
  return styles[props.status] || styles.pending
37
37
  })
@@ -46,8 +46,8 @@ const dotStyle = computed(() => {
46
46
  'in-progress': '#FBBF24',
47
47
  'blocked': '#FB923C',
48
48
  'failed': '#EF4444',
49
- 'pending': '#525252'
49
+ 'pending': '#8B8FA3'
50
50
  }
51
- return { background: colors[props.status] || '#525252' }
51
+ return { background: colors[props.status] || '#8B8FA3' }
52
52
  })
53
53
  </script>
@@ -23,7 +23,7 @@
23
23
  class="overflow-hidden transition-all duration-200"
24
24
  :style="{ maxHeight: hovered ? '60px' : '0', opacity: hovered ? 1 : 0 }"
25
25
  >
26
- <p class="mt-1.5 text-[11px] line-clamp-2" style="color: #8B8B8E;">
26
+ <p class="mt-1.5 text-[11px] line-clamp-2" style="color: #A0A4B5;">
27
27
  {{ step.summary || step.description }}
28
28
  </p>
29
29
  </div>
@@ -36,12 +36,12 @@
36
36
  <p v-if="step.decision" class="text-[11px]" style="color: #E4E4E7;">
37
37
  <span style="color: #FBBF24; font-weight: 600;">决策:</span> {{ step.decision }}
38
38
  </p>
39
- <p v-if="step.userQuery" class="text-[11px] italic" style="color: #8B8B8E;">
39
+ <p v-if="step.userQuery" class="text-[11px] italic" style="color: #A0A4B5;">
40
40
  "{{ step.userQuery }}"
41
41
  </p>
42
42
  </div>
43
43
 
44
- <div v-if="step.duration" class="mt-1 text-[10px] font-mono-log" style="color: #525252;">
44
+ <div v-if="step.duration" class="mt-1 text-[10px] font-mono-log" style="color: #8B8FA3;">
45
45
  {{ step.duration }}
46
46
  </div>
47
47
  </div>
@@ -6,13 +6,13 @@
6
6
  --color-primary-dim: #B45309;
7
7
  --color-warning: #FB923C;
8
8
  --color-danger: #EF4444;
9
- --color-muted: #6B7280;
9
+ --color-muted: #8B8FA3;
10
10
  --color-surface: #1A1D24;
11
11
  --color-surface-2: #23272F;
12
12
  --color-border: #2E3340;
13
13
  --color-border-light: #3D4455;
14
- --color-text: #F0F0F2;
15
- --color-text-secondary: #9CA3AF;
14
+ --color-text: #EAEAEF;
15
+ --color-text-secondary: #B0B4C3;
16
16
  --color-info: #38BDF8;
17
17
  --color-success: #34D399;
18
18
 
@@ -1 +0,0 @@
1
- .slide-enter-active[data-v-ce467cd5],.slide-leave-active[data-v-ce467cd5]{transition:all .2s ease}.slide-enter-from[data-v-ce467cd5],.slide-leave-to[data-v-ce467cd5]{opacity:0;max-height:0;overflow:hidden}.slide-enter-to[data-v-ce467cd5],.slide-leave-from[data-v-ce467cd5]{max-height:300px}.line-clamp-2[data-v-20b76823]{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.backdrop-enter-active[data-v-fbb5ff82],.backdrop-leave-active[data-v-fbb5ff82]{transition:opacity .15s ease}.backdrop-enter-from[data-v-fbb5ff82],.backdrop-leave-to[data-v-fbb5ff82]{opacity:0}.palette-enter-active[data-v-fbb5ff82],.palette-leave-active[data-v-fbb5ff82]{transition:all .2s cubic-bezier(.16,1,.3,1)}.palette-enter-from[data-v-fbb5ff82],.palette-leave-to[data-v-fbb5ff82]{opacity:0;transform:translate(-50%,-8px) scale(.98)}*{margin:0;padding:0;box-sizing:border-box}body{font-family:DM Sans,-apple-system,BlinkMacSystemFont,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#app{width:100vw;height:100vh;overflow:hidden}/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--animate-pulse-dot:pulse-dot 1.5s ease-in-out infinite}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing) * 0)}.inset-x-0{inset-inline:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.top-0{top:calc(var(--spacing) * 0)}.top-\[18\%\]{top:18%}.bottom-0{bottom:calc(var(--spacing) * 0)}.left-0{left:calc(var(--spacing) * 0)}.left-1\/2{left:50%}.z-10{z-index:10}.z-40{z-index:40}.z-50{z-index:50}.mx-4{margin-inline:calc(var(--spacing) * 4)}.mx-auto{margin-inline:auto}.-mt-0\.5{margin-top:calc(var(--spacing) * -.5)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.flex{display:flex}.hidden{display:none}.inline-flex{display:inline-flex}.h-1{height:calc(var(--spacing) * 1)}.h-2{height:calc(var(--spacing) * 2)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-8{height:calc(var(--spacing) * 8)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-\[2px\]{height:2px}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-32{max-height:calc(var(--spacing) * 32)}.max-h-40{max-height:calc(var(--spacing) * 40)}.max-h-72{max-height:calc(var(--spacing) * 72)}.w-0{width:calc(var(--spacing) * 0)}.w-1{width:calc(var(--spacing) * 1)}.w-2{width:calc(var(--spacing) * 2)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-8{width:calc(var(--spacing) * 8)}.w-10{width:calc(var(--spacing) * 10)}.w-14{width:calc(var(--spacing) * 14)}.w-20{width:calc(var(--spacing) * 20)}.w-32{width:calc(var(--spacing) * 32)}.w-\[2px\]{width:2px}.w-\[200px\]{width:200px}.w-\[240px\]{width:240px}.w-\[340px\]{width:340px}.w-full{width:100%}.w-px{width:1px}.w-screen{width:100vw}.max-w-md{max-width:var(--container-md)}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse-dot{animation:var(--animate-pulse-dot)}.cursor-pointer{cursor:pointer}.flex-col{flex-direction:column}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-px>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(1px * var(--tw-space-y-reverse));margin-block-end:calc(1px * calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.border{border-style:var(--tw-border-style);border-width:1px}.border-none{--tw-border-style:none;border-style:none}.bg-transparent{background-color:#0000}.p-1{padding:calc(var(--spacing) * 1)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-3{padding:calc(var(--spacing) * 3)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-px{padding-block:1px}.pt-1\.5{padding-top:calc(var(--spacing) * 1.5)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pb-0{padding-bottom:calc(var(--spacing) * 0)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-5{padding-bottom:calc(var(--spacing) * 5)}.pl-3\.5{padding-left:calc(var(--spacing) * 3.5)}.pl-\[3px\]{padding-left:3px}.text-center{text-align:center}.text-left{text-align:left}.font-\[DM_Sans\,sans-serif\]{font-family:DM Sans,sans-serif}.font-\[JetBrains_Mono\,monospace\]{font-family:JetBrains Mono,monospace}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.2em\]{--tw-tracking:.2em;letter-spacing:.2em}.tracking-\[0\.15em\]{--tw-tracking:.15em;letter-spacing:.15em}.tracking-\[0\.25em\]{--tw-tracking:.25em;letter-spacing:.25em}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.whitespace-pre-wrap{white-space:pre-wrap}.text-black{color:var(--color-black)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.opacity-0{opacity:0}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-100{--tw-duration:.1s;transition-duration:.1s}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}@media(hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}.hover\:bg-white\/5:hover{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/5:hover{background-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}}}@keyframes pulse-glow{0%,to{box-shadow:0 0 #fbbf2466}50%{box-shadow:0 0 12px 2px #fbbf2426}}@keyframes pulse-dot{0%,to{opacity:1;transform:scale(1)}50%{opacity:.4;transform:scale(1.5)}}@keyframes breathe{0%,to{opacity:.5}50%{opacity:1}}@keyframes shimmer{0%{background-position:-200% 0}to{background-position:200% 0}}@keyframes slide-in{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}@keyframes glow-border{0%,to{border-color:#fbbf2426}50%{border-color:#fbbf2480}}@keyframes float{0%,to{transform:translateY(0)}50%{transform:translateY(-3px)}}.font-mono-log{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace}.noise-bg{position:relative}.noise-bg:before{content:"";pointer-events:none;z-index:0;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.03'/%3E%3C/svg%3E");position:absolute;top:0;right:0;bottom:0;left:0}.accent-stripe{background:repeating-linear-gradient(-45deg,#0000,#0000 8px,#fbbf2408 8px,#fbbf2408 9px)}.progress-gradient{background:linear-gradient(90deg,#fbbf24,#f59e0b,#fb923c)}.skeleton-shimmer{background:linear-gradient(90deg,#1a1e28 25%,#2a3040,#1a1e28 75%) 0 0/200% 100%;animation:1.5s ease-in-out infinite shimmer}::-webkit-scrollbar{width:5px;height:5px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:#2a3040;border-radius:10px}::-webkit-scrollbar-thumb:hover{background:#3a4555}*{scrollbar-width:thin;scrollbar-color:#2a2a2d transparent}::selection{color:#fbbf24;background:#fbbf2433}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}