init commit

This commit is contained in:
2025-02-23 20:52:25 +01:00
parent 5b272d6536
commit 9971cd719b
1719 changed files with 281982 additions and 2 deletions

483
plugins/xskin/CHANGE_LOG Normal file
View File

@ -0,0 +1,483 @@
1.9.2 (2024-11-08)
==================
- fixed colors on inputs with errors
- fixed settings sections titles in larry-based skins
- fixed settings input widths in larry-based skins
- fixed settings error popups in larry-based skins
- added Arabic translation
- added Bulgarian translation
- added Chinese (Simplified) translation
- added Chinese (Traditional) translation
- added Estonian translation
- added Greek translation
- added Hungarian translation
- added Japanese translation
- added Korean translation
- added Latvian translation
- added Portuguese (Portugal) translation
- added Slovak translation
- added Swedish translation
- updated license agreement
1.9.1 (2024-07-15)
==================
- updated larry-based skins UI
1.9 (2024-01-31)
================
- fixed button colors
- updated the icon system
- added new element styles
1.8.9 (2023-09-15)
==================
- fixed the light menu background highlight problem
1.8.8 (2023-05-25)
==================
- improved the switchbox UI on larry-based skins
- fixed the unreachable render page hook
- fixed pager UI on mobile larry-based skins
1.8.7 (2023-05-09)
==================
- added Norwegian translation
1.8.6 (2023-03-14)
==================
- added a config option to disable remotely loaded fonts
1.8.5 (2023-02-27)
==================
- fixed the elastic-based skin mobile layout
- removed backward compatibility with RC <= 1.4
1.8.4 (2023-02-15)
==================
- made the plugin fully compatible with PHP 8.2
- removed code providing RC 1.3 compatibility
- fixed the quick language change functionality
- fixed the quick skin change functionality
- added Czech translation
- added Danish translation
- added Dutch translation
- added Finnish translation
- added Indonesian translation
- added Lithuanian translation
- added Portuguese translation
- added Romanian translation
- added Russian translation
- added Slovenian translation
- added Spanish translation
- added Turkish translation
- added Ukrainian translation
1.8.3 (2022-12-16)
==================
- fixed some small dark mode login UI issues on elastic-based skins
1.8.2 (2022-06-20)
==================
- fixed icon positioning in the larry-based skins
1.8.1 (2022-05-30)
==================
- UI improvements and fixes
1.8 (2022-04-06)
==================
- fixed some potential html encoding problems
- fixed some issues with litecube icons
1.7.9 (2022-02-15)
==================
- fixed litecube skin icons on mobile
1.7.8 (2022-01-31)
==================
- fixed a skin changing error under PHP 8
- fixed PHP warnings in the Roundcube 1.5.2 about dialog
1.7.7 (2022-01-11)
==================
- fixed datepicker UI
- fixed the disablePluginsOnMobile warning
- added the Italian translation
- fixed some small css issues
- upgraded the PHP code syntax
- changed the minimum required Roundcube version to 1.4
1.7.6 (2021-09-08)
==================
- fixed button borders in the litecube skin
- fixed message footer UI in the larry-based skins
- fixed group button borders in the larry-based skins
1.7.5 (2021-09-01)
==================
- added Skin Look & Feel options to larry-based skins
- removed skin-specific overwrite_css config options in favor of global overwrite_css
- changed the font sources
- removed Cairo font because of line spacing issues
- added Noto Sans font
- added Ubuntu font
- fixed overflowing text in lists
- fixed login UI issues
- fixed html editor input border shadows
- fixed table width on login page
- fixed submenu arrow hover colors
- made the RC 1.4 & 1.5 compose html editors compatible with elastic-based skins colors
1.7.4 (2021-08-05)
==================
- enabled interface skin list code modifications
1.7.3 (2021-07-21)
==================
- fixed popup menu UI problems
- fixed input shadow UI problems
- updated the Polish translation
- updated the French translation
1.7.2 (2021-06-02)
==================
- extended the functionality of hide_about_link to apply to all skins
- fixed config docs
1.7.1 (2021-05-25)
==================
- made the plugin compatible with RC 1.5
- made the plugin compatible with the dark mode
1.7 (2021-02-08)
================
- fixed issues with content replacement on the login page
1.6.9 (2021-01-21)
==================
- updated the x2fa plugin UI
1.6.8 (2020-10-28)
==================
- fixed skin logo warning
- fixed the loader positioning on the login page of the larry-based skins
1.6.7 (2020-10-19)
==================
- fixed problems with displaying default skin on the login/logout pages
- fixed problems with displaying branding images on the login page
1.6.6 (2020-10-06)
==================
- added the indent_switch plugin select element to larry-based mobile skins
1.6.5 (2020-09-25)
==================
- added German translation
1.6.4 (2020-08-18)
==================
- fixed favicon setting and display on larry-based skins
- fixed logout skin problems when user config skin is larry-based and default config skin is elastic-based
1.6.3 (2020-05-29)
==================
- fixed the loading of the Google fonts on WHM 88
1.6.2 (2020-05-25)
==================
- fixed the issues with the dont_overwrite config setting on Roundcube 1.3 disabling the skins
1.6.1 (2020-05-04)
==================
- added support for larry-style logo config options to elastic-based skins
1.6 (2020-04-29)
================
- updated popup styles
1.5.9 (2020-03-12)
==================
- updated UI styles
1.5.8 (2020-02-14)
==================
- modified the overwrite_css config option to work on Elastic-based skins and on Elastic itself
1.5.7 (2020-02-04)
==================
- added a system to prevent using elastic based skins on RC 1.3.x or below
- changed the default value of the hide_about_link config option
1.5.6 (2020-01-20)
==================
- fixed quick skin change when using larry-based skins
1.5.5 (2020-01-08)
==================
- upgraded to work with cPanel 84
1.5.4 (2019-12-19)
==================
- made the plugin compatible with ident_switch
1.5.3 (2019-12-17)
==================
- fixed hiding the about link via config
1.5.2 (2019-11-25)
==================
- updated the config file and changed some default values
1.5.1 (2019-11-07)
==================
- fixed quick skin change functionality
- added elastic to the quick skin change list
- upgraded to be compatible with Roundcube 1.4 RC 2
1.5 (2019-10-10)
================
- removed the skin html replacement error when displaying Roundcube error page
1.4.9 (2019-09-24)
==================
- fixed box page navigation icons
1.4.8 (2019-09-02)
==================
- fixed interface options label on mobile devices
- added a config option to disable mobile interface on larry-based skins
- updated the html replacement error message to make it more legible
1.4.7 (2019-07-11)
==================
- translated to French
1.4.6 (2019-06-05)
==================
- fixed mobile dialog formatting
- fixed selectable list check mark positioning
1.4.5 (2019-05-22)
==================
- added support for Roundcube 1.4 RC1 and elastic-based skins
- removed separate skin selection for desktop, tablet, and phone
- added an option to change larry-based skin icons in skin's settings.php
1.4.4 (2019-03-04)
==================
- updated loader image to svg
1.4.3 (2019-02-28)
==================
- fixed message highlighting colors in thread view
1.4.2 (2018-07-03)
==================
- added styles for xemail_schedule on mobiles
1.4.1 (2018-06-04)
==================
- added support for the thunderbird labels plugin
1.4 (2018-03-19)
================
- fixed the compose field expanding height problems
- restored dialog shadows to improve the UI
1.3.9 (2018-02-27)
==================
- fixed login page blurred background icon display
- made the skins compatible with the twofactor_gauthentictor plugin
1.3.8 (2018-01-22)
==================
- added an option to disable/enable mobile skin on a specific device
- removed the outlook hero image config options
1.3.7 (2018-01-03)
==================
- fixed image paths
1.3.6 (2017-12-06)
==================
- made the plugin compatible with xbackground login images
- fixed the UI of some settings pages on mobile devices
1.3.5 (2017-11-01)
==================
- upgrading skin loading and handling
- enhanced the functionality of dontoverwrite config setting to force the default skins on all the user accounts
- added config setting for including a global css overwrite file (overwrite_css)
1.3.4 (2017-10-20)
==================
- fixed the problem with overwriting mobile css
- made it possible to enforce a skin color in config
1.3.3 (2017-09-04)
==================
- fixed javascript initialization problems on third-party, non-Roundcube Plus skins
- added a class that disables converting checkboxes to switchboxes
1.3.2 (2017-07-05)
==================
- added login body class to logout pages to fix styling
- fixed mobile message view attachment download menu
- fixed mobile compose attachment option buttons
1.3.1 (2017-06-28)
==================
- implemented setting layout to list on mobile devices so widescreen layouts can be displayed properly on RC 1.3
1.3 (2017-06-07)
==================
- fixed skin record focus color on RC 1.3
- added config options to specify the skin-specific login hero images
- added config options to specify the skin-specific login product name text
- added config options for overwriting skin css files
1.2.9 (2017-05-10)
==================
- fixed disabled listbox button colors
- fixed mobile UI under Lumia
1.2.8 (2017-04-11)
==================
- tweaked the icloud login screen design
- fixed the settings / folders gear button popup on mobile devices
1.2.7 (2017-03-08)
==================
- fixed problems with content scrolling on some mobile devices
1.2.6 (2017-03-07)
==================
- added Polish translation
1.2.5 (2017-03-01)
==================
- adjusted the main screen position under cPanel
- removed the white top line on minimized screen in cPanel
1.2.4 (2017-02-15)
==================
- fixed problems with adding mailbox item classes
- fixed filter plugin settings display
- added mobile quota display
1.2.3 (2017-02-08)
==================
- fixed address book navigation issues on IE
1.2.2 (2017-02-07)
==================
- added new icons to icon font
- added classes to mailbox items
- fixed cut font in toolbar
- moved rc+ font to xframework
- updated watermark image
1.2.1 (2017-01-11)
==================
- added unit tests
1.2 (2017-01-04)
==================
- added new protected properties to make the plugin compatible with upgraded xframework
1.1.9 (2016-12-19)
==================
- fixed quick skin switching in larry on IE
- fixed messagesieve settings page layout
1.1.8 (2016-12-13)
==================
- fixed disappearing skin/language/color change menu in Firefox
1.1.7 (2016-12-09)
==================
- made plugin compatible with xactivate
- updated license agreement
1.1.6 (2016-11-30)
==================
- fixed compose textarea height
- corrected a typo in the localization file
- made plugin compatible with the updated framework
1.1.5 (2016-11-16)
==================
- removed references to legacy functions
1.1.4 (2016-11-07)
==================
- added a config option to disable the menu skin selection
- added a config option to disable the menu language selection
- added a config option to change the message preview branding watermark image
- added a config option to change the default skin colors
- changed the delete icon to trash and junk icon to recycle
- changed the vendor icon on the login page
1.1.3 (2016-10-17)
==================
- added print logo config option
- set the print background to white in all skins
1.1.2 (2016-10-11)
==================
- made plugin compatible with the new way of including assets
- made plugin compatible with xbackground
1.1.1 (2016-10-04)
==================
- UI tweaks
1.1 (2016-09-27)
================
- added quick skin selection box to the interface options popup
- added support for interface options in Larry
1.0.9 (2016-09-20)
==================
- improved the handling of skin logos
1.0.8 (2016-09-06)
==================
- added a new mobile swipe gesture to mark messages as read/unread
- minor changes to make the plugin compatible with upgraded xframework
1.0.7 (2016-08-16)
==================
- fixed the color problems with mce dialog buttons on RC < 1.2.1
1.0.6 (2016-08-15)
==================
- fixed the color problems with mce dialog buttons
1.0.5 (2016-08-08)
==================
- upgraded to be compatible with RC 1.2.1
1.0.4 (2016-07-04)
==================
- fixed disabled text color
- fixed contextmenu popup icons display
1.0.3 (2016-06-14)
==================
- hiding desktop filter and search controls if they overlay toolbar buttons
1.0.2 (2016-06-06)
==================
- added folder actions to mobile options menu
- added selection actions to mobile options menu
- fixed the message pager mobile layout
1.0.1 (2016-06-02)
==================
- added message list display and sorting options to mobile skins
1.0 (2016-06-01)
================
- initial release

98
plugins/xskin/LICENSE Normal file
View File

@ -0,0 +1,98 @@
LICENSE AGREEMENT
This License Agreement ("Agreement") is a legal agreement between you and Tecorama LLC ("Tecorama"). By installing the
Software (as defined below), you agree to all of the terms of this Agreement. If you do not agree with all of the terms
of this Agreement, you must not install, access, or otherwise use the Software.
1. Software Definition
The Software covered by this Agreement constitutes the Roundcube Plus Skin plugin (xskin) created and released
by Tecorama, including any source code and any associated media, printed materials and electronic documentation provided
by Tecorama. However, certain components of the Software, including but not limited to third-party integrations, and
media, may be subject to separate licenses provided by the respective third-party licensors. You are responsible for
ensuring your compliance with the applicable third-party license terms.
2. Terms of Use
The Software is distributed under a commercial license. In order to use the Software, you must first purchase the
license from Tecorama. Purchasing the license grants you a non-exclusive, non-transferable, limited license to install
and use the Software in accordance with this Agreement and the specifications of the license.
2.a. License Duration and Renewal
The license granted under this Agreement is valid for a period of one (1) year from the date of purchase. To maintain an
active license and continue using the Software, you must renew your license prior or on the expiration of the current
term. Tecorama reserves the right to adjust the renewal fees at its discretion. Failure to renew the license will result
in the termination of the license and right to use the Software.
3. Intellectual Property Rights
The Software is licensed, not sold. Tecorama retains all rights, title, and interest, including all intellectual
property rights, in and to the Software. You acknowledge that no title or ownership to the Software is transferred to
you under this Agreement.
4. Software Modification
You are allowed to modify or adapt the Software for use in accordance with the specifications of the license you
purchased, except to the extent expressly permitted by applicable law. You may not distribute the modified versions of
the Software. If the Software is modified, Tecorama is not obligated to, provide updates or support for the Software.
Tecorama will not provide any technical support for altered versions of the Software.
5. Support and Updates
Tecorama may, but is not obligated to, provide updates or support for the Software. If support is provided, it will be
subject to Tecoramas support policies in effect at the time. This Agreement does not entitle you to any future updates
or upgrades to the Software unless such updates are expressly provided with the license purchased.
6. Resale
You are not allowed to resell, lease, sub-license, or otherwise transfer rights to the Software without obtaining
prior written permission from Tecorama.
7. Warranty Disclaimer
The Software is provided "AS IS" without any warranty of any kind, express or implied, including but not limited to the
implied warranties of merchantability, fitness for a particular purpose, and non-infringement. Tecorama does not warrant
that the Software will be uninterrupted or error-free, that defects will be corrected, or that the Software is free of
viruses or other harmful components.
You agree to use the Software in compliance with all applicable data privacy and security laws and regulations. Tecorama
makes no representation regarding the Software's compliance with any specific data protection or privacy laws, and you
are solely responsible for ensuring that your use of the Software complies with such laws.
8. Compliance with Laws
You agree to comply with all applicable local, state, national, and international laws and regulations in connection
with your use of the Software.
9. Anonymous Statistics
The Software gathers general settings for the purpose of statistical analysis and improvement. This data includes
aggregated, non-personal information such as the selected skin, language, country, version of Roundcube, PHP,
xFramework, server operating system name, active plugins. Additionally, the software gathers hashed identifiers,
including the Roundcube user ID and username. No personal or identifiable information is stored. This process is
seamless, does not affect performance, and remains fully anonymous. For more information, please refer to our Privacy
Policy.
10. Indemnification
You agree to indemnify, defend, and hold harmless Tecorama and its officers, directors, employees, and agents from and
against any claims, damages, losses, liabilities, costs, and expenses (including reasonable attorneys' fees) arising out
of or related to your use of the Software, any violation of this Agreement, or any violation of applicable laws or
regulations.
11. Termination
You may terminate the Agreement at any time by uninstalling and discontinuing the usage of the Software.
Tecorama may terminate the Agreement at any time if you are in breach of any of the terms and conditions of this
Agreement. Upon termination, you must immediately uninstall and discontinue all use of the Software. The Agreement will
also automatically terminate at the end of the one (1) year license period unless you renew your license for an
additional term.
12. Governing Law
This Agreement shall be governed, construed, and enforced in accordance with the laws of the State of Florida, U.S.A.,
without regard to its conflict of law principles. You agree that any legal action or proceeding arising under this
Agreement shall be brought exclusively in the courts located in Florida, and you consent to the jurisdiction of such
courts.

48
plugins/xskin/README Normal file
View File

@ -0,0 +1,48 @@
ROUNDCUBE PLUS SKIN PLUGIN
==========================
This plugin is required to use the Roundcube Plus skins.
REQUIREMENTS
------------
- Roundcube: 1.5, 1.6
- PHP: 7.4 or higher
INSTALLATION
------------
1. Copy the directories xskin and xframework included in this package to the 'plugins' directory of your Roundcube
installation.
2. Edit the file <roundcube>/config/config.inc.php, and add 'xskin' to the plugins array, like this:
$config['plugins'] = array('xskin');
If you already have other plugins in the plugins array, add 'xskin' at the begining, like this:
$config['plugins'] = array('xskin', 'other_plugin', 'one_more_plugin');
3. Add the license key to <roundcube>/config.config.inc.php, like this:
$config['license_key'] = 'your-license-key-here';
4. Rename the file <roundcube>/plugins/xskin/config.inc.php.dist to config.inc.php, edit the file and configure the
plugin according to your needs following the instructions included before the config options.
For more information on installing Roundcube Plus plugins see:
https://roundcubeplus.com/helpdesk/knowledgebase.php?article=29
COMPATIBILITY
-------------
This plugin has been created for the standard version of Roundcube as provided on the Roundcube website:
https://roundcube.net. It might not work properly with customized versions of Roundcube including the version provided
as part of the Kolab system. Please note that we cannot provide any technical support for the plugin deployed on a
non-standard version of Roundcube.
LICENSE
-------
This plugin is distributed under a commercial license. In order to use the plugin, you must purchase the license
from Tecorama LLC. See the LICENSE file for details.
COPYRIGHT
---------
Copyright (c) 2024, Tecorama LLC

1
plugins/xskin/VERSION Normal file
View File

@ -0,0 +1 @@
1.9.2 (2024-11-08)

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1,57 @@
<svg class="lds-spin" width="16px" height="16px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid" style="background: none;"><g transform="translate(86,50)">
<g transform="rotate(0)">
<circle cx="0" cy="0" r="10" fill="#333333" fill-opacity="1" transform="scale(1 1)">
<animateTransform attributeName="transform" type="scale" begin="-0.875s" values="1 1;1 1" keyTimes="0;1" dur="1s" repeatCount="indefinite"></animateTransform>
<animate attributeName="fill-opacity" keyTimes="0;1" dur="1s" repeatCount="indefinite" values="1;0" begin="-0.875s"></animate>
</circle>
</g>
</g><g transform="translate(75.45584412271572,75.45584412271572)">
<g transform="rotate(45)">
<circle cx="0" cy="0" r="10" fill="#333333" fill-opacity="0.875" transform="scale(1 1)">
<animateTransform attributeName="transform" type="scale" begin="-0.75s" values="1 1;1 1" keyTimes="0;1" dur="1s" repeatCount="indefinite"></animateTransform>
<animate attributeName="fill-opacity" keyTimes="0;1" dur="1s" repeatCount="indefinite" values="1;0" begin="-0.75s"></animate>
</circle>
</g>
</g><g transform="translate(50,86)">
<g transform="rotate(90)">
<circle cx="0" cy="0" r="10" fill="#333333" fill-opacity="0.75" transform="scale(1 1)">
<animateTransform attributeName="transform" type="scale" begin="-0.625s" values="1 1;1 1" keyTimes="0;1" dur="1s" repeatCount="indefinite"></animateTransform>
<animate attributeName="fill-opacity" keyTimes="0;1" dur="1s" repeatCount="indefinite" values="1;0" begin="-0.625s"></animate>
</circle>
</g>
</g><g transform="translate(24.54415587728429,75.45584412271572)">
<g transform="rotate(135)">
<circle cx="0" cy="0" r="10" fill="#333333" fill-opacity="0.625" transform="scale(1 1)">
<animateTransform attributeName="transform" type="scale" begin="-0.5s" values="1 1;1 1" keyTimes="0;1" dur="1s" repeatCount="indefinite"></animateTransform>
<animate attributeName="fill-opacity" keyTimes="0;1" dur="1s" repeatCount="indefinite" values="1;0" begin="-0.5s"></animate>
</circle>
</g>
</g><g transform="translate(14,50.00000000000001)">
<g transform="rotate(180)">
<circle cx="0" cy="0" r="10" fill="#333333" fill-opacity="0.5" transform="scale(1 1)">
<animateTransform attributeName="transform" type="scale" begin="-0.375s" values="1 1;1 1" keyTimes="0;1" dur="1s" repeatCount="indefinite"></animateTransform>
<animate attributeName="fill-opacity" keyTimes="0;1" dur="1s" repeatCount="indefinite" values="1;0" begin="-0.375s"></animate>
</circle>
</g>
</g><g transform="translate(24.544155877284282,24.54415587728429)">
<g transform="rotate(225)">
<circle cx="0" cy="0" r="10" fill="#333333" fill-opacity="0.375" transform="scale(1 1)">
<animateTransform attributeName="transform" type="scale" begin="-0.25s" values="1 1;1 1" keyTimes="0;1" dur="1s" repeatCount="indefinite"></animateTransform>
<animate attributeName="fill-opacity" keyTimes="0;1" dur="1s" repeatCount="indefinite" values="1;0" begin="-0.25s"></animate>
</circle>
</g>
</g><g transform="translate(49.99999999999999,14)">
<g transform="rotate(270)">
<circle cx="0" cy="0" r="10" fill="#333333" fill-opacity="0.25" transform="scale(1 1)">
<animateTransform attributeName="transform" type="scale" begin="-0.125s" values="1 1;1 1" keyTimes="0;1" dur="1s" repeatCount="indefinite"></animateTransform>
<animate attributeName="fill-opacity" keyTimes="0;1" dur="1s" repeatCount="indefinite" values="1;0" begin="-0.125s"></animate>
</circle>
</g>
</g><g transform="translate(75.4558441227157,24.544155877284282)">
<g transform="rotate(315)">
<circle cx="0" cy="0" r="10" fill="#333333" fill-opacity="0.125" transform="scale(1 1)">
<animateTransform attributeName="transform" type="scale" begin="0s" values="1 1;1 1" keyTimes="0;1" dur="1s" repeatCount="indefinite"></animateTransform>
<animate attributeName="fill-opacity" keyTimes="0;1" dur="1s" repeatCount="indefinite" values="1;0" begin="0s"></animate>
</circle>
</g>
</g></svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,33 @@
(function(factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery', 'hammerjs'], factory);
} else if (typeof exports === 'object') {
factory(require('jquery'), require('hammerjs'));
} else {
factory(jQuery, Hammer);
}
}(function($, Hammer) {
function hammerify(el, options) {
var $el = $(el);
if(!$el.data("hammer")) {
$el.data("hammer", new Hammer($el[0], options));
}
}
$.fn.hammer = function(options) {
return this.each(function() {
hammerify(this, options);
});
};
// extend the emit method to also trigger jQuery events
Hammer.Manager.prototype.emit = (function(originalEmit) {
return function(type, data) {
originalEmit.call(this, type, data);
$(this.element).trigger({
type: type,
gesture: data
});
};
})(Hammer.Manager.prototype.emit);
}));

