Merge pull request #122 from YunoHost/theming-reloaded

Theming reloaded
This commit is contained in:
Alexandre Aubin 2019-04-01 02:50:01 +02:00 committed by GitHub
commit a194168b84
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
41 changed files with 1917 additions and 1105 deletions

1
.gitignore vendored
View file

@ -1 +0,0 @@
*.swp

View file

@ -150,13 +150,24 @@ then
and (not ngx.var.http_referer
or hlp.string.starts(ngx.var.http_referer, conf.portal_url)))
then
return hlp.serve(ngx.var.uri)
-- If this is an asset, enable caching
if hlp.string.starts(ngx.var.uri, conf["portal_path"].."assets")
then
return hlp.serve(ngx.var.uri, "static_asset")
else
return hlp.serve(ngx.var.uri)
end
-- If all the previous cases have failed, redirect to portal
else
hlp.flash("info", hlp.t("please_login"))
return hlp.redirect(conf.portal_url)
-- Force the scheme to HTTPS. This is to avoid an issue with redirection loop
-- when trying to access http://main.domain.tld/ (SSOwat finds that user aint
-- logged in, therefore redirects to SSO, which redirects to the back_url, which
-- redirect to SSO, ..)
local back_url = "https://" .. ngx.var.host .. ngx.var.uri .. hlp.uri_args_string()
return hlp.redirect(conf.portal_url.."?r="..ngx.encode_base64(back_url))
end
@ -305,16 +316,36 @@ end
-- `/yunohost/sso/assets/js/ynhpanel.js` file.
--
function scandir(directory, callback)
-- FIXME : this sometime fails (randomly...)
-- because of 'interrupted system call'
-- use find (and not ls) to list only files recursively and with their full path relative to the asked directory
local pfile = io.popen('cd "'..directory..'" && find * -type f')
for filename in pfile:lines() do
callback(filename)
end
pfile:close()
end
function serveAsset(shortcut, full)
if string.match(ngx.var.uri, "^"..shortcut.."$") then
hlp.serve("/yunohost/sso/assets/"..full, "static_asset")
end
end
function serveThemeFile(filename)
serveAsset("/ynhtheme/"..filename, "themes/"..conf.theme.."/"..filename)
end
if hlp.is_logged_in() then
if string.match(ngx.var.uri, "^/ynhpanel.js$") then
hlp.serve("/yunohost/sso/assets/js/ynhpanel.js")
end
if string.match(ngx.var.uri, "^/ynhpanel.css$") then
hlp.serve("/yunohost/sso/assets/css/ynhpanel.css")
end
if string.match(ngx.var.uri, "^/ynhpanel.json$") then
hlp.serve("/yunohost/sso/assets/js/ynhpanel.json")
end
-- serve ynhpanel files
serveAsset("/ynh_portal.js", "js/ynh_portal.js")
serveAsset("/ynh_overlay.css", "css/ynh_overlay.css")
-- serve theme's files
-- FIXME? I think it would be better here not to use an absolute path
-- but I didn't succeed to figure out where is the current location of the script
-- if you call it from "portal/assets/themes/" the ls fails
scandir("/usr/share/ssowat/portal/assets/themes/"..conf.theme, serveThemeFile)
-- If user has no access to this URL, redirect him to the portal
if not hlp.has_access() then

View file

@ -2,6 +2,7 @@
"portal_scheme": "https",
"portal_domain": "example.com",
"portal_path": "/ssowat/",
"theme": "default",
"domains": [
"example.com",
"example.org"

View file

@ -54,7 +54,8 @@ function get_config()
skipped_urls = {},
ldap_attributes = {"uid", "givenname", "sn", "cn", "homedirectory", "mail", "maildrop"},
allow_mail_authentication = true,
default_language = "en"
default_language = "en",
theme = "default"
}

View file

