qiksy 1.0.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 (78) hide show
  1. package/ARCHITECTURE.md +78 -0
  2. package/INSTALL-PROMPT.md +53 -0
  3. package/bin/qiksy.mjs +302 -0
  4. package/package.json +32 -0
  5. package/tools/client-finder/vendor/README.md +70 -0
  6. package/tools/client-finder/vendor/find.mjs +121 -0
  7. package/tools/client-finder/vendor/icp/assist-pl-shops.json +30 -0
  8. package/tools/client-finder/vendor/icp/assist-ua-shops.json +30 -0
  9. package/tools/client-finder/vendor/knowledge/assist.md +68 -0
  10. package/tools/client-finder/vendor/knowledge/custom.md +36 -0
  11. package/tools/client-finder/vendor/knowledge/multilogin.md +29 -0
  12. package/tools/client-finder/vendor/knowledge/pay.md +26 -0
  13. package/tools/client-finder/vendor/knowledge/qa-copilot.md +43 -0
  14. package/tools/client-finder/vendor/knowledge/travel.md +43 -0
  15. package/tools/client-finder/vendor/knowledge/work-finder.md +52 -0
  16. package/tools/client-finder/vendor/lib/access.mjs +108 -0
  17. package/tools/client-finder/vendor/lib/agent.mjs +204 -0
  18. package/tools/client-finder/vendor/lib/approver-mcp.mjs +78 -0
  19. package/tools/client-finder/vendor/lib/browser.mjs +108 -0
  20. package/tools/client-finder/vendor/lib/catalog.mjs +86 -0
  21. package/tools/client-finder/vendor/lib/channels.mjs +54 -0
  22. package/tools/client-finder/vendor/lib/deliver.mjs +89 -0
  23. package/tools/client-finder/vendor/lib/engine.mjs +283 -0
  24. package/tools/client-finder/vendor/lib/formats.mjs +108 -0
  25. package/tools/client-finder/vendor/lib/jobs.mjs +75 -0
  26. package/tools/client-finder/vendor/lib/knowledge.mjs +26 -0
  27. package/tools/client-finder/vendor/lib/prompts.mjs +183 -0
  28. package/tools/client-finder/vendor/lib/report.mjs +75 -0
  29. package/tools/client-finder/vendor/lib/scope.mjs +162 -0
  30. package/tools/client-finder/vendor/lib/spawn-claude.mjs +44 -0
  31. package/tools/client-finder/vendor/lib/verify.mjs +96 -0
  32. package/tools/client-finder/vendor/package.json +8 -0
  33. package/tools/client-finder/vendor/server.mjs +390 -0
  34. package/tools/travel/vendor/README.md +58 -0
  35. package/tools/travel/vendor/docs/CONTRACT.md +174 -0
  36. package/tools/travel/vendor/docs/ENGINE-MIGRATION.md +33 -0
  37. package/tools/travel/vendor/lib/agent.mjs +190 -0
  38. package/tools/travel/vendor/lib/engine.mjs +283 -0
  39. package/tools/travel/vendor/lib/jobs.mjs +125 -0
  40. package/tools/travel/vendor/lib/license.mjs +41 -0
  41. package/tools/travel/vendor/lib/plans.mjs +28 -0
  42. package/tools/travel/vendor/lib/prompts.mjs +394 -0
  43. package/tools/travel/vendor/lib/proposal.mjs +207 -0
  44. package/tools/travel/vendor/lib/spawn-claude.mjs +44 -0
  45. package/tools/travel/vendor/lib/store.mjs +75 -0
  46. package/tools/travel/vendor/package.json +12 -0
  47. package/tools/travel/vendor/public/app.js +996 -0
  48. package/tools/travel/vendor/public/index.html +112 -0
  49. package/tools/travel/vendor/public/styles.css +760 -0
  50. package/tools/travel/vendor/scripts/approver-mcp.mjs +80 -0
  51. package/tools/travel/vendor/scripts/launch-browser.mjs +77 -0
  52. package/tools/travel/vendor/server.mjs +755 -0
  53. package/tools/work-finder/vendor/.claude/settings.local.json +27 -0
  54. package/tools/work-finder/vendor/.mcp.json +9 -0
  55. package/tools/work-finder/vendor/CLAUDE.md +24 -0
  56. package/tools/work-finder/vendor/README.md +44 -0
  57. package/tools/work-finder/vendor/bin/qiksy-work-finder.mjs +127 -0
  58. package/tools/work-finder/vendor/lib/agent.mjs +159 -0
  59. package/tools/work-finder/vendor/lib/catalog.mjs +41 -0
  60. package/tools/work-finder/vendor/lib/channels.mjs +73 -0
  61. package/tools/work-finder/vendor/lib/engine.mjs +283 -0
  62. package/tools/work-finder/vendor/lib/jobs.mjs +127 -0
  63. package/tools/work-finder/vendor/lib/license.mjs +60 -0
  64. package/tools/work-finder/vendor/lib/linkcheck.mjs +72 -0
  65. package/tools/work-finder/vendor/lib/linkedin.mjs +22 -0
  66. package/tools/work-finder/vendor/lib/plans.mjs +33 -0
  67. package/tools/work-finder/vendor/lib/prompts.mjs +217 -0
  68. package/tools/work-finder/vendor/lib/spawn-claude.mjs +44 -0
  69. package/tools/work-finder/vendor/lib/store.mjs +125 -0
  70. package/tools/work-finder/vendor/package.json +41 -0
  71. package/tools/work-finder/vendor/public/app.js +1863 -0
  72. package/tools/work-finder/vendor/public/index.html +518 -0
  73. package/tools/work-finder/vendor/public/styles.css +930 -0
  74. package/tools/work-finder/vendor/scripts/approver-mcp.mjs +69 -0
  75. package/tools/work-finder/vendor/scripts/extract-linkedin.mjs +81 -0
  76. package/tools/work-finder/vendor/scripts/launch-browser.mjs +78 -0
  77. package/tools/work-finder/vendor/scripts/screenshot.mjs +17 -0
  78. package/tools/work-finder/vendor/server.mjs +1006 -0