View File

@ -0,0 +1 @@
"use strict";$(document).ready(function(){xdesktop.afterReady()});$(window).resize(function(){xdesktop.windowResize()});var xdesktop=new function(){var _this=this;this.afterReady=function(){setTimeout(function(){xdesktop.windowResize()},0);if($(".compact-message-list #listoptions fieldset").length){$("#listoptions fieldset:first").remove()}if($("body.skin-icloud.login-page").length&&!$("body.xbackground-login-image").length){var iconDiv=$("<div/>").addClass("icl-icons");var icount=0;for(var i=1;i<=13;i++){iconDiv.append($("<img/>").addClass("icl-icon-"+i).attr("src","skins/icloud/assets/images/icon-"+i+".png").attr("alt","").on("load",function(){icount++;if(icount>=13){setTimeout(function(){iconDiv.fadeIn(800)},500)}}))}$("body").append(iconDiv)}_this.enableIdentSwitch()};this.windowResize=function(){var toolbar=$(".toolbar");if(toolbar.length){var width=toolbar.width()+5;var element=$("#searchfilter");if(element.length){element.css("visibility",element.offset().left<width?"hidden":"visible")}element=$("#quicksearchbar");if(element.length){element.css("visibility",element.offset().left<width?"hidden":"visible")}}};this.enableIdentSwitch=function(){if(!rcmail.env["rcp_skin"]){return}var select=$("#plugin-ident_switch-account");if(!select.length||typeof plugin_switchIdent_addCbLarry!=="function"){return}if(plugin_switchIdent_addCbLarry(select)){select.show()}}};

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
"use strict";$(document).ready(function(){xskin.afterReady()});var xskin=new function(){var _this=this;this.afterReady=function(){_this.elastic=$("body.xelastic").length;if(!_this.elastic){$("#xshortcut-skins select").on("mouseup",function(event){event.stopPropagation()})}if(!rcmail.env.rcp_skin){return}_this.addMailboxClasses();_this.fixIdentSwitch();if($("body.xmaterial-design").length){xskin.enableMaterialDesign()}if(!_this.elastic){var iconButton=$("a.iconbutton");if(iconButton.length){iconButton.html("")}if($("body.skin-icloud #login-form").length){var loginPassword=$("#rcmloginpwd");loginPassword.after($("<button/>").attr("id","custom-login-submit").attr("type","submit"));$("#rcmloginuser").attr("placeholder",$("label[for=rcmloginuser]").text());loginPassword.attr("placeholder",$("label[for=rcmloginpwd]").text())}if(rcmail.env.xskin=="droid"){xskin.enableMaterialDesign()}else{xskin.enableSwitchboxes()}if($("#printmessageframe").length){$("body").addClass("print-message")}}if($("body.login-page").length&&!$("#logo").length){var title=$("<div>").attr("id","login-title").text(rcmail.gettext("login"));if(_this.elastic){title.insertBefore("#login-form")}else{title.prependTo("#login-form .box-inner")}}};this.applySetting=function(element,key,container,value){element=$(element);if(value!==undefined){element.val(value)}else{if(element.is(":checkbox")){value=element.is(":checked")?"yes":"no"}else{value=element.val()}}$(container).alterClass(key+"-*",key+"-"+value);$(container,window.parent.document).alterClass(key+"-*",key+"-"+value);$(".xsave-hint").fadeIn()};this.updateIFrameClasses=function(){$.each($("html").attr("class").split(/\s+/),function(index,item){if(item.indexOf("x")==0){$("html").removeClass(item)}});$.each($("body").attr("class").split(/\s+/),function(index,item){if(item.indexOf("x")==0){$("body").removeClass(item)}});$.each($("html",window.parent.document).attr("class").split(/\s+/),function(index,item){if(item.indexOf("x")==0){$("html").addClass(item)}});$.each($("body",window.parent.document).attr("class").split(/\s+/),function(index,item){if(item.indexOf("x")==0){$("body").addClass(item)}})};this.quickSkinChange=function(){var skin=$("#xshortcut-skins select").val();if(skin){location.replace("//"+location.host+location.pathname+xframework.replaceUrlParam("skin",skin))}};this.quickLanguageChange=function(){var language=$("#quick-language-change select").val();language&&(location.href=xframework.replaceUrlParam("language",language))};this.addMailboxClasses=function(){var classes=["sent","drafts","trash","archive","junk","spam"];$("#mailboxlist li.mailbox a").each(function(){var rel=$(this).attr("rel");if(rel!==undefined){rel=rel.toLowerCase();for(var i=0;i<classes.length;i++){if(rel.indexOf(classes[i])!=-1){$(this).parent("li.mailbox").addClass(classes[i])}}}})};this.disableMobileSkin=function(){var expires=new Date;expires.setFullYear(expires.getFullYear()+10);rcmail.set_cookie("rcs_disable_mobile_skin",1,expires);location.reload()};this.enableMobileSkin=function(){var expires=new Date;expires.setFullYear(expires.getFullYear()-10);rcmail.set_cookie("rcs_disable_mobile_skin","",expires);location.reload()};this.enableSwitchboxes=function(){var index=0;$("input[type='checkbox']").not(".no-switchbox").each(function(){var checkbox=$(this);var position=checkbox.css("position");var id=checkbox.attr("id");if(!id){id="switchbox-"+index;checkbox.attr("id",id);index++}var switchbox=$("<label/>").addClass("switchbox").attr("for",id).css("margin",checkbox.css("margin"));if(position=="absolute"||position=="fixed"){switchbox.css({position:position,left:checkbox.css("left"),right:checkbox.css("right"),top:checkbox.css("top"),bottom:checkbox.css("bottom"),"z-index":checkbox.css("z-index")})}switchbox.on("click",function(e){e.stopPropagation()});checkbox.addClass("switchbox-input").after(switchbox)})};this.enableMaterialDesign=function(){$(".listing td.name, .listing td.section, .listing li.listitem, #directorylist li.addressbook, "+".listing li.mailbox a, .toolbar a.button, .xmobile #taskbar > a").addClass("wave-container").on("click",function(event){var container=$(this);var size=Math.ceil(Math.max(container.outerWidth(),container.outerHeight())*2/100);var wave=$("<span/>").addClass("wave").css({height:size,width:size,left:event.offsetX+"px",top:event.offsetY+"px"});container.append(wave);setTimeout(function(){wave.remove()},600)})};this.fixIdentSwitch=function(){if(!rcmail.env["rcp_skin"]){return}var select=$("#plugin-ident_switch-account");if(!select.length||typeof plugin_switchIdent_addCbElastic!=="function"){return}if(plugin_switchIdent_addCbElastic(select)){select.show()}}};

View File

@ -0,0 +1,223 @@
@import "../../../xframework/assets/styles/_colors";
@mixin basic-styles() {
//*:not(.flatpickr-day),
// *:not(.fc-timegrid-now-indicator-arrow),
// *:not(.fc-timegrid-now-indicator-line) {
:not(.flatpickr-calendar *, .error) {
@include border-color;
}
body #layout > #layout-menu .special-buttons {
&, a {
background-color: transparent !important;
}
}
.popupmenu .listing li.selected,
.popupmenu .listing li>a:not(.disabled):hover,
.popover .menu li a:not(.disabled):hover,
{
@include background-highlight-color(5, true);
@include text-color(true);
}
html.dark-mode {
.messagelist tr:not(.flagged):not(.deleted).selected td.subject {
a,
span.msgicon.status {
color: #fff;
}
}
}
#layout #xsidebar {
border: none;
}
}
@mixin secondary-button-styles() {
div.tox .tox-button.tox-button--secondary, // html editor
.mce-window .mce-foot .mce-btn,
.btn.btn-secondary:not(.btn.btn-danger):not(.xanchor),
.btn.btn-link {
@include background-highlight-color(8);
border: 1px solid;
@include text-color(true);
@include border-strong-color(true);
&:hover {
@include background-highlight-color(12, true);
}
&.ui-dialog-titlebar-close {
border: none !important;
}
}
.mce-window .mce-foot .mce-btn button {
@include text-color(true);
}
}
@mixin primary-button-colors($background, $backgroundHighlight) {
.btn.btn-primary,
.btn.btn-success,
div.tox .tox-dialog__footer .tox-button, // html editor
.mce-window .mce-foot .mce-btn.mce-primary,
.floating-action-buttons a.button {
background-color: $background !important;
border: 1px solid $background !important;
color: #fff;
&:hover {
background-color: $backgroundHighlight !important;
}
}
.btn.disabled,
.btn:disabled {
&, &:hover {
//border: 1px solid #777 !important;
//background-color: #777 !important;
}
}
.mce-window .mce-foot .mce-btn.mce-primary button {
color: #fff !important;
}
}
@mixin switchbox-colors($normalColor, $highlightColor) {
.custom-switch .custom-control-input:checked ~ .custom-control-label {
&:before {
background-color: $normalColor !important;
border: 1px solid $normalColor !important;
}
&:hover:before {
background-color: $highlightColor !important;
border: 1px solid $highlightColor !important;
}
}
.mce-window .mce-checkbox i.mce-i-checkbox {
color: #c0c0c0;
}
.mce-window .mce-checkbox.mce-checked i.mce-i-checkbox {
color: $normalColor !important;
}
}
@mixin input-colors($borderColor) {
.custom-file-label:focus:not(.is-invalid),
.form-control:focus:not(.is-invalid),
.recipient-input.focus,
.mce-tinymce.focused,
div.tox.focused {
border-color: $borderColor !important;
}
}
@mixin anchor-colors($normalColor, $darkModeColor) {
a,
button.xanchor,
div.tox .tox-dialog .tox-dialog__body-nav-item--active,
input.icon-checkbox + label:before,
input.icon-checkbox:checked + label:before {
color: $normalColor;
html.dark-mode & {
color: $darkModeColor;
}
}
}
@mixin listing-colors($background: false, $dmBackground: false, $text: false, $dmText: false) {
#settings-menu li.selected,
.listing tr.selected td,
.listing li.selected > a,
ul.treelist li.selected > div > a,
ul.treelist li.selected > a,
.toolbarmenu.listing li:hover a.active {
@if $background {
background-color: $background;
}
@if $text {
color: $text;
} @else {
@include text-color;
}
html.dark-mode & {
@if $dmBackground {
background-color: $dmBackground;
}
@if $dmText {
color: $dmText;
} @else {
@include text-color;
}
}
}
}
@mixin unread-count-colors($background, $dmBackground: false, $text: false, $dmText: false) {
.folderlist li.mailbox .unreadcount {
@if $background {
background-color: $background !important;
}
@if $text {
color: $text;
} @else {
@include text-color;
}
html.dark-mode & {
@if $dmBackground {
background-color: $dmBackground !important;
}
@if $dmText {
color: $dmText;
} @else {
@include text-color;
}
}
}
}
@mixin logo-background-color($background: false, $dmBackground: false) {
#layout-menu .popover-header {
@if $background {
background-color: $background !important;
}
html.dark-mode & {
@if $dmBackground {
background-color: $dmBackground !important;
}
}
}
}
@mixin datepicker-colors($background: false, $dmBackground: false) {
.ui-datepicker {
a.ui-state-active {
@if $background {
background-color: $background !important;
}
html.dark-mode & {
@if $dmBackground {
background-color: $dmBackground !important;
}
}
}
}
}

View File

