alexdatamed commited on
Commit
c452959
·
verified ·
1 Parent(s): 7e9a031

Upload 4 files

Browse files
Files changed (4) hide show
  1. ai-approaches-dashboard.zip +3 -0
  2. app.js +359 -0
  3. index.html +125 -19
  4. style.css +1367 -15
ai-approaches-dashboard.zip ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:5682454c351a186030eb7cb1740b1f6f6b767d80e9f6fb73501b06bd8a98c3ea
3
+ size 9827
app.js ADDED
@@ -0,0 +1,359 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // AI Dashboard Application
2
+ class AIDashboard {
3
+ constructor() {
4
+ this.data = {
5
+ "approaches": [
6
+ {
7
+ "name": "LLM Workflow",
8
+ "functionality": "Прогнозування наступного токена",
9
+ "bestCase": "Генерація тексту, саммаризація",
10
+ "strengths": "Швидкість, простота, легкість впровадження",
11
+ "weaknesses": "Обмежений контекст, відсутність зовнішніх знань",
12
+ "examples": "Чат-боти, email-генерація",
13
+ "workflow": "Користувач → Тригер на основі правил → LLM → Вихід",
14
+ "description": "Найпростіший підхід, що використовує LLM для генерації тексту на основі промпту користувача",
15
+ "complexity": "Низька",
16
+ "icon": "🔗"
17
+ },
18
+ {
19
+ "name": "RAG",
20
+ "functionality": "Розумний пошук знань",
21
+ "bestCase": "Точні Q&A з різних джерел",
22
+ "strengths": "Точність завдяки зовнішнім даним",
23
+ "weaknesses": "Чутливість до якості даних",
24
+ "examples": "Graph RAG, Advanced RAG, Modular RAG",
25
+ "workflow": "Користувач → Векторизація → Пошук у базі → LLM (збагачений даними) → Вихід",
26
+ "description": "Покращений підхід, що додає зовнішні знання до процесу генерації відповідей",
27
+ "complexity": "Середня",
28
+ "icon": "🔍"
29
+ },
30
+ {
31
+ "name": "AI Agent",
32
+ "functionality": "Автономні дії з використанням компонентів",
33
+ "bestCase": "Воркфлоу з інструментами та міркуванням",
34
+ "strengths": "Планування + міркування, виконання складних задач",
35
+ "weaknesses": "Потребує чітких цілей та доступу до інструментів",
36
+ "examples": "ReACT Agent, Rewoo Agent",
37
+ "workflow": "Користувач → Системний промпт → Планування → База даних/Пам'ять/Інструменти → Вихід",
38
+ "description": "Автономний агент, здатний планувати та виконувати складні задачі з використанням інструментів",
39
+ "complexity": "Висока",
40
+ "icon": "🤖"
41
+ },
42
+ {
43
+ "name": "Agentic AI",
44
+ "functionality": "Мультиагентна автономна система",
45
+ "bestCase": "Масштабні задачі, що потребують розподілу ролей",
46
+ "strengths": "Гнучкість, розподіл задач між агентами",
47
+ "weaknesses": "Складність розробки та контролю",
48
+ "examples": "CUA, Embodied Agents",
49
+ "workflow": "Користувач → Пам'ять/Міркування/Зворотний зв'язок → Кілька агентів → Інструменти/Дані → Вихід",
50
+ "description": "Найскладніша система з кількома агентами, що працюють разом для вирішення масштабних задач",
51
+ "complexity": "Дуже висока",
52
+ "icon": "🌐"
53
+ }
54
+ ],
55
+ "criteria": [
56
+ "Функціональність",
57
+ "Найкращий кейс",
58
+ "Сильні сторони",
59
+ "Слабкі сторони",
60
+ "Приклади"
61
+ ],
62
+ "complexityLevels": ["Низька", "Середня", "Висока", "Дуже висока"],
63
+ "recommendations": [
64
+ {
65
+ "scenario": "Прості задачі генерації тексту",
66
+ "recommendation": "LLM Workflow",
67
+ "reason": "Найпростіший у впровадженні та налаштуванні"
68
+ },
69
+ {
70
+ "scenario": "Потре��а в точних відповідях з великої бази знань",
71
+ "recommendation": "RAG",
72
+ "reason": "Забезпечує високу точність завдяки зовнішнім даним"
73
+ },
74
+ {
75
+ "scenario": "Складні задачі з використанням інструментів",
76
+ "recommendation": "AI Agent",
77
+ "reason": "Може планувати та виконувати багатоетапні процеси"
78
+ },
79
+ {
80
+ "scenario": "Масштабні проекти з розподіленими ролями",
81
+ "recommendation": "Agentic AI",
82
+ "reason": "Найгнучкіший для складних багатоагентних систем"
83
+ }
84
+ ]
85
+ };
86
+
87
+ this.currentFilters = {
88
+ approach: '',
89
+ complexity: '',
90
+ criteria: ''
91
+ };
92
+
93
+ this.init();
94
+ }
95
+
96
+ init() {
97
+ this.setupEventListeners();
98
+ this.renderComparisonTable();
99
+ this.renderWorkflows();
100
+ this.renderDetails();
101
+ this.renderRecommendations();
102
+ }
103
+
104
+ setupEventListeners() {
105
+ // Filter event listeners
106
+ document.getElementById('approach-filter').addEventListener('change', (e) => {
107
+ this.currentFilters.approach = e.target.value;
108
+ this.applyFilters();
109
+ });
110
+
111
+ document.getElementById('complexity-filter').addEventListener('change', (e) => {
112
+ this.currentFilters.complexity = e.target.value;
113
+ this.applyFilters();
114
+ });
115
+
116
+ document.getElementById('criteria-filter').addEventListener('change', (e) => {
117
+ this.currentFilters.criteria = e.target.value;
118
+ this.applyFilters();
119
+ });
120
+
121
+ // Reset filters button
122
+ document.getElementById('reset-filters').addEventListener('click', () => {
123
+ this.resetFilters();
124
+ });
125
+ }
126
+
127
+ applyFilters() {
128
+ this.renderComparisonTable();
129
+ this.renderWorkflows();
130
+ this.renderDetails();
131
+ }
132
+
133
+ resetFilters() {
134
+ this.currentFilters = {
135
+ approach: '',
136
+ complexity: '',
137
+ criteria: ''
138
+ };
139
+
140
+ // Reset select elements
141
+ document.getElementById('approach-filter').value = '';
142
+ document.getElementById('complexity-filter').value = '';
143
+ document.getElementById('criteria-filter').value = '';
144
+
145
+ this.applyFilters();
146
+ }
147
+
148
+ getFilteredApproaches() {
149
+ return this.data.approaches.filter(approach => {
150
+ const matchesApproach = !this.currentFilters.approach ||
151
+ approach.name === this.currentFilters.approach;
152
+ const matchesComplexity = !this.currentFilters.complexity ||
153
+ approach.complexity === this.currentFilters.complexity;
154
+
155
+ return matchesApproach && matchesComplexity;
156
+ });
157
+ }
158
+
159
+ renderComparisonTable() {
160
+ const tableBody = document.getElementById('comparison-table-body');
161
+ const filteredApproaches = this.getFilteredApproaches();
162
+
163
+ tableBody.innerHTML = filteredApproaches.map(approach => `
164
+ <tr class="fade-in">
165
+ <td>
166
+ <div class="approach-name">
167
+ <span class="approach-icon">${approach.icon}</span>
168
+ <strong>${approach.name}</strong>
169
+ </div>
170
+ </td>
171
+ <td>${approach.functionality}</td>
172
+ <td>${approach.bestCase}</td>
173
+ <td>${approach.strengths}</td>
174
+ <td>${approach.weaknesses}</td>
175
+ <td>
176
+ <span class="complexity-badge ${this.getComplexityClass(approach.complexity)}">
177
+ ${approach.complexity}
178
+ </span>
179
+ </td>
180
+ </tr>
181
+ `).join('');
182
+ }
183
+
184
+ getComplexityClass(complexity) {
185
+ const classMap = {
186
+ 'Низька': 'complexity-low',
187
+ 'Середня': 'complexity-medium',
188
+ 'Висока': 'complexity-high',
189
+ 'Дуже висока': 'complexity-very-high'
190
+ };
191
+ return classMap[complexity] || 'complexity-low';
192
+ }
193
+
194
+ getApproachClass(name) {
195
+ const classMap = {
196
+ 'LLM Workflow': 'llm-workflow',
197
+ 'RAG': 'rag',
198
+ 'AI Agent': 'ai-agent',
199
+ 'Agentic AI': 'agentic-ai'
200
+ };
201
+ return classMap[name] || 'llm-workflow';
202
+ }
203
+
204
+ renderWorkflows() {
205
+ const workflowsGrid = document.getElementById('workflows-grid');
206
+ const filteredApproaches = this.getFilteredApproaches();
207
+
208
+ workflowsGrid.innerHTML = filteredApproaches.map(approach => {
209
+ const steps = approach.workflow.split(' → ');
210
+ const stepsHtml = steps.map((step, index) => {
211
+ const isLast = index === steps.length - 1;
212
+ return `
213
+ <div class="workflow-step">${step}</div>
214
+ ${!isLast ? '<div class="workflow-arrow">→</div>' : ''}
215
+ `;
216
+ }).join('');
217
+
218
+ return `
219
+ <div class="workflow-card fade-in">
220
+ <div class="workflow-header ${this.getApproachClass(approach.name)}">
221
+ <span class="approach-icon">${approach.icon}</span>
222
+ <h4>${approach.name}</h4>
223
+ </div>
224
+ <div class="workflow-body">
225
+ <div class="workflow-steps">
226
+ ${stepsHtml}
227
+ </div>
228
+ </div>
229
+ </div>
230
+ `;
231
+ }).join('');
232
+ }
233
+
234
+ renderDetails() {
235
+ const detailsGrid = document.getElementById('details-grid');
236
+ const filteredApproaches = this.getFilteredApproaches();
237
+
238
+ detailsGrid.innerHTML = filteredApproaches.map(approach => `
239
+ <div class="detail-card fade-in">
240
+ <div class="detail-header ${this.getApproachClass(approach.name)}">
241
+ <span class="approach-icon">${approach.icon}</span>
242
+ <h4>${approach.name}</h4>
243
+ </div>
244
+ <div class="detail-body">
245
+ <div class="detail-section">
246
+ <h5>Опис</h5>
247
+ <p>${approach.description}</p>
248
+ </div>
249
+
250
+ <div class="detail-section">
251
+ <h5>Функціональність</h5>
252
+ <p>${approach.functionality}</p>
253
+ </div>
254
+
255
+ <div class="detail-section">
256
+ <h5>Найкращий кейс</h5>
257
+ <p>${approach.bestCase}</p>
258
+ </div>
259
+
260
+ <div class="detail-section">
261
+ <h5>Сильні сторони</h5>
262
+ <p>${approach.strengths}</p>
263
+ </div>
264
+
265
+ <div class="detail-section">
266
+ <h5>Слабкі сторони</h5>
267
+ <p>${approach.weaknesses}</p>
268
+ </div>
269
+
270
+ <div class="detail-section">
271
+ <h5>Приклади</h5>
272
+ <p>${approach.examples}</p>
273
+ </div>
274
+
275
+ <div class="detail-section">
276
+ <h5>Складність</h5>
277
+ <span class="complexity-badge ${this.getComplexityClass(approach.complexity)}">
278
+ ${approach.complexity}
279
+ </span>
280
+ </div>
281
+ </div>
282
+ </div>
283
+ `).join('');
284
+ }
285
+
286
+ renderRecommendations() {
287
+ const recommendationsGrid = document.getElementById('recommendations-grid');
288
+
289
+ recommendationsGrid.innerHTML = this.data.recommendations.map(rec => {
290
+ const approach = this.data.approaches.find(a => a.name === rec.recommendation);
291
+ const approachIcon = approach ? approach.icon : '💡';
292
+
293
+ return `
294
+ <div class="recommendation-card fade-in">
295
+ <div class="recommendation-scenario">
296
+ <strong>Сценарій:</strong> ${rec.scenario}
297
+ </div>
298
+ <div class="recommendation-approach">
299
+ ${approachIcon} ${rec.recommendation}
300
+ </div>
301
+ <div class="recommendation-reason">
302
+ <strong>Причина:</strong> ${rec.reason}
303
+ </div>
304
+ </div>
305
+ `;
306
+ }).join('');
307
+ }
308
+ }
309
+
310
+ // Initialize the dashboard when the DOM is loaded
311
+ document.addEventListener('DOMContentLoaded', () => {
312
+ new AIDashboard();
313
+
314
+ // Add smooth scrolling for anchor links
315
+ document.querySelectorAll('a[href^="#"]').forEach(anchor => {
316
+ anchor.addEventListener('click', function (e) {
317
+ e.preventDefault();
318
+ const target = document.querySelector(this.getAttribute('href'));
319
+ if (target) {
320
+ target.scrollIntoView({
321
+ behavior: 'smooth',
322
+ block: 'start'
323
+ });
324
+ }
325
+ });
326
+ });
327
+
328
+ // Add intersection observer for fade-in animations
329
+ const observerOptions = {
330
+ threshold: 0.1,
331
+ rootMargin: '0px 0px -50px 0px'
332
+ };
333
+
334
+ const observer = new IntersectionObserver((entries) => {
335
+ entries.forEach(entry => {
336
+ if (entry.isIntersecting) {
337
+ entry.target.classList.add('fade-in');
338
+ observer.unobserve(entry.target);
339
+ }
340
+ });
341
+ }, observerOptions);
342
+
343
+ // Observe all cards for animation
344
+ const observeCards = () => {
345
+ document.querySelectorAll('.card, .workflow-card, .detail-card, .recommendation-card').forEach(card => {
346
+ observer.observe(card);
347
+ });
348
+ };
349
+
350
+ // Initial observation
351
+ setTimeout(observeCards, 100);
352
+
353
+ // Re-observe after filter changes
354
+ const originalApplyFilters = AIDashboard.prototype.applyFilters;
355
+ AIDashboard.prototype.applyFilters = function() {
356
+ originalApplyFilters.call(this);
357
+ setTimeout(observeCards, 100);
358
+ };
359
+ });
index.html CHANGED
@@ -1,19 +1,125 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
19
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="uk">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>🤖 Дашборд підходів до побудови AI-систем</title>
7
+ <link rel="stylesheet" href="style.css">
8
+ </head>
9
+ <body>
10
+ <div class="container">
11
+ <header class="header">
12
+ <h1>🤖 Дашборд підходів до побудови AI-систем</h1>
13
+ <p>Порівняння та аналіз чотирьох основних підходів до створення штучного інтелекту</p>
14
+ </header>
15
+
16
+ <main class="main-content">
17
+ <!-- Фільтри -->
18
+ <div class="filters-section">
19
+ <div class="card">
20
+ <div class="card__body">
21
+ <h3>🔍 Фільтри</h3>
22
+ <div class="filters-grid">
23
+ <div class="form-group">
24
+ <label for="approach-filter" class="form-label">Підхід</label>
25
+ <select id="approach-filter" class="form-control">
26
+ <option value="">Усі підходи</option>
27
+ <option value="LLM Workflow">LLM Workflow</option>
28
+ <option value="RAG">RAG</option>
29
+ <option value="AI Agent">AI Agent</option>
30
+ <option value="Agentic AI">Agentic AI</option>
31
+ </select>
32
+ </div>
33
+ <div class="form-group">
34
+ <label for="complexity-filter" class="form-label">Складність</label>
35
+ <select id="complexity-filter" class="form-control">
36
+ <option value="">Усі рівні</option>
37
+ <option value="Низька">Низька</option>
38
+ <option value="Середня">Середня</option>
39
+ <option value="Висока">Висока</option>
40
+ <option value="Дуже висока">Дуже висока</option>
41
+ </select>
42
+ </div>
43
+ <div class="form-group">
44
+ <label for="criteria-filter" class="form-label">Критерій</label>
45
+ <select id="criteria-filter" class="form-control">
46
+ <option value="">Усі критерії</option>
47
+ <option value="Функціональність">Функціональність</option>
48
+ <option value="Найкращий кейс">Найкращий кейс</option>
49
+ <option value="Сильні сторони">Сильні сторони</option>
50
+ <option value="Слабкі сторони">Слабкі сторони</option>
51
+ </select>
52
+ </div>
53
+ </div>
54
+ <button id="reset-filters" class="btn btn--secondary btn--sm">Скинути фільтри</button>
55
+ </div>
56
+ </div>
57
+ </div>
58
+
59
+ <!-- Таблиця порівняння -->
60
+ <div class="comparison-section">
61
+ <div class="card">
62
+ <div class="card__body">
63
+ <h3>📊 Таблиця порівняння</h3>
64
+ <div class="table-container">
65
+ <table id="comparison-table" class="comparison-table">
66
+ <thead>
67
+ <tr>
68
+ <th>Підхід</th>
69
+ <th>Функціональність</th>
70
+ <th>Найкращий кейс</th>
71
+ <th>Сильні сторони</th>
72
+ <th>Слабкі сторони</th>
73
+ <th>Складність</th>
74
+ </tr>
75
+ </thead>
76
+ <tbody id="comparison-table-body">
77
+ </tbody>
78
+ </table>
79
+ </div>
80
+ </div>
81
+ </div>
82
+ </div>
83
+
84
+ <!-- Робочі процеси -->
85
+ <div class="workflows-section">
86
+ <div class="card">
87
+ <div class="card__body">
88
+ <h3>🔄 Робочі процеси</h3>
89
+ <div class="workflows-grid" id="workflows-grid">
90
+ </div>
91
+ </div>
92
+ </div>
93
+ </div>
94
+
95
+ <!-- Детальна інформація -->
96
+ <div class="details-section">
97
+ <div class="card">
98
+ <div class="card__body">
99
+ <h3>📋 Детальна інформація</h3>
100
+ <div class="details-grid" id="details-grid">
101
+ </div>
102
+ </div>
103
+ </div>
104
+ </div>
105
+
106
+ <!-- Рекомендації -->
107
+ <div class="recommendations-section">
108
+ <div class="card">
109
+ <div class="card__body">
110
+ <h3>💡 Рекомендації по вибору підходу</h3>
111
+ <div class="recommendations-grid" id="recommendations-grid">
112
+ </div>
113
+ </div>
114
+ </div>
115
+ </div>
116
+ </main>
117
+
118
+ <footer class="footer">
119
+ <p>© 2025 Дашборд підходів до побудови AI-систем. Створено для навчальних цілей.</p>
120
+ </footer>
121
+ </div>
122
+
123
+ <script src="app.js"></script>
124
+ </body>
125
+ </html>
style.css CHANGED
@@ -1,28 +1,1380 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  body {
2
- padding: 2rem;
3
- font-family: -apple-system, BlinkMacSystemFont, "Arial", sans-serif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  }
5
 
