Merge pull request #122 from YunoHost/theming-reloaded
Theming reloaded
1
.gitignore
vendored
|
@ -1 +0,0 @@
|
|||
*.swp
|
53
access.lua
|
@ -150,13 +150,24 @@ then
|
|||
and (not ngx.var.http_referer
|
||||
or hlp.string.starts(ngx.var.http_referer, conf.portal_url)))
|
||||
then
|
||||
return hlp.serve(ngx.var.uri)
|
||||
-- If this is an asset, enable caching
|
||||
if hlp.string.starts(ngx.var.uri, conf["portal_path"].."assets")
|
||||
then
|
||||
return hlp.serve(ngx.var.uri, "static_asset")
|
||||
else
|
||||
return hlp.serve(ngx.var.uri)
|
||||
end
|
||||
|
||||
|
||||
-- If all the previous cases have failed, redirect to portal
|
||||
else
|
||||
hlp.flash("info", hlp.t("please_login"))
|
||||
return hlp.redirect(conf.portal_url)
|
||||
-- Force the scheme to HTTPS. This is to avoid an issue with redirection loop
|
||||
-- when trying to access http://main.domain.tld/ (SSOwat finds that user aint
|
||||
-- logged in, therefore redirects to SSO, which redirects to the back_url, which
|
||||
-- redirect to SSO, ..)
|
||||
local back_url = "https://" .. ngx.var.host .. ngx.var.uri .. hlp.uri_args_string()
|
||||
return hlp.redirect(conf.portal_url.."?r="..ngx.encode_base64(back_url))
|
||||
end
|
||||
|
||||
|
||||
|
@ -305,16 +316,36 @@ end
|
|||
-- `/yunohost/sso/assets/js/ynhpanel.js` file.
|
||||
--
|
||||
|
||||
function scandir(directory, callback)
|
||||
-- FIXME : this sometime fails (randomly...)
|
||||
-- because of 'interrupted system call'
|
||||
-- use find (and not ls) to list only files recursively and with their full path relative to the asked directory
|
||||
local pfile = io.popen('cd "'..directory..'" && find * -type f')
|
||||
for filename in pfile:lines() do
|
||||
callback(filename)
|
||||
end
|
||||
pfile:close()
|
||||
end
|
||||
|
||||
function serveAsset(shortcut, full)
|
||||
if string.match(ngx.var.uri, "^"..shortcut.."$") then
|
||||
hlp.serve("/yunohost/sso/assets/"..full, "static_asset")
|
||||
end
|
||||
end
|
||||
|
||||
function serveThemeFile(filename)
|
||||
serveAsset("/ynhtheme/"..filename, "themes/"..conf.theme.."/"..filename)
|
||||
end
|
||||
|
||||
if hlp.is_logged_in() then
|
||||
if string.match(ngx.var.uri, "^/ynhpanel.js$") then
|
||||
hlp.serve("/yunohost/sso/assets/js/ynhpanel.js")
|
||||
end
|
||||
if string.match(ngx.var.uri, "^/ynhpanel.css$") then
|
||||
hlp.serve("/yunohost/sso/assets/css/ynhpanel.css")
|
||||
end
|
||||
if string.match(ngx.var.uri, "^/ynhpanel.json$") then
|
||||
hlp.serve("/yunohost/sso/assets/js/ynhpanel.json")
|
||||
end
|
||||
-- serve ynhpanel files
|
||||
serveAsset("/ynh_portal.js", "js/ynh_portal.js")
|
||||
serveAsset("/ynh_overlay.css", "css/ynh_overlay.css")
|
||||
-- serve theme's files
|
||||
-- FIXME? I think it would be better here not to use an absolute path
|
||||
-- but I didn't succeed to figure out where is the current location of the script
|
||||
-- if you call it from "portal/assets/themes/" the ls fails
|
||||
scandir("/usr/share/ssowat/portal/assets/themes/"..conf.theme, serveThemeFile)
|
||||
|
||||
-- If user has no access to this URL, redirect him to the portal
|
||||
if not hlp.has_access() then
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
"portal_scheme": "https",
|
||||
"portal_domain": "example.com",
|
||||
"portal_path": "/ssowat/",
|
||||
"theme": "default",
|
||||
"domains": [
|
||||
"example.com",
|
||||
"example.org"
|
||||
|
|
|
@ -54,7 +54,8 @@ function get_config()
|
|||
skipped_urls = {},
|
||||
ldap_attributes = {"uid", "givenname", "sn", "cn", "homedirectory", "mail", "maildrop"},
|
||||
allow_mail_authentication = true,
|
||||
default_language = "en"
|
||||
default_language = "en",
|
||||
theme = "default"
|
||||
}
|
||||
|
||||
|
||||
|
|
24
helpers.lua
|
@ -437,13 +437,13 @@ end
|
|||
--
|
||||
-- Takes an URI, and returns file content with the proper HTTP headers.
|
||||
-- It is used to render the SSOwat portal *only*.
|
||||
function serve(uri)
|
||||
function serve(uri, cache)
|
||||
rel_path = string.gsub(uri, conf["portal_path"], "/")
|
||||
|
||||
-- Load login.html as index
|
||||
if rel_path == "/" then
|
||||
if is_logged_in() then
|
||||
rel_path = "/info.html"
|
||||
rel_path = "/portal.html"
|
||||
else
|
||||
rel_path = "/login.html"
|
||||
end
|
||||
|
@ -505,8 +505,12 @@ function serve(uri)
|
|||
flashs["win"] = nil
|
||||
flashs["info"] = nil
|
||||
|
||||
-- Ain't nobody got time for cache
|
||||
ngx.header["Cache-Control"] = "no-cache"
|
||||
if cache == "static_asset" then
|
||||
ngx.header["Cache-Control"] = "public, max-age=3600"
|
||||
else
|
||||
-- Ain't nobody got time for cache
|
||||
ngx.header["Cache-Control"] = "no-cache"
|
||||
end
|
||||
|
||||
-- Print file content
|
||||
ngx.say(content)
|
||||
|
@ -531,7 +535,7 @@ function get_data_for(view)
|
|||
}
|
||||
|
||||
-- For those views, we may need user information
|
||||
elseif view == "info.html"
|
||||
elseif view == "portal.html"
|
||||
or view == "edit.html"
|
||||
or view == "password.html"
|
||||
or view == "ynhpanel.json" then
|
||||
|
@ -550,6 +554,7 @@ function get_data_for(view)
|
|||
local mails = get_mails(user)
|
||||
data = {
|
||||
connected = true,
|
||||
theme = conf.theme,
|
||||
portal_url = conf.portal_url,
|
||||
uid = user,
|
||||
cn = cache:get(user.."-cn"),
|
||||
|
@ -585,6 +590,7 @@ function get_data_for(view)
|
|||
data['flash_fail'] = {flashs["fail"]}
|
||||
data['flash_win'] = {flashs["win"] }
|
||||
data['flash_info'] = {flashs["info"]}
|
||||
data['theme'] = conf["theme"]
|
||||
|
||||
return data
|
||||
end
|
||||
|
@ -682,7 +688,7 @@ function edit_user()
|
|||
|
||||
-- Open the LDAP connection
|
||||
local ldap = lualdap.open_simple(conf["ldap_host"], dn, args.currentpassword)
|
||||
|
||||
|
||||
local password = hash_password(args.newpassword)
|
||||
|
||||
-- Modify the LDAP information
|
||||
|
@ -695,7 +701,7 @@ function edit_user()
|
|||
|
||||
-- Reset the password cache
|
||||
cache:set(user.."-password", args.newpassword, conf["session_timeout"])
|
||||
return redirect(conf.portal_url.."info.html")
|
||||
return redirect(conf.portal_url.."portal.html")
|
||||
else
|
||||
flash("fail", t("password_changed_error"))
|
||||
end
|
||||
|
@ -878,7 +884,7 @@ function edit_user()
|
|||
-- Ugly trick to force cache reloading
|
||||
set_headers(user)
|
||||
flash("win", t("information_updated"))
|
||||
return redirect(conf.portal_url.."info.html")
|
||||
return redirect(conf.portal_url.."portal.html")
|
||||
|
||||
else
|
||||
flash("fail", t("user_saving_fail"))
|
||||
|
@ -909,7 +915,7 @@ function login()
|
|||
local uri_args = ngx.req.get_uri_args()
|
||||
|
||||
args.user = string.lower(args.user)
|
||||
|
||||
|
||||
local user = authenticate(args.user, args.password)
|
||||
if user then
|
||||
ngx.status = ngx.HTTP_CREATED
|
||||
|
|
179
portal/assets/css/ynh_overlay.css
Normal file
|
@ -0,0 +1,179 @@
|
|||
/*
|
||||
===============================================================================
|
||||
This file contains CSS rules loaded on all apps page (*if* the app nginx's
|
||||
conf does include the appropriate snippet) for the small YunoHost button in
|
||||
bottom-right corner + portal overlay.
|
||||
|
||||
The yunohost button corresponds to : #ynh-overlay-switch
|
||||
The yunohost portal overlay / iframe corresponds to : #ynh-overlay
|
||||
|
||||
BE CAREFUL that you should *not* add too-general rules that apply to
|
||||
non-yunohost elements (for instance all 'a' or 'p' elements...) as it will
|
||||
likely break app's rendering
|
||||
===============================================================================
|
||||
*/
|
||||
|
||||
/* ******************************************************************
|
||||
General
|
||||
******************************************************************* */
|
||||
|
||||
html.ynh-panel-active {
|
||||
/* Disable any scrolling on app */
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
body {/*overflow-y: scroll;*/}
|
||||
|
||||
#ynh-overlay-switch,
|
||||
#ynh-overlay-switch *,
|
||||
#ynh-overlay,
|
||||
#ynh-overlay * {
|
||||
-webkit-box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
|
||||
/* ******************************************************************
|
||||
Button
|
||||
******************************************************************* */
|
||||
#ynh-overlay-switch {
|
||||
display: block;
|
||||
position: fixed;
|
||||
z-index: 10000000;
|
||||
bottom: 20px;
|
||||
right: 35px;
|
||||
width: 100px;
|
||||
height: 90px;
|
||||
padding: 12px;
|
||||
border: 12px solid #41444f;
|
||||
border-radius: 5px;
|
||||
background: #41444f;
|
||||
background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE1LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluICAtLT4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIiBbCgk8IUVOVElUWSBuc19mbG93cyAiaHR0cDovL25zLmFkb2JlLmNvbS9GbG93cy8xLjAvIj4KXT4KPHN2ZyB2ZXJzaW9uPSIxLjEiCgkgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM6YT0iaHR0cDovL25zLmFkb2JlLmNvbS9BZG9iZVNWR1ZpZXdlckV4dGVuc2lvbnMvMy4wLyIKCSB4PSIwcHgiIHk9IjBweCIgd2lkdGg9Ijk4cHgiIGhlaWdodD0iODVweCIgdmlld0JveD0iLTAuMjUgLTAuMjUgOTggODUiCgkgb3ZlcmZsb3c9InZpc2libGUiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgLTAuMjUgLTAuMjUgOTggODUiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8ZGVmcz4KPC9kZWZzPgo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNOTcsNTFjLTIuMDIsNC45OC04LjMzLDUuNjctMTQsN2MtMC42MDksNi4yOSwzLjA1LDEwLjk1LTEsMTZjLTYuNDEtMC4yNi03LjQ3MS01Ljg1OS03LTEzYy0xLDAtMiwwLTMsMAoJYy0yLjA5LDIuNzcsMC45LDQuNTIsMCw4Yy0xLjEyLDQuMzQtNy44OCw3LjkxLTExLDdjLTIuMTgtMC42NDEtNS45Ni02LjYzLTUtMTJjMi44Mi0yLjcxLDIuNzYsMy4xMiw2LDNjNS4wNS03Ljg0LTkuNjMtOC41NS04LTE3CgljMS4yNC02LjQyLDExLjY2LTkuNjYsMTUtMWMxLjU0LDQuMjEtNS4xNywwLjE2LTUsM2MtMC4yNzksMS42MiwwLjk1LDEuNzIsMSwzYzIuNTIsMC43NywxLjY4LTIuMTYsMy0zYzEuODU5LTEuMTcsMy4wOS0wLjc1LDYtMQoJYzIuNDUtMi41NSwxLjA4LTguOTIsNC0xMWMzLjg3LDAuNDYsNi4wOCwyLjU5LDYsN0M5MS4wMSw0Ni4xMDksOTQuMyw0Ni4wNSw5Nyw1MXoiLz4KPHBhdGggZmlsbD0iI0ZGRkZGRiIgZD0iTTg3LDEzYzAuNjA5LDMuMjEsMi4zMiw0Ljk4LDIsOGMtMC4zNCwzLjIxLTIuOSw4LjgzLTQsOWMtMS4xNywwLjE4LTEuMzQsMS43OC0yLDIKCWMtNC42NiwxLjU3LTEyLjM5MS0xLjQ4LTE0LTdjLTEuMTYtMy45NywxLjktMTMuMzcsNC0xN2MxLjMtMi4yNSwxLjIyMS0yLjk5LDUtNGMyLjQxLTAuNjUsMy42NS0yLjI1LDYsMAoJYzAuNDcxLDAuNDUsMS4zLDAuNDksMS44NSwwLjg5Yy0wLjE5OSwwLDIsMy4xNCwyLjE1LDQuMTFDODguMzIsMTEuMDcsODYuNzcsMTEuNzgsODcsMTN6IE03OSwyMmMxLjc3OS0xLjg5LDMuMjktNC4wNCwzLTgKCUM3Ny40OSwxMi4zMyw3NC42NywyMS4zLDc5LDIyeiIvPgo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNNjcsMjFjLTAuMDcsNS44MSwyLjQ4LDEwLjcsMCwxNWMtNi43MywxLjA2LTcuMjQtNC4xLTExLTZjLTEuOTM5LDEuMzktMS40OSw1LjE4LTMsNwoJYy0zLjc4LDAuNDQtNC42OS0xLjk3LTctM2MyLjQ3LTcuODEsMS4yNi0xOC45OCwyLTI2YzguNTgtMC41OCw3LjY4LDguMzIsMTIsMTJjMC41Mi00LjM0LTAuMzU5LTE1LjUyLDMtMjAKCUM3MC4zMywzLjI5LDY3LjA5LDEyLjk5LDY3LDIxeiIvPgo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNNTIsNTVjMS45Myw4LjQxLDAuMTIsMjIuNjg5LTEyLDIwYy0xLjU5LTAuMzUtOC40Mi01LjIyLTktN2MtMS42Mi01LDAuMzQtMTMuMzQsMy0xNgoJQzM5LjAzLDQ2Ljk3LDQ1LjQ4LDUwLjM1OSw1Miw1NXogTTM5LDY2YzQuNTUsMC45Niw2LjMtNC4yLDQtN0MzOS4zNyw1OS4wMywzOC42MSw2MS45MzksMzksNjZ6Ii8+CjxwYXRoIGZpbGw9IiNGRkZGRkYiIGQ9Ik0zOSw4YzUuNTgsMC45LDYuNCw2LjgxLDUsMTVjLTEuNDMsOC4zOC0zLjAyLDE0LjU5LTksMTVjLTkuNTcsMC42NS0xMi4yNS0xNi42OS05LTI5CgljOC4zMiwxLjI3LDYuNTksMTAuMzYsNiwxN2MyLjcxLDAuODMsMi4yLTAuODUsMy0yQzM3LjA1LDIxLjA0LDM3LjgyLDEzLjYxLDM5LDh6Ii8+CjxwYXRoIGZpbGw9IiNGRkZGRkYiIGQ9Ik0yOCw2MmMwLjEsNS42Nyw0LjQsMTEuMzMsMiwxN2MtNC4zMi0xLjAxLTYuNTctNC4wOS05LTdjLTMuMTUtMC40OC0yLjI2LDMuMDctNiwyCgljLTAuNjcsNS4wNjEsMi4yOSw3LjU3LTEsMTBjLTQuNy0wLjYzLTYuNjYtNC04LThjLTIuNjEtMS4zOC01LjQ4LTIuNTItNi02YzAuMTQtMy41Myw0LjQ4LTIuODUsNy00YzAuNDctNS41My0xLjQxLTEzLjQxLDItMTYKCWM4LjMxLDAuNDksOC4yMSw3LjEzLDcsMTVjNC4zNiwwLjI5LDQuOTQtNC4zNSw1LTdjMC4wNi0yLjQzLTEuODItOC4yNiwyLTExYzMuMDYtMC43MywyLjk0LDEuNzMsNiwxCglDMzIuMzUsNTIuNywyNy45Miw1Ny40MzksMjgsNjJ6Ii8+CjxwYXRoIGZpbGw9IiNGRkZGRkYiIGQ9Ik0yNCwxMmMxLjA3LDcuMDctMy44Niw4LjE0LTYsMTJjMC4yMSw2Ljg4LTAuNDcsMTIuODYtMiwxOGMtNS44Ni0xLjMyLTguNy0xMC4zOC02LTE3CgljLTAuMzMtMy41Mi01LjI2LTQuMjItNy04Yy0wLjMtMC42Ni0wLjQ3LTQuNDMtMS03QzEuMDksNS42MywwLjU1LDQuMzEsMywxYzguMTYtMC40OSw3LjIxLDguMTMsOSwxNGM1LjA1LDAuMzksMy45MS01LjQyLDgtNgoJQzIwLjk4LDEwLjM1LDIyLjY3LDExLDI0LDEyeiIvPgo8L3N2Zz4K);
|
||||
background-position: center center;
|
||||
background-repeat: no-repeat;
|
||||
background-size: contain;
|
||||
opacity: 0.7;
|
||||
}
|
||||
/*#ynh-overlay-switch.visible,*/
|
||||
#ynh-overlay-switch:hover {
|
||||
background-color: #41444f;
|
||||
border-color: #41444f;
|
||||
background-color: #111;
|
||||
border-color: #111;
|
||||
}
|
||||
|
||||
|
||||
/* ******************************************************************
|
||||
Overlay
|
||||
******************************************************************* */
|
||||
|
||||
/* Background */
|
||||
#ynh-overlay {
|
||||
visibility: hidden;
|
||||
position: fixed;
|
||||
top:0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
z-index: 9999999;
|
||||
display: block;
|
||||
border: none;
|
||||
color:#fff;
|
||||
background: #41444F;
|
||||
transition: all 0.2s ease;
|
||||
-moz-transition: all 0.2s ease;
|
||||
-webkit-transition: all 0.2s ease;
|
||||
}
|
||||
|
||||
|
||||
/* ******************************************************************
|
||||
Animation
|
||||
******************************************************************* */
|
||||
|
||||
/*FadeIn*/
|
||||
@-webkit-keyframes fadeIn {
|
||||
0% {
|
||||
visibility: hidden;
|
||||
opacity:0;
|
||||
}
|
||||
100% {
|
||||
visibility: visible;
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
@keyframes fadeIn {
|
||||
0% {
|
||||
visibility: hidden;
|
||||
opacity: 0;
|
||||
}
|
||||
100% {
|
||||
visibility: visible;
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.ynh-fadeIn {
|
||||
-webkit-animation-name: fadeIn;
|
||||
animation-name: fadeIn;
|
||||
-webkit-animation-duration: 0.5s;
|
||||
animation-duration: 0.5s;
|
||||
-webkit-animation-fill-mode: both;
|
||||
animation-fill-mode: both;
|
||||
-webkit-animation-timing-function: cubic-bezier(0.165, 0.840, 0.440, 1.000);
|
||||
animation-timing-function: cubic-bezier(0.165, 0.840, 0.440, 1.000);
|
||||
}
|
||||
/*
|
||||
.ynh-fadeIn.ynh-delay {
|
||||
animation-delay: 0.5s;
|
||||
-webkit-animation-delay: 0.5s;
|
||||
}
|
||||
*/
|
||||
|
||||
/*FadeOut*/
|
||||
@-webkit-keyframes fadeOut {
|
||||
0% {
|
||||
visibility: visible;
|
||||
opacity: 1;
|
||||
}
|
||||
100% {
|
||||
visibility: hidden;
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
@keyframes fadeOut {
|
||||
0% {
|
||||
visibility: visible;
|
||||
opacity: 1;
|
||||
}
|
||||
100% {
|
||||
visibility: hidden;
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
.ynh-fadeOut {
|
||||
-webkit-animation-name: fadeOut;
|
||||
animation-name: fadeOut;
|
||||
-webkit-animation-duration: 0.2s;
|
||||
animation-duration: 0.2s;
|
||||
-webkit-animation-fill-mode: both;
|
||||
animation-fill-mode: both;
|
||||
}
|
||||
/*
|
||||
.ynh-fadeOut.ynh-delay {
|
||||
animation-delay: 0.5s;
|
||||
-webkit-animation-delay: 0.5s;
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
/* ******************************************************************
|
||||
Media Queries
|
||||
******************************************************************* */
|
||||
|
||||
@media screen and (max-width: 500px) {
|
||||
#ynh-overlay-switch {
|
||||
width: 80px;
|
||||
height: 75px;
|
||||
}
|
||||
}
|
|
@ -1,3 +1,9 @@
|
|||
/*
|
||||
===============================================================================
|
||||
This file contain CSS rules loaded on the YunoHost user portal.
|
||||
===============================================================================
|
||||
*/
|
||||
|
||||
/* ==========================================================================
|
||||
0 = Fonts
|
||||
1 = Global
|
||||
|
@ -65,16 +71,20 @@ html {
|
|||
font-family: sans-serif; /* 1 */
|
||||
-ms-text-size-adjust: 100%; /* 2 */
|
||||
-webkit-text-size-adjust: 100%; /* 2 */
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
body {
|
||||
background: #41444f;
|
||||
font-family: 'source_sans_proregular';
|
||||
overflow-y: scroll;
|
||||
font-size: 1em;
|
||||
line-height:1.5;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
height: 100%;
|
||||
top: 0;
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
h1:first-child,
|
||||
|
@ -112,10 +122,16 @@ img {
|
|||
|
||||
|
||||
/* Layout */
|
||||
.overlay {
|
||||
.content {
|
||||
padding: 2%;
|
||||
}
|
||||
|
||||
.logged .content {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: auto; /* scroll .content, not body for easier background customization */
|
||||
}
|
||||
|
||||
.ynh-wrapper {
|
||||
width: 90%;
|
||||
margin: 2% 5%;
|
||||
|
@ -126,38 +142,36 @@ img {
|
|||
.ynh-wrapper:after {content: " ";display: table;}
|
||||
.ynh-wrapper:after {clear: both;}
|
||||
|
||||
|
||||
|
||||
/* Logo */
|
||||
.logo {
|
||||
text-align: center;
|
||||
margin-bottom: 0;
|
||||
.ynh-logo {
|
||||
opacity: 0.7;
|
||||
margin-top: 6em;
|
||||
width: 100%;
|
||||
height: 9em;
|
||||
background-image: url("../img/logo-ynh-white.svg");
|
||||
background-repeat: no-repeat;
|
||||
background-position: center 100%;
|
||||
background-size: contain;
|
||||
}
|
||||
|
||||
.logo img {
|
||||
margin-top: 4%;
|
||||
width: 4em;
|
||||
}
|
||||
|
||||
.logged .logo {
|
||||
.logged .ynh-logo {
|
||||
position: fixed;
|
||||
width: 5em;
|
||||
height: 5em;
|
||||
bottom: 20px;
|
||||
right: 20px;
|
||||
z-index: 0;
|
||||
opacity: 0.7;
|
||||
background-position: center center;
|
||||
}
|
||||
.logged .logo img {
|
||||
margin-top: 0;
|
||||
width: 2.5em;
|
||||
padding: 0.3em;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.ynh-panel-active .logo {
|
||||
.ynh-panel-active .ynh-logo {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.in_app_overlay .ynh-logo {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* messages */
|
||||
.messages {
|
||||
|
@ -330,13 +344,12 @@ textarea {
|
|||
-webkit-transform: skew(0deg, 45deg);
|
||||
}
|
||||
|
||||
.listing-apps span {
|
||||
display: block;
|
||||
margin: -1.2em 0 0 0.2em;
|
||||
}
|
||||
.listing-apps .first-letter { margin: 0; }
|
||||
.listing-apps .first-letter:before {
|
||||
content: attr(data-first-letter);
|
||||
.listing-apps span {
|
||||
display: block;
|
||||
margin: -1.2em 0 0 0.2em;
|
||||
}
|
||||
.listing-apps .first-letter {
|
||||
margin: 0;
|
||||
display: inline-block;
|
||||
}
|
||||
.listing-apps .name {
|
||||
|
@ -793,151 +806,6 @@ input.btn {
|
|||
}
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
6 = Colors
|
||||
========================================================================== */
|
||||
|
||||
.bluebg {
|
||||
background: #3498DB!important;
|
||||
}
|
||||
.bluebg:hover:after,
|
||||
.bluebg:focus:after,
|
||||
.bluebg:hover:before,
|
||||
.bluebg:focus:before {
|
||||
background: #16527A!important;
|
||||
}
|
||||
|
||||
.purplebg {
|
||||
background: #9B59B6!important;
|
||||
}
|
||||
.purplebg:hover:after,
|
||||
.purplebg:focus:after,
|
||||
.purplebg:hover:before,
|
||||
.purplebg:focus:before {
|
||||
background: #532C64!important;
|
||||
}
|
||||
|
||||
.redbg {
|
||||
background: #E74C3C!important;
|
||||
}
|
||||
.redbg:hover:after,
|
||||
.redbg:focus:after,
|
||||
.redbg:hover:before,
|
||||
.redbg:focus:before {
|
||||
background: #921E12!important;
|
||||
}
|
||||
|
||||
.orangebg {
|
||||
background: #F39C12!important;
|
||||
}
|
||||
.orangebg:hover:after,
|
||||
.orangebg:focus:after,
|
||||
.orangebg:hover:before,
|
||||
.orangebg:focus:before {
|
||||
background: #7F5006!important;
|
||||
}
|
||||
|
||||
.greenbg {
|
||||
background: #2ECC71!important;
|
||||
}
|
||||
.greenbg:hover:after,
|
||||
.greenbg:focus:after,
|
||||
.greenbg:hover:before,
|
||||
.greenbg:focus:before {
|
||||
background: #176437!important;
|
||||
}
|
||||
|
||||
.darkbluebg {
|
||||
background: #34495E!important;
|
||||
}
|
||||
.darkbluebg:hover:after,
|
||||
.darkbluebg:focus:after,
|
||||
.darkbluebg:hover:before,
|
||||
.darkbluebg:focus:before {
|
||||
background: #07090C!important;
|
||||
}
|
||||
|
||||
.lightbluebg {
|
||||
background: #6A93D4!important;
|
||||
}
|
||||
.lightbluebg:hover:after,
|
||||
.lightbluebg:focus:after,
|
||||
.lightbluebg:hover:before,
|
||||
.lightbluebg:focus:before {
|
||||
background: #2B5394!important;
|
||||
}
|
||||
|
||||
.yellowbg {
|
||||
background: #F1C40F!important;
|
||||
}
|
||||
.yellowbg:hover:after,
|
||||
.yellowbg:focus:after,
|
||||
.yellowbg:hover:before,
|
||||
.yellowbg:focus:before {
|
||||
background: #796307!important;
|
||||
}
|
||||
|
||||
|
||||
.lightpinkbg {
|
||||
background: #F76F87!important;
|
||||
}
|
||||
.lightpinkbg:hover:after,
|
||||
.lightpinkbg:focus:after,
|
||||
.lightpinkbg:hover:before,
|
||||
.lightpinkbg:focus:before {
|
||||
background: #DA0C31!important;
|
||||
}
|
||||
|
||||
/* Following colors are not used yet */
|
||||
.pinkbg {
|
||||
background: #D66D92!important;
|
||||
}
|
||||
.pinkbg:hover:after,
|
||||
.pinkbg:focus:after,
|
||||
.pinkbg:hover:before,
|
||||
.pinkbg:focus:before {
|
||||
background: #992B52!important;
|
||||
}
|
||||
|
||||
.turquoisebg {
|
||||
background: #1ABC9C!important;
|
||||
}
|
||||
.turquoisebg:hover:after,
|
||||
.turquoisebg:focus:after,
|
||||
.turquoisebg:hover:before,
|
||||
.turquoisebg:focus:before {
|
||||
background: #0B4C3F!important;
|
||||
}
|
||||
.lightyellow {
|
||||
background: #FFC973!important;
|
||||
}
|
||||
.lightyellow:hover:after,
|
||||
.lightyellow:focus:after,
|
||||
.lightyellow:hover:before,
|
||||
.lightyellow:focus:before {
|
||||
background: #F39500!important;
|
||||
}
|
||||
.lightgreen {
|
||||
background: #B5F36D!important;
|
||||
}
|
||||
.lightgreen:hover:after,
|
||||
.lightgreen:focus:after,
|
||||
.lightgreen:hover:before,
|
||||
.lightgreen:focus:before {
|
||||
background: #77CF11!important;
|
||||
}
|
||||
.purpledarkbg {
|
||||
background: #8E44AD!important;
|
||||
}
|
||||
.purpledarkbg:hover:after,
|
||||
.purpledarkbg:focus:after,
|
||||
.purpledarkbg:hover:before,
|
||||
.purpledarkbg:focus:before {
|
||||
background: #432051!important;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* ==========================================================================
|
||||
Internet Explorer
|
||||
========================================================================== */
|
|
@ -1,38 +0,0 @@
|
|||
document.addEventListener('DOMContentLoaded', function() {
|
||||
|
||||
// Variables
|
||||
var liMenu = document.querySelectorAll('#apps a')
|
||||
, colors = ['redbg','purpledarkbg','darkbluebg','orangebg','greenbg','darkbluebg','purpledarkbg','yellowbg','lightpinkbg','pinkbg','turquoisebg','yellowbg','lightbluebg','purpledarkbg', 'bluebg']
|
||||
, addMailAlias = document.getElementById('add-mailalias')
|
||||
, addMaildrop = document.getElementById('add-maildrop')
|
||||
;
|
||||
|
||||
liMenu && [].forEach.call(liMenu, function(el, i) {
|
||||
// Select a color value from the App label
|
||||
randomColorNumber = parseInt(el.textContent, 36) % colors.length;
|
||||
//randomColorNumber = i%colors.length; // Old value
|
||||
// Add color class.
|
||||
el.classList.add(colors[randomColorNumber]);
|
||||
// Set first-letter data attribute.
|
||||
el.querySelector('.first-letter').setAttribute('data-first-letter',el.textContent.substring(0, 2));
|
||||
});
|
||||
|
||||
addMailAlias && addMailAlias.addEventListener('click', function(){
|
||||
// Clone last input.
|
||||
var inputAliasClone = document.querySelector('.mailalias-input').cloneNode(true);
|
||||
// Empty value.
|
||||
inputAliasClone.value = '';
|
||||
// Append to form-group.
|
||||
addMailAlias.parentNode.insertBefore(inputAliasClone, addMailAlias);
|
||||
});
|
||||
|
||||
addMaildrop && addMaildrop.addEventListener('click', function(){
|
||||
// Clone last input.
|
||||
var inputDropClone = document.querySelector('.maildrop-input').cloneNode(true);
|
||||
// Empty value.
|
||||
inputDropClone.value = '';
|
||||
// Append to form-group.
|
||||
addMaildrop.parentNode.insertBefore(inputDropClone, addMaildrop);
|
||||
});
|
||||
|
||||
});
|
|
@ -1,9 +1,18 @@
|
|||
/* ----------------------------------------------------------
|
||||
Utilities
|
||||
---------------------------------------------------------- */
|
||||
/*
|
||||
===============================================================================
|
||||
This JS file is loaded :
|
||||
- in the YunoHost user portal
|
||||
- on every app page if the app nginx's conf does include the ynh snippet
|
||||
===============================================================================
|
||||
*/
|
||||
|
||||
/* Console log fix
|
||||
-------------------------- */
|
||||
/*
|
||||
=====================
|
||||
Utilities
|
||||
=====================
|
||||
*/
|
||||
|
||||
/* Console log fix */
|
||||
if (typeof(console) === 'undefined') {
|
||||
var console = {};
|
||||
console.log = console.error = console.info = console.debug = console.warn = console.trace = console.dir = console.dirxml = console.group = console.groupEnd = console.time = console.timeEnd = console.assert = console.profile = function() {};
|
||||
|
@ -91,6 +100,7 @@ Element.toggleClass = function(element, className) {
|
|||
https://github.com/Darklg/JavaScriptUtilities/blob/master/assets/js/vanilla-js/libs/vanilla-events.js
|
||||
-------------------------- */
|
||||
window.addEvent = function(el, eventName, callback, options) {
|
||||
if (el == null) { return; }
|
||||
if (el.addEventListener) {
|
||||
if (!options || typeof(options) !== "object") {
|
||||
options = {};
|
||||
|
@ -118,7 +128,7 @@ window.eventPreventDefault = function(event) {
|
|||
http://jsfiddle.net/tovic/Xcb8d/light/
|
||||
-------------------------- */
|
||||
|
||||
var dragg = function(id) {
|
||||
function make_element_draggable(id) {
|
||||
|
||||
// Variables
|
||||
this.elem = document.getElementById(id),
|
||||
|
@ -136,6 +146,16 @@ var dragg = function(id) {
|
|||
selected = elem;
|
||||
x_elem = x_pos - selected.offsetLeft;
|
||||
y_elem = y_pos - selected.offsetTop;
|
||||
|
||||
// We add listening event for the iframe itself ...
|
||||
// otherwise dragging the tile on the iframe doesn't
|
||||
// work properly.
|
||||
// We do this at click time to have a better chance
|
||||
// that the iframe's body is indeed loaded ...
|
||||
// (a bit hackish but meh)
|
||||
portalOverlay = document.getElementById("ynh-overlay").contentDocument.body;
|
||||
window.addEvent(portalOverlay, 'mousemove', _onMove);
|
||||
window.addEvent(portalOverlay, 'touchmove', _onMove, {passive: false});
|
||||
};
|
||||
|
||||
var _shutDrag = function(e){
|
||||
|
@ -192,26 +212,41 @@ var dragg = function(id) {
|
|||
// Reset dragging status
|
||||
dragged = false;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
/* Smallest DOMReady
|
||||
http://dustindiaz.com/smallest-domready-ever
|
||||
-------------------------- */
|
||||
function domReady(cb) {
|
||||
/in/.test(document.readyState) // in = loadINg
|
||||
? setTimeout('domReady('+cb+')', 9)
|
||||
: cb();
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
/* ----------------------------------------------------------
|
||||
Main
|
||||
---------------------------------------------------------- */
|
||||
domReady(function(){
|
||||
// Don't do this in iframe
|
||||
if (window.self !== window.top) {return false;}
|
||||
window.addEvent(document, 'DOMContentLoaded', function() {
|
||||
|
||||
// 3 different cases :
|
||||
// - this script is loaded from inside an app
|
||||
// - this script is loaded inside the portal, inside an iframe/overlay activated by clicking the portal button inside an app
|
||||
// - this script is loaded inside the "regular" portal when going to /yunohost/sso.
|
||||
|
||||
var in_app = ! document.body.classList.contains('ynh-user-portal');
|
||||
var in_overlay_iframe = (window.location != window.parent.location);
|
||||
|
||||
if (in_app)
|
||||
{
|
||||
init_portal_button_and_overlay();
|
||||
}
|
||||
else
|
||||
{
|
||||
init_portal();
|
||||
if (in_overlay_iframe) { tweak_portal_when_in_iframe(); }
|
||||
}
|
||||
});
|
||||
|
||||
//
|
||||
// This function is called when ynh_portal.js is included in an app
|
||||
//
|
||||
// It will create the small yunohost "portal button" usually in the bottom
|
||||
// right corner and initialize the portal overlay, shown when clicking the
|
||||
// portal button meant to make it easier to switch between apps.
|
||||
//
|
||||
function init_portal_button_and_overlay()
|
||||
{
|
||||
// Set and store meta viewport
|
||||
var meta_viewport = document.querySelector('meta[name="viewport"]');
|
||||
if (meta_viewport === null) {
|
||||
|
@ -223,111 +258,114 @@ domReady(function(){
|
|||
meta_viewport = document.querySelector('meta[name="viewport"]');
|
||||
meta_viewport_content = meta_viewport.getAttribute('content');
|
||||
|
||||
// Add portal stylesheet
|
||||
var portalStyle = document.createElement("link");
|
||||
portalStyle.setAttribute("rel", "stylesheet");
|
||||
portalStyle.setAttribute("type", "text/css");
|
||||
portalStyle.setAttribute("href", '/ynhpanel.css');
|
||||
document.getElementsByTagName("head")[0].insertBefore(portalStyle, null);
|
||||
// Prepare and inject the portal overlay (what is activated when clicking on the portal button)
|
||||
var portalOverlay = document.createElement('iframe');
|
||||
portalOverlay.src = "/yunohost/sso/portal.html";
|
||||
portalOverlay.setAttribute("id","ynh-overlay");
|
||||
portalOverlay.setAttribute("style","visibility: hidden;"); // make sure the overlay is invisible already when loading it
|
||||
document.body.insertBefore(portalOverlay, null);
|
||||
|
||||
// Create portal link
|
||||
var portal = document.createElement('a');
|
||||
portal.setAttribute('id', 'ynh-overlay-switch');
|
||||
portal.setAttribute('href', '/yunohost/sso/');
|
||||
portal.setAttribute('class', 'disableAjax');
|
||||
document.body.insertBefore(portal, null);
|
||||
// Inject portal button
|
||||
var portalButton = document.createElement('a');
|
||||
portalButton.setAttribute('id', 'ynh-overlay-switch');
|
||||
portalButton.setAttribute('href', '/yunohost/sso/');
|
||||
portalButton.setAttribute('class', 'disableAjax');
|
||||
document.body.insertBefore(portalButton, null);
|
||||
// Make portal button draggable, for user convenience
|
||||
make_element_draggable('ynh-overlay-switch');
|
||||
|
||||
// Portal link is draggable, for user convenience
|
||||
dragg('ynh-overlay-switch');
|
||||
|
||||
|
||||
// Create overlay element
|
||||
var overlay = document.createElement("div");
|
||||
overlay.setAttribute("id","ynh-overlay");
|
||||
overlay.setAttribute("style","display:none");
|
||||
|
||||
document.body.insertBefore(overlay, null);
|
||||
|
||||
//Color Application
|
||||
var colors = ['redbg','purpledarkbg','darkbluebg','orangebg','greenbg','darkbluebg','purpledarkbg','yellowbg','lightpinkbg','pinkbg','turquoisebg','yellowbg','lightbluebg','purpledarkbg', 'bluebg'];
|
||||
|
||||
// Get user's app
|
||||
var r = new XMLHttpRequest();
|
||||
r.open("GET", "/ynhpanel.json", true);
|
||||
r.onreadystatechange = function () {
|
||||
// Die if error
|
||||
if (r.readyState != 4 || r.status != 200) return;
|
||||
|
||||
// Response is JSON
|
||||
response = JSON.parse(r.responseText);
|
||||
|
||||
// Add overlay header
|
||||
overlay.innerHTML += '<div id="ynh-user" class="ynh-wrapper info">' +
|
||||
'<ul class="ul-reset user-menu"><li><a class="icon icon-connexion disableAjax" href="'+ response.portal_url +'?action=logout">'+response.t_logout+'</a></li></ul>'+
|
||||
'<a class="user-container user-container-info disableAjax" href="'+ response.portal_url +'edit.html">' +
|
||||
'<h2 class="user-username">'+ response.uid +'</h2>' +
|
||||
'<small class="user-fullname">'+ response.givenName + ' ' + response.sn +'</small>' +
|
||||
'<span class="user-mail">'+ response.mail +'</span>' +
|
||||
'</a>' +
|
||||
'</div>';
|
||||
|
||||
|
||||
// Add application links
|
||||
var links = [];
|
||||
Array.prototype.forEach.call(response.app, function(app, n){
|
||||
randomColorNumber = parseInt(app.name, 36) % colors.length;
|
||||
links.push('<li><a class="'+colors[randomColorNumber]+' disableAjax" href="//'+app.url+'"><span class="first-letter" data-first-letter="'+ app.name.substr(0,2) +'"></span><span class="name">'+app.name+'</span></a></li>');
|
||||
});
|
||||
overlay.innerHTML += '<div id="ynh-apps" class="ynh-wrapper apps"><ul class="listing-apps">'+ links.join("\n") +'</ul></div>';
|
||||
|
||||
// Add footer links
|
||||
overlay.innerHTML += '<div id="ynh-footer" class="ynh-wrapper footer"><nav>' + "\n" +
|
||||
'<a class="link-profile-edit" href="/yunohost/sso/edit.html">'+ response.t_footerlink_edit +'</a>' + "\n" +
|
||||
'<a class="link-documentation" href="//yunohost.org/docs" target="_blank">'+ response.t_footerlink_documentation +'</a>' + "\n" +
|
||||
'<a class="link-documentation" href="//yunohost.org/support" target="_blank">'+ response.t_footerlink_support +'</a>' + "\n" +
|
||||
'<a class="link-admin" href="/yunohost/admin/" target="_blank">'+ response.t_footerlink_administration +'</a>' + "\n" +
|
||||
'</nav></div>';
|
||||
|
||||
// Add overlay to DOM
|
||||
var btn = document.getElementById('logo'),
|
||||
yunoverlay = document.getElementById('ynh-overlay'),
|
||||
user = document.getElementById('ynh-user'),
|
||||
apps = document.getElementById('ynh-apps');
|
||||
|
||||
var pfx = ["webkit", "moz", "MS", "o", ""];
|
||||
function PrefixedEvent(element, type, callback) {
|
||||
for (var p = 0; p < pfx.length; p++) {
|
||||
if (!pfx[p]) type = type.toLowerCase();
|
||||
element.addEventListener(pfx[p]+type, callback, false);
|
||||
}
|
||||
}
|
||||
|
||||
// Bind YNH Button
|
||||
window.addEvent(portal, 'click', function(e){
|
||||
// Bind portal button
|
||||
window.addEvent(portalButton, 'click', function(e){
|
||||
// Prevent default click
|
||||
window.eventPreventDefault(e);
|
||||
// Toggle overlay on YNHPortal button
|
||||
//Element.toggleClass(overlay, 'visible');
|
||||
Element.toggleClass(portal, 'visible');
|
||||
// Toggle overlay on YNHPortal button click
|
||||
Element.toggleClass(portalOverlay, 'visible');
|
||||
Element.toggleClass(portalButton, 'visible');
|
||||
Element.toggleClass(document.querySelector('html'), 'ynh-panel-active');
|
||||
Element.toggleClass(portalOverlay, 'ynh-active');
|
||||
|
||||
|
||||
if(yunoverlay.classList.contains('ynh-active')) {
|
||||
if (portalOverlay.classList.contains('ynh-active')) {
|
||||
meta_viewport.setAttribute('content', meta_viewport_content);
|
||||
yunoverlay.classList.add('ynh-fadeOut');
|
||||
PrefixedEvent(yunoverlay, "AnimationEnd", function(){
|
||||
if(yunoverlay.classList.contains('ynh-fadeOut')) {
|
||||
yunoverlay.classList.remove('ynh-active');
|
||||
}
|
||||
});
|
||||
}else {
|
||||
Element.addClass(portalOverlay, 'ynh-fadeIn');
|
||||
Element.removeClass(portalOverlay, 'ynh-fadeOut');
|
||||
} else {
|
||||
meta_viewport.setAttribute('content', "width=device-width");
|
||||
yunoverlay.classList.remove('ynh-fadeOut');
|
||||
yunoverlay.classList.add('ynh-active');
|
||||
}
|
||||
});
|
||||
Element.removeClass(portalOverlay, 'ynh-fadeIn');
|
||||
Element.addClass(portalOverlay, 'ynh-fadeOut');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
};
|
||||
r.send();
|
||||
//
|
||||
// This function is called to initialize elements like the app tile colors and other things ...
|
||||
//
|
||||
function init_portal()
|
||||
{
|
||||
|
||||
});
|
||||
window.addEvent(document.getElementById('add-mailalias'), "click", function() {
|
||||
// Clone last input.
|
||||
var inputAliasClone = document.querySelector('.mailalias-input').cloneNode(true);
|
||||
// Empty value.
|
||||
inputAliasClone.value = '';
|
||||
// Append to form-group.
|
||||
this.parentNode.insertBefore(inputAliasClone, this);
|
||||
});
|
||||
|
||||
window.addEvent(document.getElementById('add-maildrop'), "click", function() {
|
||||
// Clone last input.
|
||||
var inputDropClone = document.querySelector('.maildrop-input').cloneNode(true);
|
||||
// Empty value.
|
||||
inputDropClone.value = '';
|
||||
// Append to form-group.
|
||||
this.parentNode.insertBefore(inputDropClone, this);
|
||||
});
|
||||
|
||||
Array.each(document.getElementsByClassName("app-tile"), function(el) {
|
||||
// Set first-letter data attribute.
|
||||
el.querySelector('.first-letter').innerHTML = el.getAttribute("data-appname").substring(0, 2);
|
||||
// handle app links so they work both in plain info page and in the info iframe called from ynh_portal.js
|
||||
window.addEvent(el, 'click', function(event) {
|
||||
// if asked to open in new tab
|
||||
if (event.ctrlKey || event.shiftKey || event.metaKey
|
||||
|| (event.button && event.button == 1)) {
|
||||
return
|
||||
}
|
||||
// if asked in current tab
|
||||
else {
|
||||
event.preventDefault();
|
||||
parent.location.href=this.href;
|
||||
return false;
|
||||
};
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function tweak_portal_when_in_iframe()
|
||||
{
|
||||
// Set class to body to show we're in overlay
|
||||
document.body.classList.add('in_app_overlay');
|
||||
let userContainer = document.querySelector('a.user-container');
|
||||
if (userContainer) {
|
||||
userContainer.classList.replace('user-container-info', 'user-container-edit');
|
||||
userContainer.setAttribute('href', userContainer
|
||||
.getAttribute('href')
|
||||
.replace('edit.html', ''));
|
||||
window.addEvent(userContainer, 'click', function(e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
window.parent.location.href = userContainer.getAttribute('href');
|
||||
});
|
||||
}
|
||||
let logoutButton = document.getElementById('ynh-logout');
|
||||
if (logoutButton)
|
||||
{
|
||||
// We force to do the logout "globally", not just in the
|
||||
// iframe, otherwise after login out the url might still be
|
||||
// domain.tld/app which is weird ...
|
||||
window.addEvent(logoutButton, 'click', function(e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
window.parent.location.href = logoutButton.getAttribute("href");
|
||||
});
|
||||
}
|
||||
}
|
|
@ -1 +0,0 @@
|
|||
{}
|
BIN
portal/assets/themes/clouds/background.jpg
Normal file
After Width: | Height: | Size: 299 KiB |
BIN
portal/assets/themes/clouds/cloud.png
Normal file
After Width: | Height: | Size: 25 KiB |
17
portal/assets/themes/clouds/custom_overlay.css
Normal file
|
@ -0,0 +1,17 @@
|
|||
/*
|
||||
===============================================================================
|
||||
This file may contain extra CSS rules loaded on all apps page (*if* the app
|
||||
nginx's conf does include the appropriate snippet) for the small YunoHost
|
||||
button in bottom-right corner + portal overlay.
|
||||
|
||||
The yunohost button corresponds to : #ynh-overlay-switch
|
||||
The yunohost portal overlay / iframe corresponds to : #ynh-overlay
|
||||
|
||||
BE CAREFUL that you should *not* add too-general rules that apply to
|
||||
non-yunohost elements (for instance all 'a' or 'p' elements...) as it will
|
||||
likely break app's rendering
|
||||
===============================================================================
|
||||
*/
|
||||
#ynh-overlay-switch {
|
||||
background-image: url("./cloud.png");
|
||||
}
|
43
portal/assets/themes/clouds/custom_portal.css
Normal file
|
@ -0,0 +1,43 @@
|
|||
/*
|
||||
===============================================================================
|
||||
This file contain extra CSS rules to customize the YunoHost user portal and
|
||||
can be used to customize app tiles, buttons, etc...
|
||||
===============================================================================
|
||||
*/
|
||||
|
||||
/* Make page texts black */
|
||||
.user-container h2,
|
||||
.user-container small,
|
||||
.user-container .user-mail,
|
||||
.user-container .user-mail,
|
||||
.content .footer a,
|
||||
a.app-tile,
|
||||
#ynh-logout {
|
||||
color: black !important;
|
||||
}
|
||||
|
||||
.ynh-user-portal {
|
||||
background-image: url("background.jpg");
|
||||
background-repeat: no-repeat;
|
||||
background-size: cover;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
/* Apps colors */
|
||||
.app-tile {
|
||||
background-color: rgba(255, 255, 255, 0.5) !important;
|
||||
}
|
||||
|
||||
.app-tile:hover:after,
|
||||
.app-tile:focus:after,
|
||||
.app-tile:hover:before,
|
||||
.app-tile:focus:before {
|
||||
background: rgba(255, 255, 255, 0.5) !important;
|
||||
}
|
||||
|
||||
/* Use a custom logo image */
|
||||
#ynh-logo {
|
||||
z-index: 10;
|
||||
background-image: url("./cloud.png");
|
||||
}
|
33
portal/assets/themes/clouds/custom_portal.js
Normal file
|
@ -0,0 +1,33 @@
|
|||
/*
|
||||
===============================================================================
|
||||
This JS file may be used to customize the YunoHost user portal *and* also
|
||||
will be loaded in all app pages if the app nginx's conf does include the
|
||||
appropriate snippet.
|
||||
|
||||
You can monkeypatch init_portal (loading of the user portal) and
|
||||
init_portal_button_and_overlay (loading of the button and overlay...) to do
|
||||
custom stuff
|
||||
===============================================================================
|
||||
*/
|
||||
|
||||
/*
|
||||
* Monkeypatch init_portal to customize the app tile style
|
||||
*
|
||||
init_portal_original = init_portal;
|
||||
init_portal = function()
|
||||
{
|
||||
init_portal_original();
|
||||
// Some stuff here
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
* Monkey patching example to do custom stuff when loading inside an app
|
||||
*
|
||||
init_portal_button_and_overlay_original = init_portal_button_and_overlay;
|
||||
init_portal_button_and_overlay = function()
|
||||
{
|
||||
init_portal_button_and_overlay_original();
|
||||
// Custom stuff to do when loading inside an app
|
||||
}
|
||||
*/
|
14
portal/assets/themes/default/custom_overlay.css
Normal file
|
@ -0,0 +1,14 @@
|
|||
/*
|
||||
===============================================================================
|
||||
This file may contain extra CSS rules loaded on all apps page (*if* the app
|
||||
nginx's conf does include the appropriate snippet) for the small YunoHost
|
||||
button in bottom-right corner + portal overlay.
|
||||
|
||||
The yunohost button corresponds to : #ynh-overlay-switch
|
||||
The yunohost portal overlay / iframe corresponds to : #ynh-overlay
|
||||
|
||||
BE CAREFUL that you should *not* add too-general rules that apply to
|
||||
non-yunohost elements (for instance all 'a' or 'p' elements...) as it will
|
||||
likely break app's rendering
|
||||
===============================================================================
|
||||
*/
|
145
portal/assets/themes/default/custom_portal.css
Normal file
|
@ -0,0 +1,145 @@
|
|||
/*
|
||||
===============================================================================
|
||||
This file contain extra CSS rules to customize the YunoHost user portal and
|
||||
can be used to customize app tiles, buttons, etc...
|
||||
===============================================================================
|
||||
*/
|
||||
|
||||
.bluebg {
|
||||
background: #3498DB!important;
|
||||
}
|
||||
.bluebg:hover:after,
|
||||
.bluebg:focus:after,
|
||||
.bluebg:hover:before,
|
||||
.bluebg:focus:before {
|
||||
background: #16527A!important;
|
||||
}
|
||||
|
||||
.purplebg {
|
||||
background: #9B59B6!important;
|
||||
}
|
||||
.purplebg:hover:after,
|
||||
.purplebg:focus:after,
|
||||
.purplebg:hover:before,
|
||||
.purplebg:focus:before {
|
||||
background: #532C64!important;
|
||||
}
|
||||
|
||||
.redbg {
|
||||
background: #E74C3C!important;
|
||||
}
|
||||
.redbg:hover:after,
|
||||
.redbg:focus:after,
|
||||
.redbg:hover:before,
|
||||
.redbg:focus:before {
|
||||
background: #921E12!important;
|
||||
}
|
||||
|
||||
.orangebg {
|
||||
background: #F39C12!important;
|
||||
}
|
||||
.orangebg:hover:after,
|
||||
.orangebg:focus:after,
|
||||
.orangebg:hover:before,
|
||||
.orangebg:focus:before {
|
||||
background: #7F5006!important;
|
||||
}
|
||||
|
||||
.greenbg {
|
||||
background: #2ECC71!important;
|
||||
}
|
||||
.greenbg:hover:after,
|
||||
.greenbg:focus:after,
|
||||
.greenbg:hover:before,
|
||||
.greenbg:focus:before {
|
||||
background: #176437!important;
|
||||
}
|
||||
|
||||
.darkbluebg {
|
||||
background: #34495E!important;
|
||||
}
|
||||
.darkbluebg:hover:after,
|
||||
.darkbluebg:focus:after,
|
||||
.darkbluebg:hover:before,
|
||||
.darkbluebg:focus:before {
|
||||
background: #07090C!important;
|
||||
}
|
||||
|
||||
.lightbluebg {
|
||||
background: #6A93D4!important;
|
||||
}
|
||||
.lightbluebg:hover:after,
|
||||
.lightbluebg:focus:after,
|
||||
.lightbluebg:hover:before,
|
||||
.lightbluebg:focus:before {
|
||||
background: #2B5394!important;
|
||||
}
|
||||
|
||||
.yellowbg {
|
||||
background: #F1C40F!important;
|
||||
}
|
||||
.yellowbg:hover:after,
|
||||
.yellowbg:focus:after,
|
||||
.yellowbg:hover:before,
|
||||
.yellowbg:focus:before {
|
||||
background: #796307!important;
|
||||
}
|
||||
|
||||
|
||||
.lightpinkbg {
|
||||
background: #F76F87!important;
|
||||
}
|
||||
.lightpinkbg:hover:after,
|
||||
.lightpinkbg:focus:after,
|
||||
.lightpinkbg:hover:before,
|
||||
.lightpinkbg:focus:before {
|
||||
background: #DA0C31!important;
|
||||
}
|
||||
|
||||
/* Following colors are not used yet */
|
||||
.pinkbg {
|
||||
background: #D66D92!important;
|
||||
}
|
||||
.pinkbg:hover:after,
|
||||
.pinkbg:focus:after,
|
||||
.pinkbg:hover:before,
|
||||
.pinkbg:focus:before {
|
||||
background: #992B52!important;
|
||||
}
|
||||
|
||||
.turquoisebg {
|
||||
background: #1ABC9C!important;
|
||||
}
|
||||
.turquoisebg:hover:after,
|
||||
.turquoisebg:focus:after,
|
||||
.turquoisebg:hover:before,
|
||||
.turquoisebg:focus:before {
|
||||
background: #0B4C3F!important;
|
||||
}
|
||||
.lightyellow {
|
||||
background: #FFC973!important;
|
||||
}
|
||||
.lightyellow:hover:after,
|
||||
.lightyellow:focus:after,
|
||||
.lightyellow:hover:before,
|
||||
.lightyellow:focus:before {
|
||||
background: #F39500!important;
|
||||
}
|
||||
.lightgreen {
|
||||
background: #B5F36D!important;
|
||||
}
|
||||
.lightgreen:hover:after,
|
||||
.lightgreen:focus:after,
|
||||
.lightgreen:hover:before,
|
||||
.lightgreen:focus:before {
|
||||
background: #77CF11!important;
|
||||
}
|
||||
.purpledarkbg {
|
||||
background: #8E44AD!important;
|
||||
}
|
||||
.purpledarkbg:hover:after,
|
||||
.purpledarkbg:focus:after,
|
||||
.purpledarkbg:hover:before,
|
||||
.purpledarkbg:focus:before {
|
||||
background: #432051!important;
|
||||
}
|
40
portal/assets/themes/default/custom_portal.js
Normal file
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
===============================================================================
|
||||
This JS file may be used to customize the YunoHost user portal *and* also
|
||||
will be loaded in all app pages if the app nginx's conf does include the
|
||||
appropriate snippet.
|
||||
|
||||
You can monkeypatch init_portal (loading of the user portal) and
|
||||
init_portal_button_and_overlay (loading of the button and overlay...) to do
|
||||
custom stuff
|
||||
===============================================================================
|
||||
*/
|
||||
|
||||
var app_tile_colors = ['redbg','purpledarkbg','darkbluebg','orangebg','greenbg', 'yellowbg','lightpinkbg','pinkbg','turquoisebg','lightbluebg', 'bluebg'];
|
||||
|
||||
function set_app_tile_style(el)
|
||||
{
|
||||
// Select a color value from the App label
|
||||
randomColorNumber = parseInt(el.textContent, 36) % app_tile_colors.length;
|
||||
// Add color class.
|
||||
el.classList.add(app_tile_colors[randomColorNumber]);
|
||||
}
|
||||
|
||||
// Monkeypatch init_portal to customize the app tile style
|
||||
init_portal_original = init_portal;
|
||||
init_portal = function()
|
||||
{
|
||||
init_portal_original();
|
||||
Array.each(document.getElementsByClassName("app-tile"), set_app_tile_style);
|
||||
}
|
||||
|
||||
/*
|
||||
* Monkey patching example to do custom stuff when loading inside an app
|
||||
*
|
||||
init_portal_button_and_overlay_original = init_portal_button_and_overlay;
|
||||
init_portal_button_and_overlay = function()
|
||||
{
|
||||
init_portal_button_and_overlay_original();
|
||||
// Custom stuff to do when loading inside an app
|
||||
}
|
||||
*/
|
26
portal/assets/themes/light/custom_overlay.css
Normal file
|
@ -0,0 +1,26 @@
|
|||
/*
|
||||
===============================================================================
|
||||
This file may contain extra CSS rules loaded on all apps page (*if* the app
|
||||
nginx's conf does include the appropriate snippet) for the small YunoHost
|
||||
button in bottom-right corner + portal overlay.
|
||||
|
||||
The yunohost button corresponds to : #ynh-overlay-switch
|
||||
The yunohost portal overlay / iframe corresponds to : #ynh-overlay
|
||||
|
||||
BE CAREFUL that you should *not* add too-general rules that apply to
|
||||
non-yunohost elements (for instance all 'a' or 'p' elements...) as it will
|
||||
likely break app's rendering
|
||||
===============================================================================
|
||||
*/
|
||||
|
||||
#ynh-overlay-switch {
|
||||
/* FIXME : idk if this is an issue or not to have /yunohost/sso hard-coded here */
|
||||
background-image: url("/yunohost/sso/assets/img/logo-ynh.svg");
|
||||
border-color: #eee;
|
||||
background-color: #eee;
|
||||
}
|
||||
|
||||
#ynh-overlay-switch:hover {
|
||||
border-color: #ccc;
|
||||
background-color: #ccc;
|
||||
}
|
179
portal/assets/themes/light/custom_portal.css
Normal file
|
@ -0,0 +1,179 @@
|
|||
/*
|
||||
===============================================================================
|
||||
This file contain extra CSS rules to customize the YunoHost user portal and
|
||||
can be used to customize app tiles, buttons, etc...
|
||||
===============================================================================
|
||||
*/
|
||||
|
||||
body {
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
#ynh-logo {
|
||||
background-image: url("../../img/logo-ynh.svg");
|
||||
}
|
||||
|
||||
.login-form .form-group {
|
||||
border: 1px solid #bbb;
|
||||
}
|
||||
|
||||
.user-container,
|
||||
.user-menu a,
|
||||
.link-btn,
|
||||
.footer a {
|
||||
color: #555;
|
||||
}
|
||||
|
||||
.user-menu a:hover,
|
||||
.footer a:hover {
|
||||
color: #000;
|
||||
}
|
||||
|
||||
.form-text:disabled:hover {
|
||||
background: #797b83;
|
||||
}
|
||||
|
||||
.link-btn,
|
||||
.link-btn:hover {
|
||||
background: none;
|
||||
}
|
||||
|
||||
|
||||
.bluebg {
|
||||
background: #3498DB!important;
|
||||
}
|
||||
.bluebg:hover:after,
|
||||
.bluebg:focus:after,
|
||||
.bluebg:hover:before,
|
||||
.bluebg:focus:before {
|
||||
background: #16527A!important;
|
||||
}
|
||||
|
||||
.purplebg {
|
||||
background: #9B59B6!important;
|
||||
}
|
||||
.purplebg:hover:after,
|
||||
.purplebg:focus:after,
|
||||
.purplebg:hover:before,
|
||||
.purplebg:focus:before {
|
||||
background: #532C64!important;
|
||||
}
|
||||
|
||||
.redbg {
|
||||
background: #E74C3C!important;
|
||||
}
|
||||
.redbg:hover:after,
|
||||
.redbg:focus:after,
|
||||
.redbg:hover:before,
|
||||
.redbg:focus:before {
|
||||
background: #921E12!important;
|
||||
}
|
||||
|
||||
.orangebg {
|
||||
background: #F39C12!important;
|
||||
}
|
||||
.orangebg:hover:after,
|
||||
.orangebg:focus:after,
|
||||
.orangebg:hover:before,
|
||||
.orangebg:focus:before {
|
||||
background: #7F5006!important;
|
||||
}
|
||||
|
||||
.greenbg {
|
||||
background: #2ECC71!important;
|
||||
}
|
||||
.greenbg:hover:after,
|
||||
.greenbg:focus:after,
|
||||
.greenbg:hover:before,
|
||||
.greenbg:focus:before {
|
||||
background: #176437!important;
|
||||
}
|
||||
|
||||
.darkbluebg {
|
||||
background: #34495E!important;
|
||||
}
|
||||
.darkbluebg:hover:after,
|
||||
.darkbluebg:focus:after,
|
||||
.darkbluebg:hover:before,
|
||||
.darkbluebg:focus:before {
|
||||
background: #07090C!important;
|
||||
}
|
||||
|
||||
.lightbluebg {
|
||||
background: #6A93D4!important;
|
||||
}
|
||||
.lightbluebg:hover:after,
|
||||
.lightbluebg:focus:after,
|
||||
.lightbluebg:hover:before,
|
||||
.lightbluebg:focus:before {
|
||||
background: #2B5394!important;
|
||||
}
|
||||
|
||||
.yellowbg {
|
||||
background: #F1C40F!important;
|
||||
}
|
||||
.yellowbg:hover:after,
|
||||
.yellowbg:focus:after,
|
||||
.yellowbg:hover:before,
|
||||
.yellowbg:focus:before {
|
||||
background: #796307!important;
|
||||
}
|
||||
|
||||
|
||||
.lightpinkbg {
|
||||
background: #F76F87!important;
|
||||
}
|
||||
.lightpinkbg:hover:after,
|
||||
.lightpinkbg:focus:after,
|
||||
.lightpinkbg:hover:before,
|
||||
.lightpinkbg:focus:before {
|
||||
background: #DA0C31!important;
|
||||
}
|
||||
|
||||
/* Following colors are not used yet */
|
||||
.pinkbg {
|
||||
background: #D66D92!important;
|
||||
}
|
||||
.pinkbg:hover:after,
|
||||
.pinkbg:focus:after,
|
||||
.pinkbg:hover:before,
|
||||
.pinkbg:focus:before {
|
||||
background: #992B52!important;
|
||||
}
|
||||
|
||||
.turquoisebg {
|
||||
background: #1ABC9C!important;
|
||||
}
|
||||
.turquoisebg:hover:after,
|
||||
.turquoisebg:focus:after,
|
||||
.turquoisebg:hover:before,
|
||||
.turquoisebg:focus:before {
|
||||
background: #0B4C3F!important;
|
||||
}
|
||||
.lightyellow {
|
||||
background: #FFC973!important;
|
||||
}
|
||||
.lightyellow:hover:after,
|
||||
.lightyellow:focus:after,
|
||||
.lightyellow:hover:before,
|
||||
.lightyellow:focus:before {
|
||||
background: #F39500!important;
|
||||
}
|
||||
.lightgreen {
|
||||
background: #B5F36D!important;
|
||||
}
|
||||
.lightgreen:hover:after,
|
||||
.lightgreen:focus:after,
|
||||
.lightgreen:hover:before,
|
||||
.lightgreen:focus:before {
|
||||
background: #77CF11!important;
|
||||
}
|
||||
.purpledarkbg {
|
||||
background: #8E44AD!important;
|
||||
}
|
||||
.purpledarkbg:hover:after,
|
||||
.purpledarkbg:focus:after,
|
||||
.purpledarkbg:hover:before,
|
||||
.purpledarkbg:focus:before {
|
||||
background: #432051!important;
|
||||
}
|
40
portal/assets/themes/light/custom_portal.js
Normal file
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
===============================================================================
|
||||
This JS file may be used to customize the YunoHost user portal *and* also
|
||||
will be loaded in all app pages if the app nginx's conf does include the
|
||||
appropriate snippet.
|
||||
|
||||
You can monkeypatch init_portal (loading of the user portal) and
|
||||
init_portal_button_and_overlay (loading of the button and overlay...) to do
|
||||
custom stuff
|
||||
===============================================================================
|
||||
*/
|
||||
|
||||
var app_tile_colors = ['redbg','purpledarkbg','darkbluebg','orangebg','greenbg', 'yellowbg','lightpinkbg','pinkbg','turquoisebg','lightbluebg', 'bluebg'];
|
||||
|
||||
function set_app_tile_style(el)
|
||||
{
|
||||
// Select a color value from the App label
|
||||
randomColorNumber = parseInt(el.textContent, 36) % app_tile_colors.length;
|
||||
// Add color class.
|
||||
el.classList.add(app_tile_colors[randomColorNumber]);
|
||||
}
|
||||
|
||||
// Monkeypatch init_portal to customize the app tile style
|
||||
init_portal_original = init_portal;
|
||||
init_portal = function()
|
||||
{
|
||||
init_portal_original();
|
||||
Array.each(document.getElementsByClassName("app-tile"), set_app_tile_style);
|
||||
}
|
||||
|
||||
/*
|
||||
* Monkey patching example to do custom stuff when loading inside an app
|
||||
*
|
||||
init_portal_button_and_overlay_original = init_portal_button_and_overlay;
|
||||
init_portal_button_and_overlay = function()
|
||||
{
|
||||
init_portal_button_and_overlay_original();
|
||||
// Custom stuff to do when loading inside an app
|
||||
}
|
||||
*/
|
14
portal/assets/themes/random/custom_overlay.css
Normal file
|
@ -0,0 +1,14 @@
|
|||
/*
|
||||
===============================================================================
|
||||
This file may contain extra CSS rules loaded on all apps page (*if* the app
|
||||
nginx's conf does include the appropriate snippet) for the small YunoHost
|
||||
button in bottom-right corner + portal overlay.
|
||||
|
||||
The yunohost button corresponds to : #ynh-overlay-switch
|
||||
The yunohost portal overlay / iframe corresponds to : #ynh-overlay
|
||||
|
||||
BE CAREFUL that you should *not* add too-general rules that apply to
|
||||
non-yunohost elements (for instance all 'a' or 'p' elements...) as it will
|
||||
likely break app's rendering
|
||||
===============================================================================
|
||||
*/
|
13
portal/assets/themes/random/custom_portal.css
Normal file
|
@ -0,0 +1,13 @@
|
|||
/*
|
||||
===============================================================================
|
||||
This file contain extra CSS rules to customize the YunoHost user portal and
|
||||
can be used to customize app tiles, buttons, etc...
|
||||
===============================================================================
|
||||
*/
|
||||
|
||||
.app-tile:focus:after,
|
||||
.app-tile:hover:after,
|
||||
.app-tile:focus:before,
|
||||
.app-tile:hover:before {
|
||||
background:var(--background-color, red) !important;
|
||||
}
|
145
portal/assets/themes/random/custom_portal.js
Normal file
|
@ -0,0 +1,145 @@
|
|||
/*
|
||||
===============================================================================
|
||||
This JS file may be used to customize the YunoHost user portal *and* also
|
||||
will be loaded in all app pages if the app nginx's conf does include the
|
||||
appropriate snippet.
|
||||
|
||||
You can monkeypatch init_portal (loading of the user portal) and
|
||||
init_portal_button_and_overlay (loading of the button and overlay...) to do
|
||||
custom stuff
|
||||
===============================================================================
|
||||
*/
|
||||
|
||||
var ynhLib = {
|
||||
|
||||
//
|
||||
// RANDOMIZATION UTILITIES
|
||||
|
||||
random: {
|
||||
integer: function(min, max){
|
||||
return Math.floor(Math.random() * (max - min + 1)) + min;
|
||||
},
|
||||
number: function (min, max) {
|
||||
return Math.random() * (max - min) + min;
|
||||
},
|
||||
entry: function (array) {
|
||||
return array[ynhLib.random.integer(0, array.length-1)];
|
||||
},
|
||||
rgbInteger: function () { return ynhLib.random.integer(0,255); },
|
||||
// generate random rgba color
|
||||
color: function (transparency) {
|
||||
// transparency
|
||||
var transparency;
|
||||
if (transparency === null || transparency === false) transparency = 1
|
||||
else if (typeof transparency == "number") transparency = transparency
|
||||
else transparency = ynhLib.random.number (0,1);
|
||||
// random color
|
||||
return [ ynhLib.random.rgbInteger(), ynhLib.random.rgbInteger(), ynhLib.random.rgbInteger(), transparency ];
|
||||
},
|
||||
},
|
||||
|
||||
//
|
||||
// COLOR HANDLING UTILITIES
|
||||
|
||||
color: {
|
||||
|
||||
// rgbColor <[number, number, number(, number)]>
|
||||
toCSS: function (rgbColor) {
|
||||
// rgba color
|
||||
if (rgbColor.length == 4) return "rgba("+ rgbColor[0] +","+ rgbColor[1] +","+ rgbColor[2] +","+ rgbColor[3] +")"
|
||||
// rgb color
|
||||
else return "rgb("+ rgbColor[0] +","+ rgbColor[1] +","+ rgbColor[2] +")";
|
||||
},
|
||||
|
||||
// Luminosity function adpated from color library: https://github.com/Qix-/color
|
||||
// rgbColor <[number, number, number]>
|
||||
luminosity: function (rgbColor) {
|
||||
// http://www.w3.org/TR/WCAG20/#relativeluminancedef
|
||||
|
||||
var lum = [];
|
||||
for (var i = 0; i < rgbColor.length; i++) {
|
||||
var chan = rgbColor[i] / 255;
|
||||
lum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4);
|
||||
}
|
||||
|
||||
return 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2];
|
||||
},
|
||||
|
||||
// color <[number, number, number]>
|
||||
getContrastColor: function (color) {
|
||||
var light = "white", dark = "black";
|
||||
return ynhLib.color.luminosity(color) > 0.5 ? dark : light;
|
||||
},
|
||||
|
||||
},
|
||||
|
||||
//
|
||||
// UTILITIES
|
||||
|
||||
queue: function (queueTo, queue) {
|
||||
if (typeof queueTo != 'function') var fullQueue = queue
|
||||
else if (typeof queue != 'function') var fullQueue = queueTo
|
||||
else var fullQueue = function () {
|
||||
queueTo.apply(this, arguments);
|
||||
queue.apply(this, arguments);
|
||||
};
|
||||
return fullQueue;
|
||||
},
|
||||
|
||||
//
|
||||
// SET APP ICON STYLE
|
||||
|
||||
set_app_tile_style: function (el) {
|
||||
var appColor = ynhLib.random.color();
|
||||
var appContrastColor = ynhLib.color.getContrastColor(appColor);
|
||||
var style = 'background-color:'+ ynhLib.color.toCSS(appColor) +' !important; color:'+ appContrastColor +' !important; --background-color:'+ ynhLib.color.toCSS(appColor);
|
||||
el.setAttribute("style", style);
|
||||
},
|
||||
|
||||
//
|
||||
// LOGO CUSTOMIZATION
|
||||
|
||||
logo: {
|
||||
|
||||
availableColors: ["cyan", "fushia", "green", "orange", "pink", "purple", "red", "yellow"],
|
||||
makeLogoStyleString: function () {
|
||||
return 'background-image: url("/yunohost/sso/assets/themes/random/logo/'+ ynhLib.random.entry(ynhLib.logo.availableColors) +'.svg")';
|
||||
},
|
||||
|
||||
},
|
||||
|
||||
};
|
||||
|
||||
// ######################################################################
|
||||
// ######################################################################
|
||||
|
||||
/* Monkeypatch init_portal to customize the app tile style */
|
||||
init_portal_original = init_portal;
|
||||
init_portal = function()
|
||||
{
|
||||
init_portal_original();
|
||||
|
||||
// set apps colors
|
||||
Array.each(document.getElementsByClassName("app-tile"), ynhLib.set_app_tile_style);
|
||||
|
||||
// log color css string
|
||||
var chosenLogoStyleString = ynhLib.logo.makeLogoStyleString();
|
||||
|
||||
// set logo color in portal
|
||||
var ynhLogo = document.getElementById("ynh-logo");
|
||||
if (ynhLogo) ynhLogo.setAttribute("style", chosenLogoStyleString);
|
||||
}
|
||||
|
||||
/*Monkey patching example to do custom stuff when loading inside an app */
|
||||
init_portal_button_and_overlay_original = init_portal_button_and_overlay;
|
||||
init_portal_button_and_overlay = function()
|
||||
{
|
||||
init_portal_button_and_overlay_original();
|
||||
|
||||
// log color css string
|
||||
var chosenLogoStyleString = ynhLib.logo.makeLogoStyleString();
|
||||
|
||||
// set overlay switch color in apps (NOTE: this is not always working, there is probably a problem of loading order)
|
||||
var overlaySwitch = document.getElementById("ynh-overlay-switch");
|
||||
if (overlaySwitch) overlaySwitch.setAttribute("style", chosenLogoStyleString);
|
||||
}
|
74
portal/assets/themes/random/logo/cyan.svg
Normal file
|
@ -0,0 +1,74 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.1"
|
||||
x="0px"
|
||||
y="0px"
|
||||
width="98px"
|
||||
height="85px"
|
||||
viewBox="-0.25 -0.25 98 85"
|
||||
overflow="visible"
|
||||
enable-background="new -0.25 -0.25 98 85"
|
||||
xml:space="preserve"
|
||||
id="svg2"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="cyan.svg"><metadata
|
||||
id="metadata22"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1280"
|
||||
inkscape:window-height="782"
|
||||
id="namedview20"
|
||||
showgrid="false"
|
||||
inkscape:zoom="2.7764706"
|
||||
inkscape:cx="-68.415254"
|
||||
inkscape:cy="42.5"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="18"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg2" /><defs
|
||||
id="defs4" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M97,51c-2.02,4.98-8.33,5.67-14,7c-0.609,6.29,3.05,10.95-1,16c-6.41-0.26-7.471-5.859-7-13c-1,0-2,0-3,0 c-2.09,2.77,0.9,4.52,0,8c-1.12,4.34-7.88,7.91-11,7c-2.18-0.641-5.96-6.63-5-12c2.82-2.71,2.76,3.12,6,3c5.05-7.84-9.63-8.55-8-17 c1.24-6.42,11.66-9.66,15-1c1.54,4.21-5.17,0.16-5,3c-0.279,1.62,0.95,1.72,1,3c2.52,0.77,1.68-2.16,3-3c1.859-1.17,3.09-0.75,6-1 c2.45-2.55,1.08-8.92,4-11c3.87,0.46,6.08,2.59,6,7C91.01,46.109,94.3,46.05,97,51z"
|
||||
id="path6"
|
||||
style="fill:#00cfff;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M87,13c0.609,3.21,2.32,4.98,2,8c-0.34,3.21-2.9,8.83-4,9c-1.17,0.18-1.34,1.78-2,2 c-4.66,1.57-12.391-1.48-14-7c-1.16-3.97,1.9-13.37,4-17c1.3-2.25,1.221-2.99,5-4c2.41-0.65,3.65-2.25,6,0 c0.471,0.45,1.3,0.49,1.85,0.89c-0.199,0,2,3.14,2.15,4.11C88.32,11.07,86.77,11.78,87,13z M79,22c1.779-1.89,3.29-4.04,3-8 C77.49,12.33,74.67,21.3,79,22z"
|
||||
id="path8"
|
||||
style="fill:#00cfff;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M67,21c-0.07,5.81,2.48,10.7,0,15c-6.73,1.06-7.24-4.1-11-6c-1.939,1.39-1.49,5.18-3,7 c-3.78,0.44-4.69-1.97-7-3c2.47-7.81,1.26-18.98,2-26c8.58-0.58,7.68,8.32,12,12c0.52-4.34-0.359-15.52,3-20 C70.33,3.29,67.09,12.99,67,21z"
|
||||
id="path10"
|
||||
style="fill:#00cfff;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M52,55c1.93,8.41,0.12,22.689-12,20c-1.59-0.35-8.42-5.22-9-7c-1.62-5,0.34-13.34,3-16 C39.03,46.97,45.48,50.359,52,55z M39,66c4.55,0.96,6.3-4.2,4-7C39.37,59.03,38.61,61.939,39,66z"
|
||||
id="path12"
|
||||
style="fill:#00cfff;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M39,8c5.58,0.9,6.4,6.81,5,15c-1.43,8.38-3.02,14.59-9,15c-9.57,0.65-12.25-16.69-9-29 c8.32,1.27,6.59,10.36,6,17c2.71,0.83,2.2-0.85,3-2C37.05,21.04,37.82,13.61,39,8z"
|
||||
id="path14"
|
||||
style="fill:#00cfff;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M28,62c0.1,5.67,4.4,11.33,2,17c-4.32-1.01-6.57-4.09-9-7c-3.15-0.48-2.26,3.07-6,2 c-0.67,5.061,2.29,7.57-1,10c-4.7-0.63-6.66-4-8-8c-2.61-1.38-5.48-2.52-6-6c0.14-3.53,4.48-2.85,7-4c0.47-5.53-1.41-13.41,2-16 c8.31,0.49,8.21,7.13,7,15c4.36,0.29,4.94-4.35,5-7c0.06-2.43-1.82-8.26,2-11c3.06-0.73,2.94,1.73,6,1 C32.35,52.7,27.92,57.439,28,62z"
|
||||
id="path16"
|
||||
style="fill:#00cfff;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M24,12c1.07,7.07-3.86,8.14-6,12c0.21,6.88-0.47,12.86-2,18c-5.86-1.32-8.7-10.38-6-17 c-0.33-3.52-5.26-4.22-7-8c-0.3-0.66-0.47-4.43-1-7C1.09,5.63,0.55,4.31,3,1c8.16-0.49,7.21,8.13,9,14c5.05,0.39,3.91-5.42,8-6 C20.98,10.35,22.67,11,24,12z"
|
||||
id="path18"
|
||||
style="fill:#00cfff;fill-opacity:1" /></svg>
|
After Width: | Height: | Size: 4.1 KiB |
74
portal/assets/themes/random/logo/fushia.svg
Normal file
|
@ -0,0 +1,74 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.1"
|
||||
x="0px"
|
||||
y="0px"
|
||||
width="98px"
|
||||
height="85px"
|
||||
viewBox="-0.25 -0.25 98 85"
|
||||
overflow="visible"
|
||||
enable-background="new -0.25 -0.25 98 85"
|
||||
xml:space="preserve"
|
||||
id="svg2"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="ynhlogo-fushia.svg"><metadata
|
||||
id="metadata22"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1280"
|
||||
inkscape:window-height="782"
|
||||
id="namedview20"
|
||||
showgrid="false"
|
||||
inkscape:zoom="2.7764706"
|
||||
inkscape:cx="1.4576271"
|
||||
inkscape:cy="42.5"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="18"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg2" /><defs
|
||||
id="defs4" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M97,51c-2.02,4.98-8.33,5.67-14,7c-0.609,6.29,3.05,10.95-1,16c-6.41-0.26-7.471-5.859-7-13c-1,0-2,0-3,0 c-2.09,2.77,0.9,4.52,0,8c-1.12,4.34-7.88,7.91-11,7c-2.18-0.641-5.96-6.63-5-12c2.82-2.71,2.76,3.12,6,3c5.05-7.84-9.63-8.55-8-17 c1.24-6.42,11.66-9.66,15-1c1.54,4.21-5.17,0.16-5,3c-0.279,1.62,0.95,1.72,1,3c2.52,0.77,1.68-2.16,3-3c1.859-1.17,3.09-0.75,6-1 c2.45-2.55,1.08-8.92,4-11c3.87,0.46,6.08,2.59,6,7C91.01,46.109,94.3,46.05,97,51z"
|
||||
id="path6"
|
||||
style="fill:#ee0abd;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M87,13c0.609,3.21,2.32,4.98,2,8c-0.34,3.21-2.9,8.83-4,9c-1.17,0.18-1.34,1.78-2,2 c-4.66,1.57-12.391-1.48-14-7c-1.16-3.97,1.9-13.37,4-17c1.3-2.25,1.221-2.99,5-4c2.41-0.65,3.65-2.25,6,0 c0.471,0.45,1.3,0.49,1.85,0.89c-0.199,0,2,3.14,2.15,4.11C88.32,11.07,86.77,11.78,87,13z M79,22c1.779-1.89,3.29-4.04,3-8 C77.49,12.33,74.67,21.3,79,22z"
|
||||
id="path8"
|
||||
style="fill:#ee0abd;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M67,21c-0.07,5.81,2.48,10.7,0,15c-6.73,1.06-7.24-4.1-11-6c-1.939,1.39-1.49,5.18-3,7 c-3.78,0.44-4.69-1.97-7-3c2.47-7.81,1.26-18.98,2-26c8.58-0.58,7.68,8.32,12,12c0.52-4.34-0.359-15.52,3-20 C70.33,3.29,67.09,12.99,67,21z"
|
||||
id="path10"
|
||||
style="fill:#ee0abd;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M52,55c1.93,8.41,0.12,22.689-12,20c-1.59-0.35-8.42-5.22-9-7c-1.62-5,0.34-13.34,3-16 C39.03,46.97,45.48,50.359,52,55z M39,66c4.55,0.96,6.3-4.2,4-7C39.37,59.03,38.61,61.939,39,66z"
|
||||
id="path12"
|
||||
style="fill:#ee0abd;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M39,8c5.58,0.9,6.4,6.81,5,15c-1.43,8.38-3.02,14.59-9,15c-9.57,0.65-12.25-16.69-9-29 c8.32,1.27,6.59,10.36,6,17c2.71,0.83,2.2-0.85,3-2C37.05,21.04,37.82,13.61,39,8z"
|
||||
id="path14"
|
||||
style="fill:#ee0abd;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M28,62c0.1,5.67,4.4,11.33,2,17c-4.32-1.01-6.57-4.09-9-7c-3.15-0.48-2.26,3.07-6,2 c-0.67,5.061,2.29,7.57-1,10c-4.7-0.63-6.66-4-8-8c-2.61-1.38-5.48-2.52-6-6c0.14-3.53,4.48-2.85,7-4c0.47-5.53-1.41-13.41,2-16 c8.31,0.49,8.21,7.13,7,15c4.36,0.29,4.94-4.35,5-7c0.06-2.43-1.82-8.26,2-11c3.06-0.73,2.94,1.73,6,1 C32.35,52.7,27.92,57.439,28,62z"
|
||||
id="path16"
|
||||
style="fill:#ee0abd;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M24,12c1.07,7.07-3.86,8.14-6,12c0.21,6.88-0.47,12.86-2,18c-5.86-1.32-8.7-10.38-6-17 c-0.33-3.52-5.26-4.22-7-8c-0.3-0.66-0.47-4.43-1-7C1.09,5.63,0.55,4.31,3,1c8.16-0.49,7.21,8.13,9,14c5.05,0.39,3.91-5.42,8-6 C20.98,10.35,22.67,11,24,12z"
|
||||
id="path18"
|
||||
style="fill:#ee0abd;fill-opacity:1" /></svg>
|
After Width: | Height: | Size: 4.1 KiB |
74
portal/assets/themes/random/logo/green.svg
Normal file
|
@ -0,0 +1,74 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.1"
|
||||
x="0px"
|
||||
y="0px"
|
||||
width="98px"
|
||||
height="85px"
|
||||
viewBox="-0.25 -0.25 98 85"
|
||||
overflow="visible"
|
||||
enable-background="new -0.25 -0.25 98 85"
|
||||
xml:space="preserve"
|
||||
id="svg2"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="green.svg"><metadata
|
||||
id="metadata22"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1280"
|
||||
inkscape:window-height="782"
|
||||
id="namedview20"
|
||||
showgrid="false"
|
||||
inkscape:zoom="2.7764706"
|
||||
inkscape:cx="-57.61017"
|
||||
inkscape:cy="42.5"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="18"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg2" /><defs
|
||||
id="defs4" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M97,51c-2.02,4.98-8.33,5.67-14,7c-0.609,6.29,3.05,10.95-1,16c-6.41-0.26-7.471-5.859-7-13c-1,0-2,0-3,0 c-2.09,2.77,0.9,4.52,0,8c-1.12,4.34-7.88,7.91-11,7c-2.18-0.641-5.96-6.63-5-12c2.82-2.71,2.76,3.12,6,3c5.05-7.84-9.63-8.55-8-17 c1.24-6.42,11.66-9.66,15-1c1.54,4.21-5.17,0.16-5,3c-0.279,1.62,0.95,1.72,1,3c2.52,0.77,1.68-2.16,3-3c1.859-1.17,3.09-0.75,6-1 c2.45-2.55,1.08-8.92,4-11c3.87,0.46,6.08,2.59,6,7C91.01,46.109,94.3,46.05,97,51z"
|
||||
id="path6"
|
||||
style="fill:#3aff00;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M87,13c0.609,3.21,2.32,4.98,2,8c-0.34,3.21-2.9,8.83-4,9c-1.17,0.18-1.34,1.78-2,2 c-4.66,1.57-12.391-1.48-14-7c-1.16-3.97,1.9-13.37,4-17c1.3-2.25,1.221-2.99,5-4c2.41-0.65,3.65-2.25,6,0 c0.471,0.45,1.3,0.49,1.85,0.89c-0.199,0,2,3.14,2.15,4.11C88.32,11.07,86.77,11.78,87,13z M79,22c1.779-1.89,3.29-4.04,3-8 C77.49,12.33,74.67,21.3,79,22z"
|
||||
id="path8"
|
||||
style="fill:#3aff00;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M67,21c-0.07,5.81,2.48,10.7,0,15c-6.73,1.06-7.24-4.1-11-6c-1.939,1.39-1.49,5.18-3,7 c-3.78,0.44-4.69-1.97-7-3c2.47-7.81,1.26-18.98,2-26c8.58-0.58,7.68,8.32,12,12c0.52-4.34-0.359-15.52,3-20 C70.33,3.29,67.09,12.99,67,21z"
|
||||
id="path10"
|
||||
style="fill:#3aff00;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M52,55c1.93,8.41,0.12,22.689-12,20c-1.59-0.35-8.42-5.22-9-7c-1.62-5,0.34-13.34,3-16 C39.03,46.97,45.48,50.359,52,55z M39,66c4.55,0.96,6.3-4.2,4-7C39.37,59.03,38.61,61.939,39,66z"
|
||||
id="path12"
|
||||
style="fill:#3aff00;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M39,8c5.58,0.9,6.4,6.81,5,15c-1.43,8.38-3.02,14.59-9,15c-9.57,0.65-12.25-16.69-9-29 c8.32,1.27,6.59,10.36,6,17c2.71,0.83,2.2-0.85,3-2C37.05,21.04,37.82,13.61,39,8z"
|
||||
id="path14"
|
||||
style="fill:#3aff00;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M28,62c0.1,5.67,4.4,11.33,2,17c-4.32-1.01-6.57-4.09-9-7c-3.15-0.48-2.26,3.07-6,2 c-0.67,5.061,2.29,7.57-1,10c-4.7-0.63-6.66-4-8-8c-2.61-1.38-5.48-2.52-6-6c0.14-3.53,4.48-2.85,7-4c0.47-5.53-1.41-13.41,2-16 c8.31,0.49,8.21,7.13,7,15c4.36,0.29,4.94-4.35,5-7c0.06-2.43-1.82-8.26,2-11c3.06-0.73,2.94,1.73,6,1 C32.35,52.7,27.92,57.439,28,62z"
|
||||
id="path16"
|
||||
style="fill:#3aff00;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M24,12c1.07,7.07-3.86,8.14-6,12c0.21,6.88-0.47,12.86-2,18c-5.86-1.32-8.7-10.38-6-17 c-0.33-3.52-5.26-4.22-7-8c-0.3-0.66-0.47-4.43-1-7C1.09,5.63,0.55,4.31,3,1c8.16-0.49,7.21,8.13,9,14c5.05,0.39,3.91-5.42,8-6 C20.98,10.35,22.67,11,24,12z"
|
||||
id="path18"
|
||||
style="fill:#3aff00;fill-opacity:1" /></svg>
|
After Width: | Height: | Size: 4.1 KiB |
74
portal/assets/themes/random/logo/orange.svg
Normal file
|
@ -0,0 +1,74 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.1"
|
||||
x="0px"
|
||||
y="0px"
|
||||
width="98px"
|
||||
height="85px"
|
||||
viewBox="-0.25 -0.25 98 85"
|
||||
overflow="visible"
|
||||
enable-background="new -0.25 -0.25 98 85"
|
||||
xml:space="preserve"
|
||||
id="svg2"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="orange.svg"><metadata
|
||||
id="metadata22"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1280"
|
||||
inkscape:window-height="782"
|
||||
id="namedview20"
|
||||
showgrid="false"
|
||||
inkscape:zoom="2.7764706"
|
||||
inkscape:cx="-9.7076271"
|
||||
inkscape:cy="42.5"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="18"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg2" /><defs
|
||||
id="defs4" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M97,51c-2.02,4.98-8.33,5.67-14,7c-0.609,6.29,3.05,10.95-1,16c-6.41-0.26-7.471-5.859-7-13c-1,0-2,0-3,0 c-2.09,2.77,0.9,4.52,0,8c-1.12,4.34-7.88,7.91-11,7c-2.18-0.641-5.96-6.63-5-12c2.82-2.71,2.76,3.12,6,3c5.05-7.84-9.63-8.55-8-17 c1.24-6.42,11.66-9.66,15-1c1.54,4.21-5.17,0.16-5,3c-0.279,1.62,0.95,1.72,1,3c2.52,0.77,1.68-2.16,3-3c1.859-1.17,3.09-0.75,6-1 c2.45-2.55,1.08-8.92,4-11c3.87,0.46,6.08,2.59,6,7C91.01,46.109,94.3,46.05,97,51z"
|
||||
id="path6"
|
||||
style="fill:#ffbd00;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M87,13c0.609,3.21,2.32,4.98,2,8c-0.34,3.21-2.9,8.83-4,9c-1.17,0.18-1.34,1.78-2,2 c-4.66,1.57-12.391-1.48-14-7c-1.16-3.97,1.9-13.37,4-17c1.3-2.25,1.221-2.99,5-4c2.41-0.65,3.65-2.25,6,0 c0.471,0.45,1.3,0.49,1.85,0.89c-0.199,0,2,3.14,2.15,4.11C88.32,11.07,86.77,11.78,87,13z M79,22c1.779-1.89,3.29-4.04,3-8 C77.49,12.33,74.67,21.3,79,22z"
|
||||
id="path8"
|
||||
style="fill:#ffbd00;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M67,21c-0.07,5.81,2.48,10.7,0,15c-6.73,1.06-7.24-4.1-11-6c-1.939,1.39-1.49,5.18-3,7 c-3.78,0.44-4.69-1.97-7-3c2.47-7.81,1.26-18.98,2-26c8.58-0.58,7.68,8.32,12,12c0.52-4.34-0.359-15.52,3-20 C70.33,3.29,67.09,12.99,67,21z"
|
||||
id="path10"
|
||||
style="fill:#ffbd00;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M52,55c1.93,8.41,0.12,22.689-12,20c-1.59-0.35-8.42-5.22-9-7c-1.62-5,0.34-13.34,3-16 C39.03,46.97,45.48,50.359,52,55z M39,66c4.55,0.96,6.3-4.2,4-7C39.37,59.03,38.61,61.939,39,66z"
|
||||
id="path12"
|
||||
style="fill:#ffbd00;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M39,8c5.58,0.9,6.4,6.81,5,15c-1.43,8.38-3.02,14.59-9,15c-9.57,0.65-12.25-16.69-9-29 c8.32,1.27,6.59,10.36,6,17c2.71,0.83,2.2-0.85,3-2C37.05,21.04,37.82,13.61,39,8z"
|
||||
id="path14"
|
||||
style="fill:#ffbd00;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M28,62c0.1,5.67,4.4,11.33,2,17c-4.32-1.01-6.57-4.09-9-7c-3.15-0.48-2.26,3.07-6,2 c-0.67,5.061,2.29,7.57-1,10c-4.7-0.63-6.66-4-8-8c-2.61-1.38-5.48-2.52-6-6c0.14-3.53,4.48-2.85,7-4c0.47-5.53-1.41-13.41,2-16 c8.31,0.49,8.21,7.13,7,15c4.36,0.29,4.94-4.35,5-7c0.06-2.43-1.82-8.26,2-11c3.06-0.73,2.94,1.73,6,1 C32.35,52.7,27.92,57.439,28,62z"
|
||||
id="path16"
|
||||
style="fill:#ffbd00;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M24,12c1.07,7.07-3.86,8.14-6,12c0.21,6.88-0.47,12.86-2,18c-5.86-1.32-8.7-10.38-6-17 c-0.33-3.52-5.26-4.22-7-8c-0.3-0.66-0.47-4.43-1-7C1.09,5.63,0.55,4.31,3,1c8.16-0.49,7.21,8.13,9,14c5.05,0.39,3.91-5.42,8-6 C20.98,10.35,22.67,11,24,12z"
|
||||
id="path18"
|
||||
style="fill:#ffbd00;fill-opacity:1" /></svg>
|
After Width: | Height: | Size: 4.1 KiB |
74
portal/assets/themes/random/logo/pink.svg
Normal file
|
@ -0,0 +1,74 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.1"
|
||||
x="0px"
|
||||
y="0px"
|
||||
width="98px"
|
||||
height="85px"
|
||||
viewBox="-0.25 -0.25 98 85"
|
||||
overflow="visible"
|
||||
enable-background="new -0.25 -0.25 98 85"
|
||||
xml:space="preserve"
|
||||
id="svg2"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="pink.svg"><metadata
|
||||
id="metadata22"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1280"
|
||||
inkscape:window-height="782"
|
||||
id="namedview20"
|
||||
showgrid="false"
|
||||
inkscape:zoom="2.7764706"
|
||||
inkscape:cx="-9.7076271"
|
||||
inkscape:cy="42.5"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="18"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg2" /><defs
|
||||
id="defs4" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M97,51c-2.02,4.98-8.33,5.67-14,7c-0.609,6.29,3.05,10.95-1,16c-6.41-0.26-7.471-5.859-7-13c-1,0-2,0-3,0 c-2.09,2.77,0.9,4.52,0,8c-1.12,4.34-7.88,7.91-11,7c-2.18-0.641-5.96-6.63-5-12c2.82-2.71,2.76,3.12,6,3c5.05-7.84-9.63-8.55-8-17 c1.24-6.42,11.66-9.66,15-1c1.54,4.21-5.17,0.16-5,3c-0.279,1.62,0.95,1.72,1,3c2.52,0.77,1.68-2.16,3-3c1.859-1.17,3.09-0.75,6-1 c2.45-2.55,1.08-8.92,4-11c3.87,0.46,6.08,2.59,6,7C91.01,46.109,94.3,46.05,97,51z"
|
||||
id="path6"
|
||||
style="fill:#ffbdff;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M87,13c0.609,3.21,2.32,4.98,2,8c-0.34,3.21-2.9,8.83-4,9c-1.17,0.18-1.34,1.78-2,2 c-4.66,1.57-12.391-1.48-14-7c-1.16-3.97,1.9-13.37,4-17c1.3-2.25,1.221-2.99,5-4c2.41-0.65,3.65-2.25,6,0 c0.471,0.45,1.3,0.49,1.85,0.89c-0.199,0,2,3.14,2.15,4.11C88.32,11.07,86.77,11.78,87,13z M79,22c1.779-1.89,3.29-4.04,3-8 C77.49,12.33,74.67,21.3,79,22z"
|
||||
id="path8"
|
||||
style="fill:#ffbdff;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M67,21c-0.07,5.81,2.48,10.7,0,15c-6.73,1.06-7.24-4.1-11-6c-1.939,1.39-1.49,5.18-3,7 c-3.78,0.44-4.69-1.97-7-3c2.47-7.81,1.26-18.98,2-26c8.58-0.58,7.68,8.32,12,12c0.52-4.34-0.359-15.52,3-20 C70.33,3.29,67.09,12.99,67,21z"
|
||||
id="path10"
|
||||
style="fill:#ffbdff;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M52,55c1.93,8.41,0.12,22.689-12,20c-1.59-0.35-8.42-5.22-9-7c-1.62-5,0.34-13.34,3-16 C39.03,46.97,45.48,50.359,52,55z M39,66c4.55,0.96,6.3-4.2,4-7C39.37,59.03,38.61,61.939,39,66z"
|
||||
id="path12"
|
||||
style="fill:#ffbdff;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M39,8c5.58,0.9,6.4,6.81,5,15c-1.43,8.38-3.02,14.59-9,15c-9.57,0.65-12.25-16.69-9-29 c8.32,1.27,6.59,10.36,6,17c2.71,0.83,2.2-0.85,3-2C37.05,21.04,37.82,13.61,39,8z"
|
||||
id="path14"
|
||||
style="fill:#ffbdff;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M28,62c0.1,5.67,4.4,11.33,2,17c-4.32-1.01-6.57-4.09-9-7c-3.15-0.48-2.26,3.07-6,2 c-0.67,5.061,2.29,7.57-1,10c-4.7-0.63-6.66-4-8-8c-2.61-1.38-5.48-2.52-6-6c0.14-3.53,4.48-2.85,7-4c0.47-5.53-1.41-13.41,2-16 c8.31,0.49,8.21,7.13,7,15c4.36,0.29,4.94-4.35,5-7c0.06-2.43-1.82-8.26,2-11c3.06-0.73,2.94,1.73,6,1 C32.35,52.7,27.92,57.439,28,62z"
|
||||
id="path16"
|
||||
style="fill:#ffbdff;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M24,12c1.07,7.07-3.86,8.14-6,12c0.21,6.88-0.47,12.86-2,18c-5.86-1.32-8.7-10.38-6-17 c-0.33-3.52-5.26-4.22-7-8c-0.3-0.66-0.47-4.43-1-7C1.09,5.63,0.55,4.31,3,1c8.16-0.49,7.21,8.13,9,14c5.05,0.39,3.91-5.42,8-6 C20.98,10.35,22.67,11,24,12z"
|
||||
id="path18"
|
||||
style="fill:#ffbdff;fill-opacity:1" /></svg>
|
After Width: | Height: | Size: 4.1 KiB |
74
portal/assets/themes/random/logo/purple.svg
Normal file
|
@ -0,0 +1,74 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.1"
|
||||
x="0px"
|
||||
y="0px"
|
||||
width="98px"
|
||||
height="85px"
|
||||
viewBox="-0.25 -0.25 98 85"
|
||||
overflow="visible"
|
||||
enable-background="new -0.25 -0.25 98 85"
|
||||
xml:space="preserve"
|
||||
id="svg2"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="purple.svg"><metadata
|
||||
id="metadata22"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1280"
|
||||
inkscape:window-height="782"
|
||||
id="namedview20"
|
||||
showgrid="false"
|
||||
inkscape:zoom="2.7764706"
|
||||
inkscape:cx="-68.415254"
|
||||
inkscape:cy="42.5"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="18"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg2" /><defs
|
||||
id="defs4" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M97,51c-2.02,4.98-8.33,5.67-14,7c-0.609,6.29,3.05,10.95-1,16c-6.41-0.26-7.471-5.859-7-13c-1,0-2,0-3,0 c-2.09,2.77,0.9,4.52,0,8c-1.12,4.34-7.88,7.91-11,7c-2.18-0.641-5.96-6.63-5-12c2.82-2.71,2.76,3.12,6,3c5.05-7.84-9.63-8.55-8-17 c1.24-6.42,11.66-9.66,15-1c1.54,4.21-5.17,0.16-5,3c-0.279,1.62,0.95,1.72,1,3c2.52,0.77,1.68-2.16,3-3c1.859-1.17,3.09-0.75,6-1 c2.45-2.55,1.08-8.92,4-11c3.87,0.46,6.08,2.59,6,7C91.01,46.109,94.3,46.05,97,51z"
|
||||
id="path6"
|
||||
style="fill:#b633ff;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M87,13c0.609,3.21,2.32,4.98,2,8c-0.34,3.21-2.9,8.83-4,9c-1.17,0.18-1.34,1.78-2,2 c-4.66,1.57-12.391-1.48-14-7c-1.16-3.97,1.9-13.37,4-17c1.3-2.25,1.221-2.99,5-4c2.41-0.65,3.65-2.25,6,0 c0.471,0.45,1.3,0.49,1.85,0.89c-0.199,0,2,3.14,2.15,4.11C88.32,11.07,86.77,11.78,87,13z M79,22c1.779-1.89,3.29-4.04,3-8 C77.49,12.33,74.67,21.3,79,22z"
|
||||
id="path8"
|
||||
style="fill:#b633ff;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M67,21c-0.07,5.81,2.48,10.7,0,15c-6.73,1.06-7.24-4.1-11-6c-1.939,1.39-1.49,5.18-3,7 c-3.78,0.44-4.69-1.97-7-3c2.47-7.81,1.26-18.98,2-26c8.58-0.58,7.68,8.32,12,12c0.52-4.34-0.359-15.52,3-20 C70.33,3.29,67.09,12.99,67,21z"
|
||||
id="path10"
|
||||
style="fill:#b633ff;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M52,55c1.93,8.41,0.12,22.689-12,20c-1.59-0.35-8.42-5.22-9-7c-1.62-5,0.34-13.34,3-16 C39.03,46.97,45.48,50.359,52,55z M39,66c4.55,0.96,6.3-4.2,4-7C39.37,59.03,38.61,61.939,39,66z"
|
||||
id="path12"
|
||||
style="fill:#b633ff;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M39,8c5.58,0.9,6.4,6.81,5,15c-1.43,8.38-3.02,14.59-9,15c-9.57,0.65-12.25-16.69-9-29 c8.32,1.27,6.59,10.36,6,17c2.71,0.83,2.2-0.85,3-2C37.05,21.04,37.82,13.61,39,8z"
|
||||
id="path14"
|
||||
style="fill:#b633ff;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M28,62c0.1,5.67,4.4,11.33,2,17c-4.32-1.01-6.57-4.09-9-7c-3.15-0.48-2.26,3.07-6,2 c-0.67,5.061,2.29,7.57-1,10c-4.7-0.63-6.66-4-8-8c-2.61-1.38-5.48-2.52-6-6c0.14-3.53,4.48-2.85,7-4c0.47-5.53-1.41-13.41,2-16 c8.31,0.49,8.21,7.13,7,15c4.36,0.29,4.94-4.35,5-7c0.06-2.43-1.82-8.26,2-11c3.06-0.73,2.94,1.73,6,1 C32.35,52.7,27.92,57.439,28,62z"
|
||||
id="path16"
|
||||
style="fill:#b633ff;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M24,12c1.07,7.07-3.86,8.14-6,12c0.21,6.88-0.47,12.86-2,18c-5.86-1.32-8.7-10.38-6-17 c-0.33-3.52-5.26-4.22-7-8c-0.3-0.66-0.47-4.43-1-7C1.09,5.63,0.55,4.31,3,1c8.16-0.49,7.21,8.13,9,14c5.05,0.39,3.91-5.42,8-6 C20.98,10.35,22.67,11,24,12z"
|
||||
id="path18"
|
||||
style="fill:#b633ff;fill-opacity:1" /></svg>
|
After Width: | Height: | Size: 4.1 KiB |
74
portal/assets/themes/random/logo/red.svg
Normal file
|
@ -0,0 +1,74 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.1"
|
||||
x="0px"
|
||||
y="0px"
|
||||
width="98px"
|
||||
height="85px"
|
||||
viewBox="-0.25 -0.25 98 85"
|
||||
overflow="visible"
|
||||
enable-background="new -0.25 -0.25 98 85"
|
||||
xml:space="preserve"
|
||||
id="svg2"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="red.svg"><metadata
|
||||
id="metadata22"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1280"
|
||||
inkscape:window-height="782"
|
||||
id="namedview20"
|
||||
showgrid="false"
|
||||
inkscape:zoom="2.7764706"
|
||||
inkscape:cx="-57.25"
|
||||
inkscape:cy="42.5"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="18"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg2" /><defs
|
||||
id="defs4" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M97,51c-2.02,4.98-8.33,5.67-14,7c-0.609,6.29,3.05,10.95-1,16c-6.41-0.26-7.471-5.859-7-13c-1,0-2,0-3,0 c-2.09,2.77,0.9,4.52,0,8c-1.12,4.34-7.88,7.91-11,7c-2.18-0.641-5.96-6.63-5-12c2.82-2.71,2.76,3.12,6,3c5.05-7.84-9.63-8.55-8-17 c1.24-6.42,11.66-9.66,15-1c1.54,4.21-5.17,0.16-5,3c-0.279,1.62,0.95,1.72,1,3c2.52,0.77,1.68-2.16,3-3c1.859-1.17,3.09-0.75,6-1 c2.45-2.55,1.08-8.92,4-11c3.87,0.46,6.08,2.59,6,7C91.01,46.109,94.3,46.05,97,51z"
|
||||
id="path6"
|
||||
style="fill:#ff3f13;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M87,13c0.609,3.21,2.32,4.98,2,8c-0.34,3.21-2.9,8.83-4,9c-1.17,0.18-1.34,1.78-2,2 c-4.66,1.57-12.391-1.48-14-7c-1.16-3.97,1.9-13.37,4-17c1.3-2.25,1.221-2.99,5-4c2.41-0.65,3.65-2.25,6,0 c0.471,0.45,1.3,0.49,1.85,0.89c-0.199,0,2,3.14,2.15,4.11C88.32,11.07,86.77,11.78,87,13z M79,22c1.779-1.89,3.29-4.04,3-8 C77.49,12.33,74.67,21.3,79,22z"
|
||||
id="path8"
|
||||
style="fill:#ff3f13;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M67,21c-0.07,5.81,2.48,10.7,0,15c-6.73,1.06-7.24-4.1-11-6c-1.939,1.39-1.49,5.18-3,7 c-3.78,0.44-4.69-1.97-7-3c2.47-7.81,1.26-18.98,2-26c8.58-0.58,7.68,8.32,12,12c0.52-4.34-0.359-15.52,3-20 C70.33,3.29,67.09,12.99,67,21z"
|
||||
id="path10"
|
||||
style="fill:#ff3f13;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M52,55c1.93,8.41,0.12,22.689-12,20c-1.59-0.35-8.42-5.22-9-7c-1.62-5,0.34-13.34,3-16 C39.03,46.97,45.48,50.359,52,55z M39,66c4.55,0.96,6.3-4.2,4-7C39.37,59.03,38.61,61.939,39,66z"
|
||||
id="path12"
|
||||
style="fill:#ff3f13;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M39,8c5.58,0.9,6.4,6.81,5,15c-1.43,8.38-3.02,14.59-9,15c-9.57,0.65-12.25-16.69-9-29 c8.32,1.27,6.59,10.36,6,17c2.71,0.83,2.2-0.85,3-2C37.05,21.04,37.82,13.61,39,8z"
|
||||
id="path14"
|
||||
style="fill:#ff3f13;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M28,62c0.1,5.67,4.4,11.33,2,17c-4.32-1.01-6.57-4.09-9-7c-3.15-0.48-2.26,3.07-6,2 c-0.67,5.061,2.29,7.57-1,10c-4.7-0.63-6.66-4-8-8c-2.61-1.38-5.48-2.52-6-6c0.14-3.53,4.48-2.85,7-4c0.47-5.53-1.41-13.41,2-16 c8.31,0.49,8.21,7.13,7,15c4.36,0.29,4.94-4.35,5-7c0.06-2.43-1.82-8.26,2-11c3.06-0.73,2.94,1.73,6,1 C32.35,52.7,27.92,57.439,28,62z"
|
||||
id="path16"
|
||||
style="fill:#ff3f13;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M24,12c1.07,7.07-3.86,8.14-6,12c0.21,6.88-0.47,12.86-2,18c-5.86-1.32-8.7-10.38-6-17 c-0.33-3.52-5.26-4.22-7-8c-0.3-0.66-0.47-4.43-1-7C1.09,5.63,0.55,4.31,3,1c8.16-0.49,7.21,8.13,9,14c5.05,0.39,3.91-5.42,8-6 C20.98,10.35,22.67,11,24,12z"
|
||||
id="path18"
|
||||
style="fill:#ff3f13;fill-opacity:1" /></svg>
|
After Width: | Height: | Size: 4.1 KiB |
74
portal/assets/themes/random/logo/yellow.svg
Normal file
|
@ -0,0 +1,74 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.1"
|
||||
x="0px"
|
||||
y="0px"
|
||||
width="98px"
|
||||
height="85px"
|
||||
viewBox="-0.25 -0.25 98 85"
|
||||
overflow="visible"
|
||||
enable-background="new -0.25 -0.25 98 85"
|
||||
xml:space="preserve"
|
||||
id="svg2"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="yellow.svg"><metadata
|
||||
id="metadata22"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1280"
|
||||
inkscape:window-height="782"
|
||||
id="namedview20"
|
||||
showgrid="false"
|
||||
inkscape:zoom="2.7764706"
|
||||
inkscape:cx="-9.7076271"
|
||||
inkscape:cy="42.5"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="18"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg2" /><defs
|
||||
id="defs4" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M97,51c-2.02,4.98-8.33,5.67-14,7c-0.609,6.29,3.05,10.95-1,16c-6.41-0.26-7.471-5.859-7-13c-1,0-2,0-3,0 c-2.09,2.77,0.9,4.52,0,8c-1.12,4.34-7.88,7.91-11,7c-2.18-0.641-5.96-6.63-5-12c2.82-2.71,2.76,3.12,6,3c5.05-7.84-9.63-8.55-8-17 c1.24-6.42,11.66-9.66,15-1c1.54,4.21-5.17,0.16-5,3c-0.279,1.62,0.95,1.72,1,3c2.52,0.77,1.68-2.16,3-3c1.859-1.17,3.09-0.75,6-1 c2.45-2.55,1.08-8.92,4-11c3.87,0.46,6.08,2.59,6,7C91.01,46.109,94.3,46.05,97,51z"
|
||||
id="path6"
|
||||
style="fill:#ffff00;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M87,13c0.609,3.21,2.32,4.98,2,8c-0.34,3.21-2.9,8.83-4,9c-1.17,0.18-1.34,1.78-2,2 c-4.66,1.57-12.391-1.48-14-7c-1.16-3.97,1.9-13.37,4-17c1.3-2.25,1.221-2.99,5-4c2.41-0.65,3.65-2.25,6,0 c0.471,0.45,1.3,0.49,1.85,0.89c-0.199,0,2,3.14,2.15,4.11C88.32,11.07,86.77,11.78,87,13z M79,22c1.779-1.89,3.29-4.04,3-8 C77.49,12.33,74.67,21.3,79,22z"
|
||||
id="path8"
|
||||
style="fill:#ffff00;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M67,21c-0.07,5.81,2.48,10.7,0,15c-6.73,1.06-7.24-4.1-11-6c-1.939,1.39-1.49,5.18-3,7 c-3.78,0.44-4.69-1.97-7-3c2.47-7.81,1.26-18.98,2-26c8.58-0.58,7.68,8.32,12,12c0.52-4.34-0.359-15.52,3-20 C70.33,3.29,67.09,12.99,67,21z"
|
||||
id="path10"
|
||||
style="fill:#ffff00;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M52,55c1.93,8.41,0.12,22.689-12,20c-1.59-0.35-8.42-5.22-9-7c-1.62-5,0.34-13.34,3-16 C39.03,46.97,45.48,50.359,52,55z M39,66c4.55,0.96,6.3-4.2,4-7C39.37,59.03,38.61,61.939,39,66z"
|
||||
id="path12"
|
||||
style="fill:#ffff00;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M39,8c5.58,0.9,6.4,6.81,5,15c-1.43,8.38-3.02,14.59-9,15c-9.57,0.65-12.25-16.69-9-29 c8.32,1.27,6.59,10.36,6,17c2.71,0.83,2.2-0.85,3-2C37.05,21.04,37.82,13.61,39,8z"
|
||||
id="path14"
|
||||
style="fill:#ffff00;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M28,62c0.1,5.67,4.4,11.33,2,17c-4.32-1.01-6.57-4.09-9-7c-3.15-0.48-2.26,3.07-6,2 c-0.67,5.061,2.29,7.57-1,10c-4.7-0.63-6.66-4-8-8c-2.61-1.38-5.48-2.52-6-6c0.14-3.53,4.48-2.85,7-4c0.47-5.53-1.41-13.41,2-16 c8.31,0.49,8.21,7.13,7,15c4.36,0.29,4.94-4.35,5-7c0.06-2.43-1.82-8.26,2-11c3.06-0.73,2.94,1.73,6,1 C32.35,52.7,27.92,57.439,28,62z"
|
||||
id="path16"
|
||||
style="fill:#ffff00;fill-opacity:1" /><path
|
||||
fill="#FFFFFF"
|
||||
d="M24,12c1.07,7.07-3.86,8.14-6,12c0.21,6.88-0.47,12.86-2,18c-5.86-1.32-8.7-10.38-6-17 c-0.33-3.52-5.26-4.22-7-8c-0.3-0.66-0.47-4.43-1-7C1.09,5.63,0.55,4.31,3,1c8.16-0.49,7.21,8.13,9,14c5.05,0.39,3.91-5.42,8-6 C20.98,10.35,22.67,11,24,12z"
|
||||
id="path18"
|
||||
style="fill:#ffff00;fill-opacity:1" /></svg>
|
After Width: | Height: | Size: 4.1 KiB |
14
portal/assets/themes/vapor/custom_overlay.css
Normal file
|
@ -0,0 +1,14 @@
|
|||
/*
|
||||
===============================================================================
|
||||
This file may contain extra CSS rules loaded on all apps page (*if* the app
|
||||
nginx's conf does include the appropriate snippet) for the small YunoHost
|
||||
button in bottom-right corner + portal overlay.
|
||||
|
||||
The yunohost button corresponds to : #ynh-overlay-switch
|
||||
The yunohost portal overlay / iframe corresponds to : #ynh-overlay
|
||||
|
||||
BE CAREFUL that you should *not* add too-general rules that apply to
|
||||
non-yunohost elements (for instance all 'a' or 'p' elements...) as it will
|
||||
likely break app's rendering
|
||||
===============================================================================
|
||||
*/
|
109
portal/assets/themes/vapor/custom_portal.css
Normal file
|
@ -0,0 +1,109 @@
|
|||
/*
|
||||
===============================================================================
|
||||
This file contain extra CSS rules to customize the YunoHost user portal and
|
||||
can be used to customize app tiles, buttons, etc...
|
||||
===============================================================================
|
||||
*/
|
||||
|
||||
/* ==========================================================================
|
||||
Vaporwave theme
|
||||
========================================================================== */
|
||||
.ynh-user-portal {
|
||||
min-height: 100vh;
|
||||
background: rgb(205, 118, 255) !important;
|
||||
background: -moz-linear-gradient(45deg, rgb(205, 118, 255) 0%, rgb(93, 150, 168) 100%) !important;
|
||||
background: -webkit-gradient(linear, left bottom, right top, color-stop(0%, rgb(205, 118, 255)), color-stop(100%, rgb(93, 150, 168))) !important;
|
||||
background: -webkit-linear-gradient(45deg, rgb(205, 118, 255) 0%, rgb(93, 150, 168) 100%) !important;
|
||||
background: -o-linear-gradient(45deg, rgb(205, 118, 255) 0%, rgb(93, 150, 168) 100%) !important;
|
||||
background: -ms-linear-gradient(45deg, rgb(205, 118, 255) 0%, rgb(93, 150, 168) 100%) !important;
|
||||
background: linear-gradient(45deg, rgb(205, 118, 255) 0%, rgb(93, 150, 168) 100%) !important;
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#C82BFF', endColorstr='#0C76A8', GradientType=1) !important;
|
||||
}
|
||||
|
||||
.messages.danger { background: #c0392b80; }
|
||||
.messages.warning { background: #e67e2280; }
|
||||
.messages.success { background: #27ae6080; }
|
||||
.messages.info { background: #2980b980; }
|
||||
|
||||
a, small, span,
|
||||
.ynh-wrapper.footer a,
|
||||
.user-menu a,
|
||||
.user-container.user-container-info span,
|
||||
input.btn.classic-btn.large-btn {
|
||||
color: #e0e0e0 !important;
|
||||
}
|
||||
|
||||
.form-group input::placeholder,
|
||||
.form-group input::-ms-input-placeholder,
|
||||
.form-group input:-ms-input-placeholder {
|
||||
color: #f4f4f4 !important;
|
||||
}
|
||||
|
||||
form.login-form input {
|
||||
color: #222 !important;
|
||||
}
|
||||
|
||||
a:hover,
|
||||
a:active,
|
||||
a:focus,
|
||||
.form-group input,
|
||||
input.btn.classic-btn.large-btn:hover,
|
||||
.ynh-wrapper.footer a:hover {
|
||||
color: white !important;
|
||||
}
|
||||
|
||||
.ynh-wrapper.footer a:before {
|
||||
color: #cc45ee !important;
|
||||
}
|
||||
|
||||
.ynh-wrapper.footer nav {
|
||||
border-color: #cc45ee !important;
|
||||
}
|
||||
|
||||
.listing-apps li a span,
|
||||
.listing-apps li a:hover span,
|
||||
.listing-apps li a:active span,
|
||||
.listing-apps li a:focus span {
|
||||
color: white !important;
|
||||
}
|
||||
|
||||
.listing-apps li,
|
||||
.listing-apps li a {
|
||||
transition: all 0.3s ease-in-out, background 0ms; /* fix gray flicker on initial load */
|
||||
border: none transparent !important;
|
||||
box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.1),
|
||||
-2px -2px 3px 0 rgba(0, 0, 0, 0.1) inset;
|
||||
}
|
||||
|
||||
.listing-apps li:hover,
|
||||
.listing-apps li a:hover {
|
||||
box-shadow: 2px 2px 3px rgba(0, 0, 0, 0),
|
||||
-2px -2px 3px 0 rgba(0, 0, 0, 0) inset;
|
||||
}
|
||||
|
||||
.btn.large-btn.classic-btn,
|
||||
.btn.large-btn.validate-btn {
|
||||
background: rgba(200, 200, 200, 0.4) !important;
|
||||
}
|
||||
|
||||
.btn.large-btn.classic-btn:hover,
|
||||
.btn.large-btn.validate-btn:hover {
|
||||
background: rgba(255, 255, 255, 0.4) !important;
|
||||
}
|
||||
|
||||
/* There are no colors, there is only vapor! */
|
||||
.app-tile,
|
||||
.form-group input,
|
||||
.form-group label,
|
||||
a.btn:hover,
|
||||
.btn.large-btn {
|
||||
background: rgba(200, 200, 200, 0.2) !important;
|
||||
border: none;
|
||||
}
|
||||
|
||||
.app-tile:hover:after,
|
||||
.app-tile:focus:after,
|
||||
.app-tile:hover:before,
|
||||
.app-tile:focus:before {
|
||||
background: rgba(200, 200, 200, 0.4) !important;
|
||||
}
|
33
portal/assets/themes/vapor/custom_portal.js
Normal file
|
@ -0,0 +1,33 @@
|
|||
/*
|
||||
===============================================================================
|
||||
This JS file may be used to customize the YunoHost user portal *and* also
|
||||
will be loaded in all app pages if the app nginx's conf does include the
|
||||
appropriate snippet.
|
||||
|
||||
You can monkeypatch init_portal (loading of the user portal) and
|
||||
init_portal_button_and_overlay (loading of the button and overlay...) to do
|
||||
custom stuff
|
||||
===============================================================================
|
||||
*/
|
||||
|
||||
/*
|
||||
* Monkeypatch init_portal to customize the app tile style
|
||||
*
|
||||
init_portal_original = init_portal;
|
||||
init_portal = function()
|
||||
{
|
||||
init_portal_original();
|
||||
// Some stuff here
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
* Monkey patching example to do custom stuff when loading inside an app
|
||||
*
|
||||
init_portal_button_and_overlay_original = init_portal_button_and_overlay;
|
||||
init_portal_button_and_overlay = function()
|
||||
{
|
||||
init_portal_button_and_overlay_original();
|
||||
// Custom stuff to do when loading inside an app
|
||||
}
|
||||
*/
|
|
@ -1,9 +1,9 @@
|
|||
<div class="ynh-wrapper user">
|
||||
<ul class="user-menu">
|
||||
<li><a class="icon icon-connexion" href="?action=logout">{{t_logout}}</a></li>
|
||||
<li><a id="ynh-logout" class="icon icon-connexion" href="?action=logout">{{t_logout}}</a></li>
|
||||
</ul>
|
||||
|
||||
<a class="user-container user-container-edit" href="info.html">
|
||||
<a class="user-container user-container-edit" href="portal.html">
|
||||
<h2 class="user-username">{{{uid}}}</h2>
|
||||
<small class="user-fullname">{{givenName}} {{sn}}</small>
|
||||
<span class="user-mail">{{mail}}</span>
|
||||
|
@ -47,7 +47,7 @@
|
|||
</div>
|
||||
|
||||
<div class="btn-group">
|
||||
<a role="button" href="info.html" class="btn large-btn">{{t_cancel}}</a>
|
||||
<a role="button" href="portal.html" class="btn large-btn">{{t_cancel}}</a>
|
||||
<input type="submit" class="btn classic-btn large-btn" value="{{t_ok}}">
|
||||
</div>
|
||||
|
||||
|
|
|
@ -10,6 +10,9 @@
|
|||
</div>
|
||||
|
||||
<!-- Scripts -->
|
||||
<script src="assets/js/global.js"></script>
|
||||
<script src="assets/js/ynh_portal.js"></script>
|
||||
{{#theme}}
|
||||
<script src="assets/themes/{{theme}}/custom_portal.js"></script>
|
||||
{{/theme}}
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -12,7 +12,8 @@
|
|||
<meta name="robots" content="noindex, nofollow">
|
||||
|
||||
<!-- Stylesheets -->
|
||||
<link rel="stylesheet" href="assets/css/ynh-style.css">
|
||||
<link rel="stylesheet" href="assets/css/ynh_portal.css">
|
||||
<link rel="stylesheet" href="assets/themes/{{theme}}/custom_portal.css">
|
||||
|
||||
<!-- Icons -->
|
||||
<link rel="shortcut icon" href="assets/icons/favicon.ico">
|
||||
|
@ -32,13 +33,13 @@
|
|||
<meta name="msapplication-TileColor" content="#41444f">
|
||||
<meta name="msapplication-TileImage" content="/mstile-144x144.png">
|
||||
</head>
|
||||
<body class="{{#connected}}logged{{/connected}}">
|
||||
<body class="ynh-user-portal {{#connected}}logged{{/connected}}">
|
||||
|
||||
<h1 id="logo" class="logo">
|
||||
<img src="assets/img/logo-ynh-white.svg"/><span class="element-invisible">Yunohost</span>
|
||||
</h1>
|
||||
<div id="ynh-logo" class="ynh-logo">
|
||||
<span class="element-invisible">Yunohost</span>
|
||||
</div>
|
||||
|
||||
<div class="overlay">
|
||||
<div class="content">
|
||||
{{#flash_win}}
|
||||
<div class="wrapper messages success">{{.}}</div>
|
||||
{{/flash_win}}
|
||||
|
@ -50,4 +51,3 @@
|
|||
{{#flash_info}}
|
||||
<div class="wrapper messages info">{{.}}</div>
|
||||
{{/flash_info}}
|
||||
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
<div class="ynh-wrapper user">
|
||||
<ul class="user-menu">
|
||||
<li><a class="icon icon-connexion" href="?action=logout">{{t_logout}}</a></li>
|
||||
<li><a id="ynh-logout" class="icon icon-connexion" href="?action=logout">{{t_logout}}</a></li>
|
||||
</ul>
|
||||
<a class="user-container user-container-password" href="info.html">
|
||||
<a class="user-container user-container-password" href="portal.html">
|
||||
<h2 class="user-username">{{{uid}}}</h2>
|
||||
<small class="user-fullname">{{givenName}} {{sn}}</small>
|
||||
<span class="user-mail">{{mail}}</span>
|
||||
|
@ -30,7 +30,7 @@
|
|||
<input type="password" class="form-text" id="confirm" name="confirm" placeholder="{{t_confirm}}" required>
|
||||
</div>
|
||||
<div class="btn-group">
|
||||
<a role="button" href="info.html" class="btn large-btn btn-default">{{t_cancel}}</a>
|
||||
<a role="button" href="portal.html" class="btn large-btn btn-default">{{t_cancel}}</a>
|
||||
<input type="submit" class="btn large-btn classic-btn" value="{{t_ok}}">
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<div class="ynh-wrapper user">
|
||||
<ul class="user-menu">
|
||||
<li><a class="icon icon-connexion" href="?action=logout">{{t_logout}}</a></li>
|
||||
<li><a id="ynh-logout" class="icon icon-connexion" href="?action=logout">{{t_logout}}</a></li>
|
||||
</ul>
|
||||
|
||||
<a class="user-container user-container-info" href="edit.html">
|
||||
|
@ -14,7 +14,12 @@
|
|||
<div id="apps" class="wrapper apps">
|
||||
<ul class="listing-apps">
|
||||
{{#app}}
|
||||
<li><a href="https://{{url}}"><span class="first-letter"></span><span class="name">{{name}}</span></a></li>
|
||||
<li>
|
||||
<a class="app-tile" href="https://{{url}}" data-appname="{{name}}">
|
||||
<span class="first-letter"></span>
|
||||
<span class="name">{{name}}</span>
|
||||
</a>
|
||||
</li>
|
||||
{{/app}}
|
||||
</ul>
|
||||
</div>
|