Skip to content

luckyframework/lucky_hxml

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

LuckyHXML

Similar to LuckyHTML, but for Hyperview.

Installation

  1. Add the dependency to your shard.yml:
dependencies:
  lucky_hxml:
    github: luckyframework/lucky_hxml
    version: ~> 0.1
  1. Run shards install

Add to Lucky

  1. Add the dependency to src/shards.cr:
require "lucky"
require "avram/lucky"
# ...
require "lucky_hxml"
  1. Add a src/components/base_hxml_component.cr file:
abstract class BaseHXMLComponent < LuckyHXML::Component
end

Synonymous with Lucky Components

  1. Add a src/screens/main_screen.cr file:
abstract class MainScreen < LuckyHXML::Screen
end

Synonymous with Lucky HTML

  1. Include in BrowserAction (or any Lucky::Action) and modify accepted_formats:
abstract class BrowserAction < Lucky::Action
  # ...
  include LuckyHXML::Renderable

  accepted_formats [:html, :json, :xml], default: :html
  #                               ^^^^
end

Usage

Create a Screen

class HomeScreen < MainScreen
  def render
    doc do
      screen do
        styles do
          style id: "body", flex: "1", backgroundColor: "white"
        end
        body style: "body" do
          view do
            text "Welcome!"
          end
        end
      end
    end
  end
end

Create a Component

class PhoneBehaviorComponent < BaseHXMLComponent
  needs trigger : String = "press"
  needs phone_number : String

  def render
    behavior(
      "xmlns:comms": "https://hypermedia.systems/hyperview/communications",
      trigger: trigger,
      action: "open-phone",
      "comms:phone-number": phone_number
    )
  end
end

Create Custom Elements

You can create custom elements and attributes with element & attribute methods respectively.

class SwipeRowComponent < BaseHXMLComponent
  def render(&)
    element "swipe:row" do
      swipe_namespace
      yield
    end
  end

  private def swipe_namespace : Nil
    attribute "xmlns:swipe", "https://hypermedia.systems/hyperview/swipeable"
  end
end

Mount a Component

mount PhoneBehaviorComponent, phone_number: "123-456-7890"

With a block:

mount SwipeRowComponent do
  # ...
end

Render a Screen

class Home::Index < BrowserAction
  get "/" do
    # Same as `html` macro
    hxml HomeScreen
  end
end

Render a Component

class Home::Index < BrowserAction
  get "/" do
    # Same as `component` method
    hxml_component PhoneBehaviorComponent, phone_number: "111-222-3333"
  end
end