6
  h1 {
7
- font-size: 16px;
8
- margin-top: 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  }
10
 
11
  p {
12
- color: rgb(107, 114, 128);
13
- font-size: 15px;
14
- margin-bottom: 10px;
15
- margin-top: 5px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  }
17
 
 
 
 
 
 
 
 
 
 
 
 
 
18
  .card {
19
- max-width: 620px;
20
- margin: 0 auto;
21
- padding: 16px;
22
- border: 1px solid lightgray;
23
- border-radius: 16px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  }
25
 
26
- .card p:last-child {
27
- margin-bottom: 0;
 
 
 
 
 
 
 
 
 
 
28
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ :root {
3
+ /* Colors */
4
+ --color-background: rgba(252, 252, 249, 1);
5
+ --color-surface: rgba(255, 255, 253, 1);
6
+ --color-text: rgba(19, 52, 59, 1);
7
+ --color-text-secondary: rgba(98, 108, 113, 1);
8
+ --color-primary: rgba(33, 128, 141, 1);
9
+ --color-primary-hover: rgba(29, 116, 128, 1);
10
+ --color-primary-active: rgba(26, 104, 115, 1);
11
+ --color-secondary: rgba(94, 82, 64, 0.12);
12
+ --color-secondary-hover: rgba(94, 82, 64, 0.2);
13
+ --color-secondary-active: rgba(94, 82, 64, 0.25);
14
+ --color-border: rgba(94, 82, 64, 0.2);
15
+ --color-btn-primary-text: rgba(252, 252, 249, 1);
16
+ --color-card-border: rgba(94, 82, 64, 0.12);
17
+ --color-card-border-inner: rgba(94, 82, 64, 0.12);
18
+ --color-error: rgba(192, 21, 47, 1);
19
+ --color-success: rgba(33, 128, 141, 1);
20
+ --color-warning: rgba(168, 75, 47, 1);
21
+ --color-info: rgba(98, 108, 113, 1);
22
+ --color-focus-ring: rgba(33, 128, 141, 0.4);
23
+ --color-select-caret: rgba(19, 52, 59, 0.8);
24
+
25
+ /* Common style patterns */
26
+ --focus-ring: 0 0 0 3px var(--color-focus-ring);
27
+ --focus-outline: 2px solid var(--color-primary);
28
+ --status-bg-opacity: 0.15;
29
+ --status-border-opacity: 0.25;
30
+ --select-caret-light: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23134252' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
31
+ --select-caret-dark: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23f5f5f5' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
32
+
33
+ /* RGB versions for opacity control */
34
+ --color-success-rgb: 33, 128, 141;
35
+ --color-error-rgb: 192, 21, 47;
36
+ --color-warning-rgb: 168, 75, 47;
37
+ --color-info-rgb: 98, 108, 113;
38
+
39
+ /* Typography */
40
+ --font-family-base: "FKGroteskNeue", "Geist", "Inter", -apple-system,
41
+ BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
42
+ --font-family-mono: "Berkeley Mono", ui-monospace, SFMono-Regular, Menlo,
43
+ Monaco, Consolas, monospace;
44
+ --font-size-xs: 11px;
45
+ --font-size-sm: 12px;
46
+ --font-size-base: 14px;
47
+ --font-size-md: 14px;
48
+ --font-size-lg: 16px;
49
+ --font-size-xl: 18px;
50
+ --font-size-2xl: 20px;
51
+ --font-size-3xl: 24px;
52
+ --font-size-4xl: 30px;
53
+ --font-weight-normal: 400;
54
+ --font-weight-medium: 500;
55
+ --font-weight-semibold: 550;
56
+ --font-weight-bold: 600;
57
+ --line-height-tight: 1.2;
58
+ --line-height-normal: 1.5;
59
+ --letter-spacing-tight: -0.01em;
60
+
61
+ /* Spacing */
62
+ --space-0: 0;
63
+ --space-1: 1px;
64
+ --space-2: 2px;
65
+ --space-4: 4px;
66
+ --space-6: 6px;
67
+ --space-8: 8px;
68
+ --space-10: 10px;
69
+ --space-12: 12px;
70
+ --space-16: 16px;
71
+ --space-20: 20px;
72
+ --space-24: 24px;
73
+ --space-32: 32px;
74
+
75
+ /* Border Radius */
76
+ --radius-sm: 6px;
77
+ --radius-base: 8px;
78
+ --radius-md: 10px;
79
+ --radius-lg: 12px;
80
+ --radius-full: 9999px;
81
+
82
+ /* Shadows */
83
+ --shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.02);
84
+ --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.04), 0 1px 2px rgba(0, 0, 0, 0.02);
85
+ --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.04),
86
+ 0 2px 4px -1px rgba(0, 0, 0, 0.02);
87
+ --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.04),
88
+ 0 4px 6px -2px rgba(0, 0, 0, 0.02);
89
+ --shadow-inset-sm: inset 0 1px 0 rgba(255, 255, 255, 0.15),
90
+ inset 0 -1px 0 rgba(0, 0, 0, 0.03);
91
+
92
+ /* Animation */
93
+ --duration-fast: 150ms;
94
+ --duration-normal: 250ms;
95
+ --ease-standard: cubic-bezier(0.16, 1, 0.3, 1);
96
+
97
+ /* Layout */
98
+ --container-sm: 640px;
99
+ --container-md: 768px;
100
+ --container-lg: 1024px;
101
+ --container-xl: 1280px;
102
+ }
103
+
104
+ /* Dark mode colors */
105
+ @media (prefers-color-scheme: dark) {
106
+ :root {
107
+ --color-background: rgba(31, 33, 33, 1);
108
+ --color-surface: rgba(38, 40, 40, 1);
109
+ --color-text: rgba(245, 245, 245, 1);
110
+ --color-text-secondary: rgba(167, 169, 169, 0.7);
111
+ --color-primary: rgba(50, 184, 198, 1);
112
+ --color-primary-hover: rgba(45, 166, 178, 1);
113
+ --color-primary-active: rgba(41, 150, 161, 1);
114
+ --color-secondary: rgba(119, 124, 124, 0.15);
115
+ --color-secondary-hover: rgba(119, 124, 124, 0.25);
116
+ --color-secondary-active: rgba(119, 124, 124, 0.3);
117
+ --color-border: rgba(119, 124, 124, 0.3);
118
+ --color-error: rgba(255, 84, 89, 1);
119
+ --color-success: rgba(50, 184, 198, 1);
120
+ --color-warning: rgba(230, 129, 97, 1);
121
+ --color-info: rgba(167, 169, 169, 1);
122
+ --color-focus-ring: rgba(50, 184, 198, 0.4);
123
+ --color-btn-primary-text: rgba(19, 52, 59, 1);
124
+ --color-card-border: rgba(119, 124, 124, 0.2);
125
+ --color-card-border-inner: rgba(119, 124, 124, 0.15);
126
+ --shadow-inset-sm: inset 0 1px 0 rgba(255, 255, 255, 0.1),
127
+ inset 0 -1px 0 rgba(0, 0, 0, 0.15);
128
+ --button-border-secondary: rgba(119, 124, 124, 0.2);
129
+ --color-border-secondary: rgba(119, 124, 124, 0.2);
130
+ --color-select-caret: rgba(245, 245, 245, 0.8);
131
+
132
+ /* Common style patterns - updated for dark mode */
133
+ --focus-ring: 0 0 0 3px var(--color-focus-ring);
134
+ --focus-outline: 2px solid var(--color-primary);
135
+ --status-bg-opacity: 0.15;
136
+ --status-border-opacity: 0.25;
137
+ --select-caret-light: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23134252' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
138
+ --select-caret-dark: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23f5f5f5' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
139
+
140
+ /* RGB versions for dark mode */
141
+ --color-success-rgb: 50, 184, 198;
142
+ --color-error-rgb: 255, 84, 89;
143
+ --color-warning-rgb: 230, 129, 97;
144
+ --color-info-rgb: 167, 169, 169;
145
+ }
146
+ }
147
+
148
+ /* Data attribute for manual theme switching */
149
+ [data-color-scheme="dark"] {
150
+ --color-background: rgba(31, 33, 33, 1);
151
+ --color-surface: rgba(38, 40, 40, 1);
152
+ --color-text: rgba(245, 245, 245, 1);
153
+ --color-text-secondary: rgba(167, 169, 169, 0.7);
154
+ --color-primary: rgba(50, 184, 198, 1);
155
+ --color-primary-hover: rgba(45, 166, 178, 1);
156
+ --color-primary-active: rgba(41, 150, 161, 1);
157
+ --color-secondary: rgba(119, 124, 124, 0.15);
158
+ --color-secondary-hover: rgba(119, 124, 124, 0.25);
159
+ --color-secondary-active: rgba(119, 124, 124, 0.3);
160
+ --color-border: rgba(119, 124, 124, 0.3);
161
+ --color-error: rgba(255, 84, 89, 1);
162
+ --color-success: rgba(50, 184, 198, 1);
163
+ --color-warning: rgba(230, 129, 97, 1);
164
+ --color-info: rgba(167, 169, 169, 1);
165
+ --color-focus-ring: rgba(50, 184, 198, 0.4);
166
+ --color-btn-primary-text: rgba(19, 52, 59, 1);
167
+ --color-card-border: rgba(119, 124, 124, 0.15);
168
+ --color-card-border-inner: rgba(119, 124, 124, 0.15);
169
+ --shadow-inset-sm: inset 0 1px 0 rgba(255, 255, 255, 0.1),
170
+ inset 0 -1px 0 rgba(0, 0, 0, 0.15);
171
+ --color-border-secondary: rgba(119, 124, 124, 0.2);
172
+ --color-select-caret: rgba(245, 245, 245, 0.8);
173
+
174
+ /* Common style patterns - updated for dark mode */
175
+ --focus-ring: 0 0 0 3px var(--color-focus-ring);
176
+ --focus-outline: 2px solid var(--color-primary);
177
+ --status-bg-opacity: 0.15;
178
+ --status-border-opacity: 0.25;
179
+ --select-caret-light: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23134252' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
180
+ --select-caret-dark: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23f5f5f5' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
181
+
182
+ /* RGB versions for dark mode */
183
+ --color-success-rgb: 50, 184, 198;
184
+ --color-error-rgb: 255, 84, 89;
185
+ --color-warning-rgb: 230, 129, 97;
186
+ --color-info-rgb: 167, 169, 169;
187
+ }
188
+
189
+ [data-color-scheme="light"] {
190
+ --color-background: rgba(252, 252, 249, 1);
191
+ --color-surface: rgba(255, 255, 253, 1);
192
+ --color-text: rgba(19, 52, 59, 1);
193
+ --color-text-secondary: rgba(98, 108, 113, 1);
194
+ --color-primary: rgba(33, 128, 141, 1);
195
+ --color-primary-hover: rgba(29, 116, 128, 1);
196
+ --color-primary-active: rgba(26, 104, 115, 1);
197
+ --color-secondary: rgba(94, 82, 64, 0.12);
198
+ --color-secondary-hover: rgba(94, 82, 64, 0.2);
199
+ --color-secondary-active: rgba(94, 82, 64, 0.25);
200
+ --color-border: rgba(94, 82, 64, 0.2);
201
+ --color-btn-primary-text: rgba(252, 252, 249, 1);
202
+ --color-card-border: rgba(94, 82, 64, 0.12);
203
+ --color-card-border-inner: rgba(94, 82, 64, 0.12);
204
+ --color-error: rgba(192, 21, 47, 1);
205
+ --color-success: rgba(33, 128, 141, 1);
206
+ --color-warning: rgba(168, 75, 47, 1);
207
+ --color-info: rgba(98, 108, 113, 1);
208
+ --color-focus-ring: rgba(33, 128, 141, 0.4);
209
+
210
+ /* RGB versions for light mode */
211
+ --color-success-rgb: 33, 128, 141;
212
+ --color-error-rgb: 192, 21, 47;
213
+ --color-warning-rgb: 168, 75, 47;
214
+ --color-info-rgb: 98, 108, 113;
215
+ }
216
+
217
+ /* Base styles */
218
+ html {
219
+ font-size: var(--font-size-base);
220
+ font-family: var(--font-family-base);
221
+ line-height: var(--line-height-normal);
222
+ color: var(--color-text);
223
+ background-color: var(--color-background);
224
+ -webkit-font-smoothing: antialiased;
225
+ box-sizing: border-box;
226
+ }
227
+
228
  body {
229
+ margin: 0;
230
+ padding: 0;
231
+ }
232
+
233
+ *,
234
+ *::before,
235
+ *::after {
236
+ box-sizing: inherit;
237
+ }
238
+
239
+ /* Typography */
240
+ h1,
241
+ h2,
242
+ h3,
243
+ h4,
244
+ h5,
245
+ h6 {
246
+ margin: 0;
247
+ font-weight: var(--font-weight-semibold);
248
+ line-height: var(--line-height-tight);
249
+ color: var(--color-text);
250
+ letter-spacing: var(--letter-spacing-tight);
251
  }
