Langsung ke isi

Bantuan

Referensi template

Template adalah satu file HTML dengan placeholder Mustache. Daftar di halaman ini dibuat langsung dari kode validator, jadi selalu sama dengan yang diperiksa saat diunggah.

Unduh starter template

Starter memakai semua blok dan ketujuh partial dengan CSS dasar. Ubah sesukamu, lalu unggah.

Dasar Mustache

  • {{bride.full_name}} mencetak teks. Semua teks di-escape otomatis.
  • {{#akad}}...{{/akad}} hanya dirender bila sesi akad ada. Di dalamnya, field sesi bisa ditulis langsung: {{date_long}}.
  • {{#gifts}}...{{/gifts}} mengulang isi untuk setiap item list.
  • {{^has_gallery}}...{{/has_gallery}} dirender bila nilainya kosong atau tidak.
  • Section hanya boleh pada field berjenis objek, list, atau ya/tidak. Section pada field teks ditolak.
  • Template wajib berisi <html dan </body>, berupa UTF-8, maksimal 2 MB. Inline <script> dan <style> diizinkan.

Field baku

Field di dalam list ditulis dengan nama list-nya, misalnya gifts.bank_name; di template tulis {{bank_name}} di dalam {{#gifts}}. Contoh nilai berasal dari data contoh yang dipakai pratinjau.

PathJenisContoh nilai
akadobjek
akad.addressteksJl. Tamansari No. 73, Bandung
akad.calendar_urltekshttps://calendar.google.com/calendar/render?action=TEMPLATE…
akad.dateteks2026-12-23
akad.date_isoteks2026-12-23
akad.date_longteksRabu, 23 Desember 2026
akad.datetime_isoteks2026-12-23T08:00:00+07:00
akad.dress_codeteksBatik atau kebaya
akad.latteks-6.8869
akad.lngteks107.6105
akad.maps_urltekshttps://maps.app.goo.gl/contoh
akad.noteteks
akad.time_endteks10:00:00
akad.time_rangeteks08.00 - 10.00 WIB
akad.time_startteks08:00:00
akad.timezoneteksWIB
akad.titleteksAkad Nikah
akad.venue_nameteksMasjid Salman ITB
brideobjek
bride.child_orderteksPutri pertama
bride.father_deceasedya/tidakfalse
bride.father_nameteksAhmad Suryadi
bride.full_nameteksRani Puspitasari
bride.guardianteks
bride.instagramteksrani
bride.mother_deceasedya/tidakfalse
bride.mother_nameteksSiti Aminah
bride.nicknameteksRani
bride.parents_lineteksBapak Ahmad Suryadi & Ibu Siti Aminah
bride.photo_urltekshttps://purwarupa.freeundangan.id/static/demo/mempelai-wani…
closing_textteksMerupakan suatu kehormatan dan kebahagiaan bagi kami apabil…
countdown_labelteksRabu, 23 Desember 2026
countdown_targetteks2026-12-23T11:00:00+07:00
couple_orderteksbride_first
couple_shortteksRani & Budi
cover_image_urltekshttps://purwarupa.freeundangan.id/static/demo/sampul.webp
customobjek
extra_sessionslist1 item
extra_sessions.addressteksJl. Tamansari No. 73, Bandung
extra_sessions.calendar_urltekshttps://calendar.google.com/calendar/render?action=TEMPLATE…
extra_sessions.dateteks2026-12-30
extra_sessions.date_isoteks2026-12-30
extra_sessions.date_longteksRabu, 30 Desember 2026
extra_sessions.datetime_isoteks2026-12-30T10:00:00+07:00
extra_sessions.dress_codeteksBatik atau kebaya
extra_sessions.latteks-6.8869
extra_sessions.lngteks107.6105
extra_sessions.maps_urltekshttps://maps.app.goo.gl/contoh
extra_sessions.noteteks
extra_sessions.time_endteks13:00:00
extra_sessions.time_rangeteks10.00 - 13.00 WIB
extra_sessions.time_startteks10:00:00
extra_sessions.timezoneteksWIB
extra_sessions.titleteksNgunduh Mantu
extra_sessions.venue_nameteksKediaman Keluarga Santoso
firstobjek
first.child_orderteksPutri pertama
first.father_deceasedya/tidakfalse
first.father_nameteksAhmad Suryadi
first.full_nameteksRani Puspitasari
first.guardianteks
first.instagramteksrani
first.mother_deceasedya/tidakfalse
first.mother_nameteksSiti Aminah
first.nicknameteksRani
first.parents_lineteksBapak Ahmad Suryadi & Ibu Siti Aminah
first.photo_urltekshttps://purwarupa.freeundangan.id/static/demo/mempelai-wani…
gallerylist4 item
gallery.urltekshttps://purwarupa.freeundangan.id/static/demo/galeri-1.webp
gift_addressteksJl. Cisitu Indah No. 12, Bandung 40135
giftslist2 item
gifts.account_holderteksRani Puspitasari
gifts.account_numberteks1234567890
gifts.bank_nameteksBCA
groomobjek
groom.child_orderteksPutra kedua
groom.father_deceasedya/tidakfalse
groom.father_nameteksHadi Santoso
groom.full_nameteksBudi Santoso
groom.guardianteks
groom.instagramteksbudi
groom.mother_deceasedya/tidakfalse
groom.mother_nameteksRatna Dewi
groom.nicknameteksBudi
groom.parents_lineteksBapak Hadi Santoso & Ibu Ratna Dewi
groom.photo_urltekshttps://purwarupa.freeundangan.id/static/demo/mempelai-pria…
guest_fallback_textteksTamu Undangan
has_akadya/tidaktrue
has_extra_sessionsya/tidaktrue
has_galleryya/tidaktrue
has_giftsya/tidaktrue
has_love_storyya/tidaktrue
has_musicya/tidaktrue
has_resepsiya/tidaktrue
has_videoya/tidaktrue
hashtagteks#RaniBudiBerbagiCerita
love_storylist3 item
love_story.dateteksAgustus 2019
love_story.textteksKami bertemu di sebuah kegiatan kampus dan ternyata satu an…
love_story.titleteksPertama bertemu
music_idtekscontoh
music_urltekshttps://files.example.com/music/contoh.mp3
opening_textteksDengan memohon rahmat Tuhan Yang Maha Esa, kami bermaksud m…
quoteteksDan di antara tanda-tanda kebesaran-Nya ialah Dia menciptak…
quote_sourceteksQS Ar-Rum: 21
resepsiobjek
resepsi.addressteksJl. Tamansari No. 73, Bandung
resepsi.calendar_urltekshttps://calendar.google.com/calendar/render?action=TEMPLATE…
resepsi.dateteks2026-12-23
resepsi.date_isoteks2026-12-23
resepsi.date_longteksRabu, 23 Desember 2026
resepsi.datetime_isoteks2026-12-23T11:00:00+07:00
resepsi.dress_codeteksBatik atau kebaya
resepsi.latteks-6.8869
resepsi.lngteks107.6105
resepsi.maps_urltekshttps://maps.app.goo.gl/contoh
resepsi.noteteks
resepsi.time_endteks
resepsi.time_rangeteks11.00 WIB - selesai
resepsi.time_startteks11:00:00
resepsi.timezoneteksWIB
resepsi.titleteksResepsi
resepsi.venue_nameteksGedung Sabuga
secondobjek
second.child_orderteksPutra kedua
second.father_deceasedya/tidakfalse
second.father_nameteksHadi Santoso
second.full_nameteksBudi Santoso
second.guardianteks
second.instagramteksbudi
second.mother_deceasedya/tidakfalse
second.mother_nameteksRatna Dewi
second.nicknameteksBudi
second.parents_lineteksBapak Hadi Santoso & Ibu Ratna Dewi
second.photo_urltekshttps://purwarupa.freeundangan.id/static/demo/mempelai-pria…
slugtekscontoh
video_embed_urltekshttps://www.youtube.com/embed/dQw4w9WgXcQ
video_urltekshttps://www.youtube.com/watch?v=dQw4w9WgXcQ

Partial SDK

Partial menyisipkan markup interaktif yang dihidupkan SDK. Partial tidak membawa CSS; semua tampilan diatur template-mu. Partial lain selain tujuh ini ditolak, dan setiap partial boleh dipakai lebih dari sekali.

{{> open_button}}

Tanpa data-state. Setelah diklik, <html> mendapat class fu-opened.

<button type="button" class="fu-open">Buka Undangan</button>

{{> guest_name}}

data-state: pending, resolved, fallback

<span class="fu-guest-name" data-state="pending" aria-busy="true">{{guest_fallback_text}}</span>

{{> rsvp_form}}

data-state: no-token, closed, idle, sending, done, error

<form class="fu-rsvp" data-state="idle" data-closes-at="{{countdown_target}}">
  <p class="fu-rsvp__no-token" hidden>Konfirmasi kehadiran hanya untuk tamu undangan.</p>
  <p class="fu-rsvp__closed" hidden>Konfirmasi kehadiran sudah ditutup.</p>
  <fieldset class="fu-rsvp__attending">
    <legend>Kehadiran</legend>
    <label><input type="radio" name="attending" value="true" required> Hadir</label>
    <label><input type="radio" name="attending" value="false"> Tidak hadir</label>
  </fieldset>
  <label class="fu-rsvp__party-size">Jumlah orang <input type="number" name="party_size" min="1" max="1" value="1" inputmode="numeric"></label>
  <label class="fu-rsvp__message">Ucapan (opsional) <textarea name="message" maxlength="500"></textarea></label>
  <button type="submit" class="fu-rsvp__submit">Kirim</button>
  <p class="fu-rsvp__done" role="status" hidden>Terima kasih, konfirmasi tersimpan.</p>
  <p class="fu-rsvp__error" role="alert" hidden>Gagal mengirim, coba lagi.</p>
</form>

{{> guestbook}}

data-state: loading, ready, empty, error

<section class="fu-guestbook" data-state="loading" aria-busy="true">
  <form class="fu-guestbook__form">
    <label class="fu-guestbook__name">Nama <input name="name" maxlength="60" required autocomplete="name"></label>
    <label class="fu-guestbook__message">Ucapan <textarea name="message" maxlength="500" required></textarea></label>
    <button type="submit" class="fu-guestbook__submit">Kirim</button>
    <p class="fu-guestbook__sent" role="status" hidden>Ucapan terkirim.</p>
    <p class="fu-guestbook__error" role="alert" hidden>Gagal mengirim, coba lagi.</p>
  </form>
  <ul class="fu-guestbook__list" aria-label="Ucapan"></ul>
  <template class="fu-guestbook__item-template">
    <li class="fu-guestbook__item">
      <strong class="fu-guestbook__item-name"></strong>
      <time class="fu-guestbook__item-time"></time>
      <p class="fu-guestbook__item-message"></p>
    </li>
  </template>
  <button type="button" class="fu-guestbook__more" hidden>Muat lagi</button>
  <p class="fu-guestbook__empty" hidden>Belum ada ucapan. Jadilah yang pertama.</p>
</section>

{{> countdown}}

data-state: running, past

{{#countdown_target}}<div class="fu-countdown" data-target="{{countdown_target}}" data-state="running" role="timer" aria-label="Menuju {{countdown_label}}">
  <span class="fu-countdown__unit"><span class="fu-countdown__days">0</span> <span class="fu-countdown__label">Hari</span></span>
  <span class="fu-countdown__unit"><span class="fu-countdown__hours">0</span> <span class="fu-countdown__label">Jam</span></span>
  <span class="fu-countdown__unit"><span class="fu-countdown__minutes">0</span> <span class="fu-countdown__label">Menit</span></span>
  <span class="fu-countdown__unit"><span class="fu-countdown__seconds">0</span> <span class="fu-countdown__label">Detik</span></span>
</div>{{/countdown_target}}

{{> music_player}}

data-state: paused, playing

{{#has_music}}<button type="button" class="fu-music" data-state="paused" aria-label="Musik latar" aria-pressed="false">
  <span class="fu-music__play" aria-hidden="true"></span>
  <span class="fu-music__pause" aria-hidden="true"></span>
  <audio class="fu-music__audio" src="{{music_url}}" loop preload="none"></audio>
</button>{{/has_music}}

{{> copy_button}}

data-state: idle, copied

<button type="button" class="fu-copy" data-copy="{{account_number}}" data-state="idle">
  Salin <span class="fu-copy__done" role="status" hidden>Tersalin</span>
</button>

Menata status

Status partial ada di atribut data-state pada elemen root. Pesan per status disembunyikan SDK dengan atribut hidden, sehingga template yang belum menata status tetap tampil benar. Template yang memakai partial tanpa selector .fu- atau [data-state di CSS mendapat peringatan saat diunggah.

/* Layar pembuka hilang setelah tombol buka diklik */
html.fu-opened .cover { display: none; }

/* Status di elemen root */
.fu-rsvp[data-state="sending"] .fu-rsvp__submit { opacity: .6; }
.fu-copy[data-state="copied"] { background: seagreen; color: white; }
.fu-music[data-state="playing"] .fu-music__play { display: none; }

/* Pesan yang disembunyikan SDK */
[hidden] { display: none !important; }

/* Atau beri animasi masuk dengan menimpa [hidden] */
.fu-rsvp__done { transition: opacity .3s; }
.fu-rsvp__done[hidden] { display: block; opacity: 0; }

Pratinjau template bisa memaksa status no-token, error, empty, dan closed agar setiap tampilan bisa dicek tanpa data sungguhan.

Field custom

Butuh isian yang tidak ada di daftar field baku? Tulis nama satu kata yang belum dipakai, misalnya {{motto}} atau {{custom.motto}}. Saat diunggah, validator mencatatnya sebagai field custom dan kamu diminta mendeklarasikannya: label yang dilihat pasangan, jenis isian (text, textarea, image, atau url), dan nilai bawaan.

  • Nama yang sama dengan field baku ditolak.
  • Nama yang mirip field baku, misalnya hastag, mendapat peringatan salah ketik.
  • Path bertitik yang tidak dikenal, misalnya bride.nam, ditolak dengan saran nama yang benar.
  • Pasangan mengisi field custom di bagian Custom pada editor. Selama kosong, nilai bawaan yang dipakai.

Aturan aset

Atribut src, href, srcset, dan poster pada img, source, video, audio, link, script, dan iframe hanya boleh mengarah ke alamat berikut. Atribut action pada form juga diperiksa.

  • https://purwarupa.freeundangan.id/files
  • https://fonts.googleapis.com
  • https://fonts.gstatic.com
  • https://cdnjs.cloudflare.com
  • https://cdn.jsdelivr.net
  • https://unpkg.com
  • https://www.youtube.com
  • https://www.google.com/maps

URI data: hanya boleh di <img>, maksimal 100 KB. Nilai yang berisi placeholder, misalnya src="{{bride.photo_url}}", dilewati saat diunggah karena diisi dari data undangan. Gambar dekorasi yang lebih besar perlu di-host di salah satu alamat di atas.