Compare commits

..

No commits in common. "d63b6a6f536845bdbe9c857d396fcefc4131e03f" and "7863c6d7a8be7c1077119e990b2462ef89fa7a09" have entirely different histories.

7 changed files with 246 additions and 465 deletions

View file

@ -1,6 +1,5 @@
#import "@preview/polylux:0.4.0": * #import "@preview/polylux:0.4.0": *
#import "slides/lib.typ": * #import "slides/lib.typ": *
#import "slides/icons.typ" as ico
#import "@preview/codly:1.3.0": * #import "@preview/codly:1.3.0": *
#import "@preview/codly-languages:0.1.1": * #import "@preview/codly-languages:0.1.1": *
@ -84,13 +83,7 @@
#grid( #grid(
columns: (1fr, 1fr), columns: (1fr, 1fr),
image("slides/imgs/google.png", width: 200pt), image("slides/imgs/google.png", width: 200pt),
//image("slides/imgs/phone.png", height: 350pt) image("slides/imgs/phone.png", height: 350pt)
ico.phone(
height: 350pt,
body: {
ico.android(height: 150pt, stroke: none)
}
)
) )
#v(2em) #v(2em)
] ]
@ -118,15 +111,7 @@
] ]
), ),
{ {
move( move(dx: 20pt, image("slides/imgs/phone.png", height: 350pt))
dx: 20pt,
ico.phone(
height: 350pt,
body: {
ico.android(height: 150pt, stroke: none)
}
)
)
} }
) )
] ]
@ -216,8 +201,8 @@
foreground: { foreground: {
place-fg(x: 44%, y: 55%, $ lr(}, size: #130pt) $ ) place-fg(x: 44%, y: 55%, $ lr(}, size: #130pt) $ )
place-fg(x: 44%, y: 26%, $ lr(}, size: #110pt) $ ) place-fg(x: 44%, y: 26%, $ lr(}, size: #110pt) $ )
arrow((385pt, -260pt), (450pt, -230pt)) arrow((385pt, 260pt), (450pt, 230pt))
arrow((385pt, -125pt), (450pt, -110pt)) arrow((385pt, 125pt), (450pt, 110pt))
}, },
)[ )[
#show: yes-codly #show: yes-codly
@ -401,46 +386,13 @@
#highlight-block(pb3-text) #highlight-block(pb3-text)
] ]
#for i in range(3) { #slide(
let stage = ( foreground: rotate(30deg, smallcaps(text(fill: pirat-color.red, size: 50pt)[MOCHE + ANIM]))
"static-only", )[
"static-vs-dyn", // TODO Outline / problematics / drawingp
"theseus", #set align(horizon+center)
).at(i) #th-outline()
slide( ]
//foreground: rotate(30deg, smallcaps(text(fill: pirat-color.red, size: 50pt)[#stage]))
)[
#if i == 0 {
place(
top+left,
dx: 70%,
dy: 25%,
align(center, text(fill: pirat-color.red.darken(15%))[
*PB 1*: Static Analysis \ are the tools working?
]))
}
#if i == 1 {
place(
top+left,
dx: 35%,
dy: 25%,
align(center, text(fill: pirat-color.red.darken(15%))[
*PB 2*: Do Static Tools \ match Android Runtime?
]))
}
#if i == 2 {
place(
top+left,
dx: 5%,
dy: 5%,
align(center, text(fill: pirat-color.red.darken(15%))[
*PB 3*: Improve any Static Tools \ with dynamic analysis?
]))
}
#set align(horizon+center)
#theseus-outline(stage: stage)
]
}
#new-section-slide([Tool Reusability]) #new-section-slide([Tool Reusability])
@ -771,79 +723,36 @@
#slide( #slide(
title: [Android ClassLoaders], title: [Android ClassLoaders],
foreground: { foreground: {
let stroke = black + 5pt //rotate(30deg, text(fill: pirat-color.red, size: 50pt)[DESSIN RUNTIME CL \ \ WITH DELEGATION])
let y0 = -177pt let stroke = black + 3pt
let y1 = -270pt let y0 = 170pt
let y1 = 270pt
let x0 = 250pt let x0 = 250pt
let x1 = 272pt let x1 = 292pt
let x2 = 570pt let x2 = 550pt
let x3 = 600pt let x3 = 600pt
arrow( place(bottom+left, line(start: (x0, -y0), end: (x0, -y1), stroke: stroke))
(x0, y0), place(bottom+left, line(start: (x3, -y0), end: (x3, -y1), stroke: stroke))
(x0, y1), arrow((x0, y1), (x1, y1), strk: stroke)
(x1, y1), arrow((x3, y1), (x2, y1), strk: stroke)
stroke: stroke
)
arrow(
(x3, y0),
(x3, y1),
(x2, y1),
stroke: stroke
)
place-fg(x: x0 - 2.5em, y: (y0+y1)/2)[Delegate] place-fg(x: x0 - 2.5em, y: (y0+y1)/2)[Delegate]
place-fg(x: x3 + 2.5em, y: (y0+y1)/2)[Delegate] place-fg(x: x3 + 2.5em, y: (y0+y1)/2)[Delegate]
}, { }, {
let stroke = black + 3pt
let width = 13em
let height = 4.5em
set align(center+horizon) set align(center+horizon)
set rect(width: 250pt, height: 75pt, radius: 20pt, inset: 20pt) set rect(width: 250pt, height: 75pt, radius: 20pt, inset: 20pt)
v(1fr) v(1fr)
rect( rect()[Boot Class Loader]
stroke: stroke,
height: height,
width: width,
{
[*Boot Class Loader*]
v(-0.5em)
line(length: 80%)
v(-0.5em)
[_Platform Classes_]
}
)
v(1fr) v(1fr)
stack( stack(
dir: ltr, dir: ltr,
1fr, 1fr,
rect( rect()[System Class Loader],
stroke: stroke,
height: height,
width: width,
{
[*System Class Loader*]
v(-0.5em)
line(length: 80%)
v(-0.5em)
sym.emptyset
}
),
1fr, 1fr,
rect( rect()[APK Class Loader],
stroke: stroke,
height: height,
width: width,
{
[*APK Class Loader*]
v(-0.5em)
line(length: 80%)
v(-0.5em)
[_APK Classes_]
}
),
1fr, 1fr,
) )
@ -1221,7 +1130,7 @@
)[ )[
// TODO: bien tout rappeler l'objectif // TODO: bien tout rappeler l'objectif
#set align(center+horizon) #set align(center+horizon)
#theseus-outline() #th-outline(hide-static: true)
] ]
#slide( #slide(
@ -1379,7 +1288,7 @@
foreground: rotate(30deg, text(fill: pirat-color.red, size: 50pt)[MOCHE]), foreground: rotate(30deg, text(fill: pirat-color.red, size: 50pt)[MOCHE]),
)[ )[
#set align(center+horizon) #set align(center+horizon)
#theseus-outline() #th-outline(hide-static: true)
] ]
#counter("logical-slide").update( n => n - 1 ) #counter("logical-slide").update( n => n - 1 )
@ -1431,7 +1340,7 @@
foreground: rotate(30deg, text(fill: pirat-color.red, size: 50pt)[MOCHE]), foreground: rotate(30deg, text(fill: pirat-color.red, size: 50pt)[MOCHE]),
)[ )[
#set align(center+horizon) #set align(center+horizon)
#theseus-outline() #th-outline(hide-static: false)
] ]
#for i in range(3) { #for i in range(3) {
@ -1482,7 +1391,6 @@
title: [Impact on Finishing Rate], title: [Impact on Finishing Rate],
foreground: { foreground: {
let strk = 3pt + pirat-color.blue let strk = 3pt + pirat-color.blue
import "slides/icons.typ": arrow
arrow((360pt, 330pt), (380pt, 310pt), strk: strk) arrow((360pt, 330pt), (380pt, 310pt), strk: strk)
arrow((420pt, 330pt), (400pt, 310pt), strk: strk) arrow((420pt, 330pt), (400pt, 310pt), strk: strk)
} }

