ltcai 4.0.0 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. package/README.md +42 -33
  2. package/desktop/electron/main.cjs +44 -0
  3. package/docs/CHANGELOG.md +106 -0
  4. package/docs/REALTIME_COLLABORATION.md +3 -3
  5. package/docs/V3_FRONTEND.md +9 -8
  6. package/docs/V4_1_FRONTEND_ARCHITECTURE_REVIEW.md +65 -0
  7. package/docs/V4_1_FRONTEND_MIGRATION_REPORT.md +70 -0
  8. package/docs/V4_1_VALIDATION_REPORT.md +47 -0
  9. package/docs/V4_DIGITAL_BRAIN_RECOVERY.md +95 -45
  10. package/docs/kg-schema.md +6 -2
  11. package/docs/spec-vs-impl.md +10 -10
  12. package/frontend/index.html +24 -0
  13. package/frontend/openapi.json +14190 -0
  14. package/frontend/src/App.tsx +184 -0
  15. package/frontend/src/api/client.ts +317 -0
  16. package/frontend/src/api/openapi.ts +16637 -0
  17. package/frontend/src/components/primitives.tsx +204 -0
  18. package/frontend/src/components/ui/badge.tsx +27 -0
  19. package/frontend/src/components/ui/button.tsx +37 -0
  20. package/frontend/src/components/ui/card.tsx +22 -0
  21. package/frontend/src/components/ui/input.tsx +16 -0
  22. package/frontend/src/components/ui/textarea.tsx +16 -0
  23. package/frontend/src/lib/utils.ts +33 -0
  24. package/frontend/src/main.tsx +23 -0
  25. package/frontend/src/pages/Act.tsx +245 -0
  26. package/frontend/src/pages/Ask.tsx +200 -0
  27. package/frontend/src/pages/Brain.tsx +267 -0
  28. package/frontend/src/pages/Capture.tsx +158 -0
  29. package/frontend/src/pages/Library.tsx +187 -0
  30. package/frontend/src/pages/System.tsx +344 -0
  31. package/frontend/src/routes.ts +85 -0
  32. package/frontend/src/store/appStore.ts +54 -0
  33. package/frontend/src/styles.css +107 -0
  34. package/kg_schema.py +2 -603
  35. package/knowledge_graph.py +37 -4958
  36. package/latticeai/__init__.py +1 -1
  37. package/latticeai/api/admin.py +15 -16
  38. package/latticeai/api/agents.py +13 -6
  39. package/latticeai/api/auth.py +19 -11
  40. package/latticeai/api/invitations.py +100 -0
  41. package/latticeai/api/knowledge_graph.py +4 -11
  42. package/latticeai/api/plugins.py +3 -6
  43. package/latticeai/api/realtime.py +4 -7
  44. package/latticeai/api/setup.py +5 -4
  45. package/latticeai/api/static_routes.py +13 -16
  46. package/latticeai/api/ui_redirects.py +26 -0
  47. package/latticeai/api/workflow_designer.py +39 -6
  48. package/latticeai/api/workspace.py +24 -10
  49. package/latticeai/app_factory.py +88 -17
  50. package/latticeai/brain/_kg_common.py +1123 -0
  51. package/latticeai/brain/discovery.py +1455 -0
  52. package/latticeai/brain/documents.py +218 -0
  53. package/latticeai/brain/ingest.py +644 -0
  54. package/latticeai/brain/projection.py +561 -0
  55. package/latticeai/brain/provenance.py +401 -0
  56. package/latticeai/brain/retrieval.py +1316 -0
  57. package/latticeai/brain/schema.py +640 -0
  58. package/latticeai/brain/store.py +216 -0
  59. package/latticeai/brain/write_master.py +225 -0
  60. package/latticeai/core/invitations.py +131 -0
  61. package/latticeai/core/marketplace.py +1 -1
  62. package/latticeai/core/multi_agent.py +1 -1
  63. package/latticeai/core/policy.py +54 -0
  64. package/latticeai/core/realtime.py +65 -44
  65. package/latticeai/core/sessions.py +31 -5
  66. package/latticeai/core/users.py +147 -0
  67. package/latticeai/core/workspace_os.py +420 -20
  68. package/latticeai/services/agent_runtime.py +242 -4
  69. package/latticeai/services/run_executor.py +328 -0
  70. package/latticeai/services/workspace_service.py +27 -19
  71. package/package.json +54 -27
  72. package/scripts/build_frontend_assets.mjs +38 -0
  73. package/scripts/bump_version.py +1 -1
  74. package/scripts/export_openapi.py +31 -0
  75. package/scripts/lint_frontend.mjs +86 -0
  76. package/scripts/run_python.mjs +47 -0
  77. package/src-tauri/Cargo.lock +4833 -0
  78. package/src-tauri/Cargo.toml +19 -0
  79. package/src-tauri/build.rs +3 -0
  80. package/src-tauri/capabilities/default.json +7 -0
  81. package/src-tauri/src/main.rs +78 -0
  82. package/src-tauri/tauri.conf.json +36 -0
  83. package/static/app/asset-manifest.json +32 -0
  84. package/static/app/assets/core-CwxXejkd.js +2 -0
  85. package/static/app/assets/core-CwxXejkd.js.map +1 -0
  86. package/static/app/assets/index-CJRAzNnf.js +333 -0
  87. package/static/app/assets/index-CJRAzNnf.js.map +1 -0
  88. package/static/app/assets/index-CSwBBgf4.css +2 -0
  89. package/static/app/index.html +25 -0
  90. package/static/manifest.json +2 -2
  91. package/static/sw.js +4 -4
  92. package/scripts/build_v3_assets.mjs +0 -170
  93. package/scripts/lint_v3.mjs +0 -97
  94. package/static/account.html +0 -113
  95. package/static/activity.html +0 -73
  96. package/static/admin.html +0 -486
  97. package/static/agents.html +0 -139
  98. package/static/chat.html +0 -841
  99. package/static/css/reference/account.css +0 -439
  100. package/static/css/reference/admin.css +0 -610
  101. package/static/css/reference/base.css +0 -1661
  102. package/static/css/reference/chat.css +0 -4623
  103. package/static/css/reference/graph.css +0 -1016
  104. package/static/css/responsive.css +0 -861
  105. package/static/graph.html +0 -122
  106. package/static/platform.css +0 -104
  107. package/static/plugins.html +0 -136
  108. package/static/scripts/account.js +0 -238
  109. package/static/scripts/admin.js +0 -1614
  110. package/static/scripts/chat.js +0 -5081
  111. package/static/scripts/graph.js +0 -1804
  112. package/static/scripts/platform.js +0 -64
  113. package/static/scripts/ux.js +0 -167
  114. package/static/scripts/workspace.js +0 -948
  115. package/static/v3/asset-manifest.json +0 -56
  116. package/static/v3/css/lattice.base.49deefb5.css +0 -128
  117. package/static/v3/css/lattice.base.css +0 -128
  118. package/static/v3/css/lattice.components.cde18231.css +0 -472
  119. package/static/v3/css/lattice.components.css +0 -472
  120. package/static/v3/css/lattice.shell.29d36d85.css +0 -452
  121. package/static/v3/css/lattice.shell.css +0 -452
  122. package/static/v3/css/lattice.tokens.304cbc40.css +0 -135
  123. package/static/v3/css/lattice.tokens.css +0 -135
  124. package/static/v3/css/lattice.views.0a18b6c5.css +0 -360
  125. package/static/v3/css/lattice.views.css +0 -360
  126. package/static/v3/index.html +0 -68
  127. package/static/v3/js/app.356e6452.js +0 -26
  128. package/static/v3/js/app.js +0 -26
  129. package/static/v3/js/core/api.7a308b89.js +0 -568
  130. package/static/v3/js/core/api.js +0 -568
  131. package/static/v3/js/core/components.f25b3b93.js +0 -230
  132. package/static/v3/js/core/components.js +0 -230
  133. package/static/v3/js/core/dom.a2773eb0.js +0 -148
  134. package/static/v3/js/core/dom.js +0 -148
  135. package/static/v3/js/core/router.584570f2.js +0 -37
  136. package/static/v3/js/core/router.js +0 -37
  137. package/static/v3/js/core/routes.7222343d.js +0 -93
  138. package/static/v3/js/core/routes.js +0 -93
  139. package/static/v3/js/core/shell.a1657f20.js +0 -391
  140. package/static/v3/js/core/shell.js +0 -391
  141. package/static/v3/js/core/store.204a08b2.js +0 -113
  142. package/static/v3/js/core/store.js +0 -113
  143. package/static/v3/js/views/admin-audit.660a1fb1.js +0 -185
  144. package/static/v3/js/views/admin-audit.js +0 -185
  145. package/static/v3/js/views/admin-permissions.a7ae5f09.js +0 -177
  146. package/static/v3/js/views/admin-permissions.js +0 -177
  147. package/static/v3/js/views/admin-policies.3658fd86.js +0 -102
  148. package/static/v3/js/views/admin-policies.js +0 -102
  149. package/static/v3/js/views/admin-private-vpc.7d342d36.js +0 -135
  150. package/static/v3/js/views/admin-private-vpc.js +0 -135
  151. package/static/v3/js/views/admin-security.07c66b72.js +0 -180
  152. package/static/v3/js/views/admin-security.js +0 -180
  153. package/static/v3/js/views/admin-users.03bac88c.js +0 -168
  154. package/static/v3/js/views/admin-users.js +0 -168
  155. package/static/v3/js/views/agents.014d0b74.js +0 -541
  156. package/static/v3/js/views/agents.js +0 -541
  157. package/static/v3/js/views/chat.e6dd7dd0.js +0 -601
  158. package/static/v3/js/views/chat.js +0 -601
  159. package/static/v3/js/views/files.adad14c1.js +0 -365
  160. package/static/v3/js/views/files.js +0 -365
  161. package/static/v3/js/views/graph-canvas.17c15d65.js +0 -509
  162. package/static/v3/js/views/graph-canvas.js +0 -509
  163. package/static/v3/js/views/home.24f8b8ae.js +0 -200
  164. package/static/v3/js/views/home.js +0 -200
  165. package/static/v3/js/views/hooks.37895880.js +0 -220
  166. package/static/v3/js/views/hooks.js +0 -220
  167. package/static/v3/js/views/hybrid-search.2fb63ed9.js +0 -194
  168. package/static/v3/js/views/hybrid-search.js +0 -194
  169. package/static/v3/js/views/knowledge-graph.5e40cbeb.js +0 -509
  170. package/static/v3/js/views/knowledge-graph.js +0 -509
  171. package/static/v3/js/views/marketplace.ab0583d4.js +0 -141
  172. package/static/v3/js/views/marketplace.js +0 -141
  173. package/static/v3/js/views/mcp.99b5c6a7.js +0 -114
  174. package/static/v3/js/views/mcp.js +0 -114
  175. package/static/v3/js/views/memory.4ebdf474.js +0 -147
  176. package/static/v3/js/views/memory.js +0 -147
  177. package/static/v3/js/views/models.a1ffa147.js +0 -256
  178. package/static/v3/js/views/models.js +0 -256
  179. package/static/v3/js/views/my-computer.d9d9ae1c.js +0 -463
  180. package/static/v3/js/views/my-computer.js +0 -463
  181. package/static/v3/js/views/pipeline.c522f1ce.js +0 -157
  182. package/static/v3/js/views/pipeline.js +0 -157
  183. package/static/v3/js/views/planning.9ac3e313.js +0 -153
  184. package/static/v3/js/views/planning.js +0 -153
  185. package/static/v3/js/views/settings.8631fa5e.js +0 -318
  186. package/static/v3/js/views/settings.js +0 -318
  187. package/static/v3/js/views/skills.c6c2f965.js +0 -109
  188. package/static/v3/js/views/skills.js +0 -109
  189. package/static/v3/js/views/tools.e4f11276.js +0 -108
  190. package/static/v3/js/views/tools.js +0 -108
  191. package/static/v3/js/views/workflows.26c57290.js +0 -128
  192. package/static/v3/js/views/workflows.js +0 -128
  193. package/static/workflows.html +0 -146
  194. package/static/workspace.css +0 -1121
  195. package/static/workspace.html +0 -357
