Props

Props are used to send data to a children component.

THP’s components can receive any datatype as props, and they are defined as normal parameters.

For example, to receive a String declare it as a parameter:

fun Greeter(String name) -> HTML
{
    <p>Hello {name}!</p>
}thp
    
Syntax error: Expected an identifier after the `fun` keyword. at line 1:4

And to send its value type the parameter name as an attribute:

fun Home() -> HTML
{
    <div>
        <Greeter name="Rose" />
    </div>
}thp
    
Syntax error: Expected an identifier after the `fun` keyword. at line 1:4
<div><p>Hello Rose</p></div>

You can have as many props as you’d like, of any datatype:

fun Greeter(String name, Int age, Array[String] friends) -> HTML
{
    // ...
}thp
    
Syntax error: Expected an identifier after the `fun` keyword. at line 1:4

Static props

If the prop has a type String you can use a normal attribute.

fun Home() -> HTML
{
    <div>
        // name is a String, so we use ""
        <Greeter name="Rose" />
    </div>
}thp
    
Syntax error: Expected an identifier after the `fun` keyword. at line 1:4

Dynamic props

However, if the prop has any other datatype you must use a dynamic attribute ({})

// This component receives a Cat object
fun Sample(Cat cat) -> HTML
{
    // ...
}

fun Home() -> HTML
{
    val my_cat = Cat("Michifu")

    <div>
        <Sample cat={my_cat} />
    </div>
}thp
    
Syntax error: Expected an identifier after the `fun` keyword. at line 2:5

Components as props

If for some reason you want to use a component as a prop use the HTML datatype:

// The parameter can have any name, not only `child`
fun Sample(HTML child) -> HTML
{
    <>
        <p>Sup</p>
        {child}
    </>
}thp
    
Syntax error: Expected an identifier after the `fun` keyword. at line 2:5

This, however, means that your prop component must be declared as an attribute:

fun Home() -> HTML
{
    <div>
        <Sample child={<span>I am the child</span>} />
    </div>
}thp
    
Syntax error: Expected an identifier after the `fun` keyword. at line 1:4
<div>
    <p>Sup</p>
    <span>I am the child</span>
</div>

A better solution may be to use slots.

Slots

Slots allow you to write html inside a component tag.

fun MyButton() -> HTML
{
    <button>
        // This is the slot, it will render the HTML inside the tag
        <Slot />
    </button>
}

fun Home() -> HTML
{
    <div>
        <MyButton>
            buy <b>now!</b>
        </MyButton>
    </div>
}thp
    
Syntax error: Expected an identifier after the `fun` keyword. at line 1:4
<div>
    <button>
        buy <b>now!</b>
    </button>
</div>