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.
temple/lib/temple/recompiler.ex

16 lines
366 B
Elixir
Raw Normal View History

Components API Components work very similarly to how they worked before, but with a few differences. To define a component, you can create a file in your configured temple components directory, which defaults to `lib/components`. You would probably want ot change that to be `lib/my_app_web/components` if you are building a phoenix app. This file should be of the `.exs` extension, and contain any temple compatible code. You can then use this component in any other temple template. For example, if I were to define a `flex` component, I would create a file called `lib/my_app_web/components/flex.exs`, with the following contents. ```elixir div class: "flex #{@temple[:class]}", id: @id do @children end ``` And we could use the component like so ```elixir flex class: "justify-between items-center", id: "arnold" do div do: "Hi" div do: "I'm" div do: "Arnold" div do: "Schwarzenegger" end ``` We've demonstated several features to components in this example. We can pass assigns to our component, and access them just like we would in a normal phoenix template. If they don't match up with any assigns we passed to our component, they will be rendered as-is, and will become a normal Phoenix assign. You can also access a special `@temple` assign. This allows you do optionally pass an assign, and not have the `@my_assign` pass through. If you didn't pass it to your component, it will evaluate to nil. The block passed to your component can be accessed as `@children`. This allows your components to wrap a body of markup from the call site. In order for components to trigger a recompile when they are changed, you can call `use Temple.Recompiler` in your `lib/my_app_web.ex` file, in the `view`, `live_view`, and `live_component` functions ```elixir def view do quote do # ... use Temple.Recompiler # ... end end ```
2020-07-16 02:11:35 +00:00
defmodule Temple.Recompiler do
defmacro __using__(_) do
quote do
component_path = Application.get_env(:temple, :components_path)
for f <- File.ls!(component_path),
do:
Module.put_attribute(
__MODULE__,
:external_resource,
Path.join(component_path, f)
)
end
end
end