예제 #1
0
def compile(args):
  """
  Description:
  ------------
  Compile a markdown file to a valid HTML page.

  Attributes:
  ----------
  :param args:
  """
  project_path = args.path or os.getcwd()
  sys.path.append(project_path)
  reports_path = utils.get_report_path(project_path)
  with open(os.path.join(reports_path, "%s.md" % args.name), "w") as md:
    md_dta = md.read()
  page = Report()
  page.py.markdown.resolve(md_dta)
  try:
    settings = __import__("ui_settings", fromlist=['object'])
    if not os.path.exists(settings.VIEWS_FOLDER):
      # If it is not an absolute path
      settings.VIEWS_FOLDER = os.path.join(reports_path, '..', '..', settings.VIEWS_FOLDER)
    output = page.outs.html_file(path=settings.VIEWS_FOLDER, name=args.name,
                                 options={"split": split_files, "css_route": '/css', "js_route": '/js'})
  except:
    output = page.outs.html_file(name=args.name, options={"split": False})
  print(output)
def create_page():
  page = Report()
  page.headers.dev()
  page.theme = ThemeBlue.BlueGrey()

  tickers_info = {
    'BAC': "Bank of America",
    'GS': "Goldman Sachs",
    'JPM': "JPMorgan Chase",
    'SAN.MC': "Banco Santander",
    'C.MX': "Citigroup Inc.",
    'HSBC-PA': "HSBC Holdings PLC"
  }
  title = page.ui.title("Flask - Advanced example 1")
  ticker = page.ui.fields.select(
    cpns.select.from_dict(tickers_info), label="Tickers", multiple=True, html_code="ticker_value")
  from_dt = page.ui.fields.date(value="M-1", html_code="from_date", label="From")
  to_dt = page.ui.fields.today(html_code="to_date", label="To")
  button = page.ui.buttons.colored("Click")
  text = page.ui.calendars.pill("1Y", group="chart_time")
  text_6m = page.ui.calendars.pill("6M", group="chart_time")
  text_2m = page.ui.calendars.pill("2M", group="chart_time")
  text_1m = page.ui.calendars.pill("1M", group="chart_time")
  sub_title = page.ui.title("Financial Sector 2020")
  buttons = page.ui.div([text, text_6m, text_2m, text_1m])
  chart = page.ui.charts.chartJs.line([], x_axis='Date')
  chart.options.scales.y_axis().ticks.toNumber()
  chart.options.scales.y_axis().add_label("Stock Price (USD)")
  chart.options.scales.x_axes().add_label("Date")
  chart.options.tooltips.callbacks.labelCurrency("$", digit=4)

  table = page.ui.tables.aggrid([])
  button.click([
    page.body.loading(),
    page.js.post("/test_event", components=[ticker, from_dt, to_dt]).onSuccess([
      chart.build(events.data["chart"]), table.js.setColumnDefs(events.data["columns"]),
      table.js.setRowData(events.data["table"]), page.body.loading(False)])])
  text.click([from_dt.input.build(text.dom.content), button.dom.events.trigger("click")])
  text_6m.click([from_dt.input.build(text_6m.dom.content), button.dom.events.trigger("click")])
  text_2m.click([from_dt.input.build(text_2m.dom.content), button.dom.events.trigger("click")])
  text_1m.click([from_dt.input.build(text_1m.dom.content), button.dom.events.trigger("click")])
  powered = page.ui.rich.powered()
  hr = page.ui.layouts.hr()
  box = page.ui.div()
  box.extend([title, powered, hr, ticker, from_dt, to_dt, button, sub_title, buttons, chart, table])
  box.style.doc()
  return page
예제 #3
0
def get_page(mod, template=False):
  """
  Description:
  ------------
  Get the page object from the imported module

  Attributes:
  ----------
  :param mod: Module. The Python imported module used to build the page
  :param template: Boolean
  """
  if hasattr(mod, 'get_page'):
    try:
      from epyk_studio.core.Page import Report

      page = Report()
      page.json_config_file = mod.__name__
    except:
      page = Report()
      page.json_config_file = mod.__name__
    if template and hasattr(mod, 'INPUTS'):
      page.inputs = {i: "%%(%s)s" % i for i in mod.INPUTS}
    mod.get_page(page)
    return page

  return mod.page
