Packages
moon
2.89.1
2.90.5
retired
2.90.4
2.90.3
2.90.2
2.90.1
2.90.0
2.89.4
2.89.1
2.89.0
2.88.0
2.87.11
2.87.10
2.87.9
2.87.8
2.87.7
2.87.6
2.87.5
2.87.4
2.87.3
2.87.2
2.87.1
2.87.0
2.86.1
2.86.0
2.85.1
2.85.0
2.84.0
2.83.0
2.82.0
2.81.4
2.81.3
2.81.2
2.81.1
2.81.0
2.80.2
2.80.1
2.80.0
2.79.13
2.79.12
2.79.11
2.79.10
2.79.9
2.79.8
2.79.7
2.79.6
2.79.5
2.79.4
2.79.3
2.79.2
2.79.1
2.79.0
2.78.4
2.78.3
2.78.2
2.78.1
2.78.0
2.77.0
2.76.5
2.76.4
2.76.3
2.76.2
2.76.1
2.76.0
2.75.0
2.74.1
2.74.0
2.73.8
2.73.7
2.73.6
2.73.5
2.73.4
2.73.3
2.73.2
2.73.1
2.73.0
2.72.5
2.72.4
2.72.3
2.72.2
2.72.1
2.72.0
2.71.1
2.71.0
2.70.0
2.69.2
2.69.1
2.69.0
2.68.11
2.68.10
Components-based design system written in elixir
Current section
Files
Jump to
Current section
Files
lib/moon_web/components/started/for_developer.ex
defmodule MoonWeb.Components.Started.ForDeveloper do
@moduledoc false
use MoonWeb, :stateless_component
alias MoonWeb.Components.IndentedCodeSnippet
alias MoonWeb.Components.CodeSnippet
alias MoonWeb.Components.PageSection
def render(assigns) do
~F"""
<PageSection title="Overview">
<p><span class="font-medium">Moon Design System</span> is a collection of reusable components set up and grouped according to simple and clear standards. <span class="font-medium">Moon DS</span> component collection is the single source of truth that can be used to build any number of applications.</p>
</PageSection>
<PageSection title="Requirements">
<p>
<span class="font-medium">Moon Design System</span> can be used for new and existing Phoenix project that uses LiveView
</p>
<p>
Moon Surface components
<a
class="text-piccolo font-medium transition-colors duration-200 hover:text-hit visited:text-hit"
href={"#{live_path(MoonWeb.Endpoint, MoonWeb.Pages.PhoenixUsagePage)}"}
>
can be used from SLIM and EEX templates
</a>
, but recommended format is
<a
class="text-piccolo font-medium transition-colors duration-200 hover:text-hit visited:text-hit"
href="https://surface-ui.org/"
rel="nofollow"
target="_blank"
>
Surface v0.9.x
</a>
+
<a
class="text-piccolo font-medium transition-colors duration-200 hover:text-hit visited:text-hit"
href="https://tailwindcss.com/"
rel="nofollow"
target="_blank"
>
Tailwind
</a>
+
<a
class="text-piccolo font-medium transition-colors duration-200 hover:text-hit visited:text-hit"
href="/"
>
Moon Surface Components
</a>
</p>
<p class="font-medium">NB! You need to be using the latest version of Tailwind CSS for the system to work.</p>
</PageSection>
<PageSection title="Installing elixir, erlang & node.js">
<p>We do use adsf here. Add .tool-versions file to the root of your projects:</p>
<IndentedCodeSnippet>{tool_versions_code()}</IndentedCodeSnippet>
<p>And run asdf install</p>
</PageSection>
<PageSection title="Project creating">
<p>
Create new Phoenix project (if needed) with LiveView enabled. Do not fetch dependencies.
</p>
<CodeSnippet>mix archive install hex phx_new
mix phx.new my_super_app --live
cd my_super_app
</CodeSnippet>
</PageSection>
<PageSection title="Installing dependencies">
<p>Add Moon Library to mix.exs deps section:</p>
<IndentedCodeSnippet>{github_code()}</IndentedCodeSnippet>
<p>and fetch dependencies.</p>
<CodeSnippet>mix deps.get</CodeSnippet>
<p>Make sure your phoenix* dependenciesversions do not conflict with the same in moon library.</p>
<p>Add surface & esbuild configurations to the project's confix.exs:</p>
<IndentedCodeSnippet>{config_exs_code()}</IndentedCodeSnippet>
<p>Compile project and dependencies</p>
<CodeSnippet>mix compile</CodeSnippet>
<p>Initialize Surface as described <a
href="https://surface-ui.org/getting_started#configuring-the-project-using-mix-surface.init"
class="text-piccolo font-medium transition-colors duration-200 hover:text-hit visited:text-hit"
target="_blank"
rel="noreferrer"
>here</a>. Please make sure that surface compiler is configured.</p>
<CodeSnippet>mix surface.init</CodeSnippet>
</PageSection>
<PageSection title="Moon CSS/JS assets adding">
<p>
Add two Plug.Static plugs to your endpoint.ex
</p>
<IndentedCodeSnippet>{plug_static_code()}</IndentedCodeSnippet>
<p>Import Moon Surface css and themes to project's assets/app.css:</p>
<IndentedCodeSnippet>{themes_import_code()}</IndentedCodeSnippet>
<p>Copy assets/package.json from deps/moon folder, or take two sections from there:</p>
<p class="pl-4">scripts:</p>
<IndentedCodeSnippet>{scripts_code()}</IndentedCodeSnippet>
<p class="pl-4">dependencies:</p>
<IndentedCodeSnippet>{dependencies_code()}</IndentedCodeSnippet>
<p>Create file assets/postcss.config.js</p>
<IndentedCodeSnippet>{postcss_config_code()}</IndentedCodeSnippet>
<p>Create file assets/tailwind.config.js</p>
<IndentedCodeSnippet>{tailwind_config_code()}</IndentedCodeSnippet>
<p>Edit your assets/js/app.js</p>
<IndentedCodeSnippet>{javascript_import_code()}</IndentedCodeSnippet>
<p>Add/modify assets-related aliases in your mix.exs file</p>
<IndentedCodeSnippet>{mix_exs_aliases()}</IndentedCodeSnippet>
<p>Setup assets</p>
<CodeSnippet>mix assets.setup</CodeSnippet>
<p class="overflow-x-auto">
Add theme-related class (find it in imported theme CSS file) and direction
related attribute to your root HTML component, e.g. body in
lib/my_super_app_web/components/layouts/root.html.heex
</p>
<IndentedCodeSnippet>{layout_modifications()}</IndentedCodeSnippet>
</PageSection>
<PageSection title="Run project">
<CodeSnippet>mix phx.server</CodeSnippet>
</PageSection>
"""
end
defp github_code() do
"""
# mix.exs
...
{:moon, git: "git@github.com:coingaming/moon.git"}
# or
{:moon, git: "https://github.com/coingaming/moon.git"}
"""
end
defp tool_versions_code() do
"""
# .tool-versions
erlang 25.2
elixir 1.14.1
nodejs 14.17.6
"""
end
defp config_exs_code() do
"""
# config/config.exs
...
import_config "../deps/moon/config/surface.exs"
config :surface, :components, [
# put here your app configs for surface
]
config :esbuild,
version: "0.16.4",
default: [
args: ~w(js/app.js --bundle --target=es2016 --outdir=../priv/static/assets),
cd: Path.expand("../assets", __DIR__),
env: %{"NODE_PATH" => "#{Path.expand("../deps", __DIR__)}:./node_modules"}
]
"""
end
defp plug_static_code() do
"""
# lib/my_super_app/web/endpoint.ex
...
plug(Plug.Static,
at: "/moon/assets",
from: :moon,
gzip: true,
only: ~w(assets themes images fonts svgs favicon.ico robots.txt),
cache_control_for_etags: "public, max-age=86400"
)
plug(Plug.Static,
at: "/moon_icons/",
from: :moon_icons,
gzip: true,
cache_control_for_etags: "public, max-age=86400"
)
...
"""
end
defp themes_import_code() do
"""
/* assets/css/app.css */
/*
this is a default theme - used on surface.moon.io
feel free to copy and modify it
*/
@import '../../deps/moon/priv/static/themes/moon.css';
/*
Not really required. Only few classes for components
are from there. All tailwind imports are already there,
so you can remove them from your own app.css
also can import _components.css instead
@import '../../deps/moon/assets/css/_components.css';
*/
@import '../../deps/moon/assets/css/app.css';
"""
end
defp scripts_code() do
"""
# assets.package.json
"scripts": {
"deploy": "NODE_ENV=production tailwindcss -i css/app.css -o ../priv/static/assets/app.css --postcss --minify",
"build": "tailwindcss -i css/app.css -o ../priv/static/assets/app.css --postcss",
"watch": "tailwindcss -i css/app.css -o ../priv/static/assets/app.css --postcss --watch"
},
"""
end
defp dependencies_code() do
"""
# assets.package.json
"dependencies": {
"@tailwindcss/forms": "^0.4.0",
"autoprefixer": "^10.4.2",
"postcss": "^8.4.5",
"postcss-import": "^14.0.2",
"tailwindcss": "^3.1.7",
"@popperjs/core": "^2.11.6"
},
"""
end
defp postcss_config_code() do
"""
// assets/postcss.config.js
module.exports = {
plugins: {
'postcss-import': {},
tailwindcss: {},
autoprefixer: {}
}
}
"""
end
defp tailwind_config_code() do
"""
// assets/tailwind.config.js
const tailwind_config = require("../deps/moon/assets/tailwind.config.js");
tailwind_config.content = [
"../lib/**/*.ex",
"../lib/**/*.heex",
"../lib/**/*.eex",
"./js/**/*.js",
"../deps/moon/lib/**/*.ex",
"../deps/moon/lib/**/*.heex",
"../deps/moon/lib/**/*.eex",
"../deps/moon/assets/js/**/*.js",
];
module.exports = tailwind_config;
"""
end
defp javascript_import_code() do
"""
// assets/js/app.js
...
import Hooks from "./_hooks"
// the next line should be added
import MoonHooks from "../../deps/moon/assets/js/hooks"
let csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute("content")
let liveSocket = new LiveSocket("/live", Socket, {params: {_csrf_token: csrfToken}, hooks: {
...MoonHooks, // here we do use imported hooks
...Hooks
}})
"""
end
defp mix_exs_aliases() do
"""
# mix.exs
...
defp aliases do
[
setup: ["deps.get", "assets.setup", "assets.build"],
"assets.setup": ["cmd --cd assets npm i", "esbuild.install --if-missing"],
"assets.build": ["cmd --cd assets npm run build", "esbuild default"],
"assets.deploy": [
"cmd --cd assets npm run deploy",
"NODE_ENV=production esbuild default --minify",
"phx.digest"
]
]
end
"""
end
defp layout_modifications() do
"""
<!-- lib/my_super_app_web/components/layouts/root.html.heex -->
<!-- class name should be taken from theme imported -->
...
<body class="... theme-moon-light" dir="ltr">
...
"""
end
end