kash-shell 0.3.24__py3-none-any.whl → 0.3.26__py3-none-any.whl

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 (42) hide show
  1. kash/commands/help/assistant_commands.py +4 -3
  2. kash/config/colors.py +5 -3
  3. kash/config/text_styles.py +1 -0
  4. kash/config/unified_live.py +251 -0
  5. kash/docs/markdown/assistant_instructions_template.md +3 -3
  6. kash/docs/markdown/topics/a1_what_is_kash.md +22 -20
  7. kash/docs/markdown/topics/a2_installation.md +10 -10
  8. kash/docs/markdown/topics/a3_getting_started.md +8 -8
  9. kash/docs/markdown/topics/a4_elements.md +3 -3
  10. kash/docs/markdown/topics/a5_tips_for_use_with_other_tools.md +12 -12
  11. kash/docs/markdown/topics/b0_philosophy_of_kash.md +17 -17
  12. kash/docs/markdown/topics/b1_kash_overview.md +7 -7
  13. kash/docs/markdown/topics/b2_workspace_and_file_formats.md +1 -1
  14. kash/docs/markdown/topics/b3_modern_shell_tool_recommendations.md +1 -1
  15. kash/docs/markdown/topics/b4_faq.md +7 -7
  16. kash/docs/markdown/welcome.md +1 -1
  17. kash/embeddings/embeddings.py +112 -43
  18. kash/embeddings/text_similarity.py +4 -7
  19. kash/exec/shell_callable_action.py +4 -3
  20. kash/help/help_embeddings.py +8 -2
  21. kash/llm_utils/llm_features.py +1 -1
  22. kash/llm_utils/llms.py +5 -7
  23. kash/model/graph_model.py +2 -0
  24. kash/model/items_model.py +3 -3
  25. kash/model/params_model.py +1 -1
  26. kash/shell/output/shell_output.py +2 -2
  27. kash/utils/file_utils/csv_utils.py +105 -0
  28. kash/utils/rich_custom/multitask_status.py +19 -5
  29. kash/utils/text_handling/doc_normalization.py +2 -0
  30. kash/web_gen/templates/base_styles.css.jinja +356 -24
  31. kash/web_gen/templates/base_webpage.html.jinja +11 -0
  32. kash/web_gen/templates/components/toc_styles.css.jinja +15 -3
  33. kash/web_gen/templates/components/tooltip_styles.css.jinja +1 -0
  34. kash/web_gen/templates/content_styles.css.jinja +23 -9
  35. kash/web_gen/templates/item_view.html.jinja +12 -4
  36. kash/web_gen/templates/simple_webpage.html.jinja +2 -2
  37. kash/xonsh_custom/custom_shell.py +7 -4
  38. {kash_shell-0.3.24.dist-info → kash_shell-0.3.26.dist-info}/METADATA +58 -55
  39. {kash_shell-0.3.24.dist-info → kash_shell-0.3.26.dist-info}/RECORD +42 -40
  40. {kash_shell-0.3.24.dist-info → kash_shell-0.3.26.dist-info}/WHEEL +0 -0
  41. {kash_shell-0.3.24.dist-info → kash_shell-0.3.26.dist-info}/entry_points.txt +0 -0
  42. {kash_shell-0.3.24.dist-info → kash_shell-0.3.26.dist-info}/licenses/LICENSE +0 -0
@@ -3,12 +3,22 @@
3
3
  font-size: 16px;
4
4
  /* Adding Hack Nerd Font to all fonts for icon support, if it is installed. */
5
5
  --font-sans: "Source Sans 3 Variable", sans-serif, "Hack Nerd Font";
6
- --font-serif: "PT Serif", serif, "Hack Nerd Font";
6
+ --font-serif: "LocalPunct", "PT Serif", serif, "Hack Nerd Font";
7
7
  /* Source Sans 3 Variable better at these weights. */
8
8
  --font-weight-sans-medium: 550;
9
9
  --font-weight-sans-bold: 650;
10
10
  --font-mono: "Hack Nerd Font", "Menlo", "DejaVu Sans Mono", Consolas, "Lucida Console", monospace;
11
11
 
