tryassay 0.22.0 → 0.22.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/demo/css/style.css +495 -836
  2. package/demo/index.html +40 -184
  3. package/demo/js/chat.js +385 -142
  4. package/demo/js/preview.js +456 -0
  5. package/demo/js/sse-client.js +262 -135
  6. package/demo/js/state.js +11 -1
  7. package/demo/js/timeline.js +57 -371
  8. package/dist/api/server.d.ts +2 -0
  9. package/dist/api/server.js +63 -19
  10. package/dist/api/server.js.map +1 -1
  11. package/dist/cli.js +2 -0
  12. package/dist/cli.js.map +1 -1
  13. package/dist/commands/assess.d.ts +2 -0
  14. package/dist/commands/assess.js +132 -164
  15. package/dist/commands/assess.js.map +1 -1
  16. package/dist/commands/demo.js +259 -9
  17. package/dist/commands/demo.js.map +1 -1
  18. package/dist/lib/__tests__/arithmetic-quick-test.d.ts +6 -0
  19. package/dist/lib/__tests__/arithmetic-quick-test.js +197 -0
  20. package/dist/lib/__tests__/arithmetic-quick-test.js.map +1 -0
  21. package/dist/lib/__tests__/arithmetic-real-llm-test.d.ts +13 -0
  22. package/dist/lib/__tests__/arithmetic-real-llm-test.js +284 -0
  23. package/dist/lib/__tests__/arithmetic-real-llm-test.js.map +1 -0
  24. package/dist/lib/__tests__/arithmetic-value-demo.d.ts +10 -0
  25. package/dist/lib/__tests__/arithmetic-value-demo.js +193 -0
  26. package/dist/lib/__tests__/arithmetic-value-demo.js.map +1 -0
  27. package/dist/lib/__tests__/flow-to-claims.test.d.ts +1 -0
  28. package/dist/lib/__tests__/flow-to-claims.test.js +91 -0
  29. package/dist/lib/__tests__/flow-to-claims.test.js.map +1 -0
  30. package/dist/lib/__tests__/formal-verifier-api-misuse.test.d.ts +9 -0
  31. package/dist/lib/__tests__/formal-verifier-api-misuse.test.js +391 -0
  32. package/dist/lib/__tests__/formal-verifier-api-misuse.test.js.map +1 -0
  33. package/dist/lib/__tests__/formal-verifier-arithmetic.test.d.ts +7 -0
  34. package/dist/lib/__tests__/formal-verifier-arithmetic.test.js +318 -0
  35. package/dist/lib/__tests__/formal-verifier-arithmetic.test.js.map +1 -0
  36. package/dist/lib/__tests__/intent-extractor.test.d.ts +1 -0
  37. package/dist/lib/__tests__/intent-extractor.test.js +97 -0
  38. package/dist/lib/__tests__/intent-extractor.test.js.map +1 -0
  39. package/dist/lib/__tests__/intent-reviewer.test.d.ts +1 -0
  40. package/dist/lib/__tests__/intent-reviewer.test.js +55 -0
  41. package/dist/lib/__tests__/intent-reviewer.test.js.map +1 -0
  42. package/dist/lib/__tests__/mr-gsm8k-benchmark.d.ts +11 -0
  43. package/dist/lib/__tests__/mr-gsm8k-benchmark.js +224 -0
  44. package/dist/lib/__tests__/mr-gsm8k-benchmark.js.map +1 -0
  45. package/dist/lib/anthropic.js +25 -33
  46. package/dist/lib/anthropic.js.map +1 -1
  47. package/dist/lib/assessment-reporter.js +9 -13
  48. package/dist/lib/assessment-reporter.js.map +1 -1
  49. package/dist/lib/claim-extractor.js +10 -19
  50. package/dist/lib/claim-extractor.js.map +1 -1
  51. package/dist/lib/code-verifier.js +16 -36
  52. package/dist/lib/code-verifier.js.map +1 -1
  53. package/dist/lib/constraint-engine.js +10 -19
  54. package/dist/lib/constraint-engine.js.map +1 -1
  55. package/dist/lib/formal-verifier.d.ts +1 -1
  56. package/dist/lib/formal-verifier.js +454 -0
  57. package/dist/lib/formal-verifier.js.map +1 -1
  58. package/dist/lib/guided-generator.js +19 -37
  59. package/dist/lib/guided-generator.js.map +1 -1
  60. package/dist/lib/intent-extractor.d.ts +47 -0
  61. package/dist/lib/intent-extractor.js +427 -0
  62. package/dist/lib/intent-extractor.js.map +1 -0
  63. package/dist/lib/intent-reviewer.d.ts +14 -0
  64. package/dist/lib/intent-reviewer.js +148 -0
  65. package/dist/lib/intent-reviewer.js.map +1 -0
  66. package/dist/lib/intent-types.d.ts +89 -0
  67. package/dist/lib/intent-types.js +5 -0
  68. package/dist/lib/intent-types.js.map +1 -0
  69. package/dist/lib/inventory-extractor.js +9 -22
  70. package/dist/lib/inventory-extractor.js.map +1 -1
  71. package/dist/lib/llm-provider.d.ts +23 -0
  72. package/dist/lib/llm-provider.js +130 -0
  73. package/dist/lib/llm-provider.js.map +1 -0
  74. package/dist/lib/remediator.js +20 -28
  75. package/dist/lib/remediator.js.map +1 -1
  76. package/dist/lib/requirements-generator.js +14 -19
  77. package/dist/lib/requirements-generator.js.map +1 -1
  78. package/dist/lib/spec-synthesizer.js +10 -19
  79. package/dist/lib/spec-synthesizer.js.map +1 -1
  80. package/dist/runtime/app-create-orchestrator.d.ts +5 -1
  81. package/dist/runtime/app-create-orchestrator.js +114 -39
  82. package/dist/runtime/app-create-orchestrator.js.map +1 -1
  83. package/dist/runtime/check-catalog.js +5 -3
  84. package/dist/runtime/check-catalog.js.map +1 -1
  85. package/dist/runtime/check-definitions.d.ts +10 -0
  86. package/dist/runtime/check-definitions.js +52 -2
  87. package/dist/runtime/check-definitions.js.map +1 -1
  88. package/dist/runtime/composition-verifier.js +8 -12
  89. package/dist/runtime/composition-verifier.js.map +1 -1
  90. package/dist/runtime/gap-detector.js +8 -10
  91. package/dist/runtime/gap-detector.js.map +1 -1
  92. package/dist/runtime/input-validator.d.ts +7 -0
  93. package/dist/runtime/input-validator.js +162 -0
  94. package/dist/runtime/input-validator.js.map +1 -0
  95. package/dist/runtime/model-router.d.ts +10 -0
  96. package/dist/runtime/model-router.js +42 -0
  97. package/dist/runtime/model-router.js.map +1 -0
  98. package/dist/runtime/pattern-extractor.js +8 -10
  99. package/dist/runtime/pattern-extractor.js.map +1 -1
  100. package/dist/runtime/planner.js +11 -16
  101. package/dist/runtime/planner.js.map +1 -1
  102. package/dist/runtime/prompt-guard.d.ts +2 -0
  103. package/dist/runtime/prompt-guard.js +180 -0
  104. package/dist/runtime/prompt-guard.js.map +1 -0
  105. package/dist/runtime/prompt-safety-analyzer.js +8 -13
  106. package/dist/runtime/prompt-safety-analyzer.js.map +1 -1
  107. package/dist/runtime/reasoner.js +19 -33
  108. package/dist/runtime/reasoner.js.map +1 -1
  109. package/dist/runtime/rule-meta-verifier.js +9 -11
  110. package/dist/runtime/rule-meta-verifier.js.map +1 -1
  111. package/dist/runtime/safe-executor.d.ts +23 -0
  112. package/dist/runtime/safe-executor.js +151 -0
  113. package/dist/runtime/safe-executor.js.map +1 -0
  114. package/dist/runtime/specialized-agent.js +10 -14
  115. package/dist/runtime/specialized-agent.js.map +1 -1
  116. package/dist/runtime/strategy-library.js +8 -10
  117. package/dist/runtime/strategy-library.js.map +1 -1
  118. package/dist/runtime/supabase-experience-store.js.map +1 -1
  119. package/dist/runtime/supabase-provisioner.d.ts +35 -0
  120. package/dist/runtime/supabase-provisioner.js +192 -0
  121. package/dist/runtime/supabase-provisioner.js.map +1 -0
  122. package/dist/runtime/types.d.ts +88 -0
  123. package/dist/sdk/forward-verify.js +16 -33
  124. package/dist/sdk/forward-verify.js.map +1 -1
  125. package/package.json +1 -1
  126. package/demo/data/demo-events.json +0 -103
  127. package/demo/js/demo-mode.js +0 -107
  128. package/demo/js/orb.js +0 -634
  129. package/demo/js/question-cards.js +0 -207
  130. package/demo/js/voice.js +0 -154
