Merge pull request #122 from YunoHost/theming-reloaded
Theming reloaded
1
.gitignore
vendored
|
@ -1 +0,0 @@
|
||||||
*.swp
|
|
51
access.lua
|
@ -150,13 +150,24 @@ then
|
||||||
and (not ngx.var.http_referer
|
and (not ngx.var.http_referer
|
||||||
or hlp.string.starts(ngx.var.http_referer, conf.portal_url)))
|
or hlp.string.starts(ngx.var.http_referer, conf.portal_url)))
|
||||||
then
|
then
|
||||||
|
-- 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)
|
return hlp.serve(ngx.var.uri)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
-- If all the previous cases have failed, redirect to portal
|
-- If all the previous cases have failed, redirect to portal
|
||||||
else
|
else
|
||||||
hlp.flash("info", hlp.t("please_login"))
|
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
|
end
|
||||||
|
|
||||||
|
|
||||||
|
@ -305,16 +316,36 @@ end
|
||||||
-- `/yunohost/sso/assets/js/ynhpanel.js` file.
|
-- `/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 hlp.is_logged_in() then
|
||||||
if string.match(ngx.var.uri, "^/ynhpanel.js$") then
|
-- serve ynhpanel files
|
||||||
hlp.serve("/yunohost/sso/assets/js/ynhpanel.js")
|
serveAsset("/ynh_portal.js", "js/ynh_portal.js")
|
||||||
end
|
serveAsset("/ynh_overlay.css", "css/ynh_overlay.css")
|
||||||
if string.match(ngx.var.uri, "^/ynhpanel.css$") then
|
-- serve theme's files
|
||||||
hlp.serve("/yunohost/sso/assets/css/ynhpanel.css")
|
-- FIXME? I think it would be better here not to use an absolute path
|
||||||
end
|
-- but I didn't succeed to figure out where is the current location of the script
|
||||||
if string.match(ngx.var.uri, "^/ynhpanel.json$") then
|
-- if you call it from "portal/assets/themes/" the ls fails
|
||||||
hlp.serve("/yunohost/sso/assets/js/ynhpanel.json")
|
scandir("/usr/share/ssowat/portal/assets/themes/"..conf.theme, serveThemeFile)
|
||||||
end
|
|
||||||
|
|
||||||
-- If user has no access to this URL, redirect him to the portal
|
-- If user has no access to this URL, redirect him to the portal
|
||||||
if not hlp.has_access() then
|
if not hlp.has_access() then
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
"portal_scheme": "https",
|
"portal_scheme": "https",
|
||||||
"portal_domain": "example.com",
|
"portal_domain": "example.com",
|
||||||
"portal_path": "/ssowat/",
|
"portal_path": "/ssowat/",
|
||||||
|
"theme": "default",
|
||||||
"domains": [
|
"domains": [
|
||||||
"example.com",
|
"example.com",
|
||||||
"example.org"
|
"example.org"
|
||||||
|
|
|
@ -54,7 +54,8 @@ function get_config()
|
||||||
skipped_urls = {},
|
skipped_urls = {},
|
||||||
ldap_attributes = {"uid", "givenname", "sn", "cn", "homedirectory", "mail", "maildrop"},
|
ldap_attributes = {"uid", "givenname", "sn", "cn", "homedirectory", "mail", "maildrop"},
|
||||||
allow_mail_authentication = true,
|
allow_mail_authentication = true,
|
||||||
default_language = "en"
|
default_language = "en",
|
||||||
|
theme = "default"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
16
helpers.lua
|
@ -437,13 +437,13 @@ end
|
||||||
--
|
--
|
||||||
-- Takes an URI, and returns file content with the proper HTTP headers.
|
-- Takes an URI, and returns file content with the proper HTTP headers.
|
||||||
-- It is used to render the SSOwat portal *only*.
|
-- It is used to render the SSOwat portal *only*.
|
||||||
function serve(uri)
|
function serve(uri, cache)
|
||||||
rel_path = string.gsub(uri, conf["portal_path"], "/")
|
rel_path = string.gsub(uri, conf["portal_path"], "/")
|
||||||
|
|
||||||
-- Load login.html as index
|
-- Load login.html as index
|
||||||
if rel_path == "/" then
|
if rel_path == "/" then
|
||||||
if is_logged_in() then
|
if is_logged_in() then
|
||||||
rel_path = "/info.html"
|
rel_path = "/portal.html"
|
||||||
else
|
else
|
||||||
rel_path = "/login.html"
|
rel_path = "/login.html"
|
||||||
end
|
end
|
||||||
|
@ -505,8 +505,12 @@ function serve(uri)
|
||||||
flashs["win"] = nil
|
flashs["win"] = nil
|
||||||
flashs["info"] = nil
|
flashs["info"] = nil
|
||||||
|
|
||||||
|
if cache == "static_asset" then
|
||||||
|
ngx.header["Cache-Control"] = "public, max-age=3600"
|
||||||
|
else
|
||||||
-- Ain't nobody got time for cache
|
-- Ain't nobody got time for cache
|
||||||
ngx.header["Cache-Control"] = "no-cache"
|
ngx.header["Cache-Control"] = "no-cache"
|
||||||
|
end
|
||||||
|
|
||||||
-- Print file content
|
-- Print file content
|
||||||
ngx.say(content)
|
ngx.say(content)
|
||||||
|
@ -531,7 +535,7 @@ function get_data_for(view)
|
||||||
}
|
}
|
||||||
|
|
||||||
-- For those views, we may need user information
|
-- For those views, we may need user information
|
||||||
elseif view == "info.html"
|
elseif view == "portal.html"
|
||||||
or view == "edit.html"
|
or view == "edit.html"
|
||||||
or view == "password.html"
|
or view == "password.html"
|
||||||
or view == "ynhpanel.json" then
|
or view == "ynhpanel.json" then
|
||||||
|
@ -550,6 +554,7 @@ function get_data_for(view)
|
||||||
local mails = get_mails(user)
|
local mails = get_mails(user)
|
||||||
data = {
|
data = {
|
||||||
connected = true,
|
connected = true,
|
||||||
|
theme = conf.theme,
|
||||||
portal_url = conf.portal_url,
|
portal_url = conf.portal_url,
|
||||||
uid = user,
|
uid = user,
|
||||||
cn = cache:get(user.."-cn"),
|
cn = cache:get(user.."-cn"),
|
||||||
|
@ -585,6 +590,7 @@ function get_data_for(view)
|
||||||
data['flash_fail'] = {flashs["fail"]}
|
data['flash_fail'] = {flashs["fail"]}
|
||||||
data['flash_win'] = {flashs["win"] }
|
data['flash_win'] = {flashs["win"] }
|
||||||
data['flash_info'] = {flashs["info"]}
|
data['flash_info'] = {flashs["info"]}
|
||||||
|
data['theme'] = conf["theme"]
|
||||||
|
|
||||||
return data
|
return data
|
||||||
end
|
end
|
||||||
|
@ -695,7 +701,7 @@ function edit_user()
|
||||||
|
|
||||||
-- Reset the password cache
|
-- Reset the password cache
|
||||||
cache:set(user.."-password", args.newpassword, conf["session_timeout"])
|
cache:set(user.."-password", args.newpassword, conf["session_timeout"])
|
||||||
return redirect(conf.portal_url.."info.html")
|
return redirect(conf.portal_url.."portal.html")
|
||||||
else
|
else
|
||||||
flash("fail", t("password_changed_error"))
|
flash("fail", t("password_changed_error"))
|
||||||
end
|
end
|
||||||
|
@ -878,7 +884,7 @@ function edit_user()
|
||||||
-- Ugly trick to force cache reloading
|
-- Ugly trick to force cache reloading
|
||||||
set_headers(user)
|
set_headers(user)
|
||||||
flash("win", t("information_updated"))
|
flash("win", t("information_updated"))
|
||||||
return redirect(conf.portal_url.."info.html")
|
return redirect(conf.portal_url.."portal.html")
|
||||||
|
|
||||||
else
|
else
|
||||||
flash("fail", t("user_saving_fail"))
|
flash("fail", t("user_saving_fail"))
|
||||||
|
|
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
|
0 = Fonts
|
||||||
1 = Global
|
1 = Global
|
||||||
|
@ -65,16 +71,20 @@ html {
|
||||||
font-family: sans-serif; /* 1 */
|
font-family: sans-serif; /* 1 */
|
||||||
-ms-text-size-adjust: 100%; /* 2 */
|
-ms-text-size-adjust: 100%; /* 2 */
|
||||||
-webkit-text-size-adjust: 100%; /* 2 */
|
-webkit-text-size-adjust: 100%; /* 2 */
|
||||||
|
height: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
background: #41444f;
|
background: #41444f;
|
||||||
font-family: 'source_sans_proregular';
|
font-family: 'source_sans_proregular';
|
||||||
overflow-y: scroll;
|
|
||||||
font-size: 1em;
|
font-size: 1em;
|
||||||
line-height:1.5;
|
line-height:1.5;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
|
height: 100%;
|
||||||
|
top: 0;
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
h1:first-child,
|
h1:first-child,
|
||||||
|
@ -112,10 +122,16 @@ img {
|
||||||
|
|
||||||
|
|
||||||
/* Layout */
|
/* Layout */
|
||||||
.overlay {
|
.content {
|
||||||
padding: 2%;
|
padding: 2%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.logged .content {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
overflow: auto; /* scroll .content, not body for easier background customization */
|
||||||
|
}
|
||||||
|
|
||||||
.ynh-wrapper {
|
.ynh-wrapper {
|
||||||
width: 90%;
|
width: 90%;
|
||||||
margin: 2% 5%;
|
margin: 2% 5%;
|
||||||
|
@ -126,38 +142,36 @@ img {
|
||||||
.ynh-wrapper:after {content: " ";display: table;}
|
.ynh-wrapper:after {content: " ";display: table;}
|
||||||
.ynh-wrapper:after {clear: both;}
|
.ynh-wrapper:after {clear: both;}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Logo */
|
/* Logo */
|
||||||
.logo {
|
.ynh-logo {
|
||||||
text-align: center;
|
|
||||||
margin-bottom: 0;
|
|
||||||
opacity: 0.7;
|
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 {
|
.logged .ynh-logo {
|
||||||
margin-top: 4%;
|
|
||||||
width: 4em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.logged .logo {
|
|
||||||
position: fixed;
|
position: fixed;
|
||||||
|
width: 5em;
|
||||||
|
height: 5em;
|
||||||
bottom: 20px;
|
bottom: 20px;
|
||||||
right: 20px;
|
right: 20px;
|
||||||
z-index: 0;
|
z-index: 0;
|
||||||
opacity: 0.7;
|
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;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.in_app_overlay .ynh-logo {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
/* messages */
|
/* messages */
|
||||||
.messages {
|
.messages {
|
||||||
|
@ -330,13 +344,12 @@ textarea {
|
||||||
-webkit-transform: skew(0deg, 45deg);
|
-webkit-transform: skew(0deg, 45deg);
|
||||||
}
|
}
|
||||||
|
|
||||||
.listing-apps span {
|
.listing-apps span {
|
||||||
display: block;
|
display: block;
|
||||||
margin: -1.2em 0 0 0.2em;
|
margin: -1.2em 0 0 0.2em;
|
||||||
}
|
}
|
||||||
.listing-apps .first-letter { margin: 0; }
|
.listing-apps .first-letter {
|
||||||
.listing-apps .first-letter:before {
|
margin: 0;
|
||||||
content: attr(data-first-letter);
|
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
}
|
}
|
||||||
.listing-apps .name {
|
.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
|
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') {
|
if (typeof(console) === 'undefined') {
|
||||||
var console = {};
|
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() {};
|
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
|
https://github.com/Darklg/JavaScriptUtilities/blob/master/assets/js/vanilla-js/libs/vanilla-events.js
|
||||||
-------------------------- */
|
-------------------------- */
|
||||||
window.addEvent = function(el, eventName, callback, options) {
|
window.addEvent = function(el, eventName, callback, options) {
|
||||||
|
if (el == null) { return; }
|
||||||
if (el.addEventListener) {
|
if (el.addEventListener) {
|
||||||
if (!options || typeof(options) !== "object") {
|
if (!options || typeof(options) !== "object") {
|
||||||
options = {};
|
options = {};
|
||||||
|
@ -118,7 +128,7 @@ window.eventPreventDefault = function(event) {
|
||||||
http://jsfiddle.net/tovic/Xcb8d/light/
|
http://jsfiddle.net/tovic/Xcb8d/light/
|
||||||
-------------------------- */
|
-------------------------- */
|
||||||
|
|
||||||
var dragg = function(id) {
|
function make_element_draggable(id) {
|
||||||
|
|
||||||
// Variables
|
// Variables
|
||||||
this.elem = document.getElementById(id),
|
this.elem = document.getElementById(id),
|
||||||
|
@ -136,6 +146,16 @@ var dragg = function(id) {
|
||||||
selected = elem;
|
selected = elem;
|
||||||
x_elem = x_pos - selected.offsetLeft;
|
x_elem = x_pos - selected.offsetLeft;
|
||||||
y_elem = y_pos - selected.offsetTop;
|
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){
|
var _shutDrag = function(e){
|
||||||
|
@ -192,26 +212,41 @@ var dragg = function(id) {
|
||||||
// Reset dragging status
|
// Reset dragging status
|
||||||
dragged = false;
|
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
|
Main
|
||||||
---------------------------------------------------------- */
|
---------------------------------------------------------- */
|
||||||
domReady(function(){
|
window.addEvent(document, 'DOMContentLoaded', function() {
|
||||||
// Don't do this in iframe
|
|
||||||
if (window.self !== window.top) {return false;}
|
|
||||||
|
|
||||||
|
// 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
|
// Set and store meta viewport
|
||||||
var meta_viewport = document.querySelector('meta[name="viewport"]');
|
var meta_viewport = document.querySelector('meta[name="viewport"]');
|
||||||
if (meta_viewport === null) {
|
if (meta_viewport === null) {
|
||||||
|
@ -223,111 +258,114 @@ domReady(function(){
|
||||||
meta_viewport = document.querySelector('meta[name="viewport"]');
|
meta_viewport = document.querySelector('meta[name="viewport"]');
|
||||||
meta_viewport_content = meta_viewport.getAttribute('content');
|
meta_viewport_content = meta_viewport.getAttribute('content');
|
||||||
|
|
||||||
// Add portal stylesheet
|
// Prepare and inject the portal overlay (what is activated when clicking on the portal button)
|
||||||
var portalStyle = document.createElement("link");
|
var portalOverlay = document.createElement('iframe');
|
||||||
portalStyle.setAttribute("rel", "stylesheet");
|
portalOverlay.src = "/yunohost/sso/portal.html";
|
||||||
portalStyle.setAttribute("type", "text/css");
|
portalOverlay.setAttribute("id","ynh-overlay");
|
||||||
portalStyle.setAttribute("href", '/ynhpanel.css');
|
portalOverlay.setAttribute("style","visibility: hidden;"); // make sure the overlay is invisible already when loading it
|
||||||
document.getElementsByTagName("head")[0].insertBefore(portalStyle, null);
|
document.body.insertBefore(portalOverlay, null);
|
||||||
|
|
||||||
// Create portal link
|
// Inject portal button
|
||||||
var portal = document.createElement('a');
|
var portalButton = document.createElement('a');
|
||||||
portal.setAttribute('id', 'ynh-overlay-switch');
|
portalButton.setAttribute('id', 'ynh-overlay-switch');
|
||||||
portal.setAttribute('href', '/yunohost/sso/');
|
portalButton.setAttribute('href', '/yunohost/sso/');
|
||||||
portal.setAttribute('class', 'disableAjax');
|
portalButton.setAttribute('class', 'disableAjax');
|
||||||
document.body.insertBefore(portal, null);
|
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
|
// Bind portal button
|
||||||
dragg('ynh-overlay-switch');
|
window.addEvent(portalButton, 'click', function(e){
|
||||||
|
|
||||||
|
|
||||||
// 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){
|
|
||||||
// Prevent default click
|
// Prevent default click
|
||||||
window.eventPreventDefault(e);
|
window.eventPreventDefault(e);
|
||||||
// Toggle overlay on YNHPortal button
|
// Toggle overlay on YNHPortal button click
|
||||||
//Element.toggleClass(overlay, 'visible');
|
Element.toggleClass(portalOverlay, 'visible');
|
||||||
Element.toggleClass(portal, 'visible');
|
Element.toggleClass(portalButton, 'visible');
|
||||||
Element.toggleClass(document.querySelector('html'), 'ynh-panel-active');
|
Element.toggleClass(document.querySelector('html'), 'ynh-panel-active');
|
||||||
|
Element.toggleClass(portalOverlay, 'ynh-active');
|
||||||
|
|
||||||
|
if (portalOverlay.classList.contains('ynh-active')) {
|
||||||
if(yunoverlay.classList.contains('ynh-active')) {
|
|
||||||
meta_viewport.setAttribute('content', meta_viewport_content);
|
meta_viewport.setAttribute('content', meta_viewport_content);
|
||||||
yunoverlay.classList.add('ynh-fadeOut');
|
Element.addClass(portalOverlay, 'ynh-fadeIn');
|
||||||
PrefixedEvent(yunoverlay, "AnimationEnd", function(){
|
Element.removeClass(portalOverlay, 'ynh-fadeOut');
|
||||||
if(yunoverlay.classList.contains('ynh-fadeOut')) {
|
} else {
|
||||||
yunoverlay.classList.remove('ynh-active');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}else {
|
|
||||||
meta_viewport.setAttribute('content', "width=device-width");
|
meta_viewport.setAttribute('content', "width=device-width");
|
||||||
yunoverlay.classList.remove('ynh-fadeOut');
|
Element.removeClass(portalOverlay, 'ynh-fadeIn');
|
||||||
yunoverlay.classList.add('ynh-active');
|
Element.addClass(portalOverlay, 'ynh-fadeOut');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// 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;
|
||||||
};
|
};
|
||||||
r.send();
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
});
|
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">
|
<div class="ynh-wrapper user">
|
||||||
<ul class="user-menu">
|
<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>
|
</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>
|
<h2 class="user-username">{{{uid}}}</h2>
|
||||||
<small class="user-fullname">{{givenName}} {{sn}}</small>
|
<small class="user-fullname">{{givenName}} {{sn}}</small>
|
||||||
<span class="user-mail">{{mail}}</span>
|
<span class="user-mail">{{mail}}</span>
|
||||||
|
@ -47,7 +47,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="btn-group">
|
<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}}">
|
<input type="submit" class="btn classic-btn large-btn" value="{{t_ok}}">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,9 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Scripts -->
|
<!-- 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>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -12,7 +12,8 @@
|
||||||
<meta name="robots" content="noindex, nofollow">
|
<meta name="robots" content="noindex, nofollow">
|
||||||
|
|
||||||
<!-- Stylesheets -->
|
<!-- 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 -->
|
<!-- Icons -->
|
||||||
<link rel="shortcut icon" href="assets/icons/favicon.ico">
|
<link rel="shortcut icon" href="assets/icons/favicon.ico">
|
||||||
|
@ -32,13 +33,13 @@
|
||||||
<meta name="msapplication-TileColor" content="#41444f">
|
<meta name="msapplication-TileColor" content="#41444f">
|
||||||
<meta name="msapplication-TileImage" content="/mstile-144x144.png">
|
<meta name="msapplication-TileImage" content="/mstile-144x144.png">
|
||||||
</head>
|
</head>
|
||||||
<body class="{{#connected}}logged{{/connected}}">
|
<body class="ynh-user-portal {{#connected}}logged{{/connected}}">
|
||||||
|
|
||||||
<h1 id="logo" class="logo">
|
<div id="ynh-logo" class="ynh-logo">
|
||||||
<img src="assets/img/logo-ynh-white.svg"/><span class="element-invisible">Yunohost</span>
|
<span class="element-invisible">Yunohost</span>
|
||||||
</h1>
|
</div>
|
||||||
|
|
||||||
<div class="overlay">
|
<div class="content">
|
||||||
{{#flash_win}}
|
{{#flash_win}}
|
||||||
<div class="wrapper messages success">{{.}}</div>
|
<div class="wrapper messages success">{{.}}</div>
|
||||||
{{/flash_win}}
|
{{/flash_win}}
|
||||||
|
@ -50,4 +51,3 @@
|
||||||
{{#flash_info}}
|
{{#flash_info}}
|
||||||
<div class="wrapper messages info">{{.}}</div>
|
<div class="wrapper messages info">{{.}}</div>
|
||||||
{{/flash_info}}
|
{{/flash_info}}
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
<div class="ynh-wrapper user">
|
<div class="ynh-wrapper user">
|
||||||
<ul class="user-menu">
|
<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>
|
</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>
|
<h2 class="user-username">{{{uid}}}</h2>
|
||||||
<small class="user-fullname">{{givenName}} {{sn}}</small>
|
<small class="user-fullname">{{givenName}} {{sn}}</small>
|
||||||
<span class="user-mail">{{mail}}</span>
|
<span class="user-mail">{{mail}}</span>
|
||||||
|
@ -30,7 +30,7 @@
|
||||||
<input type="password" class="form-text" id="confirm" name="confirm" placeholder="{{t_confirm}}" required>
|
<input type="password" class="form-text" id="confirm" name="confirm" placeholder="{{t_confirm}}" required>
|
||||||
</div>
|
</div>
|
||||||
<div class="btn-group">
|
<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}}">
|
<input type="submit" class="btn large-btn classic-btn" value="{{t_ok}}">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<div class="ynh-wrapper user">
|
<div class="ynh-wrapper user">
|
||||||
<ul class="user-menu">
|
<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>
|
</ul>
|
||||||
|
|
||||||
<a class="user-container user-container-info" href="edit.html">
|
<a class="user-container user-container-info" href="edit.html">
|
||||||
|
@ -14,7 +14,12 @@
|
||||||
<div id="apps" class="wrapper apps">
|
<div id="apps" class="wrapper apps">
|
||||||
<ul class="listing-apps">
|
<ul class="listing-apps">
|
||||||
{{#app}}
|
{{#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}}
|
{{/app}}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|