@ -0,0 +1,518 @@
* {
text-shadow: none !important;
box-shadow: none !important;
-o-box-shadow: none !important;
-webkit-box-shadow: none !important;
-moz-box-shadow: none !important;
}
.ui-dialog {
box-shadow: 1px 1px 18px #666 !important;
}
*:focus { /* remove chrome border around active fields */
outline: none;
}
body {
margin: 0;
padding: 0;
color: #333;
background: #fff;
}
body,
#login-form .box-inner,
#login-form .box-bottom {
background-image: none;
}
a {
outline: none;
}
/* buttons */
input[type="button"],
input[type="submit"],
input[type="reset"],
button,
button.ui-button,
a.button,
input.button {
&,
.formbuttons & {
border: 1px solid #adadad;
color: #212121;
background: #fff;
font-weight: normal;
cursor: pointer;
}
&:hover,
&:active,
&:focus,
.formbuttons &:hover {
border-color: #949494;
color: #212121;
background: #efefef;
}
}
body:not(.skin-litecube) {
.prevpage,
.nextpage {
background: transparent !important;
}
}
.buttongroup a.button {
background: #fff !important;
&.selected {
background: #aaa !important;
}
}
#look-and-feel-shortcut a.btn {
display: block;
text-align: center;
margin-top: 8px;
text-decoration: none;
padding: 3px;
border-radius: 3px;
}
ul.toolbarmenu li a.icon {
padding-top: 6px !important;
padding-bottom: 6px !important;
}
#login-form input[type="text"],
#login-form input[type="password"],
input[type=text],
input[type=email],
input[type=password],
textarea {
margin-bottom: 0;
padding: 5px;
border: 1px solid #ccc !important;
background: #fff;
border-radius: 0;
}
textarea:focus,
textarea:hover,
input[type=text]:focus,
input[type=text]:hover,
input[type=password]:focus,
input[type=password]:hover,
select:focus,
select:hover {
border-color: #8f8f8f;
}
.propform {
fieldset > legend {
font-weight: bold !important;
}
input[type=text],
input[type=password],
input[type=email],
select {
width: 100%;
max-width: 600px;
margin-right: 0;
margin-left: 0;
box-sizing: border-box;
&.error {
border-color: #d30000 !important;
}
}
}
select {
/*margin-bottom: 8px;*/
margin-right: 4px;
border: 1px solid #ccc;
padding: 5px;
background: #fff;
border-radius: 0 !important;
color: #333;
height: auto;
}
select.decorated option {
background: #fff;
color: #333;
}
fieldset {
border-radius: 0 !important;
border: 1px solid #ddd;
}
legend {
font-weight: normal !important;
font-style: normal !important;
color: #333;
}
.messagelist tr>.flag span,
.messagelist tr>.status span,
.messagelist tr>.attachment span,
.messagelist tr>.priority span {
text-indent: 0;
}
#interface-options span.tooltip {
display: none;
}
#messagestack div:after {
position: absolute !important;
}
.formbuttons {
text-align: right;
padding-right: 10px;
}
.ui-dialog-titlebar {
display: flex;
align-items: center;
button {
border: none;
}
}
body.iframe .footerleft.floating,
#composeview-bottom .formbuttons.floating {
right: 0;
width: auto;
}
body.print-message,
#printmessageframe {
background: #fff !important;
}
.minicolors-swatch .minicolors-swatch-color {
border-radius: 5px;
}
/* iehacks */
input.button,
.formbuttons input.button,
.formbuttons input.button:active,
input.button.mainaction,
input.button.mainaction:active,
a.button,
a.button.pressed,
a.button:active,
input.button:active,
.pagenav.dark a.button,
.pagenav.dark a.button.pressed,
#message.statusbar,
.ui-dialog.popupmessage .ui-dialog-titlebar,
.ui-dialog.popupmessage .ui-widget-content,
#topnav,
.records-table tr.selected td,
.contentbox .boxtitle,
body.iframe .boxtitle,
#login-form input.button,
#login-form input.button:active,
.toolbar a.button,
a.menuselector,
a.menuselector:active,
.googie_list td.googie_list_onhover,
ul.toolbarmenu li a.active:hover,
#rcmKSearchpane ul li.selected,
.tabsbar .tablink,
.tabsbar .selected a,
.contactfieldgroup,
.contactfieldgroup legend,
#messagelistfooter,
#mailboxlist li.mailbox .unreadcount,
#mailboxlist li.mailbox.selected > a .unreadcount,
#messageheader, #partheader, #composeheaders,
#previewheaderstoggle {
filter: none;
}
/* login */
#login-form td.title {
color: #333;
}
#login-form input[type="text"],
#login-form input[type="password"] {
border: 1px solid #ddd;
background: #fff;
}
#ifplcontainer div label {
color: #333;
}
#login-form {
select#_language {
width: 100% !important;
}
}
/* switch checkboxes */
input.switchbox-input {
opacity: 0 !important;
position: absolute !important;
}
label.switchbox {
font-size: 1em;
position: relative;
display: inline-block !important;
padding: 0 !important;
width: 2em !important;
height: 1.1em !important;
background: #a5a5a5 !important;
border: 1px solid #ddd !important;
border-radius: 1em !important;
vertical-align: -0.15em !important;
transition: all 0.5s cubic-bezier(.17,.67,.43,.98);
cursor: pointer;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-webkit-tap-highlight-color: transparent;
tap-highlight-color: transparent;
}
label.switchbox:hover {
background: #ddd !important;
}
label.switchbox:after {
position: absolute !important;
display: block !important;
content: '' !important;
top: 1px !important;
left: 1px !important;
bottom: 1px !important;
width: 1em !important;
border-radius: 50% !important;
background: #fff !important;
box-shadow: 0 0 0.1em 0 #aaa !important;
}
input.switchbox-input:checked + label.switchbox {
background: #4cd964 !important;
border-color: #4cd964 !important;
}
input.switchbox-input:checked + label.switchbox:hover {
background: #41c658 !important;
}
input.switchbox-input:checked + label.switchbox:after {
left: auto !important;
right: 1px !important;
box-shadow: 0 0 0.1em 0 #aaa !important;
}
body.xskin input.switchbox-input:disabled + label.switchbox,
body.xskin input.switchbox-input:checked:disabled + label.switchbox {
background: #ddd !important;
border-color: #ddd !important;
cursor:not-allowed;
}
input.switchbox-input:disabled + label.switchbox:after,
input.switchbox-input:checked:disabled + label.switchbox:after {
background: #eee !important;
}
// fix positioning
#subscription-table label.switchbox,
#subscription-table label.material.checkbox {
left: auto !important;
}
/* compose */
.mce-btn,
.mce-btn button,
button.mce-close {
background: transparent !important;
border: none !important;
margin-right: 2px !important;
}
.mce-btn .mce-txt,
.mce-btn button {
color: #333 !important;
}
.mce-colorbutton:hover .mce-open {
border-color: transparent !important;
}
i.mce-i-backcolor {
background-color: transparent !important;
}
.mce-widget button {
text-transform: none;
}
#composeoptions {
border: none;
}
#composeheaders .moreheaderstoggle {
border: none !important;
background: transparent !important;
}
.moreheaderstoggle .iconlink {
top: auto;
bottom: 2px;
}
.moreheaderstoggle.remove .iconlink {
bottom: 2px;
}
#composebodycontainer .mce-tinymce {
margin-top: 0;
}
#compose-attachments {
top: 0;
border: 0;
border-left: 1px solid #DFDFDF;
}
#composebodycontainer .mce-edit-area {
border-top: 1px solid #DFDFDF !important;
}
// html editor buttons
button.tox-tbtn,
button.tox-button,
button.mce-close {
color: #222f3e !important;
background: transparent !important;
&:hover {
background: #dee0e2 !important;
}
}
.tox-dialog {
border: 1px solid #bbbbbb;
}
.tox-dialog__footer {
button.tox-button {
background: #fff;
border: 1px solid #aaa;
font-weight: normal;
}
button.tox-button--secondary {
border: 1px solid #ddd;
}
}
/* plugin: treecol */
#mailview-tc-mid,
#mailview-tc-right {
top: 0;
}
/* plugin: xcalendar */
.xcalendar .fc-state-default, .xcalendar .boxtitle button {
color: #333;
}
/* plugin: help */
#helptoolbar a.button.help {
display: none; // this button doesn't do anything
}
/* plugin: rcguard */
#recaptcha_area {
padding: 0 !important;
}
/* plugin managesieve */
#filter-form {
select,
input,
textarea {
font-size: 1em;
padding: 4px;
}
.rulerow .listarea {
padding: 0;
border: 1px solid #ddd;
background: transparent;
.listelement {
height: auto;
.reset {
margin-top: 3px;
background-color: transparent;
}
input {
padding: 4px !important;
background: transparent;
border: none !important;
line-height: normal;
margin-left: 5px;
font-size: 1.2em;
}
}
}
}
/* plugin: filters */
.xskin #pluginbody #filters-form {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
overflow: auto;
.uibox.listbox.scroller {
position: static;
margin-top: 0 !important;
border: none;
box-shadow: none !important;
}
.boxcontent {
border: none;
box-shadow: none;
}
}

View File

@ -0,0 +1,97 @@
.uibox .boxtitle,
.uibox .listing thead td,
.uibox .listing thead th {
background: #aaa;
color: #fff !important;
}
a.menuselector {
color: #333 !important;
border: 1px solid #ccc;
background: #fff;
}
#mailboxlist li.mailbox ul {
border-top-color: #ddd;
}
.toolbar a.button,
.pagenavbuttons a.button {
background-color: transparent !important;
}
.popupmenu,
#rcmKSearchpane {
border-color: #999;
border-width: 2px !important;
border-style: solid !important;
background: #fff;
color: #333;
padding: 0;
}
.popupmenu li,
.popupmenu a {
background-image: none !important;
}
.popupmenu a,
.googie_list td span,
ul.toolbarmenu li a {
color: #aaa;
&.active {
color: #333;
}
}
#enigmamenu {
overflow-y: hidden;
label {
color: #333;
}
}
.googie_list td,
ul.toolbarmenu li,
ul.toolbarmenu li label,
ul.toolbarmenu li a.icon,
#rcmKSearchpane ul li {
color: #333;
}
.googie_list td.googie_list_onhover,
ul.toolbarmenu li a.active:hover,
ul.toolbarmenu li a.active:focus,
#rcmKSearchpane ul li.selected,
select.decorated option:hover,
select.decorated option[selected='selected'] {
background: #e9e9e9 !important;
}
.googie_list td span, ul.toolbarmenu li a.active {
cursor: pointer;
}
.popupmenu a:hover {
cursor: pointer;
}
#background-more-actions a {
color: #333;
}
#interface-options {
color: #333;
}
// plugin: primitivenotes
#newmenu.popupmenu a {
color: #333 !important;
&:hover {
background: #e9e9e9;
}
}

View File

@ -0,0 +1,27 @@
a.button,
.uibox,
.uibox .boxtitle,
.uibox .listing thead td,
.uibox .listing thead th,
a.menuselector,
#messagestack .notice,
input.button,
.formbuttons input.button,
input.button.mainaction,
input.button.mainaction:active,
#login-form input.button,
#mailboxlist li,
.listbox .boxfooter,
.contentbox .boxtitle,
body.iframe .boxtitle,
.contactfieldgroup legend,
.records-table thead td,
.records-table thead th,
#messagelistfooter,
.popupmenu,
#rcmKSearchpane,
body.xlarry-font-icons #mailboxlist li.mailbox .unreadcount,
.minicolors-swatch .minicolors-swatch-color {
border-radius: 0 !important;
}

View File

@ -0,0 +1,212 @@
@import "../../../xframework/assets/styles/_colors";
@mixin font-family($font) {
body, button, input, optgroup, select, textarea, .popover {
font-family: $font;
}
}
// user option: font family
html.xfont-family-arial { @include font-family((Arial, Helvetica, sans-serif)); }
html.xfont-family-courier { @include font-family(("Courier New", Courier, monospace)); }
html.xfont-family-merienda { @include font-family(('Merienda', cursive)); }
html.xfont-family-montserrat { @include font-family(('Montserrat Alternates', sans-serif)); }
html.xfont-family-noto-sans { @include font-family(('Noto Sans', sans-serif)); }
html.xfont-family-quattrocento { @include font-family(('Quattrocento', serif)); }
html.xfont-family-roboto { @include font-family(("Roboto", sans-serif)); }
html.xfont-family-sarala { @include font-family(('Sarala', sans-serif)); }
html.xfont-family-times { @include font-family(("Times New Roman", Times, serif)); }
html.xfont-family-ubuntu { @include font-family(('Ubuntu', sans-serif)); }
// user option: font thickness
html.xthick-font-yes body * {
font-weight: bold !important;
}
// user option: font size
html, body {
font-size: 14px;
}
html.xfont-size-xs {
&, body { font-size: 12px; }
}
html.xfont-size-s {
&, body { font-size: 13px; }
}
html.xfont-size-l {
&, body { font-size: 15px; }
}
html.xfont-size-xl {
&, body { font-size: 16px; }
}
// user option: icons in lists
body.xlist-icons-no {
.scroller .listing.iconized li > a:before,
.scroller .listing.iconized tr > td.section:before,
.scroller .listing.iconized tr.contact > td:before,
.scroller .folderlist li > a:before,
.popupmenu:not(#spell-menu) .listing a:before {
display: none !important;
}
}
// user option: icons on buttons
body.xbutton-icons-no button.btn {
&:not(.ui-dialog-titlebar-close):before {
display: none !important;
}
}
// skin option: normal (not bold) header font
body.xnormal-header-font {
#layout > div > .header,
#layout > div > .footer,
.folderlist li.mailbox .unreadcount,
#sidebar-calendar .ui-datepicker select {
font-weight: normal;
}
}
// skin option: inverted colors on header
body.xinverted-header-colors {
&.xsidebar-mobile-visible #xsidebar #xsidebar-mobile-header a {
color: #fff;
}
#messagelist-header,
#layout > div > .header {
border-bottom: none;
}
}
// skin option: no icons on taskbar
@media screen and (min-width: 480px) {
body.xno-taskbar-icons {
#taskmenu a {
padding: 0;
height: 36px;
font-size: 1rem;
&:before {
line-height: 36px;
}
span.inner {
display: none;
}
}
}
}
// skin option: no border radius
body.xno-border-radius {
* :not(.spinner) {
border-radius: 0 !important;
}
}
// skin option: inverted menu
body.xinverted-menu {
#sidebar-calendar .ui-datepicker {
border-left: 1px solid !important;
border-right: 1px solid !important;
@include border-color(true);
}
#layout>div>.header {
background: #ddd;
&,
.menu.toolbar a,
a.button,
select {
color: #fff;
}
}
.header {
.listing li {
border: none;
}
}
#layout-sidebar,
#layout-list,
#layout-content {
border: none !important;
.iframe-wrapper,
.searchbar,
.footer,
.scroller {
border-left: 1px solid;
@include border-color;
}
#calendar-list-container {
border-right: 1px solid;
@include border-color;
}
// fix for rc 1.5 vs 1.4
#compose-content {
border-left: 1px solid;
@include border-color;
.scroller {
border: none;
}
}
}
#layout > div.sidebar {
.pagenav,
.scroller,
.footer {
border-left: 1px solid;
@include border-color;
}
}
#layout > #layout-menu {
border-right: none;
&,
#taskmenu .action-buttons a {
background-color: #F4F4F4 !important;
}
#taskmenu a {
@include text-color(true);
background-color: transparent !important;
&.selected,
&.selected:hover,
&:hover {
@include background-highlight-color(10, true);
}
}
}
}
html.dark-mode body.xinverted-menu {
#layout > #layout-menu {
background-color: #21292c !important;
#taskmenu .action-buttons a {
background-color: transparent !important;
}
}
.floating-action-buttons a {
color: #fff;
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,361 @@
@import "_options";
@import "../../../xframework/assets/styles/_colors";
.btn {
// border: none !important;
box-shadow: none !important;
}
// gray out disabled dialog buttons
.xelastic div.ui-dialog-buttonset button.btn:disabled {
background-color: #aaa !important;
}
.form-control:focus,
.recipient-input.focus,
.mce-tinymce.focused, // rc 1.4 html editor
div.tox.focused, // rc 1.5 html editor
div.tox .tox-color-input>input:focus,
div.tox .tox-selectfield select:focus,
div.tox .tox-textarea:focus,
div.tox .tox-textfield:focus {
box-shadow: none !important;
}
body .ui-dialog .ui-dialog-titlebar .ui-dialog-titlebar-close {
&, &:hover {
@include text-color(true);
background: transparent !important;
}
}
body.xelastic {
.menu a:not(.disabled),
.menu.toolbar .dropbutton:not(.disabled),
.header a.button.icon:not(.disabled),
.menu.toolbar .dropbutton a.dropdown,
.menu.toolbar .menuitem:not(.select) {
&:hover,
&:focus {
background-color: rgba(255, 255, 255, .15);
}
}
.menu span.dropbutton a {
&:hover,
&:focus {
background-color: transparent !important;
}
}
}
html.dark-mode {
#settings-menu li.selected,
.listing tr.selected td,
.listing li.selected,
ul.treelist li.selected,
ul.treelist li.selected,
.toolbar a.button:not(.disabled):focus,
.toolbar a.button:not(.disabled):hover,
.toolbarmenu.listing li:hover a.active,
.menu.toolbar .dropbutton:not(.disabled):hover,
.popupmenu .listing li > a:not(.disabled):hover,
#taskmenu a:hover,
.header a.button.icon:not(.disabled):focus,
.header a.button.icon:not(.disabled):hover,
.menu a:not(.disabled):focus,
.menu a:not(.disabled):hover {
background-color: rgba(255, 255, 255, .06);
}
.listing li.selected > a,
ul.treelist li.selected > div > a,
ul.treelist li.selected > a {
background-color: transparent;
}
}
.popover {
font-size: 1rem;
.menu li a[aria-haspopup]:hover:after {
@include text-color;
}
}
// login page (both elastic and larry)
body.xskin.login-page {
#login-title {
display: block;
margin: 0 0 20px 0;
text-align: center;
font-size: 1.8em;
}
#logo {
position: static;
display: block;
box-sizing: border-box;
max-width: 100%;
margin: auto;
padding-bottom: 10px;
}
#login-footer,
#bottomline {
position: fixed;
bottom: 0;
left: 0;
right: 0;
padding: 8px;
background: rgba(0, 0, 0, 0.4);
text-align: left;
color: #fff;
font-size: 0.8em;
a {
color: #fff;
text-decoration: none;
&:hover {
text-decoration: underline;
}
}
}
#vendor-branding {
position: fixed;
bottom: 3px;
right: 8px;
display: block;
width: 20px;
height: 20px;
z-index: 1;
background: rgba(0, 0, 0, .2);
border-radius: 5px !important;
text-decoration: none;
color: #fff;
font-weight: bold;
font-size: 18px;
text-align: center;
line-height: 1em;
&:hover {
background: #cc0000;
}
}
}
// login page (elastic only)
body.xelastic.login-page {
background: #f0f0f0;
#layout {
display: block !important;
}
#layout-content {
overflow: visible;
margin: 20vh auto 0 auto !important;
color: #333;
max-width: 100%;
width: 420px;
background: #fff !important;
padding: 35px;
flex: none;
#login-form {
position: static;
max-width: 100%;
width: 100%;
box-sizing: border-box;
table {
width: 100% !important;
border-collapse: collapse;
tr.row {
max-width: 100%;
td {
display: block;
padding-bottom: 5px;
&.title {
display: block !important;
line-height: 1.1em;
padding-top: 4px;
}
}
}
}
input[type='text'],
input[type='password'],
select {
width: 100%;
font-size: 1.2rem;
}
}
.input-group-prepend {
display: none;
}
.formbuttons {
margin: 20px 0 0 0;
button {
margin: 0;
padding: 0.6rem;
}
}
}
&:not(.xbackground-login-image) #login-footer {
background: transparent;
&, a {
color: #717171;
}
}
html.dark-mode & {
background: #21292c;
#layout-content {
color: #f4f4f4;
background-color: #313c40 !important;
}
&:not(.xbackground-login-image) #login-footer {
background: transparent;
&, a {
color: #eee;
}
}
}
}
// skin look and feel
.skin_look_and_feel {
.color-box {
display: inline-block;
height: 20px;
width: 20px;
margin: 0 4px 4px 0;
cursor: pointer;
}
.xsave-hint {
display: none;
&:before {
margin-right: 6px;
}
}
}
// remove right border from lists
html:not(.touch) .listing li>a:focus,
html:not(.touch) .listing.focus tbody tr.focused>td:first-child,
html:not(.touch) .listing.focus:not(.withselection) tbody tr.focused>td.selection+td {
border-left-color: transparent;
}
// correct icon positions and colors
.popover-body :before {
position: relative;
top: 1px;
}
.input-group-text.icon:before {
@include text-color;
}
.xicons-outlined {
.input-group-text.icon:before,
.popover-body :before {
top: 2px;
}
.popover-header a.icon:before {
position: relative;
top: 2px;
}
}
// checkboxes
.custom-switch .custom-control-input {
&:focus:not(:checked) ~ .custom-control-label::before {
border-color: #adb5bd;
}
&:focus ~ .custom-control-label::before {
box-shadow: none !important;
}
&:checked~.custom-control-label::before { // overwrite this in skin colors
border-color: #888;
background-color: #888;
}
}
// popupmenu
@media screen and (min-width: 768px) {
.popupmenu:not(#listoptions-menu) {
@include border-color;
ul {
list-style: none;
padding: 0;
margin: 0;
li {
border-bottom: 1px solid;
@include border-color;
&:last-child {
border-bottom: none;
}
a {
display: block;
@include text-color;
&:hover {
text-decoration: none;
}
span {
padding: 0;
height: auto;
}
}
}
}
}
}
@media screen and (max-width: 480px) {
#button-apps span.inner {
display: inline;
}
// reset button settings on smallest screens
body.xelastic .ui-dialog-buttonpane .ui-dialog-buttonset .btn {
background: transparent !important;
border: none !important;
}
}
@media screen and (min-width: 1025px) {
#taskmenu a:focus {
background-color: transparent !important;
}
}