@ -437,13 +437,13 @@ end
--
-- Takes an URI, and returns file content with the proper HTTP headers.
-- It is used to render the SSOwat portal *only*.
function serve(uri)
function serve(uri, cache)
rel_path = string.gsub(uri, conf["portal_path"], "/")
-- Load login.html as index
if rel_path == "/" then
if is_logged_in() then
rel_path = "/info.html"
rel_path = "/portal.html"
else
rel_path = "/login.html"
end
@ -505,8 +505,12 @@ function serve(uri)
flashs["win"] = nil
flashs["info"] = nil
-- Ain't nobody got time for cache
ngx.header["Cache-Control"] = "no-cache"
if cache == "static_asset" then
ngx.header["Cache-Control"] = "public, max-age=3600"
else
-- Ain't nobody got time for cache
ngx.header["Cache-Control"] = "no-cache"
end
-- Print file content
ngx.say(content)
@ -531,7 +535,7 @@ function get_data_for(view)
}
-- For those views, we may need user information
elseif view == "info.html"
elseif view == "portal.html"
or view == "edit.html"
or view == "password.html"
or view == "ynhpanel.json" then
@ -550,6 +554,7 @@ function get_data_for(view)
local mails = get_mails(user)
data = {
connected = true,
theme = conf.theme,
portal_url = conf.portal_url,
uid = user,
cn = cache:get(user.."-cn"),
@ -585,6 +590,7 @@ function get_data_for(view)
data['flash_fail'] = {flashs["fail"]}
data['flash_win'] = {flashs["win"] }
data['flash_info'] = {flashs["info"]}
data['theme'] = conf["theme"]
return data
end
@ -682,7 +688,7 @@ function edit_user()
-- Open the LDAP connection
local ldap = lualdap.open_simple(conf["ldap_host"], dn, args.currentpassword)
local password = hash_password(args.newpassword)
-- Modify the LDAP information
@ -695,7 +701,7 @@ function edit_user()
-- Reset the password cache
cache:set(user.."-password", args.newpassword, conf["session_timeout"])
return redirect(conf.portal_url.."info.html")
return redirect(conf.portal_url.."portal.html")
else
flash("fail", t("password_changed_error"))
end
@ -878,7 +884,7 @@ function edit_user()
-- Ugly trick to force cache reloading
set_headers(user)
flash("win", t("information_updated"))
return redirect(conf.portal_url.."info.html")
return redirect(conf.portal_url.."portal.html")
else
flash("fail", t("user_saving_fail"))
@ -909,7 +915,7 @@ function login()
local uri_args = ngx.req.get_uri_args()
args.user = string.lower(args.user)
local user = authenticate(args.user, args.password)
if user then
ngx.status = ngx.HTTP_CREATED

View 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;
}
}

View file