@@ -0,0 +1,930 @@
1
+ /* Work Finder UI — crafted blue hiring console.
2
+ Themed canvas (blue glow + faint dot grid) · floating identity header ·
3
+ refined recruiting cards. Light default + [data-theme="dark"]. */
4
+
5
+ :root {
6
+ --bg: #eef3fb;
7
+ --canvas: #f4f7fc;
8
+ --card: #ffffff;
9
+ --text: #0f1b2d;
10
+ --muted: #5c6b82;
11
+ --accent: #2563eb;
12
+ --accent-dark: #1d4ed8;
13
+ --accent-hover: #1b46c9;
14
+ --accent-soft: #e6effe;
15
+ --ok: #059669;
16
+ --ok-soft: #e4f6ef;
17
+ --warn: #b45309;
18
+ --warn-soft: #fdf2e2;
19
+ --err: #dc2626;
20
+ --err-soft: #fdeaea;
21
+ --border: #e2e9f4;
22
+ --shadow: 0 1px 2px rgba(23, 43, 77, .05), 0 4px 14px rgba(23, 43, 77, .06);
23
+ --shadow-lift: 0 6px 22px rgba(23, 43, 77, .12);
24
+ --ink2: #34435b;
25
+ --border-hover: #bcccea;
26
+ --eng-bg: #edeafe;
27
+ --eng-text: #5b4de0;
28
+ --st-resp-bg: #d7f2e4;
29
+ --st-resp-text: #036c4b;
30
+ --st-off-bg: #eef1f6;
31
+ --st-off-text: #8894a6;
32
+ --btn-disabled: #b6cbf3;
33
+ --ghost-hover: #f6f9fe;
34
+ --ghost-hover-border: #c4d3ea;
35
+ --scroll-thumb: #bfcde6;
36
+ --scroll-thumb-hover: #9fb4dc;
37
+ /* canvas + system additions */
38
+ --canvas-glow: rgba(37, 99, 235, .13);
39
+ --canvas-glow-2: rgba(56, 132, 255, .09);
40
+ --canvas-dot: rgba(37, 99, 235, .055);
41
+ --chip-bg: #eef2fa;
42
+ --seg-track: #e7edf7;
43
+ --ring: 0 0 0 3px rgba(37, 99, 235, .18);
44
+ --expand-shadow: 0 14px 40px rgba(37, 99, 235, .16);
45
+ --header-bg: color-mix(in srgb, var(--canvas) 62%, transparent);
46
+ }
47
+
48
+ /* ── тёмная тема — deep blue-navy canvas, elevated dark surfaces ── */
49
+ [data-theme="dark"] {
50
+ --bg: #0d1420;
51
+ --canvas: #0d1420;
52
+ --card: #151e2e;
53
+ --text: #e8edf7;
54
+ --muted: #8d9bb2;
55
+ --accent: #5b9bff;
56
+ --accent-dark: #a9c8ff;
57
+ --accent-hover: #74acff;
58
+ --accent-soft: rgba(91, 155, 255, .17);
59
+ --ok: #3ccf92;
60
+ --ok-soft: rgba(60, 207, 146, .15);
61
+ --warn: #e8a94e;
62
+ --warn-soft: rgba(232, 169, 78, .15);
63
+ --err: #f26d6d;
64
+ --err-soft: rgba(242, 109, 109, .15);
65
+ --border: #243149;
66
+ --shadow: 0 1px 2px rgba(0, 0, 0, .4), 0 6px 20px rgba(0, 0, 0, .34);
67
+ --shadow-lift: 0 10px 30px rgba(0, 0, 0, .5);
68
+ --ink2: #c4cede;
69
+ --border-hover: #35476a;
70
+ --eng-bg: rgba(124, 93, 250, .22);
71
+ --eng-text: #b3a3ff;
72
+ --st-resp-bg: rgba(24, 168, 110, .2);
73
+ --st-resp-text: #4ad39c;
74
+ --st-off-bg: #202a3c;
75
+ --st-off-text: #808da2;
76
+ --btn-disabled: #2b3b58;
77
+ --ghost-hover: #1b2534;
78
+ --ghost-hover-border: #364a6c;
79
+ --scroll-thumb: #2e3d56;
80
+ --scroll-thumb-hover: #435574;
81
+ --canvas-glow: rgba(64, 120, 255, .18);
82
+ --canvas-glow-2: rgba(40, 90, 200, .1);
83
+ --canvas-dot: rgba(120, 160, 255, .05);
84
+ --chip-bg: #101a2b;
85
+ --seg-track: #101a2b;
86
+ --ring: 0 0 0 3px rgba(91, 155, 255, .3);
87
+ --expand-shadow: 0 16px 44px rgba(0, 0, 0, .55);
88
+ --header-bg: color-mix(in srgb, var(--canvas) 58%, transparent);
89
+ }
90
+
91
+ /* ── кастомный скролл в стиле интерфейса (ретинтован в синий) ── */
92
+ * { scrollbar-width: thin; scrollbar-color: var(--scroll-thumb) transparent; }
93
+ ::-webkit-scrollbar { width: 10px; height: 10px; }
94
+ ::-webkit-scrollbar-track { background: transparent; }
95
+ ::-webkit-scrollbar-thumb {
96
+ background-color: var(--scroll-thumb);
97
+ border-radius: 999px;
98
+ border: 2.5px solid transparent;
99
+ background-clip: content-box;
100
+ }
101
+ ::-webkit-scrollbar-thumb:hover { background-color: var(--scroll-thumb-hover); }
102
+ ::-webkit-scrollbar-corner { background: transparent; }
103
+ * { box-sizing: border-box; }
104
+ /* NB: не ставить height:100% на body — sticky-шапка будет липнуть только в пределах первого экрана */
105
+ html, body { min-height: 100%; }
106
+ body {
107
+ margin: 0;
108
+ color: var(--text);
109
+ font: 15px/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", sans-serif;
110
+ background-color: var(--canvas);
111
+ /* themed canvas: soft blue radial glow over a faint dot grid */
112
+ background-image:
113
+ radial-gradient(1150px 560px at 50% -160px, var(--canvas-glow), transparent 68%),
114
+ radial-gradient(760px 520px at 100% 0%, var(--canvas-glow-2), transparent 60%),
115
+ radial-gradient(var(--canvas-dot) 1px, transparent 1.4px);
116
+ background-size: auto, auto, 22px 22px;
117
+ background-position: center top, right top, center top;
118
+ background-attachment: fixed, fixed, fixed;
119
+ -webkit-font-smoothing: antialiased;
120
+ }
121
+ h2 { margin: 0; font-size: 20px; font-weight: 700; letter-spacing: -.012em; }
122
+
123
+ /* ── top bar / identity header ── */
124
+ .topbar {
125
+ display: flex; align-items: center; gap: 26px;
126
+ padding: 0 24px; height: 56px;
127
+ background: var(--card);
128
+ border-bottom: 1px solid var(--border);
129
+ position: sticky; top: 0; z-index: 30;
130
+ }
131
+ /* EMBED mode: transparent, fixed identity header floating over the canvas
132
+ (no hard border/shadow) — the Work Finder briefcase identity stays visible. */
133
+ body.embed { padding-top: 56px; }
134
+ /* Uniform hub frame: full-width content + fixed identity header with a 30px gutter on all
135
+ sides (top clears the 56px fixed header via body padding-top + the .view 30px). */
136
+ body.embed .topbar { padding-left: 30px; padding-right: 30px; }
137
+ body.embed .view, body.embed #view-jobs { max-width: none; margin: 0; padding: 30px; }
138
+ body.embed .topbar {
139
+ position: fixed; top: 0; left: 0; right: 0;
140
+ background: var(--header-bg);
141
+ -webkit-backdrop-filter: saturate(1.5) blur(16px);
142
+ backdrop-filter: saturate(1.5) blur(16px);
143
+ border-bottom: 1px solid transparent;
144
+ box-shadow: none;
145
+ }
146
+
147
+ .brand {
148
+ display: flex; align-items: center; gap: 10px;
149
+ font-size: 16px; font-weight: 700; letter-spacing: -.01em;
150
+ white-space: nowrap; color: var(--text);
151
+ }
152
+ /* Match the family: a subtle accent-tinted tile with an accent-coloured glyph
153
+ (not a heavy solid-fill app icon) — same language as Investments / Business / Development. */
154
+ .brand-mark {
155
+ display: inline-flex; align-items: center; justify-content: center;
156
+ width: 32px; height: 32px; border-radius: 9px; flex: none;
157
+ color: var(--accent);
158
+ background: color-mix(in srgb, var(--accent) 14%, var(--card));
159
+ border: 1px solid color-mix(in srgb, var(--accent) 34%, var(--border));
160
+ box-shadow: none;
161
+ }
162
+ [data-theme="dark"] .brand-mark {
163
+ background: color-mix(in srgb, var(--accent) 16%, var(--card));
164
+ box-shadow: none;
165
+ }
166
+
167
+ .nav { display: flex; gap: 2px; height: 100%; }
168
+ .nav-tab {
169
+ border: 0; background: none; cursor: pointer;
170
+ font: inherit; font-weight: 500; color: var(--muted);
171
+ padding: 0 13px; height: 100%;
172
+ border-bottom: 2.5px solid transparent;
173
+ transition: color .12s;
174
+ }
175
+ .nav-tab:hover { color: var(--text); }
176
+ .nav-tab.active { color: var(--accent); border-bottom-color: var(--accent); font-weight: 650; }
177
+ .topbar-right { margin-left: auto; display: flex; align-items: center; gap: 8px; }
178
+ .pill {
179
+ font-size: 12px; padding: 4px 11px; border-radius: 999px;
180
+ background: color-mix(in srgb, var(--card) 70%, transparent);
181
+ border: 1px solid var(--border); color: var(--muted);
182
+ white-space: nowrap; font-variant-numeric: tabular-nums;
183
+ }
184
+ .pill.ok { color: var(--ok); background: var(--ok-soft); border-color: transparent; }
185
+ .pill.err { color: var(--err); background: var(--err-soft); border-color: transparent; }
186
+ .pill.busy { color: var(--warn); background: var(--warn-soft); border-color: transparent; }
187
+ .theme-btn { cursor: pointer; font-size: 13px; padding: 3px 10px; line-height: 1.4; }
188
+ .theme-btn:hover { border-color: var(--accent); color: var(--accent); }
189
+
190
+ /* EN/RU toggle — matches the Qiksy family lang-switch (small pill group, accent-active). */
191
+ .lang-switch { display: inline-flex; border: 1px solid var(--border); border-radius: 999px; overflow: hidden; }
192
+ .lang-btn {
193
+ background: transparent; border: none; color: var(--muted);
194
+ font: inherit; font-size: 11px; font-weight: 500; letter-spacing: .1em;
195
+ padding: 5px 11px; cursor: pointer; transition: color .12s, background .12s;
196
+ }
197
+ .lang-btn + .lang-btn { border-left: 1px solid var(--border); }
198
+ .lang-btn:hover { color: var(--accent); }
199
+ .lang-btn.active { background: var(--accent); color: #fff; }
200
+ /* dark: --accent brightens, so light text drops below AA — use a near-black glyph (family pattern) */
201
+ [data-theme="dark"] .lang-btn.active { color: #0a0e14; }
202
+
203
+ /* ── generic ── */
204
+ .view { max-width: 1180px; margin: 0 auto; padding: 22px 26px 64px; }
205
+ #view-jobs { max-width: 1600px; }
206
+ .view-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 6px; gap: 14px; }
207
+ .hint { color: var(--muted); font-size: 13.5px; margin: 4px 0 18px; }
208
+
209
+ .btn {
210
+ border: 1px solid transparent; border-radius: 9px; cursor: pointer;
211
+ font: inherit; font-weight: 550; padding: 8px 15px; white-space: nowrap;
212
+ transition: background .12s, border-color .12s, box-shadow .12s, transform .06s;
213
+ }
214
+ .btn:active { transform: translateY(.5px); }
215
+ .btn.primary {
216
+ background-color: var(--accent); color: #fff;
217
+ background-image: linear-gradient(180deg, rgba(255, 255, 255, .16), rgba(255, 255, 255, 0));
218
+ box-shadow: 0 1px 2px rgba(37, 99, 235, .25), 0 2px 8px rgba(37, 99, 235, .18);
219
+ }
220
+ .btn.primary:hover { background-color: var(--accent-hover); }
221
+ /* dark theme: --accent brightens, so white-on-accent drops below AA — use a deeper blue for text buttons/badge */
222
+ [data-theme="dark"] .btn.primary, [data-theme="dark"] .nav-badge { background-color: #2f6fe0; }
223
+ .btn.primary:disabled {
224
+ background-color: var(--btn-disabled); background-image: none; box-shadow: none; cursor: default;
225
+ }
226
+ .btn.big { padding: 11px 22px; font-size: 15.5px; border-radius: 11px; }
227
+ .btn.ghost { background: var(--card); color: var(--text); border-color: var(--border); box-shadow: var(--shadow); }
228
+ .btn.ghost:hover { border-color: var(--ghost-hover-border); background: var(--ghost-hover); }
229
+ .btn.danger-ghost { background: none; color: var(--err); border-color: transparent; box-shadow: none; }
230
+ .btn.danger-ghost:hover { background: var(--err-soft); }
231
+ .btn.sm { padding: 5px 11px; font-size: 13px; border-radius: 8px; }
232
+
233
+ input, select, textarea {
234
+ background: var(--card); color: var(--text);
235
+ border: 1px solid var(--border); border-radius: 9px;
236
+ padding: 9px 12px; font: inherit;
237
+ transition: border-color .12s, box-shadow .12s;
238
+ }
239
+ input:focus, select:focus, textarea:focus {
240
+ outline: none; border-color: var(--accent); box-shadow: var(--ring);
241
+ }
242
+ textarea { width: 100%; resize: vertical; }
243
+
244
+ :focus-visible { outline: none; }
245
+ .btn:focus-visible, .nav-tab:focus-visible, .status-tab:focus-visible,
246
+ .pos-chip:focus-visible, .prof-chip:focus-visible, .role-chip:focus-visible,
247
+ .hist-chip:focus-visible, .theme-btn:focus-visible {
248
+ box-shadow: var(--ring);
249
+ }
250
+
251
+ /* ── search panel — recruiting console ── */
252
+ .search-panel {
253
+ position: relative;
254
+ background: var(--card); border: 1px solid var(--border); border-radius: 16px;
255
+ box-shadow: var(--shadow); padding: 16px 18px; margin-bottom: 18px;
256
+ overflow: hidden;
257
+ }
258
+ .search-panel::before {
259
+ content: ""; position: absolute; inset: 0 0 auto 0; height: 3px;
260
+ background: linear-gradient(90deg, var(--accent), transparent 75%);
261
+ opacity: .8;
262
+ }
263
+ .prof-chips { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 12px; padding-bottom: 12px; border-bottom: 1px solid var(--border); }
264
+ .prof-chip {
265
+ display: inline-flex; align-items: center; gap: 8px;
266
+ border: 1.5px solid var(--border); border-radius: 999px;
267
+ background: var(--card); color: var(--muted);
268
+ padding: 5px 14px 5px 6px; cursor: pointer; font: inherit; font-weight: 550; font-size: 13.5px;
269
+ transition: all .12s;
270
+ }
271
+ .prof-chip.all { padding: 5px 14px; }
272
+ .prof-chip:hover { border-color: var(--accent); color: var(--accent); }
273
+ .prof-chip.on { background: var(--accent-soft); border-color: var(--accent); color: var(--accent-dark); font-weight: 650; }
274
+ .prof-chip .mini-avatar {
275
+ width: 24px; height: 24px; border-radius: 50%; flex: none;
276
+ display: inline-flex; align-items: center; justify-content: center;
277
+ color: #fff; font-weight: 700; font-size: 12px;
278
+ }
279
+ .search-row { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
280
+ .pos-chips { display: contents; }
281
+ .pos-chip {
282
+ display: inline-flex; align-items: center; gap: 7px;
283
+ border: 1.5px solid var(--border); border-radius: 999px;
284
+ background: var(--card); color: var(--muted);
285
+ padding: 7px 14px; cursor: pointer; font: inherit; font-weight: 550; font-size: 14px;
286
+ transition: all .12s;
287
+ }
288
+ .pos-chip:hover { border-color: var(--accent); color: var(--accent); }
289
+ .pos-chip.on { background: var(--accent-soft); border-color: var(--accent); color: var(--accent-dark); box-shadow: 0 1px 3px rgba(37, 99, 235, .14); }
290
+ .pos-chip .dot { font-size: 15px; line-height: 1; }
291
+ .pos-chip .rm { color: inherit; opacity: 0; margin-left: 2px; font-size: 12px; transition: opacity .12s; }
292
+ .pos-chip:hover .rm { opacity: .7; }
293
+ .pos-chip .rm:hover { opacity: 1; color: var(--err); }
294
+ .chip-add {
295
+ border: 1.5px dashed var(--border-hover); border-radius: 999px; background: none;
296
+ color: var(--muted); padding: 7px 14px; cursor: pointer; font: inherit; font-size: 14px;
297
+ transition: all .12s;
298
+ }
299
+ .chip-add:hover { color: var(--accent); border-color: var(--accent); }
300
+ .add-form { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 12px; padding-top: 12px; border-top: 1px dashed var(--border); }
301
+ .add-form[hidden] { display: none; }
302
+ .add-form input[name="title"] { flex: 2 1 240px; }
303
+ .add-form input[name="keywords"] { flex: 2 1 200px; }
304
+ .search-actions { display: flex; gap: 12px; margin-top: 14px; align-items: center; flex-wrap: wrap; }
305
+ .text-filter { flex: 1; max-width: 420px; min-width: 200px; }
306
+
307
+ /* ── status tabs — refined segmented control ── */
308
+ .status-tabs {
309
+ display: inline-flex; gap: 3px; margin-bottom: 14px;
310
+ background: var(--seg-track); padding: 4px; border-radius: 12px;
311
+ max-width: 100%; overflow-x: auto;
312
+ }
313
+ .status-tab {
314
+ border: 0; background: none; cursor: pointer; font: inherit;
315
+ color: var(--muted); font-weight: 550; font-size: 13.5px;
316
+ padding: 7px 13px; border-radius: 8px; white-space: nowrap;
317
+ display: inline-flex; align-items: center; transition: color .12s, background .12s;
318
+ }
319
+ .status-tab:hover { color: var(--text); }
320
+ .status-tab.on {
321
+ color: var(--accent-dark); background: var(--card); font-weight: 650;
322
+ box-shadow: 0 1px 2px rgba(23, 43, 77, .12);
323
+ }
324
+ .status-tab .n {
325
+ font-size: 11.5px; background: var(--chip-bg); border-radius: 999px;
326
+ padding: 1px 7px; margin-left: 6px; color: var(--muted);
327
+ font-variant-numeric: tabular-nums;
328
+ }
329
+ .status-tab.on .n { background: var(--accent-soft); color: var(--accent-dark); }
330
+
331
+ /* ── filter bar ── */
332
+ .filter-bar { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin-bottom: 14px; }
333
+ .filter-bar select { font-size: 13.5px; padding: 7px 10px; border-radius: 9px; color: var(--muted); background: var(--card); }
334
+ .filter-bar select.active { color: var(--accent-dark); border-color: var(--accent); background: var(--accent-soft); }
335
+
336
+ /* ── история поисков (хлебные крошки) ── */
337
+ .history-row[hidden] { display: none; }
338
+ .history-row {
339
+ display: flex; gap: 7px; align-items: center;
340
+ overflow-x: auto; padding-bottom: 4px; margin-bottom: 12px;
341
+ }
342
+ .hist-chip {
343
+ flex: none; display: inline-flex; align-items: center; gap: 6px;
344
+ border: 1.5px solid var(--border); border-radius: 999px;
345
+ background: var(--card); color: var(--muted);
346
+ padding: 5px 12px; cursor: pointer; font: inherit; font-size: 12.5px;
347
+ white-space: nowrap; transition: all .12s;
348
+ }
349
+ .hist-chip:hover { border-color: var(--accent); color: var(--accent); }
350
+ .hist-chip.on { background: var(--accent-soft); border-color: var(--accent); color: var(--accent-dark); font-weight: 650; }
351
+ .hist-chip .n { font-weight: 700; font-variant-numeric: tabular-nums; }
352
+
353
+ /* ── сетка карточек; клик разворачивает карточку в превью на 2 колонки ── */
354
+ .vlist {
355
+ display: grid;
356
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
357
+ grid-auto-rows: 178px; /* жёсткая сетка: все плитки одной высоты */
358
+ gap: 12px;
359
+ align-content: start;
360
+ grid-auto-flow: dense; /* остальные карточки обтекают развёрнутую */
361
+ }
362
+ .empty-list { grid-column: 1 / -1; text-align: center; color: var(--muted); padding: 72px 0; font-size: 14.5px; }
363
+
364
+ .vcard {
365
+ position: relative;
366
+ background: var(--card); border: 1px solid var(--border); border-radius: 14px;
367
+ padding: 14px 32px 13px 15px; cursor: pointer; box-shadow: var(--shadow);
368
+ display: flex; gap: 13px; transition: border-color .12s, box-shadow .12s, transform .12s;
369
+ }
370
+ .vcard:not(.expanded):hover {
371
+ border-color: var(--border-hover); box-shadow: var(--shadow-lift); transform: translateY(-2px);
372
+ }
373
+ .vcard.fresh { animation: vland .5s ease-out; }
374
+ @keyframes vland {
375
+ from { transform: translateY(-8px) scale(.97); opacity: 0; }
376
+ to { transform: none; opacity: 1; }
377
+ }
378
+ .vcard .zoom {
379
+ position: absolute; top: 8px; right: 8px;
380
+ border: 0; background: none; cursor: pointer; font-size: 15px; line-height: 1;
381
+ color: var(--muted); padding: 4px 6px; border-radius: 7px;
382
+ }
383
+ .vcard .zoom:hover { color: var(--accent); background: var(--accent-soft); }
384
+ .vcard:not(.expanded) .zoom { opacity: 0; transition: opacity .12s; }
385
+ .vcard:hover .zoom { opacity: 1; }
386
+
387
+ /* развёрнутая карточка = превью-мод: ровно 2 колонки × 3 ряда сетки, внутри — скролл */
388
+ .vcard.expanded {
389
+ grid-column: span 2;
390
+ grid-row: span 3;
391
+ overflow-y: auto;
392
+ cursor: default;
393
+ flex-direction: column;
394
+ border-color: color-mix(in srgb, var(--accent) 55%, var(--border));
395
+ box-shadow: var(--expand-shadow);
396
+ padding: 22px 24px;
397
+ animation: vexpand .16s ease-out;
398
+ }
399
+ @keyframes vexpand { from { transform: scale(.97); opacity: .6; } to { transform: scale(1); opacity: 1; } }
400
+ .vcard.expanded .zoom {
401
+ /* прилипает к верху при внутреннем скролле превью */
402
+ position: sticky; top: 0; align-self: flex-end;
403
+ order: -1; margin: -8px -10px -22px 0; z-index: 2;
404
+ font-size: 14px; background: var(--card);
405
+ }
406
+ @media (max-width: 700px) {
407
+ .vcard.expanded { grid-column: auto; }
408
+ }
409
+ .avatar {
410
+ width: 44px; height: 44px; border-radius: 11px; flex: none;
411
+ display: flex; align-items: center; justify-content: center;
412
+ color: #fff; font-weight: 700; font-size: 17px;
413
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .12);
414
+ }
415
+ /* компактная карточка — плитка 1×1, растягивается ровно в ячейку сетки */
416
+ .vcard:not(.expanded) { height: 100%; }
417
+ .vcard-body { min-width: 0; flex: 1; display: flex; flex-direction: column; }
418
+ .vcard .title { font-weight: 650; font-size: 15px; line-height: 1.32; letter-spacing: -.01em; }
419
+ .vcard:not(.expanded) .title {
420
+ display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
421
+ }
422
+ .vcard .company { color: var(--muted); font-size: 13.5px; margin-top: 2px; }
423
+ .vcard:not(.expanded) .company {
424
+ display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
425
+ }
426
+ .vcard .meta { display: flex; flex-wrap: wrap; gap: 5px; margin-top: 8px; }
427
+ .vcard:not(.expanded) .meta { max-height: 22px; overflow: hidden; } /* одна строка тегов */
428
+ .vcard .foot {
429
+ display: flex; align-items: center; gap: 8px; margin-top: auto; padding-top: 9px;
430
+ font-size: 12px; color: var(--muted); font-variant-numeric: tabular-nums;
431
+ }
432
+
433
+ .tag {
434
+ font-size: 11.5px; font-weight: 550; padding: 2.5px 8px; border-radius: 7px;
435
+ background: var(--chip-bg); color: var(--muted); white-space: nowrap;
436
+ max-width: 100%; overflow: hidden; text-overflow: ellipsis; /* длинные значения не вылезают из карточки */
437
+ }
438
+ .dmeta .tag { white-space: normal; overflow: visible; text-overflow: clip; } /* в превью — переносим, показываем целиком */
439
+ .tag.remote { background: var(--ok-soft); color: var(--ok); }
440
+ .tag.salary { background: var(--warn-soft); color: var(--warn); font-variant-numeric: tabular-nums; }
441
+ .tag.eng { background: var(--eng-bg); color: var(--eng-text); }
442
+
443
+ .st {
444
+ font-size: 11px; font-weight: 700; padding: 3px 10px; border-radius: 999px;
445
+ white-space: nowrap; letter-spacing: .01em; text-transform: uppercase;
446
+ }
447
+ .st-new { background: var(--accent-soft); color: var(--accent-dark); }
448
+ .st-prepared { background: var(--eng-bg); color: var(--eng-text); }
449
+ .st-ready { background: var(--warn-soft); color: var(--warn); }
450
+ .st-sent { background: var(--ok-soft); color: var(--ok); }
451
+ .st-answered, .st-interview { background: var(--st-resp-bg); color: var(--st-resp-text); }
452
+ .st-rejected, .st-hidden { background: var(--st-off-bg); color: var(--st-off-text); }
453
+
454
+ /* ── detail-содержимое (внутри развёрнутой карточки и в лидах) ── */
455
+ .dhead { display: flex; gap: 14px; align-items: flex-start; }
456
+ .dhead .avatar { width: 52px; height: 52px; font-size: 21px; border-radius: 13px; }
457
+ .dhead h3 { margin: 0; font-size: 19px; line-height: 1.3; font-weight: 700; letter-spacing: -.015em; }
458
+ .dhead .company { color: var(--muted); margin-top: 3px; }
459
+ .dmeta { display: flex; flex-wrap: wrap; gap: 6px; margin: 14px 0; }
460
+ .dsection { margin-top: 18px; }
461
+ .dsection > .lbl {
462
+ font-size: 11.5px; font-weight: 700; text-transform: uppercase; letter-spacing: .06em;
463
+ color: var(--muted); margin-bottom: 7px;
464
+ }
465
+ .dnotes { font-size: 14px; color: var(--ink2); background: var(--chip-bg); border-radius: 11px; padding: 12px 14px; }
466
+ .dactions { display: flex; flex-wrap: wrap; gap: 9px; margin-top: 18px; }
467
+ .dfoot {
468
+ display: flex; align-items: center; gap: 10px; margin-top: 22px; padding-top: 14px;
469
+ border-top: 1px solid var(--border);
470
+ }
471
+ .dfoot .spacer { flex: 1; }
472
+ .apply-box { background: var(--warn-soft); border-radius: 11px; padding: 12px 14px; font-size: 13.5px; color: var(--warn); }
473
+ .apply-box.done { background: var(--ok-soft); color: var(--ok); }
474
+ .letter-area textarea { font-size: 14px; line-height: 1.55; }
475
+ .letter-actions { display: flex; gap: 8px; margin-top: 8px; }
476
+
477
+ /* ── onboarding ── */
478
+ .onboard .lbl { font-size: 11.5px; font-weight: 700; text-transform: uppercase; letter-spacing: .06em; color: var(--muted); }
479
+ .role-grid { display: flex; flex-wrap: wrap; gap: 7px; }
480
+ .role-chip {
481
+ display: inline-flex; align-items: center; gap: 6px;
482
+ border: 1.5px solid var(--border); border-radius: 999px;
483
+ background: var(--card); color: var(--muted);
484
+ padding: 6px 12px; cursor: pointer; font-size: 13px; user-select: none; transition: all .12s;
485
+ }
486
+ .role-chip:hover { border-color: var(--accent); color: var(--accent); }
487
+ .role-chip.on { background: var(--accent-soft); border-color: var(--accent); color: var(--accent-dark); font-weight: 650; }
488
+ .role-chip .g { font-size: 10.5px; opacity: .6; }
489
+
490
+ /* ── leads ── */
491
+ .lead-card {
492
+ background: var(--card); border: 1px solid var(--border); border-radius: 16px;
493
+ box-shadow: var(--shadow); padding: 17px 19px; margin-bottom: 12px;
494
+ transition: border-color .12s, box-shadow .12s;
495
+ }
496
+ .lead-card:hover { border-color: var(--border-hover); box-shadow: var(--shadow-lift); }
497
+ .lead-card h3 a { color: var(--text); text-decoration: none; }
498
+ .lead-card h3 a:hover { color: var(--accent); }
499
+ .lead-card .dnotes { margin-top: 10px; }
500
+ .lead-card .dactions { margin-top: 12px; align-items: center; }
501
+ .nav-badge {
502
+ font-size: 11px; background: var(--accent); color: #fff;
503
+ border-radius: 999px; padding: 1px 6px; margin-left: 3px; vertical-align: 2px;
504
+ font-variant-numeric: tabular-nums;
505
+ }
506
+ .nav-badge:empty { display: none; }
507
+
508
+ /* ── profiles ── */
509
+ .profile-card {
510
+ background: var(--card); border: 1px solid var(--border); border-radius: 16px;
511
+ box-shadow: var(--shadow); padding: 18px 20px; margin-bottom: 14px;
512
+ }
513
+ .profile-card .row { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 10px; }
514
+ .profile-card .row input { flex: 1 1 200px; }
515
+ .profile-card summary { cursor: pointer; color: var(--muted); font-size: 13.5px; margin: 6px 0 8px; }
516
+ .profile-card .actions { display: flex; gap: 8px; margin-top: 10px; }
517
+
518
+ /* ── settings ── */
519
+ .settings-card {
520
+ background: var(--card); border: 1px solid var(--border); border-radius: 16px;
521
+ box-shadow: var(--shadow); padding: 24px 26px; max-width: 640px;
522
+ display: flex; flex-direction: column; gap: 16px;
523
+ }
524
+ .settings-card label { display: flex; flex-direction: column; gap: 6px; font-size: 13.5px; font-weight: 550; color: var(--ink2); }
525
+ /* the flex label above would otherwise override [hidden]; keep hidden blocks (e.g. wallet on non-wallet plans) hidden */
526
+ #wallet-box[hidden], .settings-card label[hidden] { display: none; }
527
+ .settings-card .checkbox { flex-direction: row; align-items: flex-start; gap: 9px; font-weight: 400; }
528
+ .settings-card .checkbox input { margin-top: 3px; accent-color: var(--accent); }
529
+ .settings-card button { align-self: flex-start; }
530
+
531
+ /* ── jobs widget ── */
532
+ .jobs-widget {
533
+ position: fixed; right: 20px; bottom: 20px; width: 340px; z-index: 60;
534
+ background: var(--card); border: 1px solid var(--border); border-radius: 16px;
535
+ box-shadow: 0 12px 38px rgba(23, 43, 77, .2); overflow: hidden;
536
+ }
537
+ [data-theme="dark"] .jobs-widget { box-shadow: 0 14px 44px rgba(0, 0, 0, .6); }
538
+ .jobs-widget-head {
539
+ display: flex; justify-content: space-between; align-items: center;
540
+ padding: 11px 15px; cursor: pointer; font-weight: 650; font-size: 14px;
541
+ color: #fff;
542
+ background: linear-gradient(135deg, var(--accent), var(--accent-dark));
543
+ }
544
+ [data-theme="dark"] .jobs-widget-head { background: linear-gradient(135deg, #3f77e6, #2a5bc4); }
545
+ .wprogress { height: 3px; background: var(--accent-soft); overflow: hidden; }
546
+ .wprogress div {
547
+ height: 100%; width: 40%; background: var(--accent);
548
+ animation: wslide 1.3s ease-in-out infinite;
549
+ }
550
+ @keyframes wslide { from { transform: translateX(-110%); } to { transform: translateX(360%); } }
551
+ #jobs-widget-body { max-height: 300px; overflow-y: auto; padding: 8px 12px; }
552
+ .job-row { padding: 7px 4px; border-bottom: 1px solid var(--border); font-size: 13px; }
553
+ .job-row:last-child { border-bottom: 0; }
554
+ .job-row .label { font-weight: 600; }
555
+ .job-row .log {
556
+ font: 11px/1.5 ui-monospace, SFMono-Regular, Menlo, monospace;
557
+ color: var(--muted); white-space: pre-wrap; word-break: break-all;
558
+ margin-top: 3px; max-height: 80px; overflow-y: auto;
559
+ }
560
+ .job-row.error .label { color: var(--err); }
561
+ .job-row.cancelled .label { color: var(--muted); }
562
+ .spin { display: inline-block; animation: spin 1.1s linear infinite; }
563
+ @keyframes spin { to { transform: rotate(360deg); } }
564
+
565
+ /* ══════════ KEY GATE — landing vs app ══════════
566
+ body.gated is set BEFORE first paint (JS) so nothing flashes. These rules are the
567
+ authoritative show/hide; the JS hidden attributes just mirror them. !important on
568
+ the hide rules survives the 2.5s poll (renderJobsWidget may drop [hidden]). */
569
+ body.gated .nav,
570
+ body.gated #credits-pill,
571
+ body.gated #browser-status { display: none; }
572
+ body.gated main.view { display: none !important; }
573
+ body.gated #view-landing { display: block !important; }
574
+ body.gated #jobs-widget { display: none !important; }
575
+ body:not(.gated) #view-landing { display: none !important; }
576
+
577
+ /* ── toast ── */
578
+ .wf-toast {
579
+ position: fixed; left: 50%; bottom: 26px; transform: translate(-50%, 16px);
580
+ z-index: 90; max-width: min(92vw, 460px);
581
+ background: var(--card); color: var(--text);
582
+ border: 1px solid var(--border); border-radius: 12px;
583
+ box-shadow: var(--shadow-lift); padding: 12px 18px;
584
+ font-size: 14px; font-weight: 550; opacity: 0; pointer-events: none;
585
+ transition: opacity .18s, transform .18s;
586
+ }
587
+ .wf-toast.show { opacity: 1; transform: translate(-50%, 0); }
588
+ .wf-toast.ok { border-left: 4px solid var(--ok); }
589
+ .wf-toast.err { border-left: 4px solid var(--err); }
590
+
591
+ /* ══════════ LANDING ══════════ */
592
+ .landing { max-width: 1080px; }
593
+ body.embed .landing { max-width: none; } /* embed = full-width 30px frame (inherited from .view) */
594
+ .landing h1, .landing h2, .landing h3, .landing p, .landing ol { margin: 0; }
595
+ .landing .lp-section { margin-top: 56px; }
596
+
597
+ .lp-topline { display: flex; align-items: center; justify-content: space-between; gap: 14px; }
598
+ .lp-badge {
599
+ display: inline-flex; align-items: center; gap: 8px;
600
+ font-size: 12.5px; font-weight: 600; letter-spacing: .02em;
601
+ color: var(--accent-dark); background: var(--accent-soft);
602
+ border: 1px solid color-mix(in srgb, var(--accent) 30%, var(--border));
603
+ border-radius: 999px; padding: 5px 13px;
604
+ }
605
+ .lp-badge-dot {
606
+ width: 8px; height: 8px; border-radius: 50%; background: var(--accent);
607
+ box-shadow: 0 0 0 0 color-mix(in srgb, var(--accent) 55%, transparent);
608
+ animation: lpPulse 1.8s ease-out infinite;
609
+ }
610
+ @keyframes lpPulse {
611
+ 0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--accent) 45%, transparent); }
612
+ 70% { box-shadow: 0 0 0 7px transparent; }
613
+ 100% { box-shadow: 0 0 0 0 transparent; }
614
+ }
615
+ .lp-lang { flex: none; }
616
+
617
+ /* ── hero ── */
618
+ .lp-hero {
619
+ display: grid; grid-template-columns: 1.15fr .85fr; gap: 40px; align-items: center;
620
+ margin-top: 30px;
621
+ }
622
+ .lp-title { font-size: clamp(30px, 4.4vw, 46px); line-height: 1.06; font-weight: 800; letter-spacing: -.025em; }
623
+ .lp-sub { margin-top: 18px; font-size: 16.5px; line-height: 1.55; color: var(--ink2); max-width: 34em; }
624
+ .lp-hero-cta { margin-top: 26px; display: flex; flex-wrap: wrap; align-items: center; gap: 14px; }
625
+ .lp-hero-note { font-size: 13px; color: var(--muted); }
626
+
627
+ .lp-hero-art { display: flex; justify-content: center; }
628
+ .lp-run {
629
+ width: 100%; max-width: 360px;
630
+ background: var(--card); border: 1px solid var(--border); border-radius: 16px;
631
+ box-shadow: var(--expand-shadow); overflow: hidden;
632
+ }
633
+ .lp-run-head {
634
+ display: flex; align-items: center; gap: 9px;
635
+ padding: 12px 16px; color: #fff; font-weight: 650; font-size: 14px;
636
+ background: linear-gradient(135deg, var(--accent), var(--accent-dark));
637
+ }
638
+ [data-theme="dark"] .lp-run-head { background: linear-gradient(135deg, #3f77e6, #2a5bc4); }
639
+ .lp-run-dot { width: 9px; height: 9px; border-radius: 50%; background: #fff; opacity: .9; animation: lpPulse 1.8s ease-out infinite; }
640
+ .lp-run-row {
641
+ display: flex; align-items: center; gap: 10px;
642
+ padding: 12px 16px; font-size: 13.5px; color: var(--ink2);
643
+ border-top: 1px solid var(--border);
644
+ }
645
+ .lp-run-row.done { color: var(--ok); font-weight: 600; }
646
+
647
+ /* ── section headings ── */
648
+ .lp-h2 { font-size: clamp(22px, 2.6vw, 28px); font-weight: 750; letter-spacing: -.02em; }
649
+ .lp-lead { margin-top: 12px; font-size: 15.5px; line-height: 1.55; color: var(--muted); max-width: 60ch; }
650
+
651
+ /* ── how it works — steps ── */
652
+ .lp-steps {
653
+ margin-top: 26px; display: grid; gap: 16px;
654
+ grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
655
+ }
656
+ .lp-step {
657
+ position: relative;
658
+ background: var(--card); border: 1px solid var(--border); border-radius: 16px;
659
+ box-shadow: var(--shadow); padding: 20px 20px 18px;
660
+ display: flex; flex-direction: column;
661
+ }
662
+ .lp-step-n {
663
+ width: 30px; height: 30px; border-radius: 9px; flex: none;
664
+ display: inline-flex; align-items: center; justify-content: center;
665
+ font-weight: 700; font-size: 15px; color: var(--accent);
666
+ background: color-mix(in srgb, var(--accent) 13%, var(--card));
667
+ border: 1px solid color-mix(in srgb, var(--accent) 32%, var(--border));
668
+ margin-bottom: 14px;
669
+ }
670
+ .lp-step-title { font-size: 16.5px; font-weight: 700; letter-spacing: -.01em; }
671
+ .lp-step-text { margin-top: 7px; font-size: 13.8px; line-height: 1.5; color: var(--muted); }
672
+
673
+ /* ── mockups (invented, neutral data) ── */
674
+ .lp-mock {
675
+ margin-top: 16px; background: var(--canvas);
676
+ border: 1px solid var(--border); border-radius: 12px; padding: 13px;
677
+ }
678
+ .lp-ava {
679
+ width: 34px; height: 34px; border-radius: 9px; flex: none;
680
+ display: inline-flex; align-items: center; justify-content: center;
681
+ color: #fff; font-weight: 700; font-size: 14px;
682
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25);
683
+ }
684
+ .lp-mock-profile .lp-pc-head { display: flex; align-items: center; gap: 11px; }
685
+ .lp-pc-name { font-weight: 650; font-size: 14px; }
686
+ .lp-pc-sub { font-size: 12px; color: var(--muted); margin-top: 1px; }
687
+ .lp-chips { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 12px; }
688
+ .lp-chip {
689
+ font-size: 12px; font-weight: 550; padding: 4px 11px; border-radius: 999px;
690
+ border: 1.5px solid var(--border); color: var(--muted); background: var(--card);
691
+ }
692
+ .lp-chip.on { background: var(--accent-soft); border-color: var(--accent); color: var(--accent-dark); }
693
+
694
+ .lp-scan-row { display: flex; align-items: center; gap: 9px; font-size: 13px; color: var(--ink2); font-weight: 550; }
695
+ .lp-scan-bars { margin-top: 12px; display: flex; flex-direction: column; gap: 7px; }
696
+ .lp-scan-bars i {
697
+ display: block; height: 8px; border-radius: 999px;
698
+ background: linear-gradient(90deg, var(--accent), color-mix(in srgb, var(--accent) 30%, var(--card)));
699
+ opacity: .75;
700
+ }
701
+
702
+ .lp-mock-grid { display: flex; flex-direction: column; gap: 8px; }
703
+ .lp-vcard {
704
+ display: flex; align-items: center; gap: 10px;
705
+ background: var(--card); border: 1px solid var(--border); border-radius: 10px; padding: 9px 11px;
706
+ }
707
+ .lp-vc-body { min-width: 0; flex: 1; }
708
+ .lp-vc-title { font-weight: 650; font-size: 13px; line-height: 1.25; }
709
+ .lp-vc-co { font-size: 11.5px; color: var(--muted); margin-top: 1px; }
710
+ .lp-vc-tags { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 5px; }
711
+ .lp-tag {
712
+ font-size: 10.5px; font-weight: 550; padding: 2px 7px; border-radius: 6px;
713
+ background: var(--chip-bg); color: var(--muted); white-space: nowrap;
714
+ }
715
+ .lp-tag.remote { background: var(--ok-soft); color: var(--ok); }
716
+ .lp-tag.sal { background: var(--warn-soft); color: var(--warn); }
717
+ .lp-st {
718
+ flex: none; font-size: 9.5px; font-weight: 700; letter-spacing: .01em; text-transform: uppercase;
719
+ padding: 3px 9px; border-radius: 999px; white-space: nowrap;
720
+ }
721
+
722
+ .lp-lbl { font-size: 10.5px; font-weight: 700; text-transform: uppercase; letter-spacing: .06em; color: var(--muted); }
723
+ .lp-letter-lines { margin-top: 10px; display: flex; flex-direction: column; gap: 7px; }
724
+ .lp-letter-lines i { display: block; height: 7px; border-radius: 999px; background: var(--seg-track); }
725
+ .lp-letter-actions { margin-top: 14px; display: flex; flex-wrap: wrap; gap: 8px; }
726
+ .lp-btn {
727
+ font-size: 11.5px; font-weight: 600; padding: 6px 12px; border-radius: 8px; white-space: nowrap;
728
+ border: 1px solid var(--border); background: var(--card); color: var(--text);
729
+ }
730
+ .lp-btn.primary { background: var(--accent); color: #fff; border-color: transparent; }
731
+ [data-theme="dark"] .lp-btn.primary { background: #2f6fe0; }
732
+
733
+ /* ── search principle ── */
734
+ .lp-principle-grid {
735
+ margin-top: 24px; display: grid; gap: 16px;
736
+ grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
737
+ }
738
+ .lp-pcol {
739
+ background: var(--card); border: 1px solid var(--border); border-radius: 16px;
740
+ box-shadow: var(--shadow); padding: 22px 22px;
741
+ }
742
+ .lp-pcol-icon {
743
+ width: 42px; height: 42px; border-radius: 11px; margin-bottom: 12px;
744
+ display: inline-flex; align-items: center; justify-content: center; font-size: 21px;
745
+ background: var(--accent-soft); border: 1px solid color-mix(in srgb, var(--accent) 26%, var(--border));
746
+ }
747
+ .lp-pcol h3 { font-size: 16px; font-weight: 700; }
748
+ .lp-pcol p { margin-top: 8px; font-size: 13.8px; line-height: 1.55; color: var(--muted); }
749
+ .lp-filters { margin-top: 20px; display: flex; flex-wrap: wrap; align-items: center; gap: 9px; }
750
+ .lp-filters-lbl { font-size: 13px; font-weight: 600; color: var(--ink2); }
751
+ .lp-fchip {
752
+ font-size: 12.5px; font-weight: 550; padding: 6px 13px; border-radius: 999px;
753
+ background: var(--chip-bg); color: var(--ink2); border: 1px solid var(--border);
754
+ }
755
+
756
+ /* ── benefits ── */
757
+ .lp-benefits {
758
+ margin-top: 24px; display: grid; gap: 14px;
759
+ grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
760
+ }
761
+ .lp-benefit {
762
+ background: var(--card); border: 1px solid var(--border); border-radius: 15px;
763
+ box-shadow: var(--shadow); padding: 20px;
764
+ }
765
+ .lp-benefit-icon { font-size: 24px; line-height: 1; }
766
+ .lp-benefit h3 { margin-top: 12px; font-size: 15.5px; font-weight: 700; }
767
+ .lp-benefit p { margin-top: 6px; font-size: 13.5px; line-height: 1.5; color: var(--muted); }
768
+
769
+ /* ── connect key ── */
770
+ .lp-connect-card {
771
+ position: relative; overflow: hidden;
772
+ background: var(--card); border: 1px solid var(--border); border-radius: 20px;
773
+ box-shadow: var(--shadow-lift); padding: 30px 32px; max-width: 620px;
774
+ }
775
+ .lp-connect-card::before {
776
+ content: ""; position: absolute; inset: 0 0 auto 0; height: 4px;
777
+ background: linear-gradient(90deg, var(--accent), transparent 75%);
778
+ }
779
+ .lp-inst {
780
+ margin-top: 18px; padding-left: 20px; display: flex; flex-direction: column; gap: 8px;
781
+ font-size: 14px; line-height: 1.5; color: var(--ink2);
782
+ }
783
+ .lp-inst li { padding-left: 4px; }
784
+ .lp-console { margin-top: 16px; display: inline-flex; }
785
+ .lp-key-row { margin-top: 20px; display: flex; flex-wrap: wrap; gap: 10px; }
786
+ .lp-key-row input { flex: 1; min-width: 220px; font-variant-numeric: tabular-nums; }
787
+ .lp-key-note { margin-top: 12px; font-size: 12.5px; color: var(--muted); }
788
+
789
+ /* ── responsive ── */
790
+ @media (max-width: 920px) {
791
+ .topbar { gap: 12px; padding: 0 14px; }
792
+ .view { padding: 16px 14px 56px; }
793
+ }
794
+ @media (max-width: 760px) {
795
+ .lp-hero { grid-template-columns: 1fr; gap: 26px; }
796
+ .lp-hero-art { order: -1; }
797
+ .landing .lp-section { margin-top: 44px; }
798
+ }
799
+
800
+ /* ══════════ SLICE 2: onboarding · resume builder · tiers ══════════ */
801
+
802
+ /* progressive disclosure — hide rules must be explicit (flex/inline-flex override [hidden]) */
803
+ #status-tabs[hidden] { display: none; }
804
+ .filter-bar[hidden] { display: none; }
805
+ #text-filter[hidden] { display: none; }
806
+ .vlist[hidden] { display: none; }
807
+ #search-panel[hidden] { display: none; }
808
+ #jobs-onboard[hidden] { display: none; }
809
+
810
+ /* ── zero-profile onboarding card ── */
811
+ .jobs-onboard { display: flex; justify-content: center; padding: 32px 0; }
812
+ .jo-card {
813
+ width: 100%; max-width: 560px; text-align: center;
814
+ background: var(--card); border: 1px solid var(--border); border-radius: 18px;
815
+ box-shadow: var(--shadow-lift); padding: 34px 30px;
816
+ }
817
+ .jo-icon {
818
+ width: 52px; height: 52px; border-radius: 14px; margin: 0 auto 16px;
819
+ display: flex; align-items: center; justify-content: center; font-size: 26px;
820
+ background: var(--accent-soft); border: 1px solid color-mix(in srgb, var(--accent) 26%, var(--border));
821
+ }
822
+ .jo-card h2 { font-size: 22px; letter-spacing: -.02em; }
823
+ .jo-sub { color: var(--muted); font-size: 14.5px; line-height: 1.55; margin: 10px 0 22px; }
824
+ .jo-form { display: flex; flex-direction: column; gap: 10px; text-align: left; }
825
+ .jo-form .btn { align-self: stretch; margin-top: 4px; }
826
+ #jobs-onboard-builder { margin-top: 14px; }
827
+
828
+ /* ── plan badge (Free / Pro) ── */
829
+ .view-head-actions { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
830
+ .plan-badge {
831
+ font-size: 11px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase;
832
+ padding: 3px 10px; border-radius: 999px; border: 1px solid var(--border);
833
+ }
834
+ .plan-badge:empty { display: none; }
835
+ .plan-badge.free { color: var(--muted); background: var(--chip-bg); }
836
+ .plan-badge.pro { color: #fff; background: linear-gradient(135deg, var(--accent), var(--accent-dark)); border-color: transparent; }
837
+ [data-theme="dark"] .plan-badge.pro { color: #0a0e14; }
838
+
839
+ /* ── shared modal overlay (builder + upsell) ── */
840
+ .modal-overlay {
841
+ position: fixed; inset: 0; z-index: 80;
842
+ display: flex; align-items: center; justify-content: center; padding: 24px;
843
+ background: rgba(15, 27, 45, .5);
844
+ -webkit-backdrop-filter: blur(3px); backdrop-filter: blur(3px);
845
+ }
846
+ .modal-overlay[hidden] { display: none; }
847
+ /* appended to <body>, so body.gated's main.view rule can't reach them — gate explicitly */
848
+ body.gated #builder-overlay, body.gated #upsell-overlay { display: none !important; }
849
+ .modal-x {
850
+ position: absolute; top: 12px; right: 12px; z-index: 2;
851
+ border: 0; background: none; cursor: pointer; font-size: 16px; line-height: 1;
852
+ color: var(--muted); padding: 6px 8px; border-radius: 8px;
853
+ }
854
+ .modal-x:hover { color: var(--accent); background: var(--accent-soft); }
855
+
856
+ /* ── resume builder ── */
857
+ .builder-panel {
858
+ position: relative; width: 100%; max-width: 1040px; max-height: 90vh;
859
+ display: flex; flex-direction: column;
860
+ background: var(--card); border: 1px solid var(--border); border-radius: 18px;
861
+ box-shadow: var(--shadow-lift); overflow: hidden;
862
+ }
863
+ .builder-head {
864
+ display: flex; align-items: center; justify-content: space-between;
865
+ padding: 15px 20px; border-bottom: 1px solid var(--border);
866
+ }
867
+ .builder-head h3 { margin: 0; font-size: 17px; font-weight: 700; letter-spacing: -.01em; }
868
+ .builder-body { display: grid; grid-template-columns: 1.1fr .9fr; overflow: hidden; flex: 1; min-height: 0; }
869
+ .builder-form { overflow-y: auto; padding: 18px 20px; display: flex; flex-direction: column; gap: 18px; }
870
+ .builder-preview-wrap { border-left: 1px solid var(--border); background: var(--canvas); overflow-y: auto; padding: 18px 20px; }
871
+ .bld-lbl { font-size: 11.5px; font-weight: 700; text-transform: uppercase; letter-spacing: .06em; color: var(--muted); margin-bottom: 9px; }
872
+ .bld-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 9px; }
873
+ .bld-sec input, .bld-sec textarea { width: 100%; }
874
+ .bld-sec > input + textarea, .bld-sec > input + input { margin-top: 9px; }
875
+ .bld-ai-row, .bld-import-actions { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 9px; }
876
+ .bld-import > summary { cursor: pointer; color: var(--accent-dark); font-size: 13.5px; font-weight: 550; }
877
+ .bld-import textarea { width: 100%; margin-top: 10px; }
878
+ .bld-file-lbl { display: inline-flex; align-items: center; }
879
+ .bld-row {
880
+ border: 1px solid var(--border); border-radius: 12px; padding: 12px; margin-bottom: 10px;
881
+ background: var(--canvas);
882
+ }
883
+ .bld-row-grid { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 8px; }
884
+ .bld-row textarea { width: 100%; margin-top: 8px; }
885
+ .bld-row > [data-rm-exp], .bld-row > [data-rm-edu] { margin-top: 8px; }
886
+ .builder-foot { display: flex; gap: 10px; padding: 14px 20px; border-top: 1px solid var(--border); }
887
+
888
+ /* preview document */
889
+ .builder-preview { font-size: 13.5px; line-height: 1.5; color: var(--text); }
890
+ .rp-empty { color: var(--muted); font-size: 13.5px; }
891
+ .rp-name { font-size: 20px; font-weight: 750; letter-spacing: -.015em; }
892
+ .rp-contact { color: var(--muted); font-size: 12.5px; margin-top: 3px; }
893
+ .rp-headline { font-weight: 650; margin-top: 8px; }
894
+ .rp-h { font-size: 11.5px; font-weight: 700; text-transform: uppercase; letter-spacing: .06em; color: var(--accent-dark); margin: 16px 0 6px; }
895
+ .rp-p { margin: 0; color: var(--ink2); }
896
+ .rp-item { margin-bottom: 10px; }
897
+ .rp-item-head { font-weight: 600; }
898
+ .rp-dates { color: var(--muted); font-weight: 400; font-size: 12px; }
899
+ .rp-ul { margin: 5px 0 0; padding-left: 18px; color: var(--ink2); }
900
+ .rp-ul li { margin-bottom: 3px; }
901
+
902
+ /* ── pro upsell ── */
903
+ .upsell-card {
904
+ position: relative; width: 100%; max-width: 440px;
905
+ background: var(--card); border: 1px solid var(--border); border-radius: 18px;
906
+ box-shadow: var(--shadow-lift); padding: 30px 28px; text-align: center;
907
+ }
908
+ .upsell-badge {
909
+ display: inline-block; font-size: 11px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase;
910
+ color: #fff; background: linear-gradient(135deg, var(--accent), var(--accent-dark));
911
+ padding: 4px 12px; border-radius: 999px; margin-bottom: 14px;
912
+ }
913
+ [data-theme="dark"] .upsell-badge { color: #0a0e14; }
914
+ .upsell-card h3 { margin: 0; font-size: 20px; letter-spacing: -.02em; }
915
+ .upsell-sub { color: var(--muted); font-size: 14px; line-height: 1.55; margin: 12px 0 18px; }
916
+ .upsell-price { margin-bottom: 16px; }
917
+ .upsell-price b { font-size: 22px; }
918
+ .upsell-price span { color: var(--muted); font-size: 12.5px; }
919
+ .upsell-benefits { list-style: none; margin: 0 0 22px; padding: 0; text-align: left; display: flex; flex-direction: column; gap: 9px; }
920
+ .upsell-benefits li { position: relative; padding-left: 26px; font-size: 14px; color: var(--ink2); }
921
+ .upsell-benefits li::before { content: "✓"; position: absolute; left: 4px; color: var(--ok); font-weight: 700; }
922
+ .upsell-actions { display: flex; flex-direction: column; gap: 10px; }
923
+ .upsell-actions .btn { width: 100%; }
924
+
925
+ @media (max-width: 760px) {
926
+ .builder-panel { max-height: 94vh; }
927
+ .builder-body { grid-template-columns: 1fr; }
928
+ .builder-preview-wrap { border-left: 0; border-top: 1px solid var(--border); }
929
+ .bld-grid, .bld-row-grid { grid-template-columns: 1fr; }
930
+ }