View File

@ -0,0 +1,16 @@
{
"name": "roundcubeplus/xskin",
"type": "roundcube-plugin",
"description": "Enables Roundcube Plus interface skin and mobile functionality. This plugin must be added to the plugin array for the Roundcube Plus skins to work.",
"license": "Commercial",
"version": "1.9.2",
"homepage": "https://roundcubeplus.com",
"authors": [
{
"name": "Roundcube Plus",
"email": "contact@roundcubeplus.com"
}
],
"repositories": [],
"require": {}
}

View File

@ -0,0 +1,92 @@
<?php
/**
* Roundcube Plus Skin plugin.
*
* Copyright 2019, Tecorama LLC.
*
* @license Commercial. See the LICENSE file for details.
*/
// Specify the url to the branding image that should be displayed as the message preview watermark. If this option is set to null, the skins
// will use the default watermark located here: [roundcube]/plugins/xskin/assets/images/watermark.png
// Example: $config['preview_branding'] = 'http://yourdomain.com/images/watermark.png';
// Default: null
$config['preview_branding'] = '/plugins/xskin/assets/images/MultiBox_logo-512px_mail-b.png';
// This setting allows you to always include a custom css file regardless of which skin is loaded.
// Example: $config['overwrite_css'] = 'http://yourdomain.com/styles/custom.css';
// Default: null
$config['overwrite_css'] = null;
// Set this option to true if you want to remove the skin selection from the interface option dropdown menu.
// Default: false
$config['disable_menu_skins'] = false;
// Set this option to true if you want to remove the language selection from the interface option dropdown menu.
// Default: false
$config['disable_menu_languages'] = false;
// Set this option to true if you want to disable mobile detection and force the skins to use the desktop interface on mobile devices. This
// setting is applicable only to the larry-based skins; it will have no effect on the elastic-based skins.
// NOTE: This setting applies to Larry-based skins only.
// Default: false
$config['disable_mobile_interface'] = false;
// Specify the third-party plugins you use that don't function properly and should be disabled on mobile devices.
// NOTE: This setting applies to Larry-based skins only.
// Default: []
$config['disable_plugins_on_mobile'] = [];
// If you find that the Roundcube html editor causes problems on mobile devices, you can disable the html composition support on mobile
// devices by setting this option to false.
// NOTE: This setting applies to Larry-based skins only.
// Default: true
$config['allow_mobile_html_composing'] = true;
// Set this option to true if you want to disable the skin color-changing menu. If you disable the menu, the skins will use the color last
// selected by the user or if the user never changed the color, the default color specified in [roundcube]/skins/[skin_name]/settings.php
// NOTE: This setting applies to Larry-based skins only.
// Default: false
$config['disable_menu_colors'] = false;
// By default the skins use fonts loaded from the remote Google font repository. Set this value to true to disable the remote fonts and
// force the skins to use locally hosted fonts only. For the elastic-based skins it will be a local copy of Roboto (included with elastic)
// and for the larry-based skins it will be a locally available sans-serif font with preference for Lucida Grande or Verdana. Setting this
// value to true will also disable the font selection in the skins' Look & Feel settings section.
// Default: false
$config['disable_remote_skin_fonts'] = false;
// Specify the plugins that don't follow the Roundcube plugin development guidelines regarding skin support. Some developers don't
// account for the possibility of their plugins being used under different skins than the default 'larry' and 'classic'. They hard-code
// those skin names into their code which effectively makes the plugins unusable under any other skin. The xskin plugin can fix this problem
// by making those plugin believe they run under larry even if in reality they run under a different skin. For this functionality to work,
// the xskin plugin must be included at the very beginning of the plugin array in config/config.inc.php.
$config['fix_plugins'] = [
"carddav",
"compose_in_taskbar",
"contactus",
"google_ads",
"impressum",
"jappix4roundcube",
"keyboard_shortcuts",
"message_highlight",
"moreuserinfo",
"myrc_sprites",
"nabble",
"persistent_login",
"planner",
"plugin_manager",
"pwtools",
"register",
"settings",
"sticky_notes",
"taskbar",
"tasklist",
"timepicker",
"threecol",
"scheduled_sending",
"summary",
"vcard_send",
"vkeyboard",
];

View File

@ -0,0 +1,40 @@
<?php
/**
* Roundcube Plus Skin plugin.
*
* Copyright 2019, Tecorama LLC.
*
* @license Commercial. See the LICENSE file for details.
*/
$labels = [];
// larry based
$labels['interface_options'] = 'خيارات الواجهة';
$labels['disable_mobile_skin'] = 'استخدام مظهر سطح المكتب';
$labels['enable_mobile_skin'] = 'استخدام بشرة الهاتف المحمول';
// elastic based
$labels['skin_look_and_feel_shortcut'] = 'مظهر البشرة وملمسها';
$labels['skin_look_and_feel'] = 'مظهر البشرة وملمسها';
$labels['setting_icons'] = 'الأيقونات';
$labels['icons_solid'] = 'صلبة';
$labels['icons_traditional'] = 'تقليدي';
$labels['icons_outlined'] = 'الخطوط العريضة';
$labels['icons_material'] = 'المواد';
$labels['icons_cartoon'] = 'رسوم متحركة';
$labels['setting_list_icons'] = 'الأيقونات في القوائم';
$labels['setting_button_icons'] = 'أيقونات على الأزرار';
$labels['setting_font_size'] = 'حجم الخط';
$labels['font_size_xs'] = 'الأصغر';
$labels['font_size_s'] = 'أصغر';
$labels['font_size_n'] = 'عادي';
$labels['font_size_l'] = 'أكبر';
$labels['font_size_xl'] = 'الأكبر';
$labels['setting_thick_font'] = 'خط سميك';
$labels['setting_font_family'] = 'عائلة الخط';
$labels['setting_color'] = 'اللون';
$labels['save_hint'] = 'لا تنسَ حفظ إعداداتك بالنقر على زر "حفظ" أدناه.';

View File

@ -0,0 +1,40 @@
<?php
/**
* Roundcube Plus Skin plugin.
*
* Copyright 2019, Tecorama LLC.
*
* @license Commercial. See the LICENSE file for details.
*/
$labels = [];
// larry based
$labels['interface_options'] = 'Опции на интерфейса';
$labels['disable_mobile_skin'] = 'Използване на кожата на работния плот';
$labels['enable_mobile_skin'] = 'Използване на мобилна кожа';
// elastic based
$labels['skin_look_and_feel_shortcut'] = 'Вид и усещане на кожата';
$labels['skin_look_and_feel'] = 'Вид и усещане на кожата';
$labels['setting_icons'] = 'Икони';
$labels['icons_solid'] = 'Solid';
$labels['icons_traditional'] = 'Традиционен';
$labels['icons_outlined'] = 'Очертан';
$labels['icons_material'] = 'Материал';
$labels['icons_cartoon'] = 'Карикатура';
$labels['setting_list_icons'] = 'Икони в списъци';
$labels['setting_button_icons'] = 'Икони върху бутоните';
$labels['setting_font_size'] = 'Размер на шрифта';
$labels['font_size_xs'] = 'Най-малкият';
$labels['font_size_s'] = 'По-малко';
$labels['font_size_n'] = 'Нормален';
$labels['font_size_l'] = 'По-голям';
$labels['font_size_xl'] = 'Най-големият';
$labels['setting_thick_font'] = 'Дебел шрифт';
$labels['setting_font_family'] = 'Семейство шрифтове';
$labels['setting_color'] = 'Цвят';
$labels['save_hint'] = 'Не забравяйте да запазите настройките си, като кликнете върху бутона "Запази" по-долу.';

View File

@ -0,0 +1,40 @@
<?php
/**
* Roundcube Plus Skin plugin.
*
* Copyright 2019, Tecorama LLC.
*
* @license Commercial. See the LICENSE file for details.
*/
$labels = [];
// larry based
$labels['interface_options'] = 'Možnosti rozhraní';
$labels['disable_mobile_skin'] = 'Použití skinu na ploše';
$labels['enable_mobile_skin'] = 'Použití mobilní kůže';
// elastic based
$labels['skin_look_and_feel_shortcut'] = 'Vzhled a pocit pokožky';
$labels['skin_look_and_feel'] = 'Vzhled a pocit pokožky';
$labels['setting_icons'] = 'Ikony';
$labels['icons_solid'] = 'Solid';
$labels['icons_traditional'] = 'Tradiční';
$labels['icons_outlined'] = 'Načrtnuto';
$labels['icons_material'] = 'Materiál';
$labels['icons_cartoon'] = 'Kreslený film';
$labels['setting_list_icons'] = 'Ikony v seznamech';
$labels['setting_button_icons'] = 'Ikony na tlačítkách';
$labels['setting_font_size'] = 'Velikost písma';
$labels['font_size_xs'] = 'Nejmenší';
$labels['font_size_s'] = 'Menší';
$labels['font_size_n'] = 'Normální';
$labels['font_size_l'] = 'Větší';
$labels['font_size_xl'] = 'Největší';
$labels['setting_thick_font'] = 'Silné písmo';
$labels['setting_font_family'] = 'Rodina písma';
$labels['setting_color'] = 'Barva';
$labels['save_hint'] = 'Nezapomeňte uložit nastavení kliknutím na tlačítko "Uložit" níže.';

View File

@ -0,0 +1,40 @@
<?php
/**
* Roundcube Plus Skin plugin.
*
* Copyright 2019, Tecorama LLC.
*
* @license Commercial. See the LICENSE file for details.
*/
$labels = [];
// larry based
$labels['interface_options'] = 'Indstillinger for grænseflader';
$labels['disable_mobile_skin'] = 'Brug desktop skin';
$labels['enable_mobile_skin'] = 'Brug mobil hud';
// elastic based
$labels['skin_look_and_feel_shortcut'] = 'Brugerfladens udseende';
$labels['skin_look_and_feel'] = 'Brugerfladens udseende';
$labels['setting_icons'] = 'Ikoner';
$labels['icons_solid'] = 'Solid';
$labels['icons_traditional'] = 'Traditionel';
$labels['icons_outlined'] = 'Skitseret';
$labels['icons_material'] = 'Materiale';
$labels['icons_cartoon'] = 'Tegneserie';
$labels['setting_list_icons'] = 'Ikoner i lister';
$labels['setting_button_icons'] = 'Ikoner på knapper';
$labels['setting_font_size'] = 'Skriftstørrelse';
$labels['font_size_xs'] = 'Mindste';
$labels['font_size_s'] = 'Mindre';
$labels['font_size_n'] = 'Normal';
$labels['font_size_l'] = 'Større';
$labels['font_size_xl'] = 'Største';
$labels['setting_thick_font'] = 'Tyk skrifttype';
$labels['setting_font_family'] = 'Skrifttypefamilie';
$labels['setting_color'] = 'Farve';
$labels['save_hint'] = 'Glem ikke at gemme dine indstillinger ved at klikke på knappen "Gem" nedenfor.';

View File

@ -0,0 +1,39 @@
<?php
/**
* Roundcube Plus Skin plugin.
*
* Copyright 2019, Tecorama LLC.
*
* @license Commercial. See the LICENSE file for details.
*/
$labels = [];
// larry based
$labels['interface_options'] = 'Bedienoberflächeneinstellungen';
$labels['disable_mobile_skin'] = 'Benutze Desktop Skin';
$labels['enable_mobile_skin'] = 'Benutze Mobilen skin';
// elastic based
$labels['skin_look_and_feel_shortcut'] = 'Skin Einstellungen';
$labels['skin_look_and_feel'] = 'Skin Einstellungen';
$labels['setting_icons'] = 'Icons';
$labels['icons_solid'] = 'Solid';
$labels['icons_traditional'] = 'Traditional';
$labels['icons_outlined'] = 'Outlined';
$labels['icons_material'] = 'Material';
$labels['icons_cartoon'] = 'Cartoon';
$labels['setting_list_icons'] = 'Integriere Icons in Listen';
$labels['setting_button_icons'] = 'Integriere Icons in Knöpfen';
$labels['setting_font_size'] = 'Schriftgröße';
$labels['font_size_xs'] = 'Kleinste';
$labels['font_size_s'] = 'Kleiner';
$labels['font_size_n'] = 'Normal';
$labels['font_size_l'] = 'Größer';
$labels['font_size_xl'] = 'Größte';
$labels['setting_thick_font'] = 'Konturstarke Schrift';
$labels['setting_font_family'] = 'Schriftartenfamilie';
$labels['setting_color'] = 'Farbe';
$labels['save_hint'] = 'Nicht vergessen die Einstellungen per Klick auf den unten stehenden \'Speichern\' Knopf zu sichern.';

View File

@ -0,0 +1,40 @@
<?php
/**
* Roundcube Plus Skin plugin.
*
* Copyright 2019, Tecorama LLC.
*
* @license Commercial. See the LICENSE file for details.
*/
$labels = [];
// larry based
$labels['interface_options'] = 'Επιλογές διασύνδεσης';
$labels['disable_mobile_skin'] = 'Χρήση επιφάνειας εργασίας';
$labels['enable_mobile_skin'] = 'Χρησιμοποιήστε το δέρμα του κινητού';
// elastic based
$labels['skin_look_and_feel_shortcut'] = 'Εμφάνιση & αίσθηση του δέρματος';
$labels['skin_look_and_feel'] = 'Εμφάνιση & αίσθηση του δέρματος';
$labels['setting_icons'] = 'Εικόνες';
$labels['icons_solid'] = 'Στερεά';
$labels['icons_traditional'] = 'Παραδοσιακό';
$labels['icons_outlined'] = 'Σκιαγραφημένο';
$labels['icons_material'] = 'Υλικό';
$labels['icons_cartoon'] = 'Κινούμενα σχέδια';
$labels['setting_list_icons'] = 'Εικονίδια σε λίστες';
$labels['setting_button_icons'] = 'Εικονίδια στα κουμπιά';
$labels['setting_font_size'] = 'Μέγεθος γραμματοσειράς';
$labels['font_size_xs'] = 'Το μικρότερο';
$labels['font_size_s'] = 'Μικρότερο';
$labels['font_size_n'] = 'Κανονικό';
$labels['font_size_l'] = 'Μεγαλύτερο';
$labels['font_size_xl'] = 'Μεγαλύτερο';
$labels['setting_thick_font'] = 'Παχιά γραμματοσειρά';
$labels['setting_font_family'] = 'Οικογένεια γραμματοσειρών';
$labels['setting_color'] = 'Χρώμα';
$labels['save_hint'] = 'Μην ξεχάσετε να αποθηκεύσετε τις ρυθμίσεις σας κάνοντας κλικ στο κουμπί "Αποθήκευση" παρακάτω.';