252
 
253
  h1 {
254
+ font-size: var(--font-size-4xl);
255
+ }
256
+ h2 {
257
+ font-size: var(--font-size-3xl);
258
+ }
259
+ h3 {
260
+ font-size: var(--font-size-2xl);
261
+ }
262
+ h4 {
263
+ font-size: var(--font-size-xl);
264
+ }
265
+ h5 {
266
+ font-size: var(--font-size-lg);
267
+ }
268
+ h6 {
269
+ font-size: var(--font-size-md);
270
  }
271
 
272
  p {
273
+ margin: 0 0 var(--space-16) 0;
274
+ }
275
+
276
+ a {
277
+ color: var(--color-primary);
278
+ text-decoration: none;
279
+ transition: color var(--duration-fast) var(--ease-standard);
280
+ }
281
+
282
+ a:hover {
283
+ color: var(--color-primary-hover);
284
+ }
285
+
286
+ code,
287
+ pre {
288
+ font-family: var(--font-family-mono);
289
+ font-size: calc(var(--font-size-base) * 0.95);
290
+ background-color: var(--color-secondary);
291
+ border-radius: var(--radius-sm);
292
+ }
293
+
294
+ code {
295
+ padding: var(--space-1) var(--space-4);
296
+ }
297
+
298
+ pre {
299
+ padding: var(--space-16);
300
+ margin: var(--space-16) 0;
301
+ overflow: auto;
302
+ border: 1px solid var(--color-border);
303
+ }
304
+
305
+ pre code {
306
+ background: none;
307
+ padding: 0;
308
+ }
309
+
310
+ /* Buttons */
311
+ .btn {
312
+ display: inline-flex;
313
+ align-items: center;
314
+ justify-content: center;
315
+ padding: var(--space-8) var(--space-16);
316
+ border-radius: var(--radius-base);
317
+ font-size: var(--font-size-base);
318
+ font-weight: 500;
319
+ line-height: 1.5;
320
+ cursor: pointer;
321
+ transition: all var(--duration-normal) var(--ease-standard);
322
+ border: none;
323
+ text-decoration: none;
324
+ position: relative;
325
+ }
326
+
327
+ .btn:focus-visible {
328
+ outline: none;
329
+ box-shadow: var(--focus-ring);
330
+ }
331
+
332
+ .btn--primary {
333
+ background: var(--color-primary);
334
+ color: var(--color-btn-primary-text);
335
+ }
336
+
337
+ .btn--primary:hover {
338
+ background: var(--color-primary-hover);
339
+ }
340
+
341
+ .btn--primary:active {
342
+ background: var(--color-primary-active);
343
+ }
344
+
345
+ .btn--secondary {
346
+ background: var(--color-secondary);
347
+ color: var(--color-text);
348
+ }
349
+
350
+ .btn--secondary:hover {
351
+ background: var(--color-secondary-hover);
352
+ }
353
+
354
+ .btn--secondary:active {
355
+ background: var(--color-secondary-active);
356
+ }
357
+
358
+ .btn--outline {
359
+ background: transparent;
360
+ border: 1px solid var(--color-border);
361
+ color: var(--color-text);
362
+ }
363
+
364
+ .btn--outline:hover {
365
+ background: var(--color-secondary);
366
+ }
367
+
368
+ .btn--sm {
369
+ padding: var(--space-4) var(--space-12);
370
+ font-size: var(--font-size-sm);
371
+ border-radius: var(--radius-sm);
372
+ }
373
+
374
+ .btn--lg {
375
+ padding: var(--space-10) var(--space-20);
376
+ font-size: var(--font-size-lg);
377
+ border-radius: var(--radius-md);
378
+ }
379
+
380
+ .btn--full-width {
381
+ width: 100%;
382
+ }
383
+
384
+ .btn:disabled {
385
+ opacity: 0.5;
386
+ cursor: not-allowed;
387
+ }
388
+
389
+ /* Form elements */
390
+ .form-control {
391
+ display: block;
392
+ width: 100%;
393
+ padding: var(--space-8) var(--space-12);
394
+ font-size: var(--font-size-md);
395
+ line-height: 1.5;
396
+ color: var(--color-text);
397
+ background-color: var(--color-surface);
398
+ border: 1px solid var(--color-border);
399
+ border-radius: var(--radius-base);
400
+ transition: border-color var(--duration-fast) var(--ease-standard),
401
+ box-shadow var(--duration-fast) var(--ease-standard);
402
+ }
403
+
404
+ textarea.form-control {
405
+ font-family: var(--font-family-base);
406
+ font-size: var(--font-size-base);
407
+ }
408
+
409
+ select.form-control {
410
+ padding: var(--space-8) var(--space-12);
411
+ -webkit-appearance: none;
412
+ -moz-appearance: none;
413
+ appearance: none;
414
+ background-image: var(--select-caret-light);
415
+ background-repeat: no-repeat;
416
+ background-position: right var(--space-12) center;
417
+ background-size: 16px;
418
+ padding-right: var(--space-32);
419
+ }
420
+
421
+ /* Add a dark mode specific caret */
422
+ @media (prefers-color-scheme: dark) {
423
+ select.form-control {
424
+ background-image: var(--select-caret-dark);
425
+ }
426
+ }
427
+
428
+ /* Also handle data-color-scheme */
429
+ [data-color-scheme="dark"] select.form-control {
430
+ background-image: var(--select-caret-dark);
431
+ }
432
+
433
+ [data-color-scheme="light"] select.form-control {
434
+ background-image: var(--select-caret-light);
435
+ }
436
+
437
+ .form-control:focus {
438
+ border-color: var(--color-primary);
439
+ outline: var(--focus-outline);
440
  }