@@ -1,4 +1,4 @@
1
- /* style.css — Dark theme, grid layout, animations */
1
+ /* style.css — Split-screen layout: chat left, preview right */
2
2
 
3
3
  @import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;700&family=Inter:wght@300;400;500;600;700&display=swap');
4
4
 
@@ -39,126 +39,69 @@ html, body {
39
39
  /* === Layout Grid === */
40
40
  #app {
41
41
  display: grid;
42
- grid-template-columns: 1fr 420px;
43
- grid-template-rows: 60px 1fr 200px;
42
+ grid-template-columns: 40% 60%;
43
+ grid-template-rows: 48px 1fr 36px;
44
44
  width: 100%;
45
45
  height: 100%;
46
- gap: 1px;
47
46
  }
48
47
 
48
+ /* === Header === */
49
49
  #header {
50
50
  grid-column: 1 / -1;
51
51
  display: flex;
52
52
  align-items: center;
53
- justify-content: center;
54
- padding: 0 24px;
55
- position: relative;
53
+ justify-content: space-between;
54
+ padding: 0 20px;
55
+ background: var(--bg-panel);
56
+ border-bottom: 1px solid var(--border);
56
57
  z-index: 10;
57
58
  }
58
59
 
59
- #orb-container {
60
- grid-column: 1;
61
- grid-row: 2;
62
- position: relative;
63
- overflow: hidden;
64
- }
65
-
66
- #timeline-panel {
67
- grid-column: 2;
68
- grid-row: 2 / 4;
69
- background: var(--bg-panel);
70
- border-left: 1px solid var(--border);
71
- overflow-y: auto;
72
- padding: 16px;
60
+ #header-left {
73
61
  display: flex;
74
- flex-direction: column;
75
- }
76
-
77
- #code-panel {
78
- grid-column: 1;
79
- grid-row: 3;
80
- background: var(--bg-panel);
81
- border-top: 1px solid var(--border);
82
- overflow: hidden;
83
- opacity: 0.3;
84
- transition: opacity 0.5s ease;
62
+ align-items: center;
63
+ gap: 12px;
85
64
  }
86
65
 
87
- #code-panel.active {
88
- opacity: 1;
66
+ .header-title {
67
+ font-family: var(--font-mono);
68
+ font-size: 16px;
69
+ font-weight: 700;
70
+ color: var(--accent-cyan);
71
+ letter-spacing: 1px;
89
72
  }
90
73
 
91
- /* === Header / Input Bar === */
92
- #input-bar {
74
+ #header-right {
93
75
  display: flex;
94
76
  align-items: center;
95
- gap: 12px;
96
- width: 100%;
97
- max-width: 700px;
98
- }
99
-
100
- #input-bar input {
101
- flex: 1;
102
- background: var(--bg-glass);
103
- border: 1px solid var(--border-glow);
104
- border-radius: 12px;
105
- padding: 10px 20px;
106
- color: var(--text-bright);
107
- font-family: var(--font-sans);
108
- font-size: 14px;
109
- outline: none;
110
- backdrop-filter: blur(12px);
111
- transition: border-color 0.3s, box-shadow 0.3s;
77
+ gap: 16px;
112
78
  }
113
79
 
114
- #input-bar input::placeholder {
80
+ #file-badge {
81
+ font-family: var(--font-mono);
82
+ font-size: 12px;
115
83
  color: var(--text-dim);
84
+ background: rgba(6, 182, 212, 0.1);
85
+ padding: 4px 10px;
86
+ border-radius: 6px;
87
+ border: 1px solid rgba(6, 182, 212, 0.15);
88
+ transition: opacity 0.3s;
116
89
  }
117
90
 
118
- #input-bar input:focus {
119
- border-color: var(--accent-cyan);
120
- box-shadow: 0 0 20px rgba(6, 182, 212, 0.15);
121
- }
122
-
123
- #input-bar input:disabled {
124
- opacity: 0.4;
125
- cursor: not-allowed;
91
+ #file-badge.hidden {
92
+ opacity: 0;
93
+ pointer-events: none;
126
94
  }
127
95
 
128
- #input-bar button {
129
- background: linear-gradient(135deg, var(--accent-cyan), #0891b2);
130
- border: none;
131
- border-radius: 10px;
132
- padding: 10px 20px;
133
- color: #000;
134
- font-family: var(--font-sans);
96
+ #file-badge span:last-child {
97
+ color: var(--accent-cyan);
135
98
  font-weight: 600;
136
- font-size: 13px;
137
- cursor: pointer;
138
- transition: transform 0.15s, opacity 0.2s;
139
- white-space: nowrap;
140
- }
141
-
142
- #input-bar button:hover {
143
- transform: scale(1.03);
144
99
  }
145
100
 
146
- #input-bar button:disabled {
147
- opacity: 0.3;
148
- cursor: not-allowed;
149
- transform: none;
150
- }
151
-
152
- /* === Global Clock === */
153
101
  .global-clock {
154
- position: absolute;
155
- right: 80px;
156
- top: 50%;
157
- transform: translateY(-50%);
158
102
  display: flex;
159
- flex-direction: column;
160
103
  align-items: center;
161
- gap: 1px;
104
+ gap: 4px;
162
105
  transition: opacity 0.4s ease;
163
106
  }
164
107
 
@@ -169,444 +112,471 @@ html, body {
169
112
 
170
113
  .global-clock .clock-value {
171
114
  font-family: var(--font-mono);
172
- font-size: 22px;
115
+ font-size: 16px;
173
116
  font-weight: 700;
174
117
  color: var(--accent-cyan);
175
- letter-spacing: 2px;
176
- text-shadow: 0 0 20px rgba(6, 182, 212, 0.4);
177
- }
178
-
179
- .global-clock .clock-label {
180
- font-size: 9px;
181
- text-transform: uppercase;
182
- letter-spacing: 2px;
183
- color: var(--text-dim);
184
- }
185
-
186
- #mute-toggle {
187
- position: absolute;
188
- right: 24px;
189
- top: 50%;
190
- transform: translateY(-50%);
191
- background: var(--bg-glass);
192
- border: 1px solid var(--border);
193
- border-radius: 8px;
194
- padding: 6px 10px;
195
- color: var(--text-dim);
196
- cursor: pointer;
197
- font-size: 16px;
198
- transition: color 0.2s;
199
- }
200
-
201
- #mute-toggle:hover {
202
- color: var(--text);
203
- }
204
-
205
- #mute-toggle.muted {
206
- color: var(--accent-red);
118
+ letter-spacing: 1px;
207
119
  }
208
120
 
209
- /* === Metrics Bar === */
210
- #metrics-bar {
121
+ /* === Chat Panel (Left 40%) === */
122
+ #chat-panel {
123
+ grid-column: 1;
124
+ grid-row: 2;
211
125
  display: flex;
212
- gap: 20px;
213
- padding: 12px 0;
214
- border-bottom: 1px solid var(--border);
215
- margin-bottom: 12px;
216
- flex-shrink: 0;
126
+ flex-direction: column;
127
+ background: var(--bg-panel);
128
+ border-right: 1px solid var(--border);
129
+ overflow: hidden;
217
130
  }