View File

@ -0,0 +1,40 @@
<?php
/**
* Roundcube Plus Skin plugin.
*
* Copyright 2019, Tecorama LLC.
*
* @license Commercial. See the LICENSE file for details.
*/
$labels = [];
// larry based
$labels['interface_options'] = 'Interface Options';
$labels['disable_mobile_skin'] = 'Use desktop skin';
$labels['enable_mobile_skin'] = 'Use mobile skin';
// elastic based
$labels['skin_look_and_feel_shortcut'] = 'Skin Look & Feel';
$labels['skin_look_and_feel'] = 'Skin Look & Feel';
$labels['setting_icons'] = 'Icons';
$labels['icons_solid'] = 'Solid';
$labels['icons_traditional'] = 'Traditional';
$labels['icons_outlined'] = 'Outlined';
$labels['icons_material'] = 'Material';
$labels['icons_cartoon'] = 'Cartoon';
$labels['setting_list_icons'] = 'Icons in lists';
$labels['setting_button_icons'] = 'Icons on buttons';
$labels['setting_font_size'] = 'Font size';
$labels['font_size_xs'] = 'Smallest';
$labels['font_size_s'] = 'Smaller';
$labels['font_size_n'] = 'Normal';
$labels['font_size_l'] = 'Larger';
$labels['font_size_xl'] = 'Largest';
$labels['setting_thick_font'] = 'Thick font';
$labels['setting_font_family'] = 'Font family';
$labels['setting_color'] = 'Color';
$labels['save_hint'] = 'Don\'t forget to save your settings by clicking the "Save" button below.';

View File

@ -0,0 +1,40 @@
<?php
/**
* Roundcube Plus Skin plugin.
*
* Copyright 2019, Tecorama LLC.
*
* @license Commercial. See the LICENSE file for details.
*/
$labels = [];
// larry based
$labels['interface_options'] = 'Opciones de interfaz';
$labels['disable_mobile_skin'] = 'Usar skin de escritorio';
$labels['enable_mobile_skin'] = 'Utilizar la piel móvil';
// elastic based
$labels['skin_look_and_feel_shortcut'] = 'Aspecto y tacto de la piel';
$labels['skin_look_and_feel'] = 'Aspecto y tacto de la piel';
$labels['setting_icons'] = 'Iconos';
$labels['icons_solid'] = 'Sólido';
$labels['icons_traditional'] = 'Tradicional';
$labels['icons_outlined'] = 'Esbozado';
$labels['icons_material'] = 'Material';
$labels['icons_cartoon'] = 'Dibujos animados';
$labels['setting_list_icons'] = 'Iconos en las listas';
$labels['setting_button_icons'] = 'Iconos en los botones';
$labels['setting_font_size'] = 'Tamaño de letra';
$labels['font_size_xs'] = 'El más pequeño';
$labels['font_size_s'] = 'Más pequeño';
$labels['font_size_n'] = 'Normal';
$labels['font_size_l'] = 'Más grande';
$labels['font_size_xl'] = 'Mayor';
$labels['setting_thick_font'] = 'Fuente gruesa';
$labels['setting_font_family'] = 'Familia de fuentes';
$labels['setting_color'] = 'Color';
$labels['save_hint'] = 'No olvides guardar la configuración haciendo clic en el botón "Guardar".';

View File

@ -0,0 +1,40 @@
<?php
/**
* Roundcube Plus Skin plugin.
*
* Copyright 2019, Tecorama LLC.
*
* @license Commercial. See the LICENSE file for details.
*/
$labels = [];
// larry based
$labels['interface_options'] = 'Liidesevõimalused';
$labels['disable_mobile_skin'] = 'Kasutage töölaua nahka';
$labels['enable_mobile_skin'] = 'Kasutage mobiiltelefoni nahka';
// elastic based
$labels['skin_look_and_feel_shortcut'] = 'Naha välimus ja tunne';
$labels['skin_look_and_feel'] = 'Naha välimus ja tunne';
$labels['setting_icons'] = 'Ikoonid';
$labels['icons_solid'] = 'Soliidne';
$labels['icons_traditional'] = 'Traditsiooniline';
$labels['icons_outlined'] = 'Välja toodud';
$labels['icons_material'] = 'Materjal';
$labels['icons_cartoon'] = 'Cartoon';
$labels['setting_list_icons'] = 'Ikoonid nimekirjades';
$labels['setting_button_icons'] = 'Ikoonid nuppudel';
$labels['setting_font_size'] = 'Kirjasuurus';
$labels['font_size_xs'] = 'Väikseim';
$labels['font_size_s'] = 'Väiksemad';
$labels['font_size_n'] = 'Tavaline';
$labels['font_size_l'] = 'Suurem';
$labels['font_size_xl'] = 'Suurim';
$labels['setting_thick_font'] = 'Paks kirjatüüp';
$labels['setting_font_family'] = 'Kirjatüüpkond';
$labels['setting_color'] = 'Värv';
$labels['save_hint'] = 'Ärge unustage oma seaded salvestada, klõpsates alloleval nupul "Salvesta".';

View File

@ -0,0 +1,40 @@
<?php
/**
* Roundcube Plus Skin plugin.
*
* Copyright 2019, Tecorama LLC.
*
* @license Commercial. See the LICENSE file for details.
*/
$labels = [];
// larry based
$labels['interface_options'] = 'Liitäntäasetukset';
$labels['disable_mobile_skin'] = 'Käytä työpöydän ihoa';
$labels['enable_mobile_skin'] = 'Käytä mobiili-ihoa';
// elastic based
$labels['skin_look_and_feel_shortcut'] = 'Ihon ulkoasu & tuntuma';
$labels['skin_look_and_feel'] = 'Ihon ulkoasu & tuntuma';
$labels['setting_icons'] = 'Kuvakkeet';
$labels['icons_solid'] = 'Solid';
$labels['icons_traditional'] = 'Perinteinen';
$labels['icons_outlined'] = 'Hahmoteltu';
$labels['icons_material'] = 'Materiaali';
$labels['icons_cartoon'] = 'Sarjakuva';
$labels['setting_list_icons'] = 'Kuvakkeet luetteloissa';
$labels['setting_button_icons'] = 'Kuvakkeet painikkeissa';
$labels['setting_font_size'] = 'Kirjasinkoko';
$labels['font_size_xs'] = 'Pienin';
$labels['font_size_s'] = 'Pienempi';
$labels['font_size_n'] = 'Normaali';
$labels['font_size_l'] = 'Suurempi';
$labels['font_size_xl'] = 'Suurin';
$labels['setting_thick_font'] = 'Paksu fontti';
$labels['setting_font_family'] = 'Fonttiperhe';
$labels['setting_color'] = 'Väri';
$labels['save_hint'] = 'Muista tallentaa asetukset napsauttamalla alla olevaa "Tallenna"-painiketta.';

View File

@ -0,0 +1,40 @@
<?php
/**
* Roundcube Plus Skin plugin.
*
* Copyright 2019, Tecorama LLC.
*
* @license Commercial. See the LICENSE file for details.
*/
$labels = [];
// larry based
$labels['interface_options'] = 'Options de l\'interface';
$labels['disable_mobile_skin'] = 'Utiliser le thème bureau';
$labels['enable_mobile_skin'] = 'Utiliser le thème mobile';
// elastic based
$labels['skin_look_and_feel_shortcut'] = 'Paramètres du thème';
$labels['skin_look_and_feel'] = 'Apparence du thème';
$labels['setting_icons'] = 'Icônes';
$labels['icons_solid'] = 'Solide';
$labels['icons_traditional'] = 'Traditionnel';
$labels['icons_outlined'] = 'Contour';
$labels['icons_material'] = 'Matière';
$labels['icons_cartoon'] = 'Dessin';
$labels['setting_list_icons'] = 'Icônes dans les listes';
$labels['setting_button_icons'] = 'Icônes sur les boutons';
$labels['setting_font_size'] = 'Taille de la police';
$labels['font_size_xs'] = 'Le plus petit';
$labels['font_size_s'] = 'Plus petit';
$labels['font_size_n'] = 'Normal';
$labels['font_size_l'] = 'Plus grand';
$labels['font_size_xl'] = 'Le plus grand';
$labels['setting_thick_font'] = 'Police épaisse';
$labels['setting_font_family'] = 'Famille de police';
$labels['setting_color'] = 'Couleur';
$labels['save_hint'] = 'N\'oubliez pas de sauvegarder vos paramètres en cliquant sur le bouton \'Enregistrer\' ci-dessous.';

View File

@ -0,0 +1,40 @@
<?php
/**
* Roundcube Plus Skin plugin.
*
* Copyright 2019, Tecorama LLC.
*
* @license Commercial. See the LICENSE file for details.
*/
$labels = [];
// larry based
$labels['interface_options'] = 'Interfész opciók';
$labels['disable_mobile_skin'] = 'Asztali skin használata';
$labels['enable_mobile_skin'] = 'Mobil skin használata';
// elastic based
$labels['skin_look_and_feel_shortcut'] = 'Bőr megjelenés és érzés';
$labels['skin_look_and_feel'] = 'Bőr megjelenés és érzés';
$labels['setting_icons'] = 'Ikonok';
$labels['icons_solid'] = 'Szilárd';
$labels['icons_traditional'] = 'Hagyományos';
$labels['icons_outlined'] = 'Vázlatos';
$labels['icons_material'] = 'Anyag';
$labels['icons_cartoon'] = 'Rajzfilm';
$labels['setting_list_icons'] = 'Ikonok a listákban';
$labels['setting_button_icons'] = 'Ikonok a gombokon';
$labels['setting_font_size'] = 'Betűméret';
$labels['font_size_xs'] = 'Legkisebb';
$labels['font_size_s'] = 'Kisebb';
$labels['font_size_n'] = 'Normál';
$labels['font_size_l'] = 'Nagyobb';
$labels['font_size_xl'] = 'Legnagyobb';
$labels['setting_thick_font'] = 'Vastag betűtípus';
$labels['setting_font_family'] = 'Betűcsalád';
$labels['setting_color'] = 'Színes';
$labels['save_hint'] = 'Ne felejtse el elmenteni a beállításokat az alábbi "Mentés" gombra kattintva.';

View File

@ -0,0 +1,40 @@
<?php
/**
* Roundcube Plus Skin plugin.
*
* Copyright 2019, Tecorama LLC.
*
* @license Commercial. See the LICENSE file for details.
*/
$labels = [];
// larry based
$labels['interface_options'] = 'Opsi Antarmuka';
$labels['disable_mobile_skin'] = 'Gunakan kulit desktop';
$labels['enable_mobile_skin'] = 'Gunakan kulit seluler';
// elastic based
$labels['skin_look_and_feel_shortcut'] = 'Tampilan & Rasa Kulit';
$labels['skin_look_and_feel'] = 'Tampilan & Rasa Kulit';
$labels['setting_icons'] = 'Ikon';
$labels['icons_solid'] = 'Padat';
$labels['icons_traditional'] = 'Tradisional';
$labels['icons_outlined'] = 'Diuraikan';
$labels['icons_material'] = 'Bahan';
$labels['icons_cartoon'] = 'Kartun';
$labels['setting_list_icons'] = 'Ikon dalam daftar';
$labels['setting_button_icons'] = 'Ikon pada tombol';
$labels['setting_font_size'] = 'Ukuran huruf';
$labels['font_size_xs'] = 'Terkecil';
$labels['font_size_s'] = 'Lebih kecil';
$labels['font_size_n'] = 'Normal';
$labels['font_size_l'] = 'Lebih besar';
$labels['font_size_xl'] = 'Terbesar';
$labels['setting_thick_font'] = 'Font tebal';
$labels['setting_font_family'] = 'Keluarga font';
$labels['setting_color'] = 'Warna';
$labels['save_hint'] = 'Jangan lupa untuk menyimpan pengaturan Anda dengan mengeklik tombol "Simpan" di bawah ini.';

View File

@ -0,0 +1,40 @@
<?php
/**
* Roundcube Plus Skin plugin.
*
* Copyright 2019, Tecorama LLC.
*
* @license Commercial. See the LICENSE file for details.
*/
$labels = [];
// larry based
$labels['interface_options'] = 'Opzioni interfaccia';
$labels['disable_mobile_skin'] = 'Usa tema desktop';
$labels['enable_mobile_skin'] = 'Usa tema mobile';
// elastic based
$labels['skin_look_and_feel_shortcut'] = 'Aspetto del tema';
$labels['skin_look_and_feel'] = 'Aspetto del tema';
$labels['setting_icons'] = 'Icone';
$labels['icons_solid'] = 'Solido';
$labels['icons_traditional'] = 'Tradizionale';
$labels['icons_outlined'] = 'Delineato';
$labels['icons_material'] = 'Materiale';
$labels['icons_cartoon'] = 'Cartone animato';
$labels['setting_list_icons'] = 'Icone nelle liste';
$labels['setting_button_icons'] = 'Icone sui pulsanti';
$labels['setting_font_size'] = 'Dimensione carattere';
$labels['font_size_xs'] = 'Il più piccolo';
$labels['font_size_s'] = 'Piccolo';
$labels['font_size_n'] = 'Normale';
$labels['font_size_l'] = 'Grande';
$labels['font_size_xl'] = 'Il più grande';
$labels['setting_thick_font'] = 'Carattere spesso';
$labels['setting_font_family'] = 'Famiglia di caratteri';
$labels['setting_color'] = 'Colore';
$labels['save_hint'] = 'Non dimenticare di salvare le tue impostazioni facendo clic sul pulsante "Salva" in basso.';

View File

@ -0,0 +1,40 @@
<?php
/**
* Roundcube Plus Skin plugin.
*
* Copyright 2019, Tecorama LLC.
*
* @license Commercial. See the LICENSE file for details.
*/
$labels = [];
// larry based
$labels['interface_options'] = 'インターフェース・オプション';
$labels['disable_mobile_skin'] = 'デスクトップスキンを使用する';
$labels['enable_mobile_skin'] = 'モバイルスキンの使用';
// elastic based
$labels['skin_look_and_feel_shortcut'] = 'スキンルック&フィール';
$labels['skin_look_and_feel'] = 'スキンルック&フィール';
$labels['setting_icons'] = 'アイコン';
$labels['icons_solid'] = 'ソリッド';
$labels['icons_traditional'] = 'トラディショナル';
$labels['icons_outlined'] = '概要';
$labels['icons_material'] = '素材';
$labels['icons_cartoon'] = '漫画';
$labels['setting_list_icons'] = 'リスト内のアイコン';
$labels['setting_button_icons'] = 'ボタン上のアイコン';
$labels['setting_font_size'] = '文字サイズ';
$labels['font_size_xs'] = '最小';
$labels['font_size_s'] = '小さめ';
$labels['font_size_n'] = 'ノーマル';
$labels['font_size_l'] = 'より大きい';
$labels['font_size_xl'] = '最大';
$labels['setting_thick_font'] = '太いフォント';
$labels['setting_font_family'] = 'フォントファミリー';
$labels['setting_color'] = 'カラー';
$labels['save_hint'] = '下の「保存」ボタンをクリックして設定を保存することをお忘れなく。';

View File

@ -0,0 +1,40 @@
<?php
/**
* Roundcube Plus Skin plugin.
*
* Copyright 2019, Tecorama LLC.
*
* @license Commercial. See the LICENSE file for details.
*/
$labels = [];
// larry based
$labels['interface_options'] = '인터페이스 옵션';
$labels['disable_mobile_skin'] = '데스크톱 스킨 사용';
$labels['enable_mobile_skin'] = '모바일 스킨 사용';
// elastic based
$labels['skin_look_and_feel_shortcut'] = '피부 룩 & 필';
$labels['skin_look_and_feel'] = '피부 룩 & 필';
$labels['setting_icons'] = '아이콘';
$labels['icons_solid'] = '솔리드';
$labels['icons_traditional'] = '전통';
$labels['icons_outlined'] = '개요';
$labels['icons_material'] = '재료';
$labels['icons_cartoon'] = '카툰';
$labels['setting_list_icons'] = '목록의 아이콘';
$labels['setting_button_icons'] = '버튼의 아이콘';
$labels['setting_font_size'] = '글꼴 크기';
$labels['font_size_xs'] = '가장 작은';
$labels['font_size_s'] = '더 작게';
$labels['font_size_n'] = '보통';
$labels['font_size_l'] = '더 크게';
$labels['font_size_xl'] = '가장 큰';
$labels['setting_thick_font'] = '두꺼운 글꼴';
$labels['setting_font_family'] = '글꼴 패밀리';
$labels['setting_color'] = '색상';
$labels['save_hint'] = '아래의 \'저장\' 버튼을 클릭하여 설정을 저장하는 것을 잊지 마세요.';

View File

@ -0,0 +1,40 @@
<?php
/**
* Roundcube Plus Skin plugin.
*
* Copyright 2019, Tecorama LLC.
*
* @license Commercial. See the LICENSE file for details.
*/
$labels = [];
// larry based
$labels['interface_options'] = 'Sąsajos parinktys';
$labels['disable_mobile_skin'] = 'Naudoti darbalaukio odą';
$labels['enable_mobile_skin'] = 'Naudokite mobiliąją odą';
// elastic based
$labels['skin_look_and_feel_shortcut'] = 'Odos išvaizda ir pojūtis';
$labels['skin_look_and_feel'] = 'Odos išvaizda ir pojūtis';
$labels['setting_icons'] = 'Ikonos';
$labels['icons_solid'] = 'Solid';
$labels['icons_traditional'] = 'Tradicinis';
$labels['icons_outlined'] = 'Apibrėžta';
$labels['icons_material'] = 'Medžiaga';
$labels['icons_cartoon'] = 'Karikatūra';
$labels['setting_list_icons'] = 'Ikonos sąrašuose';
$labels['setting_button_icons'] = 'Mygtukų piktogramos';
$labels['setting_font_size'] = 'Šrifto dydis';
$labels['font_size_xs'] = 'Mažiausias';
$labels['font_size_s'] = 'Mažesnis';
$labels['font_size_n'] = 'Normalus';
$labels['font_size_l'] = 'Didesnis';
$labels['font_size_xl'] = 'Didžiausias';
$labels['setting_thick_font'] = 'Storas šriftas';
$labels['setting_font_family'] = 'Šriftų šeima';
$labels['setting_color'] = 'Spalva';
$labels['save_hint'] = 'Nepamirškite išsaugoti nustatymų spustelėdami toliau esantį mygtuką "Išsaugoti".';

