diff --git a/packages/preview/juti/0.1.1/.gitignore b/packages/preview/juti/0.1.1/.gitignore
new file mode 100644
index 0000000000..a136337994
--- /dev/null
+++ b/packages/preview/juti/0.1.1/.gitignore
@@ -0,0 +1 @@
+*.pdf
diff --git a/packages/preview/juti/0.1.1/LICENSE b/packages/preview/juti/0.1.1/LICENSE
new file mode 100644
index 0000000000..f19aaa6d09
--- /dev/null
+++ b/packages/preview/juti/0.1.1/LICENSE
@@ -0,0 +1,14 @@
+MIT No Attribution
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this
+software and associated documentation files (the "Software"), to deal in the Software
+without restriction, including without limitation the rights to use, copy, modify,
+merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/packages/preview/juti/0.1.1/ORCID-iD_icon_vector.svg b/packages/preview/juti/0.1.1/ORCID-iD_icon_vector.svg
new file mode 100755
index 0000000000..375b457a4a
--- /dev/null
+++ b/packages/preview/juti/0.1.1/ORCID-iD_icon_vector.svg
@@ -0,0 +1,4 @@
+
diff --git a/packages/preview/juti/0.1.1/README.md b/packages/preview/juti/0.1.1/README.md
new file mode 100644
index 0000000000..7ce41c8d64
--- /dev/null
+++ b/packages/preview/juti/0.1.1/README.md
@@ -0,0 +1,96 @@
+# Template for the _JUTI: Jurnal Ilmiah Teknologi Informasi_
+
+The [_JUTI: Jurnal Ilmiah Teknologi Informasi_](https://juti.if.its.ac.id) focuses on publishing original research, communication, and notes resulting from original and high-quality research. The journal also invites well-known researchers to write review papers. JUTI accepts high-quality papers in the field of engineering, science, and technology (informatics/information technology). It is published biannually (January and July) and is available in an open-access electronic version, with P-ISSN 1412-6389 and E-ISSN 2406-8535.
+
+## About the Journal
+
+JUTI: Jurnal Ilmiah Teknologi Informasi (Scientific Journal of Information Technology) is published by the Department of Informatics, Institut Teknologi Sepuluh Nopember (ITS). It focuses on publishing original research, communication, and notes resulting from original and high-quality research, and also invites well-known researchers to write review papers, in the field of engineering, science, and technology.
+
+The scope of JUTI encompasses, but is not limited to:
+
+- Information Technology
+- Computer Science
+- Information System
+- Computer Network
+- Software Engineering
+- Computer Vision
+
+The journal is published biannually (January and July) and is fully open-access -- free of charge for both submission and publication, with no fees for authors or readers.
+
+### Accreditation
+
+JUTI has been re-accredited by the Ministry of Research, Technology, and Higher Education of the Republic of Indonesia as Sinta-3 (decree No. 21/E/KTP/2016, dated July 9, 2016, effective from Volume 14 Number 1, 2016), renewed through decree No. 164/E/KPT/2021, dated December 27, 2021.
+
+### Indexing & Abstracting
+
+JUTI is indexed by DOAJ, Cross Ref, Google Scholar, Sinta, Garuda (Garda Rujukan Digital), Dimensions, and Scilit.
+
+## Usage
+
+Start a new project with this template:
+
+```
+typst init @preview/juti:0.1.1
+```
+
+Or import it directly in an existing document:
+
+```typ
+#import "@preview/juti:0.1.1"
+
+#show: juti.template.with(
+ title: "Your Paper Title",
+ authors: authors,
+ corresponding-ref: 0,
+ corresponding-email: "first-author@email.com",
+ institutions: institutions,
+ abstract: [...],
+ keywords: ([Keyword1], [Keyword2], [Keyword3], [Keyword4]),
+ bib: bibliography("references.bib"),
+)
+```
+
+## Authors and contributions
+
+Authors and their [CRediT](https://credit.niso.org/) contribution roles are declared with `juti.init-authors`:
+
+```typ
+#let authors = juti.init-authors((
+ (
+ name: "First Alpha Author",
+ institution-ref: 0,
+ contribution-refs: (0, 1, 2, 5, 6, 7, 8, 10, 13),
+ ),
+ (
+ name: "Second Beta Author",
+ institution-ref: 0,
+ contribution-refs: (6, 9, 11),
+ ),
+))
+```
+
+Each entry in `contribution-refs` is an index into the standard CRediT taxonomy (0: Conceptualization, 1: Methodology, 2: Software, 3: Validation, 4: Formal analysis, 5: Investigation, 6: Resources, 7: Data Curation, 8: Writing -- Original Draft, 9: Writing -- Review & Editing, 10: Visualization, 11: Supervision, 12: Project Administration, 13: Funding Acquisition).
+
+`institution-ref` points into the `institutions` array:
+
+```typ
+#let institutions = (
+ (
+ name: "Department and institution name of authors",
+ address: "Address of the first institution",
+ ),
+)
+```
+
+## Template structure
+
+Running `typst init` scaffolds:
+
+- `main.typ` -- example paper using the template, including sections, table/figure/equation examples, and CRediT statement.
+- `setup.typ` -- article metadata (volume, number, DOI, received/revised/accepted/online dates, start page).
+- `references.bib` -- bibliography file (IEEE style is used by default).
+
+## Links
+
+- Journal website: https://juti.if.its.ac.id
+- License: MIT
diff --git a/packages/preview/juti/0.1.1/cover_background.jpeg b/packages/preview/juti/0.1.1/cover_background.jpeg
new file mode 100644
index 0000000000..49a05ea4d2
Binary files /dev/null and b/packages/preview/juti/0.1.1/cover_background.jpeg differ
diff --git a/packages/preview/juti/0.1.1/cover_background.png b/packages/preview/juti/0.1.1/cover_background.png
new file mode 100644
index 0000000000..8cba9f7c57
Binary files /dev/null and b/packages/preview/juti/0.1.1/cover_background.png differ
diff --git a/packages/preview/juti/0.1.1/juti.typ b/packages/preview/juti/0.1.1/juti.typ
new file mode 100644
index 0000000000..b5885668d6
--- /dev/null
+++ b/packages/preview/juti/0.1.1/juti.typ
@@ -0,0 +1,735 @@
+#import "@preview/numbly:0.1.0": numbly
+
+#let warn(body) = {
+ show: highlight.with(fill: red.lighten(75%))
+ body
+}
+#let empty-warn(body) = {
+ if body == "" or body == [] or body == none {
+ show: warn
+ lorem(6)
+ } else {
+ body
+ }
+}
+#let link-b(url, body) = {
+ // show: underline
+ // show: text.with(fill: rgb(0, 0, 238))
+
+ if url != none {
+ link(url, if body == [] {
+ url
+ } else {
+ body
+ })
+ } else {
+ body
+ }
+}
+#let parse-date(date-str) = {
+ let (year, month, day) = date-str.split("-")
+ return datetime(year: int(year), month: int(month), day: int(day))
+}
+#let phantom(body) = place(top, scale(x: 0%, y: 0%, hide(body)))
+#let inline-enum(
+ join-sym: [,],
+ last-join: [and],
+ prefix-fn: i => [(#{ i + 1 }) ],
+ join-sym-on-two: false,
+ ..entries,
+) = {
+ entries = entries.pos()
+ let n = entries.len()
+ if n == 1 {
+ return entries.at(0)
+ }
+ for (i, v) in entries.enumerate() {
+ if i > 0 {
+ if n != 2 and not join-sym-on-two [#join-sym ]
+ if n != 0 and i == n - 1 {
+ if last-join != none [#last-join ]
+ }
+ }
+ let prefix = if prefix-fn != none {
+ prefix-fn(i)
+ }
+ [#prefix#v]
+ }
+}
+#let nth(ordinal-num, sup: bool) = {
+ // Conditinally define ordinal-num, and if it's an integer change it to a string
+ let ordinal-str = if type(ordinal-num) == int {
+ str(ordinal-num)
+ } else {
+ ordinal-num
+ }
+ // Main if-else tree for this function
+ let ordinal-suffix = if ordinal-str.ends-with(regex("1[0-9]")) {
+ "th"
+ } else if ordinal-str.last() == "1" {
+ "st"
+ } else if ordinal-str.last() == "2" {
+ "nd"
+ } else if ordinal-str.last() == "3" {
+ "rd"
+ } else {
+ "th"
+ }
+ // Check whether sup attribute is set, and if so return suffix superscripted
+ if sup == true {
+ return ordinal-str + super(ordinal-suffix)
+ } else {
+ return ordinal-str + ordinal-suffix
+ }
+}
+
+// define nths function, which is just nth with sup attribute applied
+#let nths(ordinal) = {
+ nth(ordinal, sup: true)
+}
+
+#let i(body) = {
+ set cite(form: "prose")
+ body
+}
+
+#let debug-outline() = {
+ block(fill: red.lighten(80%), inset: 1em, outline())
+}
+
+#let format-date(d) = {
+ if (
+ type(d) == datetime
+ ) [
+ #d.display("[month repr:short]") #nths(d.day()), #d.display("[year]")] else [
+ #d]
+}
+
+#let arrayfy(v) = if type(v) == array {
+ v
+} else {
+ (v,)
+}
+
+#let JOURNAL-NAME = [JUTI: Jurnal Ilmiah Teknologi Informasi]
+#let get-align-by-page(pagei) = if calc.rem-euclid(pagei, 2) == 0 {
+ left
+} else {
+ right
+}
+
+#let paper-idx = state("paper-idx", "single")
+#let book-state = state(
+ "book-state",
+ (
+ volume: [-],
+ number: [-],
+ month: 2,
+ year: 2025,
+ start-page: 1,
+ ),
+)
+
+#let contributions = (
+ /* 0 */ [Conceptualization],
+ /* 1 */ [Methodology],
+ /* 2 */ [Software],
+ /* 3 */ [Validation],
+ /* 4 */ [Formal analysis],
+ /* 5 */ [Investigation],
+ /* 6 */ [Resources],
+ /* 7 */ [Data Curation],
+ /* 8 */ [Writing -- Original Draft],
+ /* 9 */ [Writing -- Review & Editing],
+ /* 10 */ [Visualization],
+ /* 11 */ [Supervision],
+ /* 12 */ [Project Administration],
+ /* 13 */ [Funding Acquisition],
+)
+#let get-contributions(author) = author.contribution-refs.map(i => contributions.at(i)).join([, ])
+
+#let credits(authors) = authors.map(author => [*#author.short:* #get-contributions(author).]).join([ ])
+
+#let orcid(authors) = {
+ set par(first-line-indent: 0pt)
+ (
+ authors.map(author => {
+ let id = author.at("orcid", default: "")
+ let url = "https://orcid.org/" + id
+ [#author.name: #if id != "" { link(url, url) } else { [N/A] }]
+ })
+ ).join(linebreak())
+}
+
+#let init-authors(authors) = {
+ for (i, author) in authors.enumerate() {
+ if author.at("short", default: none) == none {
+ let cleaned = author.name.replace(regex("[^a-zA-Z ]"), "")
+ let splitted = cleaned.split(" ")
+ authors.at(i).short = splitted
+ .enumerate()
+ .map(((j, v)) => {
+ if j == splitted.len() - 1 {
+ v
+ } else {
+ v.slice(0, 1) + "."
+ }
+ })
+ .join(" ")
+ }
+ }
+
+ authors
+}
+
+#let enumlist-level = state("enumlist-level", 1)
+
+#let template(
+ title: "Preparation of Papers for jurnal ilmiah teknologi informasi",
+ title-content: [],
+ authors: (
+ (
+ name: "First Alpha Author",
+ institution-ref: 0,
+ contribution: [],
+ contribution-refs: range(0, 10),
+ ),
+ (
+ name: "Second Beta Author",
+ institution-ref: 0,
+ contribution: [],
+ contribution-refs: range(7, 13),
+ orcid: "XXXX-XXXX-XXXX-XXXX",
+ ),
+ (
+ name: "Third Charlie Author",
+ institution-ref: 1,
+ contribution: [],
+ contribution-refs: range(7, 13),
+ orcid: "XXXX-XXXX-XXXX-XXXX",
+ ),
+ ),
+ corresponding-ref: 0,
+ corresponding-email: none,
+ institutions: (
+ (
+ name: "Department and institution name of authors",
+ address: "Address of the first institution",
+ ),
+ (
+ name: "Department and institution name of authors",
+ address: "Address of the second institution",
+ ),
+ ),
+ abstract: [],
+ keywords: (
+ "Keyword1",
+ "Keyword2",
+ "Keyword3",
+ "Keyword4",
+ ),
+ meta: (
+ // No need to change
+ received: datetime(year: 9999, month: 12, day: 31),
+ revised: datetime(year: 9999, month: 12, day: 31),
+ accepted: datetime(year: 9999, month: 12, day: 31),
+ online: datetime(year: 9999, month: 12, day: 31),
+ doi: "https://doi.org/10.12962/j24068535.vXXXX.aXXXX",
+ ),
+ start-page: 1,
+ body,
+ bib: none,
+) = context {
+ let paper-id = paper-idx.get()
+ let book = book-state.get()
+ let institution-ref-all = authors.map(a => arrayfy(a.institution-ref)).flatten()
+ let institutions = institutions.enumerate().filter(((i, v)) => institution-ref-all.contains(i)).map(((i, v)) => v)
+ let single-institution = institutions.len() == 1
+ let corresponding-email = (
+ if corresponding-email != none { corresponding-email } else {
+ authors.at(corresponding-ref).at("email", default: warn[No Email Defined for Corrseponding Author])
+ }
+ )
+ counter(heading).update(0)
+ counter(figure.where(kind: image)).update(0)
+ counter(figure.where(kind: table)).update(0)
+ counter(math.equation).update(0)
+ counter(figure.where(kind: math.equation)).update(0)
+ counter(figure.where(kind: raw)).update(0)
+ if start-page != none {
+ counter(page).update(start-page)
+ }
+ let title-content = if title-content == none or title-content == [] {
+ [#title]
+ } else {
+ title-content
+ }
+ set page(
+ paper: "a4",
+ header: context {
+ show: pad.with(bottom: 1em)
+ let paper-page-range = (
+ counter(page).at(query(label(paper-id + ":start")).last().location()).at(0),
+ counter(page).at(query(label(paper-id + ":end")).last().location()).at(0),
+ )
+ let pagei = counter(page).get().at(0)
+ let aligned-pagei = pagei + paper-page-range.at(0) + 1
+ set text(size: 9pt)
+ set align(get-align-by-page(aligned-pagei))
+ if calc.rem-euclid(aligned-pagei, 2) == 0 {
+ if authors.len() > 2 {
+ [#empty-warn(authors.at(0).short) et al.]
+ } else {
+ let names = authors.enumerate().map(((i, v)) => [#empty-warn(v.short)])
+ inline-enum(prefix-fn: none, ..names)
+ }
+ [ -- ]
+ text(style: "italic", empty-warn(title.replace("\n", " ")))
+ } else {
+ let month-year = datetime(
+ year: book.year,
+ month: book.month,
+ day: 1,
+ ).display("[month repr:long] [year]")
+ let right-content = [#JOURNAL-NAME -- _Volume #book.volume, Number #book.number, #month-year: #paper-page-range.map(v => [#v]).join([ -- ])_]
+ if pagei == paper-page-range.at(0) {
+ grid(
+ columns: (auto, 1fr),
+ column-gutter: 2em,
+ place(float: true, top, dy: 1em, image("logo.svg", height: 6em)), align(right, right-content),
+ )
+ } else {
+ right-content
+ }
+ }
+ },
+ footer: context {
+ let pagei = counter(page).get().at(0)
+ set text(size: 10pt)
+ set align(get-align-by-page(pagei))
+ pagei
+ },
+ margin: (
+ x: 0.65in,
+ y: 1in,
+ ),
+ )
+ set text(font: ("Liberation Serif", "Segoe UI Symbol"), fallback: false)
+ // set text(font: "Times New Roman", fallback: false)
+ set bibliography(
+ style: "ieee",
+ title: none,
+ )
+ set par(linebreaks: "optimized")
+
+ //? Figure
+ // set figure(placement: top)
+
+ //? Image
+ show figure.where(kind: image): set figure(placement: top, supplement: [Fig.])
+ show figure.where(kind: image): set text(size: .8em)
+
+ //? Table
+ show figure.where(kind: table): set block(breakable: true)
+ show figure.where(kind: table): set figure(placement: top, supplement: [Table])
+ set table(align: left)
+
+ //? Algorithm
+ show figure.where(kind: "algorithm"): set figure(placement: top, supplement: [Algorithm])
+
+ //? Caption
+ set figure.caption(separator: [. ])
+ show figure.caption: set align(left)
+ show figure.caption: set par(first-line-indent: 0pt)
+ show figure.caption: it => context [
+ *#it.supplement #it.counter.get().at(0)#it.separator* #it.body
+ ]
+
+ // TODO: Still not fixed
+ // show enum.item: it => {
+ // enumlist-level.update(l => l + 1)
+ // it
+ // enumlist-level.update(l => l - 1)
+ // }
+ set enum(indent: 1em)
+ // show enum: it => context {
+ // set enum(indent: 0em) if enumlist-level.get() > 0
+ // it
+ // }
+ // show list.item: it => {
+ // enumlist-level.update(l => l + 1)
+ // it
+ // enumlist-level.update(l => l - 1)
+ // }
+ set list(indent: 1em)
+ // show list: it => context {
+ // set list(indent: 0em) if enumlist-level.get() > 0
+ // it
+ // }
+ show table: set enum(indent: 0em)
+ show table: set list(indent: 0em)
+ show table: set par(justify: false, first-line-indent: 0em)
+ show table.header: set text(weight: "bold")
+ set table(stroke: none)
+ show figure.where(kind: table): set text(size: .8em)
+ show figure.where(kind: table): set figure.caption(position: top)
+
+ //? Equation
+ // show math.equation: set text(font: "New Computer Modern Math")
+ set math.equation(numbering: "(1)")
+ show math.equation: math.italic
+ show ref: it => {
+ let eq = math.equation
+ let el = it.element
+ if el != none and el.func() == eq {
+ // Override equation references.
+ link(el.location(), numbering(el.numbering, ..counter(eq).at(el.location())))
+ } else {
+ // Other references as usual.
+ it
+ }
+ }
+
+ //? START OF CONTENT
+ [#metadata(none)#label(paper-id + ":start")]
+
+ //? Title
+ {
+ set align(left)
+ set text(size: 16pt, weight: "bold")
+ // show: upper
+ empty-warn(title-content)
+ phantom(heading(title-content, bookmarked: true))
+ }
+
+ //? Author names
+ {
+ set align(left)
+ set text(size: 12pt, weight: "bold")
+ let names = authors
+ .enumerate()
+ .map(((i, v)) => box[
+ #empty-warn(v.name)
+ #set text(weight: "regular")
+ #if single-institution [
+ #if corresponding-ref == i {
+ super[\*]
+ }
+ ] else [
+ #super[
+ #let values = arrayfy(v.institution-ref).map(v => [#{ v + 1 }])
+ #if corresponding-ref == i {
+ values = values + ([\*],)
+ }
+ #values.join([, ])
+ ]
+ ]
+ #if v.at("orcid", default: "") != "" [ #link("https://orcid.org/" + v.orcid, box(height: .8em, image(
+ "ORCID-iD_icon_vector.svg",
+ height: .8em,
+ )))]])
+
+ inline-enum(prefix-fn: none, last-join: none, ..names)
+ }
+
+ //? Institutions
+ {
+ set align(left)
+ set text(size: 8pt, style: "italic")
+ set par(spacing: .5em)
+
+ for (i-institution, institution) in institutions.enumerate() {
+ [
+ #if not single-institution {
+ super[#{ i-institution + 1 }]
+ }
+ #empty-warn(institution.name), #institution.address
+
+ ]
+ }
+ }
+
+ v(.5em)
+ grid(
+ columns: (25%, auto),
+ column-gutter: 1.5em,
+ {
+ line(length: 100%, stroke: 0.6pt)
+ {
+ set align(left)
+ set text(size: 10pt, weight: "regular")
+ [ARTICLE INFO]
+ }
+ set text(size: 8pt, style: "italic")
+ [
+
+ //? Keywords
+ Keywords: \
+ #{
+ [
+ #inline-enum(prefix-fn: none, last-join: none, join-sym: [\ ], ..keywords.sorted().map(v => empty-warn(v)))
+ ]
+ }
+ #v(.6em)
+ \* Corresponding author: \ #corresponding-email \
+ #v(.6em)
+ Article history: \
+ Received: #format-date(meta.received) \
+ Revised: #format-date(meta.revised) \
+ Accepted: #format-date(meta.accepted) \
+ Available online: #format-date(meta.online) \
+ ]
+ },
+ {
+ line(length: 100%, stroke: 0.6pt)
+
+ //? Abstract Title
+ {
+ set align(left)
+ set text(size: 10pt, weight: "regular")
+ [ABSTRACT]
+ }
+
+ //? Abstract
+ {
+ set text(
+ size: 10pt,
+ // weight: "regular",
+ // style: "italic",
+ )
+ // set par(justify: true, first-line-indent: (amount: 2em, all: true))
+ set par(justify: true)
+ empty-warn(abstract)
+ }
+ },
+ )
+ line(length: 100%, stroke: 0.6pt)
+ v(.5em)
+
+ //? Numberings
+ set heading(
+ numbering: numbly(
+ "{1}.",
+ "{1}.{2}.",
+ "{3:A}.",
+ ),
+ )
+ // set enum(numbering: "1)")
+ //? Heading 1
+ show heading.where(level: 1): it => {
+ // set align(center)
+ set text(size: 11pt, weight: "bold")
+ it
+ // smallcaps(it)
+ v(.5em)
+ }
+ //? Heading 2
+ show heading.where(level: 2): it => {
+ set text(
+ size: 11pt,
+ weight: "regular",
+ style: "italic",
+ )
+ it
+ }
+ //? Heading 3
+ show heading.where(level: 3): it => {
+ set text(
+ size: 11pt,
+ weight: "regular",
+ style: "italic",
+ )
+ it
+ }
+ //? Heading 4
+ show heading.where(level: 4): it => {
+ set text(
+ size: 11pt,
+ weight: "regular",
+ style: "italic",
+ )
+ it
+ }
+
+ //? Metadata Footnote
+ figure(
+ pad(bottom: -1.2em)[
+ #set align(left)
+ #set text(size: 9pt)
+
+ #pad(y: -.65em, line(length: 100%))
+
+ © #context { book-state.get().year } The Authors. This is an open access article under the CC BY-SA license (#link-b("https://creativecommons.org/licenses/by-sa/4.0/")[])\ DOI: #link-b(meta.doi)[]
+ ],
+ placement: bottom,
+ supplement: none,
+ kind: "footnote-metadata",
+ )
+
+ set par(justify: true, first-line-indent: (amount: 2em, all: true))
+ set text(size: 11pt, weight: "regular")
+
+ body
+
+ //? References
+ if bib != none {
+ heading(numbering: none, outlined: false)[References]
+
+ set text(size: 8pt)
+ set par(spacing: .65em)
+ bib
+ }
+ //? END OF CONTENT
+ [#metadata(none)#label(paper-id + ":end")]
+}
+
+#let cover(
+ issn: "1412-6389",
+ eissn: "2406-8535",
+ papers: (),
+) = context {
+ let book = book-state.get()
+ let juti-blue = rgb("#113E68")
+ let juti-yellow = rgb("FFBD07")
+ let primary-color = white
+ let accent-color = rgb("#1e90ff")
+
+ set page(
+ paper: "a4",
+ margin: (x: 0.65in, y: 0.65in),
+ header: none,
+ footer: none,
+ background: image("cover_background.png", width: 100%, height: 100%),
+ )
+ set text(font: ("Liberation Sans", "Arial", "Helvetica"), fallback: true)
+
+ // ISSN top right — stays above shield zone (shield center y≈52pt in content)
+ {
+ set align(right)
+ set text(size: 12pt, fill: primary-color, weight: "bold")
+ [P-ISSN #issn \ E-ISSN #eissn]
+ }
+
+ v(-5em)
+
+ // JUTI large — left-aligned, clear of binary data motif (that's in margin)
+ {
+ set text(size: 72pt, weight: "black", fill: juti-yellow.lighten(50%))
+ [JUTI]
+ }
+
+ v(-5em)
+
+ // Full name
+ {
+ set text(size: 28pt, weight: "bold", fill: juti-yellow.lighten(50%))
+ [Jurnal Ilmiah Teknologi Informasi]
+ }
+
+ linebreak()
+
+ // Subtitle italic
+ {
+ set text(size: 16pt, style: "italic", weight: "regular", fill: primary-color)
+ [Scientific Journal of Information Technology]
+ }
+
+ v(1em)
+ line(length: 100%, stroke: 2pt + primary-color)
+ v(1em)
+
+ // TOC entries — left-padded 36% to avoid robot head + brain circle
+ // (robot occupies x=0–177pt in content, brain circle x=0–120pt; both y=46–85% of page)
+ pad(left: 0%, {
+ {
+ set align(center)
+ set text(size: 18pt, weight: "bold", fill: primary-color)
+ let month-year = datetime(year: book.year, month: book.month, day: 1).display("[month repr:long] [year]")
+ [Vol. #book.volume, No. #book.number, #month-year]
+ }
+
+ v(1em)
+ set text(size: 10pt, fill: primary-color)
+ set par(justify: false, leading: .5em, spacing: 1.2em)
+ for paper in papers {
+ grid(
+ columns: (1fr, auto),
+ column-gutter: 1em,
+ {
+ text(weight: "bold", fill: juti-yellow.lighten(50%), upper(paper.title))
+ linebreak()
+ text(style: "italic", paper.authors)
+ },
+ {
+ set align(right + top)
+ if paper.at("pages", default: none) != none {
+ text(fill: juti-yellow.lighten(50%), weight: "bold", paper.pages)
+ }
+ },
+ )
+ }
+ })
+
+ set text(weight: "bold")
+ place(bottom + left, text(size: 10pt, fill: primary-color, link("https://juti.if.its.ac.id/")))
+ place(bottom + right, text(size: 10pt, fill: primary-color, [Published by Institut Teknologi Sepuluh Nopember]))
+}
+
+#let cover2(
+ issn: "1412-6389",
+ eissn: "2406-8535",
+ papers: (),
+) = context {
+ let book = book-state.get()
+ let juti-blue = rgb("#113E68")
+ let juti-yellow = rgb("FFBD07")
+ let primary-color = white
+ let accent-color = rgb("#1e90ff")
+
+ set page(
+ paper: "a4",
+ margin: (x: 0.65in, y: 0.65in),
+ header: none,
+ footer: none,
+ background: image("cover_background.jpeg", width: 100%, height: 100%),
+ )
+ set text(font: ("Liberation Sans", "Arial", "Helvetica"), fallback: true)
+
+ v(17.5em)
+
+ {
+ set align(right)
+ set text(size: 18pt, weight: "bold", fill: primary-color)
+ let month-year = datetime(year: book.year, month: book.month, day: 1).display("[month repr:long] [year]")
+ [Vol. #book.volume, No. #book.number, #month-year]
+ }
+
+ v(3em)
+
+ // TOC entries — left-padded 36% to avoid robot head + brain circle
+ // (robot occupies x=0–177pt in content, brain circle x=0–120pt; both y=46–85% of page)
+
+ set text(size: 10pt, fill: primary-color)
+ set par(justify: false, leading: .5em, spacing: 1.2em)
+ for paper in papers {
+ grid(
+ columns: (1fr, auto),
+ column-gutter: 1em,
+ {
+ text(weight: "bold", upper(paper.title))
+ linebreak()
+ text(style: "italic", paper.authors)
+ },
+ {
+ set align(right + top)
+ if paper.at("pages", default: none) != none {
+ text(weight: "bold", paper.pages)
+ }
+ },
+ )
+ }
+
+ set text(weight: "bold")
+ place(bottom + left, text(size: 10pt, fill: primary-color, link("https://juti.if.its.ac.id/")))
+ place(bottom + right, text(size: 10pt, fill: primary-color, [Published by Institut Teknologi Sepuluh Nopember]))
+}
diff --git a/packages/preview/juti/0.1.1/logo.svg b/packages/preview/juti/0.1.1/logo.svg
new file mode 100644
index 0000000000..dc38bc3c7c
--- /dev/null
+++ b/packages/preview/juti/0.1.1/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/preview/juti/0.1.1/template/figure1.jpg b/packages/preview/juti/0.1.1/template/figure1.jpg
new file mode 100644
index 0000000000..8c7b86c671
Binary files /dev/null and b/packages/preview/juti/0.1.1/template/figure1.jpg differ
diff --git a/packages/preview/juti/0.1.1/template/main.typ b/packages/preview/juti/0.1.1/template/main.typ
new file mode 100644
index 0000000000..04937d4c4e
--- /dev/null
+++ b/packages/preview/juti/0.1.1/template/main.typ
@@ -0,0 +1,159 @@
+#import "@preview/juti:0.1.1"
+#import "setup.typ": *
+
+/**
+ * Contribution References
+ * 0. Conceptualization
+ * 1. Methodology
+ * 2. Software
+ * 3. Validation
+ * 4. Formal analysis
+ * 5. Investigation
+ * 6. Resources
+ * 7. Data Curation
+ * 8. Writing -- Original Draft
+ * 9. Writing -- Review & Editing
+ * 10. Visualization
+ * 11. Supervision
+ * 12. Project Administration
+ * 13. Funding Acquisition
+ **/
+
+#let authors = juti.init-authors((
+ (
+ name: "First Alpha Author",
+ institution-ref: (0, 1),
+ contribution-refs: (0, 1, 2, 5, 6, 7, 8, 10, 13),
+ ),
+ (
+ name: "Second Beta Author",
+ institution-ref: 0,
+ contribution-refs: (6, 9, 11),
+ orcid: "XXXX-XXXX-XXXX-XXXX",
+ ),
+ (
+ name: "Third Charlie Author",
+ institution-ref: 1,
+ contribution-refs: (3, 4, 6, 9, 11, 12),
+ orcid: "XXXX-XXXX-XXXX-XXXX",
+ ),
+))
+
+#let institutions = (
+ (
+ name: "Department and institution name of authors",
+ address: "Address of the first institution",
+ ),
+ (
+ name: "Department and institution name of authors",
+ address: "Address of the second institution",
+ ),
+)
+
+#show: juti.template.with(
+ title: "Preparation of papers for jurnal ilmiah teknologi informasi",
+ authors: authors,
+ corresponding-ref: 0,
+ corresponding-email: "first-author@email.com",
+ institutions: institutions,
+ abstract: [
+ These instructions give you guidelines for preparing JUTI (Jurnal Ilmiah Teknologi Informasi) papers. The electronic file of your paper will be formatted further by JUTI editorial board. Paper titles should be written in uppercase. Avoid writing long formulas with subscripts in the title; short formulas that identify the elements are fine (e.g., "Nd--Fe--B"). Do not write “(Invited)” in the title. Full names of authors are preferred in the author field but are not required. If you have to shorten the author’s name, leave first name and last name unshorten. Put a space between authors’ initials. Do not cite references in the abstract. The length of abstract must between 150 -- 250 words.
+ ],
+ keywords: (
+ "Keyword1",
+ "Keyword2",
+ "Keyword3",
+ "Keyword4",
+ ),
+ bib: bibliography("references.bib"),
+ ..setup,
+)
+
+= Introduction
+
+Example of citation @abbas2009automatic, or multiple citations @abbas2009automatic @yuhana2022automatic. #lorem(100)
+
+= Literature review
+
+#lorem(100)
+Table example can be seen on @tab-example.
+Image example can be seen on @img-example.
+The Schrodinger's famous equation can be seen on @eq-example.
+
+#let hbar = (sym.wj, move(dy: -0.08em, strike(offset: -0.55em, extent: -0.05em, sym.planck)), sym.wj).join()
+$ i hbar (partial Psi(x, t)) / (partial t) = -frac(hbar^2, 2m) nabla^2 Psi(x, t) + V(x) Psi(x, t) $
+
+== Subsection title
+
+#lorem(100)
+
+#figure(
+ table(
+ columns: 4,
+ align: (x, y) => if x > 0 and y > 0 { left } else { center },
+ table.header(
+ table.hline(),
+ [*No*],
+ [*Year*],
+ [*Climate Change Event*],
+ [*Impact*],
+ table.hline(),
+ ),
+ [1], [1988], [Establishment of the IPCC], [Increased global awareness and scientific assessments],
+ [2], [1997], [Kyoto Protocol Adopted], [Legally binding emission reduction targets for developed countries],
+ [3], [2015], [Paris Agreement Signed], [Global commitment to limit warming below 2°C],
+ [4], [2021], [COP26 Held in Glasgow], [Strengthened climate targets and financial commitments],
+ [5], [2009], [Copenhagen Accord], [Pledged climate finance of \$100 billion per year],
+ [6], [2007], [IPCC Fourth Assessment Report], [Highlighted human influence on climate change],
+ [7], [2018], [IPCC Special Report on 1.5°C], [Urgent need for emission reductions to avoid severe impacts],
+ table.hline(),
+ ),
+ caption: [Table example.],
+)
+
+#figure(
+ image("figure1.jpg", width: 40%),
+ caption: [Logo of JUTI: Jurnal Ilmiah Teknologi Informasi. Note that #quote[Fig.] is abbreviated. There is a period after the figure number, followed by two spaces. It is good practice to explain the significance of the figure in the caption.],
+)
+
+#lorem(100)
+
+=== Subsubsection title
+
+#lorem(100)
+
+#lorem(100)
+
+#set heading(numbering: none)
+
+= CRediT authorship contribution statement
+
+#juti.credits(authors)
+
+= Declaration of competing interest
+
+The authors declare that they have no known competing financial interests or personal relationships that could have appeared to influence the work reported in this paper.
+
+= Acknowledgement
+
+This research was funded by ...
+
+= Data availability
+
+Please choose the appropriate data availability statement that applies to this study. If none apply, provide a custom statement.
+- The data used to support the findings of this study are available from the corresponding author upon request.
+- All relevant data are within the manuscript and its supporting information files.
+- The dataset was openly provided [link provided].
+- Data sharing is not applicable to this article as no datasets were generated or analyzed during the current study.
+- Data sharing is not applicable as the data are secondary data drawn from already published literature.
+- The datasets generated during and/or analyzed during the current study are available from the corresponding author on reasonable request.
+- Following acceptance and before publication, all data will be provided on a public repository.
+- No data are available.
+
+= Declaration of generative AI and AI-assisted technologies in the writing process
+
+The authors used generative AI to improve the writing clarity of this paper. They reviewed and edited the AI-assisted content and take full responsibility for the final publication.
+
+= ORCID
+
+#juti.orcid(authors)
diff --git a/packages/preview/juti/0.1.1/template/references.bib b/packages/preview/juti/0.1.1/template/references.bib
new file mode 100644
index 0000000000..c338523a1e
--- /dev/null
+++ b/packages/preview/juti/0.1.1/template/references.bib
@@ -0,0 +1,19 @@
+@article{abbas2009automatic,
+ title={An automatic system to grade multiple choice questions paper based exams},
+ author={Abbas, Ammar Awny},
+ journal={Journal of university of Anbar for Pure science},
+ volume={3},
+ number={1},
+ pages={174--181},
+ year={2009},
+ publisher={University of Anbar}
+}
+
+@article{yuhana2022automatic,
+ title={Automatic Assessment of Answers to Mathematics Stories Question Based on Tree Matching and Random Forest.},
+ author={Yuhana, Umi Laili and Oktavia, Vessa Rizky and Fatichah, Chastine and Purwarianti, Ayu},
+ journal={International Journal of Intelligent Engineering \& Systems},
+ volume={15},
+ number={2},
+ year={2022}
+}
diff --git a/packages/preview/juti/0.1.1/template/setup.typ b/packages/preview/juti/0.1.1/template/setup.typ
new file mode 100644
index 0000000000..463007d4a7
--- /dev/null
+++ b/packages/preview/juti/0.1.1/template/setup.typ
@@ -0,0 +1 @@
+#let setup = (start-page: 1)
diff --git a/packages/preview/juti/0.1.1/thumbnail.png b/packages/preview/juti/0.1.1/thumbnail.png
new file mode 100644
index 0000000000..eef2329b42
Binary files /dev/null and b/packages/preview/juti/0.1.1/thumbnail.png differ
diff --git a/packages/preview/juti/0.1.1/typst.toml b/packages/preview/juti/0.1.1/typst.toml
new file mode 100644
index 0000000000..a71238a090
--- /dev/null
+++ b/packages/preview/juti/0.1.1/typst.toml
@@ -0,0 +1,18 @@
+[package]
+name = "juti"
+version = "0.1.1"
+entrypoint = "juti.typ"
+authors = [
+ "Moch. Nafkhan Alzamzami ",
+ "Muhammad 'Arif Faizin ",
+ "Imam Mustafa Kamal ",
+]
+license = "MIT"
+description = "Template for writing articles for JUTI: Jurnal Ilmiah Teknologi Informasi"
+# repository = ""
+categories = ["paper"]
+
+[template]
+path = "template"
+entrypoint = "main.typ"
+thumbnail = "thumbnail.png"