kward 0.69.1 → 0.70.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.
@@ -14,6 +14,26 @@
14
14
 
15
15
  html {
16
16
  background: var(--kward-bg);
17
+ color-scheme: dark;
18
+ }
19
+
20
+ .kward-skip-link {
21
+ background: var(--kward-accent);
22
+ border-radius: 0 0 8px 8px;
23
+ color: #030604;
24
+ font-weight: 700;
25
+ left: 50%;
26
+ padding: 10px 20px;
27
+ position: fixed;
28
+ text-decoration: none;
29
+ top: 0;
30
+ transform: translateY(-100%);
31
+ transition: transform 120ms ease;
32
+ z-index: 9400;
33
+ }
34
+
35
+ .kward-skip-link:focus {
36
+ transform: translateY(0);
17
37
  }
18
38
 
19
39
  body.kward-docs {
@@ -28,15 +48,9 @@ body.kward-docs {
28
48
  min-height: 100%;
29
49
  opacity: 1;
30
50
  overflow: auto;
31
- transition: opacity 120ms ease;
32
51
  width: 100%;
33
52
  }
34
53
 
35
- html.kward-page-loading body.kward-docs {
36
- cursor: progress;
37
- opacity: 0.72;
38
- }
39
-
40
54
  body.kward-docs::before {
41
55
  background-image:
42
56
  linear-gradient(rgba(255, 255, 255, 0.025) 1px, transparent 1px),
@@ -180,6 +194,11 @@ body.kward-docs::before {
180
194
  color: var(--kward-ink);
181
195
  }
182
196
 
197
+ .kward-guide-search-results a.kward-search-active {
198
+ background: rgba(156, 175, 53, 0.2);
199
+ color: var(--kward-accent-bright);
200
+ }
201
+
183
202
  .kward-guide-search-results strong {
184
203
  color: var(--kward-accent-bright);
185
204
  display: block;
@@ -195,23 +214,58 @@ body.kward-docs::before {
195
214
  }
196
215
 
197
216
  .kward-nav-toggle {
217
+ align-items: center;
198
218
  background: transparent;
199
219
  border: 1px solid rgba(156, 175, 53, 0.52);
200
220
  border-radius: 8px;
201
221
  color: var(--kward-accent-bright);
202
222
  cursor: pointer;
203
223
  display: none;
224
+ flex-direction: column;
204
225
  font: inherit;
226
+ gap: 5px;
227
+ justify-content: center;
205
228
  justify-self: end;
206
- padding: 12px 16px;
229
+ padding: 10px 12px;
207
230
  text-decoration: none;
208
231
  }
209
232
 
233
+ .kward-nav-toggle-bar {
234
+ background: var(--kward-accent-bright);
235
+ border-radius: 2px;
236
+ display: block;
237
+ height: 2px;
238
+ transition: transform 140ms ease, opacity 140ms ease;
239
+ width: 22px;
240
+ }
241
+
242
+ body.kward-nav-open .kward-nav-toggle-bar:nth-child(1) {
243
+ transform: translateY(7px) rotate(45deg);
244
+ }
245
+
246
+ body.kward-nav-open .kward-nav-toggle-bar:nth-child(2) {
247
+ opacity: 0;
248
+ }
249
+
250
+ body.kward-nav-open .kward-nav-toggle-bar:nth-child(3) {
251
+ transform: translateY(-7px) rotate(-45deg);
252
+ }
253
+
210
254
  .kward-nav-toggle:hover {
211
255
  background: rgba(156, 175, 53, 0.12);
212
256
  color: var(--kward-accent-bright);
213
257
  }
214
258
 
259
+ /* Keyboard focus indicators for interactive elements. */
260
+ body.kward-docs a:focus-visible,
261
+ body.kward-docs button:focus-visible,
262
+ body.kward-docs input:focus-visible,
263
+ body.kward-docs .kward-nav-toggle:focus-visible,
264
+ body.kward-docs .kward-nav-menu-button:focus-visible {
265
+ outline: 2px solid var(--kward-accent-bright);
266
+ outline-offset: 2px;
267
+ }
268
+
215
269
  body.kward-docs .nav_wrap,
216
270
  body.kward-docs #resizer {
217
271
  display: none;
@@ -315,7 +369,7 @@ body.kward-docs #footer {
315
369
  }
316
370
 
317
371
  .kward-nav-toggle {
318
- display: inline-block;
372
+ display: flex;
319
373
  }
320
374
 
321
375
 
@@ -371,6 +425,101 @@ body.kward-docs #footer {
371
425
  color: var(--kward-accent-bright);
372
426
  }
373
427
 
428
+ /*
429
+ Hero tagline "swosh": "Your terminal." flies out to the left and is
430
+ replaced by "Your RPC frontend." flying in from the right, then cycles
431
+ back. The second line mirrors it from the opposite side — "Your agent."
432
+ flies out to the right and is replaced by "Your engine." flying in from
433
+ the left — both lines swap in sync. Pure CSS — no JS. The global
434
+ @media (prefers-reduced-motion) rule above collapses the animation to
435
+ the static original copy ("Your terminal. Your agent.") so it remains
436
+ accessible and calm.
437
+ */
438
+ .kward-swosh {
439
+ box-sizing: content-box;
440
+ display: inline-block;
441
+ height: 0.98em;
442
+ line-height: 0.98;
443
+ margin: -0.16em -0.08em;
444
+ overflow: hidden;
445
+ padding: 0.16em 0.08em;
446
+ position: relative;
447
+ vertical-align: top;
448
+ }
449
+
450
+ .kward-hero h1 .kward-swosh-text {
451
+ color: var(--kward-ink);
452
+ display: inline-block;
453
+ line-height: 0.98;
454
+ white-space: nowrap;
455
+ will-change: transform, opacity;
456
+ }
457
+
458
+ /* The longer text ("Your RPC frontend.") stays in flow to size the box;
459
+ the shorter "Your terminal." overlays it absolutely. */
460
+ .kward-swosh-text-a {
461
+ left: 0.08em;
462
+ position: absolute;
463
+ top: 0.16em;
464
+ }
465
+
466
+ .kward-swosh-text-a {
467
+ animation: kward-swosh-a 12s cubic-bezier(0.22, 0.61, 0.36, 1) infinite;
468
+ }
469
+
470
+ .kward-swosh-text-b {
471
+ animation: kward-swosh-b 12s cubic-bezier(0.22, 0.61, 0.36, 1) infinite;
472
+ position: relative;
473
+ }
474
+
475
+ @keyframes kward-swosh-a {
476
+ 0%, 40% { transform: translateX(0); opacity: 1; filter: none; }
477
+ 50% { transform: translateX(-140%); opacity: 0; filter: blur(3px); }
478
+ 51%, 88% { transform: translateX(140%); opacity: 0; filter: none; }
479
+ 100% { transform: translateX(0); opacity: 1; filter: none; }
480
+ }
481
+
482
+ @keyframes kward-swosh-b {
483
+ 0%, 40% { transform: translateX(140%); opacity: 0; filter: none; }
484
+ 50% { transform: translateX(0); opacity: 1; filter: none; }
485
+ 88% { transform: translateX(0); opacity: 1; filter: none; }
486
+ 100% { transform: translateX(-140%); opacity: 0; filter: blur(3px); }
487
+ }
488
+
489
+ /*
490
+ Second line, mirrored: "Your agent." exits to the right while
491
+ "Your LLM engine." enters from the left (left-to-right), in sync with
492
+ the first swosh. Both texts keep the accent-bright color of the
493
+ original "Your agent." span.
494
+ */
495
+ .kward-hero h1 .kward-swosh-text-c {
496
+ animation: kward-swosh-c 12s cubic-bezier(0.22, 0.61, 0.36, 1) infinite;
497
+ color: var(--kward-accent-bright);
498
+ left: 0.08em;
499
+ position: absolute;
500
+ top: 0.16em;
501
+ }
502
+
503
+ .kward-hero h1 .kward-swosh-text-d {
504
+ animation: kward-swosh-d 12s cubic-bezier(0.22, 0.61, 0.36, 1) infinite;
505
+ color: var(--kward-accent-bright);
506
+ position: relative;
507
+ }
508
+
509
+ @keyframes kward-swosh-c {
510
+ 0%, 40% { transform: translateX(0); opacity: 1; filter: none; }
511
+ 50% { transform: translateX(140%); opacity: 0; filter: blur(3px); }
512
+ 51%, 88% { transform: translateX(-140%); opacity: 0; filter: none; }
513
+ 100% { transform: translateX(0); opacity: 1; filter: none; }
514
+ }
515
+
516
+ @keyframes kward-swosh-d {
517
+ 0%, 40% { transform: translateX(-140%); opacity: 0; filter: none; }
518
+ 50% { transform: translateX(0); opacity: 1; filter: none; }
519
+ 88% { transform: translateX(0); opacity: 1; filter: none; }
520
+ 100% { transform: translateX(140%); opacity: 0; filter: blur(3px); }
521
+ }
522
+
374
523
  .kward-lede {
375
524
  color: var(--kward-ink);
376
525
  font-size: 19px;
@@ -759,10 +908,17 @@ body.kward-docs #content li,
759
908
  body.kward-docs #filecontents p,
760
909
  body.kward-docs #filecontents li {
761
910
  color: var(--kward-ink);
911
+ font-family: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
762
912
  font-size: 17px;
763
913
  line-height: 1.72;
764
914
  }
765
915
 
916
+ body.kward-docs #filecontents p,
917
+ body.kward-docs #filecontents li,
918
+ body.kward-docs #content p {
919
+ max-width: 72ch;
920
+ }
921
+
766
922
  body.kward-docs #content ul,
