ltcai 2.2.7 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/README.md +72 -34
  2. package/docs/CHANGELOG.md +119 -0
  3. package/docs/V3_BACKEND_ARCHITECTURE.md +138 -0
  4. package/docs/V3_FRONTEND.md +139 -0
  5. package/knowledge_graph.py +649 -21
  6. package/latticeai/__init__.py +1 -1
  7. package/latticeai/api/admin.py +47 -0
  8. package/latticeai/api/agents.py +54 -31
  9. package/latticeai/api/auth.py +5 -2
  10. package/latticeai/api/chat.py +10 -2
  11. package/latticeai/api/search.py +240 -0
  12. package/latticeai/api/static_routes.py +11 -2
  13. package/latticeai/core/config.py +18 -0
  14. package/latticeai/core/embedding_providers.py +625 -0
  15. package/latticeai/core/local_embeddings.py +86 -0
  16. package/latticeai/core/workspace_os.py +1 -1
  17. package/latticeai/server_app.py +65 -1
  18. package/latticeai/services/agent_runtime.py +245 -0
  19. package/latticeai/services/search_service.py +346 -0
  20. package/package.json +13 -6
  21. package/scripts/build_v3_assets.mjs +164 -0
  22. package/scripts/capture/README.md +28 -0
  23. package/scripts/capture/capture_enterprise.js +8 -0
  24. package/scripts/capture/capture_graph.js +8 -0
  25. package/scripts/capture/capture_onboarding.js +8 -0
  26. package/scripts/capture/capture_page.js +43 -0
  27. package/scripts/capture/capture_release_media.js +125 -0
  28. package/scripts/capture/capture_skills.js +8 -0
  29. package/scripts/capture/capture_workspace.js +8 -0
  30. package/scripts/generate_diagrams.py +513 -0
  31. package/scripts/lint_v3.mjs +33 -0
  32. package/scripts/release-0.3.1.sh +105 -0
  33. package/scripts/take_screenshots.js +69 -0
  34. package/scripts/validate_release_artifacts.py +167 -0
  35. package/static/account.html +9 -9
  36. package/static/activity.html +4 -4
  37. package/static/admin.html +8 -8
  38. package/static/agents.html +4 -4
  39. package/static/chat.html +10 -10
  40. package/static/css/reference/account.css +137 -1
  41. package/static/css/reference/chat.css +31 -37
  42. package/static/css/responsive.css +42 -0
  43. package/static/css/tokens.5a595671.css +260 -0
  44. package/static/css/tokens.css +125 -130
  45. package/static/graph.html +9 -9
  46. package/static/manifest.json +3 -3
  47. package/static/plugins.html +4 -4
  48. package/static/scripts/account.js +4 -4
  49. package/static/scripts/chat.js +40 -8
  50. package/static/scripts/workspace.js +78 -0
  51. package/static/sw.js +3 -1
  52. package/static/v3/asset-manifest.json +47 -0
  53. package/static/v3/css/lattice.base.css +128 -0
  54. package/static/v3/css/lattice.base.e4cdd05d.css +128 -0
  55. package/static/v3/css/lattice.components.011e988b.css +447 -0
  56. package/static/v3/css/lattice.components.css +447 -0
  57. package/static/v3/css/lattice.shell.4920f42d.css +407 -0
  58. package/static/v3/css/lattice.shell.css +407 -0
  59. package/static/v3/css/lattice.tokens.c597ff81.css +132 -0
  60. package/static/v3/css/lattice.tokens.css +132 -0
  61. package/static/v3/css/lattice.views.3ee19d4e.css +277 -0
  62. package/static/v3/css/lattice.views.css +277 -0
  63. package/static/v3/index.html +69 -0
  64. package/static/v3/js/app.46fb61d9.js +26 -0
  65. package/static/v3/js/app.js +26 -0
  66. package/static/v3/js/core/api.22a41d42.js +344 -0
  67. package/static/v3/js/core/api.js +344 -0
  68. package/static/v3/js/core/components.4c83e0a9.js +222 -0
  69. package/static/v3/js/core/components.js +222 -0
  70. package/static/v3/js/core/dom.a2773eb0.js +148 -0
  71. package/static/v3/js/core/dom.js +148 -0
  72. package/static/v3/js/core/router.584570f2.js +37 -0
  73. package/static/v3/js/core/router.js +37 -0
  74. package/static/v3/js/core/routes.f935dd50.js +78 -0
  75. package/static/v3/js/core/routes.js +78 -0
  76. package/static/v3/js/core/shell.1b6199d6.js +363 -0
  77. package/static/v3/js/core/shell.js +363 -0
  78. package/static/v3/js/core/store.34ebd5e6.js +113 -0
  79. package/static/v3/js/core/store.js +113 -0
  80. package/static/v3/js/views/admin-audit.660a1fb1.js +185 -0
  81. package/static/v3/js/views/admin-audit.js +185 -0
  82. package/static/v3/js/views/admin-permissions.a7ae5f09.js +177 -0
  83. package/static/v3/js/views/admin-permissions.js +177 -0
  84. package/static/v3/js/views/admin-policies.3658fd86.js +102 -0
  85. package/static/v3/js/views/admin-policies.js +102 -0
  86. package/static/v3/js/views/admin-private-vpc.7d342d36.js +135 -0
  87. package/static/v3/js/views/admin-private-vpc.js +135 -0
  88. package/static/v3/js/views/admin-security.07c66b72.js +180 -0
  89. package/static/v3/js/views/admin-security.js +180 -0
  90. package/static/v3/js/views/admin-users.03bac88c.js +168 -0
  91. package/static/v3/js/views/admin-users.js +168 -0
  92. package/static/v3/js/views/agents.14e48bdd.js +193 -0
  93. package/static/v3/js/views/agents.js +193 -0
  94. package/static/v3/js/views/chat.718144ce.js +449 -0
  95. package/static/v3/js/views/chat.js +449 -0
  96. package/static/v3/js/views/files.4935197e.js +186 -0
  97. package/static/v3/js/views/files.js +186 -0
  98. package/static/v3/js/views/home.cdde3b32.js +119 -0
  99. package/static/v3/js/views/home.js +119 -0
  100. package/static/v3/js/views/hybrid-search.b22b97e0.js +195 -0
  101. package/static/v3/js/views/hybrid-search.js +195 -0
  102. package/static/v3/js/views/knowledge-graph.a14ea7e7.js +237 -0
  103. package/static/v3/js/views/knowledge-graph.js +237 -0
  104. package/static/v3/js/views/models.a1ffa147.js +256 -0
  105. package/static/v3/js/views/models.js +256 -0
  106. package/static/v3/js/views/my-computer.1b2ff621.js +237 -0
  107. package/static/v3/js/views/my-computer.js +237 -0
  108. package/static/v3/js/views/pipeline.c522f1ce.js +157 -0
  109. package/static/v3/js/views/pipeline.js +157 -0
  110. package/static/v3/js/views/settings.4f777210.js +250 -0
  111. package/static/v3/js/views/settings.js +250 -0
  112. package/static/workflows.html +4 -4
  113. package/static/workspace.css +340 -2
  114. package/static/workspace.html +43 -24
  115. package/docs/images/tmp_frames/frame_00.png +0 -0
  116. package/docs/images/tmp_frames/frame_01.png +0 -0
  117. package/docs/images/tmp_frames/frame_02.png +0 -0
  118. package/docs/images/tmp_frames/frame_03.png +0 -0
  119. package/docs/images/tmp_frames/hero_00.png +0 -0
  120. package/docs/images/tmp_frames/hero_01.png +0 -0
  121. package/docs/images/tmp_frames/hero_02.png +0 -0
  122. package/docs/images/tmp_frames/hero_03.png +0 -0
