module Plutonium
module UI
module Layout
class Base < Plutonium::UI::Component::Base
include Plutonium::Helpers::AssetsHelper
include Phlex::Rails::Helpers::CSPMetaTag
include Phlex::Rails::Helpers::CSRFMetaTags
include Phlex::Rails::Helpers::FaviconLinkTag
include Phlex::Rails::Helpers::StylesheetLinkTag
include Phlex::Rails::Helpers::JavascriptIncludeTag
def view_template(&)
doctype
html(**html_attributes) {
render_head
render_body(&)
}
end
private
def lang = nil
def page_title = helpers.controller.instance_variable_get(:@page_title)
def html_attributes = {lang:, data_controller: "resource-layout color-mode"}
def body_attributes = {class: "antialiased min-h-screen bg-gray-50 dark:bg-gray-900"}
def main_attributes = {class: "p-4 min-h-screen"}
def render_head
head {
render_title
render_metatags
render_security_metatags
render_turbo_metatags
render_font_tags
render_favicon_tag
render_assets_tags
# plain assets
# plain head
# '
#
#
#
}
end
def render_body(&)
body(**body_attributes) {
render_before_main
render_main(&)
render_after_main
}
end
def render_before_main
end
def render_main(&)
main(**main_attributes) {
render_flash
render_before_content
render_content(&)
render_after_content
}
end
def render_flash
render "flash"
end
def render_before_content
end
def render_after_main
end
def render_content(&)
yield if block_given?
end
def render_after_content
end
def render_title
title { page_title } if page_title
end
def render_metatags
meta(charset: "utf-8")
meta(name: "viewport", content: "width=device-width,initial-scale=1")
end
def render_security_metatags
csrf_meta_tags
csp_meta_tag
end
def render_turbo_metatags
meta(name: "turbo-cache-control", content: "no-cache")
meta(name: "turbo-refresh-method", content: "morph")
meta(name: "turbo-refresh-scroll", content: "preserve")
end
def render_font_tags
link(rel: "preconnect", href: "https://fonts.googleapis.com")
link(rel: "preconnect", href: "https://fonts.gstatic.com", crossorigin: true)
link(href: "https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,100;0,300;0,400;0,700;0,900;1,100;1,300;1,400;1,700;1,900&display=swap", rel: "stylesheet")
end
def render_favicon_tag
favicon_link_tag(Plutonium.configuration.assets.favicon) if Plutonium.configuration.assets.favicon
end
def render_assets_tags
render_asset_style_tags
render_asset_scripts_tags
end
def render_asset_style_tags
url = resource_asset_url_for(:css, resource_stylesheet_asset)
stylesheet_link_tag(url, "data-turbo-track": "reload")
end
def render_asset_scripts_tags
url = resource_asset_url_for(:js, resource_script_asset)
javascript_include_tag(url, "data-turbo-track": "reload", type: "module")
end
end
end
end
end