12
+ --font-features-sans: normal;
13
+ {#
14
+ /* TODO: FontSource builds don't seem to support these. Might be nice to use. */
15
+ --font-features-sans:
16
+ "ss01" 0, /* Flat-tailed l */
17
+ "ss02" 1, /* Single-storey a */
18
+ "ss03" 0, /* Single-storey g */
19
+ "ss04" 0; /* Sans-bar I */
20
+ #}
21
+
12
22
  --font-size-large: 1.2rem;
13
23
  --font-size-normal: 1rem;
14
24
  --font-size-small: 0.95rem;
@@ -17,11 +27,27 @@
17
27
  --font-size-mono-small: 0.75rem;
18
28
  --font-size-mono-tiny: 0.7rem;
19
29
 
30
+ /* Both Source Sans 3 and PT Serif have small caps, so we use this instead of text-transform. */
31
+ --caps-transform: none;
32
+ --caps-caps-variant: all-small-caps;
33
+ --caps-spacing: 0.025em;
34
+ /* Compensate for small caps (Source Sans small caps are quite small) */
35
+ --caps-heading-size-multiplier: 1.42;
36
+ --caps-heading-line-height: calc(1.2 / var(--caps-heading-size-multiplier));
37
+
38
+ {#
39
+ /* Option to handle small caps manually. */
40
+ --caps-transform: uppercase;
41
+ --caps-caps-variant: none;
42
+ --caps-spacing: 0.025em;
43
+ #}
44
+
20
45
  --console-char-width: 88;
21
46
  --console-width: calc(var(--console-char-width) + 2rem);
22
47
  {% endblock root_variables %}
23
48
  }
24
49
 
50
+ /* CSS color definitions. */
25
51
  {{ color_defs|safe }}
26
52
 
27
53
  {% block selection_styles %}
@@ -115,12 +141,7 @@ a:hover {
115
141
  transition: all 0.15s ease-in-out;
116
142
  }
117
143
 
118
- h1,
119
- h2,
120
- h3,
121
- h4,
122
- h5,
123
- h6 {
144
+ h1, h2, h3, h4, h5, h6 {
124
145
  line-height: 1.2;
125
146
  }
126
147
 
@@ -131,7 +152,7 @@ h1 {
131
152
  }
132
153
 
133
154
  h2 {
134
- font-size: 1.42rem;
155
+ font-size: 1.32rem;
135
156
  margin-top: 2rem;
136
157
  margin-bottom: 1rem;
137
158
  }
@@ -145,13 +166,13 @@ h2 + h3 {
145
166
  }
146
167
 
147
168
  h3 {
148
- font-size: 1.18rem;
169
+ font-size: 1.15rem;
149
170
  margin-top: 1.4rem;
150
171
  margin-bottom: 0.7rem;
151
172
  }
152
173
 
153
174
  h4 {
154
- font-size: 1.1rem;
175
+ font-size: 1.12rem;
155
176
  margin-top: 1rem;
156
177
  margin-bottom: 0.7rem;
157
178
  }
@@ -300,13 +321,17 @@ img {
300
321
 
301
322
  details {
302
323
  font-family: var(--font-sans);
324
+ font-feature-settings: var(--font-features-sans);
303
325
  color: var(--color-text);
304
326
 
305
327
  border: 1px solid var(--color-hint-gentle);
306
- border-radius: 3px;
307
328
  margin: 0.75rem 0;
308
329
  }
309
330
 
331
+ details > :not(summary) {
332
+ padding: 0 0.75rem;
333
+ }
334
+
310
335
  summary {
311
336
  color: var(--color-secondary);
312
337
  padding: .5rem 1rem;
@@ -316,9 +341,12 @@ summary {
316
341
  transition: all 0.15s ease-in-out;
317
342
  }
318
343
 
344
+ summary::marker {
345
+ font-size: 0.85rem;
346
+ }
347
+
319
348
  summary:hover {
320
349
  color: var(--color-primary-light);
321
- {# background: var(--color-hover-bg); #}
322
350
  }
323
351
 
324
352
  /* keep the border on the summary when open so it blends */
@@ -331,6 +359,36 @@ summary:focus-visible {
331
359
  outline-offset: 2px;
332
360
  }
333
361
 
362
+ /* Special formatting for document metadata details */
363
+ details.metadata {
364
+ color: var(--color-tertiary);
365
+ }
366
+
367
+ details.metadata > :not(summary) {
368
+ color: var(--color-secondary);
369
+ }
370
+
371
+ details.metadata summary {
372
+ font-weight: 550;
373
+ font-size: calc(var(--font-size-small) * var(--caps-heading-size-multiplier));
374
+ line-height: var(--caps-heading-line-height);
375
+ text-transform: var(--caps-transform);
376
+ font-variant-caps: var(--caps-caps-variant);
377
+ letter-spacing: var(--caps-spacing);
378
+ color: var(--color-tertiary);
379
+ }
380
+
381
+ details.metadata summary:hover {
382
+ color: var(--color-primary-light);
383
+ }
384
+
385
+ details.metadata blockquote {
386
+ border-left: none;
387
+ margin: 0 0.75rem;
388
+ font-size: var(--font-size-small);
389
+ font-style: italic;
390
+ }
391
+
334
392
 
335
393
  hr {
336
394
  border: none;
@@ -374,15 +432,21 @@ hr:before {
374
432
 
375
433
  .long-text h3 {
376
434
  font-family: var(--font-sans);
435
+ font-feature-settings: var(--font-features-sans);
377
436
  font-weight: 550;
378
- text-transform: uppercase;
379
- letter-spacing: 0.025em;
437
+ font-size: calc(1.15rem * var(--caps-heading-size-multiplier));
438
+ line-height: var(--caps-heading-line-height);
439
+ text-transform: var(--caps-transform);
440
+ font-variant-caps: var(--caps-caps-variant);
441
+ letter-spacing: var(--caps-spacing);
380
442
  }
381
443
 
382
444
  .long-text h4 {
383
- font-family: var(--font-serif);
384
- font-weight: 400;
445
+ font-family: var(--font-sans);
446
+ font-feature-settings: var(--font-features-sans);
447
+ font-weight: 540;
385
448
  font-style: italic;
449
+ letter-spacing: 0.015em;
386
450
  }
387
451
 
388
452
  .long-text h5 {
@@ -406,6 +470,7 @@ hr:before {
406
470
 
407
471
  .long-text .sans-text {
408
472
  font-family: var(--font-sans);
473
+ font-feature-settings: var(--font-features-sans);
409
474
  }
410
475
 
411
476
  .long-text .sans-text p {
@@ -415,6 +480,7 @@ hr:before {
415
480
 
416
481
  .long-text .sans-text h1 {
417
482
  font-family: var(--font-sans);
483
+ font-feature-settings: var(--font-features-sans);
418
484
  font-size: 1.75rem;
419
485
  font-weight: 380;
420
486
  margin-top: 1rem;
@@ -423,6 +489,7 @@ hr:before {
423
489
 
424
490
  .long-text .sans-text h2 {
425
491
  font-family: var(--font-sans);
492
+ font-feature-settings: var(--font-features-sans);
426
493
  font-size: 1.25rem;
427
494
  font-weight: 440;
428
495
  margin-top: 1rem;
@@ -431,10 +498,13 @@ hr:before {
431
498
 
432
499
  .long-text .sans-text h3 {
433
500
  font-family: var(--font-sans);
434
- font-size: 1.1rem;
501
+ font-feature-settings: var(--font-features-sans);
435
502
  font-weight: var(--font-weight-sans-bold);
436
- text-transform: uppercase;
437
- letter-spacing: 0.03em;
503
+ font-size: calc(1.1rem * var(--caps-heading-size-multiplier));
504
+ line-height: var(--caps-heading-line-height);
505
+ text-transform: var(--caps-transform);
506
+ font-variant-caps: var(--caps-caps-variant);
507
+ letter-spacing: var(--caps-spacing);
438
508
  margin-top: 1rem;
439
509
  margin-bottom: 0.8rem;
440
510
  }
@@ -447,6 +517,7 @@ table, th, td, tbody tr {
447
517
 
448
518
  table {
449
519
  font-family: var(--font-sans);
520
+ font-feature-settings: var(--font-features-sans);
450
521
  font-size: var(--font-size-small);
451
522
  width: auto;
452
523
  margin-left: auto;
@@ -459,10 +530,12 @@ table {
459
530
 
460
531
  th {
461
532
  font-weight: var(--font-weight-sans-bold);
462
- text-transform: uppercase;
463
- letter-spacing: 0.03em;
533
+ font-size: calc(var(--font-size-small) * var(--caps-heading-size-multiplier));
534
+ line-height: var(--caps-heading-line-height);
535
+ text-transform: var(--caps-transform);
536
+ font-variant-caps: var(--caps-caps-variant);
537
+ letter-spacing: var(--caps-spacing);
464
538
  border-bottom: 1px solid var(--color-border-hint);
465
- line-height: 1.2;
466
539
  background-color: var(--color-bg-alt-solid);
467
540
  }
468
541
 
@@ -526,12 +599,16 @@ sup {
526
599
 
527
600
  .footnote-ref a, .footnote {
528
601
  font-family: var(--font-sans);
602
+ font-feature-settings: var(--font-features-sans);
603
+ background-color: var(--color-bg-meta-solid);
604
+ color: var(--color-hint-strong);
529
605
  text-decoration: none;
530
606
  padding: 0 0.15rem;
531
- border-radius: 4px;
607
+ margin-right: 0.15rem;
608
+ border-radius: 6px;
532
609
  transition: all 0.15s ease-in-out;
533
610
  font-style: normal;
534
- font-weight: 500;
611
+ font-weight: 600;
535
612
  }
536
613
 
537
614
  .footnote-ref a:hover, .footnote:hover {
@@ -539,8 +616,257 @@ sup {
539
616
  color: var(--color-primary-light);
540
617
  text-decoration: none;
541
618
  }
619
+
620
+ @media print {
621
+ sup {
622
+ font-size: 70% !important;
623
+ }
624
+
625
+ /* Don't use stylized footnotes in print. */
626
+ .footnote-ref a, .footnote {
627
+ font-family: var(--font-serif);
628
+ font-feature-settings: normal !important;
629
+ background-color: transparent !important;
630
+ color: var(--color-text) !important;
631
+ padding: 0 0.05rem !important;
632
+ font-weight: 400 !important;
633
+ }
634
+
635
+ .footnote-ref a:hover, .footnote:hover {
636
+ background-color: transparent !important;
637
+ color: var(--color-text) !important;
638
+ }
639
+
640
+ /* Hide footnote return arrows/links in print */
641
+ .footnote-backref,
642
+ .footnote-return,
643
+ a[href^="#fnref"],
644
+ .reversefootnote {
645
+ display: none !important;
646
+ }
647
+
648
+ /* Also hide common up arrow characters */
649
+ .footnote::after[content*="↩"],
650
+ .footnote::after[content*="↑"] {
651
+ display: none !important;
652
+ }
653
+ }
654
+
542
655
  {% endblock footnote_styles %}
543
656
 
657
+ {% block print_styles %}
658
+ /* Print media adjustments for better readability and layout */
659
+ @media print {
660
+ @page {
661
+ /* Set page margins for physical page */
662
+ margin: 0.7in 0.95in 0.8in 0.95in;
663
+
664
+ @top-center {
665
+ content: "";
666
+ }
667
+
668
+ @bottom-left {
669
+ content: "Formatted by Kash — github.com/jlevy/kash";
670
+ font-family: var(--font-sans) !important;
671
+ font-size: var(--font-size-small);
672
+ color: var(--color-tertiary) !important;
673
+ margin: 0 0 0.2in 0 !important;
674
+ }
675
+
676
+ @bottom-right {
677
+ content: counter(page);
678
+ font-family: var(--font-sans) !important;
679
+ font-size: var(--font-size-small);
680
+ color: var(--color-tertiary) !important;
681
+ margin: 0 0 0.2in 0 !important;
682
+ }
683
+ }
684
+
685
+ :root {
686
+ /* Slightly larger fonts for print readability */
687
+ --font-size-normal: 1.1rem;
688
+ --font-size-small: 1.0rem;
689
+ --font-size-smaller: 0.9rem;
690
+ --font-size-mono: 0.9rem;
691
+ }
692
+
693
+ body {
694
+ /* Remove body margin since @page handles it */
695
+ margin: 0;
696
+ /* Ensure good line height for print */
697
+ line-height: 1.6;
698
+ }
699
+
700
+ /* Enable hyphenation and justification for main text content only */
701
+ p, blockquote {
702
+ hyphens: auto;
703
+ text-align: justify;
704
+ }
705
+
706
+
707
+
708
+ .long-text {
709
+ /* Remove shadows and borders that don't work well in print */
710
+ box-shadow: none !important;
711
+ border: none !important;
712
+ /* Add print-specific margins */
713
+ padding: 0;
714
+ }
715
+
716
+ /* Ensure tables don't break layout in print */
717
+ .table-container {
718
+ position: static;
719
+ transform: none;
720
+ left: auto;
721
+ width: 100%;
722
+ max-width: 100%;
723
+ overflow: visible;
724
+ }
725
+
726
+ table {
727
+ width: 100%;
728
+ max-width: 100%;
729
+ font-size: 0.9rem;
730
+ }
731
+
732
+ /* Adjust code blocks for print */
733
+ pre {
734
+ white-space: pre-wrap;
735
+ word-wrap: break-word;
736
+ }
737
+
738
+ /* Hide interactive elements that don't work in print */
739
+ .code-copy-button {
740
+ display: none !important;
741
+ }
742
+
743
+ /* Page break controls */
744
+ h1, h2, h3, h4, h5, h6 {
745
+ break-after: avoid;
746
+ page-break-after: avoid; /* Fallback for older browsers */
747
+ break-inside: avoid;
748
+ page-break-inside: avoid; /* Fallback for older browsers */
749
+ }
750
+
751
+ /* Avoid breaking these elements */
752
+ blockquote, pre, .code-block-wrapper, figure, .table-container {
753
+ break-inside: avoid;
754
+ page-break-inside: avoid; /* Fallback for older browsers */
755
+ }
756
+
757
+ /* Control text flow */
758
+ p {
759
+ orphans: 3; /* Minimum lines at bottom of page */
760
+ widows: 3; /* Minimum lines at top of page */
761
+ }
762
+
763
+ /* Keep list items together when reasonable */
764
+ li {
765
+ break-inside: avoid-page;
766
+ page-break-inside: avoid; /* Fallback for older browsers */
767
+ }
768
+
769
+ /* Hide doc metadata details in print (for now) */
770
+ details.metadata {
771
+ display: none !important;
772
+ }
773
+
774
+ /* XXX: long endnote lists cut off the numbers. This is a workaround:
775
+ * Custom numbering system for ordered lists using Grid for alignment */
776
+ ol {
777
+ list-style: none;
778
+ counter-reset: list-counter;
779
+ padding-left: 0;
780
+ margin-left: 1rem;
781
+ }
782
+
783
+ ol > li {
784
+ display: grid;
785
+ /* col 1: fixed width for numbers up to 999. col 2: for the content */
786
+ grid-template-columns: 2.5rem 1fr;
787
+ gap: 0 0.5rem; /* Space between number and content */
788
+ align-items: baseline; /* Aligns number with first line of text */
789
+ counter-increment: list-counter;
790
+ /* Override global li styles for grid layout */
791
+ margin-top: 0;
792
+ margin-bottom: 0.5rem;
793
+ position: static;
794
+ }
795
+
796
+ ol > li::before {
797
+ content: counter(list-counter) ".";
798
+ text-align: right;
799
+ font-family: var(--font-serif);
800
+ }
801
+
802
+ /* Place all direct children of li into the second grid column */
803
+ /* This makes p, ul, etc. stack vertically as intended */
804
+ ol > li > * {
805
+ grid-column: 2;
806
+ word-break: break-word;
807
+ overflow-wrap: break-word;
808
+ hyphens: auto;
809
+ }
810
+
811
+ /* Override justification for content within list items */
812
+ ol > li p,
813
+ ol > li blockquote {
814
+ text-align: left !important;
815
+ text-justify: none !important;
816
+ margin-top: 0; /* Tighter spacing inside list items */
817
+ }
818
+
819
+ /* --- Reset for Nested Lists --- */
820
+ /* This prevents nested lists from inheriting the grid layout */
821
+ ol ol {
822
+ margin-left: 1.5rem;
823
+ margin-top: 0.5rem;
824
+ list-style: decimal outside;
825
+ counter-reset: initial; /* Don't inherit parent counter */
826
+ }
827
+
828
+ ol ul {
829
+ margin-left: 1.5rem;
830
+ margin-top: 0.5rem;
831
+ list-style: none; /* We'll restore bullets with ::before */
832
+ }
833
+
834
+ ol ol > li {
835
+ display: list-item !important; /* Revert from grid to standard list item */
836
+ padding-left: 0.25rem;
837
+ margin-top: 0.4rem; /* Override global li margin for tighter spacing */
838
+ position: static; /* Override global li position */
839
+ /* Override justification from parent rules */
840
+ text-align: left !important;
841
+ text-justify: none !important;
842
+ }
843
+
844
+ ol ul > li {
845
+ display: list-item !important; /* Revert from grid to standard list item */
846
+ padding-left: 0.25rem;
847
+ margin-top: 0.4rem; /* Override global li margin for tighter spacing */
848
+ position: relative; /* Need relative positioning for bullet ::before */
849
+ /* Override justification from parent rules */
850
+ text-align: left !important;
851
+ text-justify: none !important;
852
+ }
853
+
854
+ /* Remove the custom counter from nested ol */
855
+ ol ol > li::before {
856
+ content: "" !important;
857
+ }
858
+
859
+ /* Restore bullets for nested ul within ol */
860
+ ol ul > li::before {
861
+ content: "▪︎";
862
+ position: absolute;
863
+ left: -.85rem;
864
+ top: .25rem;
865
+ font-size: 0.62rem;
866
+ }
867
+ }
868
+ {% endblock print_styles %}
869
+
544
870
  {% block responsive_styles %}
545
871
  /* Bleed wide on larger screens. */
546
872
  /* TODO: Don't make so wide if table itself isn't large? */
@@ -662,6 +988,12 @@ sup {
662
988
  max-width: none;
663
989
  }
664
990
 
991
+ /* Smaller table text on mobile. */
992
+ table code,
993
+ table pre {
994
+ font-size: var(--font-size-mono-small);
995
+ }
996
+
665
997
  ul, ol {
666
998
  margin-left: 1rem;
667
999
  }
@@ -152,6 +152,17 @@
152
152
  src: url(https://cdn.jsdelivr.net/fontsource/fonts/pt-serif@latest/latin-700-italic.woff2) format('woff2');
153
153
  unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
154
154
  }
155
+ /* PT Serif has a known bug with quote alignment that can look quite ugly.
156
+ * https://nedbatchelder.com/blog/201809/fixing_pt_serif.html?utm_source=chatgpt.com
157
+ * So we use a workaround to use punctuation from a different local font.
158
+ * After trying a few, it seems Georgia is workable for quote marks an non-oriented ASCII quotes. */
159
+ @font-face {
160
+ font-family: 'LocalPunct';
161
+ src: local('Georgia');
162
+ unicode-range:
163
+ U+0022, U+0027, /* " ' */
164
+ U+2018, U+2019, U+201C, U+201D; /* ‘ ’ “ ” */
165
+ }
155
166
  /* https://fontsource.org/fonts/source-sans-3/cdn */
156
167
  /* source-sans-3-latin-wght-normal */
157
168
  @font-face {
@@ -84,15 +84,18 @@
84
84
  /* TOC Styling */
85
85
  .toc {
86
86
  font-family: var(--font-sans);
87
+ font-feature-settings: var(--font-features-sans);
87
88
  color: var(--color-tertiary);
88
89
  font-variant-numeric: tabular-nums;
89
90
  }
90
91
 
91
92
  .toc-title {
92
- font-size: var(--font-size-small);
93
93
  font-weight: 550;
94
- text-transform: uppercase;
95
- letter-spacing: 0.025em;
94
+ font-size: calc(var(--font-size-small) * var(--caps-heading-size-multiplier));
95
+ line-height: var(--caps-heading-line-height);
96
+ text-transform: var(--caps-transform);
97
+ font-variant-caps: var(--caps-caps-variant);
98
+ letter-spacing: var(--caps-spacing);
96
99
  padding-left: 0.3rem;
97
100
  border-bottom: 1px solid var(--color-border-hint);
98
101
  border-left: none !important; /* Override toc-link border */
@@ -281,4 +284,13 @@ body.toc-open {
281
284
  visibility: visible;
282
285
  pointer-events: auto; /* Re-enable interaction */
283
286
  }
287
+ }
288
+
289
+ @media print {
290
+ /* Hide TOC on print */
291
+ .toc-toggle,
292
+ .toc-backdrop,
293
+ .toc-container {
294
+ display: none !important;
295
+ }
284
296
  }
@@ -67,6 +67,7 @@
67
67
  border-left: 2px solid var(--color-primary);
68
68
  color: var(--color-text);
69
69
  font-family: var(--font-sans);
70
+ font-feature-settings: var(--font-features-sans);
70
71
  font-size: var(--font-size-small);
71
72
  line-height: 1.4;
72
73
  padding: var(--tooltip-padding);
@@ -7,6 +7,7 @@
7
7
 
8
8
  .citation {
9
9
  font-family: var(--font-sans);
10
+ font-feature-settings: var(--font-features-sans);
10
11
  color: var(--color-secondary);
11
12
  display: inline-block;
12
13
  height: 1.3rem;
@@ -37,6 +38,7 @@
37
38
 
38
39
  .description {
39
40
  font-family: var(--font-sans);
41
+ font-feature-settings: var(--font-features-sans);
40
42
  font-size: var(--font-size-small);
41
43
  color: var(--color-secondary);
42
44
  margin: 2rem 0;
@@ -44,6 +46,7 @@
44
46
 
45
47
  .summary {
46
48
  font-family: var(--font-sans);
49
+ font-feature-settings: var(--font-features-sans);
47
50
  font-size: var(--font-size-small);
48
51
  margin: 1rem 0;
49
52
  padding: 1rem;
@@ -54,15 +57,19 @@
54
57
  display: block;
55
58
  text-align: center;
56
59
  font-family: var(--font-sans);
60
+ font-feature-settings: var(--font-features-sans);
57
61
  font-weight: 500;
58
- font-size: 1.2rem;
59
- text-transform: uppercase;
60
- letter-spacing: 0.02em;
62
+ font-size: calc(1.2rem * var(--caps-heading-size-multiplier));
63
+ line-height: var(--caps-heading-line-height);
64
+ text-transform: var(--caps-transform);
65
+ font-variant-caps: var(--caps-caps-variant);
66
+ letter-spacing: var(--caps-spacing);
61
67
  margin-bottom: 0.5rem;
62
68
  }
63
69
 
64
70
  .concepts {
65
71
  font-family: var(--font-sans);
72
+ font-feature-settings: var(--font-features-sans);
66
73
  font-size: var(--font-size-small);
67
74
  font-weight: bold;
68
75
  margin: 2rem 0;
@@ -79,10 +86,13 @@
79
86
  display: block;
80
87
  text-align: center;
81
88
  font-family: var(--font-sans);
89
+ font-feature-settings: var(--font-features-sans);
82
90
  font-weight: 500;
83
- font-size: 1.2rem;
84
- text-transform: uppercase;
85
- letter-spacing: 0.02em;
91
+ font-size: calc(1.2rem * var(--caps-heading-size-multiplier));
92
+ line-height: var(--caps-heading-line-height);
93
+ text-transform: var(--caps-transform);
94
+ font-variant-caps: var(--caps-caps-variant);
95
+ letter-spacing: var(--caps-spacing);
86
96
  margin-bottom: 0.5rem;
87
97
 
88
98
  /* Hack to center the header above the columns */
@@ -106,10 +116,13 @@
106
116
  max-width: 10rem;
107
117
  text-align: center;
108
118
  font-family: var(--font-sans);
109
- font-size: var(--font-size-small);
119
+ font-feature-settings: var(--font-features-sans);
110
120
  font-weight: 600;
111
- text-transform: uppercase;
112
- letter-spacing: 0.02em;
121
+ font-size: calc(var(--font-size-small) * var(--caps-heading-size-multiplier));
122
+ line-height: var(--caps-heading-line-height);
123
+ text-transform: var(--caps-transform);
124
+ font-variant-caps: var(--caps-caps-variant);
125
+ letter-spacing: var(--caps-spacing);
113
126
  line-height: 1.2;
114
127
  padding: 0 0.5rem;
115
128
  border-bottom-width: 2px;
@@ -171,6 +184,7 @@
171
184
  order: 0;
172
185
  margin: 0.5rem 1rem 0.5rem 0;
173
186
  font-family: var(--font-sans);
187
+ font-feature-settings: var(--font-features-sans);
174
188
  color: var(--color-secondary);
175
189
  border-right: 2px solid var(--color-hint);
176
190
  padding-right: 0.5rem;