767
923
  body.kward-docs #filecontents ul,
768
924
  body.kward-docs #content ol,
@@ -991,69 +1147,107 @@ body.kward-docs .kward-home #footer {
991
1147
  }
992
1148
 
993
1149
  @media (max-width: 920px) {
994
- .kward-topnav {
1150
+ /* The nav panel: hidden until the hamburger is tapped. */
1151
+ body.kward-docs .kward-topnav {
995
1152
  background: rgba(5, 9, 5, 0.98);
996
1153
  border: 1px solid rgba(156, 175, 53, 0.32);
997
1154
  border-radius: 12px;
998
1155
  box-shadow: 0 24px 70px rgba(0, 0, 0, 0.48);
999
- display: none;
1000
- gap: 0;
1001
- height: auto;
1002
- left: 16px;
1003
- padding: 12px;
1156
+ display: none !important;
1157
+ flex-direction: column;
1158
+ gap: 2px;
1159
+ height: auto !important;
1160
+ left: 12px;
1161
+ max-height: calc(100vh - 100px);
1162
+ overflow-y: auto;
1163
+ padding: 8px;
1004
1164
  position: fixed;
1005
- right: 16px;
1165
+ right: 12px;
1006
1166
  top: 88px;
1007
1167
  z-index: 40;
1008
1168
  }
1009
1169
 
1010
- body.kward-nav-open .kward-topnav {
1011
- display: block;
1170
+ body.kward-docs.kward-nav-open .kward-topnav {
1171
+ display: flex !important;
1172
+ }
1173
+
1174
+ /* Every nav item: reset desktop stretch/height, force visibility. */
1175
+ body.kward-docs .kward-nav-menu,
1176
+ body.kward-docs .kward-topnav > a,
1177
+ body.kward-docs .kward-nav-menu-link,
1178
+ body.kward-docs .kward-nav-menu-button {
1179
+ height: auto !important;
1180
+ opacity: 1 !important;
1181
+ pointer-events: auto !important;
1182
+ visibility: visible !important;
1012
1183
  }
1013
1184
 
1014
- .kward-nav-menu {
1015
- display: block;
1185
+ body.kward-docs .kward-nav-menu {
1186
+ display: flex !important;
1187
+ flex-direction: column;
1188
+ position: relative;
1016
1189
  }
1017
1190
 
1018
- .kward-topnav > a,
1019
- .kward-nav-menu-link,
1020
- .kward-nav-menu-button {
1191
+ body.kward-docs .kward-topnav > a,
1192
+ body.kward-docs .kward-nav-menu-link {
1193
+ align-items: center;
1021
1194
  border: 0;
1022
1195
  border-radius: 8px;
1023
1196
  box-sizing: border-box;
1024
- display: inline-flex;
1025
- height: auto;
1026
- padding: 11px 12px;
1197
+ color: var(--kward-ink) !important;
1198
+ display: flex !important;
1199
+ font-weight: 700;
1200
+ padding: 14px 16px;
1201
+ text-decoration: none;
1202
+ width: 100%;
1027
1203
  }
1028
1204
 
1029
- .kward-topnav > a {
1030
- width: 100%;
1205
+ body.kward-docs .kward-nav-menu-button {
1206
+ display: none !important;
1031
1207
  }
1032
1208
 
1033
- .kward-nav-menu-link {
1034
- width: calc(100% - 48px);
1209
+ /* All dropdown links visible directly — no accordion on mobile. */
1210
+ body.kward-docs .kward-nav-dropdown {
1211
+ background: transparent !important;
1212
+ border: 0 !important;
1213
+ border-radius: 0 !important;
1214
+ box-shadow: none !important;
1215
+ display: block !important;
1216
+ grid-template-columns: 1fr !important;
1217
+ left: auto !important;
1218
+ opacity: 1 !important;
1219
+ padding: 0 0 4px 8px !important;
1220
+ pointer-events: auto !important;
1221
+ position: static !important;
1222
+ top: auto !important;
1223
+ transform: none !important;
1224
+ transition: none !important;
1225
+ width: auto !important;
1035
1226
  }
1036
1227
 
1037
- .kward-nav-menu-button {
1038
- justify-content: center;
1039
- width: 44px;
1228
+ body.kward-docs .kward-nav-dropdown section {
1229
+ margin-bottom: 2px;
1040
1230
  }
1041
1231
 
1042
- .kward-nav-dropdown {
1043
- background: rgba(255, 255, 255, 0.03);
1044
- border: 0;
1045
- box-shadow: none;
1046
- grid-template-columns: 1fr;
1047
- left: auto;
1048
- opacity: 1;
1049
- padding: 8px 0 8px 14px;
1050
- pointer-events: auto;
1051
- position: static;
1052
- top: auto;
1053
- transform: none;
1054
- width: auto;
1232
+ body.kward-docs .kward-nav-dropdown h2 {
1233
+ border-bottom: 0;
1234
+ color: var(--kward-muted);
1235
+ font-size: 11px;
1236
+ letter-spacing: 0.1em;
1237
+ margin: 8px 10px 4px;
1238
+ padding: 0;
1239
+ }
1240
+
1241
+ body.kward-docs .kward-nav-dropdown a {
1242
+ border-radius: 8px;
1243
+ color: var(--kward-ink) !important;
1244
+ display: block !important;
1245
+ padding: 12px 14px;
1246
+ text-decoration: none;
1055
1247
  }
1056
1248
 
1249
+ /* Search is hidden on mobile; it lives only in the desktop topbar. */
1250
+
1057
1251
  .kward-page {
1058
1252
  padding: 104px 16px 42px;
1059
1253
  }
@@ -1295,37 +1489,12 @@ body.kward-docs .kward-nav-toggle {
1295
1489
  z-index: 9200;
1296
1490
  }
1297
1491
 
1298
- /* Mobile navigation fallback: make the toggle independent of YARD JS timing. */
1492
+ /* Mobile navigation: z-index and color highlights. */
1299
1493
  @media (max-width: 920px) {
1300
1494
  body.kward-docs .kward-topnav {
1301
1495
  z-index: 9300;
1302
1496
  }
1303
1497
 
1304
- body.kward-docs.kward-nav-open #kward-primary-nav,
1305
- body.kward-docs.kward-nav-open .kward-topnav {
1306
- display: block !important;
1307
- }
1308
- }
1309
-
1310
- /* Mobile uses tap state, not hover, for the Guides dropdown. */
1311
- @media (max-width: 920px) {
1312
- body.kward-docs .kward-nav-menu:hover .kward-nav-dropdown,
1313
- body.kward-docs .kward-nav-menu:focus-within .kward-nav-dropdown {
1314
- display: none;
1315
- }
1316
-
1317
- body.kward-docs .kward-nav-menu.open .kward-nav-dropdown {
1318
- display: grid;
1319
- opacity: 1;
1320
- pointer-events: auto;
1321
- transform: none;
1322
- }
1323
-
1324
- body.kward-docs .kward-nav-menu:hover .kward-nav-menu-link,
1325
- body.kward-docs .kward-nav-menu:hover .kward-nav-menu-button {
1326
- border-bottom-color: transparent;
1327
- }
1328
-
1329
1498
  body.kward-docs .kward-nav-menu.open .kward-nav-menu-link,
1330
1499
  body.kward-docs .kward-nav-menu.open .kward-nav-menu-button,
1331
1500
  body.kward-docs .kward-nav-menu.active .kward-nav-menu-link,
@@ -1418,6 +1587,8 @@ body.kward-docs #filecontents table {
1418
1587
  border: 1px solid rgba(149, 169, 52, 0.34);
1419
1588
  border-collapse: collapse;
1420
1589
  color: var(--kward-ink);
1590
+ display: block;
1591
+ overflow-x: auto;
1421
1592
  width: 100%;
1422
1593
  }
1423
1594
 
@@ -1499,3 +1670,75 @@ body.kward-docs ul.toplevel a:active {
1499
1670
  color: #f0f7a0 !important;
1500
1671
  text-decoration: none;
1501
1672
  }
1673
+
1674
+ /* Respect users who prefer reduced motion. */
1675
+ @media (prefers-reduced-motion: reduce) {
1676
+ *,
1677
+ *::before,
1678
+ *::after {
1679
+ animation-duration: 0.01ms !important;
1680
+ animation-iteration-count: 1 !important;
1681
+ scroll-behavior: auto !important;
1682
+ transition-duration: 0.01ms !important;
1683
+ }
1684
+ }
1685
+
1686
+ /* Printable documentation: white background, black text, hide navigation. */
1687
+ @media print {
1688
+ body.kward-docs {
1689
+ background: #fff;
1690
+ color: #000;
1691
+ }
1692
+
1693
+ .kward-topbar,
1694
+ .kward-skip-link,
1695
+ .kward-guide-search,
1696
+ .kward-nav-toggle,
1697
+ #toc,
1698
+ .copy-code-button,
1699
+ .code-copy-wrapper .copy-code-button {
1700
+ display: none !important;
1701
+ }
1702
+
1703
+ body.kward-docs #content,
1704
+ body.kward-docs #filecontents {
1705
+ background: #fff;
1706
+ border: 0;
1707
+ box-shadow: none;
1708
+ color: #000;
1709
+ padding: 0;
1710
+ }
1711
+
1712
+ body.kward-docs #content h1,
1713
+ body.kward-docs #content h2,
1714
+ body.kward-docs #content h3,
1715
+ body.kward-docs #filecontents h1,
1716
+ body.kward-docs #filecontents h2,
1717
+ body.kward-docs #filecontents h3 {
1718
+ color: #000;
1719
+ }
1720
+
1721
+ body.kward-docs #content p,
1722
+ body.kward-docs #content li,
1723
+ body.kward-docs #filecontents p,
1724
+ body.kward-docs #filecontents li {
1725
+ color: #000;
1726
+ }
1727
+
1728
+ body.kward-docs #content a,
1729
+ body.kward-docs #filecontents a {
1730
+ color: #000;
1731
+ text-decoration: underline;
1732
+ }
1733
+
1734
+ body.kward-docs pre {
1735
+ background: #f4f4f4;
1736
+ border: 1px solid #ccc;
1737
+ color: #000;
1738
+ }
1739
+
1740
+ .kward-page {
1741
+ padding: 0;
1742
+ max-width: none;
1743
+ }
1744
+ }