@@ -0,0 +1,407 @@
1
+ /* ============================================================================
2
+ * Lattice AI v3 — Application shell
3
+ * The persistent chrome: nav rail, topbar, view outlet, command palette,
4
+ * mobile drawer, and the signature "retrieval lattice" status component.
5
+ * ========================================================================== */
6
+
7
+ .lt3-app {
8
+ position: relative;
9
+ z-index: 1;
10
+ display: grid;
11
+ grid-template-columns: var(--lt3-rail-w) minmax(0, 1fr);
12
+ height: 100dvh;
13
+ }
14
+
15
+ /* ── Nav rail ────────────────────────────────────────────────────────────── */
16
+ .lt3-rail {
17
+ position: relative;
18
+ z-index: var(--lt3-z-rail);
19
+ display: flex;
20
+ flex-direction: column;
21
+ min-height: 0;
22
+ background: color-mix(in srgb, var(--sidebar) 88%, transparent);
23
+ border-right: 1px solid var(--border);
24
+ backdrop-filter: blur(14px);
25
+ }
26
+
27
+ .lt3-rail__brand {
28
+ display: flex;
29
+ align-items: center;
30
+ gap: var(--lt3-space-3);
31
+ padding: var(--lt3-space-5) var(--lt3-space-5) var(--lt3-space-4);
32
+ }
33
+ .lt3-rail__logo {
34
+ display: grid; place-items: center;
35
+ width: 36px; height: 36px; flex: none;
36
+ border-radius: var(--lt3-radius-sm);
37
+ background: linear-gradient(135deg, var(--lt3-pillar-graph), var(--lt3-pillar-vector));
38
+ color: #fff;
39
+ box-shadow: var(--lt3-elev-1);
40
+ }
41
+ .lt3-rail__logo svg { width: 22px; height: 22px; }
42
+ .lt3-rail__word { display: flex; flex-direction: column; line-height: 1.05; }
43
+ .lt3-rail__word b { font-size: var(--lt3-text-md); font-weight: var(--lt3-weight-bold); letter-spacing: var(--lt3-tracking-tight); }
44
+ .lt3-rail__word small { font-size: var(--lt3-text-2xs); color: var(--faint); letter-spacing: var(--lt3-tracking-wide); }
45
+
46
+ .lt3-rail__scope { padding: 0 var(--lt3-space-4) var(--lt3-space-3); }
47
+
48
+ .lt3-rail__nav {
49
+ flex: 1;
50
+ min-height: 0;
51
+ overflow-y: auto;
52
+ padding: var(--lt3-space-2) var(--lt3-space-3) var(--lt3-space-4);
53
+ display: flex;
54
+ flex-direction: column;
55
+ gap: var(--lt3-space-1);
56
+ }
57
+ .lt3-navgroup { margin-top: var(--lt3-space-4); }
58
+ .lt3-navgroup:first-child { margin-top: 0; }
59
+ .lt3-navgroup__label {
60
+ padding: var(--lt3-space-2) var(--lt3-space-3) var(--lt3-space-1);
61
+ font-size: var(--lt3-text-2xs);
62
+ font-weight: var(--lt3-weight-semi);
63
+ letter-spacing: var(--lt3-tracking-caps);
64
+ text-transform: uppercase;
65
+ color: var(--faint);
66
+ }
67
+
68
+ .lt3-navitem {
69
+ display: flex;
70
+ align-items: center;
71
+ gap: var(--lt3-space-3);
72
+ padding: var(--lt3-space-3) var(--lt3-space-3);
73
+ border-radius: var(--lt3-radius-sm);
74
+ color: var(--muted);
75
+ font-size: var(--lt3-text-sm);
76
+ font-weight: var(--lt3-weight-medium);
77
+ position: relative;
78
+ transition: background var(--lt3-dur-2) var(--lt3-ease), color var(--lt3-dur-2) var(--lt3-ease);
79
+ }
80
+ .lt3-navitem .ti { font-size: 1.25rem; flex: none; width: 22px; text-align: center; }
81
+ .lt3-navitem__label { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
82
+ .lt3-navitem:hover { background: var(--surface-2); color: var(--text); }
83
+ .lt3-navitem[aria-current="page"] {
84
+ background: var(--accent-soft);
85
+ color: var(--accent);
86
+ font-weight: var(--lt3-weight-semi);
87
+ }
88
+ .lt3-navitem[aria-current="page"]::before {
89
+ content: ""; position: absolute; left: -3px; top: 8px; bottom: 8px;
90
+ width: 3px; border-radius: 99px; background: var(--accent);
91
+ }
92
+ .lt3-navitem__badge {
93
+ margin-left: auto;
94
+ font-size: var(--lt3-text-2xs);
95
+ font-weight: var(--lt3-weight-bold);
96
+ padding: 1px 7px;
97
+ border-radius: 99px;
98
+ background: var(--surface-3);
99
+ color: var(--muted);
100
+ }
101
+ .lt3-navitem__dot { margin-left: auto; width: 7px; height: 7px; border-radius: 99px; }
102
+
103
+ .lt3-rail__foot {
104
+ padding: var(--lt3-space-3) var(--lt3-space-3);
105
+ border-top: 1px solid var(--border);
106
+ display: flex;
107
+ align-items: center;
108
+ gap: var(--lt3-space-2);
109
+ }
110
+ .lt3-rail__user {
111
+ display: flex; align-items: center; gap: var(--lt3-space-3);
112
+ flex: 1; min-width: 0;
113
+ padding: var(--lt3-space-2);
114
+ border-radius: var(--lt3-radius-sm);
115
+ transition: background var(--lt3-dur-2) var(--lt3-ease);
116
+ }
117
+ .lt3-rail__user:hover { background: var(--surface-2); }
118
+ .lt3-rail__user-meta { min-width: 0; line-height: 1.2; }
119
+ .lt3-rail__user-meta b { font-size: var(--lt3-text-sm); font-weight: var(--lt3-weight-semi); display: block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
120
+ .lt3-rail__user-meta small { font-size: var(--lt3-text-2xs); color: var(--faint); }
121
+
122
+ /* ── Scope (workspace) switcher ──────────────────────────────────────────── */
123
+ .lt3-scope {
124
+ display: flex; align-items: center; gap: var(--lt3-space-3);
125
+ width: 100%;
126
+ padding: var(--lt3-space-3);
127
+ border-radius: var(--lt3-radius-md);
128
+ background: var(--surface-2);
129
+ border: 1px solid var(--border);
130
+ text-align: left;
131
+ transition: border-color var(--lt3-dur-2) var(--lt3-ease);
132
+ }
133
+ .lt3-scope:hover { border-color: var(--border-strong); }
134
+ .lt3-scope__icon {
135
+ display: grid; place-items: center; width: 30px; height: 30px; flex: none;
136
+ border-radius: var(--lt3-radius-xs);
137
+ background: var(--accent-soft); color: var(--accent);
138
+ }
139
+ .lt3-scope__meta { flex: 1; min-width: 0; line-height: 1.2; }
140
+ .lt3-scope__meta b { font-size: var(--lt3-text-sm); font-weight: var(--lt3-weight-semi); display: block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
141
+ .lt3-scope__meta small { font-size: var(--lt3-text-2xs); color: var(--faint); text-transform: capitalize; }
142
+ .lt3-scope .ti-selector, .lt3-scope > .ti:last-child { color: var(--faint); font-size: 1rem; }
143
+
144
+ /* Scope dropdown menu */
145
+ .lt3-menu {
146
+ position: absolute;
147
+ z-index: var(--lt3-z-drawer);
148
+ min-width: 240px;
149
+ padding: var(--lt3-space-2);
150
+ background: var(--surface-elevated);
151
+ border: 1px solid var(--border);
152
+ border-radius: var(--lt3-radius-md);
153
+ box-shadow: var(--lt3-elev-2);
154
+ display: flex; flex-direction: column; gap: 2px;
155
+ }
156
+ .lt3-menu__item {
157
+ display: flex; align-items: center; gap: var(--lt3-space-3);
158
+ padding: var(--lt3-space-3);
159
+ border-radius: var(--lt3-radius-sm);
160
+ font-size: var(--lt3-text-sm);
161
+ text-align: left;
162
+ transition: background var(--lt3-dur-1) var(--lt3-ease);
163
+ }
164
+ .lt3-menu__item:hover { background: var(--surface-2); }
165
+ .lt3-menu__item[data-active="true"] { color: var(--accent); }
166
+ .lt3-menu__sep { height: 1px; background: var(--border); margin: var(--lt3-space-1) 0; }
167
+
168
+ /* ── Main column ─────────────────────────────────────────────────────────── */
169
+ .lt3-main { display: flex; flex-direction: column; min-width: 0; min-height: 0; }
170
+
171
+ .lt3-topbar {
172
+ display: flex;
173
+ align-items: center;
174
+ gap: var(--lt3-space-3);
175
+ height: var(--lt3-topbar-h);
176
+ flex: none;
177
+ padding: 0 var(--lt3-space-5);
178
+ border-bottom: 1px solid var(--border);
179
+ background: color-mix(in srgb, var(--surface) 70%, transparent);
180
+ backdrop-filter: blur(14px);
181
+ z-index: var(--lt3-z-topbar);
182
+ }
183
+ .lt3-topbar__menu { display: none; }
184
+ .lt3-topbar__crumbs { display: flex; align-items: center; gap: var(--lt3-space-2); min-width: 0; }
185
+ .lt3-topbar__crumbs .ti { color: var(--faint); font-size: 0.95rem; }
186
+ .lt3-crumb { font-size: var(--lt3-text-sm); color: var(--muted); white-space: nowrap; }
187
+ .lt3-crumb--current { color: var(--text); font-weight: var(--lt3-weight-semi); }
188
+
189
+ .lt3-cmd-trigger {
190
+ display: flex; align-items: center; gap: var(--lt3-space-3);
191
+ height: 38px; width: min(360px, 38vw);
192
+ padding: 0 var(--lt3-space-3);
193
+ border-radius: var(--lt3-radius-sm);
194
+ background: var(--surface-2);
195
+ border: 1px solid var(--border);
196
+ color: var(--faint);
197
+ font-size: var(--lt3-text-sm);
198
+ transition: border-color var(--lt3-dur-2) var(--lt3-ease);
199
+ }
200
+ .lt3-cmd-trigger:hover { border-color: var(--border-strong); }
201
+ .lt3-cmd-trigger .ti { font-size: 1.05rem; }
202
+ .lt3-cmd-trigger .lt3-kbd { margin-left: auto; }
203
+
204
+ .lt3-mode {
205
+ display: inline-flex;
206
+ padding: 3px;
207
+ gap: 2px;
208
+ background: var(--surface-2);
209
+ border: 1px solid var(--border);
210
+ border-radius: var(--lt3-radius-sm);
211
+ }
212
+ .lt3-mode button {
213
+ display: inline-flex; align-items: center; gap: var(--lt3-space-2);
214
+ padding: var(--lt3-space-2) var(--lt3-space-3);
215
+ border-radius: 7px;
216
+ font-size: var(--lt3-text-xs);
217
+ font-weight: var(--lt3-weight-semi);
218
+ color: var(--muted);
219
+ }
220
+ .lt3-mode button .ti { font-size: 0.95rem; }
221
+ .lt3-mode button[data-active="true"] { background: var(--surface); color: var(--text); box-shadow: var(--lt3-elev-1); }
222
+ .lt3-mode button[data-mode="admin"][data-active="true"] { color: var(--accent-pink); }
223
+
224
+ /* ── View outlet ─────────────────────────────────────────────────────────── */
225
+ .lt3-view {
226
+ flex: 1;
227
+ min-height: 0;
228
+ overflow-y: auto;
229
+ scroll-behavior: smooth;
230
+ }
231
+ .lt3-view__inner {
232
+ max-width: var(--lt3-content-max);
233
+ margin: 0 auto;
234
+ padding: var(--lt3-space-6) var(--lt3-content-pad) var(--lt3-space-9);
235
+ display: flex;
236
+ flex-direction: column;
237
+ gap: var(--lt3-space-6);
238
+ }
239
+ .lt3-view--wide .lt3-view__inner { max-width: none; }
240
+ .lt3-view--flush { overflow: hidden; }
241
+ .lt3-view--flush .lt3-view__inner { padding: 0; max-width: none; height: 100%; gap: 0; }
242
+
243
+ /* View header */
244
+ .lt3-vhead { display: flex; align-items: flex-end; justify-content: space-between; gap: var(--lt3-space-4); flex-wrap: wrap; }
245
+ .lt3-vhead__title { font-size: var(--lt3-text-2xl); font-weight: var(--lt3-weight-bold); letter-spacing: var(--lt3-tracking-tight); }
246
+ .lt3-vhead__sub { font-size: var(--lt3-text-md); color: var(--muted); margin-top: var(--lt3-space-1); max-width: 64ch; }
247
+ .lt3-vhead__actions { display: flex; align-items: center; gap: var(--lt3-space-2); flex-wrap: wrap; }
248
+
249
+ /* Section heading inside a view */
250
+ .lt3-section__head { display: flex; align-items: center; justify-content: space-between; gap: var(--lt3-space-3); margin-bottom: var(--lt3-space-4); }
251
+ .lt3-section__title { font-size: var(--lt3-text-xl); font-weight: var(--lt3-weight-semi); letter-spacing: var(--lt3-tracking-tight); }
252
+
253
+ /* ── Retrieval lattice (signature identity component) ────────────────────── */
254
+ .lt3-pillars {
255
+ display: grid;
256
+ grid-template-columns: repeat(3, minmax(0, 1fr));
257
+ gap: var(--lt3-space-4);
258
+ }
259
+ .lt3-pillar {
260
+ position: relative;
261
+ overflow: hidden;
262
+ padding: var(--lt3-space-5);
263
+ border-radius: var(--lt3-radius-lg);
264
+ background: var(--surface);
265
+ border: 1px solid var(--border);
266
+ }
267
+ .lt3-pillar::after {
268
+ content: "";
269
+ position: absolute; inset: 0 0 auto 0; height: 3px;
270
+ background: var(--_accent, var(--accent));
271
+ }
272
+ .lt3-pillar--graph { --_accent: var(--lt3-pillar-graph); }
273
+ .lt3-pillar--vector { --_accent: var(--lt3-pillar-vector); }
274
+ .lt3-pillar--hybrid { --_accent: var(--lt3-pillar-hybrid); }
275
+ .lt3-pillar__icon {
276
+ display: grid; place-items: center; width: 40px; height: 40px;
277
+ border-radius: var(--lt3-radius-sm);
278
+ background: color-mix(in srgb, var(--_accent) 16%, transparent);
279
+ color: var(--_accent);
280
+ margin-bottom: var(--lt3-space-3);
281
+ }
282
+ .lt3-pillar__icon .ti { font-size: 1.4rem; }
283
+ .lt3-pillar__name { font-size: var(--lt3-text-md); font-weight: var(--lt3-weight-bold); }
284
+ .lt3-pillar__desc { font-size: var(--lt3-text-xs); color: var(--muted); margin-top: 2px; }
285
+ .lt3-pillar__stat { display: flex; align-items: baseline; gap: var(--lt3-space-2); margin-top: var(--lt3-space-4); }
286
+ .lt3-pillar__num { font-size: var(--lt3-text-xl); font-weight: var(--lt3-weight-bold); color: var(--_accent); letter-spacing: var(--lt3-tracking-tight); }
287
+ .lt3-pillar__unit { font-size: var(--lt3-text-xs); color: var(--faint); }
288
+
289
+ /* Compact index-status chip for the topbar */
290
+ .lt3-idxchip {
291
+ display: inline-flex; align-items: center; gap: var(--lt3-space-2);
292
+ height: 30px; padding: 0 var(--lt3-space-3);
293
+ border-radius: var(--lt3-radius-pill);
294
+ background: var(--surface-2);
295
+ border: 1px solid var(--border);
296
+ font-size: var(--lt3-text-2xs);
297
+ font-weight: var(--lt3-weight-semi);
298
+ }
299
+ .lt3-idxchip__dots { display: inline-flex; gap: 3px; }
300
+ .lt3-idxchip__dot { width: 7px; height: 7px; border-radius: 99px; background: var(--surface-3); }
301
+ .lt3-idxchip__dot[data-on="true"][data-kind="graph"] { background: var(--lt3-pillar-graph); }
302
+ .lt3-idxchip__dot[data-on="true"][data-kind="vector"] { background: var(--lt3-pillar-vector); }
303
+ .lt3-idxchip__dot[data-on="true"][data-kind="hybrid"] { background: var(--lt3-pillar-hybrid); }
304
+
305
+ /* ── Command palette ─────────────────────────────────────────────────────── */
306
+ .lt3-scrim {
307
+ position: fixed; inset: 0;
308
+ z-index: var(--lt3-z-scrim);
309
+ background: var(--overlay);
310
+ backdrop-filter: blur(2px);
311
+ opacity: 0;
312
+ animation: lt3-fade var(--lt3-dur-2) var(--lt3-ease) forwards;
313
+ }
314
+ @keyframes lt3-fade { to { opacity: 1; } }
315
+
316
+ .lt3-palette {
317
+ position: fixed;
318
+ z-index: var(--lt3-z-palette);
319
+ top: 14vh; left: 50%;
320
+ transform: translateX(-50%);
321
+ width: min(620px, 92vw);
322
+ background: var(--surface-elevated);
323
+ border: 1px solid var(--border);
324
+ border-radius: var(--lt3-radius-lg);
325
+ box-shadow: var(--lt3-elev-3);
326
+ overflow: hidden;
327
+ animation: lt3-pop var(--lt3-dur-3) var(--lt3-ease-out);
328
+ }
329
+ @keyframes lt3-pop { from { opacity: 0; transform: translate(-50%, 8px) scale(0.98); } to { opacity: 1; transform: translateX(-50%); } }
330
+ .lt3-palette__input {
331
+ display: flex; align-items: center; gap: var(--lt3-space-3);
332
+ padding: var(--lt3-space-4) var(--lt3-space-5);
333
+ border-bottom: 1px solid var(--border);
334
+ }
335
+ .lt3-palette__input .ti { font-size: 1.3rem; color: var(--faint); }
336
+ .lt3-palette__input input { flex: 1; background: none; border: none; outline: none; font-size: var(--lt3-text-lg); }
337
+ .lt3-palette__list { max-height: 52vh; overflow-y: auto; padding: var(--lt3-space-2); }
338
+ .lt3-palette__group-label { padding: var(--lt3-space-3) var(--lt3-space-3) var(--lt3-space-1); font-size: var(--lt3-text-2xs); text-transform: uppercase; letter-spacing: var(--lt3-tracking-caps); color: var(--faint); }
339
+ .lt3-palette__item {
340
+ display: flex; align-items: center; gap: var(--lt3-space-3);
341
+ width: 100%;
342
+ padding: var(--lt3-space-3);
343
+ border-radius: var(--lt3-radius-sm);
344
+ font-size: var(--lt3-text-sm);
345
+ text-align: left;
346
+ }
347
+ .lt3-palette__item .ti { font-size: 1.2rem; color: var(--muted); width: 22px; text-align: center; }
348
+ .lt3-palette__item[data-active="true"] { background: var(--accent-soft); color: var(--accent); }
349
+ .lt3-palette__item[data-active="true"] .ti { color: var(--accent); }
350
+ .lt3-palette__item small { margin-left: auto; color: var(--faint); font-size: var(--lt3-text-2xs); }
351
+ .lt3-palette__empty { padding: var(--lt3-space-6); text-align: center; color: var(--faint); font-size: var(--lt3-text-sm); }
352
+
353
+ /* ── Mobile drawer scaffolding ───────────────────────────────────────────── */
354
+ .lt3-rail__close { display: none; }
355
+ .lt3-rail__scrim { display: none; }
356
+
357
+ /* ── Responsive: tablet ──────────────────────────────────────────────────── */
358
+ @media (max-width: 1100px) {
359
+ .lt3-app { grid-template-columns: var(--lt3-rail-w-collapsed) minmax(0, 1fr); }
360
+ .lt3-rail { --_collapsed: 1; }
361
+ .lt3-rail__word, .lt3-rail__scope, .lt3-navgroup__label,
362
+ .lt3-navitem__label, .lt3-navitem__badge,
363
+ .lt3-rail__user-meta { display: none; }
364
+ .lt3-rail__brand { justify-content: center; padding: var(--lt3-space-5) 0 var(--lt3-space-4); }
365
+ .lt3-rail__nav { align-items: center; }
366
+ .lt3-navitem { justify-content: center; padding: var(--lt3-space-3); width: 44px; }
367
+ .lt3-navitem[aria-current="page"]::before { left: -3px; }
368
+ .lt3-rail__foot { justify-content: center; }
369
+ .lt3-rail__user { justify-content: center; flex: none; }
370
+ .lt3-pillars { grid-template-columns: 1fr; }
371
+ }
372
+
373
+ /* ── Responsive: mobile (rail becomes off-canvas drawer) ─────────────────── */
374
+ @media (max-width: 760px) {
375
+ .lt3-app { grid-template-columns: 1fr; }
376
+ .lt3-rail {
377
+ position: fixed; inset: 0 auto 0 0;
378
+ width: min(300px, 86vw);
379
+ transform: translateX(-104%);
380
+ transition: transform var(--lt3-dur-3) var(--lt3-ease);
381
+ box-shadow: var(--lt3-elev-3);
382
+ z-index: var(--lt3-z-drawer);
383
+ }
384
+ .lt3-rail__word, .lt3-rail__scope, .lt3-navgroup__label,
385
+ .lt3-navitem__label, .lt3-navitem__badge,
386
+ .lt3-rail__user-meta { display: revert; }
387
+ .lt3-rail__brand { justify-content: flex-start; padding: var(--lt3-space-5) var(--lt3-space-5) var(--lt3-space-4); }
388
+ .lt3-rail__nav { align-items: stretch; }
389
+ .lt3-navitem { justify-content: flex-start; width: auto; }
390
+ .lt3-rail__foot { justify-content: flex-start; }
391
+ .lt3-rail__user { flex: 1; justify-content: flex-start; }
392
+
393
+ .lt3-app[data-drawer="open"] .lt3-rail { transform: none; }
394
+ .lt3-app[data-drawer="open"] .lt3-rail__scrim {
395
+ display: block; position: fixed; inset: 0;
396
+ background: var(--overlay); z-index: var(--lt3-z-scrim);
397
+ }
398
+ .lt3-rail__close { display: inline-flex; position: absolute; top: var(--lt3-space-4); right: var(--lt3-space-3); }
399
+
400
+ .lt3-topbar__menu { display: inline-flex; }
401
+ .lt3-cmd-trigger { width: auto; flex: 1; }
402
+ .lt3-cmd-trigger span, .lt3-cmd-trigger .lt3-kbd { display: none; }
403
+ .lt3-mode button span { display: none; }
404
+ .lt3-mode button .ti { font-size: 1.1rem; }
405
+ .lt3-view__inner { padding: var(--lt3-space-5) var(--lt3-space-4) var(--lt3-space-8); gap: var(--lt3-space-5); }
406
+ .lt3-grid-2, .lt3-grid-3 { grid-template-columns: 1fr; }
407
+ }
@@ -0,0 +1,132 @@
1
+ /* ============================================================================
2
+ * Lattice AI v3 — Structural Design Tokens
3
+ *
4
+ * This layer sits ON TOP of /static/css/tokens.css (the color single-source).
5
+ * It adds the NON-COLOR structure of the v3 system — spacing, type scale,
6
+ * radii, elevation, motion, z-index, layout rails — plus a small set of v3
7
+ * SEMANTIC aliases that map the product's "retrieval lattice" identity
8
+ * (Knowledge Graph · Vector Index · Hybrid Search) onto the existing
9
+ * theme-aware color tokens. No raw colors are introduced for surfaces/text;
10
+ * everything dark/light-aware flows from tokens.css.
11
+ *
12
+ * Rule: v3 component CSS uses only var(--lt3-*) or the inherited var(--*)
13
+ * semantic color tokens. Never hard-code a hex for a themed surface.
14
+ * ========================================================================== */
15
+
16
+ :root {
17
+ /* ── Type families ──────────────────────────────────────────────────── */
18
+ --lt3-font-sans: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
19
+ --lt3-font-mono: "SFMono-Regular", "JetBrains Mono", ui-monospace, "Cascadia Code",
20
+ Menlo, Consolas, monospace;
21
+
22
+ /* ── Type scale (fluid-ish, fixed for predictability) ───────────────── */
23
+ --lt3-text-2xs: 0.6875rem; /* 11px — metadata, kbd */
24
+ --lt3-text-xs: 0.75rem; /* 12px — labels, captions */
25
+ --lt3-text-sm: 0.8125rem; /* 13px — dense body, table */
26
+ --lt3-text-md: 0.9375rem; /* 15px — body */
27
+ --lt3-text-lg: 1.0625rem; /* 17px — lead */
28
+ --lt3-text-xl: 1.375rem; /* 22px — section title */
29
+ --lt3-text-2xl: 1.75rem; /* 28px — view title */
30
+ --lt3-text-3xl: 2.25rem; /* 36px — hero */
31
+ --lt3-text-4xl: 3rem; /* 48px — display */
32
+
33
+ --lt3-leading-tight: 1.18;
34
+ --lt3-leading-snug: 1.35;
35
+ --lt3-leading-normal: 1.55;
36
+
37
+ --lt3-weight-normal: 400;
38
+ --lt3-weight-medium: 500;
39
+ --lt3-weight-semi: 600;
40
+ --lt3-weight-bold: 700;
41
+ --lt3-weight-black: 800;
42
+
43
+ --lt3-tracking-tight: -0.02em;
44
+ --lt3-tracking-wide: 0.02em;
45
+ --lt3-tracking-caps: 0.14em; /* eyebrow / section labels */
46
+
47
+ /* ── Spacing scale (4pt base) ───────────────────────────────────────── */
48
+ --lt3-space-0: 0;
49
+ --lt3-space-1: 0.25rem; /* 4 */
50
+ --lt3-space-2: 0.5rem; /* 8 */
51
+ --lt3-space-3: 0.75rem; /* 12 */
52
+ --lt3-space-4: 1rem; /* 16 */
53
+ --lt3-space-5: 1.5rem; /* 24 */
54
+ --lt3-space-6: 2rem; /* 32 */
55
+ --lt3-space-7: 2.5rem; /* 40 */
56
+ --lt3-space-8: 3rem; /* 48 */
57
+ --lt3-space-9: 4rem; /* 64 */
58
+
59
+ /* ── Radii ──────────────────────────────────────────────────────────── */
60
+ --lt3-radius-xs: 6px;
61
+ --lt3-radius-sm: 9px;
62
+ --lt3-radius-md: 13px;
63
+ --lt3-radius-lg: 18px;
64
+ --lt3-radius-xl: 24px;
65
+ --lt3-radius-pill: 999px;
66
+
67
+ /* ── Elevation (theme-aware via inherited --shadow*) ────────────────── */
68
+ --lt3-elev-0: none;
69
+ --lt3-elev-1: var(--shadow-sm);
70
+ --lt3-elev-2: var(--shadow);
71
+ --lt3-elev-3: 0 28px 70px rgba(15, 23, 42, 0.16);
72
+
73
+ /* ── Motion ─────────────────────────────────────────────────────────── */
74
+ --lt3-ease: var(--lt-motion-ease, cubic-bezier(0.22, 1, 0.36, 1));
75
+ --lt3-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
76
+ --lt3-dur-1: 90ms;
77
+ --lt3-dur-2: 160ms;
78
+ --lt3-dur-3: 240ms;
79
+ --lt3-dur-4: 420ms;
80
+
81
+ /* ── Z-index ────────────────────────────────────────────────────────── */
82
+ --lt3-z-rail: 40;
83
+ --lt3-z-topbar: 50;
84
+ --lt3-z-drawer: 60;
85
+ --lt3-z-scrim: 70;
86
+ --lt3-z-palette: 90;
87
+ --lt3-z-toast: 100;
88
+
89
+ /* ── Layout rails ───────────────────────────────────────────────────── */
90
+ --lt3-rail-w: 268px; /* expanded nav rail */
91
+ --lt3-rail-w-collapsed: 76px;
92
+ --lt3-topbar-h: 60px;
93
+ --lt3-content-max: 1240px;
94
+ --lt3-content-pad: var(--lt3-space-6);
95
+
96
+ /* ── Retrieval identity accents (mapped to themed accents) ──────────── */
97
+ /* Knowledge Graph (structure) · Vector Index (density) · Hybrid (fusion) */
98
+ --lt3-pillar-graph: var(--accent); /* blue — relational structure */
99
+ --lt3-pillar-vector: var(--accent-2); /* teal — embeddings field */
100
+ --lt3-pillar-hybrid: var(--accent-pink); /* magenta — fusion of both */
101
+ --lt3-pillar-graph-soft: color-mix(in srgb, var(--lt3-pillar-graph) 14%, transparent);
102
+ --lt3-pillar-vector-soft: color-mix(in srgb, var(--lt3-pillar-vector) 16%, transparent);
103
+ --lt3-pillar-hybrid-soft: color-mix(in srgb, var(--lt3-pillar-hybrid) 16%, transparent);
104
+
105
+ /* ── Lattice motif (background mesh) ────────────────────────────────── */
106
+ --lt3-mesh-line: color-mix(in srgb, var(--accent) 8%, transparent);
107
+ --lt3-mesh-node: color-mix(in srgb, var(--accent-2) 22%, transparent);
108
+ --lt3-mesh-size: 46px;
109
+
110
+ /* ── Status surfaces (themed, derived) ──────────────────────────────── */
111
+ --lt3-ok: var(--success);
112
+ --lt3-warn: var(--warning);
113
+ --lt3-err: var(--danger);
114
+ --lt3-ok-soft: color-mix(in srgb, var(--success) 16%, transparent);
115
+ --lt3-warn-soft: color-mix(in srgb, var(--warning) 18%, transparent);
116
+ --lt3-err-soft: color-mix(in srgb, var(--danger) 16%, transparent);
117
+ --lt3-info-soft: var(--accent-soft);
118
+ }
119
+
120
+ :root[data-lt-theme="dark"] {
121
+ --lt3-elev-3: 0 30px 80px rgba(0, 0, 0, 0.58);
122
+ --lt3-mesh-line: color-mix(in srgb, var(--accent) 16%, transparent);
123
+ --lt3-mesh-node: color-mix(in srgb, var(--accent-2) 30%, transparent);
124
+ }
125
+
126
+ @media (prefers-color-scheme: dark) {
127
+ :root:not([data-lt-theme="light"]):not([data-lt-theme="dark"]) {
128
+ --lt3-elev-3: 0 30px 80px rgba(0, 0, 0, 0.58);
129
+ --lt3-mesh-line: color-mix(in srgb, var(--accent) 16%, transparent);
130
+ --lt3-mesh-node: color-mix(in srgb, var(--accent-2) 30%, transparent);
131
+ }
132
+ }
@@ -0,0 +1,132 @@
1
+ /* ============================================================================
2
+ * Lattice AI v3 — Structural Design Tokens
3
+ *
4
+ * This layer sits ON TOP of /static/css/tokens.css (the color single-source).
5
+ * It adds the NON-COLOR structure of the v3 system — spacing, type scale,
6
+ * radii, elevation, motion, z-index, layout rails — plus a small set of v3
7
+ * SEMANTIC aliases that map the product's "retrieval lattice" identity
8
+ * (Knowledge Graph · Vector Index · Hybrid Search) onto the existing
9
+ * theme-aware color tokens. No raw colors are introduced for surfaces/text;
10
+ * everything dark/light-aware flows from tokens.css.
11
+ *
12
+ * Rule: v3 component CSS uses only var(--lt3-*) or the inherited var(--*)
13
+ * semantic color tokens. Never hard-code a hex for a themed surface.
14
+ * ========================================================================== */
15
+
16
+ :root {
17
+ /* ── Type families ──────────────────────────────────────────────────── */
18
+ --lt3-font-sans: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
19
+ --lt3-font-mono: "SFMono-Regular", "JetBrains Mono", ui-monospace, "Cascadia Code",
20
+ Menlo, Consolas, monospace;
21
+
22
+ /* ── Type scale (fluid-ish, fixed for predictability) ───────────────── */
23
+ --lt3-text-2xs: 0.6875rem; /* 11px — metadata, kbd */
24
+ --lt3-text-xs: 0.75rem; /* 12px — labels, captions */
25
+ --lt3-text-sm: 0.8125rem; /* 13px — dense body, table */
26
+ --lt3-text-md: 0.9375rem; /* 15px — body */
27
+ --lt3-text-lg: 1.0625rem; /* 17px — lead */
28
+ --lt3-text-xl: 1.375rem; /* 22px — section title */
29
+ --lt3-text-2xl: 1.75rem; /* 28px — view title */
30
+ --lt3-text-3xl: 2.25rem; /* 36px — hero */
31
+ --lt3-text-4xl: 3rem; /* 48px — display */
32
+
33
+ --lt3-leading-tight: 1.18;
34
+ --lt3-leading-snug: 1.35;
35
+ --lt3-leading-normal: 1.55;
36
+
37
+ --lt3-weight-normal: 400;
38
+ --lt3-weight-medium: 500;
39
+ --lt3-weight-semi: 600;
40
+ --lt3-weight-bold: 700;
41
+ --lt3-weight-black: 800;
42
+
43
+ --lt3-tracking-tight: -0.02em;
44
+ --lt3-tracking-wide: 0.02em;
45
+ --lt3-tracking-caps: 0.14em; /* eyebrow / section labels */
46
+
47
+ /* ── Spacing scale (4pt base) ───────────────────────────────────────── */
48
+ --lt3-space-0: 0;
49
+ --lt3-space-1: 0.25rem; /* 4 */
50
+ --lt3-space-2: 0.5rem; /* 8 */
51
+ --lt3-space-3: 0.75rem; /* 12 */
52
+ --lt3-space-4: 1rem; /* 16 */
53
+ --lt3-space-5: 1.5rem; /* 24 */
54
+ --lt3-space-6: 2rem; /* 32 */
55
+ --lt3-space-7: 2.5rem; /* 40 */
56
+ --lt3-space-8: 3rem; /* 48 */
57
+ --lt3-space-9: 4rem; /* 64 */
58
+
59
+ /* ── Radii ──────────────────────────────────────────────────────────── */
60
+ --lt3-radius-xs: 6px;
61
+ --lt3-radius-sm: 9px;
62
+ --lt3-radius-md: 13px;
63
+ --lt3-radius-lg: 18px;
64
+ --lt3-radius-xl: 24px;
65
+ --lt3-radius-pill: 999px;
66
+
67
+ /* ── Elevation (theme-aware via inherited --shadow*) ────────────────── */
68
+ --lt3-elev-0: none;
69
+ --lt3-elev-1: var(--shadow-sm);
70
+ --lt3-elev-2: var(--shadow);
71
+ --lt3-elev-3: 0 28px 70px rgba(15, 23, 42, 0.16);
72
+
73
+ /* ── Motion ─────────────────────────────────────────────────────────── */
74
+ --lt3-ease: var(--lt-motion-ease, cubic-bezier(0.22, 1, 0.36, 1));
75
+ --lt3-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
76
+ --lt3-dur-1: 90ms;
77
+ --lt3-dur-2: 160ms;
78
+ --lt3-dur-3: 240ms;
79
+ --lt3-dur-4: 420ms;
80
+
81
+ /* ── Z-index ────────────────────────────────────────────────────────── */
82
+ --lt3-z-rail: 40;
83
+ --lt3-z-topbar: 50;
84
+ --lt3-z-drawer: 60;
85
+ --lt3-z-scrim: 70;
86
+ --lt3-z-palette: 90;
87
+ --lt3-z-toast: 100;
88
+
89
+ /* ── Layout rails ───────────────────────────────────────────────────── */
90
+ --lt3-rail-w: 268px; /* expanded nav rail */
91
+ --lt3-rail-w-collapsed: 76px;
92
+ --lt3-topbar-h: 60px;
93
+ --lt3-content-max: 1240px;
94
+ --lt3-content-pad: var(--lt3-space-6);
95
+
96
+ /* ── Retrieval identity accents (mapped to themed accents) ──────────── */
97
+ /* Knowledge Graph (structure) · Vector Index (density) · Hybrid (fusion) */
98
+ --lt3-pillar-graph: var(--accent); /* blue — relational structure */
99
+ --lt3-pillar-vector: var(--accent-2); /* teal — embeddings field */
100
+ --lt3-pillar-hybrid: var(--accent-pink); /* magenta — fusion of both */
101
+ --lt3-pillar-graph-soft: color-mix(in srgb, var(--lt3-pillar-graph) 14%, transparent);
102
+ --lt3-pillar-vector-soft: color-mix(in srgb, var(--lt3-pillar-vector) 16%, transparent);
103
+ --lt3-pillar-hybrid-soft: color-mix(in srgb, var(--lt3-pillar-hybrid) 16%, transparent);
104
+
105
+ /* ── Lattice motif (background mesh) ────────────────────────────────── */
106
+ --lt3-mesh-line: color-mix(in srgb, var(--accent) 8%, transparent);
107
+ --lt3-mesh-node: color-mix(in srgb, var(--accent-2) 22%, transparent);
108
+ --lt3-mesh-size: 46px;
109
+
110
+ /* ── Status surfaces (themed, derived) ──────────────────────────────── */
111
+ --lt3-ok: var(--success);
112
+ --lt3-warn: var(--warning);
113
+ --lt3-err: var(--danger);
114
+ --lt3-ok-soft: color-mix(in srgb, var(--success) 16%, transparent);
115
+ --lt3-warn-soft: color-mix(in srgb, var(--warning) 18%, transparent);
116
+ --lt3-err-soft: color-mix(in srgb, var(--danger) 16%, transparent);
117
+ --lt3-info-soft: var(--accent-soft);
118
+ }
119
+
120
+ :root[data-lt-theme="dark"] {
121
+ --lt3-elev-3: 0 30px 80px rgba(0, 0, 0, 0.58);
122
+ --lt3-mesh-line: color-mix(in srgb, var(--accent) 16%, transparent);
123
+ --lt3-mesh-node: color-mix(in srgb, var(--accent-2) 30%, transparent);
124
+ }
125
+
126
+ @media (prefers-color-scheme: dark) {
127
+ :root:not([data-lt-theme="light"]):not([data-lt-theme="dark"]) {
128
+ --lt3-elev-3: 0 30px 80px rgba(0, 0, 0, 0.58);
129
+ --lt3-mesh-line: color-mix(in srgb, var(--accent) 16%, transparent);
130
+ --lt3-mesh-node: color-mix(in srgb, var(--accent-2) 30%, transparent);
131
+ }
132
+ }