예제 #4
0
def index(to_json=False):
    rptObj = Report()
    rptObj.ui.title('Welcome To Epyk Engine',
                    (120, 'px')).css('text-align', 'center')
    # regNtwrk, edgesReg = EpykMain.getScripts()
    result = rptObj.outs._to_html_obj()
    result['header'] = rptObj.headers
    if to_json:
        return json.dumps(result)

    return HtmlTmplBase.STATIC_PAGE % result
예제 #5
0
def create_page():
    page = Report()
    page.headers.dev()
    page.theme = ThemeBlue.BlueGrey()

    tickers_info = {
        'BAC': "Bank of America",
        'GS': "Goldman Sachs",
        'JPM': "JPMorgan Chase",
        'SAN.MC': "Banco Santander",
        'C.MX': "Citigroup Inc.",
        'HSBC-PA': "HSBC Holdings PLC"
    }
    title = page.ui.title("Flask - Advanced example 2")
    ticker = page.ui.fields.select(cpns.select.from_dict(tickers_info),
                                   label="Tickers",
                                   multiple=True,
                                   html_code="ticker_value")
    from_dt = page.ui.fields.date(value="M-1",
                                  html_code="from_date",
                                  label="From")
    to_dt = page.ui.fields.today(html_code="to_date", label="To")
    button = page.ui.buttons.colored("Click")
    sub_title = page.ui.title("Financial Sector")
    pivot = page.ui.tables.pivots.plotly()
    button.click([
        page.body.loading(),
        page.js.post("/test_event",
                     components=[ticker, from_dt, to_dt]).onSuccess([
                         pivot.build(events.data["table"]),
                         page.body.loading(False)
                     ])
    ])
    powered = page.ui.rich.powered()
    hr = page.ui.layouts.hr()
    box = page.ui.div()
    box.extend(
        [title, powered, hr, ticker, from_dt, to_dt, button, sub_title, pivot])
    box.style.configs.doc()
    return page
예제 #6
0
def refresh(view_name):
    """
  Description:
  ------------
  This will transpile only the selected report.
  Transpilation will generate HTML content from the python code using Epyk framework

  Attributes:
  ----------
  :param view_name:
  """
    mod = __import__(view_name)
    page = Report()
    mod.get_page(page)
    print(page.outs.html_file(path='views', name=view_name))
예제 #7
0
async def dynamic(request: Request):
    """
  Description:
  ------------

  :param request:
  """
    from epyk.core.Page import Report

    page = Report()
    page.headers.dev()
    div = page.ui.div("Hellow World!")
    button = page.ui.button("Click Me")
    div.style.css.color = 'red'
    button.click([page.js.alert("Clicked")])
    return page.outs.html()
예제 #8
0
def home():
    """
  Report creation on the fly in Flask
  """
    from epyk.core.Page import Report

    rptObj = Report()
    list = rptObj.ui.list()
    for pyfile in os.listdir("reports"):
        list.add_item(
            rptObj.ui.link(pyfile, url="/report/%s" % pyfile[:-3]).css({
                "padding":
                '2px 0',
                'display':
                'block'
            }))
    return rptObj.outs.html()
예제 #9
0
def refresh(view_name):
  """
  Description:
  ------------
  This will transpile only the selected report.
  Transpilation will generate HTML content from the python code using Epyk framework

  Attributes:
  ----------
  :param view_name:
  """
  mod = __import__(view_name)
  if hasattr(mod, 'get_page'):
    page = Report()
    mod.get_page(page)
    page.outs.publish(server="vue", app_path=out_path, module="MyModule", selector='mymodule', target_folder=folder_target, auto_route=True)
  else:
    mod.page.outs.publish(server="vue", app_path=out_path, module="MyModule", selector='mymodule', target_folder=folder_target, auto_route=True)
예제 #10
0
from epyk.core.Page import Report

from epyk.core.data import events
from epyk.core.data import datamap

# Create a basic report object
page = Report()
page.headers.dev()

side = page.ui.navigation.side()

