ltcai 2.2.2 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/README.md +66 -27
  2. package/codex_telegram_bot.py +6 -2
  3. package/docs/CHANGELOG.md +154 -0
  4. package/docs/V3_BACKEND_ARCHITECTURE.md +138 -0
  5. package/docs/V3_FRONTEND.md +136 -0
  6. package/knowledge_graph.py +649 -21
  7. package/latticeai/__init__.py +1 -1
  8. package/latticeai/api/admin.py +47 -0
  9. package/latticeai/api/agents.py +54 -31
  10. package/latticeai/api/auth.py +1 -1
  11. package/latticeai/api/chat.py +10 -2
  12. package/latticeai/api/search.py +236 -0
  13. package/latticeai/api/static_routes.py +21 -2
  14. package/latticeai/core/config.py +16 -0
  15. package/latticeai/core/embedding_providers.py +502 -0
  16. package/latticeai/core/local_embeddings.py +86 -0
  17. package/latticeai/core/logging_safety.py +62 -0
  18. package/latticeai/core/workspace_os.py +1 -1
  19. package/latticeai/server_app.py +49 -1
  20. package/latticeai/services/agent_runtime.py +245 -0
  21. package/latticeai/services/search_service.py +346 -0
  22. package/package.json +8 -4
  23. package/static/account.html +9 -4
  24. package/static/activity.html +4 -4
  25. package/static/admin.html +8 -3
  26. package/static/agents.html +4 -4
  27. package/static/chat.html +16 -11
  28. package/static/css/reference/account.css +439 -0
  29. package/static/css/reference/admin.css +610 -0
  30. package/static/css/reference/base.css +1658 -0
  31. package/static/{lattice-reference.css → css/reference/chat.css} +271 -3633
  32. package/static/css/reference/graph.css +1016 -0
  33. package/static/css/responsive.css +248 -1
  34. package/static/css/tokens.css +132 -126
  35. package/static/favicon.ico +0 -0
  36. package/static/graph.html +9 -4
  37. package/static/manifest.json +3 -3
  38. package/static/platform.css +1 -1
  39. package/static/plugins.html +4 -4
  40. package/static/scripts/account.js +4 -4
  41. package/static/scripts/chat.js +227 -77
  42. package/static/scripts/workspace.js +78 -0
  43. package/static/sw.js +5 -3
  44. package/static/v3/css/lattice.base.css +128 -0
  45. package/static/v3/css/lattice.components.css +447 -0
  46. package/static/v3/css/lattice.shell.css +407 -0
  47. package/static/v3/css/lattice.tokens.css +132 -0
  48. package/static/v3/css/lattice.views.css +277 -0
  49. package/static/v3/index.html +40 -0
  50. package/static/v3/js/app.js +26 -0
  51. package/static/v3/js/core/api.js +327 -0
  52. package/static/v3/js/core/components.js +215 -0
  53. package/static/v3/js/core/dom.js +148 -0
  54. package/static/v3/js/core/fixtures.js +171 -0
  55. package/static/v3/js/core/router.js +37 -0
  56. package/static/v3/js/core/routes.js +73 -0
  57. package/static/v3/js/core/shell.js +363 -0
  58. package/static/v3/js/core/store.js +113 -0
  59. package/static/v3/js/views/admin-audit.js +185 -0
  60. package/static/v3/js/views/admin-permissions.js +178 -0
  61. package/static/v3/js/views/admin-policies.js +103 -0
  62. package/static/v3/js/views/admin-private-vpc.js +138 -0
  63. package/static/v3/js/views/admin-security.js +181 -0
  64. package/static/v3/js/views/admin-users.js +168 -0
  65. package/static/v3/js/views/agents.js +194 -0
  66. package/static/v3/js/views/chat.js +450 -0
  67. package/static/v3/js/views/files.js +180 -0
  68. package/static/v3/js/views/home.js +119 -0
  69. package/static/v3/js/views/hybrid-search.js +195 -0
  70. package/static/v3/js/views/knowledge-graph.js +238 -0
  71. package/static/v3/js/views/models.js +247 -0
  72. package/static/v3/js/views/my-computer.js +237 -0
  73. package/static/v3/js/views/pipeline.js +161 -0
  74. package/static/v3/js/views/settings.js +258 -0
  75. package/static/workflows.html +4 -4
  76. package/static/workspace.css +408 -14
  77. package/static/workspace.html +43 -24
  78. package/telegram_bot.py +18 -14
