@taqwright/taqwright 0.0.24

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 (132) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +108 -0
  3. package/dist/auto-appium.d.ts +12 -0
  4. package/dist/auto-appium.js +77 -0
  5. package/dist/bin/branding.d.ts +6 -0
  6. package/dist/bin/branding.js +22 -0
  7. package/dist/bin/index.d.ts +2 -0
  8. package/dist/bin/index.js +321 -0
  9. package/dist/bin/init.d.ts +26 -0
  10. package/dist/bin/init.js +902 -0
  11. package/dist/bin/inspect.d.ts +9 -0
  12. package/dist/bin/inspect.js +91 -0
  13. package/dist/bin/report-branding.d.ts +2 -0
  14. package/dist/bin/report-branding.js +42 -0
  15. package/dist/branding-assets.d.ts +1 -0
  16. package/dist/branding-assets.js +1 -0
  17. package/dist/capabilities-helpers.d.ts +7 -0
  18. package/dist/capabilities-helpers.js +14 -0
  19. package/dist/capabilities.d.ts +6 -0
  20. package/dist/capabilities.js +86 -0
  21. package/dist/config.d.ts +17 -0
  22. package/dist/config.js +235 -0
  23. package/dist/discovery-setup.d.ts +1 -0
  24. package/dist/discovery-setup.js +61 -0
  25. package/dist/discovery.d.ts +17 -0
  26. package/dist/discovery.js +55 -0
  27. package/dist/docs/configuration.html +376 -0
  28. package/dist/docs/custom-reporters.html +265 -0
  29. package/dist/docs/docker.html +339 -0
  30. package/dist/docs/docs.js +173 -0
  31. package/dist/docs/generating-tests.html +161 -0
  32. package/dist/docs/images/taqwright-html-report.png +0 -0
  33. package/dist/docs/index.html +13 -0
  34. package/dist/docs/installation.html +686 -0
  35. package/dist/docs/parallel.html +271 -0
  36. package/dist/docs/running-tests.html +385 -0
  37. package/dist/docs/styles.css +460 -0
  38. package/dist/docs/writing-tests.html +565 -0
  39. package/dist/doctor.d.ts +33 -0
  40. package/dist/doctor.js +508 -0
  41. package/dist/expect.d.ts +38 -0
  42. package/dist/expect.js +96 -0
  43. package/dist/fixture/artifact-mode.d.ts +2 -0
  44. package/dist/fixture/artifact-mode.js +7 -0
  45. package/dist/fixture/index.d.ts +15 -0
  46. package/dist/fixture/index.js +324 -0
  47. package/dist/images/taqwright-html-report.png +0 -0
  48. package/dist/images/taqwright_favicon.png +0 -0
  49. package/dist/images/taqwright_logo.png +0 -0
  50. package/dist/index.d.ts +9 -0
  51. package/dist/index.js +7 -0
  52. package/dist/inspector/codegen-appium.d.ts +3 -0
  53. package/dist/inspector/codegen-appium.js +228 -0
  54. package/dist/inspector/devices.d.ts +41 -0
  55. package/dist/inspector/devices.js +422 -0
  56. package/dist/inspector/locator-suggester.d.ts +23 -0
  57. package/dist/inspector/locator-suggester.js +539 -0
  58. package/dist/inspector/recorder.d.ts +128 -0
  59. package/dist/inspector/recorder.js +162 -0
  60. package/dist/inspector/server.d.ts +39 -0
  61. package/dist/inspector/server.js +1210 -0
  62. package/dist/inspector/session.d.ts +84 -0
  63. package/dist/inspector/session.js +262 -0
  64. package/dist/inspector/ui.d.ts +1 -0
  65. package/dist/inspector/ui.js +5508 -0
  66. package/dist/keys.d.ts +3 -0
  67. package/dist/keys.js +28 -0
  68. package/dist/locator/index.d.ts +206 -0
  69. package/dist/locator/index.js +1506 -0
  70. package/dist/logger.d.ts +5 -0
  71. package/dist/logger.js +5 -0
  72. package/dist/mobile/index.d.ts +130 -0
  73. package/dist/mobile/index.js +762 -0
  74. package/dist/network/android.d.ts +5 -0
  75. package/dist/network/android.js +87 -0
  76. package/dist/network/ca.d.ts +10 -0
  77. package/dist/network/ca.js +136 -0
  78. package/dist/network/har.d.ts +90 -0
  79. package/dist/network/har.js +101 -0
  80. package/dist/network/host-proxy.d.ts +16 -0
  81. package/dist/network/host-proxy.js +134 -0
  82. package/dist/network/index.d.ts +26 -0
  83. package/dist/network/index.js +105 -0
  84. package/dist/network/ios-sim.d.ts +3 -0
  85. package/dist/network/ios-sim.js +29 -0
  86. package/dist/network/proxy.d.ts +13 -0
  87. package/dist/network/proxy.js +310 -0
  88. package/dist/providers/appium.d.ts +23 -0
  89. package/dist/providers/appium.js +288 -0
  90. package/dist/providers/browserstack/index.d.ts +5 -0
  91. package/dist/providers/browserstack/index.js +77 -0
  92. package/dist/providers/browserstack/utils.d.ts +1 -0
  93. package/dist/providers/browserstack/utils.js +6 -0
  94. package/dist/providers/cloud.d.ts +53 -0
  95. package/dist/providers/cloud.js +117 -0
  96. package/dist/providers/emulator/index.d.ts +8 -0
  97. package/dist/providers/emulator/index.js +47 -0
  98. package/dist/providers/index.d.ts +10 -0
  99. package/dist/providers/index.js +33 -0
  100. package/dist/providers/lambdatest/index.d.ts +28 -0
  101. package/dist/providers/lambdatest/index.js +99 -0
  102. package/dist/providers/lambdatest/utils.d.ts +1 -0
  103. package/dist/providers/lambdatest/utils.js +6 -0
  104. package/dist/providers/local/index.d.ts +9 -0
  105. package/dist/providers/local/index.js +53 -0
  106. package/dist/providers/local-session.d.ts +16 -0
  107. package/dist/providers/local-session.js +55 -0
  108. package/dist/setup/archive.d.ts +2 -0
  109. package/dist/setup/archive.js +43 -0
  110. package/dist/setup/avd.d.ts +12 -0
  111. package/dist/setup/avd.js +103 -0
  112. package/dist/setup/index.d.ts +6 -0
  113. package/dist/setup/index.js +55 -0
  114. package/dist/setup/install-android.d.ts +2 -0
  115. package/dist/setup/install-android.js +70 -0
  116. package/dist/setup/install-appium.d.ts +1 -0
  117. package/dist/setup/install-appium.js +64 -0
  118. package/dist/setup/install-jdk.d.ts +1 -0
  119. package/dist/setup/install-jdk.js +58 -0
  120. package/dist/setup/paths.d.ts +16 -0
  121. package/dist/setup/paths.js +88 -0
  122. package/dist/setup/spawn-tool.d.ts +3 -0
  123. package/dist/setup/spawn-tool.js +11 -0
  124. package/dist/tracer/index.d.ts +34 -0
  125. package/dist/tracer/index.js +687 -0
  126. package/dist/tracer/proxy.d.ts +3 -0
  127. package/dist/tracer/proxy.js +60 -0
  128. package/dist/types/index.d.ts +189 -0
  129. package/dist/types/index.js +6 -0
  130. package/dist/utils.d.ts +2 -0
  131. package/dist/utils.js +37 -0
  132. package/package.json +79 -0