data = [{
    "id": 0,
    "group": 0,
    "content": 'item 0',
    "start": "2020-06-29",
    'type': 'point'
}, {
    "id": 0,
    "group": 0,
    "content": 'item 0',
    "start": "2020-06-17",
    "end": "2020-06-21"
}, {
    "id": 1,
    "group": 0,
    "content": 'item 1',
    "start": "2020-06-10",
    "end": "2020-06-20",
    'type': 'background'
}, {
예제 #11
0
from epyk.core.Page import Report
from epyk.core.css.themes import ThemeBlue


# Create a basic report object
page = Report()
page.headers.dev()
page.verbose = True # Display the system logs
page.theme = ThemeBlue.BlueGrey()
page.body.add_template(defined_style="doc")

# Create an input text field.
input = page.ui.input(placeholder="Write your text and press show")
number = page.ui.input(placeholder="Write a number and press show (Xs)")

# Define the popup object.
danger = page.ui.network.warning()
danger.options.time = None
danger.options.close = False

# Button to display the popup.
button1 = page.ui.button("Show")
button1.click([
  danger.build(input.dom.content)
])

# Button to display the popup with a timer.
button2 = page.ui.button("Show (Xs)")
danger.options.config_js({"time": number.dom.content})
print("ok")
예제 #12
0
def create_page():
    global DATA_CACHE

    page = Report()
    page.headers.dev()
    DATA_CACHE = page.py.requests.csv(data_urls.OWID_BIRTH_OUT_MARRIAGE,
                                      store_location=r"C:\tmps")
    data = pd.DataFrame(DATA_CACHE,
                        columns=[
                            'Entity', 'Year',
                            'Births outside of marriage (% of all births)'
                        ])
    data['Births outside of marriage (% of all births)'] = pd.to_numeric(
        data['Births outside of marriage (% of all births)'])
    mean_per_years = data.groupby([
        "Year"
    ])["Births outside of marriage (% of all births)"].mean().to_dict()

    template = page.body.add_template(defined_style="doc")
    template.style.css.background = page.theme.greys[0]
    filters, width = [], 80
    for k in DATA_CACHE[0].keys():
        name = NAMES[k]
        filters.append(
            page.ui.buttons.filter(name,
                                   is_number=True,
                                   width=(width, 'px'),
                                   html_code=name))

    gauge = page.ui.charts.apex.gauge(mean_per_years["2010"],
                                      "2010",
                                      height=100)
    gauge.colors(["red", "blue"])
    gauge2 = page.ui.charts.apex.gauge(mean_per_years["2011"],
                                       "2011",
                                       height=100)
    gauge2.colors(["blue"])
    gauge3 = page.ui.charts.apex.gauge(mean_per_years["2012"],
                                       "2012",
                                       height=100)
    gauge4 = page.ui.charts.apex.gauge(mean_per_years["2013"],
                                       "2013",
                                       height=100)
    gauge4.colors(["purple"])

    img = page.ui.img("https://img.stackshare.io/service/1002/tornado.png",
                      width=100,
                      height=100)
    img.style.css.fixed(top=(0, "px"), right=(24, "%"))

    page.ui.titles.head("Birth outside marriage trend")
    page.ui.titles.headline("Yearly KPI")
    page.ui.titles.underline(width=100)
    row = page.ui.row([gauge, gauge2, gauge3, gauge4])
    refresh = page.ui.buttons.colored("Update")
    refresh.style.css.margin_top = 10
    filters.append(refresh)
    row.options.responsive = False
    row.options.autoSize = False
    columns = page.ui.div(filters, width=(width, 'px'))
    table = page.ui.table(DATA_CACHE)
    table.style.css.width_calc(110)
    table.style.css.float = "right"
    table.config.paginationSize = 10
    page.ui.titles.headline("Raw data")
    page.ui.titles.underline(width=100)
    container = page.ui.div([columns, table])
    page.ui.texts.references.github(data_urls.OWID_BIRTH_OUT_MARRIAGE)
    container.style.css.display = "inline-block"

    refresh.click([
        page.js.post("/data", components=filters).onSuccess(
            [table.build(events.data["table"])]),
        gauge.build(page.js.math.random(1, 100)),
        gauge2.build(page.js.math.random(1, 100)),
        gauge3.build(page.js.math.random(1, 100)),
        gauge4.build(page.js.math.random(1, 100)),
    ])

    page.ui.layouts.hr()
    page.ui.rich.powered()

    return page
예제 #13
0
파일: test_pyk.py 프로젝트: ylwb/epyk-ui
from epyk.core.py import Pyk
from epyk.core.Page import Report
pyk_rpt = Pyk.requires(
    r'C:\Users\nelso\PycharmProjects\epyk-ui\epyk\tests\pyk_report.py')

rpt_obj = Report()

rpt_obj.ui.text("Here we have a text followed by a normal button")

rpt_obj.register(pyk_rpt.button)

rpt_obj.ui.text("Then we have an import button")

rpt_obj.register(pyk_rpt.imp)

print(rpt_obj.outs.html_file())
예제 #14
0
from epyk.core.Page import Report
from epyk.core.data import components
from epyk.core.css.themes import ThemeBlue
from epyk.core.data import events

# Create a basic report object
page = Report()
page.headers.dev()
template = page.body.add_template(defined_style="doc")
template.style.css.background = "white"

page.theme = ThemeBlue.BlueGrey()

categories = ["Shopping", "Meeting"]

page.ui.title("My todo list")
check_list = page.ui.lists.checks(width=(100, "%"))
check_list.options.delete = True
check_list.style.css.border = True
check_list.style.css.padding = 5

item = page.ui.inputs.left(placeholder="Add your item", width=(None, ''))
category = page.ui.select(components.select.from_list(categories))
button = page.ui.buttons.colored("Add")
page.css.customText('''.test:hover {color: green !IMPORTANT}''')

container = page.ui.div()
for c in [item, category, button]:
    container.add(page.ui.layouts.inline(c))
container[1].style.css.padding_left = 5
container[1].style.css.padding_right = 5
예제 #15
0
from epyk.core.Page import Report

from epyk.tests import data_urls

# Create a basic report object
page = Report()
page.headers.dev()

page.body.set_background()
page.imports().google_products(['tables'])

data_rest_1 = page.py.requests.csv(data_urls.DATA_EARTHQUAKE)

t1 = page.ui.tables.google.table(data_rest_1)
예제 #16
0
from epyk.core.Page import Report

rptObj = Report()
REPORT_OBJECT = rptObj

rptObj.title('Welcome to Epyk')
예제 #17
0
from epyk.core.Page import Report

import config

# Create a basic report object
rpt = Report()

# Create a list of badges
rpt.ui.lists.badges([{
    'label': 'Python',
    'value': 12
}, {
    'label': 'R',
    'value': 3
}])

# Create a bespoke list
p = rpt.ui.lists.points()
for d in [{
        'label': 'Python',
        'url': 'https://www.python.org/'
}, {
        'label': 'R'
}]:
    p.add_item(rpt.ui.link(d['label'], d.get('url')))

rpt.outs.browser.codepen(path=config.OUTPUT_PATHS)
예제 #18
0
from epyk.core.Page import Report

# Create a basic report object
page = Report()
page.headers.dev()

b = page.ui.navbar(title="Epyk")
b.move()

# b += page.ui.link("Test")

# Console component
c = page.ui.rich.console(
    "This is a log section for all the events in the different buttons *",
    options={"timestamp": True})

content = page.ui.contents(top=50)
#
t = page.ui.title("test", 1)
t = page.ui.title("test", 4)
t = page.ui.title("test", 3)
t = page.ui.title("test")

content.move()
page.ui.sliders.progressbar(40)
page.ui.slider([1, 2, 3, 4, 5, 6, 7])

page.ui.vignets.bubble({
    "value": 23.890,
    "title": "Title",
    'url': '#'
예제 #19
0
from epyk.core.Page import Report

import config

# Create an empty report in the webpage
rptObj = Report()

# Add another sparkline with as a line type
#rptObj.ui.charts.dc.line("line", [random.randint(-100, 100) for i in range(20)])

# Add a line return
rptObj.ui.layouts.new_line()
# Add another sparkline with as a bar type
rptObj.ui.charts.dc.line([{"name": "test", "count": 34}])

# Transpile to Javascriot and create a report in codepen (python will automatically open the default browser)
rptObj.outs.browser.codepen(path=config.OUTPUT_PATHS)
예제 #20
0
def create_page():
  page = Report()
  page.theme = ThemeBlue.BlueGrey()

  page.body.style.css.background = "linear-gradient(45deg, #00f 1%, #fff 1%, #fff 49%, #00f 49%, #00f 51%, #fff 51%, #fff 99%, #00f 99%)"
  page.body.style.css.background_size = "20px 20px"
  page.body.style.css.background_position = "0 0"
  page.body.style.css.text_align = "center"
  page.body.style.css.padding_top = 10
  page.body.style.css.padding_bottom = 10
  page.body.style.css.min_height = "100%"

  container = page.ui.div(width=(100, '%'), height=(100, '%'))
  container.style.css.background = "white"
  container.style.css.max_width = "600px"
  container.style.css.margin = "auto"
  container.style.css.padding = "0 10px"
  container.style.configs.shadow()

  title = page.ui.titles.head("Pseudorandom Number Generator in Python")
  title.style.css.display = "inline-block"
  container.add(title)

  sub_title0 = page.ui.titles.title("Mersenne Twister")
  paragraph = page.ui.panels.sliding('''
  The Mersenne Twister is a pseudorandom number generator (PRNG). It is by far the most widely used general-purpose PRNG.[1] Its name derives from the fact that its period length is chosen to be a Mersenne prime.
  
  The Mersenne Twister was developed in 1997 by Makoto Matsumoto [ja] (松本 眞) and Takuji Nishimura (西村 拓士).[2] It was designed specifically to rectify most of the flaws found in older PRNGs.
  
  The most commonly used version of the Mersenne Twister algorithm is based on the Mersenne prime 219937−1. The standard implementation of that, MT19937, uses a 32-bit word length. There is another implementation (with five variants[3]) that uses a 64-bit word length, MT19937-64; it generates a different sequence.
  ''', sub_title0)
  container.add(paragraph)
  container.add(page.ui.layouts.hr())

  sub_title = page.ui.titles.title("Parameters")
  container.add(sub_title)

  seed1 = page.ui.fields.input(label="seed", html_code="seed")
  container.add(seed1)

  n = page.ui.fields.input(label="Samples", html_code="n")
  container.add(n)

  valid = page.ui.buttons.colored("Run Python")
  valid_js = page.ui.buttons.colored("Run Javascript")
  valid_js.style.css.margin_left = 10
  container.add(page.ui.div([valid, valid_js]))
  container.add(page.ui.layouts.hr())
  py_title = page.ui.titles.section("Python Results")
  container.add(py_title)

  line = page.ui.charts.chartJs.line([], y_columns=["y"], x_axis=["x"], height=160)
  bar = page.ui.charts.chartJs.bar([], y_columns=["c"], x_axis=["b"], height=160)
  container.add(page.ui.row([line, bar]).css({"background": 'white'}))

  js_title = page.ui.titles.section("Javascript Results")
  container.add(js_title)
  js_line = page.ui.charts.chartJs.line([], y_columns=["y"], x_axis=["x"], height=160)
  container.add(js_line)

  valid.click([
    page.js.objects.time("window.time_py"),
    page.js.post("/compute", [seed1, n]).onSuccess([
      line.build(events.data["line"]),
      bar.build(events.data["bar"]),
      page.js.console.perf("window.time_py", label="Python Processing: "),
      page.js.print("Python computed", 2000, cssAttrs={"bottom": "10px", 'right': "10px", 'position': 'fixed'})
    ]),
  ])

  valid_js.click([
    page.js.objects.list.new([], "js_data"),
    page.js.objects.time("window.time_py"),
    expr.for_(n, [
      page.js.objects.new({}, "row"),
      page.js.objects.get("row").setattr("y", page.js.math.random()).r,
      page.js.objects.get("row").setattr("x", page.js.objects.get("i")).r,
      page.js.objects.list.get("js_data").push(page.js.objects.get("row"))
    ]),
    js_line.build(page.js.objects.list.get("js_data")),
    page.js.console.perf("window.time_py", label="Javascript Processing: "),
    page.js.print("Javascript computed", 2000, cssAttrs={"bottom": "10px", 'right': "10px", 'position': 'fixed'})
  ])
  return page
예제 #21
0
from epyk.core.Page import Report

page = Report()
page.headers.dev()

page.verbose = True

path = page.ui.input(placeholder="Set your path here")

qrcode = page.ui.qrcode()

# Change the qrcode options
qrcode.options.colorDark = "orange"
qrcode.options.size = 50

path.enter([qrcode.build(path.dom.content)])

button = page.ui.button("Google QRCode")
button.click([qrcode.js.makeCode("https://www.google.com/")])

button = page.ui.button("Clear")
button.click([qrcode.js.clear()])
예제 #22
0
def create_page():
    page = Report()
    page.headers.dev()
    page.body.add_template(defined_style="doc")
    page.theme = ThemeBlue.BlueGrey()

    title = page.ui.title("Python")
    page.ui.layouts.underline()
    title.options.editable = True

    sub_title = page.ui.titles.subtitle("The Python Community")
    page.ui.menu(sub_title, post="/bar")

    p = page.ui.paragraph('''
  The [Python Software Foundation](https://www.python.org/psf/) and the global Python community welcome and encourage 
  participation by everyone. Our community is based on mutual respect, tolerance, and encouragement, and we are working 
  to help each other live up to these principles.
  ''',
                          options={"markdown": True})
    page.ui.menu(p)

    table = page.ui.tables.tabulator(mocks.languages)
    page.ui.tables.menu(table, post="/table")

    page.ui.titles.subtitle("Zoom on a package")
    pkg_name = page.ui.fields.input("epyk",
                                    label="Package name",
                                    html_code="package")

    bar_chart = page.ui.charts.chartJs.bar(y_columns=["download"],
                                           x_axis="name")
    menu_bar = page.ui.charts.menu(bar_chart,
                                   post={
                                       "url": "/chart",
                                       "components": [pkg_name]
                                   })

    pie_chart = page.ui.charts.chartJs.pie(y_columns=["value"], x_axis="type")
    menu_pie = page.ui.charts.menu(pie_chart,
                                   post={
                                       "url": "/pie",
                                       "components": [pkg_name]
                                   })

    row = page.ui.row([[menu_bar, bar_chart], [menu_pie, pie_chart]],
                      position="top")
    row.options.responsive = False
    row.options.autoSize = False

    sub_title2 = page.ui.titles.subtitle("Conferences and Workshops")
    sub_title2.options.editable = True
    p2 = page.ui.paragraph('''
  There are a number of conferences held each year where the Python community gathers together (listed alphabetically):
  ''',
                           options={"markdown": True})
    page.ui.menu(p2,
                 save_funcs=[page.js.alert(p2.dom.content)],
                 update_funcs=[p2.build("Updated paragraph")],
                 profile=True)

    sq = page.ui.lists.squares(["DjangoCon Europe"])
    page.ui.lists.menu(sq)

    page.ui.layouts.hr().css({"margin-top": '20px'})
    page.ui.titles.subtitle("Report powered by")
    page.ui.rich.powered()

    page.ui.icons.fixed("fas fa-file-download").click([
        std.var("backboneData", global_scope=True).addComponent(sub_title),
        page.js.clipboard(
            std.var("backboneData", global_scope=True).stringify()),
        page.js.window.download(
            page.js.window.btoa(
                std.var("backboneData", global_scope=True).stringify()),
            "configuration.json")
        # page.js.location.download(page.js.location.getUrlFromData(std.var("backboneData", global_scope=True).stringify()))
    ])

    page.body.onReady([
        std.var("backboneData", value={}, global_scope=True),
    ])
    return page
예제 #23
0
""" """

import collections

from epyk.core.js import Imports
from epyk.core.Page import Report

#Imports.installed_packages()


report = Report()
imports = Imports.ImportManager(report=report)

modules = collections.OrderedDict()
print(imports.getModules(modules, 'c3'))

i = imports.cleanImports(['c3'], Imports.JS_IMPORTS)
print(i)

i = imports.cssResolve(['c3'])
print(i)

f = imports.getFiles(['c3'], ['c3'])
print(f['css'][0]['file']['script'])
#

p = imports.getPackage('jqueryui', static_path=r"..\outs")
p = imports.getFullPackage('font-awesome', static_path=r"..\outs")
예제 #24
0
from epyk.core.Page import Report
from epyk.core.css.themes import ThemeDark

import config

# Create a basic report object
page = Report()
page.headers.dev()

# Change the theme of the report
page.theme = ThemeDark.Dark()

# Change the first color of this theme (overrride)
page.theme.colors[-1] = "yellow"

# Add icon
# The path for the icon is defind in config
page.ui.images.circular("epykIcon.PNG", path=config.IMG_PATH)

page.ui.layouts.new_line()

# Avatar with a status
page.ui.images.avatar("Epyk", status='out')

# Avatar with an image
page.ui.images.avatar(image="epykIcon.PNG", path=config.IMG_PATH, status=False)

# Add badges
page.ui.layouts.new_line()
page.ui.images.badge("Test badge", "Label", icon="fas fa-align-center")