View file

@ -93,19 +93,10 @@
start = end start = end
end = pt end = pt
} }
/*
let r = 10pt
place( place(
bottom + left, bottom + left,
dx: start.at(0) - r,
dy: start.at(1) + r,
circle(radius: r, fill: blue)
)
*/
place(
bottom + left,
line( line(
start: start, start: start,
end: end, end: end,
stroke: strk stroke: strk
) )

BIN
slides/imgs/phone.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 KiB

BIN
slides/imgs/phone.png~ Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

View file

@ -3,7 +3,6 @@
#import "../lib.typ": pb1-text, pb2-text, pb3-text #import "../lib.typ": pb1-text, pb2-text, pb3-text
#import "icons.typ": arrow #import "icons.typ": arrow
#import "outlines.typ": theseus-outline
#let pirat-color = ( #let pirat-color = (
black: rgb("#000000"), black: rgb("#000000"),

View file

@ -1,7 +1,7 @@
#import "./icons.typ": * #import "./icons.typ": *
#let static-outline( #let static_outline(
small_icon_size: 100pt, small_icon_size: 100pt,
big_icon_size: 200pt, big_icon_size: 200pt,
) = context { ) = context {
@ -83,7 +83,7 @@
) )
} }
#let dexhunter-outline( #let dexhunter_outline(
small_icon_size: 100pt, small_icon_size: 100pt,
big_icon_size: 200pt, big_icon_size: 200pt,
) = context { ) = context {
@ -221,22 +221,10 @@
) )
} }
#let theseus-outline( #let theseus_outline(
small_icon_size: 60pt, small_icon_size: 60pt,
big_icon_size: 90pt, big_icon_size: 90pt,
stage: "theseus",
) = context { ) = context {
let stages = (
"static-only",
"static-vs-dyn",
"theseus",
"theseus-no-static",
"theseus-vs-static",
)
assert(
stage in stages,
message: "theseus-outline stage arg must be in: " + repr(stages)
)
let width = ( let width = (
small_icon_size * 4 + small_icon_size * 4 +
big_icon_size * 3 + big_icon_size * 3 +
@ -364,295 +352,213 @@
height: height, height: height,
//stroke: black, //stroke: black,
{ {
if stage == "static-only" { place(
place( left+bottom,
left+bottom, dx: app_pos.at(0),
dx: app2_pos.at(0), dy: app_pos.at(1),
dy: app2_pos.at(1), app
app )
) place(
/* left+bottom,
arrow( dx: dex_pos0.at(0),
stroke: arrow_width + black, dy: dex_pos0.at(1),
( dex
app_static_pos.at(0) + app_size.width + arrow_gap, )
app_static_pos.at(1) - app_size.height / 2 place(
), left+bottom,
( dx: dex_pos1.at(0),
analyser_pos2.at(0) - arrow_gap, dy: dex_pos1.at(1),
analyser_pos2.at(1) - analyser_size.height / 2 dex
) )
)*/ place(
} else { left+bottom,
place( dx: rprt_pos2.at(0),
left+bottom, dy: rprt_pos2.at(1),
dx: app_pos.at(0), rprt
dy: app_pos.at(1), )
app place(
) left+bottom,
} dx: phone_pos.at(0),
dy: phone_pos.at(1),
phone
)
if stage not in ("static-only") { arrow(
place( stroke: arrow_width + black,
left+bottom, (
dx: phone_pos.at(0), app_pos.at(0) + app_size.width + arrow_gap,
dy: phone_pos.at(1), app_pos.at(1) - app_size.height / 2
phone ),
(
phone_pos.at(0) - arrow_gap,
phone_pos.at(1) - phone_size.height / 2,
) )
arrow( )
stroke: arrow_width + black, arrow(
( stroke: arrow_width + black,
app_pos.at(0) + app_size.width + arrow_gap, (arrow_1_x0, arrow_1_y0_0),
app_pos.at(1) - app_size.height / 2 (arrow_1_x1, arrow_1_y0_0),
), (arrow_1_x1, arrow_1_y1_0),
( (arrow_1_x2, arrow_1_y1_0),
phone_pos.at(0) - arrow_gap, )
phone_pos.at(1) - phone_size.height / 2, arrow(
) stroke: arrow_width + black,
) (arrow_1_x0, arrow_1_y0_1),
} (arrow_1_x1, arrow_1_y0_1),
(arrow_1_x1, arrow_1_y1_1),
(arrow_1_x2, arrow_1_y1_1),
)
arrow(
stroke: arrow_width + black,
(arrow_1_x0, arrow_1_y0_2),
(arrow_1_x1, arrow_1_y0_2),
(arrow_1_x1, arrow_1_y1_2),
(arrow_1_x2, arrow_1_y1_2),
)
arrow(
stroke: arrow_width + black,
(arrow_2_x0, arrow_2_y0_0),
(arrow_2_x1, arrow_2_y0_0),
(arrow_2_x1, arrow_2_y1_0),
(arrow_2_x2, arrow_2_y1_0),
)
arrow(
stroke: arrow_width + black,
(arrow_2_x0, arrow_2_y0_1),
(arrow_2_x1, arrow_2_y0_1),
(arrow_2_x1, arrow_2_y1_1),
(arrow_2_x2, arrow_2_y1_1),
)
arrow(
stroke: arrow_width + black,
(arrow_2_x0, arrow_2_y0_2),
(arrow_2_x1, arrow_2_y0_2),
(arrow_2_x1, arrow_2_y1_2),
(arrow_2_x2, arrow_2_y1_2),
)
if stage not in ("static-only", "static-vs-dyn") { place(
place( bottom+left,
left+bottom, dx: patcher_pos.at(0),
dx: dex_pos0.at(0), dy: patcher_pos.at(1),
dy: dex_pos0.at(1), patcher
dex )
arrow(
stroke: arrow_width + black,
(
patcher_pos.at(0) + patcher_size.width + arrow_gap,
patcher_pos.at(1) - patcher_size.height / 2
),
(
app2_pos.at(0) - arrow_gap,
app2_pos.at(1) - app2_size.height / 2,
) )
place( )
left+bottom, place(
dx: dex_pos1.at(0), bottom+left,
dy: dex_pos1.at(1), dx: app2_pos.at(0),
dex dy: app2_pos.at(1),
app2
)
arrow(
stroke: arrow_width + black,
(
app2_pos.at(0) + app2_size.width + arrow_gap,
app2_pos.at(1) - app2_size.height / 2
),
(
analyser_pos.at(0) - arrow_gap,
analyser_pos.at(1) - analyser_size.height / 2,
) )
place( )
left+bottom, place(
dx: rprt_pos2.at(0), bottom+left,
dy: rprt_pos2.at(1), dx: analyser_pos.at(0),
rprt dy: analyser_pos.at(1),
analyser
)
arrow(
stroke: arrow_width + black,
(
analyser_pos.at(0) + analyser_size.width + arrow_gap,
analyser_pos.at(1) - analyser_size.height / 2
),
(
rprt2_pos.at(0) - arrow_gap,
rprt2_pos.at(1) - rprt_size.height / 2,
) )
)
place(
left+bottom,
dx: rprt2_pos.at(0),
dy: rprt2_pos.at(1),
rprt
)
arrow(
stroke: arrow_width + black,
(
app_pos.at(0) + app_size.width / 2,
app_pos.at(1) + arrow_gap,
),
(
app_pos.at(0) + app_size.width / 2,
-arrow_width
),
(
patcher_pos.at(0) + patcher_size.width / 2,
-arrow_width
),
(
patcher_pos.at(0) + patcher_size.width / 2,
patcher_pos.at(1) + arrow_gap
)
)
arrow( place(
stroke: arrow_width + black, bottom+left,
(arrow_1_x0, arrow_1_y0_0), dx: analyser_pos2.at(0),
(arrow_1_x1, arrow_1_y0_0), dy: analyser_pos2.at(1),
(arrow_1_x1, arrow_1_y1_0), analyser
(arrow_1_x2, arrow_1_y1_0), )
) place(
arrow( left+bottom,
stroke: arrow_width + black, dx: rprt3_pos.at(0),
(arrow_1_x0, arrow_1_y0_1), dy: rprt3_pos.at(1),
(arrow_1_x1, arrow_1_y0_1), rprt
(arrow_1_x1, arrow_1_y1_1), )
(arrow_1_x2, arrow_1_y1_1),
)
arrow(
stroke: arrow_width + black,
(arrow_1_x0, arrow_1_y0_2),
(arrow_1_x1, arrow_1_y0_2),
(arrow_1_x1, arrow_1_y1_2),
(arrow_1_x2, arrow_1_y1_2),
)
arrow(
stroke: arrow_width + black,
(arrow_2_x0, arrow_2_y0_0),
(arrow_2_x1, arrow_2_y0_0),
(arrow_2_x1, arrow_2_y1_0),
(arrow_2_x2, arrow_2_y1_0),
)
arrow(
stroke: arrow_width + black,
(arrow_2_x0, arrow_2_y0_1),
(arrow_2_x1, arrow_2_y0_1),
(arrow_2_x1, arrow_2_y1_1),
(arrow_2_x2, arrow_2_y1_1),
)
arrow(
stroke: arrow_width + black,
(arrow_2_x0, arrow_2_y0_2),
(arrow_2_x1, arrow_2_y0_2),
(arrow_2_x1, arrow_2_y1_2),
(arrow_2_x2, arrow_2_y1_2),
)
place( arrow(
bottom+left, stroke: arrow_width + black,
dx: patcher_pos.at(0), (
dy: patcher_pos.at(1), analyser_pos2.at(0) + analyser_size.width + arrow_gap,
patcher analyser_pos2.at(1) - analyser_size.height / 2,
),
(
rprt3_pos.at(0) - arrow_gap,
rprt3_pos.at(1) - rprt_size.height / 2,
) )
arrow( )
stroke: arrow_width + black, arrow(
( stroke: arrow_width + black,
patcher_pos.at(0) + patcher_size.width + arrow_gap, (
patcher_pos.at(1) - patcher_size.height / 2 app_pos.at(0) + app_size.width/2,
), app_pos.at(1) - app_size.height - arrow_gap,
( ),
app2_pos.at(0) - arrow_gap, (
app2_pos.at(1) - app2_size.height / 2, app_pos.at(0) + app_size.width/2,
) analyser_pos2.at(1) - analyser_size.height / 2,
) ),
place( (
bottom+left, analyser_pos2.at(0) - arrow_gap,
dx: app2_pos.at(0), analyser_pos2.at(1) - analyser_size.height / 2,
dy: app2_pos.at(1), ),
app2 )
)
}
if stage == "static-vs-dyn" {
arrow(
stroke: arrow_width + black,
(
app_pos.at(0) + app2_size.width / 2,
app_pos.at(1) + arrow_gap
),
(
app_pos.at(0) + app2_size.width / 2,
phone_pos.at(1) + arrow_gap * 2
),
(
app2_pos.at(0) + app2_size.width + arrow_gap,
phone_pos.at(1) + arrow_gap * 2
),
(
app2_pos.at(0) + app2_size.width + arrow_gap,
app2_pos.at(1) - app2_size.height / 2
),
(
analyser_pos.at(0) - arrow_gap,
analyser_pos.at(1) - analyser_size.height / 2,
)
)
}
if stage in (
"theseus",
"theseus-vs-static",
"static-only"
) {
arrow(
stroke: arrow_width + black,
(
app2_pos.at(0) + app2_size.width + arrow_gap,
app2_pos.at(1) - app2_size.height / 2
),
(
analyser_pos.at(0) - arrow_gap,
analyser_pos.at(1) - analyser_size.height / 2,
)
)
}
if stage in (
"theseus",
"static-vs-dyn",
"theseus-vs-static",
"static-only"
) {
place(
bottom+left,
dx: analyser_pos.at(0),
dy: analyser_pos.at(1),
analyser
)
arrow(
stroke: arrow_width + black,
(
analyser_pos.at(0) + analyser_size.width + arrow_gap,
analyser_pos.at(1) - analyser_size.height / 2
),
(
rprt2_pos.at(0) - arrow_gap,
rprt2_pos.at(1) - rprt_size.height / 2,
)
)
place(
left+bottom,
dx: rprt2_pos.at(0),
dy: rprt2_pos.at(1),
rprt
)
}
if stage in (
"theseus",
"theseus-vs-static",
) {
arrow(
stroke: arrow_width + black,
(
app_pos.at(0) + app_size.width / 2,
app_pos.at(1) + arrow_gap,
),
(
app_pos.at(0) + app_size.width / 2,
-arrow_width
),
(
patcher_pos.at(0) + patcher_size.width / 2,
-arrow_width
),
(
patcher_pos.at(0) + patcher_size.width / 2,
patcher_pos.at(1) + arrow_gap
)
)
}
if stage not in (
"static-only",
"static-vs-dyn",
"theseus",
"theseus-no-static",
) {
arrow(
stroke: arrow_width + black,
(
app_pos.at(0) + app_size.width/2,
app_pos.at(1) - app_size.height - arrow_gap,
),
(
app_pos.at(0) + app_size.width/2,
analyser_pos2.at(1) - analyser_size.height / 2,
),
(
analyser_pos2.at(0) - arrow_gap,
analyser_pos2.at(1) - analyser_size.height / 2,
),
)
}
if stage in (
"theseus-vs-static",
) {
place(
bottom+left,
dx: analyser_pos2.at(0),
dy: analyser_pos2.at(1),
analyser
)
place(
left+bottom,
dx: rprt3_pos.at(0),
dy: rprt3_pos.at(1),
rprt
)
arrow(
stroke: arrow_width + black,
(
analyser_pos2.at(0) + analyser_size.width + arrow_gap,
analyser_pos2.at(1) - analyser_size.height / 2,
),
(
rprt3_pos.at(0) - arrow_gap,
rprt3_pos.at(1) - rprt_size.height / 2,
)
)
}
} }
) )
} }
#set page(flipped: true) #set page(flipped: true)
#set align(center+horizon) #set align(center+horizon)
#dexhunter-outline() #dexhunter_outline()
#static-outline() #static_outline()
#theseus-outline() #theseus_outline()