441
 
442
+ .form-label {
443
+ display: block;
444
+ margin-bottom: var(--space-8);
445
+ font-weight: var(--font-weight-medium);
446
+ font-size: var(--font-size-sm);
447
+ }
448
+
449
+ .form-group {
450
+ margin-bottom: var(--space-16);
451
+ }
452
+
453
+ /* Card component */
454
  .card {
455
+ background-color: var(--color-surface);
456
+ border-radius: var(--radius-lg);
457
+ border: 1px solid var(--color-card-border);
458
+ box-shadow: var(--shadow-sm);
459
+ overflow: hidden;
460
+ transition: box-shadow var(--duration-normal) var(--ease-standard);
461
+ }
462
+
463
+ .card:hover {
464
+ box-shadow: var(--shadow-md);
465
+ }
466
+
467
+ .card__body {
468
+ padding: var(--space-16);
469
+ }
470
+
471
+ .card__header,
472
+ .card__footer {
473
+ padding: var(--space-16);
474
+ border-bottom: 1px solid var(--color-card-border-inner);
475
+ }
476
+
477
+ /* Status indicators - simplified with CSS variables */
478
+ .status {
479
+ display: inline-flex;
480
+ align-items: center;
481
+ padding: var(--space-6) var(--space-12);
482
+ border-radius: var(--radius-full);
483
+ font-weight: var(--font-weight-medium);
484
+ font-size: var(--font-size-sm);
485
+ }
486
+
487
+ .status--success {
488
+ background-color: rgba(
489
+ var(--color-success-rgb, 33, 128, 141),
490
+ var(--status-bg-opacity)
491
+ );
492
+ color: var(--color-success);
493
+ border: 1px solid
494
+ rgba(var(--color-success-rgb, 33, 128, 141), var(--status-border-opacity));
495
+ }
496
+
497
+ .status--error {
498
+ background-color: rgba(
499
+ var(--color-error-rgb, 192, 21, 47),
500
+ var(--status-bg-opacity)
501
+ );
502
+ color: var(--color-error);
503
+ border: 1px solid
504
+ rgba(var(--color-error-rgb, 192, 21, 47), var(--status-border-opacity));
505
+ }
506
+
507
+ .status--warning {
508
+ background-color: rgba(
509
+ var(--color-warning-rgb, 168, 75, 47),
510
+ var(--status-bg-opacity)
511
+ );
512
+ color: var(--color-warning);
513
+ border: 1px solid
514
+ rgba(var(--color-warning-rgb, 168, 75, 47), var(--status-border-opacity));
515
+ }
516
+
517
+ .status--info {
518
+ background-color: rgba(
519
+ var(--color-info-rgb, 98, 108, 113),
520
+ var(--status-bg-opacity)
521
+ );
522
+ color: var(--color-info);
523
+ border: 1px solid
524
+ rgba(var(--color-info-rgb, 98, 108, 113), var(--status-border-opacity));
525
+ }
526
+
527
+ /* Container layout */
528
+ .container {
529
+ width: 100%;
530
+ margin-right: auto;
531
+ margin-left: auto;
532
+ padding-right: var(--space-16);
533
+ padding-left: var(--space-16);
534
+ }
535
+
536
+ @media (min-width: 640px) {
537
+ .container {
538
+ max-width: var(--container-sm);
539
+ }
540
+ }
541
+ @media (min-width: 768px) {
542
+ .container {
543
+ max-width: var(--container-md);
544
+ }
545
+ }
546
+ @media (min-width: 1024px) {
547
+ .container {
548
+ max-width: var(--container-lg);
549
+ }
550
+ }
551
+ @media (min-width: 1280px) {
552
+ .container {
553
+ max-width: var(--container-xl);
554
+ }
555
+ }
556
+
557
+ /* Utility classes */
558
+ .flex {
559
+ display: flex;
560
+ }
561
+ .flex-col {
562
+ flex-direction: column;
563
+ }
564
+ .items-center {
565
+ align-items: center;
566
+ }
567
+ .justify-center {
568
+ justify-content: center;
569
+ }
570
+ .justify-between {
571
+ justify-content: space-between;
572
+ }
573
+ .gap-4 {
574
+ gap: var(--space-4);
575
+ }
576
+ .gap-8 {
577
+ gap: var(--space-8);
578
+ }
579
+ .gap-16 {
580
+ gap: var(--space-16);
581
+ }
582
+
583
+ .m-0 {
584
+ margin: 0;
585
+ }
586
+ .mt-8 {
587
+ margin-top: var(--space-8);
588
+ }
589
+ .mb-8 {
590
+ margin-bottom: var(--space-8);
591
+ }
592
+ .mx-8 {
593
+ margin-left: var(--space-8);
594
+ margin-right: var(--space-8);
595
+ }
596
+ .my-8 {
597
+ margin-top: var(--space-8);
598
+ margin-bottom: var(--space-8);
599
+ }
600
+
601
+ .p-0 {
602
+ padding: 0;
603
+ }
604
+ .py-8 {
605
+ padding-top: var(--space-8);
606
+ padding-bottom: var(--space-8);
607
+ }
608
+ .px-8 {
609
+ padding-left: var(--space-8);
610
+ padding-right: var(--space-8);
611
+ }
612
+ .py-16 {
613
+ padding-top: var(--space-16);
614
+ padding-bottom: var(--space-16);
615
+ }
616
+ .px-16 {
617
+ padding-left: var(--space-16);
618
+ padding-right: var(--space-16);
619
+ }
620
+
621
+ .block {
622
+ display: block;
623
+ }
624
+ .hidden {
625
+ display: none;
626
+ }
627
+
628
+ /* Accessibility */
629
+ .sr-only {
630
+ position: absolute;
631
+ width: 1px;
632
+ height: 1px;
633
+ padding: 0;
634
+ margin: -1px;
635
+ overflow: hidden;
636
+ clip: rect(0, 0, 0, 0);
637
+ white-space: nowrap;
638
+ border-width: 0;
639
+ }
640
+
641
+ :focus-visible {
642
+ outline: var(--focus-outline);
643
+ outline-offset: 2px;
644
+ }
645
+
646
+ /* Dark mode specifics */
647
+ [data-color-scheme="dark"] .btn--outline {
648
+ border: 1px solid var(--color-border-secondary);
649
+ }
650
+
651
+ @font-face {
652
+ font-family: 'FKGroteskNeue';
653
+ src: url('https://r2cdn.perplexity.ai/fonts/FKGroteskNeue.woff2')
654
+ format('woff2');
655
+ }
656
+
657
+ :root {
658
+ /* Colors */
659
+ --color-background: rgba(252, 252, 249, 1);
660
+ --color-surface: rgba(255, 255, 253, 1);
661
+ --color-text: rgba(19, 52, 59, 1);
662
+ --color-text-secondary: rgba(98, 108, 113, 1);
663
+ --color-primary: rgba(33, 128, 141, 1);
664
+ --color-primary-hover: rgba(29, 116, 128, 1);
665
+ --color-primary-active: rgba(26, 104, 115, 1);
666
+ --color-secondary: rgba(94, 82, 64, 0.12);
667
+ --color-secondary-hover: rgba(94, 82, 64, 0.2);
668
+ --color-secondary-active: rgba(94, 82, 64, 0.25);
669
+ --color-border: rgba(94, 82, 64, 0.2);
670
+ --color-btn-primary-text: rgba(252, 252, 249, 1);
671
+ --color-card-border: rgba(94, 82, 64, 0.12);
672
+ --color-card-border-inner: rgba(94, 82, 64, 0.12);
673
+ --color-error: rgba(192, 21, 47, 1);
674
+ --color-success: rgba(33, 128, 141, 1);
675
+ --color-warning: rgba(168, 75, 47, 1);
676
+ --color-info: rgba(98, 108, 113, 1);
677
+ --color-focus-ring: rgba(33, 128, 141, 0.4);
678
+ --color-select-caret: rgba(19, 52, 59, 0.8);
679
+
680
+ /* AI Dashboard specific colors */
681
+ --color-llm: rgba(74, 144, 226, 1);
682
+ --color-rag: rgba(52, 211, 153, 1);
683
+ --color-agent: rgba(168, 85, 247, 1);
684
+ --color-agentic: rgba(251, 146, 60, 1);
685
+ --color-gradient-1: linear-gradient(135deg, #4A90E2, #357ABD);
686
+ --color-gradient-2: linear-gradient(135deg, #34D399, #10B981);
687
+ --color-gradient-3: linear-gradient(135deg, #A855F7, #8B5CF6);
688
+ --color-gradient-4: linear-gradient(135deg, #FB923C, #F59E0B);
689
+
690
+ /* Common style patterns */
691
+ --focus-ring: 0 0 0 3px var(--color-focus-ring);
692
+ --focus-outline: 2px solid var(--color-primary);
693
+ --status-bg-opacity: 0.15;
694
+ --status-border-opacity: 0.25;
695
+ --select-caret-light: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23134252' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
696
+ --select-caret-dark: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23f5f5f5' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
697
+
698
+ /* RGB versions for opacity control */
699
+ --color-success-rgb: 33, 128, 141;
700
+ --color-error-rgb: 192, 21, 47;
701
+ --color-warning-rgb: 168, 75, 47;
702
+ --color-info-rgb: 98, 108, 113;
703
+
704
+ /* Typography */
705
+ --font-family-base: "FKGroteskNeue", "Geist", "Inter", -apple-system,
706
+ BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
707
+ --font-family-mono: "Berkeley Mono", ui-monospace, SFMono-Regular, Menlo,
708
+ Monaco, Consolas, monospace;
709
+ --font-size-xs: 11px;
710
+ --font-size-sm: 12px;
711
+ --font-size-base: 14px;
712
+ --font-size-md: 14px;
713
+ --font-size-lg: 16px;
714
+ --font-size-xl: 18px;
715
+ --font-size-2xl: 20px;
716
+ --font-size-3xl: 24px;
717
+ --font-size-4xl: 30px;
718
+ --font-weight-normal: 400;
719
+ --font-weight-medium: 500;
720
+ --font-weight-semibold: 550;
721
+ --font-weight-bold: 600;
722
+ --line-height-tight: 1.2;
723
+ --line-height-normal: 1.5;
724
+ --letter-spacing-tight: -0.01em;
725
+
726
+ /* Spacing */
727
+ --space-0: 0;
728
+ --space-1: 1px;
729
+ --space-2: 2px;
730
+ --space-4: 4px;
731
+ --space-6: 6px;
732
+ --space-8: 8px;
733
+ --space-10: 10px;
734
+ --space-12: 12px;
735
+ --space-16: 16px;
736
+ --space-20: 20px;
737
+ --space-24: 24px;
738
+ --space-32: 32px;
739
+
740
+ /* Border Radius */
741
+ --radius-sm: 6px;
742
+ --radius-base: 8px;
743
+ --radius-md: 10px;
744
+ --radius-lg: 12px;
745
+ --radius-full: 9999px;
746
+
747
+ /* Shadows */
748
+ --shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.02);
749
+ --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.04), 0 1px 2px rgba(0, 0, 0, 0.02);
750
+ --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.04),
751
+ 0 2px 4px -1px rgba(0, 0, 0, 0.02);
752
+ --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.04),
753
+ 0 4px 6px -2px rgba(0, 0, 0, 0.02);
754
+ --shadow-inset-sm: inset 0 1px 0 rgba(255, 255, 255, 0.15),
755
+ inset 0 -1px 0 rgba(0, 0, 0, 0.03);
756
+
757
+ /* Animation */
758
+ --duration-fast: 150ms;
759
+ --duration-normal: 250ms;
760
+ --ease-standard: cubic-bezier(0.16, 1, 0.3, 1);
761
+
762
+ /* Layout */
763
+ --container-sm: 640px;
764
+ --container-md: 768px;
765
+ --container-lg: 1024px;
766
+ --container-xl: 1280px;
767
+ }
768
+
769
+ /* Dark mode colors */
770
+ @media (prefers-color-scheme: dark) {
771
+ :root {
772
+ --color-background: rgba(31, 33, 33, 1);
773
+ --color-surface: rgba(38, 40, 40, 1);
774
+ --color-text: rgba(245, 245, 245, 1);
775
+ --color-text-secondary: rgba(167, 169, 169, 0.7);
776
+ --color-primary: rgba(50, 184, 198, 1);
777
+ --color-primary-hover: rgba(45, 166, 178, 1);
778
+ --color-primary-active: rgba(41, 150, 161, 1);
779
+ --color-secondary: rgba(119, 124, 124, 0.15);
780
+ --color-secondary-hover: rgba(119, 124, 124, 0.25);
781
+ --color-secondary-active: rgba(119, 124, 124, 0.3);
782
+ --color-border: rgba(119, 124, 124, 0.3);
783
+ --color-error: rgba(255, 84, 89, 1);
784
+ --color-success: rgba(50, 184, 198, 1);
785
+ --color-warning: rgba(230, 129, 97, 1);
786
+ --color-info: rgba(167, 169, 169, 1);
787
+ --color-focus-ring: rgba(50, 184, 198, 0.4);
788
+ --color-btn-primary-text: rgba(19, 52, 59, 1);
789
+ --color-card-border: rgba(119, 124, 124, 0.2);
790
+ --color-card-border-inner: rgba(119, 124, 124, 0.15);
791
+ --shadow-inset-sm: inset 0 1px 0 rgba(255, 255, 255, 0.1),
792
+ inset 0 -1px 0 rgba(0, 0, 0, 0.15);
793
+ --button-border-secondary: rgba(119, 124, 124, 0.2);
794
+ --color-border-secondary: rgba(119, 124, 124, 0.2);
795
+ --color-select-caret: rgba(245, 245, 245, 0.8);
796
+
797
+ /* Common style patterns - updated for dark mode */
798
+ --focus-ring: 0 0 0 3px var(--color-focus-ring);
799
+ --focus-outline: 2px solid var(--color-primary);
800
+ --status-bg-opacity: 0.15;
801
+ --status-border-opacity: 0.25;
802
+ --select-caret-light: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23134252' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
803
+ --select-caret-dark: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23f5f5f5' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
804
+
805
+ /* RGB versions for dark mode */
806
+ --color-success-rgb: 50, 184, 198;
807
+ --color-error-rgb: 255, 84, 89;
808
+ --color-warning-rgb: 230, 129, 97;
809
+ --color-info-rgb: 167, 169, 169;
810
+ }
811
+ }
812
+
813
+ /* Base styles */
814
+ html {
815
+ font-size: var(--font-size-base);
816
+ font-family: var(--font-family-base);
817
+ line-height: var(--line-height-normal);
818
+ color: var(--color-text);
819
+ background-color: var(--color-background);
820
+ -webkit-font-smoothing: antialiased;
821
+ box-sizing: border-box;
822
+ }
823
+
824
+ body {
825
+ margin: 0;
826
+ padding: 0;
827
+ }
828
+
829
+ *,
830
+ *::before,
831
+ *::after {
832
+ box-sizing: inherit;
833
  }