@@ -0,0 +1,460 @@
1
+ /* ─── Tokens (Playwright-style dark theme) ─────────────────────── */
2
+ :root {
3
+ color-scheme: dark;
4
+ --bg: #1b1d1f;
5
+ --bg-soft: #26282c;
6
+ --bg-card: #222427;
7
+ --text: #e8eaed;
8
+ --muted: #9aa0a6;
9
+ --link: #4cc05a; /* Playwright dark green links */
10
+ --link-hov: #6fd47a;
11
+ --border: #3c4043;
12
+ --border-soft: #2b2d31;
13
+ --accent: #3fb950; /* taqwright brand green */
14
+ --note-bg: #2a2615;
15
+ --note-bd: #5a4e23;
16
+ --warn-bg: #2d2415;
17
+ --warn-bd: #6e4a23;
18
+ --danger-bg: #2c1a1d;
19
+ --danger-bd: #6b2d32;
20
+ --kw: #ff7b72; /* GitHub-dark syntax palette */
21
+ --str: #a5d6ff;
22
+ --fn: #d2a8ff;
23
+ --com: #8b949e;
24
+ --num: #79c0ff;
25
+ }
26
+
27
+ /* ─── Light theme (opt-in via <html data-theme="light">) ───────── */
28
+ :root[data-theme="light"] {
29
+ color-scheme: light;
30
+ --bg: #ffffff;
31
+ --bg-soft: #f6f8fa;
32
+ --bg-card: #f6f8fa;
33
+ --text: #1b1b1d;
34
+ --muted: #6e6e7d;
35
+ --link: #1f6feb;
36
+ --link-hov: #0a4ec0;
37
+ --border: #d1d5da;
38
+ --border-soft: #eaecef;
39
+ --accent: #3fb950;
40
+ --note-bg: #fff8e1;
41
+ --note-bd: #f0d264;
42
+ --warn-bg: #fff4e5;
43
+ --warn-bd: #f4a64a;
44
+ --danger-bg: #ffeef0;
45
+ --danger-bd: #d73a49;
46
+ --kw: #d73a49;
47
+ --str: #032f62;
48
+ --fn: #6f42c1;
49
+ --com: #6a737d;
50
+ --num: #005cc5;
51
+ }
52
+ /* Light overrides for the few hardcoded (non-token) colors */
53
+ [data-theme="light"] main code:not(pre code),
54
+ [data-theme="light"] table.api td code { color: #cf2222; }
55
+ [data-theme="light"] .codeblock .filename { background: #e7eaef; }
56
+ [data-theme="light"] .callout::before { color: #9a7a16; }
57
+ [data-theme="light"] .callout.warn::before { color: #8a4f0d; }
58
+ [data-theme="light"] .callout.danger::before { color: #a01622; }
59
+
60
+ /* ─── Theme toggle (topbar) ────────────────────────────────────── */
61
+ header.topbar .theme-toggle {
62
+ background: transparent; border: 0; cursor: pointer;
63
+ color: var(--text); padding: 6px; border-radius: 6px;
64
+ font-size: 16px; line-height: 1;
65
+ display: inline-flex; align-items: center;
66
+ }
67
+ header.topbar .theme-toggle:hover { background: var(--bg-soft); }
68
+ header.topbar .theme-toggle::before { content: '☀'; }
69
+ :root[data-theme="light"] header.topbar .theme-toggle::before { content: '☾'; }
70
+
71
+ * { box-sizing: border-box; }
72
+ html, body { margin: 0; padding: 0; background: var(--bg); color: var(--text); }
73
+ body {
74
+ font: 15px/1.6 -apple-system, BlinkMacSystemFont, "Inter", "Segoe UI", Roboto, sans-serif;
75
+ -webkit-font-smoothing: antialiased;
76
+ -moz-osx-font-smoothing: grayscale;
77
+ }
78
+ a { color: var(--link); text-decoration: none; }
79
+ a:hover { color: var(--link-hov); text-decoration: underline; }
80
+
81
+ /* ─── Top nav ────────────────────────────────────────────────── */
82
+ header.topbar {
83
+ position: sticky; top: 0; z-index: 20;
84
+ background: var(--bg);
85
+ border-bottom: 1px solid var(--border-soft);
86
+ height: 60px;
87
+ display: flex; align-items: center;
88
+ padding: 0 24px;
89
+ gap: 24px;
90
+ }
91
+ header.topbar .brand {
92
+ font-weight: 700; font-size: 18px; letter-spacing: -0.01em;
93
+ color: var(--text); display: inline-flex; align-items: center; gap: 2px;
94
+ }
95
+ header.topbar .brand .accent { color: var(--accent); }
96
+ header.topbar .brand:hover { text-decoration: none; }
97
+ header.topbar nav.primary {
98
+ display: flex; gap: 4px; font-size: 14px;
99
+ }
100
+ header.topbar nav.primary a {
101
+ color: var(--text);
102
+ padding: 6px 12px;
103
+ border-radius: 6px;
104
+ }
105
+ header.topbar nav.primary a:hover { background: var(--bg-soft); text-decoration: none; }
106
+ header.topbar nav.primary a.current { color: var(--link); font-weight: 600; }
107
+ header.topbar .spacer { flex: 1; }
108
+ header.topbar .search {
109
+ display: inline-flex; align-items: center; gap: 8px;
110
+ background: var(--bg-soft); border: 1px solid var(--border-soft);
111
+ border-radius: 6px; padding: 5px 10px;
112
+ font-size: 13px; color: var(--muted);
113
+ min-width: 200px;
114
+ cursor: text;
115
+ }
116
+ header.topbar .search .kbd {
117
+ margin-left: auto;
118
+ font: 11px ui-monospace, monospace;
119
+ color: var(--muted);
120
+ background: var(--bg);
121
+ border: 1px solid var(--border-soft);
122
+ border-radius: 3px;
123
+ padding: 1px 5px;
124
+ }
125
+ header.topbar .gh-link {
126
+ display: inline-flex; align-items: center;
127
+ color: var(--text);
128
+ padding: 6px;
129
+ border-radius: 6px;
130
+ }
131
+ header.topbar .gh-link:hover { background: var(--bg-soft); text-decoration: none; }
132
+ header.topbar .gh-link svg { width: 20px; height: 20px; fill: currentColor; display: block; }
133
+ header.topbar .menu-toggle {
134
+ display: none;
135
+ background: transparent; color: var(--text);
136
+ border: 1px solid var(--border); border-radius: 6px;
137
+ padding: 4px 10px; cursor: pointer; font-size: 18px;
138
+ }
139
+
140
+ /* ─── Layout shell ───────────────────────────────────────────── */
141
+ .shell {
142
+ display: grid;
143
+ grid-template-columns: 260px minmax(0, 1fr) 220px;
144
+ max-width: 1380px;
145
+ margin: 0 auto;
146
+ gap: 0;
147
+ }
148
+
149
+ /* ─── Left sidebar ───────────────────────────────────────────── */
150
+ aside.sidebar {
151
+ position: sticky; top: 60px;
152
+ height: calc(100vh - 60px);
153
+ overflow-y: auto;
154
+ border-right: 1px solid var(--border-soft);
155
+ padding: 24px 16px 24px 24px;
156
+ background: var(--bg);
157
+ }
158
+ aside.sidebar h3 {
159
+ font-size: 11px; text-transform: uppercase; letter-spacing: 0.08em;
160
+ color: var(--muted); margin: 16px 0 6px;
161
+ padding: 0 8px;
162
+ display: flex; align-items: center; justify-content: space-between;
163
+ cursor: pointer; user-select: none;
164
+ }
165
+ aside.sidebar h3:hover { color: var(--text); }
166
+ aside.sidebar h3::after {
167
+ content: '⌄';
168
+ font-size: 13px; line-height: 1; color: var(--muted);
169
+ transition: transform 0.15s ease;
170
+ }
171
+ aside.sidebar h3.collapsed::after { transform: rotate(-90deg); }
172
+ aside.sidebar h3.collapsed + ul { display: none; }
173
+ aside.sidebar h3:first-child { margin-top: 0; }
174
+ aside.sidebar ul { list-style: none; padding: 0; margin: 0; }
175
+ aside.sidebar li { margin: 0; }
176
+ aside.sidebar a {
177
+ display: block;
178
+ padding: 5px 8px;
179
+ border-radius: 4px;
180
+ color: var(--text);
181
+ font-size: 14px;
182
+ line-height: 1.4;
183
+ }
184
+ aside.sidebar a:hover { background: var(--bg-soft); text-decoration: none; }
185
+ aside.sidebar a.current {
186
+ background: var(--bg-soft);
187
+ color: var(--link);
188
+ font-weight: 600;
189
+ }
190
+ aside.sidebar .sub {
191
+ margin: 2px 0 4px;
192
+ }
193
+ aside.sidebar .sub a {
194
+ padding-left: 22px;
195
+ font-size: 13px;
196
+ color: var(--muted);
197
+ }
198
+ aside.sidebar .sub a:hover { color: var(--text); }
199
+ aside.sidebar .sub a.current { color: var(--link); background: transparent; }
200
+
201
+ /* ─── Main content ───────────────────────────────────────────── */
202
+ main {
203
+ min-width: 0;
204
+ max-width: 780px;
205
+ padding: 28px 40px 64px;
206
+ margin: 0 auto;
207
+ }
208
+ main .breadcrumb {
209
+ font-size: 13px; color: var(--muted);
210
+ margin-bottom: 8px;
211
+ }
212
+ main .breadcrumb a { color: var(--muted); }
213
+ main h1 {
214
+ font-size: 32px; line-height: 1.2; margin: 0 0 12px;
215
+ letter-spacing: -0.02em; font-weight: 700;
216
+ }
217
+ main .lede { color: var(--muted); font-size: 16.5px; margin: 0 0 32px; line-height: 1.55; }
218
+ main h2 {
219
+ font-size: 24px; margin: 40px 0 12px; padding-bottom: 8px;
220
+ border-bottom: 1px solid var(--border-soft);
221
+ letter-spacing: -0.01em; font-weight: 600;
222
+ scroll-margin-top: 76px; /* clear the sticky 60 px top nav */
223
+ }
224
+ main h3 { font-size: 17px; margin: 24px 0 8px; font-weight: 600; scroll-margin-top: 76px; }
225
+ main h4 { font-size: 15px; margin: 20px 0 6px; font-weight: 600; color: var(--text); scroll-margin-top: 76px; }
226
+ main p { margin: 0 0 16px; }
227
+ main ul, main ol { padding-left: 24px; margin: 0 0 16px; }
228
+ main li { margin: 4px 0; }
229
+ main strong { color: var(--text); font-weight: 600; }
230
+ main code:not(pre code) {
231
+ background: var(--bg-soft);
232
+ border: 1px solid var(--border-soft);
233
+ border-radius: 4px;
234
+ padding: 1px 5px;
235
+ font: 13px/1.4 ui-monospace, "SF Mono", Menlo, monospace;
236
+ color: #ff7b72;
237
+ }
238
+
239
+ /* ─── Screenshots ────────────────────────────────────────────── */
240
+ main figure.shot { margin: 0 0 22px; }
241
+ main figure.shot img {
242
+ display: block; max-width: 100%; height: auto;
243
+ border: 1px solid var(--border); border-radius: 8px;
244
+ }
245
+ main figure.shot figcaption {
246
+ margin-top: 8px; font-size: 13px; color: var(--muted); text-align: center;
247
+ }
248
+
249
+ /* ─── Code blocks ────────────────────────────────────────────── */
250
+ .codeblock {
251
+ margin: 0 0 20px;
252
+ }
253
+ .codeblock .filename {
254
+ background: #23262a;
255
+ color: var(--muted);
256
+ font: 12px ui-monospace, "SF Mono", Menlo, monospace;
257
+ padding: 4px 12px;
258
+ border-radius: 6px 6px 0 0;
259
+ display: inline-block;
260
+ }
261
+ pre.code {
262
+ position: relative;
263
+ background: var(--bg-soft);
264
+ border-radius: 6px;
265
+ margin: 0;
266
+ overflow-x: auto;
267
+ font: 13.5px/1.6 ui-monospace, "SF Mono", Menlo, monospace;
268
+ }
269
+ .codeblock:has(.filename) pre.code {
270
+ border-top-left-radius: 0;
271
+ }
272
+ pre.code code {
273
+ display: block;
274
+ padding: 14px 16px;
275
+ color: var(--text);
276
+ white-space: pre;
277
+ }
278
+ pre.code .copy {
279
+ position: absolute; top: 6px; right: 6px;
280
+ background: var(--bg); color: var(--muted);
281
+ border: 1px solid var(--border-soft); border-radius: 4px;
282
+ padding: 3px 10px; font-size: 11px; cursor: pointer;
283
+ opacity: 0; transition: opacity 0.12s;
284
+ font-family: inherit;
285
+ }
286
+ pre.code:hover .copy { opacity: 1; }
287
+ pre.code .copy:hover { color: var(--text); border-color: var(--border); }
288
+ pre.code .copy.copied { color: var(--accent); border-color: var(--accent); }
289
+
290
+ .tok-kw { color: var(--kw); }
291
+ .tok-str { color: var(--str); }
292
+ .tok-com { color: var(--com); font-style: italic; }
293
+ .tok-fn { color: var(--fn); }
294
+ .tok-num { color: var(--num); }
295
+
296
+ /* ─── Tables ─────────────────────────────────────────────────── */
297
+ table.api {
298
+ width: 100%; border-collapse: collapse;
299
+ margin: 0 0 20px;
300
+ font-size: 14px;
301
+ }
302
+ table.api th, table.api td {
303
+ text-align: left;
304
+ padding: 8px 12px;
305
+ border-bottom: 1px solid var(--border-soft);
306
+ vertical-align: top;
307
+ }
308
+ table.api th {
309
+ color: var(--text); font-weight: 600;
310
+ font-size: 13px;
311
+ background: var(--bg-soft);
312
+ border-bottom: 1px solid var(--border);
313
+ }
314
+ table.api td code {
315
+ background: var(--bg-soft);
316
+ border: 1px solid var(--border-soft);
317
+ border-radius: 4px;
318
+ padding: 1px 6px;
319
+ font: 12.5px/1.4 ui-monospace, "SF Mono", Menlo, monospace;
320
+ color: #ff7b72;
321
+ white-space: normal;
322
+ word-break: break-word;
323
+ overflow-wrap: anywhere;
324
+ }
325
+ table.api { table-layout: fixed; }
326
+ table.api th:first-child, table.api td:first-child { width: 30%; }
327
+
328
+ /* ─── Callouts (Playwright-style note) ──────────────────────── */
329
+ .callout {
330
+ background: var(--note-bg);
331
+ border: 1px solid var(--note-bd);
332
+ border-radius: 6px;
333
+ padding: 12px 16px;
334
+ margin: 0 0 16px;
335
+ font-size: 14.5px;
336
+ position: relative;
337
+ }
338
+ .callout::before {
339
+ content: "NOTE";
340
+ display: inline-block;
341
+ font-size: 10px; font-weight: 700; letter-spacing: 0.08em;
342
+ color: #d6bb5a;
343
+ margin-right: 8px;
344
+ vertical-align: 1px;
345
+ }
346
+ .callout.warn { background: var(--warn-bg); border-color: var(--warn-bd); }
347
+ .callout.warn::before { content: "CAUTION"; color: #e0944a; }
348
+ .callout.danger { background: var(--danger-bg); border-color: var(--danger-bd); }
349
+ .callout.danger::before { content: "WARNING"; color: #f08a92; }
350
+ .callout strong { display: inline; margin-right: 4px; }
351
+ .callout p { margin: 0; display: inline; }
352
+
353
+ /* ─── Prev / Next ───────────────────────────────────────────── */
354
+ .pager {
355
+ display: grid;
356
+ grid-template-columns: 1fr 1fr;
357
+ gap: 12px;
358
+ margin: 48px 0 0;
359
+ }
360
+ .pager a {
361
+ display: block;
362
+ border: 1px solid var(--border-soft);
363
+ border-radius: 8px;
364
+ padding: 14px 16px;
365
+ color: var(--text);
366
+ text-decoration: none;
367
+ transition: border-color 0.12s;
368
+ }
369
+ .pager a:hover { border-color: var(--link); text-decoration: none; }
370
+ .pager .label { font-size: 12px; color: var(--muted); margin-bottom: 4px; }
371
+ .pager .title { font-weight: 600; color: var(--link); }
372
+ .pager .next { text-align: right; }
373
+
374
+ /* ─── Right TOC ─────────────────────────────────────────────── */
375
+ aside.onthispage {
376
+ position: sticky; top: 60px;
377
+ align-self: start;
378
+ max-height: calc(100vh - 60px);
379
+ overflow-y: auto;
380
+ padding: 28px 16px;
381
+ font-size: 13px;
382
+ }
383
+ aside.onthispage h4 {
384
+ font-size: 11px; text-transform: uppercase; letter-spacing: 0.08em;
385
+ color: var(--muted); margin: 0 0 8px;
386
+ font-weight: 600;
387
+ }
388
+ aside.onthispage ol { list-style: none; padding: 0; margin: 0; }
389
+ aside.onthispage li { margin: 0; }
390
+ aside.onthispage a {
391
+ display: block;
392
+ padding: 3px 8px;
393
+ color: var(--muted);
394
+ border-left: 2px solid transparent;
395
+ font-size: 13px;
396
+ line-height: 1.5;
397
+ }
398
+ aside.onthispage a:hover { color: var(--text); text-decoration: none; }
399
+ aside.onthispage a.active {
400
+ color: var(--link); border-left-color: var(--link); font-weight: 500;
401
+ }
402
+ aside.onthispage .sub a { padding-left: 20px; font-size: 12.5px; }
403
+
404
+ /* ─── Footer ────────────────────────────────────────────────── */
405
+ footer.bot {
406
+ background: var(--bg-soft);
407
+ border-top: 1px solid var(--border-soft);
408
+ margin-top: 0;
409
+ padding: 40px 24px 28px;
410
+ }
411
+ footer.bot .cols {
412
+ max-width: 1380px;
413
+ margin: 0 auto;
414
+ display: grid;
415
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
416
+ gap: 32px;
417
+ }
418
+ footer.bot h5 {
419
+ font-size: 11px; text-transform: uppercase; letter-spacing: 0.08em;
420
+ color: var(--muted); margin: 0 0 12px;
421
+ font-weight: 700;
422
+ }
423
+ footer.bot ul { list-style: none; padding: 0; margin: 0; }
424
+ footer.bot li { margin: 6px 0; }
425
+ footer.bot a { color: var(--text); font-size: 14px; }
426
+ footer.bot .copy {
427
+ max-width: 1380px;
428
+ margin: 24px auto 0;
429
+ padding-top: 20px;
430
+ border-top: 1px solid var(--border-soft);
431
+ color: var(--muted);
432
+ font-size: 13px;
433
+ text-align: center;
434
+ }
435
+
436
+ /* ─── Responsive ────────────────────────────────────────────── */
437
+ @media (max-width: 1199px) {
438
+ .shell { grid-template-columns: 260px minmax(0, 1fr); }
439
+ aside.onthispage { display: none; }
440
+ }
441
+ @media (max-width: 1000px) {
442
+ .shell { grid-template-columns: 1fr; }
443
+ header.topbar .menu-toggle { display: inline-block; }
444
+ header.topbar nav.primary { display: none; }
445
+ header.topbar .search { display: none; }
446
+ aside.sidebar {
447
+ position: fixed; top: 60px; left: 0;
448
+ width: 280px; height: calc(100vh - 60px);
449
+ background: var(--bg);
450
+ border-right: 1px solid var(--border);
451
+ transform: translateX(-100%);
452
+ transition: transform 0.18s;
453
+ z-index: 19;
454
+ }
455
+ aside.sidebar.open { transform: translateX(0); }
456
+ main { padding: 20px 20px 48px; }
457
+ }
458
+ @media (max-width: 500px) {
459
+ header.topbar { padding: 0 12px; gap: 12px; }
460
+ header.topbar .brand { font-size: 16px; }