No description
This repository has been archived on 2023-08-07. You can view files and clone it, but cannot push or open issues or pull requests.
Find a file
2023-08-06 18:19:16 +01:00
.github Utilize the EEx Engine instead of creating an EEx string (#177) 2022-04-19 23:56:46 -04:00
bin Compile to EEx (#80) 2020-06-16 15:28:21 -04:00
config Utilize the EEx Engine instead of creating an EEx string (#177) 2022-04-19 23:56:46 -04:00
guides Utilize the EEx Engine instead of creating an EEx string (#177) 2022-04-19 23:56:46 -04:00
integration_test/temple_plug_demo Utilize the EEx Engine instead of creating an EEx string (#177) 2022-04-19 23:56:46 -04:00
lib fix tests 2023-08-06 18:12:51 +01:00
test update deps 2023-08-06 18:19:16 +01:00
.formatter.exs Utilize the EEx Engine instead of creating an EEx string (#177) 2022-04-19 23:56:46 -04:00
.gitignore Compile to EEx (#80) 2020-06-16 15:28:21 -04:00
.tool-versions fix tests 2023-08-06 18:12:51 +01:00
CHANGELOG.md Utilize the EEx Engine instead of creating an EEx string (#177) 2022-04-19 23:56:46 -04:00
LICENSE feat: New Component API 2021-01-02 13:22:03 -05:00
mix.exs Remove last remnants of Phoenix 2022-04-20 00:05:27 -04:00
mix.lock update deps 2023-08-06 18:19:16 +01:00
README.md Remove comment from README 2022-04-20 00:03:38 -04:00
temple-github-image.png Utilize the EEx Engine instead of creating an EEx string (#177) 2022-04-19 23:56:46 -04:00
temple.png Logo 2019-07-04 00:16:37 -04:00

Actions Status Hex.pm

You are looking at the README for the main branch. The README for the latest stable release is located here.

Temple is an Elixir DSL for writing HTML.

Installation

Add temple to your list of dependencies in mix.exs:

def deps do
  [
    {:temple, "~> 0.9.0-rc.0"}
  ]
end

Goals

Currently Temple has the following things on which it won't compromise.

  • Will only work with valid Elixir syntax.
  • Should work in all web environments such as Plug, Aino, Phoenix, and Phoenix LiveView.

Usage

Using Temple is as simple as using the DSL inside of an temple/1 block. The runtime result of the macro is your HTML.

See the guides for more details.

import Temple

temple do
  h2 do: "todos"

  ul class: "list" do
    for item <- @items do
      li class: "item" do
        div class: "checkbox" do
          div class: "bullet hidden"
        end

        div do: item
      end
    end
  end

  script do: """
  function toggleCheck({currentTarget}) {
    currentTarget.children[0].children[0].classList.toggle("hidden");
  }

  let items = document.querySelectorAll("li");

  Array.from(items).forEach(checkbox => checkbox.addEventListener("click", toggleCheck));
  """
end

Components

Temple components are simple to write and easy to use.

Unlike normal partials, Temple components have the concept of "slots", which are similar Vue. You can also refer to HEEx and Surface for examples of templates that have the "slot" concept.

Please see the guides for more details.

defmodule MyAppWeb.Component do
  import Temple

  def card(assigns) do
    temple do
      section do
        div do
          slot :header
        end

        div do
          slot :default
        end

        div do
          slot :footer
        end
      end
    end
  end
end

Using components is as simple as passing a reference to your component function to the c keyword.

import MyAppWeb.Component

c &card/1 do
  slot :header do
    @user.full_name
  end

  @user.bio

  slot :footer do
    a href: "https://twitter.com/#{@user.twitter}" do
      "@#{@user.twitter}"
    end
    a href: "https://github.com/#{@user.github}" do
      "@#{@user.github}"
    end
  end
end

Engine

By default, Temple will use the EEx.SmartEngine that is built into the Elixir standard library. If you are a web framework that uses it's own template engine (such as Aino and Phoenix/LiveView, you can configure Temple to it!

# config/config.exs

config :temple,
  engine: Aino.View.Engine # or Phoenix.HTML.Engine or Phoenix.LiveView.Engine

Formatter

To include Temple's formatter configuration, add :temple to your .formatter.exs.

[
  import_deps: [:temple],
  inputs: ["*.{ex,exs}", "priv/*/seeds.exs", "{config,lib,test}/**/*.{ex,exs,lexs}"],
]

Phoenix

To use with Phoenix, please use the temple_phoenix package! This bundles up some useful helpers as well as the Phoenix Template engine.