@ -1,3 +1,9 @@
/*
===============================================================================
This file contain CSS rules loaded on the YunoHost user portal.
===============================================================================
*/
/* ==========================================================================
0 = Fonts
1 = Global
@ -65,16 +71,20 @@ html {
font-family: sans-serif; /* 1 */
-ms-text-size-adjust: 100%; /* 2 */
-webkit-text-size-adjust: 100%; /* 2 */
height: 100%;
}
body {
background: #41444f;
font-family: 'source_sans_proregular';
overflow-y: scroll;
font-size: 1em;
line-height:1.5;
margin: 0;
padding: 0;
height: 100%;
top: 0;
position: absolute;
width: 100%;
}
h1:first-child,
@ -112,10 +122,16 @@ img {
/* Layout */
.overlay {
.content {
padding: 2%;
}
.logged .content {
width: 100%;
height: 100%;
overflow: auto; /* scroll .content, not body for easier background customization */
}
.ynh-wrapper {
width: 90%;
margin: 2% 5%;
@ -126,38 +142,36 @@ img {
.ynh-wrapper:after {content: " ";display: table;}
.ynh-wrapper:after {clear: both;}
/* Logo */
.logo {
text-align: center;
margin-bottom: 0;
.ynh-logo {
opacity: 0.7;
margin-top: 6em;
width: 100%;
height: 9em;
background-image: url("../img/logo-ynh-white.svg");
background-repeat: no-repeat;
background-position: center 100%;
background-size: contain;
}
.logo img {
margin-top: 4%;
width: 4em;
}
.logged .logo {
.logged .ynh-logo {
position: fixed;
width: 5em;
height: 5em;
bottom: 20px;
right: 20px;
z-index: 0;
opacity: 0.7;
background-position: center center;
}
.logged .logo img {
margin-top: 0;
width: 2.5em;
padding: 0.3em;
border-radius: 5px;
}
.ynh-panel-active .logo {
.ynh-panel-active .ynh-logo {
display: none;
}
.in_app_overlay .ynh-logo {
display: none;
}
/* messages */
.messages {
@ -330,13 +344,12 @@ textarea {
-webkit-transform: skew(0deg, 45deg);
}
.listing-apps span {
display: block;
margin: -1.2em 0 0 0.2em;
}
.listing-apps .first-letter { margin: 0; }
.listing-apps .first-letter:before {
content: attr(data-first-letter);
.listing-apps span {
display: block;
margin: -1.2em 0 0 0.2em;
}
.listing-apps .first-letter {
margin: 0;
display: inline-block;
}
.listing-apps .name {
@ -793,151 +806,6 @@ input.btn {
}
}
/* ==========================================================================
6 = Colors
========================================================================== */
.bluebg {
background: #3498DB!important;
}
.bluebg:hover:after,
.bluebg:focus:after,
.bluebg:hover:before,
.bluebg:focus:before {
background: #16527A!important;
}
.purplebg {
background: #9B59B6!important;
}
.purplebg:hover:after,
.purplebg:focus:after,
.purplebg:hover:before,
.purplebg:focus:before {
background: #532C64!important;
}
.redbg {
background: #E74C3C!important;
}
.redbg:hover:after,
.redbg:focus:after,
.redbg:hover:before,
.redbg:focus:before {
background: #921E12!important;
}
.orangebg {
background: #F39C12!important;
}
.orangebg:hover:after,
.orangebg:focus:after,
.orangebg:hover:before,
.orangebg:focus:before {
background: #7F5006!important;
}
.greenbg {
background: #2ECC71!important;
}
.greenbg:hover:after,
.greenbg:focus:after,
.greenbg:hover:before,
.greenbg:focus:before {
background: #176437!important;
}
.darkbluebg {
background: #34495E!important;
}
.darkbluebg:hover:after,
.darkbluebg:focus:after,
.darkbluebg:hover:before,
.darkbluebg:focus:before {
background: #07090C!important;
}
.lightbluebg {
background: #6A93D4!important;
}
.lightbluebg:hover:after,
.lightbluebg:focus:after,
.lightbluebg:hover:before,
.lightbluebg:focus:before {
background: #2B5394!important;
}
.yellowbg {
background: #F1C40F!important;
}
.yellowbg:hover:after,
.yellowbg:focus:after,
.yellowbg:hover:before,
.yellowbg:focus:before {
background: #796307!important;
}
.lightpinkbg {
background: #F76F87!important;
}
.lightpinkbg:hover:after,
.lightpinkbg:focus:after,
.lightpinkbg:hover:before,
.lightpinkbg:focus:before {
background: #DA0C31!important;
}
/* Following colors are not used yet */
.pinkbg {
background: #D66D92!important;
}
.pinkbg:hover:after,
.pinkbg:focus:after,
.pinkbg:hover:before,
.pinkbg:focus:before {
background: #992B52!important;
}
.turquoisebg {
background: #1ABC9C!important;
}
.turquoisebg:hover:after,
.turquoisebg:focus:after,
.turquoisebg:hover:before,
.turquoisebg:focus:before {
background: #0B4C3F!important;
}
.lightyellow {
background: #FFC973!important;
}
.lightyellow:hover:after,
.lightyellow:focus:after,
.lightyellow:hover:before,
.lightyellow:focus:before {
background: #F39500!important;
}
.lightgreen {
background: #B5F36D!important;
}
.lightgreen:hover:after,
.lightgreen:focus:after,
.lightgreen:hover:before,
.lightgreen:focus:before {
background: #77CF11!important;
}
.purpledarkbg {
background: #8E44AD!important;
}
.purpledarkbg:hover:after,
.purpledarkbg:focus:after,
.purpledarkbg:hover:before,
.purpledarkbg:focus:before {
background: #432051!important;
}
/* ==========================================================================
Internet Explorer
========================================================================== */

File diff suppressed because one or more lines are too long

View file

@ -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);
});
});

View file

@ -1,9 +1,18 @@
/* ----------------------------------------------------------
Utilities
---------------------------------------------------------- */
/*
===============================================================================
This JS file is loaded :
- in the YunoHost user portal
- on every app page if the app nginx's conf does include the ynh snippet
===============================================================================
*/
/* Console log fix
-------------------------- */
/*
=====================
Utilities
=====================
*/
/* Console log fix */
if (typeof(console) === 'undefined') {
var console = {};
console.log = console.error = console.info = console.debug = console.warn = console.trace = console.dir = console.dirxml = console.group = console.groupEnd = console.time = console.timeEnd = console.assert = console.profile = function() {};
@ -91,6 +100,7 @@ Element.toggleClass = function(element, className) {
https://github.com/Darklg/JavaScriptUtilities/blob/master/assets/js/vanilla-js/libs/vanilla-events.js
-------------------------- */
window.addEvent = function(el, eventName, callback, options) {
if (el == null) { return; }
if (el.addEventListener) {
if (!options || typeof(options) !== "object") {
options = {};
@ -118,7 +128,7 @@ window.eventPreventDefault = function(event) {
http://jsfiddle.net/tovic/Xcb8d/light/
-------------------------- */
var dragg = function(id) {
function make_element_draggable(id) {
// Variables
this.elem = document.getElementById(id),
@ -136,6 +146,16 @@ var dragg = function(id) {
selected = elem;
x_elem = x_pos - selected.offsetLeft;
y_elem = y_pos - selected.offsetTop;
// We add listening event for the iframe itself ...
// otherwise dragging the tile on the iframe doesn't
// work properly.
// We do this at click time to have a better chance
// that the iframe's body is indeed loaded ...
// (a bit hackish but meh)
portalOverlay = document.getElementById("ynh-overlay").contentDocument.body;
window.addEvent(portalOverlay, 'mousemove', _onMove);
window.addEvent(portalOverlay, 'touchmove', _onMove, {passive: false});
};
var _shutDrag = function(e){
@ -192,26 +212,41 @@ var dragg = function(id) {
// Reset dragging status
dragged = false;
});
}
/* Smallest DOMReady
http://dustindiaz.com/smallest-domready-ever
-------------------------- */
function domReady(cb) {
/in/.test(document.readyState) // in = loadINg
? setTimeout('domReady('+cb+')', 9)
: cb();
}
};
/* ----------------------------------------------------------
Main
---------------------------------------------------------- */
domReady(function(){
// Don't do this in iframe
if (window.self !== window.top) {return false;}
window.addEvent(document, 'DOMContentLoaded', function() {
// 3 different cases :
// - this script is loaded from inside an app
// - this script is loaded inside the portal, inside an iframe/overlay activated by clicking the portal button inside an app
// - this script is loaded inside the "regular" portal when going to /yunohost/sso.
var in_app = ! document.body.classList.contains('ynh-user-portal');
var in_overlay_iframe = (window.location != window.parent.location);
if (in_app)
{
init_portal_button_and_overlay();
}
else
{
init_portal();
if (in_overlay_iframe) { tweak_portal_when_in_iframe(); }
}
});
//
// This function is called when ynh_portal.js is included in an app
//
// It will create the small yunohost "portal button" usually in the bottom
// right corner and initialize the portal overlay, shown when clicking the
// portal button meant to make it easier to switch between apps.
//
function init_portal_button_and_overlay()
{
// Set and store meta viewport
var meta_viewport = document.querySelector('meta[name="viewport"]');
if (meta_viewport === null) {
@ -223,111 +258,114 @@ domReady(function(){
meta_viewport = document.querySelector('meta[name="viewport"]');
meta_viewport_content = meta_viewport.getAttribute('content');
// Add portal stylesheet
var portalStyle = document.createElement("link");
portalStyle.setAttribute("rel", "stylesheet");
portalStyle.setAttribute("type", "text/css");
portalStyle.setAttribute("href", '/ynhpanel.css');
document.getElementsByTagName("head")[0].insertBefore(portalStyle, null);
// Prepare and inject the portal overlay (what is activated when clicking on the portal button)
var portalOverlay = document.createElement('iframe');
portalOverlay.src = "/yunohost/sso/portal.html";
portalOverlay.setAttribute("id","ynh-overlay");
portalOverlay.setAttribute("style","visibility: hidden;"); // make sure the overlay is invisible already when loading it
document.body.insertBefore(portalOverlay, null);
// Create portal link
var portal = document.createElement('a');
portal.setAttribute('id', 'ynh-overlay-switch');
portal.setAttribute('href', '/yunohost/sso/');
portal.setAttribute('class', 'disableAjax');
document.body.insertBefore(portal, null);
// Inject portal button
var portalButton = document.createElement('a');
portalButton.setAttribute('id', 'ynh-overlay-switch');
portalButton.setAttribute('href', '/yunohost/sso/');
portalButton.setAttribute('class', 'disableAjax');
document.body.insertBefore(portalButton, null);
// Make portal button draggable, for user convenience
make_element_draggable('ynh-overlay-switch');
// Portal link is draggable, for user convenience
dragg('ynh-overlay-switch');
// Create overlay element
var overlay = document.createElement("div");
overlay.setAttribute("id","ynh-overlay");
overlay.setAttribute("style","display:none");
document.body.insertBefore(overlay, null);
//Color Application
var colors = ['redbg','purpledarkbg','darkbluebg','orangebg','greenbg','darkbluebg','purpledarkbg','yellowbg','lightpinkbg','pinkbg','turquoisebg','yellowbg','lightbluebg','purpledarkbg', 'bluebg'];
// Get user's app
var r = new XMLHttpRequest();
r.open("GET", "/ynhpanel.json", true);
r.onreadystatechange = function () {
// Die if error
if (r.readyState != 4 || r.status != 200) return;
// Response is JSON
response = JSON.parse(r.responseText);
// Add overlay header
overlay.innerHTML += '<div id="ynh-user" class="ynh-wrapper info">' +
'<ul class="ul-reset user-menu"><li><a class="icon icon-connexion disableAjax" href="'+ response.portal_url +'?action=logout">'+response.t_logout+'</a></li></ul>'+
'<a class="user-container user-container-info disableAjax" href="'+ response.portal_url +'edit.html">' +
'<h2 class="user-username">'+ response.uid +'</h2>' +
'<small class="user-fullname">'+ response.givenName + ' ' + response.sn +'</small>' +
'<span class="user-mail">'+ response.mail +'</span>' +
'</a>' +
'</div>';
// Add application links
var links = [];
Array.prototype.forEach.call(response.app, function(app, n){
randomColorNumber = parseInt(app.name, 36) % colors.length;
links.push('<li><a class="'+colors[randomColorNumber]+' disableAjax" href="//'+app.url+'"><span class="first-letter" data-first-letter="'+ app.name.substr(0,2) +'"></span><span class="name">'+app.name+'</span></a></li>');
});
overlay.innerHTML += '<div id="ynh-apps" class="ynh-wrapper apps"><ul class="listing-apps">'+ links.join("\n") +'</ul></div>';
// Add footer links
overlay.innerHTML += '<div id="ynh-footer" class="ynh-wrapper footer"><nav>' + "\n" +
'<a class="link-profile-edit" href="/yunohost/sso/edit.html">'+ response.t_footerlink_edit +'</a>' + "\n" +
'<a class="link-documentation" href="//yunohost.org/docs" target="_blank">'+ response.t_footerlink_documentation +'</a>' + "\n" +
'<a class="link-documentation" href="//yunohost.org/support" target="_blank">'+ response.t_footerlink_support +'</a>' + "\n" +
'<a class="link-admin" href="/yunohost/admin/" target="_blank">'+ response.t_footerlink_administration +'</a>' + "\n" +
'</nav></div>';
// Add overlay to DOM
var btn = document.getElementById('logo'),
yunoverlay = document.getElementById('ynh-overlay'),
user = document.getElementById('ynh-user'),
apps = document.getElementById('ynh-apps');
var pfx = ["webkit", "moz", "MS", "o", ""];
function PrefixedEvent(element, type, callback) {
for (var p = 0; p < pfx.length; p++) {
if (!pfx[p]) type = type.toLowerCase();
element.addEventListener(pfx[p]+type, callback, false);
}
}
// Bind YNH Button
window.addEvent(portal, 'click', function(e){
// Bind portal button
window.addEvent(portalButton, 'click', function(e){
// Prevent default click
window.eventPreventDefault(e);
// Toggle overlay on YNHPortal button
//Element.toggleClass(overlay, 'visible');
Element.toggleClass(portal, 'visible');
// Toggle overlay on YNHPortal button click
Element.toggleClass(portalOverlay, 'visible');
Element.toggleClass(portalButton, 'visible');
Element.toggleClass(document.querySelector('html'), 'ynh-panel-active');
Element.toggleClass(portalOverlay, 'ynh-active');
if(yunoverlay.classList.contains('ynh-active')) {
if (portalOverlay.classList.contains('ynh-active')) {
meta_viewport.setAttribute('content', meta_viewport_content);
yunoverlay.classList.add('ynh-fadeOut');
PrefixedEvent(yunoverlay, "AnimationEnd", function(){
if(yunoverlay.classList.contains('ynh-fadeOut')) {
yunoverlay.classList.remove('ynh-active');
}
});
}else {
Element.addClass(portalOverlay, 'ynh-fadeIn');
Element.removeClass(portalOverlay, 'ynh-fadeOut');
} else {
meta_viewport.setAttribute('content', "width=device-width");
yunoverlay.classList.remove('ynh-fadeOut');
yunoverlay.classList.add('ynh-active');
}
});
Element.removeClass(portalOverlay, 'ynh-fadeIn');
Element.addClass(portalOverlay, 'ynh-fadeOut');
}
});
}
};
r.send();
//
// This function is called to initialize elements like the app tile colors and other things ...
//
function init_portal()
{
});
window.addEvent(document.getElementById('add-mailalias'), "click", function() {
// Clone last input.
var inputAliasClone = document.querySelector('.mailalias-input').cloneNode(true);
// Empty value.
inputAliasClone.value = '';
// Append to form-group.
this.parentNode.insertBefore(inputAliasClone, this);
});
window.addEvent(document.getElementById('add-maildrop'), "click", function() {
// Clone last input.
var inputDropClone = document.querySelector('.maildrop-input').cloneNode(true);
// Empty value.
inputDropClone.value = '';
// Append to form-group.
this.parentNode.insertBefore(inputDropClone, this);
});
Array.each(document.getElementsByClassName("app-tile"), function(el) {
// Set first-letter data attribute.
el.querySelector('.first-letter').innerHTML = el.getAttribute("data-appname").substring(0, 2);
// handle app links so they work both in plain info page and in the info iframe called from ynh_portal.js
window.addEvent(el, 'click', function(event) {
// if asked to open in new tab
if (event.ctrlKey || event.shiftKey || event.metaKey
|| (event.button && event.button == 1)) {
return
}
// if asked in current tab
else {
event.preventDefault();
parent.location.href=this.href;
return false;
};
});
});
}
function tweak_portal_when_in_iframe()
{
// Set class to body to show we're in overlay
document.body.classList.add('in_app_overlay');
let userContainer = document.querySelector('a.user-container');
if (userContainer) {
userContainer.classList.replace('user-container-info', 'user-container-edit');
userContainer.setAttribute('href', userContainer
.getAttribute('href')
.replace('edit.html', ''));
window.addEvent(userContainer, 'click', function(e) {
e.preventDefault();
e.stopPropagation();
window.parent.location.href = userContainer.getAttribute('href');
});
}
let logoutButton = document.getElementById('ynh-logout');
if (logoutButton)
{
// We force to do the logout "globally", not just in the
// iframe, otherwise after login out the url might still be
// domain.tld/app which is weird ...
window.addEvent(logoutButton, 'click', function(e) {
e.preventDefault();
e.stopPropagation();
window.parent.location.href = logoutButton.getAttribute("href");
});
}
}

View file

@ -1 +0,0 @@
{}

Binary file not shown.

After

Width:  |  Height:  |  Size: 299 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View 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");
}

View 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");
}

View 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
}
*/

View 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
===============================================================================
*/

View 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;
}

View 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
}
*/

View 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;
}

View 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;
}

View 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
}
*/

View 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
===============================================================================
*/

View 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;
}

View 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);
}

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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
===============================================================================
*/

View 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;
}

View 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
}
*/