View file

@ -106,7 +106,6 @@ cmyk(25%,7%,0%,0%),
header-ascent : 0pt, header-ascent : 0pt,
footer-descent : 0pt, footer-descent : 0pt,
) )
set heading(bookmarked: false)
set text( set text(
fill : txt-color1, fill : txt-color1,
size : size, size : size,
@ -307,7 +306,7 @@ cmyk(25%,7%,0%,0%),
} }
if p_i == pnum and p_i != pmax { if p_i == pnum and p_i != pmax {
// In section, current page // In section, current page
pages.push(sym.ast.op.o) pages.push(sym.ast.circle)
p_i += 1 p_i += 1
} }
while p_i < pmax { while p_i < pmax {
@ -418,29 +417,23 @@ cmyk(25%,7%,0%,0%),
inset: 0.8cm, outset: 0pt, inset: 0.8cm, outset: 0pt,
fill: sns-polylux-template_colormap.at(here()).at(0), fill: sns-polylux-template_colormap.at(here()).at(0),
align(horizon + center, align(horizon + center, {
heading( text(
level: if new-sec { 1 } else { 2 }, fill: sns-polylux-template_second-text-color.at(here()),
bookmarked: true, font: sns-polylux-template_title-font.at(here()),
{ size: 32pt,
text( weight: "bold",
fill: sns-polylux-template_second-text-color.at(here()), title
font: sns-polylux-template_title-font.at(here()),
size: 32pt,
weight: "bold",
title
)
if subtitle != none {
smallcaps(text(
fill: sns-polylux-template_second-text-color.at(here()),
font: sns-polylux-template_title-font.at(here()),
size: 24pt,
" " + subtitle
))
}
}
) )
) if subtitle != none {
smallcaps(text(
fill: sns-polylux-template_second-text-color.at(here()),
font: sns-polylux-template_title-font.at(here()),
size: 24pt,
" " + subtitle
))
}
})
) )
} else { [] } } else { [] }
) )
@ -487,16 +480,6 @@ cmyk(25%,7%,0%,0%),
set align(horizon) set align(horizon)
set text(size: sns-polylux-template_size.at(here()), top-edge: 20pt, bottom-edge: 0pt) set text(size: sns-polylux-template_size.at(here()), top-edge: 20pt, bottom-edge: 0pt)
show: block.with(inset: (x: 1.2cm, y:.2cm), width: 100%) show: block.with(inset: (x: 1.2cm, y:.2cm), width: 100%)
if title != none and hide-title {
// hidden and out of layout, but exists, in order to add it to the outlined
place(hide(
heading(
level: if new-sec { 1 } else { 2 },
bookmarked: true,
{ title + if subtitle != none {" " + subtitle } else { "" }}
)
))
}
body body
}) })
@ -504,6 +487,7 @@ cmyk(25%,7%,0%,0%),
} ) } )
#let focus-slide( #let focus-slide(
new-sec : none,
page-number : true, page-number : true,
hide-section : false, hide-section : false,
background : [], background : [],
@ -630,14 +614,7 @@ cmyk(25%,7%,0%,0%),
show: pad.with(20%) show: pad.with(20%)
heading( name
level: 1,
bookmarked: true,
{
//set text(1em/1.4, weight: "regular")
name
}
)
progress-bar() progress-bar()
}) })