View File

@ -0,0 +1,40 @@
<?php
/**
* Roundcube Plus Skin plugin.
*
* Copyright 2019, Tecorama LLC.
*
* @license Commercial. See the LICENSE file for details.
*/
$labels = [];
// larry based
$labels['interface_options'] = 'Saskarnes opcijas';
$labels['disable_mobile_skin'] = 'Darbvirsmas ādas lietošana';
$labels['enable_mobile_skin'] = 'Izmantojiet mobilo ādu';
// elastic based
$labels['skin_look_and_feel_shortcut'] = 'Ādas izskats un sajūta';
$labels['skin_look_and_feel'] = 'Ādas izskats un sajūta';
$labels['setting_icons'] = 'Ikonas';
$labels['icons_solid'] = 'Solid';
$labels['icons_traditional'] = 'Tradicionālais';
$labels['icons_outlined'] = 'Izklāstīts';
$labels['icons_material'] = 'Materiāls';
$labels['icons_cartoon'] = 'Karikatūra';
$labels['setting_list_icons'] = 'Ikonas sarakstos';
$labels['setting_button_icons'] = 'Ikonas uz pogām';
$labels['setting_font_size'] = 'Fonta lielums';
$labels['font_size_xs'] = 'Mazākais';
$labels['font_size_s'] = 'Mazāks';
$labels['font_size_n'] = 'Parasts';
$labels['font_size_l'] = 'Lielāks';
$labels['font_size_xl'] = 'Lielākais';
$labels['setting_thick_font'] = 'Biezs fonts';
$labels['setting_font_family'] = 'Fontu ģimene';
$labels['setting_color'] = 'Krāsa';
$labels['save_hint'] = 'Neaizmirstiet saglabāt iestatījumus, noklikšķinot uz zemāk redzamās pogas "Saglabāt".';

View File

@ -0,0 +1,40 @@
<?php
/**
* Roundcube Plus Skin plugin.
*
* Copyright 2019, Tecorama LLC.
*
* @license Commercial. See the LICENSE file for details.
*/
$labels = [];
// larry based
$labels['interface_options'] = 'Alternativer for grensesnitt';
$labels['disable_mobile_skin'] = 'Bruk skrivebordsskinn';
$labels['enable_mobile_skin'] = 'Bruk mobil hud';
// elastic based
$labels['skin_look_and_feel_shortcut'] = 'Hudens utseende og følelse';
$labels['skin_look_and_feel'] = 'Hudens utseende og følelse';
$labels['setting_icons'] = 'Ikoner';
$labels['icons_solid'] = 'Solid';
$labels['icons_traditional'] = 'Tradisjonell';
$labels['icons_outlined'] = 'Skissert';
$labels['icons_material'] = 'Materiell';
$labels['icons_cartoon'] = 'Tegneserie';
$labels['setting_list_icons'] = 'Ikoner i lister';
$labels['setting_button_icons'] = 'Ikoner på knapper';
$labels['setting_font_size'] = 'Skriftstørrelse';
$labels['font_size_xs'] = 'Minste';
$labels['font_size_s'] = 'Mindre';
$labels['font_size_n'] = 'Normal';
$labels['font_size_l'] = 'Større';
$labels['font_size_xl'] = 'Største';
$labels['setting_thick_font'] = 'Tykk skrift';
$labels['setting_font_family'] = 'Skriftfamilie';
$labels['setting_color'] = 'Farge';
$labels['save_hint'] = 'Ikke glem å lagre innstillingene dine ved å klikke på "Lagre"-knappen nedenfor.';

View File

@ -0,0 +1,40 @@
<?php
/**
* Roundcube Plus Skin plugin.
*
* Copyright 2019, Tecorama LLC.
*
* @license Commercial. See the LICENSE file for details.
*/
$labels = [];
// larry based
$labels['interface_options'] = 'Interface-opties';
$labels['disable_mobile_skin'] = 'Desktop skin gebruiken';
$labels['enable_mobile_skin'] = 'Gebruik mobiele huid';
// elastic based
$labels['skin_look_and_feel_shortcut'] = 'Huidbeeld en -gevoel';
$labels['skin_look_and_feel'] = 'Huidbeeld en -gevoel';
$labels['setting_icons'] = 'Pictogrammen';
$labels['icons_solid'] = 'Massief';
$labels['icons_traditional'] = 'Traditioneel';
$labels['icons_outlined'] = 'Geschetst';
$labels['icons_material'] = 'Materiaal';
$labels['icons_cartoon'] = 'Cartoon';
$labels['setting_list_icons'] = 'Pictogrammen in lijsten';
$labels['setting_button_icons'] = 'Pictogrammen op knoppen';
$labels['setting_font_size'] = 'Lettergrootte';
$labels['font_size_xs'] = 'Kleinste';
$labels['font_size_s'] = 'Kleiner';
$labels['font_size_n'] = 'Normaal';
$labels['font_size_l'] = 'Groter';
$labels['font_size_xl'] = 'Grootste';
$labels['setting_thick_font'] = 'Dik lettertype';
$labels['setting_font_family'] = 'Lettertype familie';
$labels['setting_color'] = 'Kleur';
$labels['save_hint'] = 'Vergeet niet uw instellingen op te slaan door op de knop "Opslaan" hieronder te klikken.';

View File

@ -0,0 +1,39 @@
<?php
/**
* Roundcube Plus Skin plugin.
*
* Copyright 2019, Tecorama LLC.
*
* @license Commercial. See the LICENSE file for details.
*/
$labels = [];
// larry based
$labels['interface_options'] = 'Opcje interfejsu';
$labels['disable_mobile_skin'] = 'Użyj skórki na desktop';
$labels['enable_mobile_skin'] = 'Użycie skórki mobilnej';
// elastic based
$labels['skin_look_and_feel_shortcut'] = 'Ustawienia wyglądu';
$labels['skin_look_and_feel'] = 'Ustawienia wyglądu';
$labels['setting_icons'] = 'Ikony';
$labels['icons_solid'] = 'Masywne';
$labels['icons_traditional'] = 'Tradycjonalne';
$labels['icons_outlined'] = 'Nakreślone';
$labels['icons_material'] = 'Materiałowe';
$labels['icons_cartoon'] = 'Kreskówkowe';
$labels['setting_list_icons'] = 'Ikony na listach';
$labels['setting_button_icons'] = 'Ikony na przyciskach';
$labels['setting_font_size'] = 'Rozmiar czcionki';
$labels['font_size_xs'] = 'Najmniejsza';
$labels['font_size_s'] = 'Mniejsza';
$labels['font_size_n'] = 'Normalna';
$labels['font_size_l'] = 'Większa';
$labels['font_size_xl'] = 'Największa';
$labels['setting_thick_font'] = 'Gruba czcionka';
$labels['setting_font_family'] = 'Rodzina czcionek';
$labels['setting_color'] = 'Kolor';
$labels['save_hint'] = 'Nie zapomnij zapisać swoich ustawień klikając przycisk "Zapisz" poniżej.';

View File

@ -0,0 +1,40 @@
<?php
/**
* Roundcube Plus Skin plugin.
*
* Copyright 2019, Tecorama LLC.
*
* @license Commercial. See the LICENSE file for details.
*/
$labels = [];
// larry based
$labels['interface_options'] = 'Opções de interface';
$labels['disable_mobile_skin'] = 'Usar pele de mesa';
$labels['enable_mobile_skin'] = 'Usar pele móvel';
// elastic based
$labels['skin_look_and_feel_shortcut'] = 'Olhar e sentir da pele';
$labels['skin_look_and_feel'] = 'Olhar e sentir da pele';
$labels['setting_icons'] = 'Ícones';
$labels['icons_solid'] = 'Sólido';
$labels['icons_traditional'] = 'Tradicional';
$labels['icons_outlined'] = 'Esboçado';
$labels['icons_material'] = 'Material';
$labels['icons_cartoon'] = 'Desenho animado';
$labels['setting_list_icons'] = 'Ícones em listas';
$labels['setting_button_icons'] = 'Ícones nos botões';
$labels['setting_font_size'] = 'Tamanho de letra';
$labels['font_size_xs'] = 'O menor';
$labels['font_size_s'] = 'Menor';
$labels['font_size_n'] = 'Normal';
$labels['font_size_l'] = 'Aumentar';
$labels['font_size_xl'] = 'A maior';
$labels['setting_thick_font'] = 'Fonte espessa';
$labels['setting_font_family'] = 'Família de fontes';
$labels['setting_color'] = 'Cor';
$labels['save_hint'] = 'Não se esqueça de salvar suas configurações, clicando no botão "Salvar" abaixo.';

View File

@ -0,0 +1,40 @@
<?php
/**
* Roundcube Plus Skin plugin.
*
* Copyright 2019, Tecorama LLC.
*
* @license Commercial. See the LICENSE file for details.
*/
$labels = [];
// larry based
$labels['interface_options'] = 'Opções de interface';
$labels['disable_mobile_skin'] = 'Utilizar a skin do ambiente de trabalho';
$labels['enable_mobile_skin'] = 'Utilizar a pele móvel';
// elastic based
$labels['skin_look_and_feel_shortcut'] = 'Aspeto e sensação da pele';
$labels['skin_look_and_feel'] = 'Aspeto e sensação da pele';
$labels['setting_icons'] = 'Ícones';
$labels['icons_solid'] = 'Sólido';
$labels['icons_traditional'] = 'Tradicional';
$labels['icons_outlined'] = 'Delineado';
$labels['icons_material'] = 'Material';
$labels['icons_cartoon'] = 'Desenho animado';
$labels['setting_list_icons'] = 'Ícones em listas';
$labels['setting_button_icons'] = 'Ícones nos botões';
$labels['setting_font_size'] = 'Tamanho da letra';
$labels['font_size_xs'] = 'Mais pequeno';
$labels['font_size_s'] = 'Mais pequeno';
$labels['font_size_n'] = 'Normal';
$labels['font_size_l'] = 'Maior';
$labels['font_size_xl'] = 'Maior';
$labels['setting_thick_font'] = 'Tipo de letra espesso';
$labels['setting_font_family'] = 'Família de fontes';
$labels['setting_color'] = 'Cor';
$labels['save_hint'] = 'Não se esqueça de guardar as suas definições clicando no botão "Guardar" abaixo.';

View File

@ -0,0 +1,40 @@
<?php
/**
* Roundcube Plus Skin plugin.
*
* Copyright 2019, Tecorama LLC.
*
* @license Commercial. See the LICENSE file for details.
*/
$labels = [];
// larry based
$labels['interface_options'] = 'Opțiuni de interfață';
$labels['disable_mobile_skin'] = 'Utilizați skin-ul pentru desktop';
$labels['enable_mobile_skin'] = 'Utilizați pielea mobilă';
// elastic based
$labels['skin_look_and_feel_shortcut'] = 'Aspectul și senzația pielii';
$labels['skin_look_and_feel'] = 'Aspectul și senzația pielii';
$labels['setting_icons'] = 'Icoane';
$labels['icons_solid'] = 'Solid';
$labels['icons_traditional'] = 'Tradițional';
$labels['icons_outlined'] = 'Schițat';
$labels['icons_material'] = 'Material';
$labels['icons_cartoon'] = 'Desen animat';
$labels['setting_list_icons'] = 'Icoane în liste';
$labels['setting_button_icons'] = 'Pictograme pe butoane';
$labels['setting_font_size'] = 'Mărimea fontului';
$labels['font_size_xs'] = 'Cel mai mic';
$labels['font_size_s'] = 'Mai mici';
$labels['font_size_n'] = 'Normal';
$labels['font_size_l'] = 'Mai mare';
$labels['font_size_xl'] = 'Cel mai mare';
$labels['setting_thick_font'] = 'Font gros';
$labels['setting_font_family'] = 'Familie de fonturi';
$labels['setting_color'] = 'Culoare';
$labels['save_hint'] = 'Nu uitați să vă salvați setările făcând clic pe butonul "Save" de mai jos.';

View File

@ -0,0 +1,40 @@
<?php
/**
* Roundcube Plus Skin plugin.
*
* Copyright 2019, Tecorama LLC.
*
* @license Commercial. See the LICENSE file for details.
*/
$labels = [];
// larry based
$labels['interface_options'] = 'Параметры интерфейса';
$labels['disable_mobile_skin'] = 'Использовать вид рабочего стола';
$labels['enable_mobile_skin'] = 'Использовать вид мобильного';
// elastic based
$labels['skin_look_and_feel_shortcut'] = 'Внешний вид и ощущения кожи';
$labels['skin_look_and_feel'] = 'Внешний вид и ощущения кожи';
$labels['setting_icons'] = 'Иконки';
$labels['icons_solid'] = 'Твердый';
$labels['icons_traditional'] = 'Традиционный';
$labels['icons_outlined'] = 'Описано';
$labels['icons_material'] = 'Материал';
$labels['icons_cartoon'] = 'Мультфильм';
$labels['setting_list_icons'] = 'Значки в списках';
$labels['setting_button_icons'] = 'Иконки на кнопках';
$labels['setting_font_size'] = 'Размер шрифта';
$labels['font_size_xs'] = 'Самый маленький';
$labels['font_size_s'] = 'Меньше';
$labels['font_size_n'] = 'Нормальный';
$labels['font_size_l'] = 'Крупнее';
$labels['font_size_xl'] = 'Крупнейший';
$labels['setting_thick_font'] = 'Толстый шрифт';
$labels['setting_font_family'] = 'Семейство шрифтов';
$labels['setting_color'] = 'Цвет';
$labels['save_hint'] = 'Не забудьте сохранить настройки, нажав кнопку "Сохранить" ниже.';

View File

@ -0,0 +1,40 @@
<?php
/**
* Roundcube Plus Skin plugin.
*
* Copyright 2019, Tecorama LLC.
*
* @license Commercial. See the LICENSE file for details.
*/
$labels = [];
// larry based
$labels['interface_options'] = 'Možnosti rozhrania';
$labels['disable_mobile_skin'] = 'Používanie kože na pracovnej ploche';
$labels['enable_mobile_skin'] = 'Používanie mobilnej kože';
// elastic based
$labels['skin_look_and_feel_shortcut'] = 'Vzhľad a pocit pokožky';
$labels['skin_look_and_feel'] = 'Vzhľad a pocit pokožky';
$labels['setting_icons'] = 'Ikony';
$labels['icons_solid'] = 'Solid';
$labels['icons_traditional'] = 'Tradičné';
$labels['icons_outlined'] = 'Náčrt';
$labels['icons_material'] = 'Materiál';
$labels['icons_cartoon'] = 'Kreslený film';
$labels['setting_list_icons'] = 'Ikony v zoznamoch';
$labels['setting_button_icons'] = 'Ikony na tlačidlách';
$labels['setting_font_size'] = 'Veľkosť písma';
$labels['font_size_xs'] = 'Najmenší';
$labels['font_size_s'] = 'Menšie';
$labels['font_size_n'] = 'Normálne';
$labels['font_size_l'] = 'Väčšie';
$labels['font_size_xl'] = 'Najväčší';
$labels['setting_thick_font'] = 'Hrubé písmo';
$labels['setting_font_family'] = 'Rodina písiem';
$labels['setting_color'] = 'Farba';
$labels['save_hint'] = 'Nezabudnite uložiť svoje nastavenia kliknutím na tlačidlo "Uložiť" nižšie.';

View File

@ -0,0 +1,40 @@
<?php
/**
* Roundcube Plus Skin plugin.
*
* Copyright 2019, Tecorama LLC.
*
* @license Commercial. See the LICENSE file for details.
*/
$labels = [];
// larry based
$labels['interface_options'] = 'Možnosti vmesnika';
$labels['disable_mobile_skin'] = 'Uporaba namizne kože';
$labels['enable_mobile_skin'] = 'Uporaba mobilne kože';
// elastic based
$labels['skin_look_and_feel_shortcut'] = 'Videz in občutek kože';
$labels['skin_look_and_feel'] = 'Videz in občutek kože';
$labels['setting_icons'] = 'Ikone';
$labels['icons_solid'] = 'Solid';
$labels['icons_traditional'] = 'Tradicionalni';
$labels['icons_outlined'] = 'Opisano';
$labels['icons_material'] = 'Material';
$labels['icons_cartoon'] = 'Risanka';
$labels['setting_list_icons'] = 'Ikone na seznamih';
$labels['setting_button_icons'] = 'Ikone na gumbih';
$labels['setting_font_size'] = 'Velikost pisave';
$labels['font_size_xs'] = 'Najmanjši';
$labels['font_size_s'] = 'Manjši';
$labels['font_size_n'] = 'Normalno';
$labels['font_size_l'] = 'Večji';
$labels['font_size_xl'] = 'Največji';
$labels['setting_thick_font'] = 'Debela pisava';
$labels['setting_font_family'] = 'Družina pisav';
$labels['setting_color'] = 'Barva';
$labels['save_hint'] = 'Ne pozabite shraniti nastavitev s klikom na spodnji gumb "Shrani".';

View File