View file

@ -1,9 +1,9 @@
<div class="ynh-wrapper user">
<ul class="user-menu">
<li><a class="icon icon-connexion" href="?action=logout">{{t_logout}}</a></li>
<li><a id="ynh-logout" class="icon icon-connexion" href="?action=logout">{{t_logout}}</a></li>
</ul>
<a class="user-container user-container-edit" href="info.html">
<a class="user-container user-container-edit" href="portal.html">
<h2 class="user-username">{{{uid}}}</h2>
<small class="user-fullname">{{givenName}} {{sn}}</small>
<span class="user-mail">{{mail}}</span>
@ -47,7 +47,7 @@
</div>
<div class="btn-group">
<a role="button" href="info.html" class="btn large-btn">{{t_cancel}}</a>
<a role="button" href="portal.html" class="btn large-btn">{{t_cancel}}</a>
<input type="submit" class="btn classic-btn large-btn" value="{{t_ok}}">
</div>

View file

@ -10,6 +10,9 @@
</div>
<!-- Scripts -->
<script src="assets/js/global.js"></script>
<script src="assets/js/ynh_portal.js"></script>
{{#theme}}
<script src="assets/themes/{{theme}}/custom_portal.js"></script>
{{/theme}}
</body>
</html>

View file

@ -12,7 +12,8 @@
<meta name="robots" content="noindex, nofollow">
<!-- Stylesheets -->
<link rel="stylesheet" href="assets/css/ynh-style.css">
<link rel="stylesheet" href="assets/css/ynh_portal.css">
<link rel="stylesheet" href="assets/themes/{{theme}}/custom_portal.css">
<!-- Icons -->
<link rel="shortcut icon" href="assets/icons/favicon.ico">
@ -32,13 +33,13 @@
<meta name="msapplication-TileColor" content="#41444f">
<meta name="msapplication-TileImage" content="/mstile-144x144.png">
</head>
<body class="{{#connected}}logged{{/connected}}">
<body class="ynh-user-portal {{#connected}}logged{{/connected}}">
<h1 id="logo" class="logo">
<img src="assets/img/logo-ynh-white.svg"/><span class="element-invisible">Yunohost</span>
</h1>
<div id="ynh-logo" class="ynh-logo">
<span class="element-invisible">Yunohost</span>
</div>
<div class="overlay">
<div class="content">
{{#flash_win}}
<div class="wrapper messages success">{{.}}</div>
{{/flash_win}}
@ -50,4 +51,3 @@
{{#flash_info}}
<div class="wrapper messages info">{{.}}</div>
{{/flash_info}}

View file

@ -1,8 +1,8 @@
<div class="ynh-wrapper user">
<ul class="user-menu">
<li><a class="icon icon-connexion" href="?action=logout">{{t_logout}}</a></li>
<li><a id="ynh-logout" class="icon icon-connexion" href="?action=logout">{{t_logout}}</a></li>
</ul>
<a class="user-container user-container-password" href="info.html">
<a class="user-container user-container-password" href="portal.html">
<h2 class="user-username">{{{uid}}}</h2>
<small class="user-fullname">{{givenName}} {{sn}}</small>
<span class="user-mail">{{mail}}</span>
@ -30,7 +30,7 @@
<input type="password" class="form-text" id="confirm" name="confirm" placeholder="{{t_confirm}}" required>
</div>
<div class="btn-group">
<a role="button" href="info.html" class="btn large-btn btn-default">{{t_cancel}}</a>
<a role="button" href="portal.html" class="btn large-btn btn-default">{{t_cancel}}</a>
<input type="submit" class="btn large-btn classic-btn" value="{{t_ok}}">
</div>
</div>

View file

@ -1,6 +1,6 @@
<div class="ynh-wrapper user">
<ul class="user-menu">
<li><a class="icon icon-connexion" href="?action=logout">{{t_logout}}</a></li>
<li><a id="ynh-logout" class="icon icon-connexion" href="?action=logout">{{t_logout}}</a></li>
</ul>
<a class="user-container user-container-info" href="edit.html">
@ -14,7 +14,12 @@
<div id="apps" class="wrapper apps">
<ul class="listing-apps">
{{#app}}
<li><a href="https://{{url}}"><span class="first-letter"></span><span class="name">{{name}}</span></a></li>
<li>
<a class="app-tile" href="https://{{url}}" data-appname="{{name}}">
<span class="first-letter"></span>
<span class="name">{{name}}</span>
</a>
</li>
{{/app}}
</ul>
</div>