Current section

Files

Jump to
moon lib moon_web components example_and_code.ex
Raw

lib/moon_web/components/example_and_code.ex

defmodule MoonWeb.Components.ExampleAndCode do
@moduledoc false
use Moon.StatefulComponent
alias Moon.Design.Tag
alias Moon.Design.Tabs
alias Moon.Icons.ControlsEye
alias Moon.Icons.SoftwareCode
prop(class, :string)
prop(example_class, :css_class)
prop(title, :string, default: "")
prop(layout, :string, default: "grid")
slot(example)
slot(code)
slot(state)
slot(note)
def render(assigns) do
~F"""
<section class={"flex flex-col", @class}>
<div class="flex flex-row items-center justify-between">
<div class="flex flex-row gap-2 w-full">
<Tabs id={"#{@id}-example-and-code"} class="justify-between gap-6">
<h2 class="text-moon-24 font-semibold order-1">{@title}</h2>
<p :if={slot_assigned?(:note)} class="text-moon-16 w-full order-3 empty:hidden"><#slot {@note} /></p>
<Tabs.List class="w-fit p-1 gap-1 bg-gohan rounded-moon-s-md order-2">
<Tabs.Segment class="flex flex-row gap-2">
<ControlsEye class="text-moon-24" />
<span class="hidden md:block">Preview</span>
</Tabs.Segment>
<Tabs.Segment class="flex flex-row gap-2">
<SoftwareCode class="text-moon-24" />
<span class="hidden md:block">Code</span>
</Tabs.Segment>
</Tabs.List>
<Tabs.Panels class="order-4 focus:outline-none">
<Tabs.Panel>
<div class={merge([
"p-4 flex bg-gohan text-moon-14 rounded-moon-s-sm w-full",
@example_class
])}>
<!-- Do not remove this -->
<div class="flex flex-wrap items-center justify-around gap-2 w-full bg-transparent">
<#slot {@example}>Example not defined</#slot>
</div>
</div>
</Tabs.Panel>
<Tabs.Panel>
<div class="overflow-scroll">
<pre class="theme-moon-dark w-full bg-gohan overflow-scroll p-4 text-moon-14 text-bulma rounded-moon-s-sm"><#slot {@code}>Example code not defined</#slot></pre>
</div>
</Tabs.Panel>
</Tabs.Panels>
</Tabs>
</div>
</div>
<div
class="theme-moon-dark grid gap-4 p-4 bg-gohan text-moon-14 rounded-moon-s-sm"
:if={slot_assigned?(:state)}
>
<div><Tag class="text-goten bg-piccolo w-fit">State</Tag></div>
<pre class="break-all overflow-x-scroll text-bulma"><#slot {@state} /></pre>
</div>
</section>
"""
end
end