Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Websites UFRPE
django-dsgov
Commits
35c987a5
Commit
35c987a5
authored
Jul 29, 2025
by
Eduardo Silva
Browse files
finalizacao do menu base e ajustes pontuais no header
#6
parent
c4482742
Changes
4
Hide whitespace changes
Inline
Side-by-side
dsgov/templatetags/br_header_tags.py
View file @
35c987a5
...
@@ -299,79 +299,136 @@ create_dropdown_tag('br_header_functions', 'header-functions', 'fa-th')
...
@@ -299,79 +299,136 @@ create_dropdown_tag('br_header_functions', 'header-functions', 'fa-th')
@
register
.
tag
(
name
=
'br_header_link_item'
)
@
register
.
tag
(
name
=
'br_header_link_item'
)
def
do_br_header_link_item
(
parser
,
token
):
def
do_br_header_link_item
(
parser
,
token
):
bits
=
token
.
split_contents
()
bits
=
token
.
split_contents
()
kwargs
=
{
'href'
:
None
,
'extra_classes'
:
None
,
'style'
:
None
}
kwargs
=
{
'href_str'
:
None
,
'extra_classes_expr'
:
None
,
'style_expr'
:
None
}
for
bit
in
bits
[
1
:]:
for
bit
in
bits
[
1
:]:
if
'='
in
bit
:
key
,
value
=
bit
.
split
(
'='
,
1
)
key
,
value
=
bit
.
split
(
'='
,
1
)
if
key
==
'href'
:
if
key
in
kwargs
:
kwargs
[
'href_str'
]
=
value
kwargs
[
key
]
=
value
elif
key
==
'extra_classes'
:
kwargs
[
'extra_classes_expr'
]
=
parser
.
compile_filter
(
value
)
elif
key
==
'style'
:
kwargs
[
'style_expr'
]
=
parser
.
compile_filter
(
value
)
nodelist
=
parser
.
parse
((
'end_br_header_link_item'
,))
nodelist
=
parser
.
parse
((
'end_br_header_link_item'
,))
parser
.
delete_first_token
()
parser
.
delete_first_token
()
return
BRHeaderLinkItemNode
(
nodelist
,
**
kwargs
)
return
BRHeaderLinkItemNode
(
nodelist
,
**
kwargs
)
class
BRHeaderLinkItemNode
(
template
.
Node
):
class
BRHeaderLinkItemNode
(
template
.
Node
):
def
__init__
(
self
,
nodelist
,
href
,
extra_classes
,
style
):
def
__init__
(
self
,
nodelist
,
href
_str
,
extra_classes
_expr
,
style
_expr
):
self
.
nodelist
=
nodelist
self
.
nodelist
=
nodelist
self
.
href
=
href
self
.
href
_str
=
href
_str
self
.
extra_classes
=
extra_classes
self
.
extra_classes
_expr
=
extra_classes
_expr
self
.
style
=
style
self
.
style
_expr
=
style
_expr
def
render
(
self
,
context
):
def
render
(
self
,
context
):
from
django.template
import
Variable
,
VariableDoesNotExist
content
=
self
.
nodelist
.
render
(
context
)
content
=
self
.
nodelist
.
render
(
context
)
resolved_href
=
resolve_variable
(
self
.
href
,
context
)
or
'#'
resolved_href
=
"#"
extra_classes_str
=
f
"
{
resolve_variable
(
self
.
extra_classes
,
context
)
}
"
if
self
.
extra_classes
else
""
style_attr
=
''
if
self
.
href_str
:
if
self
.
style
:
parts
=
self
.
href_str
.
split
(
'|default:'
)
resolved_style
=
resolve_variable
(
self
.
style
,
context
)
primary_expr_str
=
parts
[
0
].
strip
()
style_attr
=
format_html
(
' style="{}"'
,
resolved_style
)
secondary_expr_str
=
parts
[
1
].
strip
()
if
len
(
parts
)
>
1
else
None
try
:
primary_value
=
Variable
(
primary_expr_str
).
resolve
(
context
)
if
primary_value
:
resolved_href
=
primary_value
except
VariableDoesNotExist
:
pass
if
resolved_href
==
"#"
and
secondary_expr_str
:
try
:
base_obj
=
Variable
(
secondary_expr_str
.
split
(
'.'
)[
0
]).
resolve
(
context
)
if
base_obj
and
hasattr
(
base_obj
,
'url'
):
url
=
getattr
(
base_obj
,
'url'
)
if
url
:
resolved_href
=
url
except
VariableDoesNotExist
:
pass
except
Exception
:
pass
# Resolve classes e estilos
extra_classes
=
self
.
extra_classes_expr
.
resolve
(
context
)
if
self
.
extra_classes_expr
else
""
style
=
self
.
style_expr
.
resolve
(
context
)
if
self
.
style_expr
else
""
style_attr
=
format_html
(
' style="{}"'
,
style
)
if
style
else
""
return
format_html
(
return
format_html
(
'<a class="br-item{}" href="{}"{}>{}</a>'
,
'<a class="br-item {}" href="{}"{}>{}</a>'
,
extra_classes_str
,
resolved_href
,
style_attr
,
mark_safe
(
content
)
extra_classes
,
resolved_href
,
style_attr
,
mark_safe
(
content
)
)
)
@
register
.
tag
(
name
=
'br_function_item'
)
@
register
.
tag
(
name
=
'br_function_item'
)
def
do_br_function_item
(
parser
,
token
):
def
do_br_function_item
(
parser
,
token
):
bits
=
token
.
split_contents
()
bits
=
token
.
split_contents
()
kwargs
=
{
'icon_class'
:
None
,
'label'
:
None
,
'aria_label'
:
None
,
'extra_classes'
:
None
,
'icon_style'
:
None
,
'label_style'
:
None
}
kwargs
=
{
'icon_class'
:
None
,
'label'
:
None
,
'aria_label'
:
None
,
'extra_classes'
:
None
,
'icon_style'
:
None
,
'label_style'
:
None
,
'href'
:
None
}
for
bit
in
bits
[
1
:]:
for
bit
in
bits
[
1
:]:
if
'='
in
bit
:
if
'='
in
bit
:
key
,
value
=
bit
.
split
(
'='
,
1
)
key
,
value
=
bit
.
split
(
'='
,
1
)
if
key
in
kwargs
:
if
key
in
kwargs
:
kwargs
[
key
]
=
value
kwargs
[
key
]
=
parser
.
compile_filter
(
value
)
return
BRFunctionItemNode
(
**
kwargs
)
return
BRFunctionItemNode
(
**
kwargs
)
class
BRFunctionItemNode
(
template
.
Node
):
class
BRFunctionItemNode
(
template
.
Node
):
def
__init__
(
self
,
icon_class
,
label
,
aria_label
,
extra_classes
,
icon_style
,
label_style
):
def
__init__
(
self
,
icon_class
,
label
,
aria_label
,
extra_classes
,
icon_style
,
label_style
,
href
):
self
.
icon_class
=
icon_class
self
.
icon_class
=
icon_class
self
.
label
=
label
self
.
label
=
label
self
.
aria_label
=
aria_label
self
.
aria_label
=
aria_label
self
.
extra_classes
=
extra_classes
self
.
extra_classes
=
extra_classes
self
.
icon_style
=
icon_style
self
.
icon_style
=
icon_style
self
.
label_style
=
label_style
self
.
label_style
=
label_style
self
.
href
=
href
def
render
(
self
,
context
):
def
render
(
self
,
context
):
resolved_label
=
resolve_variable
(
self
.
label
,
context
)
def
resolve_filter
(
f
):
resolved_aria_label
=
resolve_variable
(
self
.
aria_label
,
context
)
or
resolved_label
return
f
.
resolve
(
context
)
if
f
else
""
extra_classes_str
=
f
"
{
resolve_variable
(
self
.
extra_classes
,
context
)
}
"
if
self
.
extra_classes
else
""
icon_style_attr
=
''
if
self
.
icon_style
:
resolved_style
=
resolve_variable
(
self
.
icon_style
,
context
)
icon_style_attr
=
format_html
(
' style="{}"'
,
resolved_style
)
label_style_attr
=
''
if
self
.
label_style
:
resolved_style
=
resolve_variable
(
self
.
label_style
,
context
)
label_style_attr
=
format_html
(
' style="{}"'
,
resolved_style
)
return
format_html
(
resolved_label
=
resolve_filter
(
self
.
label
)
'''<div class="br-item{}">
resolved_aria_label
=
resolve_filter
(
self
.
aria_label
)
or
resolved_label
<button class="br-button circle small" type="button" aria-label="{}">
resolved_icon_class
=
resolve_filter
(
self
.
icon_class
)
<i class="fas {}" aria-hidden="true"{}></i><span class="text"{}>{}</span>
resolved_href
=
resolve_filter
(
self
.
href
)
</button>
</div>'''
,
extra_classes_str
=
resolve_filter
(
self
.
extra_classes
)
extra_classes_str
,
resolved_aria_label
,
resolve_variable
(
self
.
icon_class
,
context
),
icon_style_attr
=
format_html
(
' style="{}"'
,
resolve_filter
(
self
.
icon_style
))
if
self
.
icon_style
else
""
icon_style_attr
,
label_style_attr
,
resolved_label
label_style_attr
=
format_html
(
' style="{}"'
,
resolve_filter
(
self
.
label_style
))
if
self
.
label_style
else
""
inner_content
=
format_html
(
'<i class="fas {}" aria-hidden="true"{}></i><span class="text"{}>{}</span>'
,
resolved_icon_class
,
icon_style_attr
,
label_style_attr
,
resolved_label
)
)
if
resolved_href
:
return
format_html
(
'''<div class="br-item {}">
<a class="br-button circle small" href="{}" aria-label="{}">
{}
</a>
</div>'''
,
extra_classes_str
,
resolved_href
,
resolved_aria_label
,
inner_content
)
else
:
return
format_html
(
'''<div class="br-item {}">
<button class="br-button circle small" type="button" aria-label="{}">
{}
</button>
</div>'''
,
extra_classes_str
,
resolved_aria_label
,
inner_content
)
# =========================
# =========================
# BLOCO: BUSCA E LOGIN
# BLOCO: BUSCA E LOGIN
# =========================
# =========================
...
...
dsgov/templatetags/br_menu_tags.py
View file @
35c987a5
...
@@ -172,11 +172,11 @@ def do_br_menu_item(parser, token):
...
@@ -172,11 +172,11 @@ def do_br_menu_item(parser, token):
kwargs
=
{}
kwargs
=
{}
for
bit
in
bits
[
1
:]:
for
bit
in
bits
[
1
:]:
try
:
if
'='
in
bit
:
name
,
value
=
bit
.
split
(
'='
)
name
,
value
=
bit
.
split
(
'='
,
1
)
kwargs
[
name
]
=
value
.
strip
(
'"
\'
'
)
kwargs
[
name
]
=
value
.
strip
(
'"
\'
'
)
e
xcept
ValueError
:
e
lse
:
raise
template
.
TemplateSyntaxError
(
f
"Argumento inválido em
{
tag_name
}
:
{
bit
}
"
)
raise
template
.
TemplateSyntaxError
(
f
"Argumento inválido em
'
{
tag_name
}
'
:
'
{
bit
}
'. Esperado 'nome=valor'.
"
)
href
=
kwargs
.
get
(
'href'
)
href
=
kwargs
.
get
(
'href'
)
icon
=
kwargs
.
get
(
'icone'
,
''
)
icon
=
kwargs
.
get
(
'icone'
,
''
)
...
@@ -196,17 +196,17 @@ class BRMenuItemNode(template.Node):
...
@@ -196,17 +196,17 @@ class BRMenuItemNode(template.Node):
self
.
icon
=
icon
self
.
icon
=
icon
def
render
(
self
,
context
):
def
render
(
self
,
context
):
# Resolve `href`
try
:
try
:
href
=
template
.
Variable
(
self
.
href
).
resolve
(
context
)
href
=
template
.
Variable
(
self
.
href
).
resolve
(
context
)
except
template
.
VariableDoesNotExist
:
except
template
.
VariableDoesNotExist
:
href
=
self
.
href
href
=
self
.
href
# Resolve `icon`
icon
=
self
.
icon
try
:
if
icon
:
icon
=
template
.
Variable
(
self
.
icon
).
resolve
(
context
)
try
:
except
template
.
VariableDoesNotExist
:
icon
=
template
.
Variable
(
icon
).
resolve
(
context
)
icon
=
self
.
icon
except
template
.
VariableDoesNotExist
:
pass
content
=
self
.
nodelist
.
render
(
context
)
content
=
self
.
nodelist
.
render
(
context
)
...
@@ -218,7 +218,7 @@ class BRMenuItemNode(template.Node):
...
@@ -218,7 +218,7 @@ class BRMenuItemNode(template.Node):
)
)
return
format_html
(
return
format_html
(
'<a class="menu-item" href="{}" role="treeitem">{}<span class="content">{}</span></a>'
,
'<a class="menu-item
divider
" href="{}" role="treeitem">{}<span class="content">{}</span></a>'
,
href
,
href
,
mark_safe
(
icon_html
),
mark_safe
(
icon_html
),
content
content
...
@@ -348,6 +348,34 @@ class BRMenuLinksNode(template.Node):
...
@@ -348,6 +348,34 @@ class BRMenuLinksNode(template.Node):
content
=
self
.
nodelist
.
render
(
context
).
strip
()
content
=
self
.
nodelist
.
render
(
context
).
strip
()
return
format_html
(
'<div class="menu-links">{}</div>'
,
mark_safe
(
content
))
return
format_html
(
'<div class="menu-links">{}</div>'
,
mark_safe
(
content
))
@
register
.
tag
(
name
=
'br_menu_list'
)
def
do_br_menu_list
(
parser
,
token
):
nodelist
=
parser
.
parse
((
'end_br_menu_list'
,))
parser
.
delete_first_token
()
return
BRMenuListNode
(
nodelist
)
class
BRMenuListNode
(
template
.
Node
):
def
__init__
(
self
,
nodelist
):
self
.
nodelist
=
nodelist
def
render
(
self
,
context
):
content
=
self
.
nodelist
.
render
(
context
)
return
format_html
(
'<ul>{}</ul>'
,
mark_safe
(
content
))
@
register
.
tag
(
name
=
'br_menu_list_item'
)
def
do_br_menu_list_item
(
parser
,
token
):
nodelist
=
parser
.
parse
((
'end_br_menu_list_item'
,))
parser
.
delete_first_token
()
return
BRMenuListItemNode
(
nodelist
)
class
BRMenuListItemNode
(
template
.
Node
):
def
__init__
(
self
,
nodelist
):
self
.
nodelist
=
nodelist
def
render
(
self
,
context
):
content
=
self
.
nodelist
.
render
(
context
)
return
format_html
(
'<li>{}</li>'
,
mark_safe
(
content
))
@
register
.
tag
(
name
=
"br_menu_link"
)
@
register
.
tag
(
name
=
"br_menu_link"
)
def
do_br_menu_link
(
parser
,
token
):
def
do_br_menu_link
(
parser
,
token
):
bits
=
token
.
split_contents
()
bits
=
token
.
split_contents
()
...
...
tests/django_dsgov_test1/templates/examples_headers.html
View file @
35c987a5
...
@@ -33,16 +33,17 @@
...
@@ -33,16 +33,17 @@
{% br_header_links %}
{% br_header_links %}
{% br_list %}
{% br_list %}
{% br_list_header %}Acesso Rápido{% end_br_list_header %}
{% br_list_header %}Acesso Rápido{% end_br_list_header %}
{% br_header_link_item href="
#
" %}Link de acesso 1{% end_br_header_link_item %}
{% br_header_link_item href="
https://www.google.com/
" %}Link de acesso 1{% end_br_header_link_item %}
{% br_header_link_item href="#" %}Link de acesso 2{% end_br_header_link_item %}
{% br_header_link_item href="#" %}Link de acesso 2{% end_br_header_link_item %}
{% br_header_link_item href="#" %}Link de acesso 3{% end_br_header_link_item %}
{% br_header_link_item href="#" %}Link de acesso 3{% end_br_header_link_item %}
{% br_header_link_item href="#" %}Link de acesso 4{% end_br_header_link_item %}
{% end_br_list %}
{% end_br_list %}
{% end_br_header_links %}
{% end_br_header_links %}
{% br_header_functions %}
{% br_header_functions %}
{% br_list %}
{% br_list %}
{% br_list_header %}Funcionalidades do Sistema{% end_br_list_header %}
{% br_list_header %}Funcionalidades do Sistema{% end_br_list_header %}
{% br_function_item icon_class="fa-chart-bar" label="Funcionalidade 1" %}
{% br_function_item
href="https://www.google.com/"
icon_class="fa-chart-bar" label="Funcionalidade 1" %}
{% br_function_item icon_class="fa-headset" label="Funcionalidade 2" %}
{% br_function_item icon_class="fa-headset" label="Funcionalidade 2" %}
{% br_function_item icon_class="fa-comment" label="Funcionalidade 3" %}
{% br_function_item icon_class="fa-comment" label="Funcionalidade 3" %}
{% br_function_item icon_class="fa-adjust" label="Funcionalidade 4" %}
{% br_function_item icon_class="fa-adjust" label="Funcionalidade 4" %}
...
...
tests/django_dsgov_test1/templates/examples_menu.html
View file @
35c987a5
...
@@ -17,19 +17,125 @@
...
@@ -17,19 +17,125 @@
{% end_br_menu_header %}
{% end_br_menu_header %}
{% br_menu_body %}
{% br_menu_body %}
{% br_menu_folder %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-bell" %}Camada 1{% end_br_menu_item %}
{# === MENU-FOLDER 1 === #}
{% br_menu_item href="javascript: void(0)" icone="fas fa-bell" %}Camada 2{% end_br_menu_item %}
{% br_menu_folder %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-bell" %}Camada 3{% end_br_menu_item %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-bell" %}Camada 1{% end_br_menu_item %}
{% end_br_menu_folder %}
{% br_menu_list %}
{% br_menu_divider_item href="javascript: void(0)" icone="fas fa-bell" %}
{% br_menu_list_item %}
Item de Camada 1
{% br_menu_item href="javascript: void(0)" icone="fas fa-heart" %}Camada 2{% end_br_menu_item %}
{% end_br_menu_divider_item %}
{% end_br_menu_list_item %}
{% br_menu_list_item %}
{% br_menu_divider_item href="javascript: void(0)" icone="fas fa-bell" %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-address-book" %}Camada 2{% end_br_menu_item %}
Item de Camada 1
{% br_menu_list %}
{% end_br_menu_divider_item %}
{% br_menu_list_item %}
{% end_br_menu_body %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-book" %}Camada 3{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-tree" %}Camada 3{% end_br_menu_item %}
{% br_menu_list %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" %}Camada 4{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" %}Camada 4{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" %}Camada 4{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% end_br_menu_list %}
{% end_br_menu_list_item %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-moon" %}Camada 3{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% end_br_menu_list %}
{% end_br_menu_list_item %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-archive" %}Camada 2{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% end_br_menu_list %}
{% end_br_menu_folder %}
{# === MENU-FOLDER 2 === #}
{% br_menu_folder %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-bell" %}Camada 1{% end_br_menu_item %}
{% br_menu_list %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-heart" %}Camada 2{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-address-book" %}Camada 2{% end_br_menu_item %}
{% br_menu_list %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-book" %}Camada 3{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-tree" %}Camada 3{% end_br_menu_item %}
{% br_menu_list %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" %}Camada 4{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" %}Camada 4{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" %}Camada 4{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% end_br_menu_list %}
{% end_br_menu_list_item %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-moon" %}Camada 3{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% end_br_menu_list %}
{% end_br_menu_list_item %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-archive" %}Camada 2{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% end_br_menu_list %}
{% end_br_menu_folder %}
{# === MENU-FOLDER 3 === #}
{% br_menu_folder %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-bell" %}Camada 1{% end_br_menu_item %}
{% br_menu_list %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-heart" %}Camada 2{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-address-book" %}Camada 2{% end_br_menu_item %}
{% br_menu_list %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-book" %}Camada 3{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-tree" %}Camada 3{% end_br_menu_item %}
{% br_menu_list %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" %}Camada 4{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" %}Camada 4{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" %}Camada 4{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% end_br_menu_list %}
{% end_br_menu_list_item %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-moon" %}Camada 3{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% end_br_menu_list %}
{% end_br_menu_list_item %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-archive" %}Camada 2{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% end_br_menu_list %}
{% end_br_menu_folder %}
{# === ITENS DE CAMADA 1 COMO DIVISOR #}
{% br_menu_item href="javascript: void(0)" icone="fas fa-bell" class="divider" %}Item de Camada 1{% end_br_menu_item %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-bell" class="divider" %}Item de Camada 1{% end_br_menu_item %}
{% end_br_menu_body %}
{% br_menu_footer %}
{% br_menu_footer %}
{% br_menu_footer_logos %}
{% br_menu_footer_logos %}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment