lib/zen/src/slides/print.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const std = @import("std");
2
3 pub const stylesheet =
4 "<style>\n" ++
5 "@page{size:1280px 720px;margin:0}\n" ++
6 "@media print{" ++
7 ":root{print-color-adjust:exact;-webkit-print-color-adjust:exact}" ++
8 "body{margin:0!important;padding:0!important}" ++
9 ".zen-slide-toolbar,.zen-slide-notes-panel,.zen-slide-overview-panel,.zen-presenter-view{display:none!important}" ++
10 "body :not([data-zen-slides]):not([data-zen-slides] *):not(:has([data-zen-slides])){display:none!important}" ++
11 "body :has([data-zen-slides]){display:block!important;width:auto!important;max-width:none!important;margin:0!important;padding:0!important;border:0!important}" ++
12 "[data-zen-slides]{display:block!important;min-height:0!important;margin:0!important;padding:0!important;scroll-snap-type:none!important}" ++
13 "[data-zen-slides] .zen-slide{display:grid!important;place-items:center!important;width:100%!important;height:100vh!important;min-height:0!important;max-height:none!important;margin:0!important;padding:0!important;overflow:hidden!important;break-after:page;page-break-after:always;scroll-snap-align:none!important}" ++
14 "[data-zen-slides] .zen-slide:last-of-type{break-after:auto;page-break-after:auto}" ++
15 "[data-zen-slides] .zen-slide-frame{width:min(100%,177.7778vh)!important;height:min(100vh,56.25vw)!important;max-width:none!important;max-height:none!important;margin:0!important;overflow:hidden!important;box-shadow:none!important}" ++
16 "body.zen-print-notes [data-zen-slides] .zen-speaker-notes[hidden]{display:block!important;flex:0 0 auto!important;max-height:34%!important;margin:0!important;overflow:hidden!important;font-size:.9rem!important}" ++
17 "}\n" ++
18 "</style>\n";
19
20 test "print stylesheet paginates one 16:9 page per slide" {
21 try std.testing.expect(std.mem.indexOf(u8, stylesheet, "@page{size:1280px 720px;margin:0}") != null);
22 try std.testing.expect(std.mem.indexOf(u8, stylesheet, "@media print{") != null);
23 try std.testing.expect(std.mem.indexOf(u8, stylesheet, "break-after:page") != null);
24 try std.testing.expect(std.mem.indexOf(u8, stylesheet, "print-color-adjust:exact") != null);
25 try std.testing.expect(std.mem.indexOf(u8, stylesheet, ".zen-slide:last-of-type{break-after:auto") != null);
26 }
27
28 test "print stylesheet keeps deck ancestors and hides siblings" {
29 try std.testing.expect(std.mem.indexOf(u8, stylesheet, "body :not([data-zen-slides]):not([data-zen-slides] *):not(:has([data-zen-slides])){display:none!important}") != null);
30 try std.testing.expect(std.mem.indexOf(u8, stylesheet, "body :has([data-zen-slides])") != null);
31 try std.testing.expect(std.mem.indexOf(u8, stylesheet, ".zen-slide-toolbar,.zen-slide-notes-panel,.zen-slide-overview-panel,.zen-presenter-view{display:none!important}") != null);
32 }
33
34 test "print stylesheet shows speaker notes in notes mode" {
35 try std.testing.expect(std.mem.indexOf(u8, stylesheet, "body.zen-print-notes [data-zen-slides] .zen-speaker-notes[hidden]{display:block!important") != null);
36 }