← Kembali ke showcase

Todo List

Daftar tugas dengan input, tombol tambah, dan render list via `Ulangi untuk`. Menunjukkan pattern CRUD minimal.

loop array masukan
todo.pjs
---
judul: "Todo List"
---

Gaya:
    body
        font-family: 'Inter', system-ui, -apple-system, sans-serif
        margin: 0
        min-height: 100vh
        display: flex
        align-items: center
        justify-content: center
        background: linear-gradient(135deg, #0f0c29 0%, #302b63 50%, #24243e 100%)
        color: #e0e0e0
        padding: 20px
    .todo-wrapper
        width: 100%
        max-width: 480px
        background: rgba(255,255,255,0.05)
        backdrop-filter: blur(20px)
        -webkit-backdrop-filter: blur(20px)
        border: 1px solid rgba(255,255,255,0.1)
        border-radius: 24px
        padding: 32px
        box-shadow: 0 25px 60px rgba(0,0,0,0.4)
    .todo-wrapper h1
        margin: 0 0 4px
        font-size: 1.6rem
        font-weight: 800
        text-align: center
        background: linear-gradient(135deg, #7dd3fc, #d3b6e9)
        -webkit-background-clip: text
        -webkit-text-fill-color: transparent
        background-clip: text
    .todo-stats
        text-align: center
        color: #64748b
        font-size: 0.82rem
        margin-bottom: 20px
    .input-group
        display: flex
        gap: 8px
        margin-bottom: 20px
    .input-group input
        flex: 1
        padding: 12px 16px
        background: rgba(255,255,255,0.06)
        border: 1px solid rgba(255,255,255,0.12)
        border-radius: 12px
        color: #e0e0e0
        font-size: 0.95rem
        outline: none
        font-family: inherit
        transition: border-color 0.15s ease
    .input-group input:focus
        border-color: #7dd3fc
        box-shadow: 0 0 0 3px rgba(125,211,252,0.1)
    .input-group input::placeholder
        color: #475569
    .input-group button
        padding: 12px 20px
        background: linear-gradient(135deg, #7dd3fc, #4f9ef7)
        border: none
        border-radius: 12px
        color: #0f172a
        font-weight: 700
        font-size: 0.95rem
        cursor: pointer
        transition: opacity 0.15s ease
        font-family: inherit
    .input-group button:hover
        opacity: 0.9
    .todo-list
        list-style: none
        padding: 0
        margin: 0 0 8px
    .todo-item
        display: flex
        align-items: center
        gap: 10px
        padding: 12px 14px
        background: rgba(255,255,255,0.03)
        border: 1px solid rgba(255,255,255,0.05)
        border-radius: 10px
        margin-bottom: 6px
        transition: background 0.15s
    .todo-item:hover
        background: rgba(255,255,255,0.06)
    .todo-text
        flex: 1
        font-size: 0.95rem
        color: #e0e0e0
    .delete-btn
        background: none
        border: 1px solid rgba(239,68,68,0.2)
        color: #fca5a5
        cursor: pointer
        font-size: 1rem
        padding: 4px 10px
        border-radius: 8px
        transition: all 0.15s
        font-family: inherit
    .delete-btn:hover
        background: rgba(239,68,68,0.1)
        border-color: rgba(239,68,68,0.4)
    .list-empty
        text-align: center
        color: #475569
        font-size: 0.9rem
        padding: 24px
        font-style: italic

Halaman Todo:
    data daftar = []
    data teks = ""

    Buat div.todo-wrapper:
        Buat h1: $judul
        Buat div.todo-stats:
            Buat span:
                "📋 "

            Saat daftar:
                Buat span:
                    panjang(daftar)

            Buat span:
                " item"

        Buat div.input-group:
            Buat masukan#todo-input:
                placeholder = "Tulis tugas baru..."
                on_diketik = simpan document.querySelector("#todo-input").value ke teks
            Buat tombol#btn-tambah:
                "+ Tambah"
                on_klik = tambahkan teks ke daftar

        Buat daftar.todo-list:
            Ulangi untuk item dari daftar:
                Buat li.todo-item:
                    Buat span.todo-text: item
                    Buat tombol.delete-btn: "✕"
                        on_klik = hapus item dari daftar
Live Preview