218
131
 
219
- .metric {
132
+ /* Chat messages area */
133
+ #chat-messages {
134
+ flex: 1;
135
+ overflow-y: auto;
136
+ padding: 16px;
220
137
  display: flex;
221
138
  flex-direction: column;
222
- align-items: center;
223
- gap: 2px;
139
+ gap: 12px;
224
140
  }
225
141
 
226
- .metric-value {
227
- font-family: var(--font-mono);
228
- font-size: 20px;
229
- font-weight: 700;
230
- color: var(--text-bright);
142
+ /* Chat input area (shown during conversation) */
143
+ #chat-input-area {
144
+ display: flex;
145
+ gap: 8px;
146
+ padding: 12px 16px;
147
+ border-top: 1px solid var(--border);
148
+ background: rgba(5, 5, 10, 0.8);
149
+ flex-shrink: 0;
231
150
  }
232
151
 
233
- .metric-label {
234
- font-size: 10px;
235
- text-transform: uppercase;
236
- letter-spacing: 1px;
237
- color: var(--text-dim);
152
+ #chat-input-area.hidden {
153
+ display: none;
238
154
  }
239
155
 
240
- /* === Timeline Steps === */
241
- #timeline-steps {
156
+ #chat-input-area input {
242
157
  flex: 1;
243
- overflow-y: auto;
244
- padding-right: 4px;
158
+ background: rgba(20, 20, 30, 0.8);
159
+ border: 1px solid rgba(100, 200, 255, 0.2);
160
+ border-radius: 8px;
161
+ padding: 10px 14px;
162
+ color: rgba(200, 220, 255, 0.9);
163
+ font-size: 14px;
164
+ outline: none;
245
165
  }
246
166
 
247
- .timeline-step {
248
- position: relative;
249
- padding: 12px 12px 12px 32px;
250
- margin-bottom: 4px;
251
- border-radius: 8px;
252
- transition: background 0.3s, border-color 0.3s;
253
- border: 1px solid transparent;
167
+ #chat-input-area input:focus {
168
+ border-color: rgba(100, 200, 255, 0.4);
254
169
  }
255
170
 
256
- .timeline-step::before {
257
- content: '';
258
- position: absolute;
259
- left: 12px;
260
- top: 16px;
261
- width: 8px;
262
- height: 8px;
263
- border-radius: 50%;
264
- background: var(--text-dim);
265
- transition: background 0.3s, box-shadow 0.3s;
171
+ #chat-input-area button {
172
+ background: rgba(100, 200, 255, 0.15);
173
+ border: 1px solid rgba(100, 200, 255, 0.3);
174
+ border-radius: 8px;
175
+ padding: 10px 18px;
176
+ color: rgba(100, 200, 255, 0.9);
177
+ cursor: pointer;
178
+ font-size: 14px;
179
+ transition: all 0.2s;
266
180
  }
267
181
 
268
- .timeline-step.pending::before {
269
- background: var(--text-dim);
182
+ #chat-input-area button:hover {
183
+ background: rgba(100, 200, 255, 0.25);
270
184
  }
271
185
 
272
- .timeline-step.active {
273
- background: rgba(6, 182, 212, 0.08);
274
- border-color: rgba(6, 182, 212, 0.2);
186
+ /* Attach button */
187
+ #attach-btn {
188
+ background: none;
189
+ border: 1px solid rgba(100, 200, 255, 0.2);
190
+ border-radius: 8px;
191
+ padding: 8px 10px;
192
+ color: rgba(100, 200, 255, 0.7);
193
+ cursor: pointer;
194
+ font-size: 16px;
195
+ line-height: 1;
196
+ transition: all 0.2s;
197
+ flex-shrink: 0;
275
198
  }
276
199
 
277
- .timeline-step.active::before {
278
- background: var(--accent-cyan);
279
- box-shadow: 0 0 12px var(--accent-cyan);
280
- animation: pulse-dot 2s ease-in-out infinite;
200
+ #attach-btn:hover {
201
+ background: rgba(100, 200, 255, 0.1);
202
+ border-color: rgba(100, 200, 255, 0.4);
203
+ color: rgba(100, 200, 255, 0.9);
281
204
  }
282
205
 
283
- .timeline-step.completed::before {
284
- background: var(--accent-green);
285
- box-shadow: 0 0 8px rgba(34, 197, 94, 0.4);
206
+ /* Attachment preview */
207
+ #attachment-preview {
208
+ display: flex;
209
+ gap: 6px;
210
+ padding: 6px 16px;
211
+ flex-wrap: wrap;
212
+ border-top: 1px solid var(--border);
213
+ background: rgba(5, 5, 10, 0.6);
214
+ flex-shrink: 0;
286
215
  }
287
216
 
288
- .timeline-step.failed::before {
289
- background: var(--accent-red);
290
- box-shadow: 0 0 8px rgba(239, 68, 68, 0.4);
217
+ #attachment-preview.hidden {
218
+ display: none;
291
219
  }
292
220
 