834
 
835
+ /* Typography */
836
+ h1,
837
+ h2,
838
+ h3,
839
+ h4,
840
+ h5,
841
+ h6 {
842
+ margin: 0;
843
+ font-weight: var(--font-weight-semibold);
844
+ line-height: var(--line-height-tight);
845
+ color: var(--color-text);
846
+ letter-spacing: var(--letter-spacing-tight);
847
  }
848
+
849
+ h1 {
850
+ font-size: var(--font-size-4xl);
851
+ }
852
+ h2 {
853
+ font-size: var(--font-size-3xl);
854
+ }
855
+ h3 {
856
+ font-size: var(--font-size-2xl);
857
+ }
858
+ h4 {
859
+ font-size: var(--font-size-xl);
860
+ }
861
+ h5 {
862
+ font-size: var(--font-size-lg);
863
+ }
864
+ h6 {
865
+ font-size: var(--font-size-md);
866
+ }
867
+
868
+ p {
869
+ margin: 0 0 var(--space-16) 0;
870
+ }
871
+
872
+ a {
873
+ color: var(--color-primary);
874
+ text-decoration: none;
875
+ transition: color var(--duration-fast) var(--ease-standard);
876
+ }
877
+
878
+ a:hover {
879
+ color: var(--color-primary-hover);
880
+ }
881
+
882
+ /* Buttons */
883
+ .btn {
884
+ display: inline-flex;
885
+ align-items: center;
886
+ justify-content: center;
887
+ padding: var(--space-8) var(--space-16);
888
+ border-radius: var(--radius-base);
889
+ font-size: var(--font-size-base);
890
+ font-weight: 500;
891
+ line-height: 1.5;
892
+ cursor: pointer;
893
+ transition: all var(--duration-normal) var(--ease-standard);
894
+ border: none;
895
+ text-decoration: none;
896
+ position: relative;
897
+ }
898
+
899
+ .btn:focus-visible {
900
+ outline: none;
901
+ box-shadow: var(--focus-ring);
902
+ }
903
+
904
+ .btn--primary {
905
+ background: var(--color-primary);
906
+ color: var(--color-btn-primary-text);
907
+ }
908
+
909
+ .btn--primary:hover {
910
+ background: var(--color-primary-hover);
911
+ }
912
+
913
+ .btn--primary:active {
914
+ background: var(--color-primary-active);
915
+ }
916
+
917
+ .btn--secondary {
918
+ background: var(--color-secondary);
919
+ color: var(--color-text);
920
+ }
921
+
922
+ .btn--secondary:hover {
923
+ background: var(--color-secondary-hover);
924
+ }
925
+
926
+ .btn--secondary:active {
927
+ background: var(--color-secondary-active);
928
+ }
929
+
930
+ .btn--sm {
931
+ padding: var(--space-4) var(--space-12);
932
+ font-size: var(--font-size-sm);
933
+ border-radius: var(--radius-sm);
934
+ }
935
+
936
+ .btn--lg {
937
+ padding: var(--space-10) var(--space-20);
938
+ font-size: var(--font-size-lg);
939
+ border-radius: var(--radius-md);
940
+ }
941
+
942
+ .btn--full-width {
943
+ width: 100%;
944
+ }
945
+
946
+ .btn:disabled {
947
+ opacity: 0.5;
948
+ cursor: not-allowed;
949
+ }
950
+
951
+ /* Form elements */
952
+ .form-control {
953
+ display: block;
954
+ width: 100%;
955
+ padding: var(--space-8) var(--space-12);
956
+ font-size: var(--font-size-md);
957
+ line-height: 1.5;
958
+ color: var(--color-text);
959
+ background-color: var(--color-surface);
960
+ border: 1px solid var(--color-border);
961
+ border-radius: var(--radius-base);
962
+ transition: border-color var(--duration-fast) var(--ease-standard),
963
+ box-shadow var(--duration-fast) var(--ease-standard);
964
+ }
965
+
966
+ select.form-control {
967
+ padding: var(--space-8) var(--space-12);
968
+ -webkit-appearance: none;
969
+ -moz-appearance: none;
970
+ appearance: none;
971
+ background-image: var(--select-caret-light);
972
+ background-repeat: no-repeat;
973
+ background-position: right var(--space-12) center;
974
+ background-size: 16px;
975
+ padding-right: var(--space-32);
976
+ }
977
+
978
+ @media (prefers-color-scheme: dark) {
979
+ select.form-control {
980
+ background-image: var(--select-caret-dark);
981
+ }
982
+ }
983
+
984
+ .form-control:focus {
985
+ border-color: var(--color-primary);
986
+ outline: var(--focus-outline);
987
+ }
988
+
989
+ .form-label {
990
+ display: block;
991
+ margin-bottom: var(--space-8);
992
+ font-weight: var(--font-weight-medium);
993
+ font-size: var(--font-size-sm);
994
+ }
995
+
996
+ .form-group {
997
+ margin-bottom: var(--space-16);
998
+ }
999
+
1000
+ /* Card component */
1001
+ .card {
1002
+ background-color: var(--color-surface);
1003
+ border-radius: var(--radius-lg);
1004
+ border: 1px solid var(--color-card-border);
1005
+ box-shadow: var(--shadow-sm);
1006
+ overflow: hidden;
1007
+ transition: box-shadow var(--duration-normal) var(--ease-standard),
1008
+ transform var(--duration-normal) var(--ease-standard);
1009
+ }
1010
+
1011
+ .card:hover {
1012
+ box-shadow: var(--shadow-md);
1013
+ transform: translateY(-2px);
1014
+ }
1015
+
1016
+ .card__body {
1017
+ padding: var(--space-16);
1018
+ }
1019
+
1020
+ .card__header,
1021
+ .card__footer {
1022
+ padding: var(--space-16);
1023
+ border-bottom: 1px solid var(--color-card-border-inner);
1024
+ }
1025
+
1026
+ /* Container layout */
1027
+ .container {
1028
+ width: 100%;
1029
+ margin-right: auto;
1030
+ margin-left: auto;
1031
+ padding-right: var(--space-16);
1032
+ padding-left: var(--space-16);
1033
+ }
1034
+
1035
+ @media (min-width: 1280px) {
1036
+ .container {
1037
+ max-width: var(--container-xl);
1038
+ }
1039
+ }
1040
+
1041
+ /* AI Dashboard specific styles */
1042
+ .header {
1043
+ text-align: center;
1044
+ margin-bottom: var(--space-32);
1045
+ padding: var(--space-32) var(--space-16);
1046
+ background: var(--color-gradient-1);
1047
+ color: white;
1048
+ border-radius: var(--radius-lg);
1049
+ box-shadow: var(--shadow-lg);
1050
+ }
1051
+
1052
+ .header h1 {
1053
+ font-size: var(--font-size-4xl);
1054
+ margin-bottom: var(--space-12);
1055
+ color: white;
1056
+ }
1057
+
1058
+ .header p {
1059
+ font-size: var(--font-size-lg);
1060
+ opacity: 0.9;
1061
+ margin: 0;
1062
+ color: white;
1063
+ }
1064
+
1065
+ .main-content {
1066
+ display: grid;
1067
+ gap: var(--space-32);
1068
+ margin-bottom: var(--space-32);
1069
+ }
1070
+
1071
+ .filters-grid {
1072
+ display: grid;
1073
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
1074
+ gap: var(--space-16);
1075
+ margin-bottom: var(--space-16);
1076
+ }
1077
+
1078
+ .table-container {
1079
+ overflow-x: auto;
1080
+ border-radius: var(--radius-base);
1081
+ border: 1px solid var(--color-border);
1082
+ }
1083
+
1084
+ .comparison-table {
1085
+ width: 100%;
1086
+ border-collapse: collapse;
1087
+ font-size: var(--font-size-sm);
1088
+ }
1089
+
1090
+ .comparison-table th,
1091
+ .comparison-table td {
1092
+ padding: var(--space-12);
1093
+ text-align: left;
1094
+ border-bottom: 1px solid var(--color-border);
1095
+ }
1096
+
1097
+ .comparison-table th {
1098
+ background-color: var(--color-secondary);
1099
+ font-weight: var(--font-weight-semibold);
1100
+ color: var(--color-text);
1101
+ }
1102
+
1103
+ .comparison-table tr:hover {
1104
+ background-color: var(--color-secondary);
1105
+ }
1106
+
1107
+ .approach-name {
1108
+ font-weight: var(--font-weight-semibold);
1109
+ display: flex;
1110
+ align-items: center;
1111
+ gap: var(--space-8);
1112
+ }
1113
+
1114
+ .approach-icon {
1115
+ font-size: var(--font-size-lg);
1116
+ }
1117
+
1118
+ .workflows-grid {
1119
+ display: grid;
1120
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
1121
+ gap: var(--space-24);
1122
+ }
1123
+
1124
+ .workflow-card {
1125
+ background: var(--color-surface);
1126
+ border-radius: var(--radius-lg);
1127
+ border: 1px solid var(--color-border);
1128
+ overflow: hidden;
1129
+ transition: all var(--duration-normal) var(--ease-standard);
1130
+ }
1131
+
1132
+ .workflow-card:hover {
1133
+ transform: translateY(-4px);
1134
+ box-shadow: var(--shadow-lg);
1135
+ }
1136
+
1137
+ .workflow-header {
1138
+ padding: var(--space-16);
1139
+ color: white;
1140
+ display: flex;
1141
+ align-items: center;
1142
+ gap: var(--space-12);
1143
+ }
1144
+
1145
+ .workflow-header h4 {
1146
+ color: white;
1147
+ margin: 0;
1148
+ }
1149
+
1150
+ .workflow-body {
1151
+ padding: var(--space-16);
1152
+ }
1153
+
1154
+ .workflow-steps {
1155
+ display: flex;
1156
+ align-items: center;
1157
+ gap: var(--space-8);
1158
+ flex-wrap: wrap;
1159
+ }
1160
+
1161
+ .workflow-step {
1162
+ background: var(--color-secondary);
1163
+ padding: var(--space-8) var(--space-12);
1164
+ border-radius: var(--radius-base);
1165
+ font-size: var(--font-size-sm);
1166
+ flex: 1;
1167
+ min-width: 80px;
1168
+ text-align: center;
1169
+ }
1170
+
1171
+ .workflow-arrow {
1172
+ font-size: var(--font-size-lg);
1173
+ color: var(--color-text-secondary);
1174
+ }
1175
+
1176
+ .details-grid {
1177
+ display: grid;
1178
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
1179
+ gap: var(--space-24);
1180
+ }
1181
+
1182
+ .detail-card {
1183
+ background: var(--color-surface);
1184
+ border-radius: var(--radius-lg);
1185
+ border: 1px solid var(--color-border);
1186
+ overflow: hidden;
1187
+ transition: all var(--duration-normal) var(--ease-standard);
1188
+ }
1189
+
1190
+ .detail-card:hover {
1191
+ transform: translateY(-4px);
1192
+ box-shadow: var(--shadow-lg);
1193
+ }
1194
+
1195
+ .detail-header {
1196
+ padding: var(--space-16);
1197
+ color: white;
1198
+ display: flex;
1199
+ align-items: center;
1200
+ gap: var(--space-12);
1201
+ }
1202
+
1203
+ .detail-header h4 {
1204
+ color: white;
1205
+ margin: 0;
1206
+ }
1207
+
1208
+ .detail-body {
1209
+ padding: var(--space-16);
1210
+ }
1211
+
1212
+ .detail-section {
1213
+ margin-bottom: var(--space-16);
1214
+ }
1215
+
1216
+ .detail-section:last-child {
1217
+ margin-bottom: 0;
1218
+ }
1219
+
1220
+ .detail-section h5 {
1221
+ color: var(--color-text-secondary);
1222
+ font-size: var(--font-size-xs);
1223
+ text-transform: uppercase;
1224
+ letter-spacing: 0.05em;
1225
+ margin-bottom: var(--space-8);
1226
+ }
1227
+
1228
+ .complexity-badge {
1229
+ display: inline-flex;
1230
+ align-items: center;
1231
+ padding: var(--space-4) var(--space-8);
1232
+ border-radius: var(--radius-full);
1233
+ font-size: var(--font-size-xs);
1234
+ font-weight: var(--font-weight-medium);
1235
+ text-transform: uppercase;
1236
+ letter-spacing: 0.05em;
1237
+ }
1238
+
1239
+ .complexity-low {
1240
+ background: rgba(52, 211, 153, 0.1);
1241
+ color: var(--color-success);
1242
+ }
1243
+
1244
+ .complexity-medium {
1245
+ background: rgba(251, 191, 36, 0.1);
1246
+ color: var(--color-warning);
1247
+ }
1248
+
1249
+ .complexity-high {
1250
+ background: rgba(239, 68, 68, 0.1);
1251
+ color: var(--color-error);
1252
+ }
1253
+
1254
+ .complexity-very-high {
1255
+ background: rgba(147, 51, 234, 0.1);
1256
+ color: var(--color-agent);
1257
+ }
1258
+
1259
+ .recommendations-grid {
1260
+ display: grid;
1261
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
1262
+ gap: var(--space-24);
1263
+ }
1264
+
1265
+ .recommendation-card {
1266
+ background: var(--color-surface);
1267
+ border-radius: var(--radius-lg);
1268
+ border: 1px solid var(--color-border);
1269
+ padding: var(--space-20);
1270
+ transition: all var(--duration-normal) var(--ease-standard);
1271
+ }
1272
+
1273
+ .recommendation-card:hover {
1274
+ transform: translateY(-4px);
1275
+ box-shadow: var(--shadow-lg);
1276
+ }
1277
+
1278
+ .recommendation-scenario {
1279
+ font-weight: var(--font-weight-semibold);
1280
+ color: var(--color-text);
1281
+ margin-bottom: var(--space-8);
1282
+ }
1283
+
1284
+ .recommendation-approach {
1285
+ font-size: var(--font-size-lg);
1286
+ font-weight: var(--font-weight-semibold);
1287
+ margin-bottom: var(--space-8);
1288
+ }
1289
+
1290
+ .recommendation-reason {
1291
+ color: var(--color-text-secondary);
1292
+ font-size: var(--font-size-sm);
1293
+ line-height: 1.4;
1294
+ }
1295
+
1296
+ .footer {
1297
+ text-align: center;
1298
+ padding: var(--space-24) 0;
1299
+ border-top: 1px solid var(--color-border);
1300
+ color: var(--color-text-secondary);
1301
+ font-size: var(--font-size-sm);
1302
+ }
1303
+
1304
+ .footer p {
1305
+ margin: 0;
1306
+ }
1307
+
1308
+ /* Approach-specific colors */
1309
+ .llm-workflow {
1310
+ background: var(--color-gradient-1);
1311
+ }
1312
+
1313
+ .rag {
1314
+ background: var(--color-gradient-2);
1315
+ }
1316
+
1317
+ .ai-agent {
1318
+ background: var(--color-gradient-3);
1319
+ }
1320
+
1321
+ .agentic-ai {
1322
+ background: var(--color-gradient-4);
1323
+ }
1324
+
1325
+ /* Responsive design */
1326
+ @media (max-width: 768px) {
1327
+ .header {
1328
+ padding: var(--space-24) var(--space-16);
1329
+ }
1330
+
1331
+ .header h1 {
1332
+ font-size: var(--font-size-3xl);
1333
+ }
1334
+
1335
+ .filters-grid {
1336
+ grid-template-columns: 1fr;
1337
+ }
1338
+
1339
+ .workflows-grid,
1340
+ .details-grid,
1341
+ .recommendations-grid {
1342
+ grid-template-columns: 1fr;
1343
+ }
1344
+
1345
+ .workflow-steps {
1346
+ flex-direction: column;
1347
+ align-items: stretch;
1348
+ }
1349
+
1350
+ .workflow-arrow {
1351
+ transform: rotate(90deg);
1352
+ }
1353
+ }
1354
+
1355
+ /* Animation keyframes */
1356
+ @keyframes fadeIn {
1357
+ from {
1358
+ opacity: 0;
1359
+ transform: translateY(20px);
1360
+ }
1361
+ to {
1362
+ opacity: 1;
1363
+ transform: translateY(0);
1364
+ }
1365
+ }
1366
+
1367
+ .fade-in {
1368
+ animation: fadeIn 0.5s ease-out;
1369
+ }
1370
+
1371
+ /* Hidden utility */
1372
+ .hidden {
1373
+ display: none;
1374
+ }
1375
+
1376
+ @font-face {
1377
+ font-family: 'FKGroteskNeue';
1378
+ src: url('https://r2cdn.perplexity.ai/fonts/FKGroteskNeue.woff2')
1379
+ format('woff2');
1380
+ }