diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-03-22 06:46:16 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-03-22 09:52:29 +0900 |
| commit | b73729e8d965a8962b3ef5103d37a6456b53a265 (patch) | |
| tree | a1fe2751faa0e81a0267b7f6783de6032e47092e /setoka.typ | |
| parent | b00d51802e6a5bd5dc46d9ab64ce6376d7f0121b (diff) | |
| download | phperkaigi-2026-php-modification-slides-b73729e8d965a8962b3ef5103d37a6456b53a265.tar.gz phperkaigi-2026-php-modification-slides-b73729e8d965a8962b3ef5103d37a6456b53a265.tar.zst phperkaigi-2026-php-modification-slides-b73729e8d965a8962b3ef5103d37a6456b53a265.zip | |
Diffstat (limited to 'setoka.typ')
| -rw-r--r-- | setoka.typ | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/setoka.typ b/setoka.typ new file mode 100644 index 0000000..24cfea8 --- /dev/null +++ b/setoka.typ @@ -0,0 +1,137 @@ +#import "@preview/touying:0.6.3": * +#import "@preview/fletcher:0.5.8" as fletcher + +#let fletcher-diagram = touying-reducer.with(reduce: fletcher.diagram, cover: fletcher.hide) + +#let slide(..args) = touying-slide-wrapper(self => { + let header(self) = { + set align(top) + set text(size: 14pt) + place( + left + top, + dx: 0.7em, + dy: 0.7em, + image("./assets/deco.svg", width: 2em, height: 2em), + ) + place( + left + top, + dx: 3em, + dy: 0.7em, + image("./assets/deco.svg", width: 1em, height: 1em), + ) + } + let footer(self) = { + set align(bottom) + set text(fill: self.colors.neutral-darkest, size: 14pt) + pad(x: 0.7em, y: 0.7em, { + h(1fr) + context utils.slide-counter.display() + " / " + utils.last-slide-number + }) + } + self = utils.merge-dicts( + self, + config-page( + header: header, + footer: footer, + ), + ) + touying-slide(self: self, ..args) +}) + +#let title-slide(..args) = touying-slide-wrapper(self => { + let info = self.info + args.named() + let body = { + set align(center) + components.cell( + fill: self.colors.neutral-darkest, + width: 100%, + height: 50%, + inset: 0.5em, + components.cell( + width: 80%, + height: 100%, + { + set align(bottom) + set text(size: 1em, fill: self.colors.neutral-lightest, weight: "bold") + info.title + }, + ), + ) + components.cell( + width: 100%, + height: 50%, + { + set align(horizon) + set text(fill: self.colors.neutral-darkest, size: 0.5em) + if info.author != none { + block(info.author) + } + block() + if info.subtitle != none { + block(info.subtitle) + } + if info.date != none { + block(utils.display-info-date(self)) + } + }, + ) + set text(size: 14pt) + place( + left + top, + dx: 0.7em, + dy: 0.7em, + image("./assets/deco.svg", width: 2em, height: 2em), + ) + place( + left + top, + dx: 3em, + dy: 0.7em, + image("./assets/deco.svg", width: 1em, height: 1em), + ) + } + self = utils.merge-dicts( + self, + config-page( + margin: 0pt, + ), + ) + touying-slide(self: self, body) +}) + +#let about-slide(..args) = slide({ + set align(center + horizon) + [ + #text(size: 0.4em)[γγΎγγ] \ + #text(size: 0.9em)[nsfisis] \ + ] + image("./assets/me.svg", width: 2em, height: 2em) +}) + +#let setoka-theme( + aspect-ratio: "16-9", + footer: none, + ..args, + body, +) = { + set text(size: 48pt) + show link: underline + + show: touying-slides.with( + config-page( + paper: "presentation-" + aspect-ratio, + margin: 2em, + ), + config-common( + slide-fn: slide, + slide-level: 0, + ), + config-colors( + primary: rgb("#ffa500"), + neutral-lightest: white, + neutral-darkest: black, + ), + ..args, + ) + + body +} |