293
- .step-header {
294
- display: flex;
221
+ .attachment-chip {
222
+ display: inline-flex;
295
223
  align-items: center;
296
- justify-content: space-between;
297
- gap: 8px;
224
+ gap: 6px;
225
+ padding: 4px 10px;
226
+ background: rgba(100, 200, 255, 0.1);
227
+ border: 1px solid rgba(100, 200, 255, 0.2);
228
+ border-radius: 6px;
229
+ font-family: var(--font-mono);
230
+ font-size: 12px;
231
+ color: rgba(200, 220, 255, 0.8);
298
232
  }
299
233
 
300
- .step-name {
301
- font-size: 13px;
302
- font-weight: 500;
303
- color: var(--text);
234
+ .attachment-chip-remove {
235
+ background: none;
236
+ border: none;
237
+ color: rgba(200, 220, 255, 0.5);
238
+ cursor: pointer;
239
+ font-size: 14px;
240
+ padding: 0 2px;
241
+ line-height: 1;
304
242
  }
305
243
 
306
- .timeline-step.active .step-name {
307
- color: var(--text-bright);
244
+ .attachment-chip-remove:hover {
245
+ color: var(--accent-red);
308
246
  }
309
247
 
310
- .timeline-step.pending .step-name {
311
- color: var(--text-dim);
248
+ /* Chat messages */
249
+ .chat-msg {
250
+ max-width: 90%;
251
+ animation: chatFadeIn 0.3s ease;
312
252
  }
313
253
 
314
- /* Phase duration badge (completed phases) */
315
- .phase-duration {
316
- font-family: var(--font-mono);
317
- font-size: 11px;
318
- font-weight: 500;
319
- color: var(--accent-green);
320
- background: rgba(34, 197, 94, 0.1);
321
- padding: 1px 8px;
322
- border-radius: 10px;
323
- border: 1px solid rgba(34, 197, 94, 0.15);
324
- white-space: nowrap;
325
- flex-shrink: 0;
254
+ .chat-msg-architect {
255
+ align-self: flex-start;
326
256
  }
327
257
 
328
- /* Live elapsed counter (active phase) */
329
- .phase-elapsed-live {
330
- font-family: var(--font-mono);
331
- font-size: 11px;
332
- font-weight: 500;
333
- color: var(--accent-cyan);
334
- background: rgba(6, 182, 212, 0.1);
335
- padding: 1px 8px;
336
- border-radius: 10px;
337
- border: 1px solid rgba(6, 182, 212, 0.15);
338
- white-space: nowrap;
339
- flex-shrink: 0;
340
- animation: pulse-elapsed 2s ease-in-out infinite;
258
+ .chat-msg-user {
259
+ align-self: flex-end;
341
260
  }
342
261
 
343
- @keyframes pulse-elapsed {
344
- 0%, 100% { opacity: 0.8; }
345
- 50% { opacity: 1; }
262
+ .chat-msg-text {
263
+ padding: 10px 14px;
264
+ border-radius: 12px;
265
+ font-size: 14px;
266
+ line-height: 1.5;
346
267
  }
347
268
 
348
- /* Heartbeat indicator (shows during silence) */
349
- .heartbeat-indicator {
350
- display: flex;
351
- align-items: center;
352
- gap: 6px;
353
- font-family: var(--font-mono);
354
- font-size: 10px;
355
- color: var(--text-dim);
356
- padding: 4px 0;
357
- opacity: 0;
358
- transition: opacity 0.5s ease;
359
- height: 0;
360
- overflow: hidden;
269
+ .chat-msg-architect .chat-msg-text {
270
+ background: rgba(100, 200, 255, 0.1);
271
+ color: rgba(200, 220, 255, 0.9);
272
+ border-bottom-left-radius: 4px;
361
273
  }
362
274
 
363
- .heartbeat-indicator.visible {
364
- opacity: 1;
365
- height: auto;
275
+ .chat-msg-user .chat-msg-text {
276
+ background: rgba(100, 200, 255, 0.2);
277
+ color: rgba(220, 240, 255, 0.95);
278
+ border-bottom-right-radius: 4px;
366
279
  }
367
280
 
368
- .heartbeat-dot {
369
- display: inline-block;
370
- width: 6px;
371
- height: 6px;
372
- border-radius: 50%;
373
- background: var(--accent-cyan);
374
- animation: heartbeat-pulse 1.2s ease-in-out infinite;
281
+ @keyframes chatFadeIn {
282
+ from { opacity: 0; transform: translateY(8px); }
283
+ to { opacity: 1; transform: translateY(0); }
375
284
  }
376
285
 
377
- @keyframes heartbeat-pulse {
378
- 0%, 100% { transform: scale(1); opacity: 0.4; }
379
- 25% { transform: scale(1.6); opacity: 1; }
380
- 35% { transform: scale(0.9); opacity: 0.6; }
381
- 45% { transform: scale(1.3); opacity: 0.9; }
382
- 55% { transform: scale(1); opacity: 0.4; }
286
+ /* Chat cards (inline decision cards) */
287
+ .chat-cards {
288
+ margin-top: 8px;
289
+ display: flex;
290
+ flex-direction: column;
291
+ gap: 8px;
383
292
  }
384
293
 
385
- .step-details {
386
- margin-top: 8px;
387
- max-height: 0;
388
- overflow: hidden;
389
- transition: max-height 0.4s ease;
294
+ .chat-card {
295
+ background: rgba(20, 20, 35, 0.8);
296
+ border: 1px solid rgba(100, 200, 255, 0.15);
297
+ border-radius: 10px;
298
+ padding: 12px;
390
299
  }
391
300
 
392
- .timeline-step.active .step-details,
393
- .timeline-step.completed .step-details {
394
- max-height: 500px;
301
+ .chat-card-header {
302
+ font-size: 12px;
303
+ text-transform: uppercase;
304
+ letter-spacing: 0.05em;
305
+ color: rgba(100, 200, 255, 0.6);
306
+ margin-bottom: 4px;
395
307
  }
396
308
 
397
- .step-task {
309
+ .chat-card-question {
310
+ font-size: 13px;
311
+ color: rgba(200, 220, 255, 0.8);
312
+ margin-bottom: 8px;
313
+ }
314
+
315
+ .chat-card-options {
398
316
  display: flex;
399
- align-items: center;
400
- gap: 8px;
401
- padding: 4px 0;
402
- font-size: 11px;
403
- color: var(--text-dim);
317
+ flex-direction: column;
318
+ gap: 4px;
404
319
  }
405
320
 
406
- .step-task .agent-badge {
407
- background: rgba(6, 182, 212, 0.15);
408
- color: var(--accent-cyan);
409
- padding: 1px 6px;
410
- border-radius: 4px;
411
- font-family: var(--font-mono);
412
- font-size: 10px;
321
+ .chat-card-option {
322
+ padding: 8px 12px;
323
+ border: 1px solid rgba(100, 200, 255, 0.1);
324
+ border-radius: 6px;
325
+ cursor: pointer;
326
+ transition: all 0.2s;
413
327
  }
414
328
 
415
- .verification-item {
416
- display: flex;
417
- align-items: flex-start;
418
- gap: 6px;
419
- padding: 3px 0;
420
- font-size: 11px;
421
- font-family: var(--font-mono);
329
+ .chat-card-option:hover {
330
+ background: rgba(100, 200, 255, 0.08);
331
+ border-color: rgba(100, 200, 255, 0.25);
422
332
  }
423
333
 
424
- .verification-item.pass {
425
- color: var(--accent-green);
334
+ .chat-card-option.selected {
335
+ background: rgba(100, 200, 255, 0.15);
336
+ border-color: rgba(100, 200, 255, 0.4);
426
337
  }
427
338
 
428
- .verification-item.fail {
429
- color: var(--accent-red);
339
+ .chat-card-option-label {
340
+ font-size: 13px;
341
+ color: rgba(200, 220, 255, 0.9);
342
+ font-weight: 500;
430
343
  }
431
344
 
432
- .verification-item .method-badge {
433
- font-size: 9px;
434
- padding: 0 4px;
435
- border-radius: 3px;
436
- background: rgba(255, 255, 255, 0.06);
437
- color: var(--text-dim);
345
+ .chat-card-option-desc {
346
+ font-size: 11px;
347
+ color: rgba(200, 220, 255, 0.5);
348
+ margin-top: 2px;
438
349
  }
439
350
 
440
- /* === Code Panel === */
441
- #code-tabs {
442
- display: flex;
443
- gap: 0;
444
- border-bottom: 1px solid var(--border);
445
- background: rgba(10, 10, 20, 0.5);
446
- overflow-x: auto;
447
- flex-shrink: 0;
351
+ /* Ready state */
352
+ .chat-ready-summary {
353
+ margin-top: 8px;
354
+ padding: 8px 12px;
355
+ background: rgba(80, 200, 120, 0.1);
356
+ border: 1px solid rgba(80, 200, 120, 0.2);
357
+ border-radius: 8px;
358
+ font-size: 13px;
359
+ color: rgba(80, 200, 120, 0.9);
448
360
  }
449
361
 
450
- .code-tab {
451
- padding: 8px 16px;
452
- font-family: var(--font-mono);
453
- font-size: 11px;
454
- color: var(--text-dim);
455
- border: none;
456
- background: none;
362
+ .chat-build-btn {
363
+ margin-top: 10px;
364
+ width: 100%;
365
+ padding: 12px;
366
+ background: rgba(80, 200, 120, 0.2);
367
+ border: 1px solid rgba(80, 200, 120, 0.4);
368
+ border-radius: 8px;
369
+ color: rgba(80, 200, 120, 0.95);
370
+ font-size: 15px;
371
+ font-weight: 600;
457
372
  cursor: pointer;
458
- border-bottom: 2px solid transparent;
459
- transition: color 0.2s, border-color 0.2s;
460
- white-space: nowrap;
373
+ transition: all 0.2s;
461
374
  }
462
375
 
463
- .code-tab:hover {
464
- color: var(--text);
376
+ .chat-build-btn:hover {
377
+ background: rgba(80, 200, 120, 0.3);
465
378
  }
466
379
 
467
- .code-tab.active {
468
- color: var(--accent-cyan);
469
- border-bottom-color: var(--accent-cyan);
380
+ /* === Preview Panel (Right 60%) === */
381
+ #preview-panel {
382
+ grid-column: 2;
383
+ grid-row: 2;
384
+ position: relative;
385
+ background: #111;
386
+ overflow: hidden;
470
387
  }
471
388
 
472
- #code-content {
473
- padding: 12px 16px;
474
- font-family: var(--font-mono);
475
- font-size: 12px;
476
- line-height: 1.6;
477
- overflow-y: auto;
478
- height: calc(100% - 36px);
479
- white-space: pre;
480
- color: var(--text);
389
+ #preview-iframe {
390
+ width: 100%;
391
+ height: 100%;
392
+ border: none;
393
+ background: #000;
481
394
  }
482
395
 
483
- /* Syntax highlighting */
484
- .code-content .keyword { color: #c678dd; }
485
- .code-content .string { color: #98c379; }
486
- .code-content .comment { color: #5c6370; font-style: italic; }
487
- .code-content .number { color: #d19a66; }
488
- .code-content .function { color: #61afef; }
489
- .code-content .type { color: #e5c07b; }
490
- .code-content .operator { color: #56b6c2; }
491
- .code-content .punctuation { color: #abb2bf; }
492
-
493
- /* === Plan Overlay === */
494
- #plan-overlay {
495
- position: fixed;
396
+ /* Preview overlay — shown over iframe during non-building states */
397
+ #preview-overlay {
398
+ position: absolute;
496
399
  top: 0;
497
400
  left: 0;
498
401
  width: 100%;
499
402
  height: 100%;
500
403
  display: flex;
404
+ flex-direction: column;
501
405
  align-items: center;
502
406
  justify-content: center;
503
- z-index: 100;
504
- pointer-events: none;
505
- opacity: 0;
407
+ background: rgba(10, 10, 15, 0.95);
408
+ z-index: 5;
506
409
  transition: opacity 0.5s ease;
507
410
  }
508
411
 
509
- #plan-overlay.visible {
510
- opacity: 1;
511
- pointer-events: auto;
412
+ /* Hide overlay when building or done — let iframe show through */
413
+ #preview-panel.live #preview-overlay {
414
+ opacity: 0;
415
+ pointer-events: none;
512
416
  }
513
417
 
514
- .plan-card {
515
- background: rgba(10, 10, 30, 0.95);
516
- border: 1px solid rgba(6, 182, 212, 0.3);
517
- border-radius: 16px;
518
- padding: 32px 40px;
519
- max-width: 520px;
520
- width: 90%;
521
- backdrop-filter: blur(20px);
522
- box-shadow: 0 0 60px rgba(6, 182, 212, 0.15), 0 0 120px rgba(6, 182, 212, 0.05);
523
- animation: plan-enter 0.4s ease-out;
418
+ #preview-status {
419
+ font-family: var(--font-mono);
420
+ font-size: 14px;
421
+ color: var(--text-dim);
422
+ text-align: center;
423
+ max-width: 300px;
424
+ line-height: 1.6;
524
425
  }
525
426
 
526
- @keyframes plan-enter {
527
- from { transform: scale(0.9); opacity: 0; }
528
- to { transform: scale(1); opacity: 1; }
427
+ /* State-specific status styling */
428
+ #preview-status[data-state="cold"] {
429
+ color: var(--text-dim);
529
430
  }
530
431
 
531
- .plan-header {
532
- font-size: 18px;
533
- font-weight: 600;
534
- color: var(--text-bright);
535
- margin-bottom: 16px;
536
- letter-spacing: 0.5px;
432
+ #preview-status[data-state="cold"]::before {
433
+ content: '';
434
+ display: block;
435
+ width: 24px;
436
+ height: 24px;
437
+ margin: 0 auto 12px;
438
+ border: 2px solid var(--text-dim);
439
+ border-top-color: var(--accent-cyan);
440
+ border-radius: 50%;
441
+ animation: spin 1s linear infinite;
537
442
  }
538
443
 
539
- .plan-meta {
540
- display: flex;
541
- flex-wrap: wrap;
542
- gap: 12px;
543
- margin-bottom: 20px;
444
+ #preview-status[data-state="warm"] {
445
+ color: var(--accent-cyan);
544
446
  }
545
447
 
546
- .plan-meta span {
547
- font-family: var(--font-mono);
548
- font-size: 12px;
448
+ #preview-status[data-state="building"] {
449
+ color: var(--accent-amber);
450
+ }
451
+
452
+ #preview-status[data-state="verifying"] {
549
453
  color: var(--accent-cyan);
550
- background: rgba(6, 182, 212, 0.1);
551
- padding: 4px 10px;
552
- border-radius: 6px;
553
- border: 1px solid rgba(6, 182, 212, 0.15);
554
454
  }
555
455
 
556
- .plan-features {
557
- display: flex;
558
- flex-direction: column;
559
- gap: 8px;
560
- margin-bottom: 16px;
456
+ #preview-status[data-state="done"] {
457
+ color: var(--accent-green);
561
458
  }
562
459
 
563
- .plan-feature {
564
- display: flex;
565
- justify-content: space-between;
566
- align-items: center;
567
- padding: 8px 12px;
568
- background: rgba(255, 255, 255, 0.03);
569
- border-radius: 8px;
570
- border: 1px solid var(--border);
460
+ @keyframes spin {
461
+ to { transform: rotate(360deg); }
571
462
  }
572
463
 
573
- .plan-feature-name {
464
+ /* Download button (shown in DONE state) */
465
+ .preview-download-btn {
466
+ position: absolute;
467
+ bottom: 16px;
468
+ right: 16px;
469
+ background: rgba(34, 197, 94, 0.2);
470
+ border: 1px solid rgba(34, 197, 94, 0.4);
471
+ border-radius: 8px;
472
+ padding: 10px 20px;
473
+ color: var(--accent-green);
474
+ font-family: var(--font-sans);
574
475
  font-size: 13px;
575
- font-weight: 500;
576
- color: var(--text);
476
+ font-weight: 600;
477
+ cursor: pointer;
478
+ z-index: 10;
479
+ transition: all 0.2s;
480
+ }
481
+
482
+ .preview-download-btn:hover {
483
+ background: rgba(34, 197, 94, 0.3);
577
484
  }
578
485
 
579
- .plan-feature-meta {
486
+ /* === Status Bar (Bottom) === */
487
+ #status-bar {
488
+ grid-column: 1 / -1;
489
+ grid-row: 3;
490
+ display: flex;
491
+ align-items: center;
492
+ gap: 24px;
493
+ padding: 0 20px;
494
+ background: rgba(10, 10, 15, 0.95);
495
+ border-top: 1px solid var(--border);
580
496
  font-family: var(--font-mono);
581
- font-size: 10px;
497
+ font-size: 12px;
582
498
  color: var(--text-dim);
583
499
  }
584
500
 
585
- .plan-warnings {
586
- margin-bottom: 12px;
501
+ #status-bar span {
502
+ white-space: nowrap;
503
+ }
504
+
505
+ #status-phase {
506
+ color: var(--accent-cyan);
587
507
  }
588
508
 
589
- .plan-warning {
509
+ /* === Activity Feed (build progress in chat panel) === */
510
+ .activity-separator {
511
+ display: flex;
512
+ align-items: center;
513
+ gap: 8px;
514
+ margin: 12px 0 8px;
515
+ font-family: var(--font-mono);
590
516
  font-size: 11px;
591
- color: var(--accent-amber);
592
- padding: 4px 0;
517
+ color: var(--text-dim);
518
+ text-transform: uppercase;
519
+ letter-spacing: 0.05em;
593
520
  }
594
521
 
595
- .plan-warning::before {
596
- content: '\26a0\fe0f ';
522
+ .activity-separator::before,
523
+ .activity-separator::after {
524
+ content: '';
525
+ flex: 1;
526
+ height: 1px;
527
+ background: var(--border);
597
528
  }
598
529
 
599
- .plan-auto {
530
+ .activity-item {
531
+ display: flex;
532
+ align-items: baseline;
533
+ gap: 8px;
534
+ padding: 3px 8px;
535
+ font-family: var(--font-mono);
600
536
  font-size: 12px;
537
+ line-height: 1.6;
601
538
  color: var(--text-dim);
539
+ animation: activityFadeIn 0.2s ease;
540
+ }
541
+
542
+ @keyframes activityFadeIn {
543
+ from { opacity: 0; transform: translateX(-4px); }
544
+ to { opacity: 1; transform: translateX(0); }
545
+ }
546
+
547
+ .activity-icon {
548
+ flex-shrink: 0;
549
+ width: 14px;
602
550
  text-align: center;
603
- margin-top: 12px;
604
- animation: pulse-text 1.5s ease-in-out infinite;
605
551
  }
606
552
 
607
- @keyframes pulse-text {
608
- 0%, 100% { opacity: 0.5; }
609
- 50% { opacity: 1; }
553
+ .activity-text {
554
+ word-break: break-all;
555
+ }
556
+
557
+ /* Activity item types */
558
+ .activity-phase {
559
+ color: var(--accent-cyan);
560
+ }
561
+
562
+ .activity-file {
563
+ color: var(--accent-green);
564
+ }
565
+
566
+ .activity-file .activity-icon {
567
+ color: #4ade80;
568
+ }
569
+
570
+ .activity-success {
571
+ color: var(--accent-green);
572
+ }
573
+
574
+ .activity-warn {
575
+ color: var(--accent-amber);
576
+ }
577
+
578
+ .activity-error {
579
+ color: var(--accent-red);
610
580
  }
611
581
 
612
582
  /* === Completion Overlay === */
@@ -623,6 +593,7 @@ html, body {
623
593
  pointer-events: none;
624
594
  opacity: 0;
625
595
  transition: opacity 0.5s ease;
596
+ background: rgba(0, 0, 0, 0.7);
626
597
  }
627
598
 
628
599
  #completion-overlay.visible {
@@ -631,551 +602,239 @@ html, body {
631
602
  }
632
603
 
633
604
  .completion-card {
634
- background: rgba(10, 10, 30, 0.95);
605
+ position: relative;
606
+ background: rgba(10, 10, 30, 0.98);
635
607
  border: 1px solid rgba(34, 197, 94, 0.3);
636
608
  border-radius: 16px;
637
- padding: 40px 48px;
638
- max-width: 440px;
609
+ padding: 32px 40px;
610
+ max-width: 460px;
639
611
  width: 90%;
640
- backdrop-filter: blur(20px);
641
- box-shadow: 0 0 60px rgba(34, 197, 94, 0.15), 0 0 120px rgba(34, 197, 94, 0.05);
642
- animation: plan-enter 0.4s ease-out;
643
612
  text-align: center;
613
+ backdrop-filter: blur(20px);
614
+ box-shadow: 0 0 60px rgba(34, 197, 94, 0.1);
644
615
  }
645
616
 
646
- .completion-icon {
647
- font-size: 48px;
648
- margin-bottom: 12px;
617
+ .completion-close-btn {
618
+ position: absolute;
619
+ top: 12px;
620
+ right: 16px;
621
+ background: none;
622
+ border: none;
623
+ color: var(--text-dim);
624
+ font-size: 24px;
625
+ cursor: pointer;
626
+ padding: 4px 8px;
649
627
  line-height: 1;
628
+ border-radius: 4px;
629
+ transition: color 0.2s, background 0.2s;
650
630
  }
651
631
 
652
- .completion-icon.success {
653
- color: var(--accent-green);
654
- text-shadow: 0 0 30px rgba(34, 197, 94, 0.5);
632
+ .completion-close-btn:hover {
633
+ color: var(--text-bright);
634
+ background: rgba(255, 255, 255, 0.1);
655
635
  }
656
636
 
657
- .completion-icon.partial {
658
- color: var(--accent-amber);
659
- text-shadow: 0 0 30px rgba(245, 158, 11, 0.5);
637
+ .completion-icon {
638
+ font-size: 48px;
639
+ margin-bottom: 12px;
660
640
  }
661
641
 
642
+ .completion-icon.success { color: var(--accent-green); }
643
+ .completion-icon.partial { color: var(--accent-amber); }
644
+
662
645
  .completion-header {
663
646
  font-size: 20px;
664
647
  font-weight: 600;
665
648
  color: var(--text-bright);
666
- margin-bottom: 4px;
667
- letter-spacing: 0.5px;
649
+ margin-bottom: 8px;
668
650
  }
669
651
 
670
652
  .completion-app-name {
671
- font-family: var(--font-mono);
672
653
  font-size: 14px;
673
- color: var(--accent-cyan);
674
- margin-bottom: 20px;
654
+ color: var(--text-dim);
655
+ margin-bottom: 16px;
675
656
  }
676
657
 
677
658
  .completion-metrics {
678
659
  display: flex;
679
660
  justify-content: center;
680
- gap: 16px;
661
+ flex-wrap: wrap;
662
+ gap: 12px;
681
663
  margin-bottom: 24px;
682
- }
683
-
684
- .completion-metrics span {
685
664
  font-family: var(--font-mono);
686
665
  font-size: 12px;
687
- color: var(--text-dim);
688
- background: rgba(255, 255, 255, 0.04);
689
- padding: 4px 10px;
690
- border-radius: 6px;
691
- border: 1px solid var(--border);
666
+ color: var(--accent-cyan);
692
667
  }
693
668
 
694
- .completion-launch-btn {
695
- display: block;
696
- width: 100%;
697
- padding: 14px 24px;
698
- background: linear-gradient(135deg, var(--accent-green), #16a34a);
699
- border: none;
700
- border-radius: 10px;
701
- color: #000;
702
- font-family: var(--font-sans);
703
- font-weight: 600;
704
- font-size: 15px;
705
- cursor: pointer;
706
- transition: transform 0.15s, opacity 0.2s, box-shadow 0.3s;
707
- margin-bottom: 12px;
708
- }
709
-
710
- .completion-launch-btn:hover {
711
- transform: scale(1.02);
712
- box-shadow: 0 0 20px rgba(34, 197, 94, 0.3);
713
- }
714
-
715
- .completion-launch-btn:disabled {
716
- opacity: 0.5;
717
- cursor: not-allowed;
718
- transform: none;
719
- }
720
-
721
- .completion-launch-btn.ready {
722
- background: linear-gradient(135deg, var(--accent-cyan), #0891b2);
723
- animation: glow-border 2s ease-in-out infinite;
724
- }
725
-
726
- .completion-status {
727
- font-family: var(--font-mono);
728
- font-size: 12px;
729
- color: var(--text-dim);
730
- min-height: 20px;
731
- }
732
-
733
- .launch-url {
734
- color: var(--accent-cyan);
735
- text-decoration: none;
736
- font-size: 14px;
737
- font-weight: 500;
738
- }
739
-
740
- .launch-url:hover {
741
- text-decoration: underline;
742
- text-shadow: 0 0 10px rgba(6, 182, 212, 0.5);
743
- }
744
-
745
- /* === Animations === */
746
- @keyframes pulse-dot {
747
- 0%, 100% { box-shadow: 0 0 8px var(--accent-cyan); }
748
- 50% { box-shadow: 0 0 20px var(--accent-cyan), 0 0 40px rgba(6, 182, 212, 0.3); }
749
- }
750
-
751
- @keyframes glow-border {
752
- 0%, 100% { border-color: rgba(6, 182, 212, 0.2); }
753
- 50% { border-color: rgba(6, 182, 212, 0.5); }
754
- }
755
-
756
- @keyframes typewriter-cursor {
757
- 0%, 100% { opacity: 1; }
758
- 50% { opacity: 0; }
759
- }
760
-
761
- .cursor-blink::after {
762
- content: '\2588';
763
- animation: typewriter-cursor 0.8s step-end infinite;
764
- color: var(--accent-cyan);
765
- }
766
-
767
- /* === Scrollbar === */
768
- ::-webkit-scrollbar {
769
- width: 6px;
770
- height: 6px;
771
- }
772
-
773
- ::-webkit-scrollbar-track {
774
- background: transparent;
775
- }
776
-
777
- ::-webkit-scrollbar-thumb {
778
- background: rgba(255, 255, 255, 0.1);
779
- border-radius: 3px;
780
- }
781
-
782
- ::-webkit-scrollbar-thumb:hover {
783
- background: rgba(255, 255, 255, 0.2);
784
- }
785
-
786
- /* === Question Cards (Plan Mode) === */
787
- .plan-questions-card {
788
- max-width: 560px;
789
- max-height: 85vh;
790
- overflow-y: auto;
791
- }
792
-
793
- .plan-questions-header {
794
- display: flex;
795
- align-items: center;
796
- justify-content: space-between;
797
- margin-bottom: 16px;
798
- }
799
-
800
- .plan-questions-header .plan-header {
801
- margin-bottom: 0;
802
- }
803
-
804
- .plan-round {
805
- font-family: var(--font-mono);
806
- font-size: 11px;
807
- color: var(--text-dim);
808
- background: rgba(255, 255, 255, 0.04);
809
- padding: 4px 10px;
810
- border-radius: 6px;
811
- border: 1px solid var(--border);
812
- }
813
-
814
- .confidence-meter {
815
- margin-bottom: 20px;
816
- }
817
-
818
- .confidence-bar {
819
- height: 4px;
820
- background: rgba(255, 255, 255, 0.1);
821
- border-radius: 2px;
822
- overflow: hidden;
823
- }
824
-
825
- .confidence-fill {
826
- height: 100%;
827
- background: linear-gradient(90deg, var(--accent-cyan), var(--accent-green));
828
- transition: width 0.5s ease;
829
- }
830
-
831
- .confidence-label {
832
- font-size: 0.75rem;
833
- color: var(--text-dim);
834
- margin-top: 6px;
835
- }
836
-
837
- .plan-questions {
669
+ .completion-actions {
838
670
  display: flex;
839
- flex-direction: column;
840
- gap: 20px;
841
- }
842
-
843
- .question-card {
844
- padding: 0;
845
- }
846
-
847
- .question-header {
848
- display: inline-block;
849
- background: rgba(6, 182, 212, 0.15);
850
- color: var(--accent-cyan);
851
- padding: 2px 8px;
852
- border-radius: 4px;
853
- font-size: 0.75rem;
854
- text-transform: uppercase;
855
- letter-spacing: 0.05em;
856
- margin-bottom: 8px;
857
- font-family: var(--font-mono);
858
- font-weight: 500;
859
- }
860
-
861
- .question-text {
862
- font-size: 0.95rem;
863
- color: var(--text-bright);
864
- font-weight: 500;
865
- margin-bottom: 6px;
866
- line-height: 1.4;
867
- }
868
-
869
- .select-hint {
870
- color: var(--text-dim);
871
- font-size: 0.75rem;
671
+ gap: 12px;
672
+ justify-content: center;
872
673
  margin-bottom: 8px;
873
- font-style: italic;
874
674
  }
875
675
 
876
- .question-options {
676
+ .completion-action-btn {
877
677
  display: flex;
878
- flex-direction: column;
678
+ align-items: center;
879
679
  gap: 6px;
880
- }
881
-
882
- .question-option {
883
- cursor: pointer;
884
- border: 1px solid rgba(255, 255, 255, 0.08);
680
+ padding: 10px 20px;
885
681
  border-radius: 8px;
886
- padding: 12px 16px;
887
- transition: all 0.2s ease;
888
- background: rgba(255, 255, 255, 0.02);
889
- }
890
-
891
- .question-option:hover {
892
- border-color: rgba(6, 182, 212, 0.3);
893
- background: rgba(6, 182, 212, 0.05);
682
+ font-family: var(--font-sans);
683
+ font-weight: 600;
684
+ font-size: 13px;
685
+ cursor: pointer;
686
+ transition: transform 0.15s, opacity 0.2s;
687
+ border: none;
894
688
  }
895
689
 
896
- .question-option.selected {
897
- border-color: var(--accent-cyan);
898
- background: rgba(6, 182, 212, 0.1);
899
- box-shadow: 0 0 12px rgba(6, 182, 212, 0.1);
690
+ .completion-action-btn:hover {
691
+ transform: scale(1.03);
900
692
  }
901
693
 
902
- .option-label {
903
- font-weight: 600;
904
- color: var(--text-bright);
905
- font-size: 0.95rem;
694
+ .completion-action-btn:disabled {
695
+ opacity: 0.4;
696
+ cursor: not-allowed;
697
+ transform: none;
906
698
  }
907
699
 
908
- .option-description {
909
- color: var(--text-dim);
910
- font-size: 0.8rem;
911
- margin-top: 2px;
912
- line-height: 1.4;
700
+ .completion-action-icon {
701
+ font-size: 16px;
913
702
  }
914
703
 
915
- .confirm-selections-btn {
916
- width: 100%;
917
- padding: 12px;
918
- background: linear-gradient(135deg, var(--accent-cyan), #0891b2);
704
+ .completion-download-btn {
705
+ background: linear-gradient(135deg, var(--accent-green), #16a34a);
919
706
  color: #000;
920
- border: none;
921
- border-radius: 8px;
922
- font-weight: 600;
923
- font-size: 1rem;
924
- font-family: var(--font-sans);
925
- cursor: pointer;
926
- margin-top: 20px;
927
- transition: all 0.2s;
928
707
  }
929
708
 
930
- .confirm-selections-btn:hover:not(:disabled) {
931
- transform: scale(1.01);
932
- box-shadow: 0 0 20px rgba(6, 182, 212, 0.3);
709
+ .completion-github-btn {
710
+ background: rgba(255, 255, 255, 0.1);
711
+ color: var(--text-bright);
712
+ border: 1px solid rgba(255, 255, 255, 0.2);
933
713
  }
934
714
 
935
- .confirm-selections-btn:disabled {
936
- opacity: 0.3;
937
- cursor: not-allowed;
938
- transform: none;
715
+ .completion-github-btn:hover {
716
+ background: rgba(255, 255, 255, 0.15);
939
717
  }
940
718
 
941
- .refining-state {
942
- text-align: center;
943
- padding: 32px;
719
+ .completion-status {
720
+ margin-top: 12px;
721
+ font-size: 12px;
944
722
  color: var(--text-dim);
945
- display: flex;
946
- flex-direction: column;
947
- align-items: center;
948
- gap: 16px;
949
- }
950
-
951
- .refining-spinner {
952
- width: 24px;
953
- height: 24px;
954
- border: 2px solid rgba(255, 255, 255, 0.1);
955
- border-top-color: var(--accent-cyan);
956
- border-radius: 50%;
957
- animation: spin 0.8s linear infinite;
958
723
  }
959
724
 
960
- @keyframes spin {
961
- to { transform: rotate(360deg); }
962
- }
963
-
964
- /* ── Chat Interface ── */
965
- .chat-container {
725
+ /* GitHub form inside completion modal */
726
+ .github-form {
727
+ text-align: left;
966
728
  display: flex;
967
729
  flex-direction: column;
968
- height: 100%;
969
- max-height: 80vh;
970
- background: rgba(10, 10, 15, 0.95);
971
- border: 1px solid rgba(100, 200, 255, 0.15);
972
- border-radius: 12px;
973
- overflow: hidden;
974
- max-width: 600px;
975
- margin: 5vh auto 0;
730
+ gap: 10px;
976
731
  }
977
732
 
978
- .chat-messages {
979
- flex: 1;
980
- overflow-y: auto;
981
- padding: 20px;
733
+ .github-form-row {
982
734
  display: flex;
983
- flex-direction: column;
735
+ align-items: center;
736
+ justify-content: space-between;
984
737
  gap: 12px;
985
738
  }
986
739
 
987
- .chat-msg {
988
- max-width: 85%;
989
- animation: chatFadeIn 0.3s ease;
990
- }
991
-
992
- .chat-msg-architect {
993
- align-self: flex-start;
994
- }
995
-
996
- .chat-msg-user {
997
- align-self: flex-end;
998
- }
999
-
1000
- .chat-msg-text {
1001
- padding: 10px 14px;
1002
- border-radius: 12px;
1003
- font-size: 14px;
1004
- line-height: 1.5;
1005
- }
1006
-
1007
- .chat-msg-architect .chat-msg-text {
1008
- background: rgba(100, 200, 255, 0.1);
1009
- color: rgba(200, 220, 255, 0.9);
1010
- border-bottom-left-radius: 4px;
1011
- }
1012
-
1013
- .chat-msg-user .chat-msg-text {
1014
- background: rgba(100, 200, 255, 0.2);
1015
- color: rgba(220, 240, 255, 0.95);
1016
- border-bottom-right-radius: 4px;
1017
- }
1018
-
1019
- .chat-input-bar {
1020
- display: flex;
1021
- gap: 8px;
1022
- padding: 12px 16px;
1023
- border-top: 1px solid rgba(100, 200, 255, 0.1);
1024
- background: rgba(5, 5, 10, 0.8);
740
+ .github-form-row label {
741
+ font-size: 12px;
742
+ color: var(--text-dim);
743
+ white-space: nowrap;
1025
744
  }
1026
745
 
1027
- .chat-input-bar input {
746
+ .github-form-row input[type="text"] {
1028
747
  flex: 1;
1029
- background: rgba(20, 20, 30, 0.8);
1030
- border: 1px solid rgba(100, 200, 255, 0.2);
1031
- border-radius: 8px;
1032
- padding: 10px 14px;
1033
- color: rgba(200, 220, 255, 0.9);
1034
- font-size: 14px;
748
+ background: rgba(20, 20, 40, 0.8);
749
+ border: 1px solid var(--border-glow);
750
+ border-radius: 6px;
751
+ padding: 8px 10px;
752
+ color: var(--text-bright);
753
+ font-family: var(--font-mono);
754
+ font-size: 13px;
1035
755
  outline: none;
1036
756
  }
1037
757
 
1038
- .chat-input-bar input:focus {
1039
- border-color: rgba(100, 200, 255, 0.4);
758
+ .github-form-row input[type="text"]:focus {
759
+ border-color: var(--accent-cyan);
1040
760
  }
1041
761
 
1042
- .chat-input-bar button {
1043
- background: rgba(100, 200, 255, 0.15);
1044
- border: 1px solid rgba(100, 200, 255, 0.3);
1045
- border-radius: 8px;
1046
- padding: 10px 20px;
1047
- color: rgba(100, 200, 255, 0.9);
762
+ .github-toggle {
763
+ display: flex;
764
+ align-items: center;
765
+ gap: 6px;
1048
766
  cursor: pointer;
1049
- font-size: 14px;
1050
- transition: all 0.2s;
1051
767
  }
1052
768
 
1053
- .chat-input-bar button:hover {
1054
- background: rgba(100, 200, 255, 0.25);
769
+ .github-toggle input[type="checkbox"] {
770
+ accent-color: var(--accent-cyan);
1055
771
  }
1056
772
 
1057
- /* Chat cards (inline) */
1058
- .chat-cards {
1059
- margin-top: 8px;
1060
- display: flex;
1061
- flex-direction: column;
1062
- gap: 8px;
1063
- }
1064
-
1065
- .chat-card {
1066
- background: rgba(20, 20, 35, 0.8);
1067
- border: 1px solid rgba(100, 200, 255, 0.15);
1068
- border-radius: 10px;
1069
- padding: 12px;
773
+ .github-user {
774
+ font-size: 11px;
775
+ color: var(--text-dim);
776
+ font-family: var(--font-mono);
1070
777
  }
1071
778
 
1072
- .chat-card-header {
779
+ .completion-github-push-btn {
780
+ background: linear-gradient(135deg, var(--accent-cyan), #0891b2);
781
+ color: #000;
782
+ padding: 8px 16px;
1073
783
  font-size: 12px;
1074
- text-transform: uppercase;
1075
- letter-spacing: 0.05em;
1076
- color: rgba(100, 200, 255, 0.6);
1077
- margin-bottom: 4px;
1078
784
  }
1079
785
 
1080
- .chat-card-question {
786
+ .github-success {
787
+ color: var(--accent-green);
1081
788
  font-size: 13px;
1082
- color: rgba(200, 220, 255, 0.8);
1083
- margin-bottom: 8px;
1084
- }
1085
-
1086
- .chat-card-options {
1087
- display: flex;
1088
- flex-direction: column;
1089
- gap: 4px;
1090
- }
1091
-
1092
- .chat-card-option {
1093
- padding: 8px 12px;
1094
- border: 1px solid rgba(100, 200, 255, 0.1);
1095
- border-radius: 6px;
1096
- cursor: pointer;
1097
- transition: all 0.2s;
1098
789
  }
1099
790
 
1100
- .chat-card-option:hover {
1101
- background: rgba(100, 200, 255, 0.08);
1102
- border-color: rgba(100, 200, 255, 0.25);
1103
- }
1104
-
1105
- .chat-card-option.selected {
1106
- background: rgba(100, 200, 255, 0.15);
1107
- border-color: rgba(100, 200, 255, 0.4);
1108
- }
1109
-
1110
- .chat-card-option-label {
1111
- font-size: 13px;
1112
- color: rgba(200, 220, 255, 0.9);
1113
- font-weight: 500;
791
+ .github-link {
792
+ color: var(--accent-cyan);
793
+ text-decoration: none;
1114
794
  }
1115
795
 
1116
- .chat-card-option-desc {
1117
- font-size: 11px;
1118
- color: rgba(200, 220, 255, 0.5);
1119
- margin-top: 2px;
796
+ .github-link:hover {
797
+ text-decoration: underline;
1120
798
  }
1121
799
 
1122
- /* Ready state */
1123
- .chat-ready-summary {
1124
- margin-top: 8px;
1125
- padding: 8px 12px;
1126
- background: rgba(80, 200, 120, 0.1);
1127
- border: 1px solid rgba(80, 200, 120, 0.2);
1128
- border-radius: 8px;
1129
- font-size: 13px;
1130
- color: rgba(80, 200, 120, 0.9);
800
+ .github-error {
801
+ color: var(--accent-red);
802
+ font-size: 12px;
1131
803
  }
1132
804
 
1133
- .chat-build-btn {
1134
- margin-top: 10px;
1135
- width: 100%;
1136
- padding: 12px;
1137
- background: rgba(80, 200, 120, 0.2);
1138
- border: 1px solid rgba(80, 200, 120, 0.4);
1139
- border-radius: 8px;
1140
- color: rgba(80, 200, 120, 0.95);
1141
- font-size: 15px;
1142
- font-weight: 600;
1143
- cursor: pointer;
1144
- transition: all 0.2s;
805
+ /* === Scrollbar === */
806
+ ::-webkit-scrollbar {
807
+ width: 6px;
808
+ height: 6px;
1145
809
  }
1146
810
 
1147
- .chat-build-btn:hover {
1148
- background: rgba(80, 200, 120, 0.3);
811
+ ::-webkit-scrollbar-track {
812
+ background: transparent;
1149
813
  }
1150
814
 
1151
- /* Hide header input bar during chat */
1152
- #header.chat-active #input-bar {
1153
- display: none;
815
+ ::-webkit-scrollbar-thumb {
816
+ background: rgba(255, 255, 255, 0.1);
817
+ border-radius: 3px;
1154
818
  }
1155
819
 
1156
- @keyframes chatFadeIn {
1157
- from { opacity: 0; transform: translateY(8px); }
1158
- to { opacity: 1; transform: translateY(0); }
820
+ ::-webkit-scrollbar-thumb:hover {
821
+ background: rgba(255, 255, 255, 0.2);
1159
822
  }
1160
823
 
1161
824
  /* === Responsive === */
1162
825
  @media (max-width: 900px) {
1163
826
  #app {
1164
827
  grid-template-columns: 1fr;
1165
- grid-template-rows: 60px 300px 1fr 200px;
828
+ grid-template-rows: 48px 1fr 50vh 36px;
1166
829
  }
1167
- #orb-container {
830
+ #chat-panel {
1168
831
  grid-column: 1;
1169
832
  grid-row: 2;
833
+ border-right: none;
834
+ border-bottom: 1px solid var(--border);
1170
835
  }
1171
- #timeline-panel {
836
+ #preview-panel {
1172
837
  grid-column: 1;
1173
838
  grid-row: 3;
1174
- border-left: none;
1175
- border-top: 1px solid var(--border);
1176
- }
1177
- #code-panel {
1178
- grid-column: 1;
1179
- grid-row: 4;
1180
839
  }
1181
840
  }