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,760 @@
1
+ /* Travel Assistant — тёплый, редакторский travel/booking-язык.
2
+ Бирюзовая среда (sky/sea canvas), карточки-«посадочные талоны», воздушные
3
+ карточки вариантов. Две темы: светлая (дефолт) и dark (:root[data-theme="dark"]).
4
+ Все классы, которые эмитит app.js, сохранены — меняется только оформление. */
5
+
6
+ :root {
7
+ /* поверхности и текст */
8
+ --bg:#eef4f5; --card:#ffffff; --card-2:#f7fbfb;
9
+ --ink:#112a2d; --ink-2:#465d61; --ink-3:#87a0a2;
10
+ --line:#dde8e8; --line-2:#ecf3f3; --notch:#e9f2f2;
11
+
12
+ /* бирюзовая палитра среды */
13
+ --navy:#0c3f43; --navy-2:#0f5a56; /* «глубокая бирюза» — фон плашек/кнопок */
14
+ --teal:#0d9488; --accent:#0d9488; /* акцент: ссылки, активное, таймлайн */
15
+ --accent-weak:rgba(13,148,136,.12);
16
+ --hero-1:#0b3d40; --hero-2:#0f766e; /* градиентная лента hero */
17
+
18
+ /* семантика */
19
+ --gold:#b5691a; --gold-bg:#fdf1de; --green:#15803d; --green-bg:#e9f8ef; --booking:#003580;
20
+
21
+ --shadow-sm:0 1px 2px rgba(12,63,67,.05),0 2px 6px rgba(12,63,67,.06);
22
+ --shadow-md:0 6px 18px rgba(12,63,67,.10);
23
+ --shadow-lg:0 18px 40px rgba(11,61,64,.20);
24
+ --ring:0 0 0 3px rgba(13,148,136,.18);
25
+ }
26
+
27
+ * { box-sizing: border-box; }
28
+
29
+ /* НЕ height:100% — иначе sticky-топбар прилипает только в первом экране */
30
+ html, body { min-height: 100%; }
31
+
32
+ body {
33
+ margin: 0;
34
+ color: var(--ink);
35
+ font: 14px/1.5 -apple-system, BlinkMacSystemFont, "SF Pro Text", "Segoe UI", Roboto, system-ui, sans-serif;
36
+ /* многослойный sky/sea-бирюзовый холст — заливка приложения (не Cowork-артефакт) */
37
+ background-color: var(--bg);
38
+ background-image:
39
+ radial-gradient(920px 540px at 12% -8%, rgba(13,148,136,.14), transparent 62%),
40
+ radial-gradient(760px 620px at 96% 2%, rgba(45,178,172,.13), transparent 58%),
41
+ radial-gradient(1100px 720px at 50% 120%, rgba(15,118,110,.10), transparent 60%),
42
+ linear-gradient(180deg, #eef8f7 0%, #f2f8f8 46%, #ecf5f5 100%);
43
+ background-attachment: fixed;
44
+ }
45
+
46
+ /* очень тонкая текстура поверх градиента, ниже контента (negative z в стек-контексте body) */
47
+ body::before {
48
+ content: ''; position: fixed; inset: 0; z-index: -1; pointer-events: none;
49
+ background-image: radial-gradient(rgba(15,80,80,.045) 1px, transparent 1.4px);
50
+ background-size: 22px 22px;
51
+ }
52
+
53
+ /* ─── тематические скроллбары (бирюзовые) ─── */
54
+
55
+ ::-webkit-scrollbar { width: 12px; height: 12px; }
56
+ ::-webkit-scrollbar-track { background: transparent; }
57
+ ::-webkit-scrollbar-thumb { background: color-mix(in srgb, var(--accent) 48%, var(--line)); border-radius: 10px; border: 3px solid transparent; background-clip: padding-box; }
58
+ ::-webkit-scrollbar-thumb:hover { background: var(--accent); background-clip: padding-box; }
59
+ ::-webkit-scrollbar-corner { background: transparent; }
60
+
61
+ .jobs-panel::-webkit-scrollbar-thumb,
62
+ .job-log::-webkit-scrollbar-thumb,
63
+ .joblog::-webkit-scrollbar-thumb,
64
+ .block-pre::-webkit-scrollbar-thumb,
65
+ .modal::-webkit-scrollbar-thumb {
66
+ background: #cbdad9; border: 3px solid transparent; background-clip: padding-box;
67
+ }
68
+ .jobs-panel::-webkit-scrollbar-thumb:hover,
69
+ .job-log::-webkit-scrollbar-thumb:hover,
70
+ .joblog::-webkit-scrollbar-thumb:hover,
71
+ .block-pre::-webkit-scrollbar-thumb:hover,
72
+ .modal::-webkit-scrollbar-thumb:hover { background: var(--accent); }
73
+
74
+ /* цифры/даты/цены/время — табличные, чтобы колонки не «плавали» */
75
+ .bp-dates, .hero-meta, .pipe, .tl-time, .tl-chip, .price-small, .price-big, .price-extra,
76
+ .rec-total, .report-total, .rate-plate, .trip-props dd, .member-props dd {
77
+ font-variant-numeric: tabular-nums;
78
+ }
79
+
80
+ h1 { font-size: 22px; font-weight: 800; letter-spacing: -.4px; margin: 0; }
81
+
82
+ .ico { width: 16px; height: 16px; flex: none; }
83
+ .ico-14 { width: 14px; height: 14px; }
84
+ .muted { color: var(--ink-3); font-size: 12.5px; }
85
+ .mono { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
86
+
87
+ /* eyebrow / микро-метки */
88
+ .eyebrow, .bp-eyebrow, .sec-title, .settings-sec, .hero-label {
89
+ text-transform: uppercase; letter-spacing: 1.4px;
90
+ }
91
+
92
+ /* ─── топбар (только standalone; в embed скрыт) ─── */
93
+
94
+ .topbar {
95
+ position: sticky; top: 0; z-index: 50;
96
+ display: flex; align-items: center; gap: 18px;
97
+ padding: 11px 22px;
98
+ background: rgba(255,255,255,.82);
99
+ -webkit-backdrop-filter: saturate(160%) blur(10px);
100
+ backdrop-filter: saturate(160%) blur(10px);
101
+ border-bottom: 1px solid var(--line);
102
+ box-shadow: var(--shadow-sm);
103
+ }
104
+ .brand {
105
+ display: flex; align-items: center; gap: 9px;
106
+ font-size: 15.5px; font-weight: 800; letter-spacing: -.2px; color: var(--navy);
107
+ white-space: nowrap;
108
+ }
109
+ .brand-mark {
110
+ display: inline-flex; align-items: center; justify-content: center;
111
+ width: 32px; height: 32px; border-radius: 9px; flex: none;
112
+ color: var(--teal);
113
+ background: color-mix(in srgb, var(--accent) 15%, transparent);
114
+ border: 1px solid color-mix(in srgb, var(--accent) 34%, transparent);
115
+ }
116
+ .brand-mark svg { width: 18px; height: 18px; }
117
+ .tabs { display: flex; gap: 4px; flex: 1; }
118
+ .nav-tab {
119
+ padding: 7px 13px; border-radius: 9px;
120
+ color: var(--ink-2); text-decoration: none;
121
+ font-weight: 600; font-size: 13.5px;
122
+ }
123
+ .nav-tab:hover { color: var(--ink); background: var(--accent-weak); }
124
+ .nav-tab.active { color: var(--teal); background: var(--accent-weak); }
125
+ .topbar-right { display: flex; align-items: center; gap: 10px; margin-left: auto; }
126
+
127
+ /* EMBED MODE: внутри хаба топбар остаётся как ИДЕНТИЧНОСТЬ окружения —
128
+ прозрачный, фиксированный, парит над teal-канвасом (иконка+название+навигация). */
129
+ body.embed .topbar {
130
+ background: color-mix(in srgb, var(--bg) 55%, transparent);
131
+ border-bottom-color: transparent;
132
+ box-shadow: none;
133
+ backdrop-filter: blur(10px);
134
+ }
135
+ /* Uniform hub frame: full-width content + identity header with a 30px gutter on all sides.
136
+ The topbar is sticky (in flow), so the .view 30px top padding is the gap below it. */
137
+ body.embed .topbar { padding-left: 30px; padding-right: 30px; }
138
+ body.embed .view { max-width: none; margin: 0; padding: 30px; }
139
+
140
+ .browser-pill {
141
+ display: inline-flex; align-items: center; gap: 7px;
142
+ font-size: 12.5px; color: var(--ink-2);
143
+ border: 1px solid var(--line); border-radius: 999px;
144
+ padding: 4px 11px; background: var(--card); white-space: nowrap;
145
+ }
146
+ .browser-pill .dot { width: 8px; height: 8px; border-radius: 50%; background: var(--ink-3); flex: none; }
147
+ .browser-pill.on { color: var(--green); border-color: color-mix(in srgb, var(--green) 30%, var(--line)); }
148
+ .browser-pill.on .dot { background: var(--green); box-shadow: 0 0 0 3px var(--green-bg); }
149
+
150
+ /* ─── виджет джобов ─── */
151
+
152
+ #jobs-widget { position: relative; }
153
+ .jobs-toggle {
154
+ display: inline-flex; align-items: center; gap: 7px;
155
+ font: inherit; font-size: 12.5px; font-weight: 600; color: var(--ink-2);
156
+ background: var(--card); border: 1px solid var(--line); border-radius: 999px;
157
+ padding: 5px 13px; cursor: pointer; white-space: nowrap;
158
+ }
159
+ .jobs-toggle:hover { border-color: var(--teal); color: var(--teal); }
160
+ .jobs-panel {
161
+ position: absolute; right: 0; top: calc(100% + 8px);
162
+ width: 340px; max-width: 90vw; max-height: 60vh; overflow: auto;
163
+ background: var(--card); border: 1px solid var(--line); border-radius: 16px;
164
+ box-shadow: var(--shadow-lg); padding: 10px; z-index: 60;
165
+ }
166
+ .job-row { padding: 9px; border-radius: 11px; }
167
+ .job-row + .job-row { border-top: 1px solid var(--line-2); }
168
+ .job-row[data-trip]:not([data-trip=""]) { cursor: pointer; }
169
+ .job-row[data-trip]:not([data-trip=""]):hover { background: var(--card-2); }
170
+ .job-row-head { display: flex; align-items: center; gap: 8px; font-size: 12.5px; }
171
+ .job-label {
172
+ flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
173
+ font-weight: 600; color: var(--ink);
174
+ }
175
+ .job-log {
176
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 11px;
177
+ background: var(--card-2); border-radius: 8px; padding: 6px 8px; margin: 6px 0 0;
178
+ white-space: pre-wrap; word-break: break-word;
179
+ color: var(--ink-2); max-height: 90px; overflow: auto;
180
+ }
181
+
182
+ .spinner {
183
+ display: inline-block; flex: none; width: 12px; height: 12px;
184
+ border: 2px solid var(--line); border-top-color: var(--teal);
185
+ border-radius: 50%; animation: spin .8s linear infinite;
186
+ }
187
+ @keyframes spin { to { transform: rotate(360deg); } }
188
+
189
+ .progress { height: 3px; border-radius: 999px; background: var(--line-2); overflow: hidden; margin: 8px 0; }
190
+ .progress i {
191
+ display: block; height: 100%; width: 40%;
192
+ background: linear-gradient(90deg, var(--teal), #38bdb0);
193
+ border-radius: 999px;
194
+ animation: slide 1.3s ease-in-out infinite;
195
+ }
196
+ @keyframes slide { from { transform: translateX(-110%); } to { transform: translateX(360%); } }
197
+
198
+ /* ─── статус-бейджи: пастельный фон + тёмный текст ─── */
199
+
200
+ .st {
201
+ font-size: 11px; font-weight: 700; padding: 3px 10px;
202
+ border-radius: 999px; white-space: nowrap;
203
+ }
204
+ .st-draft { background: var(--line-2); color: var(--ink-2); }
205
+ .st-searching { background: var(--accent-weak); color: var(--teal); }
206
+ .st-options { background: var(--green-bg); color: var(--green); }
207
+ .st-booking { background: #f3e8ff; color: #7e22ce; }
208
+ .st-ready_to_pay { background: var(--gold-bg); color: var(--gold); }
209
+ .st-paid { background: #dcfce7; color: #166534; }
210
+ .st-cancelled { background: #fee2e2; color: #b91c1c; }
211
+
212
+ .st-job-queued { background: var(--line-2); color: var(--ink-2); }
213
+ .st-job-running { background: var(--accent-weak); color: var(--teal); }
214
+ .st-job-done { background: var(--green-bg); color: var(--green); }
215
+ .st-job-error { background: #fee2e2; color: #b91c1c; }
216
+ .st-job-cancelled { background: var(--line-2); color: var(--ink-2); }
217
+
218
+ /* ─── вью, кнопки, карточки ─── */
219
+
220
+ .view { max-width: 1080px; margin: 0 auto; padding: 26px 20px 64px; }
221
+ .view-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 18px; }
222
+
223
+ .btn {
224
+ appearance: none; display: inline-flex; align-items: center; gap: 6px;
225
+ border: 1px solid transparent; border-radius: 10px;
226
+ padding: 9px 15px; font: inherit; font-size: 13.5px; font-weight: 600;
227
+ cursor: pointer; white-space: nowrap;
228
+ transition: background .15s, border-color .15s, box-shadow .15s, transform .06s;
229
+ }
230
+ .btn.primary {
231
+ background: linear-gradient(180deg, var(--navy-2), var(--navy)); color: #fff;
232
+ box-shadow: 0 1px 2px rgba(12,63,67,.25);
233
+ }
234
+ .btn.primary:hover { background: linear-gradient(180deg, #12736d, var(--navy-2)); }
235
+ .btn.primary:active { transform: translateY(1px); }
236
+ .btn.ghost { background: var(--card); border-color: var(--line); color: var(--ink); }
237
+ .btn.ghost:hover { border-color: var(--teal); color: var(--teal); }
238
+ .btn.danger { background: var(--card); border-color: #f3d4d4; color: #b91c1c; }
239
+ .btn.danger:hover { background: #fef2f2; }
240
+ .btn.sm { padding: 6px 11px; font-size: 12.5px; border-radius: 9px; }
241
+ .btn:disabled { opacity: .45; cursor: default; pointer-events: none; }
242
+ .btn-link {
243
+ background: none; border: none; padding: 0;
244
+ color: var(--teal); cursor: pointer; font: inherit; font-size: 12px; font-weight: 600;
245
+ }
246
+ .btn-link:hover { text-decoration: underline; }
247
+
248
+ .card {
249
+ background: var(--card); border: 1px solid var(--line); border-radius: 16px;
250
+ box-shadow: var(--shadow-sm); padding: 17px 19px; margin-bottom: 14px;
251
+ }
252
+
253
+ .empty {
254
+ grid-column: 1 / -1;
255
+ color: var(--ink-3); text-align: center; padding: 44px 20px; font-size: 13.5px;
256
+ }
257
+
258
+ .back-link {
259
+ display: inline-flex; align-items: center; gap: 6px; margin-bottom: 14px;
260
+ color: var(--ink-2); text-decoration: none; font-size: 13px; font-weight: 600;
261
+ }
262
+ .back-link:hover { color: var(--teal); }
263
+
264
+ /* ─── список поездок = посадочные талоны ─── */
265
+
266
+ /* один талон = одна строка на всю ширину контейнера (маршрутная часть тянется, корешок фиксированный) */
267
+ .trips-grid { display: grid; grid-template-columns: 1fr; gap: 16px; }
268
+
269
+ /* overflow:hidden — жёсткая гарантия: что бы ни рендерилось внутри (длинные города,
270
+ статусы, имена на любом языке), за скруглённые края талона ничего не выйдет */
271
+ .trip-card {
272
+ display: flex; align-items: stretch; position: relative;
273
+ min-width: 0; overflow: hidden;
274
+ background: var(--card); border: 1px solid var(--line); border-radius: 16px;
275
+ box-shadow: var(--shadow-sm); cursor: pointer;
276
+ transition: box-shadow .16s, transform .16s, border-color .16s;
277
+ }
278
+ .trip-card:hover { box-shadow: var(--shadow-md); transform: translateY(-2px); border-color: color-mix(in srgb, var(--teal) 24%, var(--line)); }
279
+
280
+ .bp-route { flex: 1; min-width: 0; padding: 16px 8px 16px 18px; }
281
+ .bp-eyebrow { font-size: 9.5px; font-weight: 700; color: var(--ink-3); margin-bottom: 9px; }
282
+ .bp-cities { display: flex; align-items: center; gap: 6px; min-width: 0; }
283
+ .bp-end { min-width: 0; flex: 0 1 auto; }
284
+ .bp-end-to { text-align: right; }
285
+ .bp-city {
286
+ font-size: 20px; font-weight: 800; letter-spacing: -.4px; line-height: 1.1;
287
+ color: var(--ink); white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
288
+ }
289
+ .bp-sub { font-size: 9.5px; text-transform: uppercase; letter-spacing: 1px; color: var(--ink-3); margin-top: 3px; }
290
+
291
+ .bp-path { position: relative; flex: 1; min-width: 42px; height: 20px; display: flex; align-items: center; justify-content: center; }
292
+ .bp-path::before {
293
+ content: ''; position: absolute; left: 2px; right: 2px; top: 50%; height: 2px; transform: translateY(-50%);
294
+ background-image: linear-gradient(90deg, var(--teal) 58%, transparent 0);
295
+ background-size: 7px 2px; opacity: .5;
296
+ }
297
+ .bp-plane {
298
+ position: relative; flex: none; width: 20px; height: 20px; color: var(--teal);
299
+ transform: rotate(45deg); background: var(--card); padding: 0 3px;
300
+ }
301
+ .bp-dates {
302
+ display: flex; align-items: center; flex-wrap: wrap; gap: 4px 6px; margin-top: 12px;
303
+ color: var(--ink-2); font-size: 12.5px; font-weight: 600;
304
+ }
305
+ .bp-dates .ico { color: var(--teal); }
306
+
307
+ /* перфорация-разделитель между маршрутом и корешком.
308
+ Без псевдо-«вырубок»: кружки цвета фона вылезали за карточку и на тёмном/узорном
309
+ фоне рабочего стола читались как артефакты — пунктирной линии достаточно. */
310
+ .bp-perf {
311
+ position: relative; flex: none; width: 2px; align-self: stretch; margin: 10px 0;
312
+ background-image: linear-gradient(var(--line) 55%, transparent 0);
313
+ background-size: 2px 8px; background-repeat: repeat-y; background-position: center;
314
+ }
315
+
316
+ /* корешок автоширины: фиксированные 158px обрезали русские лейблы статуса
317
+ («ВАРИАНТЫ ГОТОВЫ» вылезал за карточку) */
318
+ .bp-stub {
319
+ flex: none; width: auto; min-width: 158px; max-width: 260px; padding: 16px 18px;
320
+ display: flex; flex-direction: column; align-items: flex-start; gap: 9px;
321
+ }
322
+ .bp-stub .st {
323
+ align-self: flex-start; text-transform: uppercase; letter-spacing: .5px;
324
+ box-shadow: inset 0 0 0 1px currentColor; background: transparent;
325
+ max-width: 100%; overflow: hidden; text-overflow: ellipsis; /* статус длиннее корешка → многоточие, не вылет */
326
+ }
327
+ .bp-line { display: flex; align-items: center; gap: 6px; color: var(--ink-2); font-size: 12.5px; min-width: 0; max-width: 100%; }
328
+ .bp-line .ico { flex: none; }
329
+ .bp-line .ico { color: var(--ink-3); }
330
+ .bp-line span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
331
+
332
+ /* ─── hero детали поездки = лента посадочного талона ─── */
333
+
334
+ .hero {
335
+ position: relative; overflow: hidden;
336
+ color: #fff; border-radius: 20px; padding: 26px 30px;
337
+ box-shadow: var(--shadow-lg); margin-bottom: 16px;
338
+ background:
339
+ url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='white' d='M21 16v-2l-8-5V3.5a1.5 1.5 0 0 0-3 0V9l-8 5v2l8-2.5V19l-2 1.5V22l3.5-1 3.5 1v-1.5L13 19v-5.5z'/%3E%3C/svg%3E") no-repeat right -14px bottom -22px / 168px,
340
+ radial-gradient(560px 200px at 88% -20%, rgba(255,255,255,.16), transparent 60%),
341
+ linear-gradient(125deg, var(--hero-1) 0%, var(--hero-2) 100%);
342
+ }
343
+ .hero::before, .hero::after {
344
+ content: ''; position: absolute; top: 50%; transform: translateY(-50%);
345
+ width: 22px; height: 22px; border-radius: 50%; background: var(--notch);
346
+ }
347
+ .hero::before { left: -11px; }
348
+ .hero::after { right: -11px; }
349
+ .hero-label {
350
+ font-size: 10.5px; font-weight: 700; opacity: .8; margin-bottom: 9px;
351
+ }
352
+ .hero-title { font-size: 27px; font-weight: 800; letter-spacing: -.6px; margin: 0 0 13px; line-height: 1.08; }
353
+ .hero-title .arrow { color: inherit; opacity: .55; font-weight: 500; }
354
+ .hero-meta { display: flex; flex-wrap: wrap; gap: 8px 20px; font-size: 13px; }
355
+ .hero-meta span { display: inline-flex; align-items: center; gap: 6px; opacity: .9; }
356
+ .hero-meta .ico { width: 15px; height: 15px; opacity: .85; }
357
+
358
+ /* ─── пайплайн статусов ─── */
359
+
360
+ .pipe { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; margin: 0 0 18px; font-size: 12px; }
361
+ .pipe-step {
362
+ font-weight: 600; padding: 4px 11px; border-radius: 999px;
363
+ color: var(--ink-3); background: var(--card); border: 1px solid var(--line);
364
+ }
365
+ .pipe-step.done { color: var(--green); background: var(--green-bg); border-color: transparent; }
366
+ .pipe-step.current { color: #fff; background: var(--teal); border-color: transparent; box-shadow: 0 2px 8px rgba(13,148,136,.32); }
367
+ /* dark theme: --teal brightens to #2dd4bf, so white text on it is illegible — use dark ink */
368
+ :root[data-theme="dark"] .pipe-step.current { color: #06201d; }
369
+ .pipe-sep { width: 14px; height: 1px; background: var(--line); flex: none; }
370
+
371
+ /* ─── резюме, notFound, ошибка ─── */
372
+
373
+ .summary { color: var(--ink-2); font-size: 13.5px; margin: 0 0 14px; }
374
+ .notfound { background: #fffbeb; color: #78350f; border-radius: 12px; padding: 11px 15px; font-size: 13px; margin-bottom: 14px; }
375
+ .error-note { background: #fef2f2; color: #b91c1c; border-radius: 12px; padding: 11px 15px; font-size: 13px; margin-bottom: 14px; }
376
+
377
+ /* ─── рекомендованная связка = тёплый баннер ─── */
378
+
379
+ .rec-plate {
380
+ position: relative; overflow: hidden;
381
+ background: linear-gradient(135deg, #fffdf6, var(--gold-bg));
382
+ border: 1px solid #f0d7a6; border-radius: 16px;
383
+ padding: 15px 17px; margin-bottom: 14px; box-shadow: var(--shadow-sm);
384
+ }
385
+ .rec-plate::before {
386
+ content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 4px;
387
+ background: linear-gradient(180deg, #e0a53c, var(--gold));
388
+ }
389
+ .rec-top { display: flex; justify-content: space-between; align-items: center; gap: 10px; margin-bottom: 7px; }
390
+ .rec-badge {
391
+ font-size: 10px; font-weight: 800; text-transform: uppercase; letter-spacing: .7px;
392
+ color: var(--gold); background: #fff; border: 1px solid #f0d7a6;
393
+ border-radius: 999px; padding: 4px 11px;
394
+ }
395
+ .rec-total { font-size: 21px; font-weight: 800; }
396
+ .rec-text { font-size: 13.5px; color: var(--ink-2); margin-bottom: 12px; }
397
+ .rec-foot { display: flex; justify-content: space-between; align-items: center; gap: 10px; }
398
+ .rec-ids { font-weight: 700; }
399
+
400
+ /* ─── секции вариантов ─── */
401
+
402
+ .sec-head { display: flex; align-items: center; gap: 11px; margin: 22px 0 12px; }
403
+ .sec-ico {
404
+ width: 26px; height: 26px; border-radius: 8px; flex: none;
405
+ background: linear-gradient(180deg, var(--navy-2), var(--navy)); color: #fff;
406
+ display: inline-flex; align-items: center; justify-content: center;
407
+ box-shadow: var(--shadow-sm);
408
+ }
409
+ .sec-ico .ico { width: 14px; height: 14px; }
410
+ .sec-title {
411
+ font-size: 11.5px; font-weight: 800; letter-spacing: 1.2px; color: var(--ink-2);
412
+ }
413
+ .sec-line { flex: 1; height: 1px; background: linear-gradient(90deg, var(--line), transparent); }
414
+
415
+ /* ─── карточка варианта ─── */
416
+
417
+ .opt-card { padding: 0; overflow: hidden; }
418
+ .opt-card:hover { box-shadow: var(--shadow-md); }
419
+ .opt-main { display: flex; align-items: flex-start; gap: 16px; padding: 18px 20px; }
420
+ .opt-num {
421
+ width: 34px; height: 34px; border-radius: 11px; flex: none;
422
+ background: linear-gradient(180deg, var(--navy-2), var(--navy)); color: #fff;
423
+ font-size: 14px; font-weight: 800;
424
+ display: flex; align-items: center; justify-content: center;
425
+ box-shadow: var(--shadow-sm);
426
+ }
427
+ .opt-body { flex: 1; min-width: 0; }
428
+ .opt-title { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; font-size: 16px; font-weight: 800; letter-spacing: -.2px; }
429
+ .opt-brand { color: var(--ink-2); font-weight: 500; font-size: 13.5px; }
430
+ .stars { color: #f0a500; font-size: 13px; letter-spacing: 1px; }
431
+ .pill {
432
+ font-size: 10px; font-weight: 800; text-transform: uppercase; letter-spacing: .6px;
433
+ padding: 3px 9px; border-radius: 999px; white-space: nowrap;
434
+ }
435
+ .pill-green { background: var(--green-bg); color: var(--green); }
436
+ .pill-gold { background: var(--gold-bg); color: var(--gold); }
437
+ .opt-price { flex: none; text-align: right; }
438
+ .price-small { font-size: 11px; color: var(--ink-3); text-transform: uppercase; letter-spacing: .5px; }
439
+ .price-big { font-size: 23px; font-weight: 800; letter-spacing: -.5px; color: var(--ink); }
440
+ .price-extra { font-size: 11.5px; color: var(--ink-2); margin-top: 2px; }
441
+ .opt-row { display: flex; align-items: center; gap: 6px; font-size: 13px; color: var(--ink-2); margin-top: 9px; }
442
+ .opt-row.muted { color: var(--ink-3); font-size: 12.5px; }
443
+ .opt-actions {
444
+ display: flex; justify-content: space-between; align-items: center; gap: 10px;
445
+ padding: 11px 20px; border-top: 1px dashed var(--line);
446
+ background: var(--card-2);
447
+ }
448
+ .ext-link {
449
+ display: inline-flex; align-items: center; gap: 6px;
450
+ color: var(--teal); text-decoration: none; font-weight: 700; font-size: 13px;
451
+ }
452
+ .ext-link:hover { text-decoration: underline; }
453
+ .ext-link .ico { width: 14px; height: 14px; }
454
+
455
+ /* ─── таймлайн транспорта ─── */
456
+
457
+ .timeline { display: flex; align-items: flex-start; gap: 16px; margin-top: 14px; }
458
+ .tl-end { min-width: 76px; }
459
+ .tl-right { text-align: right; }
460
+ .tl-time { font-size: 20px; font-weight: 800; line-height: 1.2; letter-spacing: -.4px; }
461
+ .tl-place { font-size: 12px; color: var(--ink-2); margin-top: 3px; }
462
+ .tl-mid { flex: 1; min-width: 120px; text-align: center; padding-top: 3px; }
463
+ .tl-chip {
464
+ display: inline-block; font-size: 11px; font-weight: 700;
465
+ color: var(--teal); background: var(--accent-weak);
466
+ border-radius: 999px; padding: 3px 11px; margin-bottom: 7px;
467
+ }
468
+ .tl-line {
469
+ position: relative; height: 2px; border-radius: 2px; margin: 5px 7px;
470
+ background: linear-gradient(90deg, var(--navy), var(--teal));
471
+ }
472
+ .tl-line::before, .tl-line::after {
473
+ content: ''; position: absolute; top: 50%;
474
+ width: 8px; height: 8px; border-radius: 50%; transform: translateY(-50%);
475
+ }
476
+ .tl-line::before { left: -3px; background: var(--navy); }
477
+ .tl-line::after { right: -3px; background: var(--teal); }
478
+ .tl-stop {
479
+ position: absolute; top: 50%; transform: translate(-50%, -50%);
480
+ width: 8px; height: 8px; border-radius: 50%;
481
+ background: var(--card); border: 2px solid var(--teal);
482
+ }
483
+ .tl-direct { font-size: 10px; font-weight: 800; letter-spacing: .8px; text-transform: uppercase; color: var(--green); margin-top: 6px; }
484
+ .tl-stops { font-size: 11px; color: var(--ink-2); margin-top: 6px; }
485
+
486
+ /* ─── отель ─── */
487
+
488
+ .rate-plate {
489
+ display: inline-flex; align-items: baseline; gap: 4px;
490
+ background: var(--booking); color: #fff;
491
+ border-radius: 7px 7px 7px 0; padding: 4px 9px;
492
+ font-size: 13px; font-weight: 800;
493
+ }
494
+ .rate-plate small { font-size: 11px; font-weight: 400; opacity: .85; }
495
+ .hotel-row { display: flex; align-items: center; flex-wrap: wrap; gap: 10px; margin-top: 12px; }
496
+ .opt-addr { font-size: 12.5px; color: var(--ink-2); }
497
+ .chips { display: flex; flex-wrap: wrap; gap: 7px; margin-top: 12px; }
498
+ .chip {
499
+ display: inline-flex; align-items: center; gap: 5px;
500
+ font-size: 11.5px; color: var(--ink-2);
501
+ background: var(--card-2); border: 1px solid var(--line);
502
+ border-radius: 999px; padding: 4px 11px;
503
+ }
504
+ .chip .ico { width: 11px; height: 11px; color: var(--ink-3); }
505
+ .chip-green { background: var(--green-bg); color: var(--green); border-color: transparent; }
506
+ .chip-green .ico { color: var(--green); }
507
+
508
+ /* ─── живой лог джоба ─── */
509
+
510
+ .joblog-head { display: flex; align-items: center; gap: 8px; font-size: 13.5px; font-weight: 700; }
511
+ .joblog {
512
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 11.5px;
513
+ background: #08282a; color: #b6e6df;
514
+ border-radius: 12px; padding: 11px 13px; margin: 11px 0 0;
515
+ white-space: pre-wrap; word-break: break-word;
516
+ max-height: 260px; overflow: auto;
517
+ }
518
+
519
+ /* ─── отчёт оформления + оплата ─── */
520
+
521
+ .pay-note {
522
+ background: #fffbeb; border: 1px solid #f5d989; color: #78350f;
523
+ border-radius: 12px; padding: 13px 15px; font-size: 13px; margin: 14px 0;
524
+ }
525
+ .report-head { display: flex; justify-content: space-between; align-items: baseline; gap: 10px; }
526
+ .report-head h3 { margin: 0; font-size: 15px; font-weight: 800; }
527
+ .report-row { font-size: 13px; color: var(--ink-2); margin-top: 9px; }
528
+ .report-total { font-size: 15px; font-weight: 800; color: var(--ink); }
529
+ .report-warnings { margin-top: 9px; }
530
+ .warn-row { background: #fffbeb; color: #78350f; border-radius: 9px; padding: 7px 11px; font-size: 12.5px; margin-top: 5px; }
531
+
532
+ /* ─── блоки после оплаты ─── */
533
+
534
+ .block-head { display: flex; justify-content: space-between; align-items: center; gap: 10px; margin-bottom: 9px; }
535
+ .block-head h3 { margin: 0; font-size: 15px; font-weight: 800; }
536
+ .copy-btn .ico { width: 14px; height: 14px; }
537
+ .block-pre {
538
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 12px;
539
+ background: var(--card-2); border: 1px solid var(--line-2); border-radius: 12px;
540
+ padding: 13px 15px; margin: 0;
541
+ white-space: pre-wrap; word-break: break-word;
542
+ max-height: 420px; overflow: auto;
543
+ }
544
+
545
+ /* ─── черновик + действия ─── */
546
+
547
+ .trip-props { margin: 0; font-size: 13px; }
548
+ .trip-props div { display: flex; gap: 8px; padding: 5px 0; }
549
+ .trip-props dt { color: var(--ink-3); min-width: 110px; flex: none; }
550
+ .trip-props dd { margin: 0; min-width: 0; }
551
+ .actions-row { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 16px; }
552
+
553
+ /* ─── команда ─── */
554
+
555
+ .team-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: 16px; }
556
+ .member-card { margin-bottom: 0; }
557
+ .member-name { display: flex; align-items: center; gap: 8px; font-size: 15.5px; font-weight: 800; letter-spacing: -.2px; }
558
+ .badge-demo {
559
+ font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: .6px;
560
+ background: var(--accent-weak); color: var(--teal);
561
+ border-radius: 999px; padding: 2px 9px;
562
+ }
563
+ .member-pos { color: var(--ink-2); font-size: 12.5px; margin-top: 3px; }
564
+ .member-props { margin: 13px 0 0; font-size: 12.5px; }
565
+ .member-props > div { display: flex; gap: 8px; padding: 3px 0; }
566
+ .member-props dt { color: var(--ink-3); min-width: 92px; flex: none; }
567
+ .member-props dd { margin: 0; min-width: 0; word-break: break-word; }
568
+ .member-actions { display: flex; gap: 8px; margin-top: 14px; }
569
+
570
+ /* ─── формы, настройки ─── */
571
+
572
+ .settings-sec {
573
+ font-size: 11.5px; font-weight: 800; letter-spacing: 1.1px;
574
+ color: var(--teal); margin: 20px 0 12px;
575
+ }
576
+ .settings-card .settings-sec:first-child { margin-top: 0; }
577
+ .form-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 13px 16px; }
578
+ label { display: block; font-size: 12.5px; font-weight: 600; color: var(--ink-2); }
579
+ label input, label select, label textarea {
580
+ display: block; width: 100%; margin-top: 5px;
581
+ font: inherit; font-size: 13.5px; color: var(--ink);
582
+ background: var(--card); border: 1px solid var(--line); border-radius: 10px;
583
+ padding: 9px 11px;
584
+ }
585
+ label textarea { resize: vertical; }
586
+ input:focus, select:focus, textarea:focus {
587
+ outline: none; border-color: var(--teal);
588
+ box-shadow: var(--ring);
589
+ }
590
+ .check { display: flex; align-items: center; gap: 8px; font-weight: 500; font-size: 13.5px; color: var(--ink); }
591
+ .check input { display: inline-block; width: auto; margin: 0; accent-color: var(--teal); }
592
+ .inline { display: flex; align-items: center; gap: 8px; font-size: 13.5px; color: var(--ink); font-weight: 500; }
593
+ .inline select { display: inline-block; width: auto; margin: 0; }
594
+ .wide { grid-column: 1 / -1; margin-top: 12px; }
595
+ .form-actions { display: flex; justify-content: flex-end; gap: 8px; margin-top: 18px; }
596
+ fieldset {
597
+ border: 1px solid var(--line); border-radius: 12px;
598
+ padding: 11px 13px; margin: 13px 0;
599
+ display: flex; flex-wrap: wrap; gap: 10px 16px;
600
+ }
601
+ legend { font-size: 11.5px; font-weight: 700; color: var(--ink-2); padding: 0 6px; }
602
+
603
+ /* ─── модалка ─── */
604
+
605
+ .modal {
606
+ position: fixed; inset: 0; z-index: 100;
607
+ display: flex; align-items: flex-start; justify-content: center;
608
+ padding: 40px 16px; overflow: auto;
609
+ }
610
+ .modal[hidden] { display: none; }
611
+ .modal-backdrop { position: fixed; inset: 0; background: rgba(9,42,45,.5); -webkit-backdrop-filter: blur(2px); backdrop-filter: blur(2px); }
612
+ .modal-card {
613
+ position: relative; z-index: 1;
614
+ width: 640px; max-width: 100%;
615
+ background: var(--card); border-radius: 18px; box-shadow: var(--shadow-lg);
616
+ padding: 22px 24px;
617
+ }
618
+ .modal-card h2 { margin: 0 0 16px; font-size: 17px; font-weight: 800; letter-spacing: -.3px; }
619
+ .modal-close {
620
+ position: absolute; top: 14px; right: 14px;
621
+ background: none; border: none; cursor: pointer;
622
+ color: var(--ink-3); padding: 4px;
623
+ }
624
+ .modal-close:hover { color: var(--ink); }
625
+ .modal-close svg { width: 16px; height: 16px; display: block; }
626
+
627
+ /* ─── тост ─── */
628
+
629
+ .toast {
630
+ position: fixed; left: 50%; bottom: 26px; z-index: 200;
631
+ transform: translate(-50%, 12px);
632
+ background: #0d3b3d; color: #fff;
633
+ border-radius: 12px; padding: 11px 17px;
634
+ font-size: 13px; max-width: 90vw;
635
+ box-shadow: var(--shadow-lg);
636
+ opacity: 0; pointer-events: none;
637
+ transition: opacity .18s, transform .18s;
638
+ }
639
+ .toast.show { opacity: 1; transform: translate(-50%, 0); }
640
+
641
+ /* ═══════════════════════════════════════════════════════════════════════
642
+ ТЁМНАЯ ТЕМА — html[data-theme="dark"] (из app.js: ?theme=dark / {qiksy:"mode"}).
643
+ Глубокий бирюзово-графитовый холст (НЕ чёрный) с бирюзовым свечением;
644
+ карточки — приподнятые тёмные поверхности. Паритет со светлой темой.
645
+ ═══════════════════════════════════════════════════════════════════════ */
646
+
647
+ :root[data-theme="dark"] {
648
+ --bg:#0c181a; --card:#152528; --card-2:#101f21;
649
+ --ink:#e9f2f2; --ink-2:#a3b8b8; --ink-3:#6f8788;
650
+ --line:rgba(148,182,182,.16); --line-2:rgba(148,182,182,.09); --notch:#0d1a1c;
651
+ --navy:#155e5a; --navy-2:#1a7a72;
652
+ --teal:#2dd4bf; --accent:#2dd4bf; --accent-weak:rgba(45,212,191,.16);
653
+ --hero-1:#0b2e30; --hero-2:#115e59;
654
+ --gold:#e6b25a; --gold-bg:rgba(230,178,90,.14);
655
+ --green:#48d07f; --green-bg:rgba(72,208,127,.13); --booking:#1a4b8f;
656
+ --shadow-sm:0 1px 2px rgba(0,0,0,.34),0 2px 6px rgba(0,0,0,.4);
657
+ --shadow-md:0 6px 18px rgba(0,0,0,.5);
658
+ --shadow-lg:0 18px 40px rgba(0,0,0,.62);
659
+ --ring:0 0 0 3px rgba(45,212,191,.22);
660
+ }
661
+
662
+ :root[data-theme="dark"] body {
663
+ background-color: #0c181a;
664
+ background-image:
665
+ radial-gradient(920px 540px at 12% -8%, rgba(45,212,191,.11), transparent 62%),
666
+ radial-gradient(760px 620px at 96% 2%, rgba(13,148,136,.13), transparent 58%),
667
+ radial-gradient(1100px 720px at 50% 120%, rgba(20,120,110,.12), transparent 60%),
668
+ linear-gradient(180deg, #0e1e20 0%, #0c1618 55%, #0b1517 100%);
669
+ }
670
+ :root[data-theme="dark"] body::before {
671
+ background-image: radial-gradient(rgba(120,210,200,.05) 1px, transparent 1.4px);
672
+ }
673
+
674
+ /* топбар: матовый тёмный вместо белого стекла */
675
+ :root[data-theme="dark"] .topbar { background: rgba(18,32,34,.8); }
676
+ :root[data-theme="dark"] .brand { color: var(--ink); }
677
+ :root[data-theme="dark"] .brand-mark { color: var(--teal); }
678
+ :root[data-theme="dark"] .nav-tab.active { color: var(--ink); }
679
+
680
+ /* скроллбары */
681
+ :root[data-theme="dark"] ::-webkit-scrollbar-thumb,
682
+ :root[data-theme="dark"] .jobs-panel::-webkit-scrollbar-thumb,
683
+ :root[data-theme="dark"] .job-log::-webkit-scrollbar-thumb,
684
+ :root[data-theme="dark"] .joblog::-webkit-scrollbar-thumb,
685
+ :root[data-theme="dark"] .block-pre::-webkit-scrollbar-thumb,
686
+ :root[data-theme="dark"] .modal::-webkit-scrollbar-thumb { background-color:#31474a; }
687
+
688
+ /* статус-бейджи с зашитыми светлыми пастелями → полупрозрачные тонировки */
689
+ :root[data-theme="dark"] .st-searching,
690
+ :root[data-theme="dark"] .st-job-running { background:var(--accent-weak); color:var(--teal); }
691
+ :root[data-theme="dark"] .st-booking { background:rgba(167,110,240,.18); color:#c9a3f5; }
692
+ :root[data-theme="dark"] .st-paid { background:rgba(72,208,127,.16); color:var(--green); }
693
+ :root[data-theme="dark"] .st-cancelled,
694
+ :root[data-theme="dark"] .st-job-error { background:rgba(248,113,113,.16); color:#f0a2a2; }
695
+
696
+ /* рекомендованная связка: кремовый градиент/рамка → тёплая тёмная подложка */
697
+ :root[data-theme="dark"] .rec-plate {
698
+ background:linear-gradient(135deg, rgba(230,178,90,.07), rgba(230,178,90,.15));
699
+ border-color:rgba(230,178,90,.28);
700
+ }
701
+ :root[data-theme="dark"] .rec-badge {
702
+ background:rgba(230,178,90,.14); border-color:rgba(230,178,90,.32);
703
+ }
704
+
705
+ /* инфо-плашки с зашитыми светлыми фонами */
706
+ :root[data-theme="dark"] .notfound,
707
+ :root[data-theme="dark"] .pay-note,
708
+ :root[data-theme="dark"] .warn-row { background:rgba(230,178,90,.1); color:#e6cd94; }
709
+ :root[data-theme="dark"] .pay-note { border-color:rgba(230,178,90,.3); }
710
+ :root[data-theme="dark"] .error-note { background:rgba(248,113,113,.12); color:#f0a2a2; }
711
+
712
+ /* opt-num/sec-ico/primary — сохраняем читаемый бирюзовый на тёмной карточке */
713
+ :root[data-theme="dark"] .btn.primary { background:linear-gradient(180deg, var(--navy-2), var(--navy)); }
714
+ :root[data-theme="dark"] .btn.primary:hover { background:linear-gradient(180deg, #1f8f85, var(--navy-2)); }
715
+
716
+ /* опасная кнопка */
717
+ :root[data-theme="dark"] .btn.danger { border-color:rgba(248,113,113,.32); color:#f0a2a2; }
718
+ :root[data-theme="dark"] .btn.danger:hover { background:rgba(248,113,113,.12); }
719
+
720
+ /* модалка — глубже затемняем подложку */
721
+ :root[data-theme="dark"] .modal-backdrop { background:rgba(0,0,0,.62); }
722
+
723
+ /* тост */
724
+ :root[data-theme="dark"] .toast { background:#1c3336; color:var(--ink); box-shadow:var(--shadow-lg); }
725
+
726
+ /* живой лог остаётся тёмным и в светлой теме — в dark лишь чуть глубже */
727
+ :root[data-theme="dark"] .joblog { background:#061c1e; }
728
+
729
+ /* ─── адаптив ─── */
730
+
731
+ @media (max-width: 760px) {
732
+ .topbar { flex-wrap: wrap; gap: 8px 14px; padding: 10px 14px; }
733
+ .tabs { order: 3; flex-basis: 100%; }
734
+ .view { padding: 18px 14px 52px; }
735
+ .trips-grid, .team-grid, .form-grid { grid-template-columns: 1fr; }
736
+ .wide { grid-column: auto; }
737
+
738
+ /* посадочный талон складывается вертикально; перфорация — горизонтальная */
739
+ .trip-card { flex-direction: column; }
740
+ .bp-route { padding: 16px 18px 14px; }
741
+ /* в колоночной раскладке корешок занимает всю ширину талона — снимаем десктопный max-width */
742
+ .bp-stub { width: auto; min-width: 0; max-width: none; flex-direction: row; flex-wrap: wrap; align-items: center; gap: 8px 14px; padding: 14px 18px 16px; }
743
+ .bp-perf {
744
+ width: auto; height: 2px; align-self: stretch; margin: 0 16px;
745
+ background-image: linear-gradient(90deg, var(--line) 55%, transparent 0);
746
+ background-size: 8px 2px; background-repeat: repeat-x; background-position: center;
747
+ }
748
+
749
+ .hero { padding: 20px 20px; }
750
+ .hero-title { font-size: 22px; }
751
+ .opt-main { flex-wrap: wrap; gap: 12px; padding: 15px; }
752
+ .opt-price { margin-left: auto; }
753
+ .opt-actions { padding: 11px 15px; flex-wrap: wrap; }
754
+ .timeline { gap: 10px; }
755
+ .tl-mid { min-width: 80px; }
756
+ .tl-time { font-size: 17px; }
757
+ .tl-end { min-width: 60px; }
758
+ .jobs-panel { position: fixed; left: 10px; right: 10px; top: 56px; width: auto; }
759
+ .modal { padding: 16px 10px; }
760
+ }