@@ -1,3496 +1,4 @@
1
- @import url("/static/css/tokens.css");
2
- @import url("https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap");
3
-
4
- /* Lattice AI PPT reference skin.
5
- The deck uses a bright basic workspace and a dark administrator workspace. */
6
-
7
- /* 색 토큰(--ref-*, color-scheme 포함)은 tokens.css 가 라이트/다크 모두 제공한다. */
8
-
9
- .lattice-ref-auth,
10
- .lattice-ref-chat {
11
- font-family: "Inter", "Pretendard", "Apple SD Gothic Neo", -apple-system, BlinkMacSystemFont, sans-serif;
12
- }
13
-
14
- .lattice-ref-auth {
15
- background:
16
- radial-gradient(circle at 74% 25%, rgba(255,255,255,0.70), transparent 16%),
17
- radial-gradient(circle at 80% 58%, rgba(111,66,232,0.15), transparent 28%),
18
- radial-gradient(circle at 15% 72%, rgba(111,66,232,0.13), transparent 34%),
19
- linear-gradient(135deg, #fbfaff 0%, #f2edff 48%, #ffffff 100%);
20
- min-height: 100dvh;
21
- /* 타이틀바(58px)를 제외한 나머지 영역의 수직 중앙에 카드 배치 */
22
- flex-direction: column;
23
- align-items: center;
24
- justify-content: center;
25
- /* padding-top: 타이틀바 높이만큼만 → justify-content가 나머지 공간에서 중앙 정렬 */
26
- padding: 58px 18px clamp(72px, 8dvh, 90px);
27
- overflow: auto;
28
- }
29
-
30
- .lattice-ref-auth .login-shell {
31
- width: min(460px, calc(100vw - 36px));
32
- display: block;
33
- z-index: 3;
34
- }
35
-
36
- .lattice-ref-auth .brand-preview {
37
- display: none;
38
- }
39
-
40
- .lattice-ref-auth .card {
41
- width: 100%;
42
- min-height: auto;
43
- max-height: none;
44
- overflow: visible;
45
- border-radius: 16px;
46
- padding: clamp(40px, 4.6dvh, 50px) clamp(28px, 3.6vw, 40px) clamp(20px, 2.4dvh, 28px);
47
- background: rgba(255,255,255,0.76);
48
- border-color: var(--accent-soft);
49
- box-shadow: 0 20px 64px rgba(102, 82, 168, 0.20), inset 0 1px 0 rgba(255,255,255,0.86);
50
- backdrop-filter: blur(26px);
51
- }
52
-
53
- .lattice-ref-auth .card::before {
54
- display: none;
55
- }
56
-
57
- .auth-titlebar {
58
- position: fixed;
59
- inset: 0 0 auto;
60
- height: 58px;
61
- z-index: 4;
62
- display: flex;
63
- align-items: center;
64
- justify-content: space-between;
65
- padding: 0 22px;
66
- color: var(--ref-ink);
67
- background: rgba(250,248,255,0.58);
68
- border-bottom: 1px solid rgba(111,66,232,0.08);
69
- backdrop-filter: blur(12px);
70
- }
71
-
72
- .auth-window-brand {
73
- display: inline-flex;
74
- align-items: center;
75
- gap: 10px;
76
- font-size: 21px;
77
- font-weight: 720;
78
- }
79
-
80
- .auth-window-brand i {
81
- color: var(--ref-purple);
82
- font-size: 26px;
83
- }
84
-
85
- .auth-window-controls {
86
- display: inline-flex;
87
- align-items: center;
88
- gap: 30px;
89
- }
90
-
91
- .auth-window-controls span {
92
- width: 18px;
93
- height: 18px;
94
- position: relative;
95
- }
96
-
97
- .auth-window-controls span:nth-child(1)::before {
98
- content: '';
99
- position: absolute;
100
- left: 2px;
101
- right: 2px;
102
- top: 9px;
103
- height: 2px;
104
- background: #202033;
105
- }
106
-
107
- .auth-window-controls span:nth-child(2)::before {
108
- content: '';
109
- position: absolute;
110
- inset: 2px;
111
- border: 2px solid #202033;
112
- border-radius: 2px;
113
- }
114
-
115
- .auth-window-controls span:nth-child(3)::before,
116
- .auth-window-controls span:nth-child(3)::after {
117
- content: '';
118
- position: absolute;
119
- top: 8px;
120
- left: 1px;
121
- width: 18px;
122
- height: 2px;
123
- background: #202033;
124
- }
125
-
126
- .auth-window-controls span:nth-child(3)::before { transform: rotate(45deg); }
127
- .auth-window-controls span:nth-child(3)::after { transform: rotate(-45deg); }
128
-
129
- .auth-wave {
130
- position: fixed;
131
- z-index: 0;
132
- pointer-events: none;
133
- opacity: 0.78;
134
- filter: blur(0.2px);
135
- }
136
-
137
- .auth-wave::before,
138
- .auth-wave::after {
139
- content: '';
140
- position: absolute;
141
- inset: 0;
142
- border-radius: 50% 50% 0 0;
143
- border-top: 3px solid rgba(255,255,255,0.68);
144
- transform: skewY(-11deg);
145
- }
146
-
147
- .auth-wave::after {
148
- inset: 34px -80px -20px 40px;
149
- border-top-color: rgba(124,92,255,0.16);
150
- }
151
-
152
- .auth-wave-left {
153
- left: -130px;
154
- bottom: -80px;
155
- width: 780px;
156
- height: 360px;
157
- background: radial-gradient(ellipse at 45% 80%, rgba(111,66,232,0.23), transparent 58%);
158
- transform: rotate(4deg);
159
- }
160
-
161
- .auth-wave-right {
162
- right: -140px;
163
- bottom: -88px;
164
- width: 760px;
165
- height: 340px;
166
- background: radial-gradient(ellipse at 55% 82%, rgba(111,66,232,0.20), transparent 58%);
167
- transform: scaleX(-1) rotate(2deg);
168
- }
169
-
170
- .auth-network {
171
- position: fixed;
172
- right: 160px;
173
- top: 300px;
174
- width: 430px;
175
- height: 330px;
176
- z-index: 0;
177
- opacity: 0.28;
178
- pointer-events: none;
179
- background:
180
- linear-gradient(32deg, transparent 0 33%, rgba(255,255,255,0.9) 33.2% 33.5%, transparent 33.7%),
181
- linear-gradient(90deg, transparent 0 49.8%, rgba(255,255,255,0.8) 50% 50.3%, transparent 50.5%),
182
- linear-gradient(148deg, transparent 0 38%, rgba(255,255,255,0.9) 38.2% 38.5%, transparent 38.7%);
183
- }
184
-
185
- .auth-network span {
186
- position: absolute;
187
- width: 13px;
188
- height: 13px;
189
- border-radius: 50%;
190
- background: #fff;
191
- box-shadow: 0 0 20px rgba(255,255,255,0.9);
192
- }
193
-
194
- .auth-network span:nth-child(1) { left: 36px; top: 82px; }
195
- .auth-network span:nth-child(2) { left: 155px; top: 42px; width: 20px; height: 20px; }
196
- .auth-network span:nth-child(3) { left: 294px; top: 68px; }
197
- .auth-network span:nth-child(4) { left: 190px; top: 170px; }
198
- .auth-network span:nth-child(5) { left: 350px; top: 168px; }
199
- .auth-network span:nth-child(6) { left: 255px; top: 250px; width: 18px; height: 18px; }
200
-
201
- .lattice-ref-auth .hero-logo {
202
- display: flex;
203
- justify-content: center;
204
- align-items: center;
205
- gap: clamp(10px, 1.5vw, 16px);
206
- margin-bottom: clamp(12px, 1.8dvh, 20px);
207
- }
208
-
209
- .lattice-ref-auth .hero-logo-mark {
210
- width: clamp(46px, 5.4dvh, 62px);
211
- height: clamp(46px, 5.4dvh, 62px);
212
- display: grid;
213
- place-items: center;
214
- color: var(--ref-purple);
215
- font-size: clamp(40px, 4.8dvh, 56px);
216
- filter: drop-shadow(0 8px 14px rgba(111,66,232,0.20));
217
- }
218
-
219
- .lattice-ref-auth .hero-logo-mark i {
220
- display: none;
221
- }
222
-
223
- .lattice-ref-auth .hero-logo-mark::before {
224
- content: '';
225
- width: 86%;
226
- height: 86%;
227
- display: block;
228
- background:
229
- linear-gradient(30deg, transparent 42%, rgba(255,255,255,0.55) 42% 47%, transparent 47%),
230
- linear-gradient(90deg, transparent 42%, rgba(255,255,255,0.48) 42% 47%, transparent 47%),
231
- linear-gradient(150deg, transparent 42%, rgba(255,255,255,0.48) 42% 47%, transparent 47%),
232
- conic-gradient(from 30deg, #4f7dff, var(--accent), var(--accent-2), #4f7dff);
233
- clip-path: polygon(50% 0, 88% 20%, 88% 67%, 50% 100%, 12% 67%, 12% 20%);
234
- border-radius: 18px;
235
- box-shadow: inset 0 0 0 8px rgba(255,255,255,0.16), 0 14px 28px rgba(111,66,232,0.24);
236
- }
237
-
238
- .lattice-ref-auth .title {
239
- margin: 0;
240
- font-size: clamp(28px, 3vw, 40px);
241
- line-height: 1;
242
- letter-spacing: 0;
243
- text-align: left;
244
- -webkit-text-fill-color: transparent;
245
- background: linear-gradient(90deg, #10142b 0 68%, var(--ref-purple) 69% 100%);
246
- -webkit-background-clip: text;
247
- background-clip: text;
248
- }
249
-
250
- .lattice-ref-auth .subtitle {
251
- margin: 0 0 clamp(14px, 1.9dvh, 22px);
252
- color: #15182f;
253
- font-size: clamp(17px, 2vw, 24px);
254
- font-weight: 860;
255
- line-height: 1.25;
256
- letter-spacing: 0;
257
- }
258
-
259
- .lattice-ref-auth .subtitle::first-line {
260
- color: #15182f;
261
- }
262
-
263
- .lattice-ref-auth .submit,
264
- .lattice-ref-chat .send-btn,
265
- .lattice-ref-chat .workspace-icon,
266
- .lattice-ref-chat .mode-icon {
267
- background: linear-gradient(135deg, var(--ref-purple), #7b61ff);
268
- }
269
-
270
- .lattice-ref-auth .input {
271
- height: 100%;
272
- margin: 0;
273
- border: 0;
274
- background: transparent;
275
- box-shadow: none;
276
- padding: 0 10px;
277
- color: var(--ref-ink);
278
- font-size: clamp(13px, 1.3vw, 15px);
279
- font-weight: 650;
280
- }
281
-
282
- .lattice-ref-auth .input:focus {
283
- box-shadow: none;
284
- border: 0;
285
- }
286
-
287
- .auth-field {
288
- height: clamp(40px, 4.4dvh, 46px);
289
- display: flex;
290
- align-items: center;
291
- gap: 8px;
292
- margin-bottom: clamp(8px, 1.1dvh, 12px);
293
- padding: 0 16px;
294
- border: 1px solid #d9d6e4;
295
- border-radius: 8px;
296
- background: rgba(255,255,255,0.56);
297
- box-shadow: inset 0 1px 0 rgba(255,255,255,0.8);
298
- color: #9695a6;
299
- }
300
-
301
- .auth-field:focus-within {
302
- border-color: rgba(111,66,232,0.44);
303
- box-shadow: 0 0 0 3px rgba(111,66,232,0.09), inset 0 1px 0 rgba(255,255,255,0.8);
304
- }
305
-
306
- .auth-field > i {
307
- font-size: 19px;
308
- }
309
-
310
- .field-eye {
311
- border: 0;
312
- background: transparent;
313
- color: #9695a6;
314
- font-size: 18px;
315
- cursor: pointer;
316
- }
317
-
318
- .lattice-ref-auth .msg {
319
- min-height: clamp(14px, 1.5dvh, 18px);
320
- margin: 2px 0 4px;
321
- color: #d44f5c;
322
- }
323
-
324
- .lattice-ref-auth .submit,
325
- .lattice-ref-auth .register-cta {
326
- height: clamp(42px, 4.6dvh, 48px);
327
- border-radius: 8px;
328
- font-size: clamp(14px, 1.5vw, 17px);
329
- }
330
-
331
- .lattice-ref-auth .submit {
332
- margin-top: 0;
333
- box-shadow: 0 10px 24px rgba(111,66,232,0.24);
334
- }
335
-
336
- .lattice-ref-auth .register-cta {
337
- width: 100%;
338
- margin-top: clamp(8px, 1.1dvh, 12px);
339
- border: 2px solid rgba(111,66,232,0.56);
340
- color: var(--ref-purple);
341
- background: rgba(255,255,255,0.28);
342
- font-family: inherit;
343
- font-weight: 850;
344
- cursor: pointer;
345
- }
346
-
347
- .lattice-ref-auth .sso-divider {
348
- margin: clamp(12px, 1.5dvh, 18px) 0 clamp(8px, 1dvh, 10px);
349
- color: #636276;
350
- font-size: clamp(12px, 1.2vw, 14px);
351
- font-weight: 700;
352
- }
353
-
354
- .lattice-ref-auth .sso-divider::before,
355
- .lattice-ref-auth .sso-divider::after {
356
- background: #d9d6e4;
357
- }
358
-
359
- .lattice-ref-auth .sso-btn {
360
- height: clamp(40px, 4.5dvh, 48px);
361
- margin-bottom: clamp(8px, 1.1dvh, 12px);
362
- justify-content: flex-start;
363
- gap: clamp(10px, 1.4vw, 16px);
364
- padding: 0 clamp(18px, 2.8vw, 28px);
365
- border-radius: 8px;
366
- border-color: #d9d6e4;
367
- background: rgba(255,255,255,0.78);
368
- color: #15182f;
369
- font-size: clamp(13px, 1.4vw, 16px);
370
- font-weight: 850;
371
- box-shadow: 0 6px 16px rgba(88,72,150,0.08);
372
- }
373
-
374
- .ms-logo {
375
- width: clamp(22px, 2.5dvh, 26px);
376
- height: clamp(22px, 2.5dvh, 26px);
377
- display: grid;
378
- grid-template-columns: 1fr 1fr;
379
- gap: 3px;
380
- flex: 0 0 auto;
381
- }
382
-
383
- .ms-logo b:nth-child(1) { background: #f35325; }
384
- .ms-logo b:nth-child(2) { background: #81bc06; }
385
- .ms-logo b:nth-child(3) { background: #05a6f0; }
386
- .ms-logo b:nth-child(4) { background: #ffba08; }
387
-
388
- .okta-logo {
389
- width: clamp(22px, 2.5dvh, 28px);
390
- height: clamp(22px, 2.5dvh, 28px);
391
- border-radius: 50%;
392
- flex: 0 0 auto;
393
- background:
394
- conic-gradient(from 0deg, #111 0 10%, transparent 10% 17%, #111 17% 27%, transparent 27% 34%, #111 34% 44%, transparent 44% 51%, #111 51% 61%, transparent 61% 68%, #111 68% 78%, transparent 78% 85%, #111 85% 95%, transparent 95% 100%);
395
- }
396
-
397
- .local-start {
398
- display: flex;
399
- align-items: center;
400
- justify-content: center;
401
- gap: 12px;
402
- width: 100%;
403
- margin-top: clamp(10px, 1.4dvh, 16px);
404
- border: 0;
405
- background: transparent;
406
- color: var(--ref-purple);
407
- font-family: inherit;
408
- font-size: clamp(13px, 1.3vw, 16px);
409
- font-weight: 850;
410
- cursor: pointer;
411
- }
412
-
413
- .local-start i {
414
- font-size: clamp(17px, 1.9dvh, 22px);
415
- }
416
-
417
- .lattice-ref-auth .lang-wrap {
418
- position: absolute;
419
- top: 12px;
420
- right: 12px;
421
- z-index: 6;
422
- }
423
-
424
- .lattice-ref-auth .lang-btn {
425
- height: auto;
426
- border: 1px solid rgba(111,66,232,0.38);
427
- border-radius: 12px;
428
- padding: 4px 9px;
429
- color: #15182f;
430
- background: rgba(255,255,255,0.88);
431
- font-size: 11px;
432
- font-weight: 700;
433
- box-shadow: 0 1px 5px rgba(111,66,232,0.08);
434
- }
435
-
436
- .lattice-ref-auth .lang-menu {
437
- background: rgba(255,255,255,0.96);
438
- min-width: 110px;
439
- }
440
-
441
- .lattice-ref-auth .lang-opt {
442
- font-size: 11px;
443
- padding: 5px 8px;
444
- }
445
-
446
- .auth-footer {
447
- position: fixed;
448
- left: 48px;
449
- bottom: 28px;
450
- z-index: 5;
451
- display: flex;
452
- align-items: center;
453
- gap: 34px;
454
- }
455
-
456
- .auth-footer button {
457
- display: inline-flex;
458
- align-items: center;
459
- gap: 10px;
460
- height: 42px;
461
- border-radius: 11px;
462
- border: 1px solid var(--accent-soft);
463
- font-size: 16px;
464
- color: #4f5068;
465
- box-shadow: 0 8px 22px rgba(88,72,150,0.06);
466
- cursor: pointer;
467
- }
468
-
469
- .auth-footer a {
470
- color: #57566f;
471
- text-decoration: none;
472
- font-size: 16px;
473
- font-weight: 720;
474
- }
475
-
476
- .lattice-ref-auth #register-section .hero-logo,
477
- .lattice-ref-auth #register-section .logo {
478
- display: none;
479
- }
480
-
481
- .lattice-ref-auth #register-section .title {
482
- text-align: center;
483
- font-size: 38px;
484
- margin-bottom: 10px;
485
- display: block;
486
- }
487
-
488
- .lattice-ref-auth #register-section .subtitle {
489
- font-size: 16px;
490
- text-align: center;
491
- color: var(--ref-muted);
492
- letter-spacing: 0;
493
- }
494
-
495
- .lattice-ref-auth #register-section .input {
496
- height: 48px;
497
- margin-bottom: 10px;
498
- border: 1px solid #d9d6e4;
499
- background: rgba(255,255,255,0.62);
500
- border-radius: 9px;
501
- padding: 0 14px;
502
- font-size: 15px;
503
- }
504
-
505
- .lattice-ref-auth #register-section .submit {
506
- height: 54px;
507
- font-size: 17px;
508
- }
509
-
510
- @media (max-width: 1100px) {
511
- .auth-window-controls {
512
- display: none;
513
- }
514
-
515
- .auth-network {
516
- display: none;
517
- }
518
- }
519
-
520
- @media (max-height: 760px) {
521
- .lattice-ref-auth {
522
- padding-top: 58px;
523
- padding-bottom: 16px;
524
- }
525
-
526
- .auth-footer {
527
- display: none;
528
- }
529
-
530
- .lattice-ref-auth .card {
531
- padding: 38px 30px 16px;
532
- }
533
-
534
- .lattice-ref-auth .hero-logo {
535
- margin-bottom: 8px;
536
- }
537
-
538
- .lattice-ref-auth .hero-logo-mark {
539
- width: 40px;
540
- height: 40px;
541
- font-size: 36px;
542
- }
543
-
544
- .lattice-ref-auth .title {
545
- font-size: 26px;
546
- }
547
-
548
- .lattice-ref-auth .subtitle {
549
- margin-bottom: 12px;
550
- font-size: 16px;
551
- line-height: 1.2;
552
- }
553
-
554
- .auth-field,
555
- .lattice-ref-auth .submit,
556
- .lattice-ref-auth .register-cta,
557
- .lattice-ref-auth .sso-btn {
558
- height: 38px;
559
- }
560
-
561
- .auth-field {
562
- margin-bottom: 7px;
563
- }
564
-
565
- .lattice-ref-auth .submit,
566
- .lattice-ref-auth .register-cta,
567
- .lattice-ref-auth .sso-btn,
568
- .local-start {
569
- font-size: 13px;
570
- }
571
-
572
- .lattice-ref-auth .sso-divider {
573
- margin: 10px 0 6px;
574
- font-size: 12px;
575
- }
576
-
577
- .lattice-ref-auth .sso-btn {
578
- margin-bottom: 7px;
579
- }
580
-
581
- .local-start {
582
- margin-top: 8px;
583
- }
584
- }
585
-
586
- @media (max-width: 760px) {
587
- .auth-titlebar,
588
- .auth-footer,
589
- .auth-wave,
590
- .auth-network {
591
- display: none;
592
- }
593
-
594
- .lattice-ref-auth {
595
- padding: 18px;
596
- }
597
-
598
- .lattice-ref-auth .card {
599
- min-height: auto;
600
- max-height: none;
601
- padding: 28px 22px;
602
- }
603
-
604
- .lattice-ref-auth .hero-logo {
605
- gap: 12px;
606
- }
607
-
608
- .lattice-ref-auth .hero-logo-mark {
609
- width: 58px;
610
- height: 58px;
611
- font-size: 52px;
612
- }
613
-
614
- .lattice-ref-auth .title {
615
- font-size: 34px;
616
- }
617
-
618
- .lattice-ref-auth .subtitle {
619
- font-size: 26px;
620
- }
621
-
622
- }
623
-
624
- /* Shared PPT rail */
625
- .reference-rail {
626
- background: rgba(255,255,255,0.86);
627
- border-right: 1px solid var(--ref-line);
628
- color: var(--ref-ink);
629
- min-height: 100vh;
630
- padding: 26px 18px;
631
- display: flex;
632
- flex-direction: column;
633
- gap: 24px;
634
- box-shadow: 12px 0 48px rgba(88,72,150,0.08);
635
- }
636
-
637
- .rail-brand {
638
- display: flex;
639
- align-items: center;
640
- gap: 12px;
641
- font-size: 23px;
642
- font-weight: 850;
643
- letter-spacing: -0.04em;
644
- }
645
-
646
- .rail-brand i {
647
- color: var(--ref-purple);
648
- font-size: 30px;
649
- }
650
-
651
- .rail-brand span {
652
- display: block;
653
- font-size: 12px;
654
- color: var(--ref-purple-2);
655
- letter-spacing: 0;
656
- }
657
-
658
- .reference-rail nav {
659
- display: flex;
660
- flex-direction: column;
661
- gap: 9px;
662
- }
663
-
664
- .reference-rail a,
665
- .reference-nav-item {
666
- width: 100%;
667
- border: 0;
668
- text-decoration: none;
669
- display: flex;
670
- align-items: center;
671
- gap: 12px;
672
- border-radius: 10px;
673
- padding: 13px 16px;
674
- color: var(--text);
675
- font: inherit;
676
- font-size: 15px;
677
- font-weight: 700;
678
- background: transparent;
679
- cursor: pointer;
680
- transition: 160ms ease;
681
- }
682
-
683
- .reference-rail a.active,
684
- .reference-rail a:hover,
685
- .reference-nav-item.active,
686
- .reference-nav-item:hover {
687
- color: var(--ref-purple);
688
- background: linear-gradient(90deg, var(--border), rgba(111,66,232,0.05));
689
- }
690
-
691
- .reference-rail i,
692
- .reference-nav-item i {
693
- font-size: 20px;
694
- }
695
-
696
- .rail-project {
697
- margin-top: auto;
698
- border: 1px solid var(--ref-line);
699
- border-radius: 12px;
700
- padding: 15px 16px;
701
- background: rgba(255,255,255,0.70);
702
- color: var(--ref-muted);
703
- }
704
-
705
- .rail-project span {
706
- display: block;
707
- font-size: 12px;
708
- margin-bottom: 4px;
709
- }
710
-
711
- .rail-project strong {
712
- display: block;
713
- color: var(--ref-ink);
714
- font-size: 14px;
715
- }
716
-
717
- /* Chat and home dashboard */
718
- .lattice-ref-chat {
719
- background: var(--app-bg);
720
- }
721
-
722
- .lattice-ref-chat .sidebar {
723
- width: 280px;
724
- min-width: 280px;
725
- background: rgba(244,237,255,0.96);
726
- border-right: 1px solid rgba(111,66,232,0.13);
727
- box-shadow: 12px 0 46px rgba(88,72,150,0.08);
728
- }
729
-
730
- .lattice-ref-chat .sidebar-header {
731
- padding: 30px 24px 18px;
732
- border-bottom: 0;
733
- }
734
-
735
- .lattice-ref-chat .logo-box {
736
- width: 42px;
737
- height: 42px;
738
- border-radius: 13px;
739
- }
740
-
741
- .lattice-ref-chat .brand-title {
742
- color: var(--ref-ink);
743
- font-size: 23px;
744
- letter-spacing: -0.04em;
745
- }
746
-
747
- .lattice-ref-chat .brand-subtitle {
748
- display: inline-flex;
749
- margin-top: 6px;
750
- padding: 3px 10px;
751
- border-radius: 999px;
752
- color: var(--ref-purple);
753
- background: rgba(111,66,232,0.10);
754
- font-size: 12px;
755
- font-weight: 700;
756
- }
757
-
758
- .lattice-ref-chat .user-strip {
759
- margin: 0 18px 16px;
760
- border: 1px solid var(--ref-line);
761
- border-radius: 14px;
762
- background: rgba(255,255,255,0.72);
763
- order: 20;
764
- }
765
-
766
- .lattice-ref-chat .reference-side-nav {
767
- padding: 12px 18px;
768
- }
769
-
770
- .lattice-ref-chat .sidebar-search,
771
- .lattice-ref-chat .sidebar-primary-actions {
772
- margin: 0 18px;
773
- padding-left: 0;
774
- padding-right: 0;
775
- }
776
-
777
- .lattice-ref-chat .history-container {
778
- padding: 10px 18px;
779
- }
780
-
781
- .lattice-ref-chat .sidebar-footer {
782
- padding: 14px 18px 18px;
783
- }
784
-
785
- .lattice-ref-chat .new-chat-btn,
786
- .lattice-ref-chat .status-btn,
787
- .lattice-ref-chat .setup-wizard-sidebar-btn,
788
- .lattice-ref-chat .admin-btn,
789
- .lattice-ref-chat .file-type-btn,
790
- .lattice-ref-chat .logout-btn,
791
- .lattice-ref-chat .status-pill,
792
- .lattice-ref-chat .model-badge {
793
- border: 1px solid rgba(111,66,232,0.16);
794
- border-radius: 10px;
795
- background: rgba(244,238,255,0.88);
796
- color: var(--ref-ink);
797
- }
798
-
799
- .lattice-ref-chat .new-chat-btn:first-child {
800
- border-color: rgba(111,66,232,0.28);
801
- color: var(--ref-purple);
802
- }
803
-
804
- .lattice-ref-chat .chat-header {
805
- min-height: 88px;
806
- padding: 18px 28px;
807
- background: rgba(244,238,255,0.92);
808
- border-bottom: 1px solid rgba(111,66,232,0.11);
809
- box-shadow: 0 2px 12px rgba(88,72,150,0.06);
810
- backdrop-filter: blur(14px);
811
- }
812
-
813
- .lattice-ref-chat .messages-viewport {
814
- padding: 30px 38px 20px;
815
- }
816
-
817
- .lattice-ref-chat .ops-strip {
818
- display: flex;
819
- }
820
-
821
- .lattice-ref-chat .empty-state {
822
- width: min(100%, 1320px);
823
- max-width: none;
824
- margin: 0 auto;
825
- text-align: left;
826
- }
827
-
828
- .reference-home {
829
- display: flex;
830
- flex-direction: column;
831
- gap: 22px;
832
- }
833
-
834
- .reference-home-head h1 {
835
- margin: 0;
836
- color: var(--ref-ink);
837
- font-size: clamp(30px, 3vw, 40px);
838
- font-weight: 860;
839
- letter-spacing: -0.04em;
840
- }
841
-
842
- .reference-home-head p {
843
- margin: 8px 0 0;
844
- color: var(--ref-muted);
845
- font-size: 15px;
846
- }
847
-
848
- .reference-card-grid {
849
- display: grid;
850
- grid-template-columns: repeat(3, minmax(0, 1fr));
851
- gap: 20px;
852
- }
853
-
854
- .reference-dash-card,
855
- .reference-lists article {
856
- border: 1px solid var(--ref-line);
857
- border-radius: 18px;
858
- background: var(--ref-card);
859
- box-shadow: var(--ref-shadow);
860
- transition: transform 200ms var(--lt-motion-ease, ease), box-shadow 200ms var(--lt-motion-ease, ease);
861
- }
862
-
863
- .reference-dash-card:hover,
864
- .reference-lists article:hover {
865
- transform: translateY(-3px);
866
- box-shadow: 0 24px 64px rgba(88,72,150,0.18);
867
- }
868
-
869
- .reference-dash-card {
870
- min-height: 260px;
871
- padding: 22px 24px;
872
- }
873
-
874
- .reference-card-icon {
875
- width: 56px;
876
- height: 56px;
877
- border-radius: 15px;
878
- display: grid;
879
- place-items: center;
880
- margin-bottom: 18px;
881
- color: var(--ref-purple);
882
- background: linear-gradient(135deg, rgba(111,66,232,0.13), rgba(111,66,232,0.06));
883
- font-size: 28px;
884
- }
885
-
886
- .reference-dash-card h3 {
887
- margin: 0 0 20px;
888
- color: var(--ref-ink);
889
- font-size: 22px;
890
- }
891
-
892
- .reference-dash-card p {
893
- color: var(--ref-muted);
894
- margin: 0 0 14px;
895
- }
896
-
897
- .green-dot {
898
- display: inline-block;
899
- width: 11px;
900
- height: 11px;
901
- border-radius: 50%;
902
- background: #28c66f;
903
- box-shadow: 0 0 0 8px rgba(40,198,111,0.12);
904
- margin-right: 10px;
905
- }
906
-
907
- .reference-stat-row {
908
- display: flex;
909
- justify-content: space-between;
910
- align-items: center;
911
- color: var(--ref-muted);
912
- margin: 12px 0;
913
- }
914
-
915
- .reference-stat-row strong,
916
- .reference-big-number {
917
- color: var(--ref-purple);
918
- font-size: 22px;
919
- }
920
-
921
- .reference-big-number {
922
- font-size: 34px;
923
- font-weight: 850;
924
- }
925
-
926
- .reference-progress {
927
- height: 10px;
928
- border-radius: 999px;
929
- background: #ebe7f4;
930
- overflow: hidden;
931
- margin: 16px 0 26px;
932
- }
933
-
934
- .reference-progress span {
935
- display: block;
936
- height: 100%;
937
- border-radius: inherit;
938
- background: linear-gradient(90deg, var(--ref-purple), var(--ref-purple-2));
939
- }
940
-
941
- .reference-dash-card button,
942
- .reference-lists button {
943
- width: 100%;
944
- border: 1px solid rgba(111,66,232,0.35);
945
- border-radius: 10px;
946
- padding: 12px 14px;
947
- color: var(--ref-purple);
948
- background: #fff;
949
- font: inherit;
950
- font-weight: 800;
951
- cursor: pointer;
952
- }
953
-
954
- .reference-lists {
955
- display: grid;
956
- grid-template-columns: 1fr 1.1fr;
957
- gap: 20px;
958
- }
959
-
960
- .reference-lists article {
961
- padding: 0 22px 12px;
962
- }
963
-
964
- .reference-lists header {
965
- height: 58px;
966
- display: flex;
967
- align-items: center;
968
- gap: 10px;
969
- border-bottom: 1px solid var(--ref-line);
970
- color: var(--ref-ink);
971
- font-weight: 850;
972
- }
973
-
974
- .reference-lists header button {
975
- margin-left: auto;
976
- width: auto;
977
- border: 0;
978
- padding: 0;
979
- color: var(--ref-purple);
980
- background: transparent;
981
- }
982
-
983
- .reference-lists p {
984
- display: flex;
985
- justify-content: space-between;
986
- gap: 18px;
987
- margin: 0;
988
- padding: 15px 0;
989
- border-bottom: 1px solid #f0ecf7;
990
- color: var(--ref-ink);
991
- }
992
-
993
- .reference-lists p span {
994
- color: var(--ref-faint);
995
- white-space: nowrap;
996
- }
997
-
998
- .lattice-ref-chat .empty-grid {
999
- display: flex;
1000
- justify-content: flex-start;
1001
- gap: 10px;
1002
- }
1003
-
1004
- .lattice-ref-chat .empty-chip {
1005
- border-radius: 999px;
1006
- padding: 12px 16px;
1007
- box-shadow: none;
1008
- }
1009
-
1010
- .lattice-ref-chat .input-area {
1011
- background: linear-gradient(0deg, rgba(243,237,255,0.99), rgba(243,237,255,0.86), transparent);
1012
- }
1013
-
1014
- .lattice-ref-chat .input-box {
1015
- max-width: 1120px;
1016
- border-radius: 18px;
1017
- background: rgba(248,243,255,0.97);
1018
- border-color: rgba(111,66,232,0.17);
1019
- box-shadow: 0 8px 32px rgba(88,72,150,0.10);
1020
- }
1021
-
1022
- .lattice-ref-chat .user .bubble {
1023
- background: linear-gradient(135deg, var(--ref-purple), #6536d9);
1024
- border-radius: 16px 16px 4px 16px;
1025
- }
1026
-
1027
- .lattice-ref-chat .ai .bubble {
1028
- background: rgba(250,246,255,0.97);
1029
- color: var(--ref-ink);
1030
- border-color: var(--accent-soft);
1031
- border-radius: 16px 16px 16px 4px;
1032
- box-shadow: 0 4px 18px rgba(88,72,150,0.08);
1033
- }
1034
-
1035
- .lattice-ref-chat .workspace-modal,
1036
- .lattice-ref-chat .mode-modal {
1037
- border-radius: 22px;
1038
- }
1039
-
1040
- /* Graph page: slide 6 light graph workspace */
1041
- .lattice-ref-graph {
1042
- margin: 0;
1043
- display: grid;
1044
- grid-template-columns: 264px minmax(0, 1fr);
1045
- min-height: 100vh;
1046
- overflow: hidden;
1047
- background: #fbfaff;
1048
- color: var(--ref-ink);
1049
- font-family: "Inter", "Pretendard", "Apple SD Gothic Neo", -apple-system, BlinkMacSystemFont, sans-serif;
1050
- }
1051
-
1052
- .lattice-ref-graph .app {
1053
- height: 100vh;
1054
- grid-template-columns: minmax(0, 1fr) 320px;
1055
- background: #fbfaff;
1056
- }
1057
-
1058
- .lattice-ref-graph .stage {
1059
- border-right: 0;
1060
- background:
1061
- radial-gradient(circle, var(--border) 1px, transparent 1.8px),
1062
- linear-gradient(180deg, #fff 0%, #fbfaff 100%);
1063
- background-size: 28px 28px, 100% 100%;
1064
- margin: 98px 14px 40px 24px;
1065
- border: 1px solid var(--ref-line);
1066
- border-radius: 14px;
1067
- overflow: hidden;
1068
- }
1069
-
1070
- .lattice-ref-graph .stage::before {
1071
- content: "지식 그래프";
1072
- position: fixed;
1073
- top: 34px;
1074
- left: 324px;
1075
- color: var(--ref-ink);
1076
- font-size: 31px;
1077
- font-weight: 860;
1078
- letter-spacing: -0.04em;
1079
- }
1080
-
1081
- .lattice-ref-graph .stage::after {
1082
- content: "\ea2e";
1083
- font-family: "tabler-icons";
1084
- position: fixed;
1085
- top: 30px;
1086
- left: 288px;
1087
- width: 40px;
1088
- height: 40px;
1089
- display: grid;
1090
- place-items: center;
1091
- border-radius: 10px;
1092
- color: var(--ref-purple);
1093
- background: rgba(111,66,232,0.10);
1094
- font-size: 22px;
1095
- }
1096
-
1097
- .lattice-ref-graph .search-shell {
1098
- top: -72px;
1099
- left: auto;
1100
- right: 250px;
1101
- width: min(520px, 42vw);
1102
- border-radius: 10px;
1103
- background: #fff;
1104
- box-shadow: none;
1105
- }
1106
-
1107
- .lattice-ref-graph .search-head {
1108
- display: none;
1109
- }
1110
-
1111
- .lattice-ref-graph .search-input-wrap {
1112
- padding: 0;
1113
- }
1114
-
1115
- .lattice-ref-graph .search-input {
1116
- height: 48px;
1117
- background: #fff;
1118
- color: var(--ref-ink);
1119
- border-color: var(--ref-line);
1120
- }
1121
-
1122
- .lattice-ref-graph #clear-search-btn {
1123
- display: none;
1124
- }
1125
-
1126
- .lattice-ref-graph .search-results {
1127
- display: none;
1128
- }
1129
-
1130
- .lattice-ref-graph .toolbar {
1131
- top: auto;
1132
- bottom: 12px;
1133
- left: 50%;
1134
- right: auto;
1135
- transform: translateX(-50%);
1136
- background: #fff;
1137
- border-color: var(--ref-line);
1138
- box-shadow: var(--ref-shadow);
1139
- border-radius: 12px;
1140
- }
1141
-
1142
- .lattice-ref-graph .tb-btn {
1143
- background: #fff;
1144
- color: var(--ref-ink);
1145
- border-color: var(--ref-line);
1146
- }
1147
-
1148
- .lattice-ref-graph aside:not(.reference-rail) {
1149
- margin: 98px 20px 40px 0;
1150
- border: 1px solid var(--ref-line);
1151
- border-radius: 14px;
1152
- background: #fff;
1153
- color: var(--ref-ink);
1154
- box-shadow: var(--ref-shadow);
1155
- display: flex;
1156
- flex-direction: column;
1157
- overflow-x: hidden;
1158
- overflow-y: auto;
1159
- min-height: 0;
1160
- }
1161
-
1162
- .lattice-ref-graph .sidebar-head,
1163
- .lattice-ref-graph .section {
1164
- border-color: var(--ref-line);
1165
- }
1166
-
1167
- .lattice-ref-graph .eyebrow {
1168
- color: var(--ref-purple);
1169
- }
1170
-
1171
- .lattice-ref-graph .sidebar-sub,
1172
- .lattice-ref-graph .filter-count,
1173
- .lattice-ref-graph .legend-meta,
1174
- .lattice-ref-graph .detail-summary,
1175
- .lattice-ref-graph .empty-hint {
1176
- color: var(--ref-muted);
1177
- }
1178
-
1179
- .lattice-ref-graph .stat,
1180
- .lattice-ref-graph .metric-card,
1181
- .lattice-ref-graph .meta-block,
1182
- .lattice-ref-graph .search-item {
1183
- background: #fbfaff;
1184
- border-color: var(--ref-line);
1185
- }
1186
-
1187
- .lattice-ref-graph #tooltip {
1188
- background: #fff;
1189
- color: var(--ref-ink);
1190
- border-color: var(--ref-line);
1191
- }
1192
-
1193
- /* Admin page — light lavender theme (matches graph/chat) */
1194
- .lattice-ref-admin {
1195
- margin: 0;
1196
- display: grid;
1197
- grid-template-columns: 264px minmax(0, 1fr);
1198
- min-height: 100vh;
1199
- overflow: hidden;
1200
- background:
1201
- radial-gradient(circle at 82% 12%, var(--border), transparent 30%),
1202
- radial-gradient(circle at 10% 80%, rgba(180,160,255,0.16), transparent 35%),
1203
- linear-gradient(180deg, var(--bg) 0%, var(--surface-2) 52%, #f2ecff 100%);
1204
- color: var(--text);
1205
- }
1206
-
1207
- .lattice-ref-admin::before {
1208
- display: none;
1209
- }
1210
-
1211
- .lattice-ref-admin .admin-rail {
1212
- background: rgba(244,237,255,0.96);
1213
- border-right: 1px solid rgba(111,66,232,0.13);
1214
- color: var(--text);
1215
- box-shadow: 12px 0 46px rgba(88,72,150,0.08);
1216
- }
1217
-
1218
- .lattice-ref-admin .admin-rail .rail-brand {
1219
- align-items: flex-start;
1220
- flex-direction: column;
1221
- gap: 4px;
1222
- font-size: 25px;
1223
- color: var(--text);
1224
- }
1225
-
1226
- .lattice-ref-admin .admin-rail .rail-brand i {
1227
- font-size: 34px;
1228
- color: var(--ref-purple);
1229
- }
1230
-
1231
- .lattice-ref-admin .admin-rail a {
1232
- color: var(--text);
1233
- }
1234
-
1235
- .lattice-ref-admin .admin-rail a.active,
1236
- .lattice-ref-admin .admin-rail a:hover {
1237
- background: linear-gradient(90deg, var(--border), rgba(111,66,232,0.05));
1238
- color: var(--text);
1239
- }
1240
-
1241
- .lattice-ref-admin .admin-rail .rail-project {
1242
- background: rgba(255,255,255,0.72);
1243
- border-color: rgba(111,66,232,0.13);
1244
- }
1245
-
1246
- .lattice-ref-admin .admin-rail .rail-project strong {
1247
- color: var(--text);
1248
- }
1249
-
1250
- .lattice-ref-admin .admin-rail .rail-project span {
1251
- color: var(--muted);
1252
- }
1253
-
1254
- .lattice-ref-admin .page {
1255
- min-height: 100vh;
1256
- overflow-y: auto;
1257
- }
1258
-
1259
- .lattice-ref-admin .topbar {
1260
- height: 96px;
1261
- background: rgba(244,237,255,0.92);
1262
- border-bottom: 1px solid rgba(111,66,232,0.10);
1263
- backdrop-filter: blur(14px);
1264
- padding: 22px 34px 8px;
1265
- position: sticky;
1266
- }
1267
-
1268
- .lattice-ref-admin .brand-mark {
1269
- display: none;
1270
- }
1271
-
1272
- .lattice-ref-admin .brand h1 {
1273
- font-size: 36px;
1274
- letter-spacing: -0.05em;
1275
- color: var(--text);
1276
- }
1277
-
1278
- .lattice-ref-admin .brand p {
1279
- color: var(--muted);
1280
- font-size: 15px;
1281
- }
1282
-
1283
- .lattice-ref-admin .top-actions .btn {
1284
- background: rgba(244,238,255,0.88);
1285
- border-color: rgba(111,66,232,0.18);
1286
- color: var(--text);
1287
- }
1288
-
1289
- .lattice-ref-admin .top-actions .btn:hover {
1290
- background: rgba(111,66,232,0.10);
1291
- border-color: rgba(111,66,232,0.32);
1292
- color: var(--accent);
1293
- }
1294
-
1295
- .lattice-ref-admin #admin-lang-btn {
1296
- min-width: 180px;
1297
- justify-content: center;
1298
- border-color: var(--border-strong);
1299
- }
1300
-
1301
- .lattice-ref-admin .content {
1302
- width: min(1500px, calc(100vw - 316px));
1303
- padding: 8px 34px 28px;
1304
- gap: 18px;
1305
- }
1306
-
1307
- .lattice-ref-admin .admin-view {
1308
- display: none;
1309
- flex-direction: column;
1310
- gap: 18px;
1311
- }
1312
-
1313
- .lattice-ref-admin .admin-view.active {
1314
- display: flex;
1315
- }
1316
-
1317
- .lattice-ref-admin .hero {
1318
- display: none;
1319
- }
1320
-
1321
- .lattice-ref-admin .summary-grid {
1322
- grid-template-columns: repeat(4, minmax(0, 1fr));
1323
- gap: 14px;
1324
- }
1325
-
1326
- .lattice-ref-admin .summary-card,
1327
- .lattice-ref-admin .panel,
1328
- .lattice-ref-admin .subpanel,
1329
- .lattice-ref-admin .session-card,
1330
- .lattice-ref-admin .table-wrap,
1331
- .lattice-ref-admin .audit-metric {
1332
- background: rgba(248,243,255,0.88);
1333
- border-color: var(--accent-soft);
1334
- box-shadow: 0 8px 28px rgba(88,72,150,0.08);
1335
- color: var(--text);
1336
- border-radius: 12px;
1337
- }
1338
-
1339
- .lattice-ref-admin .summary-card {
1340
- min-height: 118px;
1341
- padding: 18px 18px 16px 88px;
1342
- position: relative;
1343
- display: flex;
1344
- flex-direction: column;
1345
- justify-content: center;
1346
- overflow: hidden;
1347
- transition: transform 200ms ease, box-shadow 200ms ease;
1348
- }
1349
-
1350
- .lattice-ref-admin .summary-card:hover {
1351
- transform: translateY(-2px);
1352
- box-shadow: 0 14px 40px rgba(88,72,150,0.14);
1353
- }
1354
-
1355
- .lattice-ref-admin .summary-card::before {
1356
- content: "\ea02";
1357
- font-family: "tabler-icons";
1358
- position: absolute;
1359
- left: 20px;
1360
- top: 50%;
1361
- width: 48px;
1362
- height: 48px;
1363
- display: grid;
1364
- place-items: center;
1365
- border-radius: 8px;
1366
- color: #fff;
1367
- background: linear-gradient(135deg, var(--accent), #5332b8);
1368
- font-size: 24px;
1369
- transform: translateY(-50%);
1370
- box-shadow: 0 12px 24px rgba(111,66,232,0.16);
1371
- }
1372
-
1373
- .lattice-ref-admin .summary-card:nth-child(2)::before { content: "\ea9a"; }
1374
- .lattice-ref-admin .summary-card:nth-child(3)::before { content: "\eaa4"; }
1375
- .lattice-ref-admin .summary-card:nth-child(4)::before {
1376
- content: "\eadd";
1377
- background: linear-gradient(135deg, #0d8f72, #116b6d);
1378
- }
1379
-
1380
- .lattice-ref-admin .summary-card .label,
1381
- .lattice-ref-admin .panel-header p,
1382
- .lattice-ref-admin .summary-card .meta {
1383
- color: var(--muted);
1384
- }
1385
-
1386
- .lattice-ref-admin .summary-card .label {
1387
- font-size: 12px;
1388
- font-weight: 800;
1389
- letter-spacing: 0;
1390
- text-transform: none;
1391
- margin-bottom: 8px;
1392
- }
1393
-
1394
- .lattice-ref-admin td,
1395
- .lattice-ref-admin th {
1396
- color: var(--text);
1397
- }
1398
-
1399
- .lattice-ref-admin .summary-card .value {
1400
- color: var(--accent);
1401
- font-size: clamp(24px, 2.15vw, 34px);
1402
- line-height: 1.05;
1403
- letter-spacing: 0;
1404
- overflow: hidden;
1405
- overflow-wrap: anywhere;
1406
- display: -webkit-box;
1407
- -webkit-line-clamp: 2;
1408
- -webkit-box-orient: vertical;
1409
- }
1410
-
1411
- .lattice-ref-admin .summary-card .meta {
1412
- margin-top: 8px;
1413
- min-height: 0;
1414
- line-height: 1.4;
1415
- overflow: hidden;
1416
- display: -webkit-box;
1417
- -webkit-line-clamp: 2;
1418
- -webkit-box-orient: vertical;
1419
- }
1420
-
1421
- .lattice-ref-admin .panel-header {
1422
- border-bottom-color: rgba(111,66,232,0.10);
1423
- }
1424
-
1425
- .lattice-ref-admin .panel-header h3,
1426
- .lattice-ref-admin .subpanel h4 {
1427
- color: var(--text);
1428
- }
1429
-
1430
- .lattice-ref-admin table {
1431
- color: var(--text);
1432
- background: transparent;
1433
- }
1434
-
1435
- .lattice-ref-admin tr,
1436
- .lattice-ref-admin th,
1437
- .lattice-ref-admin td {
1438
- border-color: rgba(111,66,232,0.10);
1439
- }
1440
-
1441
- .lattice-ref-admin th {
1442
- background: rgba(111,66,232,0.05);
1443
- color: var(--muted);
1444
- }
1445
-
1446
- .lattice-ref-admin input,
1447
- .lattice-ref-admin textarea,
1448
- .lattice-ref-admin select {
1449
- background: rgba(255,255,255,0.80);
1450
- border-color: rgba(111,66,232,0.16);
1451
- color: var(--text);
1452
- }
1453
-
1454
- .lattice-ref-admin input:focus,
1455
- .lattice-ref-admin textarea:focus,
1456
- .lattice-ref-admin select:focus {
1457
- border-color: rgba(111,66,232,0.44);
1458
- box-shadow: 0 0 0 3px rgba(111,66,232,0.08);
1459
- }
1460
-
1461
- .lattice-ref-admin label {
1462
- color: var(--muted);
1463
- }
1464
-
1465
- .lattice-ref-admin .item {
1466
- background: rgba(255,255,255,0.70);
1467
- border-color: rgba(111,66,232,0.10);
1468
- color: var(--text);
1469
- }
1470
-
1471
- .lattice-ref-admin .preview {
1472
- color: var(--muted);
1473
- }
1474
-
1475
- .lattice-ref-admin .tag {
1476
- color: var(--muted);
1477
- border-color: rgba(111,66,232,0.15);
1478
- background: rgba(255,255,255,0.60);
1479
- }
1480
-
1481
- .lattice-ref-admin .muted {
1482
- color: var(--muted);
1483
- }
1484
-
1485
- .lattice-ref-admin .notice {
1486
- background: rgba(111,66,232,0.08);
1487
- border-color: rgba(111,66,232,0.20);
1488
- color: var(--muted);
1489
- }
1490
-
1491
- .lattice-ref-admin .status-copy {
1492
- color: var(--muted);
1493
- }
1494
-
1495
- .lattice-ref-admin .inline-control {
1496
- display: flex;
1497
- gap: 8px;
1498
- align-items: center;
1499
- }
1500
-
1501
- .lattice-ref-admin .inline-control input {
1502
- flex: 1;
1503
- }
1504
-
1505
- .lattice-ref-admin .button-row {
1506
- display: flex;
1507
- flex-wrap: wrap;
1508
- gap: 8px;
1509
- justify-content: flex-end;
1510
- }
1511
-
1512
- .lattice-ref-admin .sso-template-help {
1513
- margin-top: 12px;
1514
- padding: 11px 12px;
1515
- border: 1px solid var(--border);
1516
- border-radius: 8px;
1517
- background: rgba(111,66,232,0.06);
1518
- color: var(--muted);
1519
- font-size: 12px;
1520
- line-height: 1.5;
1521
- }
1522
-
1523
- .lattice-ref-admin .enterprise-grid {
1524
- display: grid;
1525
- grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
1526
- gap: 10px;
1527
- }
1528
-
1529
- .lattice-ref-admin .enterprise-cap-card {
1530
- display: flex;
1531
- align-items: center;
1532
- gap: 10px;
1533
- min-width: 0;
1534
- border: 1px solid var(--accent-soft);
1535
- border-radius: 8px;
1536
- background: rgba(255,255,255,0.70);
1537
- padding: 11px 12px;
1538
- }
1539
-
1540
- .lattice-ref-admin .enterprise-cap-card i {
1541
- color: var(--faint);
1542
- font-size: 18px;
1543
- }
1544
-
1545
- .lattice-ref-admin .enterprise-cap-card.on i {
1546
- color: #0d8f72;
1547
- }
1548
-
1549
- .lattice-ref-admin .enterprise-cap-card span {
1550
- flex: 1;
1551
- min-width: 0;
1552
- color: var(--text);
1553
- font-size: 13px;
1554
- font-weight: 800;
1555
- overflow: hidden;
1556
- text-overflow: ellipsis;
1557
- white-space: nowrap;
1558
- text-transform: capitalize;
1559
- }
1560
-
1561
- .lattice-ref-admin .enterprise-cap-card strong {
1562
- color: var(--muted);
1563
- font-size: 11px;
1564
- }
1565
-
1566
- .lattice-ref-admin .enterprise-kv {
1567
- display: grid;
1568
- gap: 8px;
1569
- }
1570
-
1571
- .lattice-ref-admin .enterprise-kv div {
1572
- display: grid;
1573
- grid-template-columns: 150px minmax(0, 1fr);
1574
- gap: 10px;
1575
- align-items: start;
1576
- border: 1px solid rgba(111,66,232,0.10);
1577
- border-radius: 8px;
1578
- background: rgba(255,255,255,0.62);
1579
- padding: 9px 10px;
1580
- }
1581
-
1582
- .lattice-ref-admin .enterprise-kv span {
1583
- color: var(--muted);
1584
- font-size: 12px;
1585
- font-weight: 800;
1586
- }
1587
-
1588
- .lattice-ref-admin .enterprise-kv strong {
1589
- color: var(--text);
1590
- font-size: 12px;
1591
- line-height: 1.45;
1592
- overflow-wrap: anywhere;
1593
- }
1594
-
1595
- .lattice-ref-admin .enterprise-json {
1596
- max-height: 280px;
1597
- overflow: auto;
1598
- margin: 12px 0 0;
1599
- border: 1px solid rgba(111,66,232,0.10);
1600
- border-radius: 8px;
1601
- background: rgba(20,22,44,0.05);
1602
- color: var(--text);
1603
- padding: 12px;
1604
- font-size: 12px;
1605
- white-space: pre-wrap;
1606
- }
1607
-
1608
- @media (max-width: 980px) {
1609
- .lattice-ref-chat .reference-card-grid,
1610
- .reference-lists {
1611
- grid-template-columns: 1fr;
1612
- }
1613
-
1614
- .lattice-ref-graph,
1615
- .lattice-ref-admin {
1616
- display: block;
1617
- overflow: auto;
1618
- }
1619
-
1620
- .reference-rail {
1621
- min-height: auto;
1622
- }
1623
- }
1624
-
1625
- /* ============================================================
1626
- ACCOUNT / AUTH PAGE (account.html)
1627
- Light lavender theme — unified with chat/graph/admin pages.
1628
- ============================================================ */
1629
-
1630
- * { box-sizing: border-box; margin: 0; padding: 0; }
1631
- html, body.lattice-ref-auth { height: 100%; }
1632
- body.lattice-ref-auth {
1633
- font-family: Inter, -apple-system, BlinkMacSystemFont, sans-serif;
1634
- color: var(--text);
1635
- background: var(--app-bg);
1636
- display: flex;
1637
- align-items: center;
1638
- justify-content: center;
1639
- min-height: 100vh;
1640
- padding: 24px;
1641
- overflow: hidden;
1642
- position: relative;
1643
- }
1644
-
1645
- body::before {
1646
- content: '';
1647
- position: fixed;
1648
- inset: 0;
1649
- background:
1650
- radial-gradient(circle, rgba(123,109,255,0.28) 1px, transparent 1.8px),
1651
- linear-gradient(rgba(123,109,255,0.08) 1px, transparent 1px),
1652
- linear-gradient(90deg, rgba(123,109,255,0.06) 1px, transparent 1px);
1653
- background-size: 82px 82px, 46px 46px, 46px 46px;
1654
- background-position: 16px 18px, 0 0, 0 0;
1655
- mask-image: linear-gradient(180deg, rgba(0,0,0,0.18), rgba(0,0,0,0.02));
1656
- pointer-events: none;
1657
- }
1658
-
1659
- body::after {
1660
- content: '';
1661
- position: fixed;
1662
- inset: 0;
1663
- background:
1664
- radial-gradient(ellipse at 8% 78%, rgba(142,111,255,0.24), transparent 34%),
1665
- linear-gradient(115deg, transparent 0 35%, rgba(111,75,246,0.09) 35.2%, transparent 35.6% 100%);
1666
- pointer-events: none;
1667
- }
1668
-
1669
- .orb {
1670
- display: none;
1671
- }
1672
-
1673
- .login-shell {
1674
- width: min(920px, 100%);
1675
- display: grid;
1676
- grid-template-columns: minmax(280px, 400px) minmax(220px, 1fr);
1677
- align-items: center;
1678
- gap: 46px;
1679
- position: relative;
1680
- z-index: 1;
1681
- }
1682
-
1683
- .brand-preview {
1684
- min-height: 360px;
1685
- border-radius: 34px;
1686
- background:
1687
- radial-gradient(circle at 54% 45%, rgba(111,75,246,0.24), transparent 18%),
1688
- linear-gradient(145deg, rgba(255,255,255,0.68), rgba(244,239,255,0.32));
1689
- border: 1px solid rgba(111,75,246,0.12);
1690
- box-shadow: inset 0 1px 0 rgba(255,255,255,0.85);
1691
- position: relative;
1692
- overflow: hidden;
1693
- }
1694
- .brand-preview::before {
1695
- content: '';
1696
- position: absolute;
1697
- inset: auto -12% 0 -8%;
1698
- height: 46%;
1699
- background: linear-gradient(135deg, rgba(111,75,246,0.24), rgba(255,255,255,0.12));
1700
- clip-path: polygon(0 62%, 18% 42%, 36% 54%, 55% 26%, 76% 44%, 100% 20%, 100% 100%, 0 100%);
1701
- filter: blur(1px);
1702
- }
1703
- .preview-node {
1704
- position: absolute;
1705
- width: 52px;
1706
- height: 52px;
1707
- border-radius: 17px;
1708
- background: #fff;
1709
- border: 1px solid rgba(111,75,246,0.18);
1710
- box-shadow: 0 18px 40px rgba(111,75,246,0.16);
1711
- }
1712
- .preview-node::after {
1713
- content: '';
1714
- position: absolute;
1715
- inset: 14px;
1716
- border-radius: 10px;
1717
- background: linear-gradient(135deg, #6f4bf6, #9f8cff);
1718
- }
1719
- .preview-node.n1 { top: 52px; left: 58px; }
1720
- .preview-node.n2 { top: 112px; right: 64px; }
1721
- .preview-node.n3 { left: 120px; bottom: 92px; }
1722
- .preview-node.n4 { right: 120px; bottom: 58px; }
1723
- .preview-line {
1724
- position: absolute;
1725
- height: 2px;
1726
- width: 150px;
1727
- background: linear-gradient(90deg, transparent, rgba(111,75,246,0.45), transparent);
1728
- transform-origin: left center;
1729
- }
1730
- .preview-line.l1 { top: 108px; left: 112px; transform: rotate(18deg); }
1731
- .preview-line.l2 { top: 186px; left: 176px; transform: rotate(112deg); }
1732
- .preview-line.l3 { bottom: 112px; left: 172px; transform: rotate(-13deg); }
1733
-
1734
- .card {
1735
- width: min(400px, 100%);
1736
- background: rgba(255,255,255,0.86);
1737
- border: 1px solid rgba(111,75,246,0.13);
1738
- border-radius: 14px;
1739
- padding: 38px 34px;
1740
- box-shadow: var(--shadow), inset 0 1px 0 rgba(255,255,255,0.9);
1741
- position: relative;
1742
- z-index: 1;
1743
- backdrop-filter: blur(28px);
1744
- }
1745
-
1746
- .card::before {
1747
- content: '';
1748
- position: absolute;
1749
- top: 0; left: 50%;
1750
- transform: translateX(-50%);
1751
- width: 55%; height: 1px;
1752
- background: linear-gradient(90deg, transparent, rgba(111,75,246,0.65), rgba(123,109,255,0.45), transparent);
1753
- }
1754
-
1755
- .logo {
1756
- width: 54px; height: 54px;
1757
- background: linear-gradient(135deg, #6f4bf6 0%, #8d7aff 100%);
1758
- border-radius: 10px;
1759
- display: flex; align-items: center; justify-content: center;
1760
- font-size: 26px; color: #fff;
1761
- margin: 0 auto 18px;
1762
- box-shadow: 0 16px 34px rgba(111,75,246,0.28);
1763
- }
1764
-
1765
- .title {
1766
- text-align: center;
1767
- font-size: 23px;
1768
- font-weight: 800;
1769
- margin-bottom: 6px;
1770
- background: linear-gradient(135deg, #1f2140 35%, #6f4bf6 82%);
1771
- -webkit-background-clip: text;
1772
- -webkit-text-fill-color: transparent;
1773
- background-clip: text;
1774
- }
1775
-
1776
- .subtitle {
1777
- text-align: center;
1778
- color: var(--muted);
1779
- font-size: 12.5px;
1780
- margin-bottom: 26px;
1781
- line-height: 1.5;
1782
- }
1783
-
1784
- .input {
1785
- width: 100%;
1786
- padding: 12px 14px;
1787
- margin-bottom: 10px;
1788
- background: #fbfaff;
1789
- border: 1px solid rgba(111,75,246,0.16);
1790
- color: var(--text);
1791
- border-radius: 8px;
1792
- outline: none;
1793
- font-size: 14px;
1794
- font-family: inherit;
1795
- transition: border-color .15s, box-shadow .15s;
1796
- }
1797
- .input:focus {
1798
- border-color: rgba(111,75,246,0.52);
1799
- box-shadow: 0 0 0 4px rgba(111,75,246,0.10);
1800
- }
1801
- .input::placeholder { color: var(--faint); }
1802
-
1803
- .submit {
1804
- width: 100%;
1805
- padding: 13px;
1806
- background: linear-gradient(135deg, #6f4bf6, #7b6dff);
1807
- color: #fff;
1808
- border: none;
1809
- border-radius: 8px;
1810
- cursor: pointer;
1811
- font-weight: 800;
1812
- font-size: 14px;
1813
- font-family: inherit;
1814
- box-shadow: 0 14px 30px rgba(111,75,246,0.24);
1815
- transition: all .18s;
1816
- margin-top: 4px;
1817
- }
1818
- .submit:hover {
1819
- background: linear-gradient(135deg, #5f3ee6, #705fff);
1820
- box-shadow: 0 18px 38px rgba(111,75,246,0.30);
1821
- transform: translateY(-1px);
1822
- }
1823
- .submit:disabled { opacity: 0.6; cursor: not-allowed; transform: none; }
1824
-
1825
- .switch {
1826
- margin-top: 18px;
1827
- text-align: center;
1828
- font-size: 12.5px;
1829
- color: var(--faint);
1830
- }
1831
- .switch a { color: #6f4bf6; text-decoration: none; font-weight: 700; }
1832
- .switch a:hover { text-decoration: underline; }
1833
-
1834
- .sso-divider {
1835
- display: flex; align-items: center; gap: 10px;
1836
- margin: 14px 0 10px;
1837
- color: var(--faint); font-size: 11.5px;
1838
- }
1839
- .sso-divider::before, .sso-divider::after {
1840
- content: ''; flex: 1;
1841
- height: 1px; background: rgba(111,75,246,0.12);
1842
- }
1843
- .sso-btn {
1844
- width: 100%;
1845
- padding: 12px;
1846
- background: #fff;
1847
- border: 1px solid rgba(111,75,246,0.15);
1848
- color: var(--text);
1849
- border-radius: 8px;
1850
- cursor: pointer;
1851
- font-weight: 600;
1852
- font-size: 13.5px;
1853
- font-family: inherit;
1854
- display: flex; align-items: center; justify-content: center; gap: 8px;
1855
- transition: all .18s;
1856
- }
1857
- .sso-btn:hover {
1858
- background: #f6f2ff;
1859
- border-color: rgba(111,75,246,0.34);
1860
- }
1861
-
1862
- .msg {
1863
- font-size: 12px;
1864
- min-height: 18px;
1865
- margin-bottom: 6px;
1866
- text-align: center;
1867
- color: #d44f5c;
1868
- }
1869
- .msg.ok { color: #0d8f72; }
1870
-
1871
- /* Lang picker */
1872
- .lang-wrap {
1873
- position: absolute;
1874
- top: 12px;
1875
- right: 12px;
1876
- z-index: 10;
1877
- }
1878
- .lang-btn {
1879
- background: rgba(255,255,255,0.86);
1880
- border: 1px solid rgba(111,75,246,0.18);
1881
- color: var(--text);
1882
- border-radius: 8px;
1883
- padding: 7px 12px;
1884
- font-size: 13px;
1885
- font-family: inherit;
1886
- cursor: pointer;
1887
- transition: background .15s;
1888
- box-shadow: 0 10px 28px rgba(86,70,160,0.12);
1889
- }
1890
- .lang-btn:hover { background: rgba(111,75,246,0.08); }
1891
- .lang-menu {
1892
- display: none;
1893
- position: absolute;
1894
- top: calc(100% + 6px);
1895
- right: 0;
1896
- background: #fff;
1897
- border: 1px solid rgba(111,75,246,0.15);
1898
- border-radius: 8px;
1899
- padding: 4px;
1900
- min-width: 130px;
1901
- box-shadow: 0 18px 44px rgba(86,70,160,0.16);
1902
- }
1903
- .lang-menu.open { display: block; }
1904
- .lang-opt {
1905
- padding: 7px 10px;
1906
- border-radius: 7px;
1907
- cursor: pointer;
1908
- font-size: 13px;
1909
- color: var(--muted);
1910
- }
1911
- .lang-opt:hover { background: rgba(111,75,246,0.07); color: var(--text); }
1912
- .lang-opt.active { color: var(--accent); font-weight: 700; }
1913
-
1914
- @media (max-width: 760px) {
1915
- .login-shell { display: block; }
1916
- .brand-preview { display: none; }
1917
- }
1918
-
1919
- /* ============================================================
1920
- ADMIN PAGE (admin.html)
1921
- ============================================================ */
1922
-
1923
- body.lattice-ref-admin {
1924
- --radius: 8px;
1925
- --radius-sm: 8px;
1926
- }
1927
-
1928
- * { box-sizing: border-box; }
1929
- html, body.lattice-ref-admin { height: 100%; }
1930
- body.lattice-ref-admin {
1931
- margin: 0;
1932
- font-family: Inter, -apple-system, BlinkMacSystemFont, sans-serif;
1933
- color: var(--text);
1934
- background:
1935
- radial-gradient(circle at 82% 12%, var(--border), transparent 30%),
1936
- radial-gradient(circle at 10% 80%, rgba(180,160,255,0.16), transparent 35%),
1937
- linear-gradient(180deg, var(--bg) 0%, var(--surface-2) 52%, #f2ecff 100%);
1938
- }
1939
-
1940
- body::before {
1941
- content: "";
1942
- position: fixed;
1943
- inset: 0;
1944
- pointer-events: none;
1945
- background:
1946
- radial-gradient(circle, rgba(111,66,232,0.18) 1px, transparent 1.9px);
1947
- background-size: 32px 32px;
1948
- background-position: 10px 10px;
1949
- mask-image: linear-gradient(180deg, rgba(0,0,0,0.3), rgba(0,0,0,0.06));
1950
- }
1951
-
1952
- .page {
1953
- position: relative;
1954
- z-index: 1;
1955
- min-height: 100%;
1956
- display: flex;
1957
- flex-direction: column;
1958
- }
1959
-
1960
- .topbar {
1961
- display: flex;
1962
- align-items: center;
1963
- justify-content: space-between;
1964
- gap: 16px;
1965
- padding: 22px 28px;
1966
- border-bottom: 1px solid rgba(111,66,232,0.10);
1967
- background: rgba(244,237,255,0.92);
1968
- backdrop-filter: blur(20px);
1969
- position: sticky;
1970
- top: 0;
1971
- z-index: 2;
1972
- }
1973
-
1974
- .brand {
1975
- display: flex;
1976
- align-items: center;
1977
- gap: 12px;
1978
- min-width: 0;
1979
- }
1980
-
1981
- .brand-mark {
1982
- width: 42px;
1983
- height: 42px;
1984
- border-radius: 12px;
1985
- background: radial-gradient(circle at 35% 30%, #ffffff 0 16%, #a77cff 17% 62%, #5b6cff 100%);
1986
- color: #171926;
1987
- display: grid;
1988
- place-items: center;
1989
- font-size: 20px;
1990
- font-weight: 800;
1991
- box-shadow: 0 12px 30px rgba(0,0,0,0.25);
1992
- flex: 0 0 auto;
1993
- }
1994
-
1995
- .brand h1 {
1996
- margin: 0;
1997
- font-size: 18px;
1998
- line-height: 1.15;
1999
- letter-spacing: 0;
2000
- }
2001
-
2002
- .brand p {
2003
- margin: 4px 0 0;
2004
- color: var(--muted);
2005
- font-size: 12px;
2006
- }
2007
-
2008
- .top-actions {
2009
- display: flex;
2010
- gap: 8px;
2011
- flex-wrap: wrap;
2012
- justify-content: flex-end;
2013
- }
2014
-
2015
- .btn {
2016
- border: 1px solid var(--border);
2017
- background: rgba(244,238,255,0.88);
2018
- color: var(--text);
2019
- border-radius: 8px;
2020
- padding: 10px 14px;
2021
- font: inherit;
2022
- font-size: 13px;
2023
- font-weight: 700;
2024
- cursor: pointer;
2025
- display: inline-flex;
2026
- align-items: center;
2027
- gap: 8px;
2028
- transition: all .15s ease;
2029
- text-decoration: none;
2030
- }
2031
-
2032
- .btn:hover {
2033
- border-color: rgba(111,66,232,0.32);
2034
- background: rgba(111,66,232,0.10);
2035
- color: var(--accent);
2036
- }
2037
-
2038
- .btn.primary {
2039
- background: var(--accent-soft);
2040
- border-color: rgba(111,66,232,0.28);
2041
- }
2042
-
2043
- .btn.danger:hover {
2044
- background: rgba(229,57,53,0.08);
2045
- border-color: rgba(229,57,53,0.22);
2046
- color: var(--danger);
2047
- }
2048
-
2049
- .content {
2050
- width: min(1440px, calc(100vw - 32px));
2051
- margin: 0 auto;
2052
- padding: 22px 0 28px;
2053
- display: flex;
2054
- flex-direction: column;
2055
- gap: 18px;
2056
- }
2057
-
2058
- .hero {
2059
- border: 1px solid var(--border);
2060
- border-radius: calc(var(--radius) + 2px);
2061
- background:
2062
- linear-gradient(135deg, rgba(111,66,232,0.10), rgba(248,243,255,0.92));
2063
- box-shadow: var(--shadow);
2064
- padding: 20px 22px;
2065
- display: flex;
2066
- align-items: center;
2067
- justify-content: space-between;
2068
- gap: 14px;
2069
- flex-wrap: wrap;
2070
- }
2071
-
2072
- .hero h2 {
2073
- margin: 0 0 6px;
2074
- font-size: 26px;
2075
- line-height: 1.15;
2076
- }
2077
-
2078
- .hero p {
2079
- margin: 0;
2080
- color: var(--muted);
2081
- font-size: 13px;
2082
- line-height: 1.5;
2083
- max-width: 760px;
2084
- }
2085
-
2086
- .session-card {
2087
- border: 1px solid rgba(111,66,232,0.18);
2088
- background: rgba(111,66,232,0.08);
2089
- color: var(--text);
2090
- border-radius: 12px;
2091
- padding: 12px 14px;
2092
- min-width: 280px;
2093
- }
2094
-
2095
- .session-card .label {
2096
- font-size: 11px;
2097
- text-transform: uppercase;
2098
- letter-spacing: 0.08em;
2099
- color: var(--faint);
2100
- margin-bottom: 6px;
2101
- }
2102
-
2103
- .session-card .value {
2104
- font-size: 13px;
2105
- font-weight: 700;
2106
- word-break: break-all;
2107
- }
2108
-
2109
- .notice {
2110
- border: 1px solid rgba(111,66,232,0.18);
2111
- background: rgba(111,66,232,0.07);
2112
- color: var(--muted);
2113
- border-radius: 12px;
2114
- padding: 12px 14px;
2115
- font-size: 13px;
2116
- line-height: 1.5;
2117
- }
2118
-
2119
- .summary-grid {
2120
- display: grid;
2121
- grid-template-columns: repeat(4, minmax(0, 1fr));
2122
- gap: 12px;
2123
- }
2124
-
2125
- .summary-card {
2126
- border: 1px solid var(--border);
2127
- border-radius: var(--radius);
2128
- background: rgba(248,243,255,0.90);
2129
- box-shadow: 0 8px 28px rgba(88,72,150,0.10);
2130
- padding: 16px 16px 15px;
2131
- min-width: 0;
2132
- }
2133
-
2134
- .summary-card .label {
2135
- color: var(--faint);
2136
- font-size: 11px;
2137
- font-weight: 700;
2138
- letter-spacing: 0.08em;
2139
- text-transform: uppercase;
2140
- margin-bottom: 8px;
2141
- }
2142
-
2143
- .summary-card .value {
2144
- font-size: 28px;
2145
- font-weight: 800;
2146
- line-height: 1;
2147
- }
2148
-
2149
- .summary-card .meta {
2150
- margin-top: 8px;
2151
- color: var(--muted);
2152
- font-size: 12px;
2153
- line-height: 1.45;
2154
- min-height: 2.7em;
2155
- }
2156
-
2157
- .panel-grid {
2158
- display: grid;
2159
- grid-template-columns: 1.1fr 0.9fr;
2160
- gap: 18px;
2161
- }
2162
-
2163
- .panel {
2164
- border: 1px solid var(--border);
2165
- border-radius: var(--radius);
2166
- background: rgba(248,243,255,0.90);
2167
- box-shadow: 0 8px 28px rgba(88,72,150,0.10);
2168
- overflow: hidden;
2169
- min-width: 0;
2170
- }
2171
-
2172
- .panel-header {
2173
- padding: 16px 18px;
2174
- border-bottom: 1px solid var(--border);
2175
- display: flex;
2176
- align-items: center;
2177
- justify-content: space-between;
2178
- gap: 12px;
2179
- }
2180
-
2181
- .panel-header h3 {
2182
- margin: 0;
2183
- font-size: 15px;
2184
- }
2185
-
2186
- .panel-header p {
2187
- margin: 4px 0 0;
2188
- color: var(--muted);
2189
- font-size: 12px;
2190
- line-height: 1.45;
2191
- }
2192
-
2193
- .lattice-ref-admin .panel-body {
2194
- padding: 16px 18px 18px;
2195
- }
2196
-
2197
- .lattice-ref-admin .chart-body {
2198
- padding: 16px 20px;
2199
- }
2200
-
2201
- .form-grid {
2202
- display: grid;
2203
- grid-template-columns: repeat(2, minmax(0, 1fr));
2204
- gap: 10px;
2205
- }
2206
-
2207
- .field {
2208
- display: flex;
2209
- flex-direction: column;
2210
- gap: 6px;
2211
- }
2212
-
2213
- .field.full { grid-column: 1 / -1; }
2214
-
2215
- label {
2216
- color: var(--muted);
2217
- font-size: 12px;
2218
- font-weight: 700;
2219
- }
2220
-
2221
- input, textarea {
2222
- width: 100%;
2223
- border: 1px solid var(--border);
2224
- background: rgba(255,255,255,0.80);
2225
- color: var(--text);
2226
- border-radius: 8px;
2227
- padding: 10px 12px;
2228
- font: inherit;
2229
- font-size: 13px;
2230
- outline: none;
2231
- }
2232
-
2233
- textarea {
2234
- min-height: 80px;
2235
- resize: vertical;
2236
- }
2237
-
2238
- input:focus, textarea:focus {
2239
- border-color: rgba(111,66,232,0.44);
2240
- box-shadow: 0 0 0 3px rgba(111,66,232,0.08);
2241
- }
2242
-
2243
- .toolbar {
2244
- display: flex;
2245
- align-items: center;
2246
- justify-content: space-between;
2247
- gap: 12px;
2248
- margin-top: 12px;
2249
- flex-wrap: wrap;
2250
- }
2251
-
2252
- .status-copy {
2253
- color: var(--muted);
2254
- font-size: 12px;
2255
- }
2256
-
2257
- .tag-row {
2258
- display: flex;
2259
- flex-wrap: wrap;
2260
- gap: 8px;
2261
- }
2262
-
2263
- .panel-tools {
2264
- display: flex;
2265
- align-items: flex-end;
2266
- justify-content: flex-end;
2267
- gap: 10px;
2268
- flex-wrap: wrap;
2269
- min-width: 260px;
2270
- }
2271
-
2272
- .export-control {
2273
- display: flex;
2274
- align-items: center;
2275
- justify-content: flex-end;
2276
- gap: 8px;
2277
- flex-wrap: wrap;
2278
- }
2279
-
2280
- .export-options {
2281
- display: none;
2282
- align-items: center;
2283
- gap: 6px;
2284
- flex-wrap: wrap;
2285
- }
2286
-
2287
- .export-options.open {
2288
- display: flex;
2289
- }
2290
-
2291
- .export-options .table-btn {
2292
- background: rgba(255,255,255,0.84);
2293
- white-space: nowrap;
2294
- }
2295
-
2296
- .tag {
2297
- display: inline-flex;
2298
- align-items: center;
2299
- gap: 6px;
2300
- padding: 5px 9px;
2301
- border-radius: 999px;
2302
- border: 1px solid var(--border);
2303
- background: rgba(255,255,255,0.60);
2304
- color: var(--muted);
2305
- font-size: 12px;
2306
- font-weight: 600;
2307
- }
2308
-
2309
- .tag.high { border-color: rgba(229,57,53,0.32); color: var(--danger); background: rgba(229,57,53,0.07); }
2310
- .tag.medium { border-color: rgba(216,165,74,0.34); color: #b07a00; background: rgba(216,165,74,0.08); }
2311
- .tag.low { border-color: rgba(34,196,160,0.34); color: #0d8f72; background: rgba(34,196,160,0.08); }
2312
-
2313
- .two-col {
2314
- display: grid;
2315
- grid-template-columns: repeat(2, minmax(0, 1fr));
2316
- gap: 12px;
2317
- }
2318
-
2319
- .audit-grid {
2320
- display: grid;
2321
- grid-template-columns: repeat(5, minmax(0, 1fr));
2322
- gap: 10px;
2323
- margin-bottom: 14px;
2324
- }
2325
-
2326
- .audit-metric {
2327
- border: 1px solid var(--border);
2328
- border-radius: 12px;
2329
- background: rgba(248,243,255,0.85);
2330
- padding: 12px;
2331
- min-width: 0;
2332
- }
2333
-
2334
- .audit-metric .label {
2335
- color: var(--faint);
2336
- font-size: 11px;
2337
- font-weight: 800;
2338
- letter-spacing: 0.06em;
2339
- text-transform: uppercase;
2340
- margin-bottom: 8px;
2341
- }
2342
-
2343
- .audit-metric .value {
2344
- font-size: 24px;
2345
- font-weight: 800;
2346
- line-height: 1;
2347
- }
2348
-
2349
- .audit-metric .meta {
2350
- color: var(--muted);
2351
- font-size: 12px;
2352
- margin-top: 7px;
2353
- line-height: 1.4;
2354
- }
2355
-
2356
- .subpanel {
2357
- border: 1px solid var(--border);
2358
- border-radius: 12px;
2359
- background: rgba(248,243,255,0.82);
2360
- padding: 14px;
2361
- min-width: 0;
2362
- }
2363
-
2364
- .subpanel h4 {
2365
- margin: 0 0 10px;
2366
- font-size: 13px;
2367
- display: flex;
2368
- align-items: center;
2369
- gap: 7px;
2370
- }
2371
-
2372
- .list {
2373
- display: flex;
2374
- flex-direction: column;
2375
- gap: 8px;
2376
- max-height: 320px;
2377
- overflow: auto;
2378
- }
2379
-
2380
- .item {
2381
- border: 1px solid var(--border);
2382
- border-radius: 10px;
2383
- background: rgba(255,255,255,0.72);
2384
- padding: 10px 11px;
2385
- }
2386
-
2387
- .item-meta {
2388
- display: flex;
2389
- flex-wrap: wrap;
2390
- gap: 6px;
2391
- margin-bottom: 6px;
2392
- }
2393
-
2394
- .preview {
2395
- color: var(--muted);
2396
- font-size: 12px;
2397
- line-height: 1.5;
2398
- word-break: break-word;
2399
- }
2400
-
2401
- .table-wrap {
2402
- overflow: auto;
2403
- border: 1px solid var(--border);
2404
- border-radius: 12px;
2405
- }
2406
-
2407
- table {
2408
- width: 100%;
2409
- border-collapse: collapse;
2410
- min-width: 820px;
2411
- background: transparent;
2412
- }
2413
-
2414
- th, td {
2415
- padding: 11px 10px;
2416
- border-bottom: 1px solid var(--border);
2417
- text-align: left;
2418
- vertical-align: middle;
2419
- font-size: 13px;
2420
- color: var(--text);
2421
- }
2422
-
2423
- th {
2424
- color: var(--muted);
2425
- background: rgba(111,66,232,0.05);
2426
- font-size: 12px;
2427
- letter-spacing: 0.02em;
2428
- }
2429
-
2430
- td .actions {
2431
- display: flex;
2432
- gap: 6px;
2433
- flex-wrap: wrap;
2434
- }
2435
-
2436
- .table-btn {
2437
- border: 1px solid rgba(111,66,232,0.15);
2438
- background: rgba(255,255,255,0.72);
2439
- color: var(--text);
2440
- border-radius: 8px;
2441
- padding: 7px 9px;
2442
- cursor: pointer;
2443
- font-size: 12px;
2444
- font-weight: 600;
2445
- }
2446
-
2447
- .table-btn:hover {
2448
- border-color: rgba(111,66,232,0.32);
2449
- background: rgba(111,66,232,0.08);
2450
- color: var(--accent);
2451
- }
2452
-
2453
- .table-btn.danger:hover {
2454
- border-color: rgba(229,57,53,0.24);
2455
- background: rgba(229,57,53,0.08);
2456
- color: var(--danger);
2457
- }
2458
-
2459
- .role {
2460
- display: inline-flex;
2461
- align-items: center;
2462
- padding: 4px 8px;
2463
- border-radius: 999px;
2464
- border: 1px solid var(--border);
2465
- color: var(--muted);
2466
- font-size: 12px;
2467
- font-weight: 700;
2468
- }
2469
-
2470
- .footer-space { height: 8px; }
2471
-
2472
- .muted {
2473
- color: var(--muted);
2474
- }
2475
-
2476
- .error {
2477
- color: var(--danger);
2478
- }
2479
-
2480
- @media (max-width: 1100px) {
2481
- .summary-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
2482
- .audit-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
2483
- .panel-grid { grid-template-columns: 1fr; }
2484
- }
2485
-
2486
- @media (max-width: 760px) {
2487
- .topbar, .content { width: auto; }
2488
- .topbar {
2489
- padding: 16px;
2490
- align-items: flex-start;
2491
- flex-direction: column;
2492
- }
2493
- .content { padding: 16px; gap: 14px; }
2494
- .hero h2 { font-size: 22px; }
2495
- .summary-grid { grid-template-columns: 1fr; }
2496
- .audit-grid { grid-template-columns: 1fr; }
2497
- .two-col, .form-grid { grid-template-columns: 1fr; }
2498
- .field.full { grid-column: auto; }
2499
- .panel-header { align-items: stretch; flex-direction: column; }
2500
- .panel-tools,
2501
- .export-control { align-items: stretch; justify-content: flex-start; min-width: 0; }
2502
- .lattice-ref-admin .inline-control,
2503
- .lattice-ref-admin .button-row { align-items: stretch; flex-direction: column; }
2504
- }
2505
-
2506
- .lang-picker { position: relative; }
2507
- .lang-picker-menu {
2508
- display: none;
2509
- position: absolute;
2510
- top: calc(100% + 6px);
2511
- right: 0;
2512
- background: rgba(247,242,255,0.98);
2513
- border: 1px solid var(--border);
2514
- border-radius: 8px;
2515
- padding: 4px;
2516
- min-width: 130px;
2517
- z-index: 100;
2518
- box-shadow: 0 8px 24px rgba(88,72,150,0.16);
2519
- }
2520
- .lang-picker-menu.open { display: block; }
2521
- .lang-option {
2522
- padding: 7px 10px;
2523
- border-radius: 7px;
2524
- cursor: pointer;
2525
- font-size: 13px;
2526
- color: var(--text);
2527
- }
2528
- .lang-option:hover { background: rgba(111,66,232,0.07); color: var(--text); }
2529
- .lang-option.active { color: var(--accent); font-weight: 600; }
2530
-
2531
- /* ============================================================
2532
- GRAPH PAGE (graph.html)
2533
- ============================================================ */
2534
- * { box-sizing: border-box; }
2535
- html, body.lattice-ref-graph { height: 100%; }
2536
- body.lattice-ref-graph {
2537
- margin: 0;
2538
- overflow: hidden;
2539
- color: var(--text);
2540
- background: var(--app-bg);
2541
- font-family: "SF Pro Display", "Inter", ui-sans-serif, system-ui, -apple-system, sans-serif;
2542
- }
2543
-
2544
- body.lattice-ref-graph .app {
2545
- min-height: 0;
2546
- height: 100dvh;
2547
- overflow: hidden;
2548
- }
2549
-
2550
- body.lattice-ref-graph .stage {
2551
- height: calc(100dvh - 138px);
2552
- max-height: calc(100dvh - 138px);
2553
- min-height: 0;
2554
- }
2555
-
2556
- body.lattice-ref-graph .app > aside:not(.reference-rail) {
2557
- height: calc(100dvh - 138px);
2558
- max-height: calc(100dvh - 138px);
2559
- min-height: 0;
2560
- overflow-y: auto;
2561
- overscroll-behavior: contain;
2562
- padding-bottom: max(28px, env(safe-area-inset-bottom));
2563
- scrollbar-gutter: stable;
2564
- }
2565
-
2566
- .app {
2567
- display: grid;
2568
- grid-template-columns: minmax(0, 1fr) 360px;
2569
- height: 100vh;
2570
- }
2571
-
2572
- .stage {
2573
- position: relative;
2574
- min-width: 0;
2575
- border-right: 1px solid var(--line);
2576
- background:
2577
- radial-gradient(circle, rgba(111,66,232,0.18) 1px, transparent 1.9px),
2578
- linear-gradient(116deg, transparent 0 43%, rgba(111,66,232,0.05) 43.1%, transparent 43.28% 100%),
2579
- linear-gradient(28deg, transparent 0 61%, rgba(180,160,255,0.07) 61.1%, transparent 61.28% 100%);
2580
- background-size: 32px 32px, 100% 100%, 100% 100%;
2581
- background-position: 10px 10px, 0 0, 0 0;
2582
- }
2583
-
2584
- canvas {
2585
- display: block;
2586
- width: 100%;
2587
- height: 100%;
2588
- cursor: grab;
2589
- }
2590
-
2591
- canvas.panning { cursor: grabbing; }
2592
-
2593
- .search-shell,
2594
- .toolbar {
2595
- position: absolute;
2596
- z-index: 20;
2597
- border: 1px solid var(--line);
2598
- background: var(--panel);
2599
- backdrop-filter: blur(18px);
2600
- box-shadow: var(--shadow);
2601
- }
2602
-
2603
- .search-shell {
2604
- top: 16px;
2605
- left: 16px;
2606
- width: min(360px, calc(100% - 32px));
2607
- border-radius: 10px;
2608
- overflow: hidden;
2609
- }
2610
-
2611
- .search-head {
2612
- display: flex;
2613
- align-items: center;
2614
- justify-content: space-between;
2615
- gap: 12px;
2616
- padding: 14px 16px 10px;
2617
- border-bottom: 1px solid rgba(111,66,232,0.10);
2618
- }
2619
-
2620
- .search-title {
2621
- display: flex;
2622
- flex-direction: column;
2623
- gap: 3px;
2624
- }
2625
-
2626
- .search-title strong {
2627
- font-size: 14px;
2628
- font-weight: 700;
2629
- letter-spacing: 0.01em;
2630
- }
2631
-
2632
- .search-title span {
2633
- font-size: 12px;
2634
- color: var(--muted);
2635
- }
2636
-
2637
- .search-count {
2638
- flex-shrink: 0;
2639
- font-size: 11px;
2640
- color: #fff;
2641
- background: linear-gradient(135deg, var(--accent), #9a78f0);
2642
- border-radius: 999px;
2643
- padding: 5px 10px;
2644
- font-weight: 700;
2645
- }
2646
-
2647
- .search-input-wrap {
2648
- padding: 12px 16px 10px;
2649
- }
2650
-
2651
- .search-input-row {
2652
- display: flex;
2653
- gap: 8px;
2654
- align-items: center;
2655
- }
2656
-
2657
- .search-input {
2658
- flex: 1;
2659
- height: 42px;
2660
- border-radius: 12px;
2661
- border: 1px solid var(--line-strong);
2662
- background: rgba(255,255,255,0.80);
2663
- color: var(--text);
2664
- padding: 0 14px;
2665
- font-size: 14px;
2666
- outline: none;
2667
- }
2668
-
2669
- .search-input:focus {
2670
- border-color: rgba(111,66,232,0.55);
2671
- box-shadow: 0 0 0 4px rgba(111,66,232,0.09);
2672
- }
2673
-
2674
- .icon-btn,
2675
- .tb-btn {
2676
- height: 42px;
2677
- border-radius: 8px;
2678
- border: 1px solid var(--line-strong);
2679
- background: rgba(255,255,255,0.80);
2680
- color: var(--text);
2681
- cursor: pointer;
2682
- font-size: 13px;
2683
- transition: 140ms ease;
2684
- }
2685
-
2686
- .icon-btn {
2687
- width: 42px;
2688
- flex-shrink: 0;
2689
- font-size: 16px;
2690
- }
2691
-
2692
- .icon-btn:hover,
2693
- .tb-btn:hover {
2694
- transform: translateY(-1px);
2695
- border-color: rgba(111,66,232,0.45);
2696
- color: var(--accent);
2697
- background: rgba(111,66,232,0.07);
2698
- }
2699
-
2700
- .search-results {
2701
- max-height: min(420px, calc(100vh - 180px));
2702
- overflow-y: auto;
2703
- padding: 0 8px 10px;
2704
- }
2705
-
2706
- .search-empty,
2707
- .search-loading {
2708
- margin: 0;
2709
- padding: 14px 12px 16px;
2710
- color: var(--muted);
2711
- font-size: 13px;
2712
- line-height: 1.65;
2713
- }
2714
-
2715
- .search-list {
2716
- display: flex;
2717
- flex-direction: column;
2718
- gap: 8px;
2719
- padding: 0 8px 8px;
2720
- }
2721
-
2722
- .search-item {
2723
- width: 100%;
2724
- text-align: left;
2725
- border: 1px solid rgba(111,66,232,0.10);
2726
- border-radius: 8px;
2727
- background: rgba(255,255,255,0.72);
2728
- color: var(--text);
2729
- padding: 12px 12px 13px;
2730
- cursor: pointer;
2731
- transition: 140ms ease;
2732
- }
2733
-
2734
- .search-item:hover,
2735
- .search-item.active {
2736
- border-color: rgba(111,66,232,0.34);
2737
- background: rgba(111,66,232,0.07);
2738
- transform: translateY(-1px);
2739
- }
2740
-
2741
- .search-item-top {
2742
- display: flex;
2743
- align-items: center;
2744
- gap: 8px;
2745
- margin-bottom: 6px;
2746
- }
2747
-
2748
- .search-type {
2749
- display: inline-flex;
2750
- align-items: center;
2751
- border-radius: 999px;
2752
- padding: 4px 10px;
2753
- font-size: 11px;
2754
- font-weight: 700;
2755
- color: #091019;
2756
- }
2757
-
2758
- .search-item-title {
2759
- font-size: 13px;
2760
- font-weight: 700;
2761
- letter-spacing: 0.01em;
2762
- color: var(--text);
2763
- }
2764
-
2765
- .search-item-summary {
2766
- font-size: 12px;
2767
- color: var(--muted);
2768
- line-height: 1.55;
2769
- margin: 0 0 8px;
2770
- word-break: break-word;
2771
- display: -webkit-box;
2772
- -webkit-line-clamp: 3;
2773
- line-clamp: 3;
2774
- -webkit-box-orient: vertical;
2775
- overflow: hidden;
2776
- }
2777
-
2778
- .search-item-meta {
2779
- font-size: 11px;
2780
- color: var(--faint);
2781
- display: flex;
2782
- gap: 10px;
2783
- flex-wrap: wrap;
2784
- }
2785
-
2786
- .toolbar {
2787
- top: 16px;
2788
- right: 16px;
2789
- display: flex;
2790
- flex-wrap: wrap;
2791
- gap: 8px;
2792
- padding: 8px;
2793
- border-radius: 10px;
2794
- max-width: min(760px, calc(100% - 32px));
2795
- }
2796
-
2797
- .tb-btn {
2798
- padding: 0 14px;
2799
- min-width: 72px;
2800
- white-space: nowrap;
2801
- }
2802
-
2803
- #tooltip {
2804
- position: fixed;
2805
- z-index: 50;
2806
- max-width: 300px;
2807
- padding: 8px 11px;
2808
- border-radius: 10px;
2809
- border: 1px solid rgba(111,66,232,0.18);
2810
- background: rgba(255,255,255,0.96);
2811
- color: var(--text);
2812
- box-shadow: var(--shadow);
2813
- font-size: 12px;
2814
- line-height: 1.45;
2815
- pointer-events: none;
2816
- display: none;
2817
- word-break: break-word;
2818
- }
2819
-
2820
- aside {
2821
- display: flex;
2822
- flex-direction: column;
2823
- background: rgba(248, 244, 255, 0.96);
2824
- border-left: 1px solid var(--accent-soft);
2825
- overflow: hidden;
2826
- }
2827
-
2828
- .sidebar-head {
2829
- padding: 18px 18px 12px;
2830
- border-bottom: 1px solid rgba(111,66,232,0.10);
2831
- }
2832
-
2833
- .eyebrow {
2834
- color: var(--accent);
2835
- font-size: 11px;
2836
- font-weight: 700;
2837
- letter-spacing: 0.12em;
2838
- text-transform: uppercase;
2839
- margin-bottom: 8px;
2840
- }
2841
-
2842
- h1 {
2843
- margin: 0;
2844
- font-size: 22px;
2845
- line-height: 1.1;
2846
- letter-spacing: -0.02em;
2847
- }
2848
-
2849
- .sidebar-sub {
2850
- margin: 10px 0 0;
2851
- color: var(--muted);
2852
- font-size: 13px;
2853
- line-height: 1.65;
2854
- }
2855
-
2856
- .stats-row {
2857
- display: grid;
2858
- grid-template-columns: 1fr 1fr;
2859
- gap: 10px;
2860
- margin-top: 14px;
2861
- }
2862
-
2863
- .stat {
2864
- border: 1px solid rgba(111,66,232,0.16);
2865
- border-radius: 8px;
2866
- background: rgba(255,255,255,0.80);
2867
- padding: 12px 13px;
2868
- color: var(--text);
2869
- }
2870
-
2871
- .stat strong {
2872
- display: block;
2873
- font-size: 24px;
2874
- line-height: 1;
2875
- margin-bottom: 5px;
2876
- }
2877
-
2878
- .stat span {
2879
- display: block;
2880
- font-size: 11px;
2881
- color: var(--muted);
2882
- text-transform: uppercase;
2883
- letter-spacing: 0.08em;
2884
- }
2885
-
2886
- .section {
2887
- padding: 16px 18px 14px;
2888
- flex-shrink: 0;
2889
- }
2890
-
2891
- .section-label {
2892
- color: var(--accent);
2893
- font-size: 11px;
2894
- text-transform: uppercase;
2895
- letter-spacing: 0.08em;
2896
- font-weight: 700;
2897
- margin-bottom: 10px;
2898
- }
2899
-
2900
- .legend-grid,
2901
- .filter-grid {
2902
- display: flex;
2903
- flex-direction: column;
2904
- gap: 7px;
2905
- }
2906
-
2907
- .local-source-panel {
2908
- display: flex;
2909
- flex-direction: column;
2910
- gap: 10px;
2911
- }
2912
-
2913
- .local-source-notice {
2914
- border: 1px solid rgba(13,148,136,0.20);
2915
- border-radius: 8px;
2916
- background: rgba(13,148,136,0.07);
2917
- color: #21514b;
2918
- padding: 9px 10px;
2919
- font-size: 12px;
2920
- line-height: 1.5;
2921
- }
2922
-
2923
- .local-source-input {
2924
- display: flex;
2925
- gap: 8px;
2926
- align-items: center;
2927
- }
2928
-
2929
- .local-source-input input {
2930
- min-width: 0;
2931
- flex: 1;
2932
- height: 38px;
2933
- border-radius: 8px;
2934
- border: 1px solid rgba(111,66,232,0.16);
2935
- background: #fff;
2936
- color: var(--text);
2937
- padding: 0 10px;
2938
- font-size: 12px;
2939
- outline: none;
2940
- }
2941
-
2942
- .local-source-input input:focus {
2943
- border-color: rgba(111,66,232,0.42);
2944
- box-shadow: 0 0 0 3px rgba(111,66,232,0.08);
2945
- }
2946
-
2947
- .local-root-list,
2948
- .local-tree-list,
2949
- .local-source-list {
2950
- display: flex;
2951
- flex-direction: column;
2952
- gap: 6px;
2953
- max-height: min(150px, 22dvh);
2954
- overflow-y: auto;
2955
- padding-right: 2px;
2956
- }
2957
-
2958
- .local-root-btn,
2959
- .local-tree-row,
2960
- .local-source-row {
2961
- width: 100%;
2962
- border: 1px solid rgba(111,66,232,0.13);
2963
- border-radius: 8px;
2964
- background: rgba(255,255,255,0.80);
2965
- color: var(--text);
2966
- padding: 8px 9px;
2967
- display: grid;
2968
- grid-template-columns: 18px minmax(0, 1fr) auto;
2969
- gap: 8px;
2970
- align-items: center;
2971
- text-align: left;
2972
- font-size: 12px;
2973
- }
2974
-
2975
- .local-root-btn {
2976
- cursor: pointer;
2977
- }
2978
-
2979
- .local-root-btn:hover,
2980
- .local-root-btn.active {
2981
- border-color: rgba(111,66,232,0.34);
2982
- background: rgba(111,66,232,0.07);
2983
- }
2984
-
2985
- .local-source-main,
2986
- .local-tree-main {
2987
- min-width: 0;
2988
- }
2989
-
2990
- .local-source-main strong,
2991
- .local-tree-main strong {
2992
- display: block;
2993
- font-size: 12px;
2994
- line-height: 1.25;
2995
- overflow: hidden;
2996
- text-overflow: ellipsis;
2997
- white-space: nowrap;
2998
- }
2999
-
3000
- .local-source-main span,
3001
- .local-tree-main span {
3002
- display: block;
3003
- color: var(--faint);
3004
- font-size: 11px;
3005
- line-height: 1.35;
3006
- overflow: hidden;
3007
- text-overflow: ellipsis;
3008
- white-space: nowrap;
3009
- }
3010
-
3011
- .local-source-actions {
3012
- display: grid;
3013
- grid-template-columns: repeat(2, minmax(0, 1fr));
3014
- gap: 7px;
3015
- }
3016
-
3017
- .local-source-btn {
3018
- min-width: 0;
3019
- height: 36px;
3020
- border: 1px solid rgba(111,66,232,0.18);
3021
- border-radius: 8px;
3022
- background: #fff;
3023
- color: var(--text);
3024
- cursor: pointer;
3025
- display: inline-flex;
3026
- align-items: center;
3027
- justify-content: center;
3028
- gap: 6px;
3029
- font-size: 12px;
3030
- font-weight: 650;
3031
- }
3032
-
3033
- .local-source-btn:hover {
3034
- border-color: rgba(111,66,232,0.42);
3035
- color: var(--accent);
3036
- background: rgba(111,66,232,0.07);
3037
- }
3038
-
3039
- .local-source-btn.primary {
3040
- grid-column: 1 / -1;
3041
- background: linear-gradient(135deg, var(--accent), #7b61ff);
3042
- color: #fff;
3043
- border-color: rgba(111,66,232,0.3);
3044
- }
3045
-
3046
- .local-source-btn.primary:hover {
3047
- color: #fff;
3048
- background: linear-gradient(135deg, #5f35d8, #6b51ef);
3049
- box-shadow: 0 8px 20px rgba(111,66,232,0.22);
3050
- }
3051
-
3052
- .local-source-btn:disabled {
3053
- cursor: not-allowed;
3054
- opacity: 0.55;
3055
- transform: none;
3056
- }
3057
-
3058
- .local-option-row {
3059
- display: grid;
3060
- grid-template-columns: repeat(2, minmax(0, 1fr));
3061
- gap: 7px;
3062
- }
3063
-
3064
- .local-option-btn {
3065
- min-width: 0;
3066
- height: 36px;
3067
- border: 1px solid rgba(111,66,232,0.18);
3068
- border-radius: 8px;
3069
- background: #fff;
3070
- color: var(--muted);
3071
- cursor: pointer;
3072
- display: inline-flex;
3073
- align-items: center;
3074
- justify-content: center;
3075
- gap: 6px;
3076
- padding: 0 9px;
3077
- font-size: 12px;
3078
- font-weight: 650;
3079
- line-height: 1;
3080
- text-align: center;
3081
- white-space: nowrap;
3082
- }
3083
-
3084
- .local-option-btn span {
3085
- min-width: 0;
3086
- overflow: hidden;
3087
- text-overflow: ellipsis;
3088
- white-space: nowrap;
3089
- }
3090
-
3091
- .local-option-btn:hover {
3092
- border-color: rgba(111,66,232,0.42);
3093
- color: var(--accent);
3094
- background: rgba(111,66,232,0.07);
3095
- }
3096
-
3097
- .local-option-btn.active {
3098
- border-color: rgba(111,66,232,0.48);
3099
- background: rgba(111,66,232,0.11);
3100
- color: var(--accent);
3101
- box-shadow: inset 0 0 0 1px var(--accent-soft);
3102
- }
3103
-
3104
- .local-audit-grid {
3105
- display: grid;
3106
- grid-template-columns: repeat(3, minmax(0, 1fr));
3107
- gap: 6px;
3108
- }
3109
-
3110
- .local-audit-stat {
3111
- border: 1px solid rgba(111,66,232,0.13);
3112
- border-radius: 8px;
3113
- background: rgba(255,255,255,0.78);
3114
- padding: 8px 7px;
3115
- min-width: 0;
3116
- }
3117
-
3118
- .local-audit-stat strong {
3119
- display: block;
3120
- font-size: 15px;
3121
- line-height: 1.05;
3122
- }
3123
-
3124
- .local-audit-stat span {
3125
- display: block;
3126
- margin-top: 4px;
3127
- color: var(--faint);
3128
- font-size: 10px;
3129
- line-height: 1.2;
3130
- }
3131
-
3132
- .local-status-line {
3133
- color: var(--muted);
3134
- font-size: 12px;
3135
- line-height: 1.45;
3136
- word-break: break-word;
3137
- }
3138
-
3139
- .local-status-line.error {
3140
- color: #a53131;
3141
- }
3142
-
3143
- .local-permission {
3144
- border: 1px solid rgba(245,158,11,0.28);
3145
- background: rgba(245,158,11,0.09);
3146
- border-radius: 8px;
3147
- padding: 9px;
3148
- display: flex;
3149
- flex-direction: column;
3150
- gap: 8px;
3151
- }
3152
-
3153
- .legend-item,
3154
- .filter-item {
3155
- display: flex;
3156
- align-items: center;
3157
- gap: 9px;
3158
- min-height: 26px;
3159
- font-size: 12px;
3160
- min-width: 0;
3161
- }
3162
-
3163
- .filter-item {
3164
- cursor: pointer;
3165
- user-select: none;
3166
- }
3167
-
3168
- .filter-item input[type="checkbox"] {
3169
- width: 14px;
3170
- height: 14px;
3171
- margin: 0;
3172
- accent-color: var(--accent);
3173
- cursor: pointer;
3174
- }
3175
-
3176
- .dot {
3177
- width: 10px;
3178
- height: 10px;
3179
- border-radius: 50%;
3180
- flex-shrink: 0;
3181
- box-shadow: 0 0 0 3px rgba(111,66,232,0.08);
3182
- }
3183
-
3184
- .legend-line {
3185
- width: 18px;
3186
- height: 0;
3187
- border-top: 2px solid currentColor;
3188
- opacity: 0.8;
3189
- flex-shrink: 0;
3190
- }
3191
-
3192
- .filter-name,
3193
- .legend-name {
3194
- flex: 1;
3195
- min-width: 0;
3196
- color: var(--text);
3197
- font-size: 13px;
3198
- font-weight: 500;
3199
- overflow-wrap: anywhere;
3200
- }
3201
-
3202
- .filter-count,
3203
- .legend-meta {
3204
- color: var(--muted);
3205
- font-size: 12px;
3206
- font-weight: 600;
3207
- text-align: right;
3208
- white-space: nowrap;
3209
- }
3210
-
3211
- .detail-wrap {
3212
- flex: 0 0 auto;
3213
- min-height: auto;
3214
- overflow: visible;
3215
- padding: 18px 18px max(24px, env(safe-area-inset-bottom));
3216
- }
3217
-
3218
- .type-badge {
3219
- display: inline-flex;
3220
- align-items: center;
3221
- border-radius: 999px;
3222
- padding: 5px 11px;
3223
- font-size: 11px;
3224
- font-weight: 700;
3225
- color: #091019;
3226
- margin-bottom: 10px;
3227
- }
3228
-
3229
- .detail-title {
3230
- font-size: 19px;
3231
- line-height: 1.28;
3232
- font-weight: 750;
3233
- margin-bottom: 8px;
3234
- letter-spacing: -0.01em;
3235
- overflow-wrap: anywhere;
3236
- }
3237
-
3238
- .detail-summary {
3239
- color: var(--muted);
3240
- font-size: 13px;
3241
- line-height: 1.7;
3242
- white-space: pre-wrap;
3243
- word-break: break-word;
3244
- margin-bottom: 14px;
3245
- }
3246
-
3247
- .metric-grid {
3248
- display: grid;
3249
- grid-template-columns: repeat(2, minmax(0, 1fr));
3250
- gap: 10px;
3251
- margin-bottom: 14px;
3252
- }
3253
-
3254
- .metric-card {
3255
- border: 1px solid var(--border);
3256
- border-radius: 8px;
3257
- padding: 11px 12px;
3258
- background: rgba(255,255,255,0.82);
3259
- color: var(--text);
3260
- }
3261
-
3262
- .metric-card strong {
3263
- display: block;
3264
- font-size: 18px;
3265
- line-height: 1;
3266
- margin-bottom: 5px;
3267
- }
3268
-
3269
- .metric-card span {
3270
- display: block;
3271
- font-size: 11px;
3272
- color: var(--muted);
3273
- text-transform: uppercase;
3274
- letter-spacing: 0.08em;
3275
- }
3276
-
3277
- .meta-block {
3278
- border: 1px solid var(--accent-soft);
3279
- border-radius: 8px;
3280
- background: rgba(255,255,255,0.74);
3281
- padding: 12px;
3282
- color: var(--muted);
3283
- font-size: 12px;
3284
- line-height: 1.65;
3285
- white-space: pre-wrap;
3286
- word-break: break-word;
3287
- overflow-wrap: anywhere;
3288
- max-height: min(42dvh, 460px);
3289
- overflow: auto;
3290
- }
3291
-
3292
- .jump-btn {
3293
- display: inline-flex;
3294
- align-items: center;
3295
- gap: 6px;
3296
- margin: 0 0 14px;
3297
- padding: 8px 14px;
3298
- border-radius: 999px;
3299
- text-decoration: none;
3300
- font-size: 12px;
3301
- font-weight: 700;
3302
- color: #fff;
3303
- background: linear-gradient(135deg, var(--accent), var(--accent-2));
3304
- box-shadow: 0 8px 22px rgba(111,66,232,0.22);
3305
- }
3306
-
3307
- .jump-btn:hover { filter: brightness(1.04); }
3308
-
3309
- .jump-btn.secondary {
3310
- border: 1px solid rgba(111,66,232,0.20);
3311
- color: var(--text);
3312
- background: rgba(255,255,255,0.82);
3313
- box-shadow: none;
3314
- cursor: pointer;
3315
- font: inherit;
3316
- font-size: 12px;
3317
- font-weight: 700;
3318
- }
3319
-
3320
- .detail-actions {
3321
- display: flex;
3322
- flex-wrap: wrap;
3323
- gap: 8px;
3324
- margin-bottom: 14px;
3325
- }
3326
-
3327
- .related-node-list {
3328
- display: grid;
3329
- gap: 7px;
3330
- margin-bottom: 14px;
3331
- }
3332
-
3333
- .related-node-btn {
3334
- width: 100%;
3335
- min-width: 0;
3336
- display: grid;
3337
- grid-template-columns: 18px minmax(0, 1fr) auto;
3338
- align-items: center;
3339
- gap: 8px;
3340
- border: 1px solid rgba(111,66,232,0.13);
3341
- border-radius: 8px;
3342
- background: rgba(255,255,255,0.76);
3343
- color: var(--text);
3344
- padding: 8px 10px;
3345
- text-align: left;
3346
- cursor: pointer;
3347
- }
3348
-
3349
- .related-node-btn:hover {
3350
- border-color: rgba(111,66,232,0.34);
3351
- background: rgba(111,66,232,0.07);
3352
- }
3353
-
3354
- .related-node-btn strong {
3355
- min-width: 0;
3356
- overflow: hidden;
3357
- text-overflow: ellipsis;
3358
- white-space: nowrap;
3359
- font-size: 12px;
3360
- }
3361
-
3362
- .related-node-btn em {
3363
- color: var(--faint);
3364
- font-size: 11px;
3365
- font-style: normal;
3366
- white-space: nowrap;
3367
- }
3368
-
3369
- .focus-chip {
3370
- position: absolute;
3371
- z-index: 21;
3372
- left: 16px;
3373
- bottom: 16px;
3374
- max-width: min(560px, calc(100% - 32px));
3375
- display: flex;
3376
- flex-wrap: wrap;
3377
- gap: 8px;
3378
- padding: 8px;
3379
- border: 1px solid var(--line);
3380
- border-radius: 10px;
3381
- background: rgba(255,255,255,0.90);
3382
- box-shadow: var(--shadow);
3383
- backdrop-filter: blur(18px);
3384
- }
3385
-
3386
- .focus-chip span {
3387
- display: inline-flex;
3388
- align-items: center;
3389
- gap: 6px;
3390
- border-radius: 999px;
3391
- background: rgba(111,66,232,0.08);
3392
- color: var(--text);
3393
- padding: 5px 10px;
3394
- font-size: 11px;
3395
- font-weight: 800;
3396
- max-width: 260px;
3397
- overflow: hidden;
3398
- text-overflow: ellipsis;
3399
- white-space: nowrap;
3400
- }
3401
-
3402
- .search-shell.search-open .search-results {
3403
- display: block;
3404
- }
3405
-
3406
- .empty-hint {
3407
- margin: 0;
3408
- color: var(--muted);
3409
- font-size: 13px;
3410
- line-height: 1.8;
3411
- }
3412
-
3413
- @media (max-width: 900px) {
3414
- body.lattice-ref-graph {
3415
- overflow-y: auto;
3416
- }
3417
-
3418
- body.lattice-ref-graph .reference-rail {
3419
- display: none;
3420
- }
3421
-
3422
- body.lattice-ref-graph {
3423
- grid-template-columns: 1fr;
3424
- }
3425
-
3426
- body.lattice-ref-graph .app {
3427
- height: auto;
3428
- min-height: 100dvh;
3429
- overflow: visible;
3430
- grid-template-columns: 1fr;
3431
- grid-template-rows: minmax(420px, 58dvh) auto;
3432
- }
3433
-
3434
- body.lattice-ref-graph .stage {
3435
- height: auto;
3436
- max-height: none;
3437
- min-height: 420px;
3438
- margin: 84px 12px 12px;
3439
- }
3440
-
3441
- body.lattice-ref-graph .stage::before {
3442
- top: 26px;
3443
- left: 58px;
3444
- font-size: 24px;
3445
- }
3446
-
3447
- body.lattice-ref-graph .stage::after {
3448
- top: 22px;
3449
- left: 14px;
3450
- }
3451
-
3452
- body.lattice-ref-graph .search-shell {
3453
- top: -60px;
3454
- left: 60px;
3455
- right: 12px;
3456
- width: auto;
3457
- }
3458
-
3459
- body.lattice-ref-graph .app > aside:not(.reference-rail) {
3460
- height: auto;
3461
- max-height: none;
3462
- min-height: 0;
3463
- margin: 0 12px 24px;
3464
- overflow: visible;
3465
- padding-bottom: max(18px, env(safe-area-inset-bottom));
3466
- }
3467
-
3468
- body.lattice-ref-graph .detail-wrap {
3469
- flex: none;
3470
- overflow: visible;
3471
- }
3472
-
3473
- .app {
3474
- grid-template-columns: 1fr;
3475
- grid-template-rows: 1fr 360px;
3476
- }
3477
-
3478
- .stage {
3479
- border-right: 0;
3480
- border-bottom: 1px solid var(--line);
3481
- }
3482
-
3483
- .search-shell {
3484
- width: calc(100% - 32px);
3485
- }
3486
-
3487
- .toolbar {
3488
- top: auto;
3489
- bottom: 16px;
3490
- right: 16px;
3491
- }
3492
- }
3493
-
1
+ /* Lattice AI — chat workspace (chat.html, body.lattice-ref-chat): shell, sidebar, header, input, cards, modals, drawers, panels, onboarding. Token-native. */
3494
2
  /* ============================================================
3495
3
  CHAT PAGE (chat.html)
3496
4
  ============================================================ */
@@ -3511,10 +19,7 @@
3511
19
  inset: 0;
3512
20
  pointer-events: none;
3513
21
  z-index: 0;
3514
- background:
3515
- radial-gradient(circle at 82% 12%, var(--border), transparent 30%),
3516
- radial-gradient(circle at 10% 80%, rgba(180,160,255,0.16), transparent 35%),
3517
- linear-gradient(180deg, var(--bg) 0%, var(--surface-2) 52%, #f2ecff 100%);
22
+ background: var(--app-bg);
3518
23
  }
3519
24
 
3520
25
  .bg-shapes {
@@ -3556,8 +61,8 @@
3556
61
  z-index: 0;
3557
62
  opacity: 0.05;
3558
63
  background-image:
3559
- linear-gradient(rgba(255,255,255,0.5) 1px, transparent 1px),
3560
- linear-gradient(90deg, rgba(255,255,255,0.5) 1px, transparent 1px);
64
+ linear-gradient(var(--line) 1px, transparent 1px),
65
+ linear-gradient(90deg, var(--line) 1px, transparent 1px);
3561
66
  background-size: 48px 48px;
3562
67
  }
3563
68
  .app-layout, .auth-overlay { position: relative; z-index: 1; }
@@ -3571,7 +76,7 @@
3571
76
  /* ── 사이드바 ── */
3572
77
  .sidebar {
3573
78
  width: 268px;
3574
- background: rgba(244,237,255,0.96);
79
+ background: var(--sidebar);
3575
80
  border-right: 1px solid rgba(111,66,232,0.13);
3576
81
  display: flex;
3577
82
  flex-direction: column;
@@ -3644,7 +149,7 @@
3644
149
  .sidebar-search input {
3645
150
  width: 100%;
3646
151
  padding: 7px 10px 7px 30px;
3647
- background: rgba(255,255,255,0.60);
152
+ background: var(--input);
3648
153
  border: 1px solid var(--border);
3649
154
  border-radius: 8px;
3650
155
  color: var(--text);
@@ -3754,7 +259,7 @@
3754
259
  width: 100%;
3755
260
  padding: 11px 12px;
3756
261
  border-radius: var(--radius-sm);
3757
- background: rgba(244,238,255,0.88);
262
+ background: var(--surface-2);
3758
263
  border: 1px solid rgba(111,66,232,0.20);
3759
264
  color: var(--text);
3760
265
  cursor: pointer;
@@ -3836,7 +341,7 @@
3836
341
  gap: 12px;
3837
342
  padding: 10px 22px;
3838
343
  border-bottom: 1px solid rgba(111,66,232,0.10);
3839
- background: rgba(244,238,255,0.92);
344
+ background: var(--sidebar);
3840
345
  backdrop-filter: blur(20px);
3841
346
  -webkit-backdrop-filter: blur(20px);
3842
347
  position: relative;
@@ -3869,7 +374,7 @@
3869
374
  align-items: center;
3870
375
  gap: 6px;
3871
376
  border: 1px solid var(--border);
3872
- background: rgba(255,255,255,0.60);
377
+ background: var(--surface-2);
3873
378
  border-radius: 999px;
3874
379
  padding: 5px 11px;
3875
380
  font-size: 11.5px;
@@ -3910,7 +415,7 @@
3910
415
  .logout-btn:hover {
3911
416
  color: var(--text);
3912
417
  border-color: rgba(255,255,255,0.08);
3913
- background: rgba(255,255,255,0.60);
418
+ background: var(--surface-2);
3914
419
  }
3915
420
 
3916
421
  .acct-modal-overlay {
@@ -3918,7 +423,7 @@
3918
423
  position: fixed;
3919
424
  inset: 0;
3920
425
  background: rgba(111,66,232,0.18);
3921
- backdrop-filter: blur(4px);
426
+ backdrop-filter: none;
3922
427
  z-index: 1000;
3923
428
  align-items: center;
3924
429
  justify-content: center;
@@ -3931,14 +436,14 @@
3931
436
  position: fixed;
3932
437
  inset: 0;
3933
438
  background: rgba(111,66,232,0.18);
3934
- backdrop-filter: blur(4px);
439
+ backdrop-filter: none;
3935
440
  z-index: 1000;
3936
441
  align-items: center;
3937
442
  justify-content: center;
3938
443
  }
3939
444
  .mcp-modal-overlay.open { display: flex; }
3940
445
  .mcp-modal {
3941
- background: rgba(255,255,255,0.96);
446
+ background: var(--modal);
3942
447
  border: 1px solid rgba(111,66,232,0.16);
3943
448
  border-radius: 16px;
3944
449
  width: 100%;
@@ -3962,7 +467,7 @@
3962
467
  .mcp-item {
3963
468
  display: flex; align-items: center; gap: 12px;
3964
469
  padding: 11px 14px;
3965
- background: rgba(255,255,255,0.60);
470
+ background: var(--surface-2);
3966
471
  border: 1px solid rgba(255,255,255,0.06);
3967
472
  border-radius: 10px;
3968
473
  margin-bottom: 6px;
@@ -4001,7 +506,7 @@
4001
506
  .mcp-add-form label { font-size: 11px; font-weight: 600; color: var(--faint); text-transform: uppercase; letter-spacing: .06em; }
4002
507
  .mcp-add-form input, .mcp-add-form textarea, .mcp-add-form select {
4003
508
  width: 100%; padding: 8px 11px; border-radius: 8px; font-size: 13px;
4004
- background: rgba(255,255,255,0.85); border: 1px solid rgba(111,66,232,0.18);
509
+ background: var(--input); border: 1px solid rgba(111,66,232,0.18);
4005
510
  color: var(--text); outline: none; transition: border .15s; box-sizing: border-box;
4006
511
  }
4007
512
  .mcp-add-form input:focus, .mcp-add-form textarea:focus { border-color: rgba(111,66,232,0.45); }
@@ -4019,7 +524,7 @@
4019
524
  }
4020
525
  .mcp-delete-btn:hover { background: rgba(255,80,80,0.18); }
4021
526
  .acct-modal {
4022
- background: rgba(255,255,255,0.96);
527
+ background: var(--modal);
4023
528
  border: 1px solid rgba(111,66,232,0.16);
4024
529
  border-radius: 16px;
4025
530
  width: 100%;
@@ -4045,7 +550,7 @@
4045
550
  .pw-field { display: flex; flex-direction: column; gap: 5px; }
4046
551
  .pw-field label { font-size: 11px; color: var(--muted); }
4047
552
  .pw-field input {
4048
- background: rgba(255,255,255,0.88);
553
+ background: var(--input);
4049
554
  border: 1px solid rgba(111,66,232,0.18);
4050
555
  border-radius: 8px;
4051
556
  color: var(--text, var(--text));
@@ -4066,7 +571,7 @@
4066
571
  .pw-submit:hover { opacity: 0.85; }
4067
572
  .pw-msg { font-size: 12px; min-height: 16px; }
4068
573
  .pw-msg.error { color: #f87171; }
4069
- .pw-msg.success { color: #4ade80; }
574
+ .pw-msg.success { color: var(--success); }
4070
575
 
4071
576
  .lang-picker { position: relative; }
4072
577
  .lang-picker-menu {
@@ -4074,7 +579,7 @@
4074
579
  position: absolute;
4075
580
  top: calc(100% + 6px);
4076
581
  right: 0;
4077
- background: rgba(255,255,255,0.96);
582
+ background: var(--surface-elevated);
4078
583
  border: 1px solid rgba(111,66,232,0.16);
4079
584
  border-radius: 10px;
4080
585
  overflow: hidden;
@@ -4097,10 +602,10 @@
4097
602
  .auth-lang-btn {
4098
603
  background: rgba(255,255,255,0.07);
4099
604
  border: 1px solid rgba(255,255,255,0.12);
4100
- color: #94a3b8; font-size: 12px; padding: 5px 10px;
605
+ color: var(--faint); font-size: 12px; padding: 5px 10px;
4101
606
  border-radius: 8px; cursor: pointer; transition: all .15s;
4102
607
  }
4103
- .auth-lang-btn:hover { background: rgba(255,255,255,0.12); color: #f8fafc; }
608
+ .auth-lang-btn:hover { background: rgba(255,255,255,0.12); color: var(--surface); }
4104
609
  .auth-lang-picker .lang-picker-menu { top: calc(100% + 6px); right: 0; }
4105
610
 
4106
611
  .messages-viewport {
@@ -4137,7 +642,7 @@
4137
642
 
4138
643
  .ops-card.primary {
4139
644
  border-color: rgba(111,66,232,0.18);
4140
- background: linear-gradient(135deg, rgba(111,66,232,0.10) 0%, rgba(248,243,255,0.92) 60%);
645
+ background: linear-gradient(135deg, rgba(111,66,232,0.10) 0%, var(--card) 60%);
4141
646
  box-shadow: var(--shadow-sm), var(--glow-green), inset 0 1px 0 rgba(111,66,232,0.08);
4142
647
  }
4143
648
 
@@ -4146,7 +651,7 @@
4146
651
  .ops-card.interactive:hover {
4147
652
  transform: translateY(-2px);
4148
653
  border-color: rgba(111,66,232,0.32);
4149
- background: linear-gradient(135deg, var(--border) 0%, rgba(248,243,255,0.96) 60%);
654
+ background: linear-gradient(135deg, var(--border) 0%, var(--card) 60%);
4150
655
  box-shadow: var(--shadow), 0 0 30px var(--border);
4151
656
  }
4152
657
 
@@ -4195,7 +700,7 @@
4195
700
  }
4196
701
 
4197
702
  .ops-card:not(.primary) .ops-icon {
4198
- background: rgba(255,255,255,0.60);
703
+ background: var(--card);
4199
704
  border: 1px solid var(--border);
4200
705
  color: var(--accent-3);
4201
706
  }
@@ -4276,7 +781,7 @@
4276
781
  }
4277
782
 
4278
783
  .ai .bubble {
4279
- background: rgba(250,246,255,0.97);
784
+ background: var(--surface);
4280
785
  color: var(--text);
4281
786
  border: 1px solid var(--accent-soft);
4282
787
  border-bottom-left-radius: 4px;
@@ -4290,7 +795,7 @@
4290
795
  overflow: hidden;
4291
796
  border-radius: var(--radius-sm);
4292
797
  margin: 12px 0;
4293
- background: rgba(255,255,255,0.86);
798
+ background: var(--surface-2);
4294
799
  border: 1px solid rgba(129,140,248,0.15);
4295
800
  box-shadow: 0 4px 16px rgba(88,72,150,0.10);
4296
801
  }
@@ -4323,7 +828,7 @@
4323
828
  white-space: pre;
4324
829
  padding: 16px;
4325
830
  font-size: 13px;
4326
- background: rgba(255,255,255,0.86);
831
+ background: var(--surface-2);
4327
832
  scrollbar-width: thin;
4328
833
  font-family: 'JetBrains Mono', 'Fira Code', monospace;
4329
834
  line-height: 1.6;
@@ -4365,7 +870,7 @@
4365
870
  inset: 0;
4366
871
  background: rgba(111,66,232,0.18);
4367
872
  z-index: 99;
4368
- backdrop-filter: blur(2px);
873
+ backdrop-filter: none;
4369
874
  }
4370
875
  body.sidebar-open .sidebar-overlay { display: block; }
4371
876
 
@@ -4403,11 +908,11 @@
4403
908
  .input-area {
4404
909
  padding: 14px 20px 20px;
4405
910
  padding-bottom: max(20px, env(safe-area-inset-bottom));
4406
- background: linear-gradient(0deg, rgba(243,236,255,0.98) 0%, transparent 100%);
911
+ background: linear-gradient(0deg, var(--input) 0%, transparent 100%);
4407
912
  }
4408
913
 
4409
914
  .input-box {
4410
- background: rgba(248,243,255,0.97);
915
+ background: var(--input);
4411
916
  border: 1px solid rgba(111,66,232,0.16);
4412
917
  border-radius: var(--radius);
4413
918
  padding: 10px 12px 10px;
@@ -4516,7 +1021,7 @@
4516
1021
  padding: 4px 10px;
4517
1022
  border-radius: 6px;
4518
1023
  border: 1px solid rgba(255,255,255,0.06);
4519
- background: rgba(255,255,255,0.60);
1024
+ background: var(--surface-2);
4520
1025
  color: var(--muted);
4521
1026
  font-size: 11.5px;
4522
1027
  font-weight: 600;
@@ -4811,7 +1316,7 @@
4811
1316
 
4812
1317
  .auth-card {
4813
1318
  width: min(400px, 100%);
4814
- background: rgba(255,255,255,0.94);
1319
+ background: var(--card);
4815
1320
  border: 1px solid rgba(111,66,232,0.16);
4816
1321
  border-radius: 20px;
4817
1322
  padding: 36px 32px;
@@ -4862,7 +1367,7 @@
4862
1367
  width: 100%;
4863
1368
  padding: 12px 14px;
4864
1369
  margin-bottom: 10px;
4865
- background: rgba(255,255,255,0.60);
1370
+ background: var(--input);
4866
1371
  border: 1px solid rgba(255,255,255,0.08);
4867
1372
  color: var(--text);
4868
1373
  border-radius: 10px;
@@ -4883,7 +1388,7 @@
4883
1388
  width: 100%;
4884
1389
  padding: 13px;
4885
1390
  background: linear-gradient(135deg, var(--accent), #5832c8);
4886
- color: #030d09;
1391
+ color: #fff;
4887
1392
  border: none;
4888
1393
  border-radius: 10px;
4889
1394
  cursor: pointer;
@@ -5308,7 +1813,7 @@
5308
1813
  padding: 10px 14px;
5309
1814
  border-radius: 8px;
5310
1815
  border: 1px solid var(--border);
5311
- background: rgba(248,243,255,0.50);
1816
+ background: var(--card);
5312
1817
  margin-bottom: 16px;
5313
1818
  font-size: 13px;
5314
1819
  }
@@ -5331,7 +1836,7 @@
5331
1836
  border-radius: 8px;
5332
1837
  padding: 14px;
5333
1838
  margin-bottom: 12px;
5334
- background: rgba(248,243,255,0.50);
1839
+ background: var(--surface-2);
5335
1840
  }
5336
1841
 
5337
1842
  .status-section-title {
@@ -5453,7 +1958,7 @@
5453
1958
  margin-top: 8px;
5454
1959
  border: 1px solid rgba(111,66,232,0.16);
5455
1960
  border-radius: 10px;
5456
- background: rgba(255,255,255,0.92);
1961
+ background: var(--surface-elevated);
5457
1962
  box-shadow: 0 16px 36px rgba(96,72,160,0.12);
5458
1963
  overflow: hidden;
5459
1964
  }
@@ -5772,7 +2277,7 @@
5772
2277
 
5773
2278
  .sensitivity-tag.medium {
5774
2279
  border-color: rgba(216, 160, 61, 0.55);
5775
- color: #ffd591;
2280
+ color: var(--warning);
5776
2281
  }
5777
2282
 
5778
2283
  .sensitivity-tag.low {
@@ -5998,7 +2503,7 @@
5998
2503
  inset: 0;
5999
2504
  z-index: 9000;
6000
2505
  background: rgba(111, 66, 232, 0.18);
6001
- backdrop-filter: blur(14px);
2506
+ backdrop-filter: none;
6002
2507
  align-items: center;
6003
2508
  justify-content: center;
6004
2509
  }
@@ -6153,7 +2658,7 @@
6153
2658
  .rec-item.checked .rec-checkbox {
6154
2659
  background: var(--accent);
6155
2660
  border-color: var(--accent);
6156
- color: #0f1214;
2661
+ color: #fff;
6157
2662
  }
6158
2663
  .rec-item-body.lattice-ref-chat { flex: 1; min-width: 0; }
6159
2664
  .rec-item-header { display: flex; align-items: center; gap: 7px; flex-wrap: wrap; }
@@ -6247,13 +2752,13 @@
6247
2752
 
6248
2753
  /* ── 패널 공통 ── */
6249
2754
  .admin-panel {
6250
- background: rgba(246,240,255,0.98);
2755
+ background: var(--card);
6251
2756
  border-left: 1px solid var(--border);
6252
2757
  backdrop-filter: blur(24px);
6253
2758
  color: var(--text);
6254
2759
  }
6255
2760
  .admin-header {
6256
- background: rgba(244,237,255,0.95);
2761
+ background: var(--sidebar);
6257
2762
  border-bottom: 1px solid var(--accent-soft);
6258
2763
  }
6259
2764
  .admin-form-field label {
@@ -6262,7 +2767,7 @@
6262
2767
  letter-spacing: 0.05em;
6263
2768
  }
6264
2769
  .admin-form-field input, .admin-form-field select, .admin-form-field textarea {
6265
- background: rgba(255,255,255,0.90);
2770
+ background: var(--input);
6266
2771
  border-color: rgba(111,66,232,0.18);
6267
2772
  border-radius: 9px;
6268
2773
  color: var(--text);
@@ -6352,7 +2857,7 @@
6352
2857
 
6353
2858
  /* ── MCP 드롭다운 개선 ── */
6354
2859
  .mcp-dropdown {
6355
- background: rgba(255,255,255,0.96);
2860
+ background: var(--surface-elevated);
6356
2861
  border: 1px solid rgba(111,66,232,0.16);
6357
2862
  border-radius: var(--radius);
6358
2863
  box-shadow: var(--shadow), 0 0 20px rgba(111,66,232,0.08);
@@ -6364,14 +2869,14 @@
6364
2869
  color: var(--accent);
6365
2870
  }
6366
2871
 
6367
- /* Lattice AI workspace — light lavender theme. */
2872
+ /* Lattice AI workspace — product shell theme. */
6368
2873
  .app-layout {
6369
2874
  --bg: var(--bg);
6370
2875
  --surface: var(--surface);
6371
2876
  --surface-2: var(--surface-2);
6372
2877
  --surface-3: var(--surface-3);
6373
2878
  --accent: var(--accent);
6374
- --accent-2: var(--accent-2);
2879
+ --accent-2: var(--lt-accent-2, #0f9f8f);
6375
2880
  --accent-3: var(--accent-3);
6376
2881
  --accent-pink: var(--accent-pink);
6377
2882
  --accent-soft: var(--accent-soft);
@@ -6380,15 +2885,15 @@
6380
2885
  --faint: var(--faint);
6381
2886
  --border: var(--border);
6382
2887
  --border-strong: var(--border-strong);
6383
- --shadow: 0 18px 54px rgba(88, 72, 150, 0.15);
6384
- --shadow-sm: 0 6px 20px rgba(88, 72, 150, 0.10);
2888
+ --shadow: var(--shadow);
2889
+ --shadow-sm: var(--shadow-sm);
6385
2890
  --glow-green: 0 0 30px var(--border);
6386
2891
  position: relative;
6387
2892
  isolation: isolate;
6388
2893
  background:
6389
2894
  radial-gradient(circle at 82% 12%, var(--border), transparent 30%),
6390
2895
  radial-gradient(circle at 10% 80%, rgba(180,160,255,0.16), transparent 35%),
6391
- linear-gradient(180deg, var(--bg) 0%, var(--surface-2) 52%, #f2ecff 100%);
2896
+ linear-gradient(180deg, var(--bg) 0%, var(--surface-2) 52%, var(--surface) 100%);
6392
2897
  }
6393
2898
 
6394
2899
  .app-layout::before {
@@ -6509,7 +3014,7 @@
6509
3014
  }
6510
3015
 
6511
3016
  .app-layout .status-dot {
6512
- background: #f7f7f2;
3017
+ background: var(--surface);
6513
3018
  box-shadow: 0 0 8px rgba(247,247,242,0.7), 0 0 18px rgba(167,124,255,0.36);
6514
3019
  }
6515
3020
 
@@ -6586,7 +3091,7 @@
6586
3091
 
6587
3092
  .app-layout .code-container,
6588
3093
  .app-layout pre {
6589
- background: rgba(255,255,255,0.88);
3094
+ background: var(--surface-2);
6590
3095
  border-color: rgba(218,225,255,0.10);
6591
3096
  }
6592
3097
 
@@ -6596,7 +3101,7 @@
6596
3101
  }
6597
3102
 
6598
3103
  .app-layout .input-area {
6599
- background: linear-gradient(0deg, rgba(246,240,255,0.98) 0%, rgba(246,240,255,0.78) 64%, transparent 100%);
3104
+ background: linear-gradient(0deg, var(--input) 0%, var(--input) 64%, transparent 100%);
6600
3105
  }
6601
3106
 
6602
3107
  .app-layout .input-box {
@@ -6624,12 +3129,15 @@
6624
3129
  }
6625
3130
 
6626
3131
  .app-layout .send-btn:hover {
6627
- background: #ffffff;
3132
+ background: var(--surface-2);
6628
3133
  box-shadow: 0 10px 24px rgba(0,0,0,0.28);
6629
3134
  }
6630
3135
 
6631
- /* PPT reference skin: light workspace, indigo navigation, modal-first flow. */
6632
- body.lattice-ref-chat {
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 {
6633
3141
  --bg: #f8f6ff;
6634
3142
  --surface: #ffffff;
6635
3143
  --surface-2: #f3f0ff;
@@ -6651,7 +3159,7 @@
6651
3159
  background:
6652
3160
  radial-gradient(circle at 76% 14%, rgba(111,75,246,0.12), transparent 30%),
6653
3161
  radial-gradient(circle at 8% 80%, rgba(196,181,253,0.26), transparent 35%),
6654
- linear-gradient(180deg, #fbfaff 0%, #f6f2ff 100%);
3162
+ linear-gradient(180deg, var(--surface) 0%, var(--surface) 100%);
6655
3163
  }
6656
3164
  .bg-grid {
6657
3165
  opacity: 0.28;
@@ -6668,7 +3176,7 @@
6668
3176
  radial-gradient(ellipse at 5% 88%, rgba(111,75,246,0.16), transparent 35%);
6669
3177
  }
6670
3178
  .app-layout .sidebar {
6671
- background: rgba(255,255,255,0.88);
3179
+ background: var(--sidebar);
6672
3180
  border-right-color: rgba(111,75,246,0.12);
6673
3181
  box-shadow: 12px 0 46px rgba(86,70,160,0.08);
6674
3182
  }
@@ -6687,7 +3195,7 @@
6687
3195
  }
6688
3196
  .app-layout .brand-title,
6689
3197
  .app-layout .empty-state h1 {
6690
- color: #24223d;
3198
+ color: var(--text);
6691
3199
  }
6692
3200
  .app-layout .brand-subtitle,
6693
3201
  .app-layout .user-strip,
@@ -6700,7 +3208,7 @@
6700
3208
  .app-layout .mcp-add-form textarea,
6701
3209
  .app-layout .mcp-add-form select,
6702
3210
  .app-layout .pw-field input {
6703
- background: #fbfaff;
3211
+ background: var(--surface);
6704
3212
  border-color: rgba(111,75,246,0.12);
6705
3213
  color: var(--text);
6706
3214
  }
@@ -6708,7 +3216,7 @@
6708
3216
  .app-layout .status-btn,
6709
3217
  .app-layout .setup-wizard-sidebar-btn,
6710
3218
  .app-layout .admin-btn {
6711
- background: #fff;
3219
+ background: var(--sidebar);
6712
3220
  border-color: rgba(111,75,246,0.13);
6713
3221
  color: var(--text);
6714
3222
  box-shadow: 0 8px 22px rgba(86,70,160,0.06);
@@ -6719,18 +3227,18 @@
6719
3227
  .app-layout .admin-btn:hover,
6720
3228
  .app-layout .history-item:hover,
6721
3229
  .app-layout .history-item.active {
6722
- background: #f1ecff;
3230
+ background: var(--surface);
6723
3231
  border-color: rgba(111,75,246,0.25);
6724
3232
  color: var(--accent);
6725
3233
  }
6726
3234
  .app-layout .chat-header {
6727
- background: rgba(255,255,255,0.78);
3235
+ background: var(--sidebar);
6728
3236
  box-shadow: 0 8px 28px rgba(86,70,160,0.08);
6729
3237
  }
6730
3238
  .app-layout .model-badge,
6731
3239
  .app-layout .status-pill,
6732
3240
  .app-layout .logout-btn {
6733
- background: rgba(255,255,255,0.78);
3241
+ background: var(--surface-2);
6734
3242
  border-color: rgba(111,75,246,0.14);
6735
3243
  color: var(--muted);
6736
3244
  }
@@ -6746,17 +3254,17 @@
6746
3254
  .app-layout .ai .bubble,
6747
3255
  .app-layout .acct-modal,
6748
3256
  .app-layout .mcp-modal {
6749
- background: rgba(255,255,255,0.86);
3257
+ background: var(--modal);
6750
3258
  border-color: rgba(111,75,246,0.13);
6751
3259
  box-shadow: var(--shadow-sm), inset 0 1px 0 rgba(255,255,255,0.9);
6752
3260
  }
6753
3261
  .app-layout .ops-card.primary {
6754
- background: linear-gradient(135deg, rgba(111,75,246,0.12), rgba(255,255,255,0.92) 62%);
3262
+ background: linear-gradient(135deg, rgba(111,75,246,0.12), var(--card) 62%);
6755
3263
  border-color: rgba(111,75,246,0.23);
6756
3264
  }
6757
3265
  .app-layout .ops-card.interactive:hover,
6758
3266
  .app-layout .empty-chip:hover {
6759
- background: #f3efff;
3267
+ background: var(--surface);
6760
3268
  border-color: rgba(111,75,246,0.30);
6761
3269
  box-shadow: 0 18px 42px rgba(86,70,160,0.16);
6762
3270
  }
@@ -6777,10 +3285,10 @@
6777
3285
  box-shadow: 0 14px 32px rgba(111,75,246,0.22);
6778
3286
  }
6779
3287
  .app-layout .input-area {
6780
- background: linear-gradient(0deg, rgba(248,246,255,0.98) 0%, rgba(248,246,255,0.76) 64%, transparent 100%);
3288
+ background: linear-gradient(0deg, var(--input) 0%, var(--input) 64%, transparent 100%);
6781
3289
  }
6782
3290
  .app-layout .input-box {
6783
- background: rgba(255,255,255,0.92);
3291
+ background: var(--input);
6784
3292
  border-color: rgba(111,75,246,0.16);
6785
3293
  box-shadow: 0 18px 54px rgba(86,70,160,0.15);
6786
3294
  }
@@ -6802,7 +3310,7 @@
6802
3310
  justify-content: center;
6803
3311
  padding: 24px;
6804
3312
  background: rgba(111, 66, 232, 0.18);
6805
- backdrop-filter: blur(14px);
3313
+ backdrop-filter: none;
6806
3314
  }
6807
3315
  .workspace-modal-overlay.open,
6808
3316
  .mode-modal-overlay.open {
@@ -6837,7 +3345,7 @@
6837
3345
  text-align: center;
6838
3346
  margin-bottom: 8px;
6839
3347
  }
6840
- .mode-modal .modal-kicker { color: #b9aaff; }
3348
+ .mode-modal .modal-kicker { color: var(--accent); }
6841
3349
  .workspace-modal h2,
6842
3350
  .mode-modal h2 {
6843
3351
  text-align: center;
@@ -6852,7 +3360,7 @@
6852
3360
  line-height: 1.6;
6853
3361
  margin-bottom: 22px;
6854
3362
  }
6855
- .mode-modal p { color: #b8b2d4; }
3363
+ .mode-modal p { color: var(--muted); }
6856
3364
  .workspace-options,
6857
3365
  .mode-options {
6858
3366
  display: grid;
@@ -6863,7 +3371,7 @@
6863
3371
  .mode-card {
6864
3372
  border-radius: 16px;
6865
3373
  border: 1px solid rgba(111,75,246,0.14);
6866
- background: #fff;
3374
+ background: var(--card);
6867
3375
  padding: 22px 18px;
6868
3376
  cursor: pointer;
6869
3377
  text-align: center;
@@ -6921,7 +3429,7 @@
6921
3429
  font-size: 12px;
6922
3430
  line-height: 1.45;
6923
3431
  }
6924
- .mode-card span { color: #c9c3e2; }
3432
+ .mode-card span { color: var(--muted); }
6925
3433
  .modal-footnote {
6926
3434
  color: var(--faint);
6927
3435
  font-size: 12px;
@@ -6934,7 +3442,7 @@
6934
3442
  right: 14px;
6935
3443
  border: 0;
6936
3444
  background: rgba(255,255,255,0.08);
6937
- color: #c9c3e2;
3445
+ color: var(--muted);
6938
3446
  border-radius: 10px;
6939
3447
  width: 32px;
6940
3448
  height: 32px;
@@ -6970,7 +3478,7 @@
6970
3478
  padding: 4px;
6971
3479
  border: 1px solid rgba(111,75,246,0.16);
6972
3480
  border-radius: 10px;
6973
- background: rgba(255,255,255,0.72);
3481
+ background: var(--surface-2);
6974
3482
  box-shadow: 0 8px 22px rgba(86,70,160,0.08);
6975
3483
  }
6976
3484
 
@@ -7034,7 +3542,7 @@
7034
3542
 
7035
3543
  .app-layout .reference-nav-item:hover,
7036
3544
  .app-layout .reference-nav-item.active {
7037
- background: #f1ecff;
3545
+ background: var(--surface);
7038
3546
  border-color: rgba(111,75,246,0.22);
7039
3547
  color: var(--accent);
7040
3548
  }
@@ -7050,7 +3558,7 @@
7050
3558
 
7051
3559
  .home-action-card {
7052
3560
  border: 1px solid rgba(111,75,246,0.14);
7053
- background: rgba(255,255,255,0.9);
3561
+ background: var(--card);
7054
3562
  border-radius: 8px;
7055
3563
  padding: 16px;
7056
3564
  text-align: left;
@@ -7100,7 +3608,7 @@
7100
3608
 
7101
3609
  .home-summary-panel {
7102
3610
  border: 1px solid rgba(111,75,246,0.12);
7103
- background: rgba(255,255,255,0.82);
3611
+ background: var(--card);
7104
3612
  border-radius: 8px;
7105
3613
  padding: 16px;
7106
3614
  text-align: left;
@@ -7166,7 +3674,7 @@
7166
3674
 
7167
3675
  /* 개별 카드 */
7168
3676
  .hdc-card {
7169
- background: rgba(255,255,255,0.92);
3677
+ background: var(--card);
7170
3678
  border: 1px solid var(--border);
7171
3679
  border-radius: 14px;
7172
3680
  padding: 18px;
@@ -7261,7 +3769,7 @@
7261
3769
  gap: 14px;
7262
3770
  }
7263
3771
  .hdr-panel {
7264
- background: rgba(255,255,255,0.92);
3772
+ background: var(--card);
7265
3773
  border: 1px solid var(--border);
7266
3774
  border-radius: 14px;
7267
3775
  overflow: hidden;
@@ -7315,7 +3823,7 @@
7315
3823
  justify-content: center;
7316
3824
  padding: 24px;
7317
3825
  background: rgba(28, 24, 54, 0.34);
7318
- backdrop-filter: blur(18px);
3826
+ backdrop-filter: none;
7319
3827
  }
7320
3828
 
7321
3829
  .onboarding-overlay.open { display: flex; }
@@ -7328,7 +3836,7 @@
7328
3836
  overflow: hidden;
7329
3837
  border-radius: 16px;
7330
3838
  border: 1px solid rgba(111,75,246,0.16);
7331
- background: linear-gradient(180deg, rgba(255,255,255,0.98), rgba(250,248,255,0.96));
3839
+ background: linear-gradient(180deg, var(--card), var(--card));
7332
3840
  box-shadow: 0 30px 90px rgba(60,45,130,0.24);
7333
3841
  color: var(--text);
7334
3842
  }
@@ -7417,7 +3925,7 @@
7417
3925
 
7418
3926
  .onboarding-secondary {
7419
3927
  border: 1px solid rgba(111,75,246,0.16);
7420
- background: #fff;
3928
+ background: var(--card);
7421
3929
  color: var(--muted);
7422
3930
  }
7423
3931
 
@@ -7435,7 +3943,7 @@
7435
3943
  .recommendation-card,
7436
3944
  .analysis-row {
7437
3945
  border: 1px solid rgba(111,75,246,0.14);
7438
- background: #fff;
3946
+ background: var(--card);
7439
3947
  border-radius: 10px;
7440
3948
  padding: 16px;
7441
3949
  text-align: left;
@@ -7493,7 +4001,7 @@
7493
4001
 
7494
4002
  .onboarding-model-card {
7495
4003
  border: 1px solid rgba(111,75,246,0.14);
7496
- background: #fff;
4004
+ background: var(--card);
7497
4005
  border-radius: 10px;
7498
4006
  padding: 14px;
7499
4007
  }
@@ -7511,7 +4019,7 @@
7511
4019
 
7512
4020
  .onboarding-model-option {
7513
4021
  border: 1px solid rgba(111,75,246,0.14);
7514
- background: #fbfaff;
4022
+ background: var(--surface);
7515
4023
  border-radius: 8px;
7516
4024
  padding: 11px;
7517
4025
  text-align: left;
@@ -7556,7 +4064,7 @@
7556
4064
 
7557
4065
  .setup-log-row {
7558
4066
  border: 1px solid rgba(111,75,246,0.12);
7559
- background: #fff;
4067
+ background: var(--surface);
7560
4068
  border-radius: 8px;
7561
4069
  padding: 12px 14px;
7562
4070
  display: flex;
@@ -7566,7 +4074,7 @@
7566
4074
  font-size: 13px;
7567
4075
  }
7568
4076
 
7569
- .setup-log-row.done { color: #147a5a; border-color: rgba(20,122,90,0.24); }
4077
+ .setup-log-row.done { color: var(--success); border-color: rgba(20,122,90,0.24); }
7570
4078
  .setup-log-row.error { color: var(--danger); border-color: rgba(239,68,68,0.24); }
7571
4079
 
7572
4080
  .advanced-settings-overlay {
@@ -7673,7 +4181,7 @@
7673
4181
  }
7674
4182
 
7675
4183
  body.lattice-ref-chat .app-layout .mode-segmented button:not(.active) {
7676
- color: #b0a4ee;
4184
+ color: var(--muted);
7677
4185
  }
7678
4186
 
7679
4187
  body.lattice-ref-chat .app-layout .mode-segmented button.active {
@@ -7709,28 +4217,25 @@
7709
4217
  }
7710
4218
 
7711
4219
  /* =========================================================
7712
- Soft Lavender Theme (4/10) — full override for .app-layout
4220
+ Workspace product shell — full override for .app-layout
7713
4221
  ========================================================= */
7714
4222
  body.lattice-ref-chat .app-layout {
7715
4223
  --bg: var(--bg);
7716
4224
  --surface: var(--surface);
7717
4225
  --surface-2: var(--surface-2);
7718
- --surface-3: #e8e0ff;
4226
+ --surface-3: var(--surface-3);
7719
4227
  --accent: var(--accent);
7720
- --accent-2: #ffb84d;
4228
+ --accent-2: var(--lt-accent-2, #0f9f8f);
7721
4229
  --accent-3: var(--accent-2);
7722
4230
  --accent-soft: var(--accent-soft);
7723
4231
  --text: var(--text);
7724
4232
  --muted: var(--muted);
7725
4233
  --faint: var(--faint);
7726
- --border: rgba(111,66,232,0.15);
4234
+ --border: var(--border);
7727
4235
  --border-strong: var(--border-strong);
7728
- --shadow: 0 18px 54px rgba(88,72,150,0.15);
7729
- --shadow-sm: 0 8px 24px rgba(88,72,150,0.11);
7730
- background:
7731
- radial-gradient(circle at 82% 12%, var(--border), transparent 30%),
7732
- radial-gradient(circle at 10% 80%, rgba(180,160,255,0.16), transparent 35%),
7733
- linear-gradient(180deg, var(--bg) 0%, var(--surface-2) 52%, #f2ecff 100%);
4236
+ --shadow: var(--shadow);
4237
+ --shadow-sm: var(--shadow-sm);
4238
+ background: var(--app-bg);
7734
4239
  }
7735
4240
  body.lattice-ref-chat .app-layout::before,
7736
4241
  body.lattice-ref-chat .app-layout::after {
@@ -7739,16 +4244,16 @@
7739
4244
 
7740
4245
  /* Sidebar */
7741
4246
  body.lattice-ref-chat .app-layout .sidebar {
7742
- background: rgba(244, 237, 255, 0.96);
7743
- border-right: 1px solid rgba(111,66,232,0.13);
7744
- box-shadow: 12px 0 46px rgba(88,72,150,0.08);
4247
+ background: var(--sidebar);
4248
+ border-right: 1px solid var(--line);
4249
+ box-shadow: none;
7745
4250
  }
7746
4251
 
7747
4252
  /* Chat header */
7748
4253
  body.lattice-ref-chat .app-layout .chat-header {
7749
- background: rgba(244, 238, 255, 0.92);
7750
- border-bottom: 1px solid rgba(111,66,232,0.11);
7751
- box-shadow: 0 2px 12px rgba(88,72,150,0.06);
4254
+ background: var(--sidebar);
4255
+ border-bottom: 1px solid var(--line);
4256
+ box-shadow: none;
7752
4257
  backdrop-filter: blur(14px);
7753
4258
  }
7754
4259
 
@@ -7759,7 +4264,7 @@
7759
4264
 
7760
4265
  /* AI 채팅 버블 */
7761
4266
  body.lattice-ref-chat .app-layout .ai .bubble {
7762
- background: rgba(250, 246, 255, 0.97);
4267
+ background: var(--surface);
7763
4268
  border: 1px solid var(--accent-soft);
7764
4269
  color: var(--text);
7765
4270
  box-shadow: 0 4px 18px rgba(88,72,150,0.08);
@@ -7784,71 +4289,71 @@
7784
4289
  /* 코드 블록 */
7785
4290
  body.lattice-ref-chat .app-layout .code-container,
7786
4291
  body.lattice-ref-chat .app-layout pre {
7787
- background: #ede7ff;
4292
+ background: var(--surface-2);
7788
4293
  border-color: var(--border);
7789
4294
  }
7790
4295
  body.lattice-ref-chat .app-layout .code-header {
7791
- background: #e5dcff;
4296
+ background: var(--surface-2);
7792
4297
  border-bottom-color: rgba(111,66,232,0.13);
7793
4298
  }
7794
4299
 
7795
4300
  /* 입력창 영역 */
7796
4301
  body.lattice-ref-chat .app-layout .input-area {
7797
4302
  background: linear-gradient(0deg,
7798
- rgba(243,237,255,0.99) 0%,
7799
- rgba(243,237,255,0.86) 64%,
4303
+ color-mix(in srgb, var(--bg) 98%, transparent) 0%,
4304
+ color-mix(in srgb, var(--bg) 82%, transparent) 64%,
7800
4305
  transparent 100%);
7801
4306
  }
7802
4307
  body.lattice-ref-chat .app-layout .input-box {
7803
- background: rgba(248, 243, 255, 0.97);
7804
- border: 1px solid rgba(111,66,232,0.17);
7805
- box-shadow: 0 8px 32px rgba(88,72,150,0.10);
4308
+ background: var(--input);
4309
+ border: 1px solid var(--line);
4310
+ box-shadow: var(--shadow-sm);
7806
4311
  }
7807
4312
  body.lattice-ref-chat .app-layout .input-box:focus-within {
7808
- border-color: rgba(111,66,232,0.44);
7809
- box-shadow: 0 8px 32px rgba(88,72,150,0.10), 0 0 0 3px rgba(111,66,232,0.09);
4313
+ border-color: var(--accent);
4314
+ box-shadow: var(--shadow-sm), 0 0 0 3px var(--accent-soft);
7810
4315
  }
7811
4316
 
7812
4317
  /* 전송 버튼 */
7813
4318
  body.lattice-ref-chat .app-layout .send-btn {
7814
4319
  background: linear-gradient(135deg, var(--accent), var(--accent-2));
7815
4320
  color: #ffffff;
7816
- box-shadow: 0 8px 20px rgba(111,66,232,0.28);
4321
+ box-shadow: 0 8px 20px color-mix(in srgb, var(--accent) 24%, transparent);
7817
4322
  }
7818
4323
  body.lattice-ref-chat .app-layout .send-btn:hover {
7819
- box-shadow: 0 10px 26px rgba(111,66,232,0.38);
4324
+ box-shadow: 0 10px 26px color-mix(in srgb, var(--accent) 34%, transparent);
7820
4325
  opacity: 0.92;
7821
4326
  }
7822
4327
 
7823
4328
  /* 빈 상태 카드/칩 */
7824
4329
  body.lattice-ref-chat .app-layout .empty-chip {
7825
- background: rgba(246, 241, 255, 0.94);
4330
+ background: var(--surface-2);
7826
4331
  border-color: rgba(111,66,232,0.15);
7827
4332
  color: var(--muted);
7828
4333
  box-shadow: 0 2px 10px rgba(88,72,150,0.08);
7829
4334
  }
7830
4335
  body.lattice-ref-chat .app-layout .empty-chip:hover {
7831
- background: rgba(111,66,232,0.08);
4336
+ background: var(--accent-soft);
7832
4337
  border-color: var(--border-strong);
7833
4338
  }
7834
4339
  body.lattice-ref-chat .app-layout .ops-card {
7835
- background: rgba(247, 242, 255, 0.94);
7836
- border-color: rgba(111,66,232,0.13);
7837
- box-shadow: 0 6px 22px rgba(88,72,150,0.08);
4340
+ background: var(--card);
4341
+ border-color: var(--line);
4342
+ box-shadow: var(--shadow-sm);
7838
4343
  }
7839
4344
  body.lattice-ref-chat .app-layout .ops-card.primary {
7840
- background: linear-gradient(135deg, rgba(111,66,232,0.10), rgba(247,242,255,0.94) 58%);
7841
- border-color: rgba(111,66,232,0.22);
4345
+ background: linear-gradient(135deg, var(--accent-soft), var(--card) 58%);
4346
+ border-color: var(--border-strong);
7842
4347
  }
7843
4348
 
7844
4349
  /* 배지/버튼 */
7845
4350
  body.lattice-ref-chat .app-layout .model-badge {
7846
- background: rgba(243, 237, 255, 0.90);
4351
+ background: var(--surface-2);
7847
4352
  border-color: rgba(111,66,232,0.15);
7848
4353
  color: var(--text);
7849
4354
  }
7850
4355
  body.lattice-ref-chat .app-layout .status-pill {
7851
- background: rgba(241, 236, 255, 0.86);
4356
+ background: var(--surface-2);
7852
4357
  border-color: rgba(111,66,232,0.13);
7853
4358
  color: var(--muted);
7854
4359
  }
@@ -7860,8 +4365,8 @@
7860
4365
  body.lattice-ref-chat .app-layout .status-btn,
7861
4366
  body.lattice-ref-chat .app-layout .admin-btn,
7862
4367
  body.lattice-ref-chat .app-layout .setup-wizard-sidebar-btn {
7863
- background: rgba(111,66,232,0.10);
7864
- border-color: rgba(111,66,232,0.22);
4368
+ background: var(--accent-soft);
4369
+ border-color: var(--border-strong);
7865
4370
  color: var(--accent);
7866
4371
  box-shadow: none;
7867
4372
  }
@@ -7877,12 +4382,12 @@
7877
4382
  color: var(--text);
7878
4383
  -webkit-text-fill-color: var(--text);
7879
4384
  background: var(--accent-soft);
7880
- border-color: rgba(111,66,232,0.24);
4385
+ border-color: var(--border-strong);
7881
4386
  }
7882
4387
  /* 채팅 기록 목록도 검정 */
7883
4388
  body.lattice-ref-chat .app-layout .history-item {
7884
- color: #2a2744;
7885
- -webkit-text-fill-color: #2a2744;
4389
+ color: var(--text);
4390
+ -webkit-text-fill-color: var(--text);
7886
4391
  }
7887
4392
  body.lattice-ref-chat .app-layout .history-item:hover,
7888
4393
  body.lattice-ref-chat .app-layout .history-item.active {
@@ -7897,20 +4402,20 @@
7897
4402
  /* 사이드바 검색 입력 */
7898
4403
  body.lattice-ref-chat .app-layout .sidebar-search input {
7899
4404
  color: var(--text);
7900
- background: rgba(111,66,232,0.06);
7901
- border-color: rgba(111,66,232,0.16);
4405
+ background: var(--input);
4406
+ border-color: var(--line);
7902
4407
  }
7903
4408
  body.lattice-ref-chat .app-layout .sidebar-search input::placeholder {
7904
4409
  color: var(--faint);
7905
4410
  -webkit-text-fill-color: var(--faint);
7906
4411
  }
7907
- /* 상단 모드 세그멘트 배경도 라벤더로 */
4412
+ /* 상단 모드 세그멘트 */
7908
4413
  body.lattice-ref-chat .app-layout .mode-segmented {
7909
- background: rgba(241, 236, 255, 0.84);
7910
- border-color: rgba(111,66,232,0.16);
4414
+ background: var(--surface-2);
4415
+ border-color: var(--line);
7911
4416
  }
7912
4417
  body.lattice-ref-chat .app-layout .mode-segmented button:not(.active) {
7913
- color: #3d3860;
4418
+ color: var(--muted);
7914
4419
  }
7915
4420
 
7916
4421
  /* ── 홈 뷰: 채팅 전용 사이드바 섹션 숨기기 ── */
@@ -7976,10 +4481,143 @@
7976
4481
  }
7977
4482
  body.lattice-ref-chat .app-layout[data-view="chat"] .chat-capability-row span {
7978
4483
  border: 1px solid rgba(111,66,232,0.16);
7979
- background: rgba(255,255,255,0.72);
4484
+ background: var(--surface);
7980
4485
  color: var(--muted);
7981
4486
  border-radius: 999px;
7982
4487
  padding: 6px 10px;
7983
4488
  font-size: 12px;
7984
4489
  font-weight: 650;
7985
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
+ }