@ -0,0 +1,40 @@
<?php
/**
* Roundcube Plus Skin plugin.
*
* Copyright 2019, Tecorama LLC.
*
* @license Commercial. See the LICENSE file for details.
*/
$labels = [];
// larry based
$labels['interface_options'] = 'Alternativ för gränssnitt';
$labels['disable_mobile_skin'] = 'Använd desktop skin';
$labels['enable_mobile_skin'] = 'Använd mobil hud';
// elastic based
$labels['skin_look_and_feel_shortcut'] = 'Hudens utseende och känsla';
$labels['skin_look_and_feel'] = 'Hudens utseende och känsla';
$labels['setting_icons'] = 'Ikoner';
$labels['icons_solid'] = 'Solid';
$labels['icons_traditional'] = 'Traditionell';
$labels['icons_outlined'] = 'Beskrivet';
$labels['icons_material'] = 'Material';
$labels['icons_cartoon'] = 'Tecknad film';
$labels['setting_list_icons'] = 'Ikoner i listor';
$labels['setting_button_icons'] = 'Ikoner på knappar';
$labels['setting_font_size'] = 'Fontstorlek';
$labels['font_size_xs'] = 'Den minsta';
$labels['font_size_s'] = 'Mindre';
$labels['font_size_n'] = 'Normal';
$labels['font_size_l'] = 'Större';
$labels['font_size_xl'] = 'Störst';
$labels['setting_thick_font'] = 'Tjockt typsnitt';
$labels['setting_font_family'] = 'Fontfamilj';
$labels['setting_color'] = 'Färg';
$labels['save_hint'] = 'Glöm inte att spara dina inställningar genom att klicka på knappen "Spara" nedan.';

View File

@ -0,0 +1,40 @@
<?php
/**
* Roundcube Plus Skin plugin.
*
* Copyright 2019, Tecorama LLC.
*
* @license Commercial. See the LICENSE file for details.
*/
$labels = [];
// larry based
$labels['interface_options'] = 'Arayüz Seçenekleri';
$labels['disable_mobile_skin'] = 'Masaüstü görünümünü kullanma';
$labels['enable_mobile_skin'] = 'Mobil cilt kullanın';
// elastic based
$labels['skin_look_and_feel_shortcut'] = 'Cilt Görünümü ve Hissi';
$labels['skin_look_and_feel'] = 'Cilt Görünümü ve Hissi';
$labels['setting_icons'] = 'Simgeler';
$labels['icons_solid'] = 'Katı';
$labels['icons_traditional'] = 'Geleneksel';
$labels['icons_outlined'] = 'Ana hatlarıyla';
$labels['icons_material'] = 'Malzeme';
$labels['icons_cartoon'] = 'Karikatür';
$labels['setting_list_icons'] = 'Listelerdeki simgeler';
$labels['setting_button_icons'] = 'Düğmelerdeki simgeler';
$labels['setting_font_size'] = 'Yazı tipi boyutu';
$labels['font_size_xs'] = 'En küçük';
$labels['font_size_s'] = 'Daha küçük';
$labels['font_size_n'] = 'Normal';
$labels['font_size_l'] = 'Daha büyük';
$labels['font_size_xl'] = 'En büyük';
$labels['setting_thick_font'] = 'Kalın yazı tipi';
$labels['setting_font_family'] = 'Yazı tipi ailesi';
$labels['setting_color'] = 'Renk';
$labels['save_hint'] = 'Aşağıdaki "Kaydet" düğmesine tıklayarak ayarlarınızı kaydetmeyi unutmayın.';

View File

@ -0,0 +1,39 @@
<?php
/**
* Roundcube Plus Skin plugin.
*
* Copyright 2019, Tecorama LLC.
*
* @license Commercial. See the LICENSE file for details.
*/
$labels = [];
// larry based
$labels['interface_options'] = 'Параметри інтерфейсу';
$labels['disable_mobile_skin'] = 'Використовуйте скін робочого столу';
$labels['enable_mobile_skin'] = 'Використовуйте скін мобільного';
// elastic based
$labels['skin_look_and_feel_shortcut'] = 'Вигляд і відчуття шкіри';
$labels['skin_look_and_feel'] = 'Вигляд і відчуття шкіри';
$labels['setting_icons'] = 'Ікони';
$labels['icons_solid'] = 'Твердий';
$labels['icons_traditional'] = 'Традиційний';
$labels['icons_outlined'] = 'Накреслений';
$labels['icons_material'] = 'Матеріальний';
$labels['icons_cartoon'] = 'Мультяшний';
$labels['setting_list_icons'] = 'Значки в списках';
$labels['setting_button_icons'] = 'Значки на кнопках';
$labels['setting_font_size'] = 'Розмір шрифту';
$labels['font_size_xs'] = 'Найменший';
$labels['font_size_s'] = 'Менший';
$labels['font_size_n'] = 'Нормальний';
$labels['font_size_l'] = 'Більший';
$labels['font_size_xl'] = 'Найбільший';
$labels['setting_thick_font'] = 'Щільний шрифт';
$labels['setting_font_family'] = 'Сімейство шрифтів';
$labels['setting_color'] = 'Колір';
$labels['save_hint'] = 'Не забудьте зберегти свої налаштування, натиснувши кнопку «Зберегти» нижче.';

View File

@ -0,0 +1,40 @@
<?php
/**
* Roundcube Plus Skin plugin.
*
* Copyright 2019, Tecorama LLC.
*
* @license Commercial. See the LICENSE file for details.
*/
$labels = [];
// larry based
$labels['interface_options'] = '接口选项';
$labels['disable_mobile_skin'] = '使用桌面皮肤';
$labels['enable_mobile_skin'] = '使用移动皮肤';
// elastic based
$labels['skin_look_and_feel_shortcut'] = '皮肤外观与触感';
$labels['skin_look_and_feel'] = '皮肤外观与触感';
$labels['setting_icons'] = '图标';
$labels['icons_solid'] = '固体';
$labels['icons_traditional'] = '传统';
$labels['icons_outlined'] = '概述';
$labels['icons_material'] = '材料';
$labels['icons_cartoon'] = '卡通';
$labels['setting_list_icons'] = '列表中的图标';
$labels['setting_button_icons'] = '按钮上的图标';
$labels['setting_font_size'] = '字体大小';
$labels['font_size_xs'] = '最小';
$labels['font_size_s'] = '较小';
$labels['font_size_n'] = '正常';
$labels['font_size_l'] = '更大';
$labels['font_size_xl'] = '最大';
$labels['setting_thick_font'] = '粗字体';
$labels['setting_font_family'] = '字体系列';
$labels['setting_color'] = '颜色';
$labels['save_hint'] = '别忘了点击下面的 "保存 "按钮保存设置。';

View File

@ -0,0 +1,40 @@
<?php
/**
* Roundcube Plus Skin plugin.
*
* Copyright 2019, Tecorama LLC.
*
* @license Commercial. See the LICENSE file for details.
*/
$labels = [];
// larry based
$labels['interface_options'] = '介面選項';
$labels['disable_mobile_skin'] = '使用桌面皮膚';
$labels['enable_mobile_skin'] = '使用行動皮膚';
// elastic based
$labels['skin_look_and_feel_shortcut'] = '肌膚外觀與觸感';
$labels['skin_look_and_feel'] = '肌膚外觀與觸感';
$labels['setting_icons'] = '圖示';
$labels['icons_solid'] = '堅固';
$labels['icons_traditional'] = '傳統';
$labels['icons_outlined'] = '概述';
$labels['icons_material'] = '材質';
$labels['icons_cartoon'] = '卡通';
$labels['setting_list_icons'] = '清單中的圖示';
$labels['setting_button_icons'] = '按鈕上的圖示';
$labels['setting_font_size'] = '字型大小';
$labels['font_size_xs'] = '最小';
$labels['font_size_s'] = '較小';
$labels['font_size_n'] = '正常';
$labels['font_size_l'] = '較大';
$labels['font_size_xl'] = '最大';
$labels['setting_thick_font'] = '粗體字';
$labels['setting_font_family'] = '字型系列';
$labels['setting_color'] = '顏色';
$labels['save_hint'] = '別忘了按一下下方的「儲存」按鈕來儲存您的設定。';

1
plugins/xskin/version.js Normal file
View File

@ -0,0 +1 @@
const version = '1.9.2 (2024-11-08)';

866
plugins/xskin/xskin.php Normal file
View File