@@ -1,4623 +0,0 @@
1
- /* Lattice AI — chat workspace (chat.html, body.lattice-ref-chat): shell, sidebar, header, input, cards, modals, drawers, panels, onboarding. Token-native. */
2
- /* ============================================================
3
- CHAT PAGE (chat.html)
4
- ============================================================ */
5
-
6
- * { box-sizing: border-box; margin: 0; padding: 0; }
7
-
8
- body.lattice-ref-chat {
9
- font-family: 'Inter', -apple-system, sans-serif;
10
- background: var(--app-bg);
11
- color: var(--text);
12
- overflow: hidden;
13
- }
14
-
15
- /* ── 배경 장식 도형 ── */
16
- body::before {
17
- content: '';
18
- position: fixed;
19
- inset: 0;
20
- pointer-events: none;
21
- z-index: 0;
22
- background: var(--app-bg);
23
- }
24
-
25
- .bg-shapes {
26
- position: fixed;
27
- inset: 0;
28
- pointer-events: none;
29
- z-index: 0;
30
- overflow: hidden;
31
- }
32
- .bg-orb {
33
- display: none;
34
- position: absolute;
35
- border-radius: 50%;
36
- filter: blur(80px);
37
- opacity: 0.18;
38
- }
39
- .bg-orb-1 {
40
- width: 500px; height: 500px;
41
- top: -180px; left: -120px;
42
- background: radial-gradient(circle, #9a78f0, transparent 70%);
43
- opacity: 0.14;
44
- }
45
- .bg-orb-2 {
46
- width: 600px; height: 600px;
47
- bottom: -200px; right: -150px;
48
- background: radial-gradient(circle, #b4a0fd, transparent 70%);
49
- opacity: 0.11;
50
- }
51
- .bg-orb-3 {
52
- width: 300px; height: 300px;
53
- top: 40%; left: 55%;
54
- background: radial-gradient(circle, #f472b6, transparent 70%);
55
- opacity: 0.07;
56
- }
57
- .bg-grid {
58
- position: fixed;
59
- inset: 0;
60
- pointer-events: none;
61
- z-index: 0;
62
- opacity: 0.05;
63
- background-image:
64
- linear-gradient(var(--line) 1px, transparent 1px),
65
- linear-gradient(90deg, var(--line) 1px, transparent 1px);
66
- background-size: 48px 48px;
67
- }
68
- .app-layout, .auth-overlay { position: relative; z-index: 1; }
69
-
70
- .app-layout {
71
- display: flex;
72
- height: 100dvh;
73
- width: 100vw;
74
- }
75
-
76
- /* ── 사이드바 ── */
77
- .sidebar {
78
- width: 268px;
79
- background: var(--sidebar);
80
- border-right: 1px solid rgba(111,66,232,0.13);
81
- display: flex;
82
- flex-direction: column;
83
- min-width: 240px;
84
- backdrop-filter: none; /* glass removed v3.5.0 */
85
- -webkit-backdrop-filter: none; /* glass removed v3.5.0 */
86
- }
87
-
88
- .sidebar-header {
89
- padding: 20px 18px 16px;
90
- display: flex;
91
- align-items: center;
92
- gap: 12px;
93
- border-bottom: 1px solid rgba(111,66,232,0.10);
94
- position: relative;
95
- }
96
-
97
- .logo-box {
98
- width: 38px;
99
- height: 38px;
100
- background: linear-gradient(135deg, var(--accent) 0%, #9a78f0 100%);
101
- border-radius: 10px;
102
- display: flex;
103
- align-items: center;
104
- justify-content: center;
105
- color: #fff;
106
- font-weight: 800;
107
- font-size: 18px;
108
- box-shadow: 0 8px 20px rgba(111,66,232,0.28);
109
- flex-shrink: 0;
110
- }
111
-
112
- .brand-title {
113
- font-size: 15px;
114
- font-weight: 800;
115
- letter-spacing: -0.02em;
116
- color: var(--text);
117
- }
118
-
119
- .brand-subtitle {
120
- color: var(--accent);
121
- font-size: 10.5px;
122
- margin-top: 1px;
123
- letter-spacing: 0.03em;
124
- }
125
-
126
- .user-strip {
127
- padding: 10px 18px;
128
- font-size: 12px;
129
- color: var(--muted);
130
- border-bottom: 1px solid rgba(111,66,232,0.10);
131
- display: flex;
132
- align-items: center;
133
- gap: 8px;
134
- }
135
-
136
- .user-avatar {
137
- width: 26px; height: 26px;
138
- border-radius: 50%;
139
- background: linear-gradient(135deg, var(--accent), #9a78f0);
140
- display: flex; align-items: center; justify-content: center;
141
- font-size: 11px; font-weight: 700; color: #fff;
142
- flex-shrink: 0;
143
- }
144
-
145
- .sidebar-search {
146
- padding: 8px 10px;
147
- border-bottom: 1px solid rgba(111,66,232,0.10);
148
- }
149
- .sidebar-search input {
150
- width: 100%;
151
- padding: 7px 10px 7px 30px;
152
- background: var(--input);
153
- border: 1px solid var(--border);
154
- border-radius: 8px;
155
- color: var(--text);
156
- font-size: 12px;
157
- font-family: inherit;
158
- outline: none;
159
- transition: border-color .15s;
160
- }
161
- .sidebar-search input:focus { border-color: rgba(111,66,232,0.45); }
162
- .sidebar-search input::placeholder { color: var(--faint); }
163
- .sidebar-search-wrap {
164
- position: relative;
165
- }
166
- .sidebar-search-wrap i {
167
- position: absolute;
168
- left: 8px; top: 50%;
169
- transform: translateY(-50%);
170
- color: var(--faint);
171
- font-size: 13px;
172
- pointer-events: none;
173
- }
174
- .history-item-del {
175
- margin-left: auto;
176
- opacity: 0;
177
- color: var(--faint);
178
- font-size: 13px;
179
- padding: 2px 4px;
180
- border-radius: 4px;
181
- transition: all .15s;
182
- flex-shrink: 0;
183
- }
184
- .history-item:hover .history-item-del { opacity: 1; }
185
- .history-item-del:hover { color: #ff6b6b; background: rgba(255,107,107,0.12); }
186
-
187
- .history-container {
188
- flex: 1;
189
- overflow-y: auto;
190
- padding: 10px;
191
- }
192
-
193
- .history-section-label {
194
- font-size: 10px;
195
- font-weight: 700;
196
- color: var(--faint);
197
- letter-spacing: 0.08em;
198
- text-transform: uppercase;
199
- padding: 8px 6px 4px;
200
- }
201
-
202
- .history-empty {
203
- color: var(--faint);
204
- font-size: 12px;
205
- line-height: 1.5;
206
- padding: 10px 8px;
207
- }
208
-
209
- .history-item {
210
- padding: 9px 11px;
211
- border-radius: var(--radius-sm);
212
- cursor: pointer;
213
- font-size: 12.5px;
214
- color: var(--muted);
215
- white-space: nowrap;
216
- overflow: hidden;
217
- text-overflow: ellipsis;
218
- margin-bottom: 2px;
219
- border: 1px solid transparent;
220
- border-left: 2px solid transparent;
221
- transition: all .15s;
222
- display: flex;
223
- align-items: center;
224
- gap: 8px;
225
- }
226
-
227
- .history-item::before {
228
- content: '';
229
- width: 4px; height: 4px;
230
- border-radius: 50%;
231
- background: rgba(111,66,232,0.4);
232
- flex-shrink: 0;
233
- transition: all .15s;
234
- }
235
-
236
- .history-item:hover {
237
- background: rgba(111,66,232,0.06);
238
- color: var(--text);
239
- border-left-color: var(--accent);
240
- }
241
- .history-item:hover::before { background: var(--accent); }
242
- .history-item.active {
243
- background: rgba(111,66,232,0.08);
244
- color: var(--text);
245
- border-color: rgba(111,66,232,0.16);
246
- border-left-color: var(--accent);
247
- }
248
- .history-item.active::before { background: var(--accent); }
249
-
250
- .sidebar-footer {
251
- padding: 14px;
252
- border-top: 1px solid rgba(111,66,232,0.10);
253
- display: flex;
254
- flex-direction: column;
255
- gap: 6px;
256
- }
257
-
258
- .new-chat-btn {
259
- width: 100%;
260
- padding: 11px 12px;
261
- border-radius: var(--radius-sm);
262
- background: var(--surface-2);
263
- border: 1px solid rgba(111,66,232,0.20);
264
- color: var(--text);
265
- cursor: pointer;
266
- display: flex;
267
- align-items: center;
268
- justify-content: center;
269
- gap: 8px;
270
- font-weight: 700;
271
- font-size: 13px;
272
- transition: all .18s;
273
- }
274
- .new-chat-btn:hover {
275
- background: rgba(111,66,232,0.10);
276
- border-color: rgba(111,66,232,0.36);
277
- box-shadow: 0 0 16px var(--accent-soft);
278
- }
279
-
280
- .sidebar-primary-actions {
281
- padding: 8px 10px 10px;
282
- border-bottom: 1px solid rgba(111,66,232,0.10);
283
- }
284
-
285
- .admin-btn {
286
- width: 100%;
287
- padding: 9px 12px;
288
- border-radius: var(--radius-sm);
289
- background: linear-gradient(135deg, rgba(240,168,50,0.1), rgba(244,114,182,0.06));
290
- border: 1px solid rgba(240,168,50,0.25);
291
- color: var(--accent-2);
292
- cursor: pointer;
293
- display: flex;
294
- align-items: center;
295
- justify-content: center;
296
- gap: 8px;
297
- font-weight: 700;
298
- font-size: 12.5px;
299
- transition: all .15s;
300
- }
301
- .admin-btn:hover {
302
- background: linear-gradient(135deg, rgba(240,168,50,0.18), rgba(244,114,182,0.1));
303
- border-color: rgba(240,168,50,0.45);
304
- }
305
-
306
- .status-btn {
307
- width: 100%;
308
- padding: 9px 12px;
309
- border-radius: var(--radius-sm);
310
- background: rgba(129,140,248,0.08);
311
- border: 1px solid rgba(129,140,248,0.2);
312
- color: var(--accent-3);
313
- cursor: pointer;
314
- display: flex;
315
- align-items: center;
316
- justify-content: center;
317
- gap: 8px;
318
- font-weight: 600;
319
- font-size: 12.5px;
320
- transition: all .15s;
321
- }
322
- .status-btn:hover {
323
- background: rgba(129,140,248,0.15);
324
- border-color: rgba(129,140,248,0.38);
325
- }
326
-
327
- /* ── 메인 채팅창 ── */
328
- .main-chat {
329
- flex: 1;
330
- display: flex;
331
- flex-direction: column;
332
- background: transparent;
333
- min-width: 0;
334
- }
335
-
336
- .chat-header {
337
- min-height: 60px;
338
- display: flex;
339
- align-items: center;
340
- justify-content: space-between;
341
- gap: 12px;
342
- padding: 10px 22px;
343
- border-bottom: 1px solid rgba(111,66,232,0.10);
344
- background: var(--sidebar);
345
- backdrop-filter: none; /* glass removed v3.5.0 */
346
- -webkit-backdrop-filter: none; /* glass removed v3.5.0 */
347
- position: relative;
348
- z-index: 50;
349
- }
350
-
351
- .header-left, .header-pills {
352
- display: flex;
353
- align-items: center;
354
- flex-wrap: wrap;
355
- }
356
- .header-left { gap: 7px; }
357
- .header-pills { gap: 7px; justify-content: flex-end; }
358
-
359
- .model-badge {
360
- display: inline-flex;
361
- align-items: center;
362
- gap: 8px;
363
- border: 1px solid rgba(111,66,232,0.20);
364
- background: rgba(111,66,232,0.07);
365
- border-radius: 999px;
366
- padding: 6px 14px 6px 10px;
367
- font-size: 13px;
368
- font-weight: 600;
369
- color: var(--text);
370
- }
371
-
372
- .status-pill {
373
- display: inline-flex;
374
- align-items: center;
375
- gap: 6px;
376
- border: 1px solid var(--border);
377
- background: var(--surface-2);
378
- border-radius: 999px;
379
- padding: 5px 11px;
380
- font-size: 11.5px;
381
- font-weight: 500;
382
- color: var(--muted);
383
- }
384
-
385
- .status-pill.vpc-ready {
386
- color: var(--accent);
387
- border-color: rgba(111,66,232,0.24);
388
- background: rgba(111,66,232,0.07);
389
- }
390
-
391
- .status-dot {
392
- width: 7px; height: 7px;
393
- background: var(--accent);
394
- border-radius: 50%;
395
- box-shadow: 0 0 8px var(--accent), 0 0 16px rgba(111,66,232,0.32);
396
- flex: 0 0 auto;
397
- animation: pulse-dot 2.5s ease-in-out infinite;
398
- }
399
-
400
- @keyframes pulse-dot {
401
- 0%, 100% { box-shadow: 0 0 6px var(--accent), 0 0 12px rgba(111,66,232,0.24); }
402
- 50% { box-shadow: 0 0 12px var(--accent), 0 0 24px rgba(111,66,232,0.40); }
403
- }
404
-
405
- .logout-btn {
406
- background: transparent;
407
- border: 1px solid transparent;
408
- color: var(--muted);
409
- cursor: pointer;
410
- font-size: 12px;
411
- border-radius: var(--radius-sm);
412
- padding: 6px 10px;
413
- transition: all .15s;
414
- }
415
- .logout-btn:hover {
416
- color: var(--text);
417
- border-color: rgba(255,255,255,0.08);
418
- background: var(--surface-2);
419
- }
420
-
421
- .acct-modal-overlay {
422
- display: none;
423
- position: fixed;
424
- inset: 0;
425
- background: rgba(111,66,232,0.18);
426
- backdrop-filter: none;
427
- z-index: 1000;
428
- align-items: center;
429
- justify-content: center;
430
- }
431
- .acct-modal-overlay.open { display: flex; }
432
-
433
- /* MCP 관리 모달 */
434
- .mcp-modal-overlay {
435
- display: none;
436
- position: fixed;
437
- inset: 0;
438
- background: rgba(111,66,232,0.18);
439
- backdrop-filter: none;
440
- z-index: 1000;
441
- align-items: center;
442
- justify-content: center;
443
- }
444
- .mcp-modal-overlay.open { display: flex; }
445
- .mcp-modal {
446
- background: var(--modal);
447
- border: 1px solid rgba(111,66,232,0.16);
448
- border-radius: 16px;
449
- width: 100%;
450
- max-width: 560px;
451
- max-height: 80vh;
452
- display: flex;
453
- flex-direction: column;
454
- box-shadow: 0 20px 60px rgba(88,72,150,0.20);
455
- overflow: hidden;
456
- }
457
- .mcp-modal-header {
458
- padding: 18px 20px;
459
- border-bottom: 1px solid var(--accent-soft);
460
- display: flex; align-items: center; justify-content: space-between;
461
- }
462
- .mcp-modal-header h3 { font-size: 15px; font-weight: 700; color: var(--text); }
463
- .mcp-modal-close { background: none; border: none; color: var(--faint); cursor: pointer; font-size: 18px; padding: 2px 6px; border-radius: 6px; }
464
- .mcp-modal-close:hover { color: var(--text); background: rgba(111,66,232,0.07); }
465
- .mcp-modal-body.lattice-ref-chat { flex: 1; overflow-y: auto; padding: 16px 20px; }
466
- .mcp-section-label { font-size: 10px; font-weight: 700; color: var(--faint); text-transform: uppercase; letter-spacing: .08em; margin: 12px 0 8px; }
467
- .mcp-item {
468
- display: flex; align-items: center; gap: 12px;
469
- padding: 11px 14px;
470
- background: var(--surface-2);
471
- border: 1px solid rgba(255,255,255,0.06);
472
- border-radius: 10px;
473
- margin-bottom: 6px;
474
- }
475
- .mcp-item-icon { font-size: 20px; flex-shrink: 0; }
476
- .mcp-item-info { flex: 1; min-width: 0; }
477
- .mcp-item-name { font-size: 13px; font-weight: 600; color: var(--text); }
478
- .mcp-item-desc { font-size: 11px; color: var(--faint); margin-top: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
479
- .mcp-item-status { font-size: 10.5px; color: var(--accent); font-weight: 600; }
480
- .mcp-item-status.inactive { color: var(--faint); }
481
- .mcp-install-btn {
482
- padding: 6px 12px; border-radius: 7px; font-size: 12px; font-weight: 600;
483
- border: 1px solid rgba(111,66,232,0.28); background: rgba(111,66,232,0.08);
484
- color: var(--accent); cursor: pointer; transition: all .15s; flex-shrink: 0;
485
- }
486
- .mcp-install-btn:hover { background: rgba(111,66,232,0.16); }
487
- .mcp-install-btn.installed { border-color: var(--accent-soft); background: rgba(255,255,255,0.60); color: var(--faint); }
488
- /* MCP 소스 배지 */
489
- .mcp-source-badge {
490
- font-size: 9.5px; font-weight: 700; padding: 2px 6px; border-radius: 4px;
491
- text-transform: uppercase; letter-spacing: .05em; flex-shrink: 0;
492
- }
493
- .mcp-source-badge.claude-code { background: rgba(100,180,255,0.12); color: #64b4ff; border: 1px solid rgba(100,180,255,0.2); }
494
- .mcp-source-badge.custom { background: rgba(255,180,60,0.12); color: #ffb43c; border: 1px solid rgba(255,180,60,0.2); }
495
- /* MCP 탭 */
496
- .mcp-tabs { display: flex; gap: 4px; padding: 12px 20px 0; border-bottom: 1px solid var(--border); }
497
- .mcp-tab {
498
- padding: 7px 14px; border-radius: 8px 8px 0 0; font-size: 12px; font-weight: 600;
499
- color: var(--faint); cursor: pointer; border: none; background: none;
500
- border-bottom: 2px solid transparent; transition: all .15s;
501
- }
502
- .mcp-tab.active { color: var(--accent); border-bottom-color: var(--accent); background: rgba(111,66,232,0.07); }
503
- .mcp-tab:hover:not(.active) { color: var(--text); background: rgba(111,66,232,0.05); }
504
- /* Custom MCP 추가 폼 */
505
- .mcp-add-form { display: flex; flex-direction: column; gap: 10px; padding: 4px 0; }
506
- .mcp-add-form label { font-size: 11px; font-weight: 600; color: var(--faint); text-transform: uppercase; letter-spacing: .06em; }
507
- .mcp-add-form input, .mcp-add-form textarea, .mcp-add-form select {
508
- width: 100%; padding: 8px 11px; border-radius: 8px; font-size: 13px;
509
- background: var(--input); border: 1px solid rgba(111,66,232,0.18);
510
- color: var(--text); outline: none; transition: border .15s; box-sizing: border-box;
511
- }
512
- .mcp-add-form input:focus, .mcp-add-form textarea:focus { border-color: rgba(111,66,232,0.45); }
513
- .mcp-add-form .field-hint { font-size: 10.5px; color: var(--faint); margin-top: -6px; }
514
- .mcp-submit-btn {
515
- padding: 9px 18px; border-radius: 8px; font-size: 13px; font-weight: 700;
516
- background: var(--accent-soft); border: 1px solid rgba(111,66,232,0.30);
517
- color: var(--accent); cursor: pointer; transition: all .15s; align-self: flex-end;
518
- }
519
- .mcp-submit-btn:hover { background: rgba(111,66,232,0.22); }
520
- .mcp-delete-btn {
521
- padding: 5px 10px; border-radius: 6px; font-size: 11px; font-weight: 600;
522
- background: rgba(255,80,80,0.08); border: 1px solid rgba(255,80,80,0.2);
523
- color: #ff6b6b; cursor: pointer; transition: all .15s; flex-shrink: 0;
524
- }
525
- .mcp-delete-btn:hover { background: rgba(255,80,80,0.18); }
526
- .acct-modal {
527
- background: var(--modal);
528
- border: 1px solid rgba(111,66,232,0.16);
529
- border-radius: 16px;
530
- width: 100%;
531
- max-width: 380px;
532
- display: flex;
533
- flex-direction: column;
534
- box-shadow: 0 20px 60px rgba(88,72,150,0.20);
535
- overflow: hidden;
536
- }
537
- .acct-tabs {
538
- display: flex;
539
- border-bottom: 1px solid var(--accent-soft);
540
- }
541
- .acct-tab {
542
- flex: 1; padding: 14px; font-size: 13px; font-weight: 500;
543
- background: none; border: none; color: var(--muted); cursor: pointer;
544
- transition: all .15s; border-bottom: 2px solid transparent;
545
- }
546
- .acct-tab.active { color: var(--text, var(--text)); border-bottom-color: var(--accent, #6366f1); }
547
- .acct-body.lattice-ref-chat { padding: 24px; display: flex; flex-direction: column; gap: 14px; }
548
- .acct-tab-panel { display: none; flex-direction: column; gap: 14px; }
549
- .acct-tab-panel.active { display: flex; }
550
- .pw-field { display: flex; flex-direction: column; gap: 5px; }
551
- .pw-field label { font-size: 11px; color: var(--muted); }
552
- .pw-field input {
553
- background: var(--input);
554
- border: 1px solid rgba(111,66,232,0.18);
555
- border-radius: 8px;
556
- color: var(--text, var(--text));
557
- padding: 8px 12px;
558
- font-size: 13px;
559
- outline: none;
560
- transition: border-color .15s;
561
- }
562
- .pw-field input:focus { border-color: var(--accent, #6366f1); }
563
- .pw-actions { display: flex; gap: 8px; }
564
- .pw-actions button {
565
- flex: 1; padding: 8px; border-radius: 8px; border: none;
566
- cursor: pointer; font-size: 13px; font-weight: 500; transition: all .15s;
567
- }
568
- .pw-cancel { background: rgba(111,66,232,0.08); color: var(--muted); }
569
- .pw-cancel:hover { background: rgba(111,66,232,0.13); }
570
- .pw-submit { background: var(--accent, #6366f1); color: #fff; }
571
- .pw-submit:hover { opacity: 0.85; }
572
- .pw-msg { font-size: 12px; min-height: 16px; }
573
- .pw-msg.error { color: #f87171; }
574
- .pw-msg.success { color: var(--success); }
575
-
576
- .lang-picker { position: relative; }
577
- .lang-picker-menu {
578
- display: none;
579
- position: absolute;
580
- top: calc(100% + 6px);
581
- right: 0;
582
- background: var(--surface-elevated);
583
- border: 1px solid rgba(111,66,232,0.16);
584
- border-radius: 10px;
585
- overflow: hidden;
586
- box-shadow: 0 8px 24px rgba(88,72,150,0.16);
587
- z-index: 200;
588
- min-width: 90px;
589
- }
590
- .lang-picker-menu.open { display: block; }
591
- .lang-option {
592
- display: flex; align-items: center; gap: 8px;
593
- padding: 9px 14px; font-size: 13px; cursor: pointer;
594
- color: var(--muted); transition: background .12s;
595
- }
596
- .lang-option:hover { background: rgba(111,66,232,0.07); color: var(--text, var(--text)); }
597
- .lang-option.active { color: var(--accent, #6366f1); font-weight: 600; }
598
-
599
- .auth-lang-picker {
600
- position: absolute; top: 20px; right: 20px;
601
- }
602
- .auth-lang-btn {
603
- background: rgba(255,255,255,0.07);
604
- border: 1px solid rgba(255,255,255,0.12);
605
- color: var(--faint); font-size: 12px; padding: 5px 10px;
606
- border-radius: 8px; cursor: pointer; transition: all .15s;
607
- }
608
- .auth-lang-btn:hover { background: rgba(255,255,255,0.12); color: var(--surface); }
609
- .auth-lang-picker .lang-picker-menu { top: calc(100% + 6px); right: 0; }
610
-
611
- .messages-viewport {
612
- flex: 1;
613
- overflow-y: auto;
614
- padding: 20px 20px 20px;
615
- scroll-behavior: smooth;
616
- }
617
-
618
- .ops-strip {
619
- max-width: var(--content-width);
620
- width: calc(100% - 40px);
621
- margin: 16px auto 0;
622
- display: grid;
623
- grid-template-columns: 1.15fr 1fr 0.9fr;
624
- gap: 10px;
625
- }
626
-
627
- .ops-card {
628
- min-width: 0;
629
- overflow: hidden;
630
- border: 1px solid rgba(219,235,255,0.16);
631
- background: rgba(34,48,68,0.86);
632
- border-radius: var(--radius);
633
- padding: 14px 16px;
634
- display: flex;
635
- align-items: center;
636
- justify-content: space-between;
637
- gap: 12px;
638
- box-shadow: var(--shadow-sm), inset 0 1px 0 rgba(255,255,255,0.80);
639
- backdrop-filter: none; /* glass removed v3.5.0 */
640
- transition: all .2s;
641
- }
642
-
643
- .ops-card.primary {
644
- border-color: rgba(111,66,232,0.18);
645
- background: linear-gradient(135deg, rgba(111,66,232,0.10) 0%, var(--card) 60%);
646
- box-shadow: var(--shadow-sm), var(--glow-green), inset 0 1px 0 rgba(111,66,232,0.08);
647
- }
648
-
649
- .ops-card.interactive { cursor: pointer; }
650
-
651
- .ops-card.interactive:hover {
652
- transform: translateY(-2px);
653
- border-color: rgba(111,66,232,0.32);
654
- background: linear-gradient(135deg, var(--border) 0%, var(--card) 60%);
655
- box-shadow: var(--shadow), 0 0 30px var(--border);
656
- }
657
-
658
- .ops-label {
659
- color: var(--faint);
660
- font-size: 10px;
661
- font-weight: 700;
662
- letter-spacing: 0.08em;
663
- text-transform: uppercase;
664
- margin-bottom: 5px;
665
- }
666
-
667
- .ops-value {
668
- color: var(--text);
669
- font-size: 13.5px;
670
- font-weight: 700;
671
- white-space: nowrap;
672
- overflow: hidden;
673
- text-overflow: ellipsis;
674
- }
675
-
676
- .ops-meta {
677
- color: var(--faint);
678
- font-size: 11px;
679
- margin-top: 4px;
680
- white-space: nowrap;
681
- overflow: hidden;
682
- text-overflow: ellipsis;
683
- }
684
-
685
- .ops-icon {
686
- width: 42px; height: 42px;
687
- flex: 0 0 42px;
688
- border-radius: 11px;
689
- display: flex;
690
- align-items: center;
691
- justify-content: center;
692
- font-size: 20px;
693
- }
694
-
695
- .ops-card.primary .ops-icon {
696
- background: linear-gradient(135deg, rgba(111,66,232,0.18), rgba(129,140,248,0.14));
697
- border: 1px solid rgba(111,66,232,0.20);
698
- color: var(--accent);
699
- box-shadow: 0 0 16px rgba(111,66,232,0.16);
700
- }
701
-
702
- .ops-card:not(.primary) .ops-icon {
703
- background: var(--card);
704
- border: 1px solid var(--border);
705
- color: var(--accent-3);
706
- }
707
-
708
- .ops-card > div:first-child { min-width: 0; }
709
-
710
- @keyframes fadeIn {
711
- from { opacity: 0; transform: translateY(8px); }
712
- to { opacity: 1; transform: translateY(0); }
713
- }
714
-
715
- @keyframes slideInRight {
716
- from { opacity: 0; transform: translateX(12px); }
717
- to { opacity: 1; transform: translateX(0); }
718
- }
719
-
720
- @keyframes slideInLeft {
721
- from { opacity: 0; transform: translateX(-12px); }
722
- to { opacity: 1; transform: translateX(0); }
723
- }
724
-
725
- .message {
726
- margin-bottom: 18px;
727
- display: flex;
728
- flex-direction: column;
729
- width: 100%;
730
- max-width: var(--content-width);
731
- margin-left: auto;
732
- margin-right: auto;
733
- animation: fadeIn .25s ease;
734
- }
735
-
736
- .message.user { align-items: flex-end; animation: slideInRight .22s ease; }
737
- .message.ai { align-items: flex-start; animation: slideInLeft .22s ease; }
738
-
739
- .sender-label {
740
- font-size: 11px;
741
- color: var(--faint);
742
- margin-bottom: 5px;
743
- padding: 0 2px;
744
- display: flex;
745
- align-items: center;
746
- gap: 5px;
747
- }
748
-
749
- .bubble {
750
- padding: 14px 18px;
751
- border-radius: var(--radius);
752
- font-size: 14.5px;
753
- line-height: 1.65;
754
- position: relative;
755
- word-wrap: break-word;
756
- overflow-wrap: break-word;
757
- word-break: break-word;
758
- max-width: min(78%, 740px);
759
- }
760
-
761
- .bubble h1, .bubble h2, .bubble h3 {
762
- margin: 12px 0 6px 0;
763
- color: var(--accent);
764
- }
765
- .bubble p { margin-bottom: 8px; }
766
- .bubble ul, .bubble ol { padding-left: 20px; margin-bottom: 8px; }
767
- .bubble code:not(pre code) {
768
- background: rgba(111,66,232,0.08);
769
- padding: 2px 5px;
770
- border-radius: 4px;
771
- font-family: 'JetBrains Mono', 'Fira Code', monospace;
772
- font-size: 13px;
773
- }
774
-
775
- .user .bubble {
776
- background: linear-gradient(135deg, var(--accent) 0%, #5832c8 70%, #7b61ff 100%);
777
- color: #fff;
778
- border-bottom-right-radius: 4px;
779
- box-shadow: 0 6px 24px rgba(111,66,232,0.28);
780
- border: none;
781
- }
782
-
783
- .ai .bubble {
784
- background: var(--surface);
785
- color: var(--text);
786
- border: 1px solid var(--accent-soft);
787
- border-bottom-left-radius: 4px;
788
- box-shadow: 0 4px 18px rgba(88,72,150,0.08);
789
- }
790
-
791
- /* ── 코드 블록 ── */
792
- .code-container {
793
- width: 100%;
794
- max-width: 100%;
795
- overflow: hidden;
796
- border-radius: var(--radius-sm);
797
- margin: 12px 0;
798
- background: var(--surface-2);
799
- border: 1px solid rgba(129,140,248,0.15);
800
- box-shadow: 0 4px 16px rgba(88,72,150,0.10);
801
- }
802
-
803
- .code-header {
804
- background: rgba(111,66,232,0.08);
805
- color: var(--muted);
806
- font-size: 11px;
807
- padding: 8px 12px;
808
- border-bottom: 1px solid rgba(129,140,248,0.1);
809
- display: flex;
810
- justify-content: space-between;
811
- align-items: center;
812
- gap: 10px;
813
- }
814
-
815
- .code-lang {
816
- text-transform: uppercase;
817
- font-weight: 700;
818
- color: var(--accent-3);
819
- font-size: 10px;
820
- letter-spacing: 0.08em;
821
- }
822
-
823
- .code-actions { display: flex; gap: 6px; }
824
-
825
- pre {
826
- width: 100%;
827
- overflow-x: auto;
828
- white-space: pre;
829
- padding: 16px;
830
- font-size: 13px;
831
- background: var(--surface-2);
832
- scrollbar-width: thin;
833
- font-family: 'JetBrains Mono', 'Fira Code', monospace;
834
- line-height: 1.6;
835
- }
836
-
837
- /* 다운로드 버튼 전용 스타일 */
838
- .download-btn-ui,
839
- .copy-btn-ui {
840
- background: rgba(255, 255, 255, 0.06);
841
- color: var(--text);
842
- border: 1px solid rgba(255, 255, 255, 0.1);
843
- border-radius: 6px;
844
- padding: 5px 8px;
845
- cursor: pointer;
846
- font-size: 11px;
847
- font-weight: 600;
848
- display: flex;
849
- align-items: center;
850
- gap: 5px;
851
- }
852
-
853
- .download-btn-ui:hover,
854
- .copy-btn-ui:hover {
855
- background: var(--accent-soft);
856
- border-color: rgba(47, 143, 125, 0.45);
857
- }
858
-
859
- .img-attachment {
860
- max-width: 300px;
861
- border-radius: 12px;
862
- margin-top: 8px;
863
- border: 1px solid var(--border);
864
- }
865
-
866
- /* ── 사이드바 오버레이 (모바일 드로어 배경) ── */
867
- .sidebar-overlay {
868
- display: none;
869
- position: fixed;
870
- inset: 0;
871
- background: rgba(111,66,232,0.18);
872
- z-index: 99;
873
- backdrop-filter: none;
874
- }
875
- body.sidebar-open .sidebar-overlay { display: block; }
876
-
877
- /* ── 햄버거 버튼 ── */
878
- .sidebar-toggle {
879
- display: none;
880
- background: transparent;
881
- border: none;
882
- color: var(--text);
883
- font-size: 20px;
884
- cursor: pointer;
885
- padding: 4px 6px;
886
- border-radius: 6px;
887
- line-height: 1;
888
- flex-shrink: 0;
889
- }
890
- .sidebar-toggle:hover { background: rgba(255,255,255,0.08); }
891
-
892
- /* ── 사이드바 닫기 버튼 (모바일 전용) ── */
893
- .sidebar-close {
894
- display: none;
895
- margin-left: auto;
896
- background: transparent;
897
- border: none;
898
- color: var(--faint);
899
- font-size: 18px;
900
- cursor: pointer;
901
- padding: 4px 6px;
902
- border-radius: 6px;
903
- line-height: 1;
904
- }
905
- .sidebar-close:hover { color: var(--text); }
906
-
907
- /* ── 입력창 ── */
908
- .input-area {
909
- padding: 14px 20px 20px;
910
- padding-bottom: max(20px, env(safe-area-inset-bottom));
911
- background: linear-gradient(0deg, var(--input) 0%, transparent 100%);
912
- }
913
-
914
- .input-box {
915
- background: var(--input);
916
- border: 1px solid rgba(111,66,232,0.16);
917
- border-radius: var(--radius);
918
- padding: 10px 12px 10px;
919
- display: flex;
920
- flex-direction: column;
921
- gap: 8px;
922
- box-shadow: 0 8px 32px rgba(88,72,150,0.10);
923
- max-width: var(--content-width);
924
- margin: 0 auto;
925
- transition: border-color .2s, box-shadow .2s;
926
- }
927
-
928
- .input-box:focus-within {
929
- border-color: rgba(111,66,232,0.36);
930
- box-shadow: 0 8px 32px rgba(88,72,150,0.14), 0 0 0 3px rgba(111,66,232,0.08);
931
- }
932
-
933
- .input-row {
934
- display: flex;
935
- align-items: flex-end;
936
- gap: 8px;
937
- }
938
-
939
- textarea {
940
- flex: 1;
941
- background: transparent;
942
- border: none;
943
- color: var(--text);
944
- font-size: 14.5px;
945
- resize: none;
946
- max-height: 200px;
947
- outline: none;
948
- padding: 7px 2px;
949
- font-family: inherit;
950
- line-height: 1.5;
951
- }
952
-
953
- textarea::placeholder { color: var(--faint); }
954
-
955
- .action-btn {
956
- background: transparent;
957
- border: none;
958
- color: var(--faint);
959
- cursor: pointer;
960
- padding: 7px;
961
- border-radius: var(--radius-sm);
962
- display: flex;
963
- align-items: center;
964
- transition: all .15s;
965
- }
966
- .action-btn:hover {
967
- color: var(--accent);
968
- background: rgba(111,66,232,0.08);
969
- }
970
-
971
- .send-btn {
972
- background: linear-gradient(135deg, var(--accent), #7b61ff);
973
- color: #fff;
974
- border: none;
975
- width: 38px; height: 38px;
976
- border-radius: 10px;
977
- cursor: pointer;
978
- display: flex;
979
- align-items: center;
980
- justify-content: center;
981
- font-weight: 800;
982
- box-shadow: 0 8px 20px rgba(111,66,232,0.28);
983
- transition: all .18s;
984
- flex-shrink: 0;
985
- }
986
- .send-btn:hover {
987
- background: linear-gradient(135deg, #5f35d8, #6b51ef);
988
- box-shadow: 0 12px 28px rgba(111,66,232,0.36);
989
- transform: scale(1.05);
990
- }
991
- .send-btn:disabled {
992
- opacity: 0.4;
993
- cursor: wait;
994
- transform: none;
995
- box-shadow: none;
996
- }
997
-
998
- /* ── 파일 생성 툴바 ── */
999
- .file-toolbar {
1000
- display: flex;
1001
- align-items: center;
1002
- gap: 5px;
1003
- padding: 2px 2px 0;
1004
- flex-wrap: wrap;
1005
- border-top: 1px solid rgba(111,66,232,0.10);
1006
- }
1007
-
1008
- .file-toolbar-label {
1009
- color: var(--faint);
1010
- font-size: 10px;
1011
- font-weight: 700;
1012
- letter-spacing: 0.07em;
1013
- text-transform: uppercase;
1014
- margin-right: 3px;
1015
- }
1016
-
1017
- .file-type-btn {
1018
- display: inline-flex;
1019
- align-items: center;
1020
- gap: 5px;
1021
- padding: 4px 10px;
1022
- border-radius: 6px;
1023
- border: 1px solid rgba(255,255,255,0.06);
1024
- background: var(--surface-2);
1025
- color: var(--muted);
1026
- font-size: 11.5px;
1027
- font-weight: 600;
1028
- cursor: pointer;
1029
- transition: all .14s;
1030
- }
1031
-
1032
- .file-type-btn:hover {
1033
- border-color: rgba(111,66,232,0.28);
1034
- color: var(--accent);
1035
- background: rgba(111,66,232,0.07);
1036
- }
1037
-
1038
- /* ── 멀티 LLM 파이프라인 ── */
1039
- .pipeline-phase-row {
1040
- display: flex; flex-direction: column; gap: 8px;
1041
- background: rgba(111,66,232,0.04);
1042
- border: 1px solid var(--border);
1043
- border-radius: 10px; padding: 12px;
1044
- }
1045
- .pipeline-phase-label { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
1046
- .pipeline-phase-badge {
1047
- font-size: 12px; font-weight: 600; padding: 3px 10px;
1048
- border-radius: 20px; white-space: nowrap;
1049
- }
1050
- .pipeline-select {
1051
- width: 100%; background: var(--surface); border: 1px solid var(--border);
1052
- color: var(--text); padding: 8px 10px; border-radius: 8px;
1053
- font-size: 13px; cursor: pointer; outline: none;
1054
- }
1055
- .pipeline-select:focus { border-color: var(--accent); }
1056
- .pipeline-active-badge {
1057
- display: inline-flex; align-items: center; gap: 4px;
1058
- font-size: 11px; background: rgba(111,66,232,0.10);
1059
- border: 1px solid rgba(111,66,232,0.28); color: var(--accent);
1060
- padding: 2px 8px; border-radius: 20px; margin-left: 6px; cursor: pointer;
1061
- }
1062
- .plan-approval-card {
1063
- background: rgba(99,102,241,0.07); border: 1px solid rgba(99,102,241,0.2);
1064
- border-radius: 12px; padding: 16px; margin-top: 4px;
1065
- }
1066
- .plan-approval-card h4 { margin: 0 0 10px; color: var(--accent); font-size: 14px; }
1067
- .plan-approval-card ol { margin: 0 0 12px; padding-left: 20px; color: var(--text); font-size: 13px; line-height: 1.8; }
1068
- .plan-approval-card .plan-meta { font-size: 11px; color: var(--muted); margin-bottom: 12px; }
1069
- .plan-approval-actions { display: flex; gap: 8px; }
1070
- .plan-approve-btn {
1071
- flex: 1; background: var(--accent); border: none; color: #05120d;
1072
- padding: 9px; border-radius: 8px; font-size: 13px; font-weight: 600; cursor: pointer;
1073
- }
1074
- .plan-cancel-btn {
1075
- background: rgba(248,113,113,0.1); border: 1px solid rgba(248,113,113,0.25);
1076
- color: var(--danger); padding: 9px 16px; border-radius: 8px; font-size: 13px; cursor: pointer;
1077
- }
1078
-
1079
- /* ── 첨부 파일 칩 ── */
1080
- .attach-chip {
1081
- display: inline-flex;
1082
- align-items: center;
1083
- gap: 6px;
1084
- padding: 4px 10px;
1085
- background: rgba(48, 167, 137, 0.12);
1086
- border: 1px solid rgba(48, 167, 137, 0.3);
1087
- border-radius: 6px;
1088
- font-size: 12px;
1089
- color: var(--accent);
1090
- margin: 0 2px;
1091
- }
1092
- .attach-chip button {
1093
- background: none;
1094
- border: none;
1095
- color: var(--muted);
1096
- cursor: pointer;
1097
- padding: 0;
1098
- font-size: 13px;
1099
- line-height: 1;
1100
- }
1101
- .attach-chip button:hover { color: var(--danger); }
1102
- #attach-preview-row {
1103
- display: none;
1104
- padding: 4px 2px;
1105
- gap: 4px;
1106
- flex-wrap: wrap;
1107
- }
1108
-
1109
- /* ── 생성된 파일 다운로드 카드 ── */
1110
- .file-download-card {
1111
- display: inline-flex;
1112
- align-items: center;
1113
- gap: 10px;
1114
- padding: 10px 14px;
1115
- border: 1px solid rgba(48, 167, 137, 0.3);
1116
- border-radius: 8px;
1117
- background: rgba(48, 167, 137, 0.07);
1118
- margin: 6px 0;
1119
- max-width: 100%;
1120
- }
1121
-
1122
- .file-download-card .file-icon {
1123
- font-size: 22px;
1124
- color: var(--accent);
1125
- flex: 0 0 auto;
1126
- }
1127
-
1128
- .file-download-card .file-info {
1129
- flex: 1;
1130
- min-width: 0;
1131
- }
1132
-
1133
- .file-download-card .file-name {
1134
- font-weight: 700;
1135
- font-size: 13px;
1136
- white-space: nowrap;
1137
- overflow: hidden;
1138
- text-overflow: ellipsis;
1139
- }
1140
-
1141
- .file-download-card .file-meta {
1142
- color: var(--muted);
1143
- font-size: 11px;
1144
- margin-top: 2px;
1145
- }
1146
-
1147
- .file-dl-btn {
1148
- flex: 0 0 auto;
1149
- padding: 6px 13px;
1150
- border-radius: 6px;
1151
- border: 1px solid rgba(48, 167, 137, 0.45);
1152
- background: rgba(48, 167, 137, 0.12);
1153
- color: var(--accent);
1154
- font-size: 12px;
1155
- font-weight: 700;
1156
- cursor: pointer;
1157
- text-decoration: none;
1158
- }
1159
-
1160
- .file-dl-btn:hover {
1161
- background: rgba(48, 167, 137, 0.22);
1162
- }
1163
-
1164
- /* ── 권한 요청 다이얼로그 ── */
1165
- .perm-overlay {
1166
- position: fixed;
1167
- inset: 0;
1168
- background: rgba(0,0,0,0.65);
1169
- display: flex;
1170
- align-items: center;
1171
- justify-content: center;
1172
- z-index: 9999;
1173
- }
1174
-
1175
- .perm-dialog {
1176
- background: var(--surface);
1177
- border: 1px solid var(--border);
1178
- border-radius: 12px;
1179
- padding: 24px;
1180
- max-width: 420px;
1181
- width: 90%;
1182
- box-shadow: 0 24px 60px rgba(88,72,150,0.22);
1183
- }
1184
-
1185
- .perm-icon {
1186
- font-size: 28px;
1187
- color: #f0a500;
1188
- margin-bottom: 12px;
1189
- }
1190
-
1191
- .perm-title {
1192
- font-size: 16px;
1193
- font-weight: 700;
1194
- margin-bottom: 8px;
1195
- }
1196
-
1197
- .perm-path {
1198
- font-family: monospace;
1199
- font-size: 12px;
1200
- background: rgba(111,66,232,0.05);
1201
- border: 1px solid var(--border);
1202
- border-radius: 6px;
1203
- padding: 8px 10px;
1204
- word-break: break-all;
1205
- color: var(--accent);
1206
- margin: 10px 0 14px;
1207
- }
1208
-
1209
- .perm-desc {
1210
- color: var(--muted);
1211
- font-size: 13px;
1212
- line-height: 1.5;
1213
- margin-bottom: 18px;
1214
- }
1215
-
1216
- .perm-actions {
1217
- display: flex;
1218
- gap: 8px;
1219
- justify-content: flex-end;
1220
- }
1221
-
1222
- .perm-deny-btn {
1223
- padding: 8px 18px;
1224
- border-radius: 7px;
1225
- border: 1px solid var(--border);
1226
- background: transparent;
1227
- color: var(--muted);
1228
- font-size: 13px;
1229
- font-weight: 600;
1230
- cursor: pointer;
1231
- }
1232
-
1233
- .perm-allow-btn {
1234
- padding: 8px 18px;
1235
- border-radius: 7px;
1236
- border: 1px solid rgba(48, 167, 137, 0.5);
1237
- background: rgba(48, 167, 137, 0.14);
1238
- color: var(--accent);
1239
- font-size: 13px;
1240
- font-weight: 700;
1241
- cursor: pointer;
1242
- }
1243
-
1244
- .perm-allow-btn:hover { background: rgba(48, 167, 137, 0.25); }
1245
- .perm-deny-btn:hover { background: rgba(255,255,255,0.60); }
1246
-
1247
- .preview-bar {
1248
- display: flex;
1249
- gap: 10px;
1250
- padding-bottom: 8px;
1251
- border-bottom: 1px solid var(--border);
1252
- }
1253
-
1254
- .preview-thumb {
1255
- width: 60px;
1256
- height: 60px;
1257
- border-radius: 8px;
1258
- object-fit: cover;
1259
- position: relative;
1260
- }
1261
-
1262
- .remove-preview {
1263
- position: absolute;
1264
- top: -5px;
1265
- right: -5px;
1266
- background: var(--danger);
1267
- color: white;
1268
- border-radius: 50%;
1269
- width: 18px;
1270
- height: 18px;
1271
- font-size: 12px;
1272
- display: flex;
1273
- align-items: center;
1274
- justify-content: center;
1275
- cursor: pointer;
1276
- }
1277
-
1278
- .auth-overlay {
1279
- position: fixed;
1280
- inset: 0;
1281
- z-index: 1000;
1282
- display: flex;
1283
- align-items: center;
1284
- justify-content: center;
1285
- background: var(--bg);
1286
- padding: 24px;
1287
- overflow: hidden;
1288
- }
1289
-
1290
- .auth-overlay::before {
1291
- content: '';
1292
- position: absolute;
1293
- inset: 0;
1294
- background:
1295
- radial-gradient(ellipse 70% 60% at 20% 20%, var(--border) 0%, transparent 55%),
1296
- radial-gradient(ellipse 50% 50% at 80% 80%, rgba(129,140,248,0.12) 0%, transparent 55%);
1297
- pointer-events: none;
1298
- }
1299
-
1300
- .auth-orb {
1301
- position: absolute;
1302
- border-radius: 50%;
1303
- filter: blur(60px);
1304
- pointer-events: none;
1305
- }
1306
- .auth-orb-1 {
1307
- width: 400px; height: 400px;
1308
- top: -150px; left: -100px;
1309
- background: var(--border);
1310
- }
1311
- .auth-orb-2 {
1312
- width: 350px; height: 350px;
1313
- bottom: -120px; right: -80px;
1314
- background: rgba(129,140,248,0.12);
1315
- }
1316
-
1317
- .auth-card {
1318
- width: min(400px, 100%);
1319
- background: var(--card);
1320
- border: 1px solid rgba(111,66,232,0.16);
1321
- border-radius: 20px;
1322
- padding: 36px 32px;
1323
- box-shadow: var(--shadow), 0 0 0 1px rgba(111,66,232,0.05);
1324
- position: relative;
1325
- z-index: 1;
1326
- backdrop-filter: none; /* glass removed v3.5.0 */
1327
- }
1328
-
1329
- .auth-card::before {
1330
- content: '';
1331
- position: absolute;
1332
- top: 0; left: 50%;
1333
- transform: translateX(-50%);
1334
- width: 60%; height: 1px;
1335
- background: linear-gradient(90deg, transparent, rgba(111,66,232,0.40), transparent);
1336
- }
1337
-
1338
- .auth-logo {
1339
- width: 52px; height: 52px;
1340
- background: linear-gradient(135deg, var(--accent), #9a78f0);
1341
- border-radius: 14px;
1342
- display: flex; align-items: center; justify-content: center;
1343
- font-size: 24px; color: #fff;
1344
- margin: 0 auto 16px;
1345
- box-shadow: 0 0 30px rgba(111,66,232,0.24), 0 8px 24px rgba(88,72,150,0.16);
1346
- }
1347
-
1348
- .auth-title {
1349
- margin-bottom: 6px;
1350
- text-align: center;
1351
- font-size: 22px;
1352
- font-weight: 800;
1353
- background: linear-gradient(135deg, var(--text) 35%, var(--accent) 82%);
1354
- -webkit-background-clip: text;
1355
- -webkit-text-fill-color: transparent;
1356
- background-clip: text;
1357
- }
1358
-
1359
- .auth-subtitle {
1360
- text-align: center;
1361
- color: var(--faint);
1362
- font-size: 12.5px;
1363
- margin-bottom: 24px;
1364
- }
1365
-
1366
- .auth-input {
1367
- width: 100%;
1368
- padding: 12px 14px;
1369
- margin-bottom: 10px;
1370
- background: var(--input);
1371
- border: 1px solid rgba(255,255,255,0.08);
1372
- color: var(--text);
1373
- border-radius: 10px;
1374
- outline: none;
1375
- font-size: 14px;
1376
- font-family: inherit;
1377
- transition: border-color .15s, box-shadow .15s;
1378
- }
1379
-
1380
- .auth-input:focus {
1381
- border-color: rgba(111,66,232,0.40);
1382
- box-shadow: 0 0 0 3px rgba(111,66,232,0.08);
1383
- }
1384
-
1385
- .auth-input::placeholder { color: var(--faint); }
1386
-
1387
- .auth-submit {
1388
- width: 100%;
1389
- padding: 13px;
1390
- background: linear-gradient(135deg, var(--accent), #5832c8);
1391
- color: #fff;
1392
- border: none;
1393
- border-radius: 10px;
1394
- cursor: pointer;
1395
- font-weight: 800;
1396
- font-size: 14px;
1397
- box-shadow: 0 0 20px rgba(111,66,232,0.24), 0 4px 12px rgba(0,0,0,0.3);
1398
- transition: all .18s;
1399
- margin-top: 4px;
1400
- }
1401
-
1402
- .auth-submit:hover {
1403
- background: linear-gradient(135deg, var(--accent), #9a78f0);
1404
- box-shadow: 0 0 30px rgba(111,66,232,0.32), 0 4px 14px rgba(0,0,0,0.3);
1405
- transform: translateY(-1px);
1406
- }
1407
-
1408
- .auth-switch {
1409
- margin-top: 18px;
1410
- text-align: center;
1411
- font-size: 12.5px;
1412
- color: var(--faint);
1413
- }
1414
-
1415
- .auth-switch a {
1416
- color: var(--accent);
1417
- text-decoration: none;
1418
- font-weight: 700;
1419
- }
1420
-
1421
- .admin-overlay {
1422
- position: fixed;
1423
- inset: 0;
1424
- z-index: 900;
1425
- display: none;
1426
- align-items: stretch;
1427
- justify-content: flex-end;
1428
- background: rgba(0, 0, 0, 0.46);
1429
- }
1430
-
1431
- .model-overlay {
1432
- position: fixed;
1433
- inset: 0;
1434
- z-index: 850;
1435
- display: none;
1436
- align-items: center;
1437
- justify-content: center;
1438
- background: rgba(0, 0, 0, 0.52);
1439
- padding: 22px;
1440
- }
1441
-
1442
- .model-panel {
1443
- width: min(680px, 100%);
1444
- max-height: min(760px, calc(100vh - 44px));
1445
- background: var(--surface);
1446
- border: 1px solid var(--border);
1447
- border-radius: 10px;
1448
- box-shadow: var(--shadow);
1449
- display: flex;
1450
- flex-direction: column;
1451
- overflow: hidden;
1452
- }
1453
-
1454
- .model-panel-header {
1455
- padding: 18px 20px;
1456
- border-bottom: 1px solid var(--border);
1457
- display: flex;
1458
- align-items: center;
1459
- justify-content: space-between;
1460
- gap: 12px;
1461
- }
1462
-
1463
- .model-panel-header h2 {
1464
- font-size: 18px;
1465
- }
1466
-
1467
- .model-list {
1468
- padding: 14px;
1469
- overflow-y: auto;
1470
- display: flex;
1471
- flex-direction: column;
1472
- gap: 9px;
1473
- }
1474
-
1475
- .model-download-card {
1476
- border: 1px solid var(--border);
1477
- background: var(--surface-2);
1478
- border-radius: 8px;
1479
- padding: 14px;
1480
- display: flex;
1481
- flex-direction: column;
1482
- gap: 12px;
1483
- }
1484
-
1485
- .model-download-head {
1486
- display: flex;
1487
- align-items: flex-start;
1488
- justify-content: space-between;
1489
- gap: 12px;
1490
- }
1491
-
1492
- .model-download-head strong,
1493
- .model-download-head span {
1494
- display: block;
1495
- }
1496
-
1497
- .model-download-head strong {
1498
- font-size: 14px;
1499
- word-break: break-word;
1500
- }
1501
-
1502
- .model-download-head span {
1503
- color: var(--muted);
1504
- font-size: 12px;
1505
- margin-top: 3px;
1506
- }
1507
-
1508
- .model-download-percent {
1509
- flex: 0 0 auto;
1510
- font-size: 20px;
1511
- font-weight: 800;
1512
- color: #9ce5d7;
1513
- min-width: 72px;
1514
- text-align: right;
1515
- }
1516
-
1517
- .model-download-track {
1518
- height: 10px;
1519
- border-radius: 999px;
1520
- background: rgba(255, 255, 255, 0.08);
1521
- overflow: hidden;
1522
- border: 1px solid rgba(255, 255, 255, 0.08);
1523
- }
1524
-
1525
- .model-download-fill {
1526
- height: 100%;
1527
- width: 0%;
1528
- border-radius: inherit;
1529
- background: linear-gradient(90deg, #30a789, #7cc7ff);
1530
- transition: width 0.35s ease;
1531
- }
1532
-
1533
- .model-download-fill.indeterminate {
1534
- width: 42%;
1535
- animation: modelDownloadIndeterminate 1.25s ease-in-out infinite;
1536
- }
1537
-
1538
- @keyframes modelDownloadIndeterminate {
1539
- 0% { transform: translateX(-120%); }
1540
- 100% { transform: translateX(260%); }
1541
- }
1542
-
1543
- .model-download-meta {
1544
- display: grid;
1545
- grid-template-columns: 1fr 1fr;
1546
- gap: 8px;
1547
- }
1548
-
1549
- .model-download-meta div {
1550
- border: 1px solid var(--border);
1551
- border-radius: 8px;
1552
- padding: 8px;
1553
- min-width: 0;
1554
- }
1555
-
1556
- .model-download-meta span {
1557
- display: block;
1558
- color: var(--muted);
1559
- font-size: 11px;
1560
- margin-bottom: 3px;
1561
- }
1562
-
1563
- .model-download-meta strong {
1564
- display: block;
1565
- font-size: 12px;
1566
- word-break: break-word;
1567
- }
1568
-
1569
- .model-download-detail {
1570
- color: var(--muted);
1571
- font-size: 12px;
1572
- line-height: 1.45;
1573
- word-break: break-word;
1574
- }
1575
-
1576
- @media (max-width: 520px) {
1577
- .model-download-meta {
1578
- grid-template-columns: 1fr;
1579
- }
1580
-
1581
- .model-download-percent {
1582
- font-size: 18px;
1583
- min-width: 64px;
1584
- }
1585
- }
1586
-
1587
- .engine-card {
1588
- border: 1px solid var(--border);
1589
- background: rgba(255, 255, 255, 0.028);
1590
- border-radius: 8px;
1591
- padding: 12px;
1592
- }
1593
-
1594
- .engine-head {
1595
- display: flex;
1596
- align-items: flex-start;
1597
- justify-content: space-between;
1598
- gap: 12px;
1599
- margin-bottom: 10px;
1600
- }
1601
-
1602
- .engine-head strong,
1603
- .engine-head span {
1604
- display: block;
1605
- }
1606
-
1607
- .engine-head span {
1608
- color: var(--muted);
1609
- font-size: 12px;
1610
- margin-top: 4px;
1611
- line-height: 1.35;
1612
- }
1613
-
1614
- .engine-actions {
1615
- display: flex;
1616
- align-items: center;
1617
- gap: 8px;
1618
- flex: 0 0 auto;
1619
- }
1620
-
1621
- .engine-state {
1622
- border: 1px solid var(--border);
1623
- border-radius: 999px;
1624
- color: var(--muted);
1625
- font-size: 11px;
1626
- padding: 5px 8px;
1627
- white-space: nowrap;
1628
- }
1629
-
1630
- .engine-state.ready {
1631
- color: #9ce5d7;
1632
- border-color: rgba(48, 167, 137, 0.46);
1633
- }
1634
-
1635
- .model-group-title {
1636
- color: var(--muted);
1637
- font-size: 12px;
1638
- font-weight: 800;
1639
- margin: 12px 4px 2px;
1640
- }
1641
-
1642
- .model-filter {
1643
- display: grid;
1644
- grid-template-columns: 1fr 1fr;
1645
- gap: 8px;
1646
- margin: 4px 0 10px;
1647
- }
1648
-
1649
- .model-filter-btn {
1650
- border: 1px solid var(--border);
1651
- background: var(--surface-2);
1652
- color: var(--muted);
1653
- border-radius: 8px;
1654
- padding: 9px 10px;
1655
- font-size: 12px;
1656
- font-weight: 700;
1657
- cursor: pointer;
1658
- }
1659
-
1660
- .model-filter-btn.active {
1661
- color: #9ce5d7;
1662
- border-color: rgba(48, 167, 137, 0.52);
1663
- background: rgba(48, 167, 137, 0.12);
1664
- }
1665
-
1666
- .model-option {
1667
- width: 100%;
1668
- border: 1px solid var(--border);
1669
- background: var(--surface-2);
1670
- color: var(--text);
1671
- border-radius: 8px;
1672
- padding: 12px;
1673
- display: flex;
1674
- align-items: center;
1675
- justify-content: space-between;
1676
- gap: 12px;
1677
- text-align: left;
1678
- cursor: pointer;
1679
- }
1680
-
1681
- .model-option:hover {
1682
- border-color: rgba(48, 167, 137, 0.52);
1683
- background: rgba(48, 167, 137, 0.08);
1684
- }
1685
-
1686
- .model-option[disabled] {
1687
- cursor: not-allowed;
1688
- opacity: 0.58;
1689
- }
1690
-
1691
- .model-option.needs-pull {
1692
- border-color: rgba(255, 193, 7, 0.4);
1693
- }
1694
-
1695
- .model-option.needs-pull:hover {
1696
- border-color: rgba(255, 193, 7, 0.8);
1697
- background: rgba(255, 193, 7, 0.07);
1698
- }
1699
-
1700
- .model-option strong,
1701
- .model-option span {
1702
- display: block;
1703
- }
1704
-
1705
- .model-option span {
1706
- color: var(--muted);
1707
- font-size: 12px;
1708
- margin-top: 4px;
1709
- word-break: break-word;
1710
- }
1711
-
1712
- .family-group {
1713
- border: 1px solid var(--border);
1714
- border-radius: 8px;
1715
- margin-bottom: 8px;
1716
- background: rgba(255, 255, 255, 0.02);
1717
- overflow: hidden;
1718
- }
1719
-
1720
- .family-summary {
1721
- list-style: none;
1722
- padding: 10px 12px;
1723
- cursor: pointer;
1724
- display: flex;
1725
- align-items: center;
1726
- justify-content: space-between;
1727
- gap: 10px;
1728
- color: var(--text);
1729
- font-size: 13px;
1730
- font-weight: 700;
1731
- user-select: none;
1732
- border-bottom: 1px solid transparent;
1733
- }
1734
-
1735
- .family-group[open] .family-summary {
1736
- border-bottom-color: var(--border);
1737
- }
1738
-
1739
- .family-summary::-webkit-details-marker {
1740
- display: none;
1741
- }
1742
-
1743
- .family-summary .family-count {
1744
- color: var(--muted);
1745
- font-size: 11px;
1746
- font-weight: 600;
1747
- }
1748
-
1749
- .family-models {
1750
- padding: 8px;
1751
- display: grid;
1752
- gap: 8px;
1753
- }
1754
-
1755
- .api-key-form {
1756
- display: flex;
1757
- align-items: center;
1758
- gap: 8px;
1759
- margin-top: 8px;
1760
- flex-wrap: wrap;
1761
- }
1762
-
1763
- .api-key-input {
1764
- flex: 1;
1765
- min-width: 180px;
1766
- background: var(--surface-2);
1767
- border: 1px solid var(--border);
1768
- border-radius: 6px;
1769
- color: var(--text);
1770
- font-size: 12px;
1771
- padding: 6px 10px;
1772
- outline: none;
1773
- }
1774
-
1775
- .api-key-input:focus {
1776
- border-color: rgba(48, 167, 137, 0.6);
1777
- }
1778
-
1779
- /* ── VPC Panel ── */
1780
- .vpc-provider-tabs {
1781
- display: flex;
1782
- gap: 8px;
1783
- margin-bottom: 18px;
1784
- flex-wrap: wrap;
1785
- }
1786
-
1787
- .vpc-tab-btn {
1788
- padding: 7px 16px;
1789
- border-radius: 6px;
1790
- border: 1px solid var(--border);
1791
- background: var(--surface-2);
1792
- color: var(--muted);
1793
- font-size: 13px;
1794
- font-weight: 600;
1795
- cursor: pointer;
1796
- }
1797
-
1798
- .vpc-tab-btn.active {
1799
- background: rgba(48, 167, 137, 0.14);
1800
- border-color: rgba(48, 167, 137, 0.5);
1801
- color: var(--accent);
1802
- }
1803
-
1804
- .vpc-tab-btn:hover:not(.active) {
1805
- border-color: rgba(48, 167, 137, 0.3);
1806
- color: var(--text);
1807
- }
1808
-
1809
- .vpc-connection-status {
1810
- display: flex;
1811
- align-items: center;
1812
- gap: 8px;
1813
- padding: 10px 14px;
1814
- border-radius: 8px;
1815
- border: 1px solid var(--border);
1816
- background: var(--card);
1817
- margin-bottom: 16px;
1818
- font-size: 13px;
1819
- }
1820
-
1821
- .vpc-status-dot {
1822
- width: 8px;
1823
- height: 8px;
1824
- border-radius: 50%;
1825
- background: var(--muted);
1826
- flex: 0 0 8px;
1827
- }
1828
-
1829
- .vpc-status-dot.connected { background: #4caf86; }
1830
- .vpc-status-dot.standby { background: #f0a500; }
1831
- .vpc-status-dot.error { background: #e05c5c; }
1832
-
1833
- /* ── Status Panel ── */
1834
- .status-section {
1835
- border: 1px solid var(--border);
1836
- border-radius: 8px;
1837
- padding: 14px;
1838
- margin-bottom: 12px;
1839
- background: var(--surface-2);
1840
- }
1841
-
1842
- .status-section-title {
1843
- color: var(--muted);
1844
- font-size: 11px;
1845
- font-weight: 700;
1846
- letter-spacing: 0.05em;
1847
- margin-bottom: 10px;
1848
- text-transform: uppercase;
1849
- }
1850
-
1851
- .status-row {
1852
- display: flex;
1853
- align-items: center;
1854
- gap: 10px;
1855
- padding: 6px 0;
1856
- border-bottom: 1px solid rgba(111,66,232,0.08);
1857
- font-size: 13px;
1858
- }
1859
-
1860
- .status-row:last-child { border-bottom: none; }
1861
-
1862
- .status-row-label {
1863
- color: var(--muted);
1864
- flex: 0 0 110px;
1865
- font-size: 12px;
1866
- }
1867
-
1868
- .status-row-value {
1869
- color: var(--text);
1870
- font-weight: 600;
1871
- flex: 1;
1872
- word-break: break-all;
1873
- }
1874
-
1875
- .status-badge {
1876
- font-size: 11px;
1877
- padding: 2px 8px;
1878
- border-radius: 999px;
1879
- border: 1px solid var(--border);
1880
- color: var(--muted);
1881
- }
1882
-
1883
- .status-badge.ok {
1884
- color: #4caf86;
1885
- border-color: rgba(76,175,134,0.4);
1886
- background: rgba(76,175,134,0.08);
1887
- }
1888
-
1889
- .status-badge.warn {
1890
- color: #f0a500;
1891
- border-color: rgba(240,165,0,0.4);
1892
- background: rgba(240,165,0,0.07);
1893
- }
1894
-
1895
- .status-mcp-list {
1896
- display: flex;
1897
- flex-direction: column;
1898
- gap: 6px;
1899
- }
1900
-
1901
- .status-mcp-item {
1902
- display: flex;
1903
- align-items: center;
1904
- justify-content: space-between;
1905
- font-size: 13px;
1906
- }
1907
-
1908
- .status-mcp-item span:last-child {
1909
- font-size: 11px;
1910
- color: var(--muted);
1911
- }
1912
-
1913
- /* ── MCP 추천 (컴팩트 버튼 → 드롭다운) ── */
1914
- .mcp-recommend-wrap {
1915
- max-width: var(--content-width);
1916
- margin: 0 auto 14px;
1917
- }
1918
-
1919
- .mcp-recommend-btn {
1920
- display: inline-flex;
1921
- align-items: center;
1922
- gap: 7px;
1923
- padding: 7px 14px;
1924
- border-radius: 999px;
1925
- border: 1px solid rgba(48, 167, 137, 0.38);
1926
- background: rgba(48, 167, 137, 0.08);
1927
- color: var(--accent);
1928
- font-size: 13px;
1929
- font-weight: 600;
1930
- cursor: pointer;
1931
- transition: background 0.15s;
1932
- }
1933
-
1934
- .mcp-recommend-btn:hover {
1935
- background: rgba(48, 167, 137, 0.16);
1936
- }
1937
-
1938
- .mcp-recommend-btn .mcp-count-badge {
1939
- background: rgba(48, 167, 137, 0.22);
1940
- border-radius: 999px;
1941
- padding: 1px 7px;
1942
- font-size: 11px;
1943
- font-weight: 700;
1944
- color: var(--accent);
1945
- }
1946
-
1947
- .mcp-recommend-btn .mcp-chevron {
1948
- font-size: 11px;
1949
- transition: transform 0.2s;
1950
- }
1951
-
1952
- .mcp-recommend-btn.open .mcp-chevron {
1953
- transform: rotate(180deg);
1954
- }
1955
-
1956
- .mcp-dropdown {
1957
- display: none;
1958
- margin-top: 8px;
1959
- border: 1px solid rgba(111,66,232,0.16);
1960
- border-radius: 10px;
1961
- background: var(--surface-elevated);
1962
- box-shadow: 0 16px 36px rgba(96,72,160,0.12);
1963
- overflow: hidden;
1964
- }
1965
-
1966
- .mcp-dropdown.open {
1967
- display: block;
1968
- }
1969
-
1970
- .mcp-dropdown-item {
1971
- display: flex;
1972
- align-items: center;
1973
- justify-content: space-between;
1974
- gap: 12px;
1975
- padding: 11px 14px;
1976
- border-bottom: 1px solid rgba(111,66,232,0.10);
1977
- color: var(--text);
1978
- }
1979
-
1980
- .mcp-dropdown-item:hover {
1981
- background: rgba(111,66,232,0.05);
1982
- }
1983
-
1984
- .mcp-dropdown-item:last-child {
1985
- border-bottom: none;
1986
- }
1987
-
1988
- .mcp-dropdown-item-info {
1989
- min-width: 0;
1990
- flex: 1;
1991
- }
1992
-
1993
- .mcp-dropdown-item-info strong {
1994
- display: block;
1995
- font-size: 13px;
1996
- margin-bottom: 2px;
1997
- color: var(--text);
1998
- }
1999
-
2000
- .mcp-dropdown-item-info span {
2001
- display: block;
2002
- color: var(--muted);
2003
- font-size: 12px;
2004
- white-space: nowrap;
2005
- overflow: hidden;
2006
- text-overflow: ellipsis;
2007
- }
2008
-
2009
- .mcp-install-btn {
2010
- flex: 0 0 auto;
2011
- padding: 5px 13px;
2012
- border-radius: 6px;
2013
- border: 1px solid rgba(48, 167, 137, 0.4);
2014
- background: rgba(48, 167, 137, 0.1);
2015
- color: var(--accent);
2016
- font-size: 12px;
2017
- font-weight: 600;
2018
- cursor: pointer;
2019
- white-space: nowrap;
2020
- }
2021
-
2022
- .mcp-install-btn:hover {
2023
- background: rgba(48, 167, 137, 0.2);
2024
- }
2025
-
2026
- .mcp-install-btn:disabled {
2027
- opacity: 0.5;
2028
- cursor: not-allowed;
2029
- }
2030
-
2031
- .mcp-actions {
2032
- display: flex;
2033
- align-items: center;
2034
- justify-content: space-between;
2035
- gap: 8px;
2036
- }
2037
-
2038
- .admin-panel {
2039
- width: min(760px, 100%);
2040
- height: 100%;
2041
- background: var(--surface);
2042
- border-left: 1px solid var(--border);
2043
- box-shadow: var(--shadow);
2044
- display: flex;
2045
- flex-direction: column;
2046
- }
2047
-
2048
- .admin-header {
2049
- padding: 18px 20px;
2050
- border-bottom: 1px solid var(--border);
2051
- display: flex;
2052
- align-items: center;
2053
- justify-content: space-between;
2054
- gap: 12px;
2055
- }
2056
-
2057
- .admin-header h2 {
2058
- font-size: 18px;
2059
- }
2060
-
2061
- .admin-close {
2062
- width: 34px;
2063
- height: 34px;
2064
- border-radius: 8px;
2065
- border: 1px solid var(--border);
2066
- background: var(--surface-2);
2067
- color: var(--text);
2068
- cursor: pointer;
2069
- }
2070
-
2071
- .admin-body.lattice-ref-chat {
2072
- padding: 18px 20px 24px;
2073
- overflow-y: auto;
2074
- }
2075
-
2076
- .admin-stats {
2077
- display: grid;
2078
- grid-template-columns: repeat(4, minmax(0, 1fr));
2079
- gap: 10px;
2080
- margin-bottom: 18px;
2081
- }
2082
-
2083
- .admin-stat {
2084
- background: var(--surface-2);
2085
- border: 1px solid var(--border);
2086
- border-radius: 8px;
2087
- padding: 13px;
2088
- }
2089
-
2090
- .admin-stat span {
2091
- display: block;
2092
- color: var(--muted);
2093
- font-size: 12px;
2094
- margin-bottom: 7px;
2095
- }
2096
-
2097
- .admin-stat strong {
2098
- font-size: 22px;
2099
- }
2100
-
2101
- .admin-section-title {
2102
- font-size: 14px;
2103
- margin: 18px 0 10px;
2104
- }
2105
-
2106
- .admin-form-grid {
2107
- display: grid;
2108
- grid-template-columns: repeat(2, minmax(0, 1fr));
2109
- gap: 10px;
2110
- margin-bottom: 12px;
2111
- }
2112
-
2113
- .admin-field {
2114
- display: flex;
2115
- flex-direction: column;
2116
- gap: 6px;
2117
- }
2118
-
2119
- .admin-field.full {
2120
- grid-column: 1 / -1;
2121
- }
2122
-
2123
- .admin-field label {
2124
- color: var(--muted);
2125
- font-size: 12px;
2126
- font-weight: 700;
2127
- }
2128
-
2129
- .admin-input,
2130
- .admin-textarea {
2131
- width: 100%;
2132
- background: var(--surface-2);
2133
- border: 1px solid var(--border);
2134
- color: var(--text);
2135
- border-radius: 8px;
2136
- padding: 10px 11px;
2137
- outline: none;
2138
- font-family: inherit;
2139
- font-size: 13px;
2140
- }
2141
-
2142
- .admin-textarea {
2143
- min-height: 76px;
2144
- resize: vertical;
2145
- }
2146
-
2147
- .admin-input:focus,
2148
- .admin-textarea:focus {
2149
- border-color: rgba(111, 66, 232, 0.55);
2150
- }
2151
-
2152
- .vpc-save-row {
2153
- display: flex;
2154
- align-items: center;
2155
- justify-content: space-between;
2156
- gap: 12px;
2157
- margin-bottom: 18px;
2158
- }
2159
-
2160
- .vpc-status-copy {
2161
- color: var(--muted);
2162
- font-size: 12px;
2163
- }
2164
-
2165
- .admin-table {
2166
- width: 100%;
2167
- border-collapse: collapse;
2168
- border: 1px solid var(--border);
2169
- border-radius: 8px;
2170
- overflow: hidden;
2171
- font-size: 13px;
2172
- }
2173
-
2174
- .admin-table th,
2175
- .admin-table td {
2176
- padding: 11px 10px;
2177
- border-bottom: 1px solid var(--border);
2178
- text-align: left;
2179
- vertical-align: middle;
2180
- }
2181
-
2182
- .admin-table th {
2183
- color: var(--muted);
2184
- background: rgba(255, 255, 255, 0.035);
2185
- font-weight: 600;
2186
- }
2187
-
2188
- .admin-actions {
2189
- display: flex;
2190
- gap: 6px;
2191
- flex-wrap: wrap;
2192
- }
2193
-
2194
- .admin-action {
2195
- border: 1px solid var(--border);
2196
- background: var(--surface-2);
2197
- color: var(--text);
2198
- border-radius: 7px;
2199
- padding: 7px 8px;
2200
- cursor: pointer;
2201
- font-size: 12px;
2202
- }
2203
-
2204
- .admin-action.danger {
2205
- color: #ffb4b4;
2206
- border-color: rgba(228, 87, 87, 0.45);
2207
- }
2208
-
2209
- .role-badge {
2210
- display: inline-flex;
2211
- padding: 4px 7px;
2212
- border-radius: 999px;
2213
- border: 1px solid var(--border);
2214
- color: var(--muted);
2215
- font-size: 12px;
2216
- }
2217
-
2218
- .sensitivity-grid {
2219
- display: grid;
2220
- grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
2221
- gap: 12px;
2222
- margin-bottom: 18px;
2223
- }
2224
-
2225
- .sensitivity-panel {
2226
- border: 1px solid var(--border);
2227
- background: var(--surface-2);
2228
- border-radius: 8px;
2229
- padding: 14px;
2230
- min-width: 0;
2231
- }
2232
-
2233
- .sensitivity-panel h4 {
2234
- font-size: 13px;
2235
- margin-bottom: 10px;
2236
- display: flex;
2237
- align-items: center;
2238
- gap: 7px;
2239
- }
2240
-
2241
- .sensitivity-list {
2242
- display: flex;
2243
- flex-direction: column;
2244
- gap: 8px;
2245
- max-height: 260px;
2246
- overflow-y: auto;
2247
- }
2248
-
2249
- .sensitivity-item {
2250
- border: 1px solid rgba(255, 255, 255, 0.08);
2251
- border-radius: 8px;
2252
- padding: 9px;
2253
- background: rgba(0, 0, 0, 0.12);
2254
- }
2255
-
2256
- .sensitivity-meta {
2257
- display: flex;
2258
- flex-wrap: wrap;
2259
- gap: 6px;
2260
- margin-bottom: 6px;
2261
- }
2262
-
2263
- .sensitivity-tag {
2264
- display: inline-flex;
2265
- align-items: center;
2266
- border-radius: 999px;
2267
- padding: 3px 7px;
2268
- font-size: 11px;
2269
- border: 1px solid var(--border);
2270
- color: var(--muted);
2271
- }
2272
-
2273
- .sensitivity-tag.high {
2274
- border-color: rgba(228, 87, 87, 0.55);
2275
- color: #ffb4b4;
2276
- }
2277
-
2278
- .sensitivity-tag.medium {
2279
- border-color: rgba(216, 160, 61, 0.55);
2280
- color: var(--warning);
2281
- }
2282
-
2283
- .sensitivity-tag.low {
2284
- border-color: rgba(47, 143, 125, 0.55);
2285
- color: #9ce5d7;
2286
- }
2287
-
2288
- .sensitivity-preview {
2289
- color: var(--muted);
2290
- font-size: 12px;
2291
- line-height: 1.45;
2292
- word-break: break-word;
2293
- }
2294
-
2295
- .field-cloud {
2296
- display: flex;
2297
- flex-wrap: wrap;
2298
- gap: 7px;
2299
- margin-bottom: 12px;
2300
- }
2301
-
2302
- .sender-label {
2303
- font-size: 11px;
2304
- margin-bottom: 5px;
2305
- color: var(--muted);
2306
- }
2307
-
2308
- .empty-state {
2309
- max-width: var(--content-width);
2310
- margin: 8vh auto 0;
2311
- color: var(--muted);
2312
- text-align: center;
2313
- }
2314
-
2315
- .empty-state h1 {
2316
- color: var(--text);
2317
- font-size: 30px;
2318
- margin-bottom: 10px;
2319
- font-weight: 800;
2320
- background: linear-gradient(135deg, var(--text) 40%, var(--accent));
2321
- -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text;
2322
- }
2323
-
2324
- .empty-state p {
2325
- font-size: 14px;
2326
- line-height: 1.6;
2327
- max-width: 480px;
2328
- margin: 0 auto;
2329
- }
2330
-
2331
- .empty-grid {
2332
- display: grid;
2333
- grid-template-columns: repeat(3, 1fr);
2334
- gap: 10px;
2335
- margin-top: 22px;
2336
- }
2337
-
2338
- .empty-chip {
2339
- border: 1px solid var(--accent-soft);
2340
- background: linear-gradient(135deg, rgba(111,66,232,0.06), rgba(129,140,248,0.04));
2341
- border-radius: var(--radius);
2342
- padding: 14px;
2343
- font-size: 12.5px;
2344
- cursor: pointer;
2345
- transition: all .18s;
2346
- color: var(--muted);
2347
- }
2348
- .empty-chip:hover {
2349
- border-color: rgba(111,66,232,0.24);
2350
- background: linear-gradient(135deg, rgba(111,66,232,0.10), rgba(129,140,248,0.07));
2351
- color: var(--text);
2352
- transform: translateY(-2px);
2353
- box-shadow: 0 8px 24px rgba(111,66,232,0.10);
2354
- }
2355
- .empty-chip-icon {
2356
- font-size: 22px;
2357
- margin-bottom: 8px;
2358
- display: block;
2359
- }
2360
- .fake-for-css {
2361
- font-size: 13px;
2362
- color: var(--text);
2363
- }
2364
-
2365
- ::-webkit-scrollbar-thumb {
2366
- background: rgba(255, 255, 255, 0.15);
2367
- border-radius: 3px;
2368
- }
2369
-
2370
- ::-webkit-scrollbar-thumb:hover {
2371
- background: var(--muted);
2372
- }
2373
-
2374
- /* ── 태블릿 (≤900px) ── */
2375
- @media (max-width: 900px) {
2376
- .status-pill.hide-mobile { display: none; }
2377
-
2378
- .ops-strip {
2379
- width: calc(100% - 28px);
2380
- grid-template-columns: 1fr;
2381
- margin-top: 12px;
2382
- }
2383
-
2384
- .bubble { max-width: 92%; }
2385
-
2386
- .empty-grid { grid-template-columns: 1fr; }
2387
- .empty-state { margin-top: 4vh; }
2388
-
2389
- .admin-stats { grid-template-columns: repeat(2, minmax(0, 1fr)); }
2390
- .sensitivity-grid { grid-template-columns: 1fr; }
2391
- .admin-form-grid { grid-template-columns: 1fr; }
2392
- .mcp-list { grid-template-columns: 1fr; }
2393
-
2394
- .admin-table {
2395
- display: block;
2396
- overflow-x: auto;
2397
- white-space: nowrap;
2398
- }
2399
- }
2400
-
2401
- /* ── 모바일 드로어 (≤768px) ── */
2402
- @media (max-width: 768px) {
2403
- /* ops-strip: 가로 스크롤 한 줄로 압축 */
2404
- .ops-strip {
2405
- display: flex;
2406
- flex-direction: row;
2407
- overflow-x: auto;
2408
- gap: 8px;
2409
- width: calc(100% - 24px);
2410
- margin: 10px auto 0;
2411
- scrollbar-width: none;
2412
- -ms-overflow-style: none;
2413
- }
2414
- .ops-strip::-webkit-scrollbar { display: none; }
2415
- .ops-card {
2416
- flex: 0 0 auto;
2417
- min-width: 160px;
2418
- padding: 10px 12px;
2419
- font-size: 12px;
2420
- }
2421
- .ops-label { font-size: 9px; }
2422
- .ops-value { font-size: 13px; }
2423
- .ops-meta { font-size: 10px; }
2424
- .ops-icon { font-size: 18px; }
2425
- body.lattice-ref-chat { overflow: hidden; }
2426
-
2427
- .sidebar-toggle { display: flex; align-items: center; justify-content: center; }
2428
- .sidebar-close { display: flex; align-items: center; justify-content: center; }
2429
-
2430
- /* 사이드바: fixed 드로어로 전환 */
2431
- .sidebar,
2432
- .app-layout .sidebar {
2433
- position: fixed;
2434
- top: 0;
2435
- left: 0;
2436
- height: 100dvh;
2437
- width: 280px;
2438
- min-width: 0;
2439
- z-index: 100;
2440
- transform: translateX(-100%);
2441
- transition: transform 0.25s cubic-bezier(0.4,0,0.2,1);
2442
- border-right: 1px solid var(--border-strong);
2443
- box-shadow: 4px 0 32px rgba(88,72,150,0.18);
2444
- background: var(--surface);
2445
- backdrop-filter: none;
2446
- -webkit-backdrop-filter: none;
2447
- }
2448
- body.sidebar-open .sidebar {
2449
- transform: translateX(0);
2450
- }
2451
-
2452
- .sidebar-header { padding: 14px 14px; }
2453
- .sidebar-footer { padding: 10px 14px 14px; border-top: 1px solid var(--border); }
2454
-
2455
- /* 메인 채팅은 항상 전체 너비 */
2456
- .main-chat { width: 100%; flex: 1; }
2457
-
2458
- .chat-header { padding: 10px 14px; }
2459
- .header-pills { gap: 6px; }
2460
-
2461
- .messages-viewport { padding: 16px 12px 12px; }
2462
- .input-area { padding: 10px 12px max(14px, env(safe-area-inset-bottom)); }
2463
-
2464
- .bubble { max-width: 94%; }
2465
- }
2466
-
2467
- /* ── 폰 (≤480px) ── */
2468
- @media (max-width: 480px) {
2469
- .bubble { max-width: 98%; font-size: 14px; }
2470
- .sender-label { font-size: 11px; }
2471
- textarea { font-size: 16px; } /* iOS 자동 줌 방지 */
2472
- .model-badge span { max-width: 140px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
2473
- .header-pills .status-pill { display: none; }
2474
- .admin-stats { grid-template-columns: 1fr; }
2475
- }
2476
-
2477
- /* Sidebar trigger button */
2478
- .setup-wizard-sidebar-btn {
2479
- width: 100%;
2480
- margin-bottom: 8px;
2481
- padding: 10px 12px;
2482
- border-radius: 8px;
2483
- background: rgba(122, 162, 255, 0.10);
2484
- border: 1px solid rgba(122, 162, 255, 0.28);
2485
- color: var(--text);
2486
- cursor: pointer;
2487
- display: flex;
2488
- align-items: center;
2489
- justify-content: center;
2490
- gap: 8px;
2491
- font-size: 13px;
2492
- font-weight: 600;
2493
- }
2494
- .setup-wizard-sidebar-btn:hover {
2495
- background: rgba(122, 162, 255, 0.18);
2496
- border-color: rgba(122, 162, 255, 0.5);
2497
- }
2498
-
2499
- /* Full-screen overlay */
2500
- #setup-overlay {
2501
- display: none;
2502
- position: fixed;
2503
- inset: 0;
2504
- z-index: 9000;
2505
- background: rgba(111, 66, 232, 0.18);
2506
- backdrop-filter: none;
2507
- align-items: center;
2508
- justify-content: center;
2509
- }
2510
- #setup-overlay.open { display: flex; }
2511
-
2512
- /* Wizard card */
2513
- .wizard-card {
2514
- background: var(--surface);
2515
- border: 1px solid var(--border-strong);
2516
- border-radius: 20px;
2517
- width: min(960px, calc(100vw - 40px));
2518
- max-height: calc(100vh - 60px);
2519
- display: flex;
2520
- flex-direction: column;
2521
- overflow: hidden;
2522
- box-shadow: 0 32px 80px rgba(0,0,0,0.55);
2523
- }
2524
-
2525
- /* Wizard header */
2526
- .wizard-header {
2527
- padding: 22px 28px 18px;
2528
- border-bottom: 1px solid var(--border);
2529
- display: flex;
2530
- align-items: center;
2531
- justify-content: space-between;
2532
- gap: 16px;
2533
- flex-shrink: 0;
2534
- }
2535
- .wizard-title { font-size: 18px; font-weight: 700; }
2536
- .wizard-subtitle { font-size: 12px; color: var(--muted); margin-top: 3px; }
2537
-
2538
- /* Step dots */
2539
- .wizard-steps {
2540
- display: flex;
2541
- gap: 6px;
2542
- align-items: center;
2543
- }
2544
- .wstep {
2545
- display: flex;
2546
- align-items: center;
2547
- gap: 6px;
2548
- font-size: 12px;
2549
- color: var(--faint);
2550
- font-weight: 600;
2551
- }
2552
- .wstep-dot {
2553
- width: 26px; height: 26px;
2554
- border-radius: 50%;
2555
- border: 2px solid var(--border-strong);
2556
- display: flex; align-items: center; justify-content: center;
2557
- font-size: 11px; font-weight: 700;
2558
- transition: all .25s;
2559
- }
2560
- .wstep.active .wstep-dot { background: var(--accent-3); border-color: var(--accent-3); color: #0f1214; }
2561
- .wstep.done .wstep-dot { background: var(--accent); border-color: var(--accent); color: #0f1214; }
2562
- .wstep-sep { width: 24px; height: 2px; background: var(--border); border-radius: 2px; }
2563
- .wstep-sep.done { background: var(--accent); }
2564
-
2565
- .wizard-close {
2566
- background: none; border: 1px solid var(--border);
2567
- color: var(--muted); cursor: pointer;
2568
- border-radius: 8px; padding: 7px 9px; font-size: 16px;
2569
- }
2570
- .wizard-close:hover { color: var(--text); border-color: var(--border-strong); }
2571
-
2572
- /* Wizard body */
2573
- .wizard-body.lattice-ref-chat {
2574
- flex: 1;
2575
- overflow-y: auto;
2576
- padding: 24px 28px;
2577
- }
2578
-
2579
- /* ── Step 1: Scan ── */
2580
- .scan-grid {
2581
- display: grid;
2582
- grid-template-columns: 1fr 1fr;
2583
- gap: 10px;
2584
- margin-top: 16px;
2585
- }
2586
- .scan-row {
2587
- display: flex;
2588
- align-items: flex-start;
2589
- gap: 10px;
2590
- background: var(--surface-2);
2591
- border: 1px solid var(--border);
2592
- border-radius: 10px;
2593
- padding: 12px 14px;
2594
- font-size: 13px;
2595
- opacity: 0;
2596
- transform: translateY(6px);
2597
- transition: opacity .3s, transform .3s;
2598
- }
2599
- .scan-row.visible { opacity: 1; transform: none; }
2600
- .scan-icon { font-size: 18px; flex-shrink: 0; margin-top: 1px; }
2601
- .scan-label { color: var(--muted); font-size: 11px; font-weight: 700; margin-bottom: 3px; }
2602
- .scan-value { font-weight: 600; }
2603
- .scan-pulse {
2604
- display: flex; align-items: center; gap: 10px;
2605
- color: var(--muted); font-size: 14px; padding: 8px 0;
2606
- }
2607
- .scan-spinner {
2608
- width: 18px; height: 18px;
2609
- border: 2px solid var(--border-strong);
2610
- border-top-color: var(--accent-3);
2611
- border-radius: 50%;
2612
- animation: spin .8s linear infinite;
2613
- flex-shrink: 0;
2614
- }
2615
- @keyframes spin { to { transform: rotate(360deg); } }
2616
-
2617
- /* ── Step 2: Select ── */
2618
- .rec-section-title {
2619
- font-size: 11px; font-weight: 700; letter-spacing: .06em;
2620
- color: var(--muted); text-transform: uppercase;
2621
- margin: 20px 0 10px;
2622
- }
2623
- .rec-section-title:first-child { margin-top: 0; }
2624
-
2625
- .rec-grid {
2626
- display: grid;
2627
- grid-template-columns: 1fr 1fr;
2628
- gap: 8px;
2629
- }
2630
- .rec-item {
2631
- background: var(--surface-2);
2632
- border: 1.5px solid var(--border);
2633
- border-radius: 12px;
2634
- padding: 12px 14px;
2635
- cursor: pointer;
2636
- display: flex;
2637
- align-items: flex-start;
2638
- gap: 11px;
2639
- transition: border-color .15s, background .15s;
2640
- }
2641
- .rec-item.checked {
2642
- border-color: rgba(48, 167, 137, 0.55);
2643
- background: linear-gradient(135deg, rgba(48,167,137,.10), var(--surface-2));
2644
- }
2645
- .rec-item.disabled {
2646
- opacity: 0.38;
2647
- cursor: not-allowed;
2648
- }
2649
- .rec-item:not(.disabled):hover { border-color: rgba(122,162,255,.45); }
2650
- .rec-checkbox {
2651
- width: 18px; height: 18px; flex-shrink: 0;
2652
- border: 2px solid var(--border-strong);
2653
- border-radius: 5px;
2654
- display: flex; align-items: center; justify-content: center;
2655
- font-size: 11px; margin-top: 2px;
2656
- transition: all .15s;
2657
- }
2658
- .rec-item.checked .rec-checkbox {
2659
- background: var(--accent);
2660
- border-color: var(--accent);
2661
- color: #fff;
2662
- }
2663
- .rec-item-body.lattice-ref-chat { flex: 1; min-width: 0; }
2664
- .rec-item-header { display: flex; align-items: center; gap: 7px; flex-wrap: wrap; }
2665
- .rec-item-name { font-size: 13px; font-weight: 700; }
2666
- .rec-badge {
2667
- font-size: 10px; font-weight: 700; padding: 2px 7px;
2668
- border-radius: 99px; border: 1px solid;
2669
- white-space: nowrap;
2670
- }
2671
- .rec-badge.installed { color: #9ce5d7; border-color: rgba(48,167,137,.4); background: rgba(48,167,137,.10); }
2672
- .rec-badge.available { color: var(--accent-3); border-color: rgba(122,162,255,.35); background: rgba(122,162,255,.08); }
2673
- .rec-badge.active { color: #9ce5d7; border-color: rgba(48,167,137,.4); background: rgba(48,167,137,.10); }
2674
- .rec-badge.ready { color: var(--accent-2); border-color: rgba(213,162,65,.4); background: rgba(213,162,65,.10); }
2675
- .rec-badge.disabled-b { color: var(--faint); border-color: var(--border); background: transparent; }
2676
- .rec-badge.auth { color: #e5c46a; border-color: rgba(229,196,106,.35); background: rgba(229,196,106,.08); }
2677
- .rec-item-sub { font-size: 11px; color: var(--muted); margin-top: 4px; }
2678
- .rec-recommended {
2679
- font-size: 10px; font-weight: 700; color: var(--accent-2);
2680
- background: rgba(213,162,65,.12); border: 1px solid rgba(213,162,65,.3);
2681
- padding: 2px 6px; border-radius: 99px;
2682
- }
2683
-
2684
- /* ── Step 3: Install ── */
2685
- .install-list { display: flex; flex-direction: column; gap: 8px; margin-top: 8px; }
2686
- .install-row {
2687
- background: var(--surface-2);
2688
- border: 1px solid var(--border);
2689
- border-radius: 10px;
2690
- padding: 13px 16px;
2691
- display: flex; align-items: flex-start; gap: 12px;
2692
- }
2693
- .install-status-icon { font-size: 18px; flex-shrink: 0; width: 22px; text-align: center; }
2694
- .install-row-body.lattice-ref-chat { flex: 1; min-width: 0; }
2695
- .install-row-name { font-size: 13px; font-weight: 600; margin-bottom: 4px; }
2696
- .install-row-msg { font-size: 12px; color: var(--muted); white-space: pre-line; line-height: 1.5; }
2697
- .install-row.status-done { border-color: rgba(48,167,137,.4); }
2698
- .install-row.status-error { border-color: rgba(228,87,87,.4); }
2699
- .install-row.status-auth { border-color: rgba(229,196,106,.4); }
2700
- .install-row.status-waiting{ border-color: rgba(122,162,255,.35); }
2701
- .install-mini-spinner {
2702
- display: inline-block;
2703
- width: 14px; height: 14px;
2704
- border: 2px solid var(--border-strong);
2705
- border-top-color: var(--accent-3);
2706
- border-radius: 50%;
2707
- animation: spin .7s linear infinite;
2708
- vertical-align: middle; margin-right: 5px;
2709
- }
2710
-
2711
- /* Wizard footer */
2712
- .wizard-footer {
2713
- padding: 16px 28px;
2714
- border-top: 1px solid var(--border);
2715
- display: flex;
2716
- align-items: center;
2717
- justify-content: space-between;
2718
- flex-shrink: 0;
2719
- }
2720
- .wizard-footer-info { font-size: 12px; color: var(--muted); }
2721
- .wizard-btn-row { display: flex; gap: 10px; }
2722
- .wbtn {
2723
- padding: 10px 20px; border-radius: 9px;
2724
- font-size: 13px; font-weight: 700; cursor: pointer;
2725
- border: 1px solid transparent; transition: all .15s;
2726
- }
2727
- .wbtn-primary { background: var(--accent); color: #0f1214; }
2728
- .wbtn-primary:hover { background: #38c09c; }
2729
- .wbtn-primary:disabled { opacity: .45; cursor: not-allowed; }
2730
- .wbtn-ghost {
2731
- background: transparent; border-color: var(--border);
2732
- color: var(--muted);
2733
- }
2734
- .wbtn-ghost:hover { border-color: var(--border-strong); color: var(--text); }
2735
-
2736
- /* Complete screen */
2737
- .wizard-complete {
2738
- text-align: center; padding: 40px 20px;
2739
- }
2740
- .wizard-complete-icon { font-size: 56px; margin-bottom: 16px; }
2741
- .wizard-complete h2 { font-size: 22px; font-weight: 700; margin-bottom: 10px; }
2742
- .wizard-complete p { color: var(--muted); font-size: 14px; line-height: 1.6; }
2743
-
2744
- /* ── 스크롤바 ── */
2745
- ::-webkit-scrollbar { width: 5px; height: 5px; }
2746
- ::-webkit-scrollbar-track { background: transparent; }
2747
- ::-webkit-scrollbar-thumb {
2748
- background: rgba(255,255,255,0.08);
2749
- border-radius: 99px;
2750
- }
2751
- ::-webkit-scrollbar-thumb:hover { background: rgba(255,255,255,0.14); }
2752
-
2753
- /* ── 패널 공통 ── */
2754
- .admin-panel {
2755
- background: var(--card);
2756
- border-left: 1px solid var(--border);
2757
- backdrop-filter: none; /* glass removed v3.5.0 */
2758
- color: var(--text);
2759
- }
2760
- .admin-header {
2761
- background: var(--sidebar);
2762
- border-bottom: 1px solid var(--accent-soft);
2763
- }
2764
- .admin-form-field label {
2765
- color: var(--faint);
2766
- font-size: 11px;
2767
- letter-spacing: 0.05em;
2768
- }
2769
- .admin-form-field input, .admin-form-field select, .admin-form-field textarea {
2770
- background: var(--input);
2771
- border-color: rgba(111,66,232,0.18);
2772
- border-radius: 9px;
2773
- color: var(--text);
2774
- }
2775
- .admin-form-field input:focus, .admin-form-field select:focus, .admin-form-field textarea:focus {
2776
- border-color: rgba(111,66,232,0.50);
2777
- box-shadow: 0 0 0 3px rgba(111,66,232,0.08);
2778
- }
2779
- .admin-action {
2780
- background: linear-gradient(135deg, var(--border), rgba(139,108,255,0.10));
2781
- border-color: rgba(111,66,232,0.28);
2782
- color: var(--accent);
2783
- }
2784
- .admin-action:hover {
2785
- background: linear-gradient(135deg, rgba(111,66,232,0.22), rgba(139,108,255,0.16));
2786
- box-shadow: 0 0 16px rgba(111,66,232,0.16);
2787
- }
2788
-
2789
- /* ── 빈 채팅 화면 ── */
2790
- .empty-state {
2791
- display: flex;
2792
- flex-direction: column;
2793
- align-items: center;
2794
- justify-content: center;
2795
- flex: 1;
2796
- gap: 12px;
2797
- pointer-events: none;
2798
- padding: 40px;
2799
- }
2800
- .empty-icon {
2801
- width: 72px; height: 72px;
2802
- background: linear-gradient(135deg, var(--border), rgba(129,140,248,0.12));
2803
- border: 1px solid var(--border);
2804
- border-radius: 20px;
2805
- display: flex; align-items: center; justify-content: center;
2806
- font-size: 32px;
2807
- color: var(--accent);
2808
- box-shadow: 0 0 30px var(--accent-soft);
2809
- }
2810
- .empty-title {
2811
- font-size: 20px; font-weight: 800;
2812
- background: linear-gradient(135deg, var(--text), var(--muted));
2813
- -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text;
2814
- }
2815
- .empty-sub { font-size: 13px; color: var(--faint); text-align: center; line-height: 1.6; }
2816
-
2817
- /* ── 모델 배지 tooltip ── */
2818
- .model-badge:hover { cursor: pointer; }
2819
-
2820
- /* ── 파일 다운로드 카드 개선 ── */
2821
- .file-download-card {
2822
- border: 1px solid rgba(111,66,232,0.16);
2823
- background: linear-gradient(135deg, rgba(111,66,232,0.07), rgba(129,140,248,0.04));
2824
- border-radius: var(--radius);
2825
- box-shadow: 0 4px 16px rgba(111,66,232,0.08);
2826
- }
2827
- .file-dl-btn {
2828
- background: linear-gradient(135deg, var(--border), rgba(129,140,248,0.08));
2829
- border-color: rgba(111,66,232,0.24);
2830
- }
2831
- .file-dl-btn:hover {
2832
- background: linear-gradient(135deg, rgba(111,66,232,0.20), rgba(129,140,248,0.14));
2833
- box-shadow: 0 0 12px rgba(111,66,232,0.16);
2834
- }
2835
-
2836
- /* ── setup wizard 버튼 ── */
2837
- .setup-wizard-sidebar-btn {
2838
- width: 100%;
2839
- padding: 9px 12px;
2840
- border-radius: var(--radius-sm);
2841
- background: rgba(244,114,182,0.07);
2842
- border: 1px solid rgba(244,114,182,0.18);
2843
- color: var(--accent-pink);
2844
- cursor: pointer;
2845
- display: flex;
2846
- align-items: center;
2847
- justify-content: center;
2848
- gap: 8px;
2849
- font-weight: 600;
2850
- font-size: 12.5px;
2851
- transition: all .15s;
2852
- }
2853
- .setup-wizard-sidebar-btn:hover {
2854
- background: rgba(244,114,182,0.13);
2855
- border-color: rgba(244,114,182,0.3);
2856
- }
2857
-
2858
- /* ── MCP 드롭다운 개선 ── */
2859
- .mcp-dropdown {
2860
- background: var(--surface-elevated);
2861
- border: 1px solid rgba(111,66,232,0.16);
2862
- border-radius: var(--radius);
2863
- box-shadow: var(--shadow), 0 0 20px rgba(111,66,232,0.08);
2864
- }
2865
- .mcp-recommend-btn {
2866
- background: linear-gradient(135deg, rgba(111,66,232,0.10), rgba(129,140,248,0.07));
2867
- border: 1px solid rgba(111,66,232,0.16);
2868
- border-radius: 999px;
2869
- color: var(--accent);
2870
- }
2871
-
2872
- /* Lattice AI workspace — product shell theme. */
2873
- .app-layout {
2874
- --bg: var(--bg);
2875
- --surface: var(--surface);
2876
- --surface-2: var(--surface-2);
2877
- --surface-3: var(--surface-3);
2878
- --accent: var(--accent);
2879
- --accent-2: var(--lt-accent-2, #0f9f8f);
2880
- --accent-3: var(--accent-3);
2881
- --accent-pink: var(--accent-pink);
2882
- --accent-soft: var(--accent-soft);
2883
- --text: var(--text);
2884
- --muted: var(--muted);
2885
- --faint: var(--faint);
2886
- --border: var(--border);
2887
- --border-strong: var(--border-strong);
2888
- --shadow: var(--shadow);
2889
- --shadow-sm: var(--shadow-sm);
2890
- --glow-green: 0 0 30px var(--border);
2891
- position: relative;
2892
- isolation: isolate;
2893
- background:
2894
- radial-gradient(circle at 82% 12%, var(--border), transparent 30%),
2895
- radial-gradient(circle at 10% 80%, rgba(180,160,255,0.16), transparent 35%),
2896
- linear-gradient(180deg, var(--bg) 0%, var(--surface-2) 52%, var(--surface) 100%);
2897
- }
2898
-
2899
- .app-layout::before {
2900
- content: '';
2901
- position: absolute;
2902
- inset: 0;
2903
- z-index: -1;
2904
- pointer-events: none;
2905
- background:
2906
- radial-gradient(circle, rgba(111,66,232,0.18) 1px, transparent 1.8px),
2907
- linear-gradient(rgba(111,66,232,0.06) 1px, transparent 1px),
2908
- linear-gradient(90deg, rgba(111,66,232,0.04) 1px, transparent 1px);
2909
- background-size: 76px 76px, 48px 48px, 48px 48px;
2910
- background-position: 18px 22px, 0 0, 0 0;
2911
- mask-image: linear-gradient(180deg, rgba(0,0,0,0.18), rgba(0,0,0,0.03));
2912
- }
2913
-
2914
- .app-layout::after {
2915
- content: '';
2916
- position: absolute;
2917
- inset: 0;
2918
- z-index: -1;
2919
- pointer-events: none;
2920
- background:
2921
- linear-gradient(116deg, transparent 0 42%, rgba(125,183,255,0.08) 42.15%, transparent 42.35% 100%),
2922
- linear-gradient(28deg, transparent 0 58%, rgba(167,124,255,0.08) 58.15%, transparent 58.35% 100%);
2923
- opacity: 0.72;
2924
- }
2925
-
2926
- .app-layout .sidebar {
2927
- background: rgba(30, 32, 43, 0.94);
2928
- border-right-color: rgba(218,225,255,0.13);
2929
- box-shadow: inset -1px 0 0 rgba(255,255,255,0.025);
2930
- }
2931
-
2932
- @media (max-width: 768px) {
2933
- .app-layout .sidebar {
2934
- background: #222431;
2935
- backdrop-filter: none;
2936
- -webkit-backdrop-filter: none;
2937
- }
2938
- }
2939
-
2940
- .app-layout .sidebar-header,
2941
- .app-layout .user-strip,
2942
- .app-layout .sidebar-footer {
2943
- border-color: rgba(243,241,232,0.075);
2944
- }
2945
-
2946
- .app-layout .logo-box,
2947
- .app-layout .user-avatar {
2948
- background: radial-gradient(circle at 35% 30%, #ffffff 0 16%, #a77cff 17% 62%, #5b6cff 100%);
2949
- color: #171926;
2950
- box-shadow: 0 0 0 1px rgba(255,255,255,0.18), 0 10px 24px rgba(0,0,0,0.28), 0 0 26px rgba(167,124,255,0.18);
2951
- }
2952
-
2953
- .app-layout .brand-title {
2954
- background: none;
2955
- -webkit-text-fill-color: currentColor;
2956
- color: var(--text);
2957
- letter-spacing: 0;
2958
- }
2959
-
2960
- .app-layout .history-item:hover,
2961
- .app-layout .history-item.active {
2962
- background: rgba(167,124,255,0.10);
2963
- border-left-color: var(--accent);
2964
- }
2965
-
2966
- .app-layout .history-item.active {
2967
- border-color: rgba(167,124,255,0.24);
2968
- }
2969
-
2970
- .app-layout .new-chat-btn,
2971
- .app-layout .status-btn,
2972
- .app-layout .setup-wizard-sidebar-btn,
2973
- .app-layout .admin-btn {
2974
- background: rgba(247,247,242,0.045);
2975
- border-color: rgba(218,225,255,0.12);
2976
- color: var(--text);
2977
- box-shadow: none;
2978
- }
2979
-
2980
- .app-layout .new-chat-btn:hover,
2981
- .app-layout .status-btn:hover,
2982
- .app-layout .setup-wizard-sidebar-btn:hover,
2983
- .app-layout .admin-btn:hover {
2984
- background: rgba(167,124,255,0.12);
2985
- border-color: rgba(167,124,255,0.3);
2986
- color: var(--accent);
2987
- }
2988
-
2989
- .app-layout .main-chat {
2990
- background: transparent;
2991
- }
2992
-
2993
- .app-layout .chat-header {
2994
- background: rgba(33, 35, 48, 0.82);
2995
- border-bottom-color: rgba(218,225,255,0.12);
2996
- box-shadow: 0 1px 0 rgba(255,255,255,0.025);
2997
- }
2998
-
2999
- .app-layout .model-badge,
3000
- .app-layout .status-pill {
3001
- background: rgba(247,247,242,0.045);
3002
- border-color: rgba(218,225,255,0.13);
3003
- color: var(--muted);
3004
- }
3005
-
3006
- .app-layout .model-badge {
3007
- color: var(--text);
3008
- }
3009
-
3010
- .app-layout .status-pill.vpc-ready {
3011
- background: rgba(32,184,170,0.11);
3012
- border-color: rgba(32,184,170,0.28);
3013
- color: #7ee3d7;
3014
- }
3015
-
3016
- .app-layout .status-dot {
3017
- background: var(--surface);
3018
- box-shadow: 0 0 8px rgba(247,247,242,0.7), 0 0 18px rgba(167,124,255,0.36);
3019
- }
3020
-
3021
- .app-layout .ops-card {
3022
- background: rgba(34, 36, 49, 0.82);
3023
- border-color: rgba(218,225,255,0.14);
3024
- box-shadow: var(--shadow-sm), inset 0 1px 0 rgba(255,255,255,0.035);
3025
- }
3026
-
3027
- .app-layout .ops-card.primary {
3028
- background: linear-gradient(135deg, rgba(167,124,255,0.16), rgba(34,36,49,0.9) 58%);
3029
- border-color: rgba(167,124,255,0.28);
3030
- }
3031
-
3032
- .app-layout .ops-card.interactive:hover {
3033
- background: linear-gradient(135deg, rgba(167,124,255,0.18), rgba(34,36,49,0.96) 62%);
3034
- border-color: rgba(167,124,255,0.38);
3035
- box-shadow: var(--shadow), 0 0 26px rgba(167,124,255,0.13);
3036
- }
3037
-
3038
- .app-layout .ops-card.primary .ops-icon,
3039
- .app-layout .empty-icon,
3040
- .app-layout .empty-state > div[style] {
3041
- background: rgba(167,124,255,0.12);
3042
- border-color: rgba(167,124,255,0.24);
3043
- color: var(--accent);
3044
- box-shadow: none;
3045
- }
3046
-
3047
- .app-layout .ops-card:not(.primary) .ops-icon {
3048
- background: rgba(247,247,242,0.045);
3049
- border-color: rgba(218,225,255,0.1);
3050
- color: var(--accent-3);
3051
- }
3052
-
3053
- .app-layout .empty-state h1 {
3054
- background: none;
3055
- -webkit-text-fill-color: currentColor;
3056
- color: var(--text);
3057
- }
3058
-
3059
- .app-layout .empty-chip {
3060
- background: rgba(34,36,49,0.82);
3061
- border-color: rgba(218,225,255,0.12);
3062
- color: var(--muted);
3063
- box-shadow: none;
3064
- }
3065
-
3066
- .app-layout .empty-chip:hover {
3067
- background: rgba(167,124,255,0.10);
3068
- border-color: rgba(167,124,255,0.28);
3069
- box-shadow: 0 10px 28px rgba(0,0,0,0.2);
3070
- }
3071
-
3072
- .app-layout .user .bubble {
3073
- background: linear-gradient(135deg, rgba(98,89,196,0.96), rgba(45,116,156,0.92));
3074
- border-color: rgba(167,124,255,0.24);
3075
- color: #fbfbff;
3076
- box-shadow: 0 8px 24px rgba(0,0,0,0.22);
3077
- }
3078
-
3079
- .app-layout .ai .bubble {
3080
- background: rgba(34, 36, 49, 0.9);
3081
- border-color: rgba(218,225,255,0.13);
3082
- box-shadow: 0 8px 24px rgba(0,0,0,0.2), inset 0 1px 0 rgba(255,255,255,0.035);
3083
- }
3084
-
3085
- .app-layout .bubble h1,
3086
- .app-layout .bubble h2,
3087
- .app-layout .bubble h3,
3088
- .app-layout .code-lang {
3089
- color: var(--accent-3);
3090
- }
3091
-
3092
- .app-layout .code-container,
3093
- .app-layout pre {
3094
- background: var(--surface-2);
3095
- border-color: rgba(218,225,255,0.10);
3096
- }
3097
-
3098
- .app-layout .code-header {
3099
- background: rgba(111,66,232,0.08);
3100
- border-bottom-color: rgba(218,225,255,0.09);
3101
- }
3102
-
3103
- .app-layout .input-area {
3104
- background: linear-gradient(0deg, var(--input) 0%, var(--input) 64%, transparent 100%);
3105
- }
3106
-
3107
- .app-layout .input-box {
3108
- background: rgba(34, 36, 49, 0.94);
3109
- border-color: rgba(218,225,255,0.15);
3110
- box-shadow: var(--shadow), inset 0 1px 0 rgba(255,255,255,0.035);
3111
- }
3112
-
3113
- .app-layout .input-box:focus-within {
3114
- border-color: rgba(167,124,255,0.42);
3115
- box-shadow: var(--shadow), 0 0 0 3px rgba(167,124,255,0.08);
3116
- }
3117
-
3118
- .app-layout .action-btn:hover,
3119
- .app-layout .file-type-btn:hover {
3120
- background: rgba(167,124,255,0.10);
3121
- color: var(--accent);
3122
- border-color: rgba(167,124,255,0.28);
3123
- }
3124
-
3125
- .app-layout .send-btn {
3126
- background: linear-gradient(135deg, var(--accent), #7b61ff);
3127
- color: #fff;
3128
- box-shadow: 0 8px 20px rgba(111,66,232,0.24);
3129
- }
3130
-
3131
- .app-layout .send-btn:hover {
3132
- background: var(--surface-2);
3133
- box-shadow: 0 10px 24px rgba(0,0,0,0.28);
3134
- }
3135
-
3136
- /* PPT reference skin: light workspace, indigo navigation, modal-first flow.
3137
- v2.2.6: gated to the explicit light theme so it no longer shadows the
3138
- dark palette in tokens.css. In dark, body sets no color tokens and the
3139
- page inherits :root[data-lt-theme="dark"] — no loaded-last override needed. */
3140
- :root[data-lt-theme="light"] body.lattice-ref-chat {
3141
- --bg: #f8f6ff;
3142
- --surface: #ffffff;
3143
- --surface-2: #f3f0ff;
3144
- --surface-3: #ece7ff;
3145
- --accent: #6f4bf6;
3146
- --accent-2: #ffb84d;
3147
- --accent-3: #7868ff;
3148
- --accent-soft: rgba(111,75,246,0.10);
3149
- --danger: #ef4444;
3150
- --text: #24223d;
3151
- --muted: #625f7c;
3152
- --faint: #9690b2;
3153
- --border: rgba(111,75,246,0.13);
3154
- --border-strong: rgba(111,75,246,0.24);
3155
- --shadow: 0 24px 68px rgba(86,70,160,0.16);
3156
- --shadow-sm: 0 10px 28px rgba(86,70,160,0.10);
3157
- }
3158
- body::before {
3159
- background:
3160
- radial-gradient(circle at 76% 14%, rgba(111,75,246,0.12), transparent 30%),
3161
- radial-gradient(circle at 8% 80%, rgba(196,181,253,0.26), transparent 35%),
3162
- linear-gradient(180deg, var(--surface) 0%, var(--surface) 100%);
3163
- }
3164
- .bg-grid {
3165
- opacity: 0.28;
3166
- background-image:
3167
- radial-gradient(circle, rgba(111,75,246,0.28) 1px, transparent 1.8px),
3168
- linear-gradient(rgba(111,75,246,0.06) 1px, transparent 1px),
3169
- linear-gradient(90deg, rgba(111,75,246,0.05) 1px, transparent 1px);
3170
- background-size: 84px 84px, 48px 48px, 48px 48px;
3171
- mask-image: linear-gradient(180deg, rgba(0,0,0,0.24), rgba(0,0,0,0.04));
3172
- }
3173
- .app-layout::after {
3174
- background:
3175
- linear-gradient(115deg, transparent 0 40%, rgba(111,75,246,0.08) 40.15%, transparent 40.4% 100%),
3176
- radial-gradient(ellipse at 5% 88%, rgba(111,75,246,0.16), transparent 35%);
3177
- }
3178
- .app-layout .sidebar {
3179
- background: var(--sidebar);
3180
- border-right-color: rgba(111,75,246,0.12);
3181
- box-shadow: 12px 0 46px rgba(86,70,160,0.08);
3182
- }
3183
- .app-layout .sidebar-header,
3184
- .app-layout .user-strip,
3185
- .app-layout .sidebar-footer,
3186
- .app-layout .sidebar-primary-actions,
3187
- .app-layout .chat-header {
3188
- border-color: rgba(111,75,246,0.10);
3189
- }
3190
- .app-layout .logo-box,
3191
- .app-layout .user-avatar {
3192
- background: linear-gradient(135deg, #6f4bf6, #9b87ff);
3193
- color: #fff;
3194
- box-shadow: 0 14px 28px rgba(111,75,246,0.22);
3195
- }
3196
- .app-layout .brand-title,
3197
- .app-layout .empty-state h1 {
3198
- color: var(--text);
3199
- }
3200
- .app-layout .brand-subtitle,
3201
- .app-layout .user-strip,
3202
- .app-layout .history-item,
3203
- .app-layout .logout-btn {
3204
- color: var(--muted);
3205
- }
3206
- .app-layout .sidebar-search input,
3207
- .app-layout .mcp-add-form input,
3208
- .app-layout .mcp-add-form textarea,
3209
- .app-layout .mcp-add-form select,
3210
- .app-layout .pw-field input {
3211
- background: var(--surface);
3212
- border-color: rgba(111,75,246,0.12);
3213
- color: var(--text);
3214
- }
3215
- .app-layout .new-chat-btn,
3216
- .app-layout .status-btn,
3217
- .app-layout .setup-wizard-sidebar-btn,
3218
- .app-layout .admin-btn {
3219
- background: var(--sidebar);
3220
- border-color: rgba(111,75,246,0.13);
3221
- color: var(--text);
3222
- box-shadow: 0 8px 22px rgba(86,70,160,0.06);
3223
- }
3224
- .app-layout .new-chat-btn:hover,
3225
- .app-layout .status-btn:hover,
3226
- .app-layout .setup-wizard-sidebar-btn:hover,
3227
- .app-layout .admin-btn:hover,
3228
- .app-layout .history-item:hover,
3229
- .app-layout .history-item.active {
3230
- background: var(--surface);
3231
- border-color: rgba(111,75,246,0.25);
3232
- color: var(--accent);
3233
- }
3234
- .app-layout .chat-header {
3235
- background: var(--sidebar);
3236
- box-shadow: 0 8px 28px rgba(86,70,160,0.08);
3237
- }
3238
- .app-layout .model-badge,
3239
- .app-layout .status-pill,
3240
- .app-layout .logout-btn {
3241
- background: var(--surface-2);
3242
- border-color: rgba(111,75,246,0.14);
3243
- color: var(--muted);
3244
- }
3245
- .app-layout .model-badge {
3246
- color: var(--text);
3247
- }
3248
- .app-layout .status-dot {
3249
- background: var(--accent);
3250
- box-shadow: 0 0 0 4px rgba(111,75,246,0.10), 0 0 18px rgba(111,75,246,0.30);
3251
- }
3252
- .app-layout .ops-card,
3253
- .app-layout .empty-chip,
3254
- .app-layout .ai .bubble,
3255
- .app-layout .acct-modal,
3256
- .app-layout .mcp-modal {
3257
- background: var(--modal);
3258
- border-color: rgba(111,75,246,0.13);
3259
- box-shadow: var(--shadow-sm), inset 0 1px 0 rgba(255,255,255,0.9);
3260
- }
3261
- .app-layout .ops-card.primary {
3262
- background: linear-gradient(135deg, rgba(111,75,246,0.12), var(--card) 62%);
3263
- border-color: rgba(111,75,246,0.23);
3264
- }
3265
- .app-layout .ops-card.interactive:hover,
3266
- .app-layout .empty-chip:hover {
3267
- background: var(--surface);
3268
- border-color: rgba(111,75,246,0.30);
3269
- box-shadow: 0 18px 42px rgba(86,70,160,0.16);
3270
- }
3271
- .app-layout .ops-card.primary .ops-icon,
3272
- .app-layout .ops-card:not(.primary) .ops-icon,
3273
- .app-layout .empty-state > div[style] {
3274
- background: linear-gradient(135deg, rgba(111,75,246,0.14), rgba(155,135,255,0.12));
3275
- border-color: rgba(111,75,246,0.18);
3276
- color: var(--accent);
3277
- }
3278
- .app-layout .messages-viewport {
3279
- background: transparent;
3280
- }
3281
- .app-layout .user .bubble {
3282
- background: linear-gradient(135deg, #6f4bf6, #7366ff);
3283
- color: #fff;
3284
- border-color: rgba(111,75,246,0.28);
3285
- box-shadow: 0 14px 32px rgba(111,75,246,0.22);
3286
- }
3287
- .app-layout .input-area {
3288
- background: linear-gradient(0deg, var(--input) 0%, var(--input) 64%, transparent 100%);
3289
- }
3290
- .app-layout .input-box {
3291
- background: var(--input);
3292
- border-color: rgba(111,75,246,0.16);
3293
- box-shadow: 0 18px 54px rgba(86,70,160,0.15);
3294
- }
3295
- .app-layout textarea {
3296
- color: var(--text);
3297
- }
3298
- .app-layout .send-btn {
3299
- background: linear-gradient(135deg, #6f4bf6, #796cff);
3300
- color: #fff;
3301
- box-shadow: 0 14px 30px rgba(111,75,246,0.24);
3302
- }
3303
- .workspace-modal-overlay,
3304
- .mode-modal-overlay {
3305
- display: none;
3306
- position: fixed;
3307
- inset: 0;
3308
- z-index: 1400;
3309
- align-items: center;
3310
- justify-content: center;
3311
- padding: 24px;
3312
- background: rgba(111, 66, 232, 0.18);
3313
- backdrop-filter: none;
3314
- }
3315
- .workspace-modal-overlay.open,
3316
- .mode-modal-overlay.open {
3317
- display: flex;
3318
- }
3319
- .workspace-modal,
3320
- .mode-modal {
3321
- width: min(620px, 100%);
3322
- border-radius: 20px;
3323
- background:
3324
- linear-gradient(180deg, rgba(255,255,255,0.98), rgba(250,248,255,0.94));
3325
- border: 1px solid rgba(111,75,246,0.16);
3326
- box-shadow: 0 30px 90px rgba(60,45,130,0.24);
3327
- padding: 30px;
3328
- color: var(--text);
3329
- position: relative;
3330
- }
3331
- .mode-modal {
3332
- width: min(520px, 100%);
3333
- background:
3334
- radial-gradient(circle at 18% 8%, rgba(111,75,246,0.18), transparent 32%),
3335
- linear-gradient(180deg, #ffffff, var(--surface));
3336
- color: var(--text);
3337
- border-color: rgba(111,66,232,0.16);
3338
- }
3339
- .modal-kicker {
3340
- color: var(--accent);
3341
- font-size: 11px;
3342
- font-weight: 800;
3343
- letter-spacing: .08em;
3344
- text-transform: uppercase;
3345
- text-align: center;
3346
- margin-bottom: 8px;
3347
- }
3348
- .mode-modal .modal-kicker { color: var(--accent); }
3349
- .workspace-modal h2,
3350
- .mode-modal h2 {
3351
- text-align: center;
3352
- font-size: 24px;
3353
- margin-bottom: 7px;
3354
- }
3355
- .workspace-modal p,
3356
- .mode-modal p {
3357
- text-align: center;
3358
- color: var(--muted);
3359
- font-size: 13px;
3360
- line-height: 1.6;
3361
- margin-bottom: 22px;
3362
- }
3363
- .mode-modal p { color: var(--muted); }
3364
- .workspace-options,
3365
- .mode-options {
3366
- display: grid;
3367
- grid-template-columns: repeat(2, minmax(0, 1fr));
3368
- gap: 14px;
3369
- }
3370
- .workspace-card,
3371
- .mode-card {
3372
- border-radius: 16px;
3373
- border: 1px solid rgba(111,75,246,0.14);
3374
- background: var(--card);
3375
- padding: 22px 18px;
3376
- cursor: pointer;
3377
- text-align: center;
3378
- transition: transform .18s, box-shadow .18s, border-color .18s;
3379
- }
3380
- .workspace-card:hover,
3381
- .workspace-card.selected,
3382
- .mode-card:hover,
3383
- .mode-card.selected {
3384
- transform: translateY(-3px);
3385
- border-color: rgba(111,75,246,0.42);
3386
- box-shadow: 0 18px 44px rgba(86,70,160,0.18);
3387
- }
3388
- .mode-card {
3389
- background: rgba(255,255,255,0.08);
3390
- border-color: rgba(255,255,255,0.12);
3391
- color: #fff;
3392
- position: relative;
3393
- }
3394
- .mode-card.selected::after {
3395
- content: '✓';
3396
- position: absolute;
3397
- top: 12px;
3398
- right: 12px;
3399
- width: 20px;
3400
- height: 20px;
3401
- border-radius: 50%;
3402
- background: #7b6dff;
3403
- display: grid;
3404
- place-items: center;
3405
- font-size: 12px;
3406
- }
3407
- .workspace-icon,
3408
- .mode-icon {
3409
- width: 58px;
3410
- height: 58px;
3411
- margin: 0 auto 14px;
3412
- border-radius: 20px;
3413
- display: grid;
3414
- place-items: center;
3415
- color: #fff;
3416
- font-size: 26px;
3417
- background: linear-gradient(135deg, #6f4bf6, #9b87ff);
3418
- box-shadow: 0 14px 30px rgba(111,75,246,0.24);
3419
- }
3420
- .workspace-card h3,
3421
- .mode-card h3 {
3422
- font-size: 15px;
3423
- margin-bottom: 7px;
3424
- }
3425
- .workspace-card span,
3426
- .mode-card span {
3427
- display: block;
3428
- color: var(--muted);
3429
- font-size: 12px;
3430
- line-height: 1.45;
3431
- }
3432
- .mode-card span { color: var(--muted); }
3433
- .modal-footnote {
3434
- color: var(--faint);
3435
- font-size: 12px;
3436
- text-align: center;
3437
- margin-top: 18px;
3438
- }
3439
- .mode-close {
3440
- position: absolute;
3441
- top: 14px;
3442
- right: 14px;
3443
- border: 0;
3444
- background: rgba(255,255,255,0.08);
3445
- color: var(--muted);
3446
- border-radius: 10px;
3447
- width: 32px;
3448
- height: 32px;
3449
- cursor: pointer;
3450
- }
3451
- @media (max-width: 768px) {
3452
- .app-layout .sidebar { background: #fff; }
3453
- .workspace-options,
3454
- .mode-options { grid-template-columns: 1fr; }
3455
- .workspace-modal,
3456
- .mode-modal { padding: 24px 18px; }
3457
- }
3458
-
3459
- .ux-hidden { display: none; }
3460
-
3461
- .app-layout .ops-strip { display: none; }
3462
-
3463
- .app-layout .chat-header {
3464
- min-height: 64px;
3465
- padding: 10px 22px;
3466
- }
3467
-
3468
- .app-layout .header-left {
3469
- flex: 1;
3470
- min-width: 0;
3471
- }
3472
-
3473
- .mode-segmented {
3474
- display: inline-grid;
3475
- grid-auto-flow: column;
3476
- grid-auto-columns: minmax(98px, auto);
3477
- gap: 2px;
3478
- padding: 4px;
3479
- border: 1px solid rgba(111,75,246,0.16);
3480
- border-radius: 10px;
3481
- background: var(--surface-2);
3482
- box-shadow: 0 8px 22px rgba(86,70,160,0.08);
3483
- }
3484
-
3485
- .mode-segmented button {
3486
- min-height: 34px;
3487
- border: 0;
3488
- border-radius: 8px;
3489
- background: transparent;
3490
- color: #9b8fd4;
3491
- cursor: pointer;
3492
- font: inherit;
3493
- font-size: 12.5px;
3494
- font-weight: 800;
3495
- white-space: nowrap;
3496
- padding: 0 12px;
3497
- }
3498
-
3499
- .mode-segmented button.active {
3500
- background: linear-gradient(135deg, #6f4bf6, #7b6dff);
3501
- color: #fff;
3502
- box-shadow: 0 10px 24px rgba(111,75,246,0.22);
3503
- }
3504
-
3505
- .mode-segmented button:disabled {
3506
- display: none;
3507
- }
3508
-
3509
- .workspace-type-line {
3510
- font-size: 10.5px;
3511
- color: var(--faint);
3512
- }
3513
-
3514
- .app-layout .sidebar-footer {
3515
- display: none;
3516
- }
3517
-
3518
- .app-layout .reference-side-nav {
3519
- display: flex;
3520
- flex-direction: column;
3521
- gap: 5px;
3522
- padding: 12px 10px 4px;
3523
- }
3524
-
3525
- .app-layout .reference-nav-item {
3526
- width: 100%;
3527
- min-height: 38px;
3528
- border: 1px solid transparent;
3529
- background: transparent;
3530
- color: var(--text);
3531
- border-radius: 8px;
3532
- padding: 0 12px;
3533
- display: flex;
3534
- align-items: center;
3535
- gap: 10px;
3536
- font: inherit;
3537
- font-size: 13px;
3538
- font-weight: 750;
3539
- cursor: pointer;
3540
- text-align: left;
3541
- }
3542
-
3543
- .app-layout .reference-nav-item:hover,
3544
- .app-layout .reference-nav-item.active {
3545
- background: var(--surface);
3546
- border-color: rgba(111,75,246,0.22);
3547
- color: var(--accent);
3548
- }
3549
-
3550
- .home-action-grid {
3551
- display: grid;
3552
- grid-template-columns: repeat(4, minmax(0, 1fr));
3553
- gap: 12px;
3554
- margin: 22px auto 20px;
3555
- max-width: 900px;
3556
- pointer-events: auto;
3557
- }
3558
-
3559
- .home-action-card {
3560
- border: 1px solid rgba(111,75,246,0.14);
3561
- background: var(--card);
3562
- border-radius: 8px;
3563
- padding: 16px;
3564
- text-align: left;
3565
- cursor: pointer;
3566
- color: var(--text);
3567
- min-height: 132px;
3568
- box-shadow: 0 10px 28px rgba(86,70,160,0.08);
3569
- }
3570
-
3571
- .home-action-card:hover {
3572
- transform: translateY(-2px);
3573
- border-color: rgba(111,75,246,0.34);
3574
- box-shadow: 0 18px 42px rgba(86,70,160,0.16);
3575
- }
3576
-
3577
- .home-action-card i {
3578
- display: inline-grid;
3579
- width: 34px;
3580
- height: 34px;
3581
- place-items: center;
3582
- border-radius: 8px;
3583
- margin-bottom: 12px;
3584
- color: #fff;
3585
- background: linear-gradient(135deg, #6f4bf6, #8d7aff);
3586
- }
3587
-
3588
- .home-action-card h3 {
3589
- font-size: 14px;
3590
- margin: 0 0 6px;
3591
- }
3592
-
3593
- .home-action-card p {
3594
- font-size: 12px;
3595
- color: var(--muted);
3596
- line-height: 1.5;
3597
- margin: 0;
3598
- }
3599
-
3600
- .home-summary-grid {
3601
- display: grid;
3602
- grid-template-columns: 1fr 1fr 1fr;
3603
- gap: 12px;
3604
- max-width: 900px;
3605
- margin: 0 auto;
3606
- pointer-events: auto;
3607
- }
3608
-
3609
- .home-summary-panel {
3610
- border: 1px solid rgba(111,75,246,0.12);
3611
- background: var(--card);
3612
- border-radius: 8px;
3613
- padding: 16px;
3614
- text-align: left;
3615
- min-width: 0;
3616
- }
3617
-
3618
- .home-summary-panel header {
3619
- display: flex;
3620
- align-items: center;
3621
- gap: 8px;
3622
- color: var(--text);
3623
- font-size: 13px;
3624
- font-weight: 800;
3625
- margin-bottom: 12px;
3626
- }
3627
-
3628
- .home-summary-panel p {
3629
- display: flex;
3630
- justify-content: space-between;
3631
- gap: 10px;
3632
- color: var(--muted);
3633
- font-size: 12px;
3634
- line-height: 1.45;
3635
- margin: 0 0 9px;
3636
- }
3637
-
3638
- .home-summary-panel p:last-child { margin-bottom: 0; }
3639
- .home-summary-panel span { color: var(--faint); white-space: nowrap; }
3640
-
3641
- /* ── 홈 대시보드 ─────────────────────────────────────── */
3642
- .home-dash {
3643
- width: 100%;
3644
- max-width: 960px;
3645
- margin: 0 auto;
3646
- padding: 28px 24px 40px;
3647
- display: flex;
3648
- flex-direction: column;
3649
- gap: 20px;
3650
- }
3651
-
3652
- .home-dash-head h1 {
3653
- font-size: 26px;
3654
- font-weight: 750;
3655
- letter-spacing: -0.03em;
3656
- color: var(--text);
3657
- margin: 0 0 4px;
3658
- }
3659
- .home-dash-head p {
3660
- font-size: 13px;
3661
- color: var(--muted);
3662
- margin: 0;
3663
- }
3664
-
3665
- /* 카드 행 */
3666
- .home-dash-cards {
3667
- display: grid;
3668
- grid-template-columns: repeat(3, 1fr);
3669
- gap: 14px;
3670
- }
3671
- .home-dash-cards:has(#home-setup-card[style*="none"]) {
3672
- grid-template-columns: repeat(2, 1fr);
3673
- }
3674
-
3675
- /* 개별 카드 */
3676
- .hdc-card {
3677
- background: var(--card);
3678
- border: 1px solid var(--border);
3679
- border-radius: 14px;
3680
- padding: 18px;
3681
- display: flex;
3682
- flex-direction: column;
3683
- gap: 12px;
3684
- box-shadow: 0 4px 18px rgba(88,72,150,0.07);
3685
- }
3686
- .hdc-title {
3687
- font-size: 12px;
3688
- font-weight: 700;
3689
- text-transform: uppercase;
3690
- letter-spacing: 0.07em;
3691
- color: var(--accent);
3692
- }
3693
- .hdc-model-badge {
3694
- font-size: 15px;
3695
- font-weight: 650;
3696
- color: var(--text);
3697
- white-space: nowrap;
3698
- overflow: hidden;
3699
- text-overflow: ellipsis;
3700
- }
3701
-
3702
- /* stat 행 */
3703
- .hdc-stats { display: flex; flex-direction: column; gap: 8px; }
3704
- .hdc-stat-row {
3705
- display: grid;
3706
- grid-template-columns: 44px 1fr 36px;
3707
- align-items: center;
3708
- gap: 8px;
3709
- }
3710
- .hdc-stat-label { font-size: 11px; color: var(--muted); }
3711
- .hdc-stat-val { font-size: 12px; font-weight: 700; color: var(--text); text-align: right; }
3712
- .hdc-bar {
3713
- height: 6px;
3714
- border-radius: 99px;
3715
- background: rgba(111,66,232,0.10);
3716
- overflow: hidden;
3717
- }
3718
- .hdc-bar-fill {
3719
- height: 100%;
3720
- border-radius: 99px;
3721
- background: var(--accent);
3722
- transition: width 0.6s ease;
3723
- }
3724
- .hdc-bar-fill.hdc-cpu { background: #22c4a0; }
3725
- .hdc-bar-fill.hdc-gpu { background: #f472b6; }
3726
-
3727
- /* KG counts */
3728
- .hdc-counts {
3729
- display: flex;
3730
- align-items: center;
3731
- gap: 16px;
3732
- flex: 1;
3733
- }
3734
- .hdc-count-item { display: flex; flex-direction: column; align-items: center; gap: 2px; }
3735
- .hdc-count-item span { font-size: 28px; font-weight: 750; color: var(--text); letter-spacing: -0.03em; line-height: 1; }
3736
- .hdc-count-item label { font-size: 11px; color: var(--muted); }
3737
- .hdc-count-sep { width: 1px; height: 36px; background: var(--border); }
3738
-
3739
- /* Setup card */
3740
- .hdc-setup .hdc-setup-count { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 4px; }
3741
- .hdc-setup .hdc-setup-count span { font-size: 40px; font-weight: 750; color: var(--accent); letter-spacing: -0.04em; line-height: 1; }
3742
- .hdc-setup .hdc-setup-count label { font-size: 12px; color: var(--muted); }
3743
-
3744
- /* 카드 버튼 */
3745
- .hdc-btn {
3746
- padding: 8px 14px;
3747
- border-radius: 9px;
3748
- border: 1px solid rgba(111,66,232,0.22);
3749
- background: rgba(111,66,232,0.07);
3750
- color: var(--accent);
3751
- font-size: 12px;
3752
- font-weight: 600;
3753
- cursor: pointer;
3754
- display: flex;
3755
- align-items: center;
3756
- justify-content: center;
3757
- gap: 5px;
3758
- transition: all 0.15s;
3759
- }
3760
- .hdc-btn:hover {
3761
- background: var(--border);
3762
- border-color: rgba(111,66,232,0.35);
3763
- }
3764
-
3765
- /* 하단 최근 패널 */
3766
- .home-dash-recent {
3767
- display: grid;
3768
- grid-template-columns: 1fr 1fr;
3769
- gap: 14px;
3770
- }
3771
- .hdr-panel {
3772
- background: var(--card);
3773
- border: 1px solid var(--border);
3774
- border-radius: 14px;
3775
- overflow: hidden;
3776
- box-shadow: 0 4px 18px rgba(88,72,150,0.07);
3777
- }
3778
- .hdr-head {
3779
- display: flex;
3780
- align-items: center;
3781
- justify-content: space-between;
3782
- padding: 12px 16px;
3783
- border-bottom: 1px solid rgba(111,66,232,0.10);
3784
- font-size: 12px;
3785
- font-weight: 700;
3786
- color: var(--accent);
3787
- text-transform: uppercase;
3788
- letter-spacing: 0.07em;
3789
- }
3790
- .hdr-head button {
3791
- background: none;
3792
- border: none;
3793
- color: var(--muted);
3794
- font-size: 11px;
3795
- cursor: pointer;
3796
- padding: 0;
3797
- }
3798
- .hdr-head button:hover { color: var(--accent); }
3799
- .hdr-list { padding: 6px 0; min-height: 120px; max-height: 200px; overflow-y: auto; }
3800
- .hdr-item {
3801
- display: grid;
3802
- grid-template-columns: 18px 1fr auto;
3803
- align-items: center;
3804
- gap: 8px;
3805
- padding: 8px 16px;
3806
- font-size: 13px;
3807
- color: var(--text);
3808
- cursor: pointer;
3809
- transition: background 0.1s;
3810
- }
3811
- .hdr-item:hover { background: rgba(111,66,232,0.06); }
3812
- .hdr-item i { color: var(--accent); font-size: 14px; }
3813
- .hdr-item span { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
3814
- .hdr-item small { color: var(--muted); font-size: 11px; white-space: nowrap; }
3815
- .hdr-empty { padding: 24px 16px; text-align: center; color: var(--muted); font-size: 13px; }
3816
-
3817
- .onboarding-overlay {
3818
- display: none;
3819
- position: fixed;
3820
- inset: 0;
3821
- z-index: 9500;
3822
- align-items: center;
3823
- justify-content: center;
3824
- padding: 24px;
3825
- background: rgba(28, 24, 54, 0.34);
3826
- backdrop-filter: none;
3827
- }
3828
-
3829
- .onboarding-overlay.open { display: flex; }
3830
-
3831
- .onboarding-card {
3832
- width: min(860px, 100%);
3833
- max-height: min(760px, calc(100vh - 48px));
3834
- display: flex;
3835
- flex-direction: column;
3836
- overflow: hidden;
3837
- border-radius: 16px;
3838
- border: 1px solid rgba(111,75,246,0.16);
3839
- background: linear-gradient(180deg, var(--card), var(--card));
3840
- box-shadow: 0 30px 90px rgba(60,45,130,0.24);
3841
- color: var(--text);
3842
- }
3843
-
3844
- .onboarding-top {
3845
- padding: 22px 26px 16px;
3846
- border-bottom: 1px solid rgba(111,75,246,0.10);
3847
- }
3848
-
3849
- .onboarding-kicker {
3850
- color: var(--accent);
3851
- font-size: 11px;
3852
- font-weight: 900;
3853
- letter-spacing: .08em;
3854
- text-transform: uppercase;
3855
- margin-bottom: 12px;
3856
- }
3857
-
3858
- .onboarding-steps {
3859
- display: grid;
3860
- grid-template-columns: repeat(5, minmax(0, 1fr));
3861
- gap: 8px;
3862
- }
3863
-
3864
- .onboarding-step {
3865
- min-width: 0;
3866
- color: var(--faint);
3867
- font-size: 11px;
3868
- font-weight: 800;
3869
- border-top: 3px solid rgba(111,75,246,0.12);
3870
- padding-top: 7px;
3871
- white-space: nowrap;
3872
- overflow: hidden;
3873
- text-overflow: ellipsis;
3874
- }
3875
-
3876
- .onboarding-step.active,
3877
- .onboarding-step.done {
3878
- color: var(--accent);
3879
- border-top-color: var(--accent);
3880
- }
3881
-
3882
- .onboarding-body.lattice-ref-chat {
3883
- overflow-y: auto;
3884
- padding: 28px 30px;
3885
- }
3886
-
3887
- .onboarding-body h2 {
3888
- font-size: 25px;
3889
- margin-bottom: 8px;
3890
- }
3891
-
3892
- .onboarding-body > p {
3893
- color: var(--muted);
3894
- font-size: 13.5px;
3895
- line-height: 1.6;
3896
- margin-bottom: 20px;
3897
- }
3898
-
3899
- .onboarding-actions {
3900
- padding: 16px 26px 22px;
3901
- display: flex;
3902
- align-items: center;
3903
- justify-content: flex-end;
3904
- gap: 10px;
3905
- border-top: 1px solid rgba(111,75,246,0.10);
3906
- }
3907
-
3908
- .onboarding-primary,
3909
- .onboarding-secondary {
3910
- border-radius: 8px;
3911
- min-height: 40px;
3912
- padding: 0 18px;
3913
- font: inherit;
3914
- font-size: 13px;
3915
- font-weight: 850;
3916
- cursor: pointer;
3917
- }
3918
-
3919
- .onboarding-primary {
3920
- border: 0;
3921
- background: linear-gradient(135deg, #6f4bf6, #7b6dff);
3922
- color: #fff;
3923
- box-shadow: 0 14px 30px rgba(111,75,246,0.24);
3924
- }
3925
-
3926
- .onboarding-secondary {
3927
- border: 1px solid rgba(111,75,246,0.16);
3928
- background: var(--card);
3929
- color: var(--muted);
3930
- }
3931
-
3932
- .onboarding-choice-grid,
3933
- .onboarding-mode-grid,
3934
- .recommendation-grid,
3935
- .analysis-grid {
3936
- display: grid;
3937
- grid-template-columns: repeat(2, minmax(0, 1fr));
3938
- gap: 12px;
3939
- }
3940
-
3941
- .onboarding-choice,
3942
- .onboarding-mode,
3943
- .recommendation-card,
3944
- .analysis-row {
3945
- border: 1px solid rgba(111,75,246,0.14);
3946
- background: var(--card);
3947
- border-radius: 10px;
3948
- padding: 16px;
3949
- text-align: left;
3950
- color: var(--text);
3951
- }
3952
-
3953
- .onboarding-choice,
3954
- .onboarding-mode { cursor: pointer; }
3955
-
3956
- .onboarding-choice:hover,
3957
- .onboarding-mode:hover {
3958
- border-color: rgba(111,75,246,0.38);
3959
- box-shadow: 0 14px 34px rgba(86,70,160,0.14);
3960
- }
3961
-
3962
- .onboarding-choice i,
3963
- .onboarding-mode i {
3964
- color: var(--accent);
3965
- font-size: 24px;
3966
- margin-bottom: 10px;
3967
- }
3968
-
3969
- .onboarding-choice h3,
3970
- .onboarding-mode h3,
3971
- .recommendation-card h3 {
3972
- font-size: 14px;
3973
- margin: 0 0 7px;
3974
- }
3975
-
3976
- .onboarding-choice p,
3977
- .onboarding-mode p,
3978
- .recommendation-card p,
3979
- .analysis-row p {
3980
- color: var(--muted);
3981
- font-size: 12.5px;
3982
- line-height: 1.55;
3983
- margin: 0;
3984
- }
3985
-
3986
- .analysis-row strong {
3987
- display: block;
3988
- font-size: 12px;
3989
- color: var(--faint);
3990
- margin-bottom: 4px;
3991
- }
3992
-
3993
- .onboarding-model-list {
3994
- display: flex;
3995
- flex-direction: column;
3996
- gap: 12px;
3997
- max-height: min(440px, 48vh);
3998
- overflow-y: auto;
3999
- padding-right: 4px;
4000
- }
4001
-
4002
- .onboarding-model-card {
4003
- border: 1px solid rgba(111,75,246,0.14);
4004
- background: var(--card);
4005
- border-radius: 10px;
4006
- padding: 14px;
4007
- }
4008
-
4009
- .onboarding-model-card h3 {
4010
- font-size: 14px;
4011
- margin: 0 0 9px;
4012
- }
4013
-
4014
- .onboarding-model-grid {
4015
- display: grid;
4016
- grid-template-columns: repeat(2, minmax(0, 1fr));
4017
- gap: 8px;
4018
- }
4019
-
4020
- .onboarding-model-option {
4021
- border: 1px solid rgba(111,75,246,0.14);
4022
- background: var(--surface);
4023
- border-radius: 8px;
4024
- padding: 11px;
4025
- text-align: left;
4026
- color: var(--text);
4027
- cursor: pointer;
4028
- }
4029
-
4030
- .onboarding-model-option:hover {
4031
- border-color: rgba(111,75,246,0.38);
4032
- box-shadow: 0 12px 24px rgba(86,70,160,0.12);
4033
- }
4034
-
4035
- .onboarding-model-option strong,
4036
- .onboarding-model-option span {
4037
- display: block;
4038
- }
4039
-
4040
- .onboarding-model-option strong {
4041
- font-size: 13px;
4042
- margin-bottom: 4px;
4043
- }
4044
-
4045
- .onboarding-model-option span {
4046
- color: var(--muted);
4047
- font-size: 12px;
4048
- line-height: 1.42;
4049
- word-break: break-word;
4050
- }
4051
-
4052
- .onboarding-progress-meta {
4053
- color: var(--muted);
4054
- font-size: 12px;
4055
- line-height: 1.45;
4056
- margin-top: 8px;
4057
- }
4058
-
4059
- .setup-log-list {
4060
- display: flex;
4061
- flex-direction: column;
4062
- gap: 8px;
4063
- }
4064
-
4065
- .setup-log-row {
4066
- border: 1px solid rgba(111,75,246,0.12);
4067
- background: var(--surface);
4068
- border-radius: 8px;
4069
- padding: 12px 14px;
4070
- display: flex;
4071
- gap: 10px;
4072
- align-items: flex-start;
4073
- color: var(--muted);
4074
- font-size: 13px;
4075
- }
4076
-
4077
- .setup-log-row.done { color: var(--success); border-color: rgba(20,122,90,0.24); }
4078
- .setup-log-row.error { color: var(--danger); border-color: rgba(239,68,68,0.24); }
4079
-
4080
- .advanced-settings-overlay {
4081
- display: none;
4082
- position: fixed;
4083
- inset: 0;
4084
- z-index: 880;
4085
- align-items: center;
4086
- justify-content: center;
4087
- padding: 22px;
4088
- background: rgba(0,0,0,0.42);
4089
- }
4090
-
4091
- .advanced-settings-overlay.open { display: flex; }
4092
-
4093
- .advanced-settings-panel {
4094
- width: min(520px, 100%);
4095
- border: 1px solid var(--border);
4096
- border-radius: 12px;
4097
- background: var(--surface);
4098
- box-shadow: var(--shadow);
4099
- overflow: hidden;
4100
- }
4101
-
4102
- .advanced-settings-panel header {
4103
- padding: 18px 20px;
4104
- border-bottom: 1px solid var(--border);
4105
- display: flex;
4106
- justify-content: space-between;
4107
- align-items: center;
4108
- gap: 12px;
4109
- }
4110
-
4111
- .advanced-settings-body.lattice-ref-chat {
4112
- padding: 18px 20px 22px;
4113
- display: grid;
4114
- gap: 10px;
4115
- }
4116
-
4117
- .advanced-settings-action {
4118
- border: 1px solid var(--border);
4119
- border-radius: 8px;
4120
- background: var(--surface-2);
4121
- color: var(--text);
4122
- padding: 13px 14px;
4123
- display: flex;
4124
- align-items: center;
4125
- gap: 10px;
4126
- font: inherit;
4127
- font-size: 13px;
4128
- font-weight: 800;
4129
- cursor: pointer;
4130
- text-align: left;
4131
- }
4132
-
4133
- body[data-mode="default"] .cu-dev-controls {
4134
- display: none;
4135
- }
4136
-
4137
- body.lattice-ref-chat .app-layout .sidebar,
4138
- body.lattice-ref-chat .app-layout .chat-header {
4139
- --text: #8268f2;
4140
- --muted: #9b8af0;
4141
- --faint: #b4a9ee;
4142
- }
4143
-
4144
- body.lattice-ref-chat .app-layout .sidebar {
4145
- color: #9b8af0;
4146
- }
4147
-
4148
- body.lattice-ref-chat .app-layout .brand-title,
4149
- body.lattice-ref-chat .app-layout .brand-subtitle,
4150
- body.lattice-ref-chat .app-layout .user-strip,
4151
- body.lattice-ref-chat .app-layout .workspace-type-line,
4152
- body.lattice-ref-chat .app-layout .history-section-label,
4153
- body.lattice-ref-chat .app-layout .history-empty,
4154
- body.lattice-ref-chat .app-layout .history-item,
4155
- body.lattice-ref-chat .app-layout .history-item i,
4156
- body.lattice-ref-chat .app-layout .reference-nav-item,
4157
- body.lattice-ref-chat .app-layout .reference-nav-item i,
4158
- body.lattice-ref-chat .app-layout .sidebar-search-wrap i,
4159
- body.lattice-ref-chat .app-layout .sidebar-search input,
4160
- body.lattice-ref-chat .app-layout .sidebar-search input::placeholder {
4161
- color: #9b8af0;
4162
- -webkit-text-fill-color: currentColor;
4163
- }
4164
-
4165
- body.lattice-ref-chat .app-layout .reference-nav-item:hover,
4166
- body.lattice-ref-chat .app-layout .reference-nav-item.active,
4167
- body.lattice-ref-chat .app-layout .history-item:hover,
4168
- body.lattice-ref-chat .app-layout .history-item.active,
4169
- body.lattice-ref-chat .app-layout .new-chat-btn,
4170
- body.lattice-ref-chat .app-layout .status-btn,
4171
- body.lattice-ref-chat .app-layout .setup-wizard-sidebar-btn,
4172
- body.lattice-ref-chat .app-layout .admin-btn {
4173
- color: #7b5ff0;
4174
- }
4175
-
4176
- body.lattice-ref-chat .app-layout .chat-header,
4177
- body.lattice-ref-chat .app-layout .mode-segmented button,
4178
- body.lattice-ref-chat .app-layout .header-pills .logout-btn,
4179
- body.lattice-ref-chat .app-layout .sidebar-toggle {
4180
- color: #8f7bf7;
4181
- }
4182
-
4183
- body.lattice-ref-chat .app-layout .mode-segmented button:not(.active) {
4184
- color: var(--muted);
4185
- }
4186
-
4187
- body.lattice-ref-chat .app-layout .mode-segmented button.active {
4188
- color: #ffffff;
4189
- }
4190
-
4191
- body.lattice-ref-chat .app-layout .header-pills .logout-btn i,
4192
- body.lattice-ref-chat .app-layout .sidebar-toggle i {
4193
- color: inherit;
4194
- }
4195
-
4196
- @media (max-width: 900px) {
4197
- .home-action-grid,
4198
- .home-summary-grid,
4199
- .onboarding-choice-grid,
4200
- .onboarding-mode-grid,
4201
- .onboarding-model-grid,
4202
- .recommendation-grid,
4203
- .analysis-grid {
4204
- grid-template-columns: 1fr;
4205
- }
4206
-
4207
- .mode-segmented {
4208
- grid-auto-columns: minmax(84px, auto);
4209
- max-width: 100%;
4210
- overflow-x: auto;
4211
- }
4212
-
4213
- .mode-segmented button {
4214
- padding: 0 10px;
4215
- font-size: 12px;
4216
- }
4217
- }
4218
-
4219
- /* =========================================================
4220
- Workspace product shell — full override for .app-layout
4221
- ========================================================= */
4222
- body.lattice-ref-chat .app-layout {
4223
- --bg: var(--bg);
4224
- --surface: var(--surface);
4225
- --surface-2: var(--surface-2);
4226
- --surface-3: var(--surface-3);
4227
- --accent: var(--accent);
4228
- --accent-2: var(--lt-accent-2, #0f9f8f);
4229
- --accent-3: var(--accent-2);
4230
- --accent-soft: var(--accent-soft);
4231
- --text: var(--text);
4232
- --muted: var(--muted);
4233
- --faint: var(--faint);
4234
- --border: var(--border);
4235
- --border-strong: var(--border-strong);
4236
- --shadow: var(--shadow);
4237
- --shadow-sm: var(--shadow-sm);
4238
- background: var(--app-bg);
4239
- }
4240
- body.lattice-ref-chat .app-layout::before,
4241
- body.lattice-ref-chat .app-layout::after {
4242
- display: none;
4243
- }
4244
-
4245
- /* Sidebar */
4246
- body.lattice-ref-chat .app-layout .sidebar {
4247
- background: var(--sidebar);
4248
- border-right: 1px solid var(--line);
4249
- box-shadow: none;
4250
- }
4251
-
4252
- /* Chat header */
4253
- body.lattice-ref-chat .app-layout .chat-header {
4254
- background: var(--sidebar);
4255
- border-bottom: 1px solid var(--line);
4256
- box-shadow: none;
4257
- backdrop-filter: none; /* glass removed v3.5.0 */
4258
- }
4259
-
4260
- /* Messages viewport */
4261
- body.lattice-ref-chat .app-layout .messages-viewport {
4262
- background: transparent;
4263
- }
4264
-
4265
- /* AI 채팅 버블 */
4266
- body.lattice-ref-chat .app-layout .ai .bubble {
4267
- background: var(--surface);
4268
- border: 1px solid var(--accent-soft);
4269
- color: var(--text);
4270
- box-shadow: 0 4px 18px rgba(88,72,150,0.08);
4271
- }
4272
-
4273
- /* 사용자 채팅 버블 */
4274
- body.lattice-ref-chat .app-layout .user .bubble {
4275
- background: linear-gradient(135deg, var(--accent), var(--accent-2));
4276
- border: 1px solid rgba(111,66,232,0.24);
4277
- color: #ffffff;
4278
- box-shadow: 0 8px 28px var(--border-strong);
4279
- }
4280
-
4281
- /* 버블 내 헤딩, 코드 언어 레이블 */
4282
- body.lattice-ref-chat .app-layout .ai .bubble h1,
4283
- body.lattice-ref-chat .app-layout .ai .bubble h2,
4284
- body.lattice-ref-chat .app-layout .ai .bubble h3,
4285
- body.lattice-ref-chat .app-layout .ai .bubble .code-lang {
4286
- color: var(--accent);
4287
- }
4288
-
4289
- /* 코드 블록 */
4290
- body.lattice-ref-chat .app-layout .code-container,
4291
- body.lattice-ref-chat .app-layout pre {
4292
- background: var(--surface-2);
4293
- border-color: var(--border);
4294
- }
4295
- body.lattice-ref-chat .app-layout .code-header {
4296
- background: var(--surface-2);
4297
- border-bottom-color: rgba(111,66,232,0.13);
4298
- }
4299
-
4300
- /* 입력창 영역 */
4301
- body.lattice-ref-chat .app-layout .input-area {
4302
- background: linear-gradient(0deg,
4303
- color-mix(in srgb, var(--bg) 98%, transparent) 0%,
4304
- color-mix(in srgb, var(--bg) 82%, transparent) 64%,
4305
- transparent 100%);
4306
- }
4307
- body.lattice-ref-chat .app-layout .input-box {
4308
- background: var(--input);
4309
- border: 1px solid var(--line);
4310
- box-shadow: var(--shadow-sm);
4311
- }
4312
- body.lattice-ref-chat .app-layout .input-box:focus-within {
4313
- border-color: var(--accent);
4314
- box-shadow: var(--shadow-sm), 0 0 0 3px var(--accent-soft);
4315
- }
4316
-
4317
- /* 전송 버튼 */
4318
- body.lattice-ref-chat .app-layout .send-btn {
4319
- background: linear-gradient(135deg, var(--accent), var(--accent-2));
4320
- color: #ffffff;
4321
- box-shadow: 0 8px 20px color-mix(in srgb, var(--accent) 24%, transparent);
4322
- }
4323
- body.lattice-ref-chat .app-layout .send-btn:hover {
4324
- box-shadow: 0 10px 26px color-mix(in srgb, var(--accent) 34%, transparent);
4325
- opacity: 0.92;
4326
- }
4327
-
4328
- /* 빈 상태 카드/칩 */
4329
- body.lattice-ref-chat .app-layout .empty-chip {
4330
- background: var(--surface-2);
4331
- border-color: rgba(111,66,232,0.15);
4332
- color: var(--muted);
4333
- box-shadow: 0 2px 10px rgba(88,72,150,0.08);
4334
- }
4335
- body.lattice-ref-chat .app-layout .empty-chip:hover {
4336
- background: var(--accent-soft);
4337
- border-color: var(--border-strong);
4338
- }
4339
- body.lattice-ref-chat .app-layout .ops-card {
4340
- background: var(--card);
4341
- border-color: var(--line);
4342
- box-shadow: var(--shadow-sm);
4343
- }
4344
- body.lattice-ref-chat .app-layout .ops-card.primary {
4345
- background: linear-gradient(135deg, var(--accent-soft), var(--card) 58%);
4346
- border-color: var(--border-strong);
4347
- }
4348
-
4349
- /* 배지/버튼 */
4350
- body.lattice-ref-chat .app-layout .model-badge {
4351
- background: var(--surface-2);
4352
- border-color: rgba(111,66,232,0.15);
4353
- color: var(--text);
4354
- }
4355
- body.lattice-ref-chat .app-layout .status-pill {
4356
- background: var(--surface-2);
4357
- border-color: rgba(111,66,232,0.13);
4358
- color: var(--muted);
4359
- }
4360
- body.lattice-ref-chat .app-layout .status-dot {
4361
- background: var(--accent);
4362
- box-shadow: 0 0 8px rgba(111,66,232,0.5), 0 0 16px rgba(111,66,232,0.2);
4363
- }
4364
- body.lattice-ref-chat .app-layout .new-chat-btn,
4365
- body.lattice-ref-chat .app-layout .status-btn,
4366
- body.lattice-ref-chat .app-layout .admin-btn,
4367
- body.lattice-ref-chat .app-layout .setup-wizard-sidebar-btn {
4368
- background: var(--accent-soft);
4369
- border-color: var(--border-strong);
4370
- color: var(--accent);
4371
- box-shadow: none;
4372
- }
4373
-
4374
- /* ── 네비 버튼 글씨 검정 ── */
4375
- body.lattice-ref-chat .app-layout .reference-nav-item,
4376
- body.lattice-ref-chat .app-layout .reference-nav-item i {
4377
- color: var(--text);
4378
- -webkit-text-fill-color: var(--text);
4379
- }
4380
- body.lattice-ref-chat .app-layout .reference-nav-item:hover,
4381
- body.lattice-ref-chat .app-layout .reference-nav-item.active {
4382
- color: var(--text);
4383
- -webkit-text-fill-color: var(--text);
4384
- background: var(--accent-soft);
4385
- border-color: var(--border-strong);
4386
- }
4387
- /* 채팅 기록 목록도 검정 */
4388
- body.lattice-ref-chat .app-layout .history-item {
4389
- color: var(--text);
4390
- -webkit-text-fill-color: var(--text);
4391
- }
4392
- body.lattice-ref-chat .app-layout .history-item:hover,
4393
- body.lattice-ref-chat .app-layout .history-item.active {
4394
- color: var(--text);
4395
- -webkit-text-fill-color: var(--text);
4396
- }
4397
- /* 브랜드 타이틀 / 서브타이틀 */
4398
- body.lattice-ref-chat .app-layout .brand-title {
4399
- color: var(--text);
4400
- -webkit-text-fill-color: var(--text);
4401
- }
4402
- /* 사이드바 검색 입력 */
4403
- body.lattice-ref-chat .app-layout .sidebar-search input {
4404
- color: var(--text);
4405
- background: var(--input);
4406
- border-color: var(--line);
4407
- }
4408
- body.lattice-ref-chat .app-layout .sidebar-search input::placeholder {
4409
- color: var(--faint);
4410
- -webkit-text-fill-color: var(--faint);
4411
- }
4412
- /* 상단 모드 세그멘트 */
4413
- body.lattice-ref-chat .app-layout .mode-segmented {
4414
- background: var(--surface-2);
4415
- border-color: var(--line);
4416
- }
4417
- body.lattice-ref-chat .app-layout .mode-segmented button:not(.active) {
4418
- color: var(--muted);
4419
- }
4420
-
4421
- /* ── 홈 뷰: 채팅 전용 사이드바 섹션 숨기기 ── */
4422
- body.lattice-ref-chat .app-layout[data-view="home"] .sidebar-search,
4423
- body.lattice-ref-chat .app-layout[data-view="home"] .sidebar-primary-actions,
4424
- body.lattice-ref-chat .app-layout[data-view="home"] .history-container {
4425
- display: none;
4426
- }
4427
- /* 채팅 뷰: 다시 표시 (기본값이므로 명시) */
4428
- body.lattice-ref-chat .app-layout[data-view="chat"] .sidebar-search,
4429
- body.lattice-ref-chat .app-layout[data-view="chat"] .sidebar-primary-actions,
4430
- body.lattice-ref-chat .app-layout[data-view="chat"] .history-container {
4431
- display: flex;
4432
- }
4433
- body.lattice-ref-chat .app-layout[data-view="chat"] .history-container {
4434
- display: block;
4435
- }
4436
-
4437
- /* ── 홈 뷰: 홈 대시보드 보임, 채팅 힌트 숨김 ── */
4438
- body.lattice-ref-chat .app-layout[data-view="home"] #empty-state,
4439
- body.lattice-ref-chat .app-layout[data-view="home"] .message,
4440
- body.lattice-ref-chat .app-layout[data-view="home"] .mcp-recommend-wrap,
4441
- body.lattice-ref-chat .app-layout[data-view="home"] .file-card {
4442
- display: none;
4443
- }
4444
- body.lattice-ref-chat .app-layout[data-view="home"] .home-dash { display: flex; }
4445
-
4446
- /* ── 채팅 뷰: 홈 대시보드 숨김, 채팅 힌트 보임 ── */
4447
- body.lattice-ref-chat .app-layout[data-view="chat"] .home-dash { display: none; }
4448
- body.lattice-ref-chat .app-layout[data-view="chat"] .chat-empty-hint {
4449
- display: flex;
4450
- flex-direction: column;
4451
- align-items: center;
4452
- justify-content: center;
4453
- gap: 12px;
4454
- height: 100%;
4455
- color: var(--muted);
4456
- max-width: 520px;
4457
- margin: 0 auto;
4458
- text-align: center;
4459
- padding: 28px 18px;
4460
- }
4461
- body.lattice-ref-chat .app-layout[data-view="chat"] .chat-empty-hint i {
4462
- font-size: 40px;
4463
- opacity: 0.35;
4464
- }
4465
- body.lattice-ref-chat .app-layout[data-view="chat"] .chat-empty-hint h2 {
4466
- margin: 0;
4467
- color: var(--text);
4468
- font-size: 22px;
4469
- line-height: 1.2;
4470
- }
4471
- body.lattice-ref-chat .app-layout[data-view="chat"] .chat-empty-hint p {
4472
- font-size: 14px;
4473
- line-height: 1.55;
4474
- margin: 0;
4475
- }
4476
- body.lattice-ref-chat .app-layout[data-view="chat"] .chat-capability-row {
4477
- display: flex;
4478
- justify-content: center;
4479
- flex-wrap: wrap;
4480
- gap: 7px;
4481
- }
4482
- body.lattice-ref-chat .app-layout[data-view="chat"] .chat-capability-row span {
4483
- border: 1px solid rgba(111,66,232,0.16);
4484
- background: var(--surface);
4485
- color: var(--muted);
4486
- border-radius: 999px;
4487
- padding: 6px 10px;
4488
- font-size: 12px;
4489
- font-weight: 650;
4490
- }
4491
-
4492
- /* v2.2.7 visual stabilization: rendered dark mode must be crisp, not glassy. */
4493
- :root[data-lt-theme="dark"] body.lattice-ref-chat .app-layout .input-area {
4494
- background:
4495
- linear-gradient(0deg,
4496
- rgba(11, 11, 30, 0.98) 0%,
4497
- rgba(11, 11, 30, 0.92) 58%,
4498
- rgba(11, 11, 30, 0.30) 82%,
4499
- transparent 100%);
4500
- }
4501
-
4502
- :root[data-lt-theme="dark"] body.lattice-ref-chat .app-layout .input-box {
4503
- background: linear-gradient(180deg, rgba(33, 36, 78, 0.98), rgba(18, 20, 48, 0.98));
4504
- border-color: rgba(167, 139, 250, 0.30);
4505
- box-shadow: 0 18px 46px rgba(0, 0, 0, 0.56), 0 0 0 1px rgba(167, 139, 250, 0.07);
4506
- }
4507
-
4508
- :root[data-lt-theme="dark"] body.lattice-ref-chat .app-layout .input-box:focus-within {
4509
- border-color: rgba(196, 181, 253, 0.56);
4510
- box-shadow: 0 20px 50px rgba(0, 0, 0, 0.62), 0 0 0 3px rgba(167, 139, 250, 0.18);
4511
- }
4512
-
4513
- :root[data-lt-theme="dark"] body.lattice-ref-chat .app-layout textarea {
4514
- color: var(--text);
4515
- }
4516
-
4517
- :root[data-lt-theme="dark"] body.lattice-ref-chat .app-layout textarea::placeholder {
4518
- color: rgba(226, 232, 255, 0.50);
4519
- }
4520
-
4521
- :root[data-lt-theme="dark"] body.lattice-ref-chat .app-layout .action-btn {
4522
- color: rgba(226, 232, 255, 0.62);
4523
- }
4524
-
4525
- :root[data-lt-theme="dark"] body.lattice-ref-chat .app-layout .action-btn:hover {
4526
- background: rgba(167, 139, 250, 0.14);
4527
- color: var(--accent-2);
4528
- }
4529
-
4530
- :root[data-lt-theme="dark"] body.lattice-ref-chat .app-layout .file-toolbar {
4531
- border-top-color: rgba(167, 139, 250, 0.16);
4532
- }
4533
-
4534
- :root[data-lt-theme="dark"] body.lattice-ref-chat .app-layout .send-btn,
4535
- :root[data-lt-theme="dark"] body.lattice-ref-chat .app-layout .send-btn:hover {
4536
- background: linear-gradient(135deg, #8b5cf6, #22d3ee);
4537
- color: #ffffff;
4538
- box-shadow: 0 12px 28px rgba(34, 211, 238, 0.18), 0 10px 28px rgba(139, 92, 246, 0.28);
4539
- opacity: 1;
4540
- }
4541
-
4542
- :root[data-lt-theme="dark"] body.lattice-ref-chat .app-layout .send-btn:hover {
4543
- transform: translateY(-1px);
4544
- }
4545
-
4546
- :root[data-lt-theme="dark"] body.lattice-ref-chat .workspace-modal-overlay,
4547
- :root[data-lt-theme="dark"] body.lattice-ref-chat .mode-modal-overlay,
4548
- :root[data-lt-theme="dark"] body.lattice-ref-chat .model-overlay,
4549
- :root[data-lt-theme="dark"] body.lattice-ref-chat .admin-overlay,
4550
- :root[data-lt-theme="dark"] body.lattice-ref-chat .advanced-settings-overlay,
4551
- :root[data-lt-theme="dark"] body.lattice-ref-chat .onboarding-overlay,
4552
- :root[data-lt-theme="dark"] body.lattice-ref-chat #setup-overlay {
4553
- background: rgba(2, 4, 18, 0.74);
4554
- backdrop-filter: none;
4555
- -webkit-backdrop-filter: none;
4556
- }
4557
-
4558
- :root[data-lt-theme="dark"] body.lattice-ref-chat .workspace-modal,
4559
- :root[data-lt-theme="dark"] body.lattice-ref-chat .mode-modal,
4560
- :root[data-lt-theme="dark"] body.lattice-ref-chat .onboarding-card,
4561
- :root[data-lt-theme="dark"] body.lattice-ref-chat .wizard-card {
4562
- background: linear-gradient(180deg, rgba(25, 25, 62, 0.99), rgba(18, 19, 48, 0.99));
4563
- border-color: rgba(167, 139, 250, 0.24);
4564
- box-shadow: 0 30px 90px rgba(0, 0, 0, 0.60);
4565
- }
4566
-
4567
- :root[data-lt-theme="dark"] body.lattice-ref-chat .workspace-card,
4568
- :root[data-lt-theme="dark"] body.lattice-ref-chat .mode-card,
4569
- :root[data-lt-theme="dark"] body.lattice-ref-chat .onboarding-choice,
4570
- :root[data-lt-theme="dark"] body.lattice-ref-chat .onboarding-mode,
4571
- :root[data-lt-theme="dark"] body.lattice-ref-chat .recommendation-card,
4572
- :root[data-lt-theme="dark"] body.lattice-ref-chat .analysis-row,
4573
- :root[data-lt-theme="dark"] body.lattice-ref-chat .scan-row,
4574
- :root[data-lt-theme="dark"] body.lattice-ref-chat .rec-item,
4575
- :root[data-lt-theme="dark"] body.lattice-ref-chat .install-row,
4576
- :root[data-lt-theme="dark"] body.lattice-ref-chat .setup-log-row {
4577
- background: rgba(35, 38, 79, 0.78);
4578
- border-color: rgba(167, 139, 250, 0.20);
4579
- color: var(--text);
4580
- }
4581
-
4582
- :root[data-lt-theme="dark"] body.lattice-ref-chat .rec-item.checked {
4583
- background: linear-gradient(135deg, rgba(52, 211, 153, 0.16), rgba(35, 38, 79, 0.86));
4584
- border-color: rgba(52, 211, 153, 0.52);
4585
- }
4586
-
4587
- :root[data-lt-theme="dark"] body.lattice-ref-chat .onboarding-step {
4588
- color: rgba(226, 232, 255, 0.66);
4589
- border-top-color: rgba(167, 139, 250, 0.20);
4590
- }
4591
-
4592
- :root[data-lt-theme="dark"] body.lattice-ref-chat .onboarding-step.active,
4593
- :root[data-lt-theme="dark"] body.lattice-ref-chat .onboarding-step.done {
4594
- color: var(--accent-2);
4595
- border-top-color: var(--accent-2);
4596
- }
4597
-
4598
- :root[data-lt-theme="dark"] body.lattice-ref-chat .wbtn-primary {
4599
- background: linear-gradient(135deg, #8b5cf6, #22d3ee);
4600
- color: #ffffff;
4601
- }
4602
-
4603
- :root[data-lt-theme="dark"] body.lattice-ref-chat .wbtn-primary:hover {
4604
- background: linear-gradient(135deg, #7c3aed, #06b6d4);
4605
- }
4606
-
4607
- :root[data-lt-theme="dark"] body.lattice-ref-chat .mode-close,
4608
- :root[data-lt-theme="dark"] body.lattice-ref-chat .wizard-close {
4609
- background: rgba(255, 255, 255, 0.06);
4610
- border-color: rgba(167, 139, 250, 0.22);
4611
- color: var(--muted);
4612
- }
4613
-
4614
- @media (max-width: 760px) {
4615
- :root[data-lt-theme="dark"] body.lattice-ref-chat .app-layout .input-area {
4616
- background:
4617
- linear-gradient(0deg,
4618
- rgba(11, 11, 30, 0.99) 0%,
4619
- rgba(11, 11, 30, 0.94) 64%,
4620
- rgba(11, 11, 30, 0.36) 86%,
4621
- transparent 100%);
4622
- }
4623
- }