@ -0,0 +1,866 @@
<?php
/**
* Roundcube Plus Skin plugin.
*
* Copyright 2019, Tecorama LLC.
*
* @license Commercial. See the LICENSE file for details.
*/
require_once(__DIR__ . "/../xframework/common/Plugin.php");
class xskin extends XFramework\Plugin
{
protected bool $settings = false;
private string $lookAndFeelUrl = "?_task=settings&_action=preferences&_section=xskin";
private array $disablePluginsConfig = [];
public function initialize()
{
$this->handleQuickLanguageChange();
$this->handleQuickSkinChange();
$this->addSkinInterfaceMenuItem();
$this->addLanguageInterfaceMenuItem();
// include scripts (doing it here so the quick skin change works in elastic/larry)
$this->includeAsset("assets/scripts/xskin.min.js");
// return if we're not running a Roundcube Plus skin (but add custom css so it applies to all skins)
if (!$this->rcpSkin) {
$this->includeCustomCss();
return;
}
if (!$this->elastic) {
$this->disablePluginsConfig = $this->rcmail->config->get("disable_plugins_on_mobile", []);
}
// add hooks
$this->add_hook("startup", [$this, "startup"]);
$this->add_hook("config_get", [$this, $this->elastic ? "elasticGetConfig" : "larryGetConfig"]);
$this->add_hook("render_page", [$this, $this->elastic ? "elasticRenderPage" : "larryRenderPage"]);
if ($this->rcmail->task == "settings") {
$this->add_hook('preferences_sections_list', [$this, 'preferencesSectionsList']);
$this->add_hook("preferences_list", [$this, "preferencesList"]);
$this->add_hook("preferences_save", [$this, "preferencesSave"]);
}
// include assets
$this->includeAsset("assets/scripts/xskin.min.js");
$this->includeAsset("assets/styles/styles.css");
$this->includeSkinConfig();
if ($this->skinBase == "larry") {
$this->larrySetSkin();
$this->addDisableMobileInterfaceMenuItem();
if ($this->rcmail->output->get_env("xskin_type") == "mobile") {
$this->includeAsset("assets/scripts/hammer.min.js");
$this->includeAsset("assets/scripts/jquery.hammer.js");
$this->includeAsset("assets/scripts/larry_mobile.min.js");
$this->includeAsset("assets/styles/larry_mobile.css");
$this->includeAsset("../../skins/$this->skin/assets/styles/mobile.css");
} else {
$this->includeAsset("assets/scripts/larry_desktop.min.js");
$this->includeAsset("assets/styles/larry_desktop.css");
$this->includeAsset("../../skins/$this->skin/assets/styles/desktop.css");
}
} else {
$this->includeAsset("../../skins/$this->skin/assets/styles/styles.css");
$this->includeAsset("../../skins/$this->skin/assets/scripts/scripts.min.js");
}
// removed the cairo font (included with previous versions) because of line spacing issues - fix any old font settings
if ($this->rcmail->config->get("xskin_font_family_$this->skin") == "cairo") {
$this->rcmail->config->set("xskin_font_family_$this->skin", "noto-sans");
}
// if remote assets are disabled, set the font to roboto (loaded from elastic) and don't load fonts from google
if ($this->rcmail->config->get("disable_remote_skin_fonts")) {
// set these to a value that doesn't exist in _options.scss so it won't set the font
$this->rcmail->config->set("xskin_font_family", "inherited-local");
$this->rcmail->config->set("xskin_font_family_$this->skin", "inherited-local");
} else {
$this->include_stylesheet("https://fonts.googleapis.com/css2?family=Roboto&display=block");
$this->include_stylesheet("https://fonts.googleapis.com/css2?family=Noto+Sans&display=block");
$this->include_stylesheet("https://fonts.googleapis.com/css2?family=Ubuntu&display=block");
$this->include_stylesheet("https://fonts.googleapis.com/css2?family=Montserrat+Alternates&display=block");
$this->include_stylesheet("https://fonts.googleapis.com/css2?family=Sarala&display=block");
$this->include_stylesheet("https://fonts.googleapis.com/css2?family=Quattrocento&display=block");
$this->include_stylesheet("https://fonts.googleapis.com/css2?family=Merienda&display=block");
}
$this->ensureSkinLogo();
$this->setPreviewBranding();
$this->includeCustomCss();
}
public function startup()
{
if ($this->elastic) {
// add labels to env (for creating the mobile interface in js)
$this->rcmail->output->add_label("login");
} else {
// litecube is the only skin not using font icons in desktop; but it does use it on mobile
if ($this->skin == "litecube" && $this->rcmail->output->get_env("xmobile")) {
$this->rcmail->config->set("xlarry_font_icons", true);
}
// add larry-based classes to body
$bodyClasses = ["x" . $this->rcmail->output->get_env("xskin_type")];
$this->rcmail->config->get("xlarry_font_icons") && ($bodyClasses[] = "xlarry-font-icons");
$this->rcmail->config->get("xlarry_square_ui") && ($bodyClasses[] = "xlarry-square-ui");
$this->rcmail->config->get("xlarry_light_ui") && ($bodyClasses[] = "xlarry-light-ui");
$this->rcmail->task == "logout" && ($bodyClasses[] = "login-page");
$this->addBodyClass(implode(" ", $bodyClasses));
// add labels to env (for creating the mobile interface in js)
$this->rcmail->output->add_label("login", "folders", "search", "attachment", "section", "options");
// disable composing in html on mobile devices unless config option set to allow
if ($this->rcmail->output->get_env("xmobile") && !$this->rcmail->config->get("allow_mobile_html_composing")) {
global $CONFIG;
$CONFIG['htmleditor'] = false;
}
}
$this->rcmail->output->set_env("rcp_skin", $this->rcpSkin);
$this->addClasses();
}
/**
* Hook retrieving config options (including user settings).
*/
public function elasticGetConfig($arg)
{
// Substitute the skin name retrieved from the config file with "elastic" for the plugins that treat
// elastic-based skins as "elastic."
if (empty($arg['name']) || $arg['name'] != "skin" || !array_key_exists(str_replace("_elastic", "", $arg['result']), $this->getSkins())) {
return $arg;
}
$trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 4);
// this is a call from the rc core, let's hope they fix this
if (!empty($trace[3]['class']) && $trace[3]['class'] == "jqueryui") {
$arg['result'] = "elastic";
}
// check if the calling file is in the list of plugins to fix or it's a unit test and set the skin to elastic
$fixPlugins = $this->rcmail->config->get("fix_plugins", []);
if (!empty($trace[3]['file']) &&
(in_array(basename(dirname($trace[3]['file'])), $fixPlugins) || basename($trace[3]['file']) == "TestCase.php")
) {
$arg['result'] = "elastic";
}
return $arg;
}
function larryGetConfig($arg)
{
if ($this->rcmail->output->get_env("xskin_type") == "mobile") {
// disable unwanted plugins on mobile devices
$disablePlugins = ["preview_pane", "google_ads", "threecol"];
if (!empty($this->larryDisabledPluginsConfig) && is_array($this->larryDisabledPluginsConfig)) {
$disablePlugins = array_merge($disablePlugins, $this->larryDisabledPluginsConfig);
}
foreach ($disablePlugins as $val) {
if (isset($arg['name']) && strpos($arg['name'], $val) !== false) {
$arg['result'] = false;
return $arg;
}
}
// set the layout to list on mobile devices so it can be displayed properly
// IMPORTANT: we have to unset $_GET['_layout'] because on RC 1.4 setting $arg here results in adding
// the new layout value to GET, which is then picked up and saved into the database by
// program/steps/mail/list.inc. So the 'list' value we set here for mobile is then applied to desktop
// as well. Unsetting GET fixes the issue.
if (isset($arg['name']) && $arg['name'] == "layout") {
$arg['result'] = "list";
unset($_GET['_layout']);
return $arg;
}
}
// Substitute the skin name retrieved from the config file with "larry" for the plugins that treat larry-based
// skins as "classic."
if (empty($arg['name']) || $arg['name'] != "skin" || !$this->isRcpSkin($arg['result'])) {
return $arg;
}
$trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 4);
// check if the calling file is in the list of plugins to fix or it's a unit test and set the skin to larry
$fixPlugins = $this->rcmail->config->get("fix_plugins", []);
if (!empty($trace[3]['file']) &&
(in_array(basename(dirname($trace[3]['file'])), $fixPlugins) || basename($trace[3]['file']) == "TestCase.php")
) {
$arg['result'] = "larry";
}
return $arg;
}
public function elasticRenderPage($arg)
{
$this->addLoginRcpBranding($arg);
return $arg;
}
public function larryRenderPage($arg)
{
// check if it's an error page
if (strpos($arg['content'], "uibox centerbox errorbox")) {
return;
}
$this->addLoginRcpBranding($arg);
if ($this->rcmail->task != "login" && $this->rcmail->task != "logout") {
$this->larryModifyPageHtml($arg);
}
return $arg;
}
/**
* Modifies the html of the non-login Roundcube pages.
* Unit tested via renderPage()
*
* @param array $arg
* @codeCoverageIgnore
*/
protected function larryModifyPageHtml(array &$arg)
{
// check if it's an error page
if (strpos($arg['content'], "uibox centerbox errorbox")) {
return;
}
// if using a desktop skin on mobile devices after clicked "use desktop skin" show a link to revert to
// mobile skin in the top bar
if (isset($_COOKIE['rcs_disable_mobile_skin'])) {
$this->replace(
'<div class="topleft">',
'<div class="topleft">'.
html::a(
[
"class" => "enable-mobile-skin",
"href" => "javascript:void(0)",
"onclick" => "xskin.enableMobileSkin()",
],
rcube::Q($this->rcmail->gettext("xskin.enable_mobile_skin"))
),
$arg['content']
);
}
// add the toolbar-bg element that is used by alpha
$this->replace(
'<div id="mainscreencontent',
'<div id="toolbar-bg"></div><div id="mainscreencontent',
$arg['content']
);
}
/**
* Adds the skin config files from <skin>/config.inc.php to the main config, if the file exists.
*/
protected function includeSkinConfig()
{
// include the default setting values from the skin's meta.json in the config
// values from meta.json get automatically included in the config, but at the same time they're included
// in dontoverride, which is not good because we want admins to be able to include/exclude it from dontoverride
// so we set the default values in meta as 'xskin_default_*' and here we translate them to 'xskin_*'
// this way the values 'xskin_*' can be used normally in dontoverride
foreach ($this->rcmail->config->all() as $key => $val) {
if (strpos($key, "xskin_default") === 0) {
$this->rcmail->config->set("xskin" . substr($key, 13), $val);
}
}
$file = RCUBE_INSTALL_PATH . "skins/" . $this->skin . "/config.inc.php";
if (!file_exists($file)) {
return;
}
$config = [];
@include($file);
if (is_array($config)) {
foreach ($config as $key => $val) {
$this->rcmail->config->set($key, $val);
}
}
}
/**
* Sets the current skin and color and fills in the correct properties for the desktop, tablet and phone skin.
* Larry only.
*/
public function larrySetSkin()
{
// check if already set
if ($this->rcmail->output->get_env("xskin")) {
return;
}
if ($this->rcmail->output->get_env("xphone")) {
$skinType = "mobile";
} else if ($this->rcmail->output->get_env("xtablet")) {
$skinType = "mobile";
} else {
$skinType = "desktop";
}
// litecube-f doesn't support mobile, set the device to desktop to avoid errors
// also set device to desktop if mobile interface is disabled in config
if ($this->skin == "litecube-f" || $this->rcmail->config->get("disable_mobile_interface")) {
$this->setDevice(true);
$skinType = "desktop";
}
// change the skin in the environment
if (isset($GLOBALS['OUTPUT']) && method_exists($GLOBALS['OUTPUT'], "set_skin")) {
$GLOBALS['OUTPUT']->set_skin($this->skin);
}
// if running a mobile skin, remove the apps menu before it gets added using js
if ($skinType != "desktop") {
$this->setJsVar("appsMenu", "");
}
// sent environment variables
$this->rcmail->output->set_env("xskin", $this->skin);
$this->rcmail->output->set_env("xskin_type", $skinType);
$this->rcmail->output->set_env("rcp_skin", $this->rcpSkin);
}
protected function addLanguageInterfaceMenuItem()
{
if ($this->getDontOverride("language") || $this->rcmail->config->get("disable_menu_languages")) {
return;
}
$languages = $this->rcmail->list_languages();
asort($languages);
$select = new html_select(["onchange" => "xskin.quickLanguageChange()", "class"=>"form-control", "name" => "quick-language-change"]);
$select->add(array_values($languages), array_keys($languages));
$this->addToInterfaceMenu(
"quick-language-change",
html::div(
["id" => "quick-language-change", "class" => "section"],
html::div(["class" => "section-title"], $this->gettext("language")) . $select->show($this->rcmail->user->language)
)
);
}
public function preferencesSectionsList(array $arg): array
{
$arg['list']['xskin'] = ['id' => 'xskin', 'section' => $this->gettext("skin_look_and_feel")];
return $arg;
}
/**
* Replaces the preference skin selection with a dialog-based selection that allows specifying separate desktop
* table and phone skins.
*
* @param array $arg
* @return array
*/
public function preferencesList(array $arg): array
{
if ($arg['section'] != 'xskin' || $this->getDontOverride("look_and_feel")) {
return $arg;
}
$arg['blocks']['skin_look_and_feel']['name'] = $this->gettext("skin_look_and_feel");
$skin = $this->skin;
if (!$this->getDontOverride("xskin_icons") && ($this->elastic || $this->rcmail->config->get("xlarry_font_icons"))) {
$this->getSettingSelect(
$arg,
"skin_look_and_feel",
"icons_$skin",
[
$this->gettext("icons_solid") => "solid",
$this->gettext("icons_traditional") => "traditional",
$this->gettext("icons_outlined") => "outlined",
$this->gettext("icons_material") => "material",
$this->gettext("icons_cartoon") => "cartoon",
],
$this->getCurrentIcons(),
false,
["onchange" => "xskin.applySetting(this, 'xicons', 'html')"],
"icons"
);
}
if (!$this->getDontOverride("xskin_list_icons") && ($this->elastic || $this->rcmail->config->get("xlarry_font_icons"))) {
$this->getSettingCheckbox(
$arg,
"skin_look_and_feel",
"list_icons_$skin",
$this->getCurrentListIcons(),
false,
["onchange" => "xskin.applySetting(this, 'xlist-icons', 'body')"],
"list_icons"
);
}
// larry-based skins don't have icons on buttons, disabling this option for larry
if (!$this->getDontOverride("xskin_button_icons") && $this->elastic) {
$this->getSettingCheckbox(
$arg,
"skin_look_and_feel",
"button_icons_$skin",
$this->getCurrentButtonIcons(),
false,
["onchange" => "xskin.applySetting(this, 'xbutton-icons', 'body')"],
"button_icons"
);
}
// if remote assets are disabled, don't give the users the choice of a font because they load from google
if (!$this->getDontOverride("xskin_font_family") && !$this->rcmail->config->get("disable_remote_skin_fonts")) {
$fonts = [];
$fontList = ["Arial", "Courier", "Merienda", "Montserrat", "Noto Sans", "Quattrocento", "Sarala", "Roboto", "Times", "Ubuntu"];
foreach ($fontList as $font) {
$fonts[$font] = strtolower(str_replace(" ", "-", $font));
}
ksort($fonts);
$this->getSettingSelect(
$arg,
"skin_look_and_feel",
"font_family_$skin",
$fonts,
$this->getCurrentFontFamily(),
false,
["onchange" => "xskin.applySetting(this, 'xfont-family', 'html')"],
"font_family"
);
}
if (!$this->getDontOverride("xskin_font_size")) {
$this->getSettingSelect(
$arg,
"skin_look_and_feel",
"font_size_$skin",
[
$this->gettext("font_size_xs") => "xs",
$this->gettext("font_size_s") => "s",
$this->gettext("font_size_n") => "n",
$this->gettext("font_size_l") => "l",
$this->gettext("font_size_xl") => "xl",
],
$this->getCurrentFontSize(),
false,
["onchange" => "xskin.applySetting(this, 'xfont-size', 'html')"],
"font_size"
);
}
if (!$this->getDontOverride("xskin_thick_font")) {
$this->getSettingCheckbox(
$arg,
"skin_look_and_feel",
"thick_font_$skin",
$this->getCurrentThickFont(),
false,
["onchange" => "xskin.applySetting(this, 'xthick-font', 'html')"],
"thick_font"
);
}
if (!$this->getDontOverride("xskin_color")) {
$colorBoxes = "";
foreach ($this->rcmail->config->get("xskin_colors") as $color) {
$colorBoxes .= html::a(
[
"class" => "color-box",
"onclick" => "xskin.applySetting('#xcolor-input', 'xcolor', 'body', '$color')",
"style" => "background:#$color !important",
],
" "
);
}
$this->addSetting(
$arg,
"skin_look_and_feel",
"color_$skin",
$colorBoxes . "<input id='xcolor-input' type='hidden' name='color_$skin' value='" .
$this->getCurrentColor() . "' />",
"",
"color"
);
}
$arg['blocks']["skin_look_and_feel"]['options']["save_hint"] = [
"title" => "",
"content" => "<span class='xsave-hint'>" . rcube::Q($this->gettext("save_hint")) . "</span>" .
"<script>xskin.updateIFrameClasses();</script>"
];
return $arg;
}
/**
* Saves the skin selection preferences.
*
* @param array $arg
* @return array
*/
public function preferencesSave(array $arg): array
{
if ($arg['section'] == "xskin") {
$this->saveSetting($arg, "icons_$this->skin");
$this->saveSetting($arg, "list_icons_$this->skin");
$this->saveSetting($arg, "button_icons_$this->skin");
$this->saveSetting($arg, "font_family_$this->skin");
$this->saveSetting($arg, "font_size_$this->skin");
$this->saveSetting($arg, "thick_font_$this->skin");
$this->saveSetting($arg, "color_$this->skin");
$this->addClasses();
}
return $arg;
}
public function addSkinInterfaceMenuItem()
{
if ($this->getDontOverride("skin") || $this->rcmail->config->get("disable_menu_skins")) {
return;
}
if ($html = $this->getShortcutSkinsHtml()) {
$this->addToInterfaceMenu(
"skin-options",
html::div(
["id" => "xskin-options", "class" => "section"],
html::div(["class" => "section-title"], $this->gettext("skin")) . $html
)
);
}
}
protected function getShortcutSkinsHtml()
{
if (count($this->getInstalledSkins()) <= 1 ||
$this->getDontOverride("skin") ||
$this->rcmail->config->get("disable_menu_skins")
) {
return false;
}
$select = new html_select(["onchange" => "xskin.quickSkinChange()", "class" => "form-control", "name" => "quick-skin-change"]);
$added = 0;
foreach ($this->getInstalledSkins() as $installedSkin) {
if (array_key_exists($installedSkin, $this->skins)) {
$select->add($this->skins[$installedSkin], $installedSkin);
$added++;
} else if ($installedSkin == "elastic" || $installedSkin == "larry") {
$select->add(ucfirst($installedSkin), $installedSkin);
$added++;
}
}
if ($added > 1) {
if ($this->rcpSkin) {
$lookAndFeelHtml = html::div(
["id" => "look-and-feel-shortcut"],
html::a(
["href" => $this->lookAndFeelUrl, "class" => "btn btn-sm btn-success"],
rcube::Q($this->gettext("skin_look_and_feel_shortcut"))
)
);
} else {
$lookAndFeelHtml = "";
}
return html::div(["id" => "xshortcut-skins", "class" => "shortcut-item"], $select->show($this->skin)) . $lookAndFeelHtml;
}
return false;
}
protected function getCurrentColor()
{
if ($this->getDontOverride("xskin_color")) {
return $this->rcmail->config->get("xskin_color");
}
$color = $this->rcmail->config->get(
"xskin_color_" . $this->skin,
$this->rcmail->config->get("xskin_color", "")
);
// have to do strlen because in_array thinks that "0" == "000000"
$colors = $this->rcmail->config->get("xskin_colors");
if (strlen($color) != 6 || !is_array($colors) || !in_array($color, $colors)) {
$color = $this->rcmail->config->get("xskin_color");
}
return $color;
}
protected function getCurrentFontFamily()
{
if ($this->getDontOverride("xskin_font_family")) {
return $this->rcmail->config->get("xskin_font_family");
}
return $this->rcmail->config->get("xskin_font_family_$this->skin", $this->rcmail->config->get("xskin_font_family"));
}
protected function getCurrentFontSize()
{
if ($this->getDontOverride("xskin_font_size")) {
return $this->rcmail->config->get("xskin_font_size");
}
return $this->rcmail->config->get("xskin_font_size_$this->skin", $this->rcmail->config->get("xskin_font_size"));
}
protected function getCurrentThickFont()
{
if ($this->getDontOverride("xskin_thick_font")) {
return $this->rcmail->config->get("xskin_thick_font");
}
return $this->rcmail->config->get("xskin_thick_font_$this->skin", $this->rcmail->config->get("xskin_thick_font"));
}
protected function getCurrentIcons()
{
if ($this->getDontOverride("xskin_icons")) {
return $this->rcmail->config->get("xskin_icons");
}
return $this->rcmail->config->get("xskin_icons_$this->skin", $this->rcmail->config->get("xskin_icons"));
}
protected function getCurrentListIcons()
{
if ($this->getDontOverride("xskin_list_icons")) {
return $this->rcmail->config->get("xskin_list_icons");
}
return $this->rcmail->config->get("xskin_list_icons_$this->skin", $this->rcmail->config->get("xskin_list_icons"));
}
protected function getCurrentButtonIcons()
{
if ($this->getDontOverride("xskin_button_icons")) {
return $this->rcmail->config->get("xskin_button_icons");
}
return $this->rcmail->config->get("xskin_button_icons_$this->skin", $this->rcmail->config->get("xskin_button_icons"));
}
protected function addClasses()
{
// add html classes
$classes = [
"xfont-family-" . $this->getCurrentFontFamily(),
"xfont-size-" . $this->getCurrentFontSize(),
"xthick-font-" . ($this->getCurrentThickFont() ? "yes" : "no"),
];
$this->addHtmlClass(implode(" ", $classes));
// add body classes
$classes = [
"{$this->rcmail->task}-page",
"xskin",
"skin-" . $this->skin,
"xcolor-" . $this->getCurrentColor(),
"xlist-icons-" . ($this->getCurrentListIcons() ? "yes" : "no"),
"xbutton-icons-" . ($this->getCurrentButtonIcons() ? "yes" : "no"),
];
// add body classes from skin's meta.json
$classes[] = $this->rcmail->config->get("xbody-classes", "");
if ($this->rcmail->task == "logout") {
$classes[] = "login-page";
}
$this->addBodyClass(implode(" ", $classes));
// this needs to be added to html so the icon() scss function works properly
$this->addHtmlClass("xicons-" . $this->getCurrentIcons());
}
/**
* Adds the Roundcube Plus icon to the login page.
*
* @param $arg
*/
protected function addLoginRcpBranding(&$arg)
{
if ($this->rcmail->task != "login" && $this->rcmail->task != "logout") {
return;
}
if (!$this->rcmail->config->get("remove_vendor_branding")) {
$this->replace(
"</body>",
html::a(
[
"id" => "vendor-branding",
"href" => "https://roundcubeplus.com",
"target" => "_blank",
"title" => "More Roundcube skins and plugins at roundcubeplus.com",
],
html::span([], "+")
).
"</body>",
$arg['content']
);
}
}
/**
* Performs string replacement with error checking. If the string to search for cannot be found it exits with an
* error message.
*
* @param string $search
* @param string $replace
* @param string $subject
* @param string|int $errorNumber
* @return int
* @codeCoverageIgnore
*/
protected function replace(string $search, string $replace, string &$subject, $errorNumber = ""): int
{
$count = 0;
$subject = str_replace($search, $replace, $subject, $count);
if ($errorNumber && !$count) {
exit(
"<p>ERROR $errorNumber: Roundcube is not running properly or it is not compatible with the Roundcube ".
"Plus skin. Disable the xskin plugin in config.inc.php and refresh this page to check for errors.</p>"
);
}
return $count;
}
protected function handleQuickSkinChange()
{
// set skin by a url parameter - this is used by the quick skin change select option in the popup
if (($skin = rcube_utils::get_input_value('skin', rcube_utils::INPUT_GET)) &&
!empty($this->userId) &&
!$this->getDontOverride("skin") &&
($pref = $this->rcmail->user->get_prefs())
) {
$pref['skin'] = $skin;
$this->rcmail->user->save_prefs($pref);
header("Refresh:0; url=" . XFramework\Utils::removeVarsFromUrl("skin"));
exit;
}
}
/**
* Sets the language if it's specified as a url parameter. Applicable only after the user is logged in.
*/
protected function handleQuickLanguageChange()
{
if (($lan = rcube_utils::get_input_value('language', rcube_utils::INPUT_GET)) &&
!empty($this->userId) &&
!$this->getDontOverride("language") &&
array_key_exists($lan, $this->rcmail->list_languages())
) {
// es_419 is too long and doesn't fit to the db field, so RC doesn't save it at all; we're saving it as es_ES
$lan == "es_419" && ($lan = "es_ES");
$this->db->update("users", ["language" => $lan], ["user_id" => $this->userId]);
header("Refresh:0; url=" . XFramework\Utils::removeVarsFromUrl("language"));
exit;
}
}
protected function setPreviewBranding()
{
// set the preview background logo (loaded using js in [skin]/watermark.html)
$this->rcmail->output->set_env(
"xwatermark",
$this->rcmail->config->get("preview_branding", "../../plugins/xskin/assets/images/watermark.png")
);
}
protected function includeCustomCss()
{
// include the custom css if specified in the xskin config
if ($overwriteCss = $this->rcmail->config->get("overwrite_css")) {
$this->includeAsset($overwriteCss);
}
// include the custom css if specified in skin json
if ($customCss = $this->rcmail->config->get("custom_css")) {
$this->includeAsset($customCss);
}
}
/**
* Larry only.
*/
protected function addDisableMobileInterfaceMenuItem()
{
// create the 'use mobile skin' button (added only if user switched to desktop skin on mobile)
$skinType = $this->rcmail->output->get_env("xskin_type");
if ($skinType == "desktop" && isset($_COOKIE['rcs_disable_mobile_skin'])) {
$this->addToInterfaceMenu(
"enable-mobile-skin",
html::div(
["id" => "enable-mobile-skin", "class" => "section"],
"<input type='button' class='button mainaction' onclick='xskin.enableMobileSkin()' value='" .
rcube::Q($this->rcmail->gettext("xskin.enable_mobile_skin")) . "' />"
)
);
} else if ($skinType != "desktop") {
$this->addToInterfaceMenu(
"disable-mobile-skin",
html::div(
["id" => "disable-mobile-skin", "class" => "section"],
"<input type='button' class='button mainaction' onclick='xskin.disableMobileSkin()' value='" .
rcube::Q($this->rcmail->gettext("xskin.disable_mobile_skin")) . "' />"
)
);
}
}
/**
* Sets the default logo images to RC+ if they're not set up otherwise in the config.
*/
protected function ensureSkinLogo()
{
if (empty($this->rcmail->config->get("skin_logo"))) {
$this->rcmail->config->set(
"skin_logo",
[
"*" => "skins/$this->skin/assets/images/logo_header.png",
"[print]" => "skins/$this->skin/assets/images/logo_print.png",
"login" => false,
]
);
}
}
}