Merge branch 'develop' of https://github.com/friendica/friendica into develop

Today's upstream develop update.
This commit is contained in:
Adam Clark
2020-08-20 14:47:06 -07:00
71 changed files with 81170 additions and 79869 deletions
+6 -1
View File
@@ -185,7 +185,12 @@ while (true) {
$do_cron = true;
}
Worker::spawnWorker($do_cron);
if ($do_cron || (!DI::process()->isMaxLoadReached() && Worker::entriesExists() && Worker::isReady())) {
Worker::spawnWorker($do_cron);
} else {
Logger::info('Cool down', ['pid' => $pid]);
sleep(10);
}
if ($do_cron) {
// We force a reconnect of the database connection.
+12 -8
View File
@@ -1,6 +1,6 @@
-- ------------------------------------------
-- Friendica 2020.09-dev (Red Hot Poker)
-- DB_UPDATE_VERSION 1360
-- DB_UPDATE_VERSION 1362
-- ------------------------------------------
@@ -132,18 +132,19 @@ CREATE TABLE IF NOT EXISTS `contact` (
PRIMARY KEY(`id`),
INDEX `uid_name` (`uid`,`name`(190)),
INDEX `self_uid` (`self`,`uid`),
INDEX `alias_uid` (`alias`(32),`uid`),
INDEX `alias_uid` (`alias`(96),`uid`),
INDEX `pending_uid` (`pending`,`uid`),
INDEX `blocked_uid` (`blocked`,`uid`),
INDEX `uid_rel_network_poll` (`uid`,`rel`,`network`,`poll`(64),`archive`),
INDEX `uid_network_batch` (`uid`,`network`,`batch`(64)),
INDEX `addr_uid` (`addr`(32),`uid`),
INDEX `nurl_uid` (`nurl`(32),`uid`),
INDEX `addr_uid` (`addr`(96),`uid`),
INDEX `nurl_uid` (`nurl`(96),`uid`),
INDEX `nick_uid` (`nick`(32),`uid`),
INDEX `attag_uid` (`attag`(32),`uid`),
INDEX `attag_uid` (`attag`(96),`uid`),
INDEX `dfrn-id` (`dfrn-id`(64)),
INDEX `issued-id` (`issued-id`(64)),
INDEX `network_uid_lastupdate` (`network`,`uid`,`last-update`),
INDEX `uid_network_self_lastupdate` (`uid`,`network`,`self`,`last-update`),
INDEX `uid_lastitem` (`uid`,`last-item`),
INDEX `gsid` (`gsid`),
FOREIGN KEY (`gsid`) REFERENCES `gserver` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT
@@ -644,6 +645,7 @@ CREATE TABLE IF NOT EXISTS `item` (
INDEX `resource-id` (`resource-id`),
INDEX `deleted_changed` (`deleted`,`changed`),
INDEX `uid_wall_changed` (`uid`,`wall`,`changed`),
INDEX `uid_unseen_wall` (`uid`,`unseen`,`wall`),
INDEX `mention_uid_id` (`mention`,`uid`,`id`),
INDEX `uid_eventid` (`uid`,`event-id`),
INDEX `icid` (`icid`),
@@ -1350,6 +1352,7 @@ CREATE TABLE IF NOT EXISTS `workerqueue` (
INDEX `done_priority_created` (`done`,`priority`,`created`),
INDEX `done_priority_next_try` (`done`,`priority`,`next_try`),
INDEX `done_pid_next_try` (`done`,`pid`,`next_try`),
INDEX `done_pid_retrial` (`done`,`pid`,`retrial`),
INDEX `done_pid_priority_created` (`done`,`pid`,`priority`,`created`)
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Background tasks queue entries';
@@ -1408,11 +1411,12 @@ CREATE VIEW `network-item-view` AS SELECT
`item`.`contact-id` AS `contact-id`
FROM `item`
INNER JOIN `thread` ON `thread`.`iid` = `item`.`parent`
STRAIGHT_JOIN `contact` ON `contact`.`id` = `thread`.`contact-id` AND (NOT `contact`.`blocked` OR `contact`.`pending`)
STRAIGHT_JOIN `contact` ON `contact`.`id` = `thread`.`contact-id`
LEFT JOIN `user-item` ON `user-item`.`iid` = `item`.`id` AND `user-item`.`uid` = `thread`.`uid`
LEFT JOIN `user-contact` AS `author` ON `author`.`uid` = `thread`.`uid` AND `author`.`cid` = `thread`.`author-id`
LEFT JOIN `user-contact` AS `owner` ON `owner`.`uid` = `thread`.`uid` AND `owner`.`cid` = `thread`.`owner-id`
WHERE `thread`.`visible` AND NOT `thread`.`deleted` AND NOT `thread`.`moderated`
AND (NOT `contact`.`readonly` AND NOT `contact`.`blocked` AND NOT `contact`.`pending`)
AND (`user-item`.`hidden` IS NULL OR NOT `user-item`.`hidden`)
AND (`author`.`blocked` IS NULL OR NOT `author`.`blocked`)
AND (`owner`.`blocked` IS NULL OR NOT `owner`.`blocked`);
@@ -1435,12 +1439,13 @@ CREATE VIEW `network-thread-view` AS SELECT
`thread`.`network` AS `network`,
`thread`.`contact-id` AS `contact-id`
FROM `thread`
STRAIGHT_JOIN `contact` ON `contact`.`id` = `thread`.`contact-id` AND (NOT `contact`.`blocked` OR `contact`.`pending`)
STRAIGHT_JOIN `contact` ON `contact`.`id` = `thread`.`contact-id`
STRAIGHT_JOIN `item` ON `item`.`id` = `thread`.`iid`
LEFT JOIN `user-item` ON `user-item`.`iid` = `item`.`id` AND `user-item`.`uid` = `thread`.`uid`
LEFT JOIN `user-contact` AS `author` ON `author`.`uid` = `thread`.`uid` AND `author`.`cid` = `thread`.`author-id`
LEFT JOIN `user-contact` AS `owner` ON `owner`.`uid` = `thread`.`uid` AND `owner`.`cid` = `thread`.`owner-id`
WHERE `thread`.`visible` AND NOT `thread`.`deleted` AND NOT `thread`.`moderated`
AND (NOT `contact`.`readonly` AND NOT `contact`.`blocked` AND NOT `contact`.`pending`)
AND (`user-item`.`hidden` IS NULL OR NOT `user-item`.`hidden`)
AND (`author`.`blocked` IS NULL OR NOT `author`.`blocked`)
AND (`owner`.`blocked` IS NULL OR NOT `owner`.`blocked`);
@@ -1513,7 +1518,6 @@ CREATE VIEW `owner-view` AS SELECT
`contact`.`archive` AS `archive`,
`contact`.`pending` AS `pending`,
`contact`.`deleted` AS `deleted`,
`contact`.`rating` AS `rating`,
`contact`.`unsearchable` AS `unsearchable`,
`contact`.`sensitive` AS `sensitive`,
`contact`.`baseurl` AS `baseurl`,
+5
View File
@@ -105,6 +105,11 @@ function cal_content(App $a)
// get the translation strings for the callendar
$i18n = Event::getStrings();
DI::page()->registerStylesheet('view/asset/fullcalendar/dist/fullcalendar.min.css');
DI::page()->registerStylesheet('view/asset/fullcalendar/dist/fullcalendar.print.min.css', 'print');
DI::page()->registerFooterScript('view/asset/moment/min/moment-with-locales.min.js');
DI::page()->registerFooterScript('view/asset/fullcalendar/dist/fullcalendar.min.js');
$htpl = Renderer::getMarkupTemplate('event_head.tpl');
DI::page()['htmlhead'] .= Renderer::replaceMacros($htpl, [
'$module_url' => '/cal/' . $a->data['user']['nickname'],
+1 -1
View File
@@ -481,7 +481,7 @@ function dfrn_confirm_post(App $a, $handsfree = null)
if (DBA::isResult($contact)) {
$photo = $contact['photo'];
} else {
$photo = DI::baseUrl() . '/images/person-300.jpg';
$photo = DI::baseUrl() . Contact::DEFAULT_AVATAR_PHOTO;
}
Contact::updateAvatar($dfrn_record, $photo);
+5
View File
@@ -256,6 +256,11 @@ function events_content(App $a)
// get the translation strings for the callendar
$i18n = Event::getStrings();
DI::page()->registerStylesheet('view/asset/fullcalendar/dist/fullcalendar.min.css');
DI::page()->registerStylesheet('view/asset/fullcalendar/dist/fullcalendar.print.min.css', 'print');
DI::page()->registerFooterScript('view/asset/moment/min/moment-with-locales.min.js');
DI::page()->registerFooterScript('view/asset/fullcalendar/dist/fullcalendar.min.js');
$htpl = Renderer::getMarkupTemplate('event_head.tpl');
DI::page()['htmlhead'] .= Renderer::replaceMacros($htpl, [
'$module_url' => '/events',
+5 -4
View File
@@ -9,6 +9,7 @@ use Friendica\App;
use Friendica\Core\Renderer;
use Friendica\Database\DBA;
use Friendica\DI;
use Friendica\Model\Photo;
use Friendica\Util\Images;
use Friendica\Util\Strings;
@@ -47,8 +48,8 @@ function fbrowser_content(App $a)
if ($a->argc==2) {
$photos = q("SELECT distinct(`album`) AS `album` FROM `photo` WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s' ",
intval(local_user()),
DBA::escape('Contact Photos'),
DBA::escape(DI::l10n()->t('Contact Photos'))
DBA::escape(Photo::CONTACT_PHOTOS),
DBA::escape(DI::l10n()->t(Photo::CONTACT_PHOTOS))
);
$albums = array_column($photos, 'album');
@@ -66,8 +67,8 @@ function fbrowser_content(App $a)
FROM `photo` WHERE `uid` = %d $sql_extra AND `album` != '%s' AND `album` != '%s'
GROUP BY `resource-id` $sql_extra2",
intval(local_user()),
DBA::escape('Contact Photos'),
DBA::escape(DI::l10n()->t('Contact Photos'))
DBA::escape(Photo::CONTACT_PHOTOS),
DBA::escape(DI::l10n()->t(Photo::CONTACT_PHOTOS))
);
function _map_files1($rr)
+8 -8
View File
@@ -193,7 +193,7 @@ function photos_post(App $a)
}
$album = hex2bin($a->argv[3]);
if ($album === DI::l10n()->t('Profile Photos') || $album === 'Contact Photos' || $album === DI::l10n()->t('Contact Photos')) {
if ($album === DI::l10n()->t('Profile Photos') || $album === Photo::CONTACT_PHOTOS || $album === DI::l10n()->t(Photo::CONTACT_PHOTOS)) {
DI::baseUrl()->redirect($_SESSION['photo_return']);
return; // NOTREACHED
}
@@ -937,7 +937,7 @@ function photos_content(App $a)
$albumselect .= '<option value="" ' . (!$selname ? ' selected="selected" ' : '') . '>&lt;current year&gt;</option>';
if (!empty($a->data['albums'])) {
foreach ($a->data['albums'] as $album) {
if (($album['album'] === '') || ($album['album'] === 'Contact Photos') || ($album['album'] === DI::l10n()->t('Contact Photos'))) {
if (($album['album'] === '') || ($album['album'] === Photo::CONTACT_PHOTOS) || ($album['album'] === DI::l10n()->t(Photo::CONTACT_PHOTOS))) {
continue;
}
$selected = (($selname === $album['album']) ? ' selected="selected" ' : '');
@@ -1050,7 +1050,7 @@ function photos_content(App $a)
// edit album name
if ($cmd === 'edit') {
if (($album !== DI::l10n()->t('Profile Photos')) && ($album !== 'Contact Photos') && ($album !== DI::l10n()->t('Contact Photos'))) {
if (($album !== DI::l10n()->t('Profile Photos')) && ($album !== Photo::CONTACT_PHOTOS) && ($album !== DI::l10n()->t(Photo::CONTACT_PHOTOS))) {
if ($can_post) {
$edit_tpl = Renderer::getMarkupTemplate('album_edit.tpl');
@@ -1067,7 +1067,7 @@ function photos_content(App $a)
}
}
} else {
if (($album !== DI::l10n()->t('Profile Photos')) && ($album !== 'Contact Photos') && ($album !== DI::l10n()->t('Contact Photos')) && $can_post) {
if (($album !== DI::l10n()->t('Profile Photos')) && ($album !== Photo::CONTACT_PHOTOS) && ($album !== DI::l10n()->t(Photo::CONTACT_PHOTOS)) && $can_post) {
$edit = [DI::l10n()->t('Edit Album'), 'photos/' . $a->data['user']['nickname'] . '/album/' . bin2hex($album) . '/edit'];
$drop = [DI::l10n()->t('Drop Album'), 'photos/' . $a->data['user']['nickname'] . '/album/' . bin2hex($album) . '/drop'];
}
@@ -1550,8 +1550,8 @@ function photos_content(App $a)
$r = q("SELECT `resource-id`, max(`scale`) AS `scale` FROM `photo` WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s'
$sql_extra GROUP BY `resource-id`",
intval($a->data['user']['uid']),
DBA::escape('Contact Photos'),
DBA::escape(DI::l10n()->t('Contact Photos'))
DBA::escape(Photo::CONTACT_PHOTOS),
DBA::escape(DI::l10n()->t(Photo::CONTACT_PHOTOS))
);
if (DBA::isResult($r)) {
$total = count($r);
@@ -1565,8 +1565,8 @@ function photos_content(App $a)
WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s'
$sql_extra GROUP BY `resource-id` ORDER BY `created` DESC LIMIT %d , %d",
intval($a->data['user']['uid']),
DBA::escape('Contact Photos'),
DBA::escape(DI::l10n()->t('Contact Photos')),
DBA::escape(Photo::CONTACT_PHOTOS),
DBA::escape(DI::l10n()->t(Photo::CONTACT_PHOTOS)),
$pager->getStart(),
$pager->getItemsPerPage()
);
+4 -5
View File
@@ -165,11 +165,10 @@ class Page implements ArrayAccess
* The path can be absolute or relative to the Friendica installation base folder.
*
* @param string $path
*
* @param string $media
* @see Page::initHead()
*
*/
public function registerStylesheet($path)
public function registerStylesheet($path, string $media = 'screen')
{
$path = Network::appendQueryParam($path, ['v' => FRIENDICA_VERSION]);
@@ -177,7 +176,7 @@ class Page implements ArrayAccess
$path = mb_substr($path, mb_strlen($this->basePath . DIRECTORY_SEPARATOR));
}
$this->stylesheets[] = trim($path, '/');
$this->stylesheets[trim($path, '/')] = $media;
}
/**
@@ -252,7 +251,7 @@ class Page implements ArrayAccess
'$shortcut_icon' => $shortcut_icon,
'$touch_icon' => $touch_icon,
'$block_public' => intval($config->get('system', 'block_public')),
'$stylesheets' => array_unique($this->stylesheets),
'$stylesheets' => $this->stylesheets,
]) . $this->page['htmlhead'];
}
+4
View File
@@ -140,6 +140,10 @@ abstract class BaseModule
return false;
}
if (empty($a->user)) {
return false;
}
$sec_hash = hash('whirlpool', $a->user['guid'] . $a->user['prvkey'] . session_id() . $x[0] . $typename);
return ($sec_hash == $x[1]);
+2 -1
View File
@@ -27,6 +27,7 @@ use Friendica\Core\Renderer;
use Friendica\Core\Session;
use Friendica\Database\DBA;
use Friendica\DI;
use Friendica\Model\Contact;
use Friendica\Model\Profile;
use Friendica\Model\User;
@@ -183,7 +184,7 @@ class Nav
// user info
$contact = DBA::selectFirst('contact', ['micro'], ['uid' => $a->user['uid'], 'self' => true]);
$userinfo = [
'icon' => (DBA::isResult($contact) ? DI::baseUrl()->remove($contact['micro']) : 'images/person-48.jpg'),
'icon' => (DBA::isResult($contact) ? DI::baseUrl()->remove($contact['micro']) : Contact::DEFAULT_AVATAR_MICRO),
'name' => $a->user['username'],
];
} else {
+1 -2
View File
@@ -1973,8 +1973,7 @@ class BBCode
*/
private static function bbCodeMention2DiasporaCallback($match)
{
$contact = Contact::getByURL($match[3], null, ['addr']);
$contact = Contact::getByURL($match[3], false, ['addr']);
if (empty($contact['addr'])) {
return $match[0];
}
+40 -23
View File
@@ -81,27 +81,8 @@ class Worker
self::killStaleWorkers();
}
// Count active workers and compare them with a maximum value that depends on the load
if (self::tooMuchWorkers()) {
Logger::info('Pre check: Active worker limit reached, quitting.');
return;
}
// Do we have too few memory?
if (DI::process()->isMinMemoryReached()) {
Logger::info('Pre check: Memory limit reached, quitting.');
return;
}
// Possibly there are too much database connections
if (self::maxConnectionsReached()) {
Logger::info('Pre check: maximum connections reached, quitting.');
return;
}
// Possibly there are too much database processes that block the system
if (DI::process()->isMaxProcessesReached()) {
Logger::info('Pre check: maximum processes reached, quitting.');
// Check if the system is ready
if (!self::isReady()) {
return;
}
@@ -174,13 +155,49 @@ class Worker
Logger::info("Couldn't select a workerqueue entry, quitting process", ['pid' => getmypid()]);
}
/**
* Checks if the system is ready.
*
* Several system parameters like memory, connections and processes are checked.
*
* @return boolean
*/
public static function isReady()
{
// Count active workers and compare them with a maximum value that depends on the load
if (self::tooMuchWorkers()) {
Logger::info('Active worker limit reached, quitting.');
return false;
}
// Do we have too few memory?
if (DI::process()->isMinMemoryReached()) {
Logger::info('Memory limit reached, quitting.');
return false;
}
// Possibly there are too much database connections
if (self::maxConnectionsReached()) {
Logger::info('Maximum connections reached, quitting.');
return false;
}
// Possibly there are too much database processes that block the system
if (DI::process()->isMaxProcessesReached()) {
Logger::info('Maximum processes reached, quitting.');
return false;
}
return true;
}
/**
* Check if non executed tasks do exist in the worker queue
*
* @return boolean Returns "true" if tasks are existing
* @throws \Exception
*/
private static function entriesExists()
public static function entriesExists()
{
$stamp = (float)microtime(true);
$exists = DBA::exists('workerqueue', ["NOT `done` AND `pid` = 0 AND `next_try` < ?", DateTimeFormat::utcNow()]);
@@ -733,7 +750,7 @@ class Worker
}
}
Logger::log("Load: " . $load ."/" . $maxsysload . " - processes: " . $deferred . "/" . $active . "/" . $waiting_processes . $processlist . " - maximum: " . $queues . "/" . $maxqueues, Logger::DEBUG);
Logger::notice("Load: " . $load ."/" . $maxsysload . " - processes: " . $deferred . "/" . $active . "/" . $waiting_processes . $processlist . " - maximum: " . $queues . "/" . $maxqueues);
// Are there fewer workers running as possible? Then fork a new one.
if (!DI::config()->get("system", "worker_dont_fork", false) && ($queues > ($active + 1)) && self::entriesExists()) {
+1 -1
View File
@@ -132,7 +132,7 @@ class Introduction extends BaseFactory
'madeby_zrl' => Contact::magicLink($notification['url']),
'madeby_addr' => $notification['addr'],
'contact_id' => $notification['contact-id'],
'photo' => (!empty($notification['fphoto']) ? Proxy::proxifyUrl($notification['fphoto'], false, Proxy::SIZE_SMALL) : "images/person-300.jpg"),
'photo' => (!empty($notification['fphoto']) ? Proxy::proxifyUrl($notification['fphoto'], false, Proxy::SIZE_SMALL) : Contact::DEFAULT_AVATAR_PHOTO),
'name' => $notification['fname'],
'url' => $notification['furl'],
'zrl' => Contact::magicLink($notification['furl']),
+35 -10
View File
@@ -51,6 +51,10 @@ use Friendica\Util\Strings;
*/
class Contact
{
const DEFAULT_AVATAR_PHOTO = '/images/person-300.jpg';
const DEFAULT_AVATAR_THUMB = '/images/person-80.jpg';
const DEFAULT_AVATAR_MICRO = '/images/person-48.jpg';
/**
* @deprecated since version 2019.03
* @see User::PAGE_FLAGS_NORMAL
@@ -644,9 +648,9 @@ class Contact
$fields['micro'] = $prefix . '6' . $suffix;
} else {
// We hadn't found a photo entry, so we use the default avatar
$fields['photo'] = DI::baseUrl() . '/images/person-300.jpg';
$fields['thumb'] = DI::baseUrl() . '/images/person-80.jpg';
$fields['micro'] = DI::baseUrl() . '/images/person-48.jpg';
$fields['photo'] = DI::baseUrl() . self::DEFAULT_AVATAR_PHOTO;
$fields['thumb'] = DI::baseUrl() . self::DEFAULT_AVATAR_THUMB;
$fields['micro'] = DI::baseUrl() . self::DEFAULT_AVATAR_MICRO;
}
$fields['avatar'] = DI::baseUrl() . '/photo/profile/' .$uid . '.' . $file_suffix;
@@ -1467,7 +1471,7 @@ class Contact
*/
public static function getPhoto(array $contact, string $avatar = '')
{
return self::getAvatarPath($contact, 'photo', DI::baseUrl() . '/images/person-300.jpg', Proxy::SIZE_SMALL, $avatar);
return self::getAvatarPath($contact, 'photo', DI::baseUrl() . self::DEFAULT_AVATAR_PHOTO, Proxy::SIZE_SMALL, $avatar);
}
/**
@@ -1479,7 +1483,7 @@ class Contact
*/
public static function getThumb(array $contact, string $avatar = '')
{
return self::getAvatarPath($contact, 'thumb', DI::baseUrl() . '/images/person-80.jpg', Proxy::SIZE_THUMB, $avatar);
return self::getAvatarPath($contact, 'thumb', DI::baseUrl() . self::DEFAULT_AVATAR_THUMB, Proxy::SIZE_THUMB, $avatar);
}
/**
@@ -1491,7 +1495,7 @@ class Contact
*/
public static function getMicro(array $contact, string $avatar = '')
{
return self::getAvatarPath($contact, 'micro', DI::baseUrl() . '/images/person-48.jpg', Proxy::SIZE_MICRO, $avatar);
return self::getAvatarPath($contact, 'micro', DI::baseUrl() . self::DEFAULT_AVATAR_MICRO, Proxy::SIZE_MICRO, $avatar);
}
/**
@@ -1530,13 +1534,13 @@ class Contact
/// add the default avatars if the fields aren't filled
if (isset($contact['photo']) && empty($contact['photo'])) {
$contact['photo'] = DI::baseUrl() . '/images/person-300.jpg';
$contact['photo'] = DI::baseUrl() . self::DEFAULT_AVATAR_PHOTO;
}
if (isset($contact['thumb']) && empty($contact['thumb'])) {
$contact['thumb'] = DI::baseUrl() . '/images/person-80.jpg';
$contact['thumb'] = DI::baseUrl() . self::DEFAULT_AVATAR_THUMB;
}
if (isset($contact['micro']) && empty($contact['micro'])) {
$contact['micro'] = DI::baseUrl() . '/images/person-48.jpg';
$contact['micro'] = DI::baseUrl() . self::DEFAULT_AVATAR_MICRO;
}
return $contact;
@@ -1556,7 +1560,7 @@ class Contact
*/
public static function updateAvatar(int $cid, string $avatar, bool $force = false)
{
$contact = DBA::selectFirst('contact', ['uid', 'avatar', 'photo', 'thumb', 'micro', 'nurl'], ['id' => $cid, 'self' => false]);
$contact = DBA::selectFirst('contact', ['uid', 'avatar', 'photo', 'thumb', 'micro', 'nurl', 'url'], ['id' => $cid, 'self' => false]);
if (!DBA::isResult($contact)) {
return;
}
@@ -1572,6 +1576,27 @@ class Contact
return;
}
$local_uid = User::getIdForURL($contact['url']);
if (!empty($local_uid)) {
$fields = self::selectFirst(['avatar', 'avatar-date', 'photo', 'thumb', 'micro'], ['self' => true, 'uid' => $local_uid]);
}
// Replace cached avatar pictures from the default avatar with the default avatars in different sizes
if (strpos($avatar, self::DEFAULT_AVATAR_PHOTO)) {
$fields = ['avatar' => $avatar, 'avatar-date' => DateTimeFormat::utcNow(),
'photo' => DI::baseUrl() . self::DEFAULT_AVATAR_PHOTO,
'thumb' => DI::baseUrl() . self::DEFAULT_AVATAR_THUMB,
'micro' => DI::baseUrl() . self::DEFAULT_AVATAR_MICRO];
}
if (!empty($fields)) {
if ($fields['photo'] . $fields['thumb'] . $fields['micro'] != $contact['photo'] . $contact['thumb'] . $contact['micro']) {
DBA::update('contact', $fields, ['id' => $cid]);
Photo::delete(['uid' => $uid, 'contact-id' => $cid, 'album' => Photo::CONTACT_PHOTOS]);
}
return;
}
$data = [
$contact['photo'] ?? '',
$contact['thumb'] ?? '',
+1 -1
View File
@@ -166,7 +166,7 @@ class Relation
}
if (empty($contact)) {
$contact = Contact::getByURL($url);
$contact = Contact::getByURL($url, false);
}
if (empty($contact)) {
+2 -2
View File
@@ -2026,13 +2026,13 @@ class Item
return;
}
if (Contact::getIdForURL($parent['author-link'], $item['uid'])) {
if (($author['contact-type'] != Contact::TYPE_COMMUNITY) && Contact::isSharing($parent['author-link'], $item['uid'])) {
logger::info('The parent author is a user contact: quit', ['author' => $parent['author-link'], 'uid' => $item['uid']]);
return;
}
$cid = Contact::getIdForURL($author['url'], $item['uid']);
if (empty($cid)) {
if (empty($cid) || !Contact::isSharing($cid, $item['uid'])) {
logger::info('The resharer is not a user contact: quit', ['resharer' => $author['url'], 'uid' => $item['uid']]);
return;
}
+13 -11
View File
@@ -41,6 +41,8 @@ require_once "include/dba.php";
*/
class Photo
{
const CONTACT_PHOTOS = 'Contact Photos';
/**
* Select rows from the photo table and returns them as array
*
@@ -408,7 +410,7 @@ class Photo
$micro = "";
$photo = DBA::selectFirst(
"photo", ["resource-id"], ["uid" => $uid, "contact-id" => $cid, "scale" => 4, "album" => "Contact Photos"]
"photo", ["resource-id"], ["uid" => $uid, "contact-id" => $cid, "scale" => 4, "album" => self::CONTACT_PHOTOS]
);
if (!empty($photo['resource-id'])) {
$resource_id = $photo["resource-id"];
@@ -437,7 +439,7 @@ class Photo
if ($Image->isValid()) {
$Image->scaleToSquare(300);
$r = self::store($Image, $uid, $cid, $resource_id, $filename, "Contact Photos", 4);
$r = self::store($Image, $uid, $cid, $resource_id, $filename, self::CONTACT_PHOTOS, 4);
if ($r === false) {
$photo_failure = true;
@@ -445,7 +447,7 @@ class Photo
$Image->scaleDown(80);
$r = self::store($Image, $uid, $cid, $resource_id, $filename, "Contact Photos", 5);
$r = self::store($Image, $uid, $cid, $resource_id, $filename, self::CONTACT_PHOTOS, 5);
if ($r === false) {
$photo_failure = true;
@@ -453,7 +455,7 @@ class Photo
$Image->scaleDown(48);
$r = self::store($Image, $uid, $cid, $resource_id, $filename, "Contact Photos", 6);
$r = self::store($Image, $uid, $cid, $resource_id, $filename, self::CONTACT_PHOTOS, 6);
if ($r === false) {
$photo_failure = true;
@@ -492,9 +494,9 @@ class Photo
}
if ($photo_failure) {
$image_url = DI::baseUrl() . "/images/person-300.jpg";
$thumb = DI::baseUrl() . "/images/person-80.jpg";
$micro = DI::baseUrl() . "/images/person-48.jpg";
$image_url = DI::baseUrl() . Contact::DEFAULT_AVATAR_PHOTO;
$thumb = DI::baseUrl() . Contact::DEFAULT_AVATAR_THUMB;
$micro = DI::baseUrl() . Contact::DEFAULT_AVATAR_MICRO;
}
return [$image_url, $thumb, $micro];
@@ -561,8 +563,8 @@ class Photo
WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s' $sql_extra
GROUP BY `album` ORDER BY `created` DESC",
intval($uid),
DBA::escape("Contact Photos"),
DBA::escape(DI::l10n()->t("Contact Photos"))
DBA::escape(self::CONTACT_PHOTOS),
DBA::escape(DI::l10n()->t(self::CONTACT_PHOTOS))
);
} else {
// This query doesn't do the count and is much faster
@@ -570,8 +572,8 @@ class Photo
FROM `photo` USE INDEX (`uid_album_scale_created`)
WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s' $sql_extra",
intval($uid),
DBA::escape("Contact Photos"),
DBA::escape(DI::l10n()->t("Contact Photos"))
DBA::escape(self::CONTACT_PHOTOS),
DBA::escape(DI::l10n()->t(self::CONTACT_PHOTOS))
);
}
DI::cache()->set($key, $albums, Duration::DAY);
+20 -5
View File
@@ -162,14 +162,29 @@ class User
* @return integer user id
* @throws Exception
*/
public static function getIdForURL($url)
public static function getIdForURL(string $url)
{
$self = DBA::selectFirst('contact', ['uid'], ['nurl' => Strings::normaliseLink($url), 'self' => true]);
if (!DBA::isResult($self)) {
return false;
} else {
// Avoid any database requests when the hostname isn't even part of the url.
if (!strpos($url, DI::baseUrl()->getHostname())) {
return 0;
}
$self = Contact::selectFirst(['uid'], ['self' => true, 'nurl' => Strings::normaliseLink($url)]);
if (!empty($self['uid'])) {
return $self['uid'];
}
$self = Contact::selectFirst(['uid'], ['self' => true, 'addr' => $url]);
if (!empty($self['uid'])) {
return $self['uid'];
}
$self = Contact::selectFirst(['uid'], ['self' => true, 'alias' => [$url, Strings::normaliseLink($url)]]);
if (!empty($self['uid'])) {
return $self['uid'];
}
return 0;
}
/**
+4 -4
View File
@@ -23,8 +23,8 @@ namespace Friendica\Module;
use Friendica\BaseModule;
use Friendica\Core\Logger;
use Friendica\Core\System;
use Friendica\DI;
use Friendica\Model\Contact;
use Friendica\Model\Photo as MPhoto;
/**
@@ -139,16 +139,16 @@ class Photo extends BaseModule
case "profile":
case "custom":
$scale = 4;
$default = "images/person-300.jpg";
$default = Contact::DEFAULT_AVATAR_PHOTO;
break;
case "micro":
$scale = 6;
$default = "images/person-48.jpg";
$default = Contact::DEFAULT_AVATAR_MICRO;
break;
case "avatar":
default:
$scale = 5;
$default = "images/person-80.jpg";
$default = Contact::DEFAULT_AVATAR_THUMB;
}
$photo = MPhoto::selectFirst([], ["scale" => $scale, "uid" => $uid, "profile" => 1]);
+1 -1
View File
@@ -350,7 +350,7 @@ class Acl extends BaseModule
'type' => 'c',
'photo' => Contact::getMicro($contact),
'name' => htmlspecialchars($contact['name']),
'id' => intval($contact['cid']),
'id' => intval($contact['id']),
'network' => $contact['network'],
'link' => $contact['url'],
'nick' => htmlentities(($contact['nick'] ?? '') ?: $contact['addr']),
+5 -8
View File
@@ -114,14 +114,11 @@ class UserExport extends BaseSettings
$rows = DBA::p($query);
while ($row = DBA::fetch($rows)) {
$p = [];
foreach ($row as $k => $v) {
switch ($dbStructure[$table]['fields'][$k]['type']) {
case 'datetime':
$p[$k] = $v ?? DBA::NULL_DATETIME;
break;
default:
$p[$k] = $v;
break;
foreach ($dbStructure[$table]['fields'] as $column => $field) {
if ($field['type'] == 'datetime') {
$p[$column] = $v ?? DBA::NULL_DATETIME;
} else {
$p[$column] = $v;
}
}
$result[] = $p;
+8 -10
View File
@@ -32,19 +32,17 @@ class Theme extends BaseModule
{
public static function rawContent(array $parameters = [])
{
header("Content-Type: text/css");
header('Content-Type: text/css');
$a = DI::app();
$theme = Strings::sanitizeFilePathItem($parameters['theme']);
if ($a->argc == 4) {
$theme = $a->argv[2];
$theme = Strings::sanitizeFilePathItem($theme);
if (file_exists("view/theme/$theme/theme.php")) {
require_once "view/theme/$theme/theme.php";
}
// set the path for later use in the theme styles
$THEMEPATH = "view/theme/$theme";
if (file_exists("view/theme/$theme/style.php")) {
require_once("view/theme/$theme/style.php");
}
// set the path for later use in the theme styles
if (file_exists("view/theme/$theme/style.php")) {
require_once "view/theme/$theme/style.php";
}
exit();
+6
View File
@@ -137,6 +137,8 @@ class HTTPRequest implements IHTTPRequest
@curl_setopt($ch, CURLOPT_NOBODY, $opts['nobody']);
}
@curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
if (!empty($opts['timeout'])) {
@curl_setopt($ch, CURLOPT_TIMEOUT, $opts['timeout']);
} else {
@@ -238,6 +240,8 @@ class HTTPRequest implements IHTTPRequest
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
}
@curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
if (intval($timeout)) {
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
} else {
@@ -331,6 +335,7 @@ class HTTPRequest implements IHTTPRequest
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_NOBODY, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, $this->getUserAgent());
@@ -375,6 +380,7 @@ class HTTPRequest implements IHTTPRequest
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_NOBODY, 0);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, $this->getUserAgent());
+60 -2
View File
@@ -23,13 +23,13 @@ namespace Friendica\Network;
use DOMDocument;
use DomXPath;
use Friendica\Core\Cache\Duration;
use Friendica\Core\Hook;
use Friendica\Core\Logger;
use Friendica\Core\Protocol;
use Friendica\Core\System;
use Friendica\Database\DBA;
use Friendica\DI;
use Friendica\Model\Contact;
use Friendica\Model\GServer;
use Friendica\Model\Profile;
use Friendica\Model\User;
@@ -330,6 +330,14 @@ class Probe
*/
public static function uri($uri, $network = '', $uid = -1)
{
// Local profiles aren't probed via network
if (empty($network) && strpos($uri, DI::baseUrl()->getHostname())) {
$data = self::localProbe($uri);
if (!empty($data)) {
return $data;
}
}
if ($uid == -1) {
$uid = local_user();
}
@@ -362,7 +370,7 @@ class Probe
}
if (empty($data['photo'])) {
$data['photo'] = DI::baseUrl() . '/images/person-300.jpg';
$data['photo'] = DI::baseUrl() . Contact::DEFAULT_AVATAR_PHOTO;
}
if (empty($data['name'])) {
@@ -2004,6 +2012,14 @@ class Probe
*/
public static function getLastUpdate(array $data)
{
$uid = User::getIdForURL($data['url']);
if (!empty($uid)) {
$contact = Contact::selectFirst(['url', 'last-item'], ['self' => true, 'uid' => $uid]);
if (!empty($contact['last-item'])) {
return $contact['last-item'];
}
}
if ($lastUpdate = self::updateFromNoScrape($data)) {
return $lastUpdate;
}
@@ -2156,4 +2172,46 @@ class Probe
return '';
}
/**
* Probe data from local profiles without network traffic
*
* @param string $url
* @return array probed data
*/
private static function localProbe(string $url)
{
$uid = User::getIdForURL($url);
if (empty($uid)) {
return [];
}
$profile = User::getOwnerDataById($uid);
if (empty($profile)) {
return [];
}
$approfile = ActivityPub\Transmitter::getProfile($uid);
if (empty($approfile)) {
return [];
}
if (empty($profile['gsid'])) {
$profile['gsid'] = GServer::getID($approfile['generator']['url']);
}
$data = ['name' => $profile['name'], 'nick' => $profile['nick'], 'guid' => $approfile['diaspora:guid'],
'url' => $profile['url'], 'addr' => $profile['addr'], 'alias' => $profile['alias'],
'photo' => $profile['photo'], 'account-type' => $profile['contact-type'],
'community' => ($profile['contact-type'] == User::ACCOUNT_TYPE_COMMUNITY),
'keywords' => $profile['keywords'], 'location' => $profile['location'], 'about' => $profile['about'],
'hide' => !$profile['net-publish'], 'batch' => '', 'notify' => $profile['notify'],
'poll' => $profile['poll'], 'request' => $profile['request'], 'confirm' => $profile['confirm'],
'subscribe' => $approfile['generator']['url'] . '/follow?url={uri}', 'poco' => $profile['poco'],
'following' => $approfile['following'], 'followers' => $approfile['followers'],
'inbox' => $approfile['inbox'], 'outbox' => $approfile['outbox'],
'sharedinbox' => $approfile['endpoints']['sharedInbox'], 'network' => Protocol::DFRN,
'pubkey' => $profile['upubkey'], 'baseurl' => $approfile['generator']['url'], 'gsid' => $profile['gsid']];
return self::rearrangeData($data);
}
}
+6 -4
View File
@@ -963,10 +963,12 @@ class DFRN
if ($item['gravity'] != GRAVITY_PARENT) {
$parent_item = (($item['thr-parent']) ? $item['thr-parent'] : $item['parent-uri']);
$parent = Item::selectFirst(['guid', 'plink'], ['uri' => $parent_item, 'uid' => $item['uid']]);
$attributes = ["ref" => $parent_item, "type" => "text/html",
"href" => $parent['plink'],
"dfrn:diaspora_guid" => $parent['guid']];
XML::addElement($doc, $entry, "thr:in-reply-to", "", $attributes);
if (DBA::isResult($parent)) {
$attributes = ["ref" => $parent_item, "type" => "text/html",
"href" => $parent['plink'],
"dfrn:diaspora_guid" => $parent['guid']];
XML::addElement($doc, $entry, "thr:in-reply-to", "", $attributes);
}
}
// Add conversation data. This is used for OStatus
+2 -1
View File
@@ -24,6 +24,7 @@ namespace Friendica\Util;
use Friendica\Core\Hook;
use Friendica\Core\Logger;
use Friendica\DI;
use Friendica\Model\Contact;
class Network
{
@@ -235,7 +236,7 @@ class Network
Hook::callAll('avatar_lookup', $avatar);
if (! $avatar['success']) {
$avatar['url'] = DI::baseUrl() . '/images/person-300.jpg';
$avatar['url'] = DI::baseUrl() . Contact::DEFAULT_AVATAR_PHOTO;
}
Logger::log('Avatar: ' . $avatar['email'] . ' ' . $avatar['url'], Logger::DEBUG);
+6 -26
View File
@@ -21,7 +21,6 @@
namespace Friendica\Worker;
use Friendica\Core\Logger;
use Friendica\Database\DBA;
use Friendica\DI;
use Friendica\Model\Photo;
@@ -35,21 +34,12 @@ class ClearCache
public static function execute()
{
$a = DI::app();
$last = DI::config()->get('system', 'cache_last_cleared');
if ($last) {
$next = $last + (3600); // Once per hour
$clear_cache = ($next <= time());
} else {
$clear_cache = true;
}
if (!$clear_cache) {
return;
}
// clear old cache
DI::cache()->clear();
if (DI::config()->get('system', 'optimize_tables')) {
DBA::e("OPTIMIZE TABLE `cache`");
}
// clear old item cache files
clear_cache();
@@ -76,24 +66,14 @@ class ClearCache
// Delete the cached OEmbed entries that are older than three month
DBA::delete('oembed', ["`created` < NOW() - INTERVAL 3 MONTH"]);
if (DI::config()->get('system', 'optimize_tables')) {
DBA::e("OPTIMIZE TABLE `oembed`");
}
// Delete the cached "parse_url" entries that are older than three month
DBA::delete('parsed_url', ["`created` < NOW() - INTERVAL 3 MONTH"]);
if (DI::config()->get('system', 'optimize_tables')) {
Logger::info('Optimize start');
DBA::e("OPTIMIZE TABLE `auth_codes`");
DBA::e("OPTIMIZE TABLE `cache`");
DBA::e("OPTIMIZE TABLE `challenge`");
DBA::e("OPTIMIZE TABLE `locks`");
DBA::e("OPTIMIZE TABLE `oembed`");
DBA::e("OPTIMIZE TABLE `parsed_url`");
DBA::e("OPTIMIZE TABLE `profile_check`");
DBA::e("OPTIMIZE TABLE `session`");
DBA::e("OPTIMIZE TABLE `tokens`");
Logger::info('Optimize finished');
}
DI::config()->set('system', 'cache_last_cleared', time());
}
}
+42 -8
View File
@@ -63,9 +63,6 @@ class Cron
// Call possible post update functions
Worker::add(PRIORITY_LOW, 'PostUpdate');
// Clear cache entries
Worker::add(PRIORITY_LOW, 'ClearCache');
// Repair entries in the database
Worker::add(PRIORITY_LOW, 'RepairDatabase');
@@ -94,6 +91,10 @@ class Cron
self::checkdeletedContacts();
if (DI::config()->get('system', 'optimize_tables')) {
self::optimizeTables();
}
DI::config()->set('system', 'last_expire_day', $d2);
}
@@ -110,9 +111,20 @@ class Cron
// Optimizing this table only last seconds
if (DI::config()->get('system', 'optimize_tables')) {
DBA::e("OPTIMIZE TABLE `workerqueue`");
// We are acquiring the two locks from the worker to avoid locking problems
if (DI::lock()->acquire(Worker::LOCK_PROCESS, 10)) {
if (DI::lock()->acquire(Worker::LOCK_WORKER, 10)) {
DBA::e("OPTIMIZE TABLE `workerqueue`");
DBA::e("OPTIMIZE TABLE `process`");
DI::lock()->release(Worker::LOCK_WORKER);
}
DI::lock()->release(Worker::LOCK_PROCESS);
}
}
// Clear cache entries
Worker::add(PRIORITY_LOW, 'ClearCache');
DI::config()->set('system', 'last_cron_hourly', time());
}
@@ -136,6 +148,25 @@ class Cron
return;
}
/**
* Optimize tables that are known to grow and shrink all the time
*
* @return void
*/
private static function optimizeTables()
{
Logger::info('Optimize start');
DBA::e("OPTIMIZE TABLE `auth_codes`");
DBA::e("OPTIMIZE TABLE `challenge`");
DBA::e("OPTIMIZE TABLE `locks`");
DBA::e("OPTIMIZE TABLE `profile_check`");
DBA::e("OPTIMIZE TABLE `session`");
DBA::e("OPTIMIZE TABLE `tokens`");
DI::lock()->release('optimize_tables');
}
/**
* Checks for contacts that are about to be deleted and ensures that they are removed.
* This should be done automatically in the "remove" function. This here is a cleanup job.
@@ -181,8 +212,6 @@ class Cron
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
private static function pollContacts() {
$min_poll_interval = DI::config()->get('system', 'min_poll_interval');
Addon::reload();
$sql = "SELECT `contact`.`id`, `contact`.`nick`, `contact`.`name`, `contact`.`network`, `contact`.`archive`,
@@ -247,12 +276,17 @@ class Cron
/*
* Based on $contact['priority'], should we poll this site now? Or later?
*/
$t = $contact['last-update'];
$min_poll_interval = DI::config()->get('system', 'min_poll_interval');
$poll_intervals = [$min_poll_interval . ' minute', '15 minute', '30 minute',
'1 hour', '2 hour', '3 hour', '6 hour', '12 hour' ,'1 day', '1 week', '1 month'];
if (empty($poll_intervals[$rating]) || (DateTimeFormat::utcNow() > DateTimeFormat::utc($t . ' + ' . $poll_intervals[$rating]))) {
$now = DateTimeFormat::utcNow();
$next_update = DateTimeFormat::utc($contact['last-update'] . ' + ' . $poll_intervals[$rating]);
if (empty($poll_intervals[$rating]) || ($now < $next_update)) {
Logger::debug('No update', ['cid' => $contact['id'], 'rating' => $rating, 'next' => $next_update, 'now' => $now]);
continue;
}
+12
View File
@@ -103,6 +103,15 @@ class OnePoll
return;
}
// Don't poll local contacts
if (User::getIdForURL($contact['url'])) {
Logger::info('Local contacts are not polled', ['id' => $contact['id']]);
// set the last-update so we don't keep polling
DBA::update('contact', ['last-update' => $updated], ['id' => $contact['id']]);
return;
}
// We don't poll AP contacts by now
if ($protocol === Protocol::ACTIVITYPUB) {
Logger::log("Don't poll AP contact");
@@ -699,6 +708,9 @@ class OnePoll
Logger::log("Mail: no mails for ".$mailconf['user']);
}
self::updateContact($contact, ['failed' => false, 'last-update' => $updated, 'success_update' => $updated]);
Contact::unmarkForArchival($contact);
Logger::log("Mail: closing connection for ".$mailconf['user']);
imap_close($mbox);
}
+7 -5
View File
@@ -54,7 +54,7 @@
use Friendica\Database\DBA;
if (!defined('DB_UPDATE_VERSION')) {
define('DB_UPDATE_VERSION', 1360);
define('DB_UPDATE_VERSION', 1362);
}
return [
@@ -190,18 +190,19 @@ return [
"PRIMARY" => ["id"],
"uid_name" => ["uid", "name(190)"],
"self_uid" => ["self", "uid"],
"alias_uid" => ["alias(32)", "uid"],
"alias_uid" => ["alias(96)", "uid"],
"pending_uid" => ["pending", "uid"],
"blocked_uid" => ["blocked", "uid"],
"uid_rel_network_poll" => ["uid", "rel", "network", "poll(64)", "archive"],
"uid_network_batch" => ["uid", "network", "batch(64)"],
"addr_uid" => ["addr(32)", "uid"],
"nurl_uid" => ["nurl(32)", "uid"],
"addr_uid" => ["addr(96)", "uid"],
"nurl_uid" => ["nurl(96)", "uid"],
"nick_uid" => ["nick(32)", "uid"],
"attag_uid" => ["attag(32)", "uid"],
"attag_uid" => ["attag(96)", "uid"],
"dfrn-id" => ["dfrn-id(64)"],
"issued-id" => ["issued-id(64)"],
"network_uid_lastupdate" => ["network", "uid", "last-update"],
"uid_network_self_lastupdate" => ["uid", "network", "self", "last-update"],
"uid_lastitem" => ["uid", "last-item"],
"gsid" => ["gsid"]
]
@@ -1462,6 +1463,7 @@ return [
"done_priority_created" => ["done", "priority", "created"],
"done_priority_next_try" => ["done", "priority", "next_try"],
"done_pid_next_try" => ["done", "pid", "next_try"],
"done_pid_retrial" => ["done", "pid", "retrial"],
"done_pid_priority_created" => ["done", "pid", "priority", "created"]
]
],
+4 -2
View File
@@ -86,11 +86,12 @@ return [
],
"query" => "FROM `item`
INNER JOIN `thread` ON `thread`.`iid` = `item`.`parent`
STRAIGHT_JOIN `contact` ON `contact`.`id` = `thread`.`contact-id` AND (NOT `contact`.`blocked` OR `contact`.`pending`)
STRAIGHT_JOIN `contact` ON `contact`.`id` = `thread`.`contact-id`
LEFT JOIN `user-item` ON `user-item`.`iid` = `item`.`id` AND `user-item`.`uid` = `thread`.`uid`
LEFT JOIN `user-contact` AS `author` ON `author`.`uid` = `thread`.`uid` AND `author`.`cid` = `thread`.`author-id`
LEFT JOIN `user-contact` AS `owner` ON `owner`.`uid` = `thread`.`uid` AND `owner`.`cid` = `thread`.`owner-id`
WHERE `thread`.`visible` AND NOT `thread`.`deleted` AND NOT `thread`.`moderated`
AND (NOT `contact`.`readonly` AND NOT `contact`.`blocked` AND NOT `contact`.`pending`)
AND (`user-item`.`hidden` IS NULL OR NOT `user-item`.`hidden`)
AND (`author`.`blocked` IS NULL OR NOT `author`.`blocked`)
AND (`owner`.`blocked` IS NULL OR NOT `owner`.`blocked`)"
@@ -111,12 +112,13 @@ return [
"contact-id" => ["thread", "contact-id"],
],
"query" => "FROM `thread`
STRAIGHT_JOIN `contact` ON `contact`.`id` = `thread`.`contact-id` AND (NOT `contact`.`blocked` OR `contact`.`pending`)
STRAIGHT_JOIN `contact` ON `contact`.`id` = `thread`.`contact-id`
STRAIGHT_JOIN `item` ON `item`.`id` = `thread`.`iid`
LEFT JOIN `user-item` ON `user-item`.`iid` = `item`.`id` AND `user-item`.`uid` = `thread`.`uid`
LEFT JOIN `user-contact` AS `author` ON `author`.`uid` = `thread`.`uid` AND `author`.`cid` = `thread`.`author-id`
LEFT JOIN `user-contact` AS `owner` ON `owner`.`uid` = `thread`.`uid` AND `owner`.`cid` = `thread`.`owner-id`
WHERE `thread`.`visible` AND NOT `thread`.`deleted` AND NOT `thread`.`moderated`
AND (NOT `contact`.`readonly` AND NOT `contact`.`blocked` AND NOT `contact`.`pending`)
AND (`user-item`.`hidden` IS NULL OR NOT `user-item`.`hidden`)
AND (`author`.`blocked` IS NULL OR NOT `author`.`blocked`)
AND (`owner`.`blocked` IS NULL OR NOT `owner`.`blocked`)"
+8026 -8050
View File
File diff suppressed because it is too large Load Diff
+1437 -1444
View File
File diff suppressed because it is too large Load Diff
+8027 -8052
View File
File diff suppressed because it is too large Load Diff
+1438 -1445
View File
File diff suppressed because it is too large Load Diff
+8027 -8052
View File
File diff suppressed because it is too large Load Diff
+1439 -1446
View File
File diff suppressed because it is too large Load Diff
+9299 -8666
View File
File diff suppressed because it is too large Load Diff
+1882 -1783
View File
File diff suppressed because it is too large Load Diff
+8182 -8207
View File
File diff suppressed because it is too large Load Diff
+1474 -1481
View File
File diff suppressed because it is too large Load Diff
+8557 -8582
View File
File diff suppressed because it is too large Load Diff
+1496 -1503
View File
File diff suppressed because it is too large Load Diff
+8709 -8734
View File
File diff suppressed because it is too large Load Diff
+1501 -1508
View File
File diff suppressed because it is too large Load Diff
+8053 -8078
View File
File diff suppressed because it is too large Load Diff
+1846 -1853
View File
File diff suppressed because it is too large Load Diff
-6
View File
@@ -1,9 +1,3 @@
<link rel="stylesheet" type="text/css" href="{{$baseurl}}/view/asset/fullcalendar/dist/fullcalendar.min.css?v={{$smarty.const.FRIENDICA_VERSION}}" />
<link rel="stylesheet" type="text/css" href="{{$baseurl}}/view/asset/fullcalendar/dist/fullcalendar.print.min.css?v={{$smarty.const.FRIENDICA_VERSION}}" media="print" />
<script type="text/javascript" src="{{$baseurl}}/view/asset/moment/min/moment-with-locales.min.js?v={{$smarty.const.FRIENDICA_VERSION}}"></script>
<script type="text/javascript" src="{{$baseurl}}/view/asset/fullcalendar/dist/fullcalendar.min.js?v={{$smarty.const.FRIENDICA_VERSION}}"></script>
<script>
function showEvent(eventid) {
$.get(
+2 -2
View File
@@ -8,8 +8,8 @@
<link rel="stylesheet" href="view/asset/jquery-datetimepicker/build/jquery.datetimepicker.min.css?v={{$smarty.const.FRIENDICA_VERSION}}" type="text/css" media="screen" />
<link rel="stylesheet" href="view/asset/perfect-scrollbar/dist/css/perfect-scrollbar.min.css?v={{$smarty.const.FRIENDICA_VERSION}}" type="text/css" media="screen" />
{{foreach $stylesheets as $stylesheetUrl}}
<link rel="stylesheet" href="{{$stylesheetUrl}}" type="text/css" media="screen" />
{{foreach $stylesheets as $stylesheetUrl => $media}}
<link rel="stylesheet" href="{{$stylesheetUrl}}" type="text/css" media="{{$media}}" />
{{/foreach}}
<link rel="shortcut icon" href="{{$shortcut_icon}}" />
+59 -34
View File
@@ -32,14 +32,25 @@ function theme_post(App $a)
}
if (isset($_POST['frio-settings-submit'])) {
DI::pConfig()->set(local_user(), 'frio', 'scheme', $_POST['frio_scheme'] ?? '');
DI::pConfig()->set(local_user(), 'frio', 'nav_bg', $_POST['frio_nav_bg'] ?? '');
DI::pConfig()->set(local_user(), 'frio', 'nav_icon_color', $_POST['frio_nav_icon_color'] ?? '');
DI::pConfig()->set(local_user(), 'frio', 'link_color', $_POST['frio_link_color'] ?? '');
DI::pConfig()->set(local_user(), 'frio', 'background_color', $_POST['frio_background_color'] ?? '');
DI::pConfig()->set(local_user(), 'frio', 'contentbg_transp', $_POST['frio_contentbg_transp'] ?? '');
DI::pConfig()->set(local_user(), 'frio', 'background_image', $_POST['frio_background_image'] ?? '');
DI::pConfig()->set(local_user(), 'frio', 'bg_image_option', $_POST['frio_bg_image_option'] ?? '');
foreach ([
'scheme',
'scheme_accent',
'nav_bg',
'nav_icon_color',
'link_color',
'background_color',
'contentbg_transp',
'background_image',
'bg_image_option',
'login_bg_image',
'login_bg_color'
] as $field) {
if (isset($_POST['frio_' . $field])) {
DI::pConfig()->set(local_user(), 'frio', $field, $_POST['frio_' . $field]);
}
}
DI::pConfig()->set(local_user(), 'frio', 'css_modified', time());
}
}
@@ -51,16 +62,24 @@ function theme_admin_post(App $a)
}
if (isset($_POST['frio-settings-submit'])) {
DI::config()->set('frio', 'scheme', $_POST['frio_scheme'] ?? '');
DI::config()->set('frio', 'nav_bg', $_POST['frio_nav_bg'] ?? '');
DI::config()->set('frio', 'nav_icon_color', $_POST['frio_nav_icon_color'] ?? '');
DI::config()->set('frio', 'link_color', $_POST['frio_link_color'] ?? '');
DI::config()->set('frio', 'background_color', $_POST['frio_background_color'] ?? '');
DI::config()->set('frio', 'contentbg_transp', $_POST['frio_contentbg_transp'] ?? '');
DI::config()->set('frio', 'background_image', $_POST['frio_background_image'] ?? '');
DI::config()->set('frio', 'bg_image_option', $_POST['frio_bg_image_option'] ?? '');
DI::config()->set('frio', 'login_bg_image', $_POST['frio_login_bg_image'] ?? '');
DI::config()->set('frio', 'login_bg_color', $_POST['frio_login_bg_color'] ?? '');
foreach ([
'scheme',
'scheme_accent',
'nav_bg',
'nav_icon_color',
'link_color',
'background_color',
'contentbg_transp',
'background_image',
'bg_image_option',
'login_bg_image',
'login_bg_color'
] as $field) {
if (isset($_POST['frio_' . $field])) {
DI::config()->set('frio', $field, $_POST['frio_' . $field]);
}
}
DI::config()->set('frio', 'css_modified', time());
}
}
@@ -75,6 +94,7 @@ function theme_content(App $a)
$node_scheme = DI::config()->get('frio', 'scheme', DI::config()->get('frio', 'scheme'));
$arr['scheme'] = DI::pConfig()->get(local_user(), 'frio', 'scheme', DI::pConfig()->get(local_user(), 'frio', 'schema', $node_scheme));
$arr['scheme_accent'] = DI::pConfig()->get(local_user(), 'frio', 'scheme_accent' , DI::config()->get('frio', 'scheme_accent'));
$arr['share_string'] = '';
$arr['nav_bg'] = DI::pConfig()->get(local_user(), 'frio', 'nav_bg' , DI::config()->get('frio', 'nav_bg'));
$arr['nav_icon_color'] = DI::pConfig()->get(local_user(), 'frio', 'nav_icon_color' , DI::config()->get('frio', 'nav_icon_color'));
@@ -95,6 +115,7 @@ function theme_admin(App $a)
$arr = [];
$arr['scheme'] = DI::config()->get('frio', 'scheme', DI::config()->get('frio', 'schema'));
$arr['scheme_accent'] = DI::config()->get('frio', 'scheme_accent');
$arr['share_string'] = '';
$arr['nav_bg'] = DI::config()->get('frio', 'nav_bg');
$arr['nav_icon_color'] = DI::config()->get('frio', 'nav_icon_color');
@@ -112,23 +133,23 @@ function theme_admin(App $a)
function frio_form($arr)
{
require_once 'view/theme/frio/php/scheme.php';
require_once 'view/theme/frio/theme.php';
$scheme_info = get_scheme_info($arr['scheme']);
$disable = $scheme_info['overwrites'];
if (!is_array($disable)) {
$disable = [];
}
$scheme_choices = [];
$scheme_choices['---'] = DI::l10n()->t('Custom');
$files = glob('view/theme/frio/scheme/*.php');
if ($files) {
foreach ($files as $file) {
$f = basename($file, '.php');
if ($f != 'default') {
$scheme_name = ucfirst($f);
$scheme_choices[$f] = $scheme_name;
}
$schemes = [
'light' => DI::l10n()->t('Light (Accented)'),
'dark' => DI::l10n()->t('Dark (Accented)'),
'black' => DI::l10n()->t('Black (Accented)'),
];
$legacy_schemes = [];
foreach (glob('view/theme/frio/scheme/*.php') ?: [] as $file) {
$scheme = basename($file, '.php');
if (!in_array($scheme, ['default', 'light', 'dark', 'black'])) {
$scheme_name = ucfirst($scheme);
$legacy_schemes[$scheme] = $scheme_name;
}
}
@@ -138,13 +159,17 @@ function frio_form($arr)
$ctx = [
'$submit' => DI::l10n()->t('Submit'),
'$title' => DI::l10n()->t('Theme settings'),
'$scheme' => ['frio_scheme', DI::l10n()->t('Select color scheme'), $arr['scheme'], '', $scheme_choices],
'$share_string' => ['frio_share_string', DI::l10n()->t('Copy or paste schemestring'), $arr['share_string'], DI::l10n()->t('You can copy this string to share your theme with others. Pasting here applies the schemestring'), false, false],
'$custom' => DI::l10n()->t('Custom'),
'$legacy' => DI::l10n()->t('Legacy'),
'$accented' => DI::l10n()->t('Accented'),
'$scheme' => ['frio_scheme', DI::l10n()->t('Select color scheme'), $arr['scheme'], $schemes, $legacy_schemes],
'$scheme_accent' => !$scheme_info['accented'] ? '' : ['frio_scheme_accent', DI::l10n()->t('Select scheme accent'), $arr['scheme_accent'], ['blue' => DI::l10n()->t('Blue'), 'red' => DI::l10n()->t('Red'), 'purple' => DI::l10n()->t('Purple'), 'green' => DI::l10n()->t('Green'), 'pink' => DI::l10n()->t('Pink')]],
'$share_string' => $arr['scheme'] != '---' ? '' : ['frio_share_string', DI::l10n()->t('Copy or paste schemestring'), $arr['share_string'], DI::l10n()->t('You can copy this string to share your theme with others. Pasting here applies the schemestring'), false, false],
'$nav_bg' => array_key_exists('nav_bg', $disable) ? '' : ['frio_nav_bg', DI::l10n()->t('Navigation bar background color'), $arr['nav_bg'], '', false],
'$nav_icon_color' => array_key_exists('nav_icon_color', $disable) ? '' : ['frio_nav_icon_color', DI::l10n()->t('Navigation bar icon color '), $arr['nav_icon_color'], '', false],
'$link_color' => array_key_exists('link_color', $disable) ? '' : ['frio_link_color', DI::l10n()->t('Link color'), $arr['link_color'], '', false],
'$background_color' => array_key_exists('background_color', $disable) ? '' : ['frio_background_color', DI::l10n()->t('Set the background color'), $arr['background_color'], '', false],
'$contentbg_transp' => array_key_exists('contentbg_transp', $disable) ? '' : ['frio_contentbg_transp', DI::l10n()->t('Content background opacity'), ($arr['contentbg_transp'] ?? 0) ?: 100, ''],
'$contentbg_transp' => array_key_exists('contentbg_transp', $disable) ? '' : ['frio_contentbg_transp', DI::l10n()->t('Content background opacity'), $arr['contentbg_transp'] ?? 100, ''],
'$background_image' => array_key_exists('background_image', $disable) ? '' : ['frio_background_image', DI::l10n()->t('Set the background image'), $arr['background_image'], $background_image_help, false],
'$bg_image_options_title' => DI::l10n()->t('Background image style'),
'$bg_image_options' => Image::get_options($arr),
+345 -302
View File
@@ -1,302 +1,345 @@
.hovercard {
position: absolute;
top: 0;
left: 0;
z-index: 1040;
display: none;
/*max-width: 276px;*/
max-width: 400px;
padding: 1px;
text-align: left;
background-color: #ffffff;
background-clip: padding-box;
border: 1px solid #cccccc;
border: 1px solid rgba(0, 0, 0, 0.2);
border-radius: 200px;
-webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
white-space: normal;
}
.hovercard.top {
margin-top: -10px;
}
.hovercard.right {
margin-left: 10px;
}
.hovercard.bottom {
margin-top: 10px;
}
.hovercard.left {
margin-left: -10px;
}
.hovercard-title {
margin: 0;
padding: 8px 14px;
font-size: 14px;
font-weight: normal;
line-height: 18px;
background-color: #f7f7f7;
border-bottom: 1px solid #ebebeb;
border-radius: 199px 199px 0 0;
display: none;
}
.hovercard-content {
color: #777;
padding: 0;
}
.hovercard > .arrow,
.hovercard > .arrow:after {
position: absolute;
display: block;
width: 0;
height: 0;
border-color: transparent;
border-style: solid;
}
.hovercard > .arrow {
border-width: 11px;
}
.hovercard > .arrow:after {
border-width: 10px;
content: "";
}
.hovercard.top > .arrow {
left: 50%;
margin-left: -11px;
border-bottom-width: 0;
border-top-color: #999999;
border-top-color: rgba(0, 0, 0, 0.25);
bottom: -11px;
}
.hovercard.top > .arrow:after {
content: " ";
bottom: 1px;
margin-left: -10px;
border-bottom-width: 0;
border-top-color: #ffffff;
}
.hovercard.right > .arrow {
top: 50%;
left: -11px;
margin-top: -11px;
border-left-width: 0;
border-right-color: #999999;
border-right-color: rgba(0, 0, 0, 0.25);
}
.hovercard.right > .arrow:after {
content: " ";
left: 1px;
bottom: -10px;
border-left-width: 0;
border-right-color: #ffffff;
}
.hovercard.bottom > .arrow {
left: 50%;
margin-left: -11px;
border-top-width: 0;
border-bottom-color: #999999;
border-bottom-color: rgba(0, 0, 0, 0.25);
top: -11px;
}
.hovercard.bottom > .arrow:after {
content: " ";
top: 1px;
margin-left: -10px;
border-top-width: 0;
border-bottom-color: #ffffff;
}
.hovercard.left > .arrow {
top: 50%;
right: -11px;
margin-top: -11px;
border-right-width: 0;
border-left-color: #999999;
border-left-color: rgba(0, 0, 0, 0.25);
}
.hovercard.left > .arrow:after {
content: " ";
right: 1px;
border-right-width: 0;
border-left-color: #ffffff;
bottom: -10px;
}
.right-aligned {
float: right !important;
}
.left-align {
float: left !important;
}
.hidden {
display: none !important;
visibility: hidden !important;
}
.hovercard h1,
.hovercard .h1,
.hovercard h2,
.hovercard .h2,
.hovercard h3,
.hovercard .h3 {
margin: 0;
padding: 0;
}
.hovercard h3 {
font-size: 24px;
}
.hovercard h4,
.hovercard .h4,
.hovercard h5,
.hovercard .h5,
.hovercard h6,
.hovercard .h6 {
margin: 0;
padding: 0;
}
.hovercard h4.text-center {
margin-top: 10px;
margin-bottom: 5px;
}
.hovercard sup {
top: 0;
}
.hovercard small,
.hovercard .small {
font-size: 85%;
}
.hovercard ul,
.hovercard ol {
margin: 0;
padding: 0;
margin-bottom: 0;
}
.hovercard a:hover,
.hovercard a:active,
.hovercard a:focus,
.hovercard a:visited {
text-decoration: none !important;
}
/* Basic hovercard */
.basic-content {
padding: 9px;
}
.image-wrapper {
background: #fff;
border: 2px #fff solid;
display: block;
overflow: hidden;
}
.image-wrapper > a,
.image-wrapper > span {
background-size: 100% !important;
}
.image-wrapper.medium > a,
.image-wrapper.medium > span {
content: " ";
display: block;
}
.image-wrapper.medium > a img {
height: 80px;
width: 80px;
margin-bottom: 0;
}
.hovercard {
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
/*max-width: 250px;*/
max-width: 400px;
width: 350px;
-webkit-box-shadow: 0 10px 100px rgba(0, 0, 0, 0.25);
-moz-box-shadow: 0 10px 100px rgba(0, 0, 0, 0.25);
box-shadow: 0 10px 100px rgba(0, 0, 0, 0.25);
border: 1px solid rgba(0, 0, 0, 0);
}
.hovercard a:hover {
text-decoration: none;
}
.hovercard.right > .arrow {
border-right-color: rgba(0, 0, 0, 0.05);
}
.hovercard.left > .arrow {
border-left-color: rgba(0, 0, 0, 0.05);
}
.hovercard.bottom > .arrow {
border-bottom-color: rgba(0, 0, 0, 0.05);
}
.hovercard.top > .arrow {
border-top-color: rgba(0, 0, 0, 0.05);
}
.advance-hovercard + .hovercard {
max-width: 445px;
}
.advance-hovercard + .hovercard .hovercard-content {
padding: 5px;
}
.basic-hovercard + .hovercard {
max-width: 445px;
}
.basic-hovercard + .hovercard .hovercard-content {
padding: 5px;
}
.hover-card-header {
width: 100%;
}
.hover-card-header h4 {
display: block;
}
.hover-card-header h4 a {
font-size: 18px;
font-weight: bold;
letter-spacing: 0.03rem;
}
.hover-card-details {
width: 100%;
}
.hover-card-pic {
margin-top: 0px;
display: block;
}
.hover-card-pic .image-wrapper {
margin-right: 0.75em;
float: left;
position: relative;
}
.hover-card-content {
list-style-type: none;
width: 100%;
display: block;
background: #fff;
padding: 0.3em 0 1em;
}
.hover-card-content .profile-details {
font-size: 13px;
}
.hover-card-content .profile-addr {
overflow: hidden;
display: block;
text-overflow: ellipsis;
}
.hovercard-content .hover-card-details .hover-card-content .profile-details > .profile-network a {
color: #777;
}
.hover-card-actions {
display: flex;
}
.hover-card-actions-connection {
margin-left: 10px;
}
.hovercard .hovercard-content .hover-card-actions a.btn {
display: inline-block;
}
.hover-card-footer {
background-color: #f7f7f7;
border-top: 1px solid #ebebeb;
padding: 0 10px;
}
.hovercard {
position: absolute;
top: 0;
left: 0;
z-index: 1040;
display: none;
max-width: 400px;
padding: 1px;
text-align: left;
background-color: #ffffff;
background-clip: padding-box;
border: 1px solid #cccccc;
border: 1px solid rgba(0, 0, 0, 0.2);
border-radius: 200px;
-webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
white-space: normal;
}
.hovercard.top {
margin-top: -10px;
}
.hovercard.right {
margin-left: 10px;
}
.hovercard.bottom {
margin-top: 10px;
}
.hovercard.left {
margin-left: -10px;
}
.hovercard-title {
margin: 0;
padding: 8px 14px;
font-size: 14px;
font-weight: normal;
line-height: 18px;
background-color: #f7f7f7;
border-bottom: 1px solid #ebebeb;
border-radius: 199px 199px 0 0;
display: none;
}
.hovercard-content {
padding: 0;
}
.hovercard > .arrow,
.hovercard > .arrow:after {
position: absolute;
display: block;
width: 0;
height: 0;
border-color: transparent;
border-style: solid;
}
.hovercard > .arrow {
border-width: 11px;
}
.hovercard > .arrow:after {
border-width: 10px;
content: "";
}
.hovercard.top > .arrow {
left: 50%;
margin-left: -11px;
border-bottom-width: 0;
border-top-color: #999999;
border-top-color: rgba(0, 0, 0, 0.25);
bottom: -11px;
}
.hovercard.top > .arrow:after {
content: " ";
bottom: 1px;
margin-left: -10px;
border-bottom-width: 0;
border-top-color: #ffffff;
}
.hovercard.right > .arrow {
top: 50%;
left: -11px;
margin-top: -11px;
border-left-width: 0;
border-right-color: #999999;
border-right-color: rgba(0, 0, 0, 0.25);
}
.hovercard.right > .arrow:after {
content: " ";
left: 1px;
bottom: -10px;
border-left-width: 0;
border-right-color: #ffffff;
}
.hovercard.bottom > .arrow {
left: 50%;
margin-left: -11px;
border-top-width: 0;
border-bottom-color: #999999;
border-bottom-color: rgba(0, 0, 0, 0.25);
top: -11px;
}
.hovercard.bottom > .arrow:after {
content: " ";
top: 1px;
margin-left: -10px;
border-top-width: 0;
border-bottom-color: #ffffff;
}
.hovercard.left > .arrow {
top: 50%;
right: -11px;
margin-top: -11px;
border-right-width: 0;
border-left-color: #999999;
border-left-color: rgba(0, 0, 0, 0.25);
}
.hovercard.left > .arrow:after {
content: " ";
right: 1px;
border-right-width: 0;
border-left-color: #ffffff;
bottom: -10px;
}
.right-aligned {
float: right !important;
}
.left-align {
float: left !important;
}
.hidden {
display: none !important;
visibility: hidden !important;
}
.hovercard h1,
.hovercard .h1,
.hovercard h2,
.hovercard .h2,
.hovercard h3,
.hovercard .h3 {
margin: 0;
padding: 0;
}
.hovercard h3 {
font-size: 24px;
}
.hovercard h4,
.hovercard .h4,
.hovercard h5,
.hovercard .h5,
.hovercard h6,
.hovercard .h6 {
margin: 0;
padding: 0;
}
.hovercard h4.text-center {
margin-top: 10px;
margin-bottom: 5px;
}
.hovercard sup {
top: 0;
}
.hovercard small,
.hovercard .small {
font-size: 85%;
}
.hovercard ul,
.hovercard ol {
margin: 0;
padding: 0;
margin-bottom: 0;
}
.hovercard a:hover,
.hovercard a:active,
.hovercard a:focus,
.hovercard a:visited {
text-decoration: none !important;
}
/* Basic hovercard */
.basic-content {
padding: 9px;
}
.image-wrapper {
display: block;
overflow: hidden;
}
.image-wrapper > a,
.image-wrapper > span {
background-size: 100% !important;
}
.image-wrapper.medium > a,
.image-wrapper.medium > span {
content: " ";
display: block;
}
.image-wrapper.medium > a img {
height: 80px;
width: 80px;
margin-bottom: 0;
}
.hovercard {
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
/*max-width: 250px;*/
max-width: 400px;
width: 350px;
-webkit-box-shadow: 0 10px 100px rgba(0, 0, 0, 0.25);
-moz-box-shadow: 0 10px 100px rgba(0, 0, 0, 0.25);
box-shadow: 0 10px 100px rgba(0, 0, 0, 0.25);
border: 1px solid rgba(0, 0, 0, 0);
}
.hovercard a:hover {
text-decoration: none;
}
.hovercard.right > .arrow {
border-right-color: rgba(0, 0, 0, 0.05);
}
.hovercard.left > .arrow {
border-left-color: rgba(0, 0, 0, 0.05);
}
.hovercard.bottom > .arrow {
border-bottom-color: rgba(0, 0, 0, 0.05);
}
.hovercard.top > .arrow {
border-top-color: rgba(0, 0, 0, 0.05);
}
.advance-hovercard + .hovercard {
max-width: 445px;
}
.advance-hovercard + .hovercard .hovercard-content {
padding: 5px;
}
.basic-hovercard + .hovercard {
max-width: 445px;
}
.basic-hovercard + .hovercard .hovercard-content {
padding: 5px;
}
.hover-card-header {
width: 100%;
}
.hover-card-header h4 {
display: block;
}
.hover-card-header h4 a {
font-size: 18px;
font-weight: bold;
letter-spacing: 0.03rem;
}
.hover-card-details {
width: 100%;
}
.hover-card-pic {
margin-top: 0px;
display: block;
}
.hover-card-pic .image-wrapper {
margin-right: 0.75em;
float: left;
position: relative;
}
.hover-card-content {
list-style-type: none;
width: 100%;
display: block;
padding: 0.3em 0 1em;
}
.hover-card-content .profile-details {
font-size: 13px;
}
.hover-card-content .profile-addr {
overflow: hidden;
display: block;
text-overflow: ellipsis;
}
.hover-card-actions {
display: flex;
}
.hover-card-actions-connection {
margin-left: 10px;
}
.hovercard .hovercard-content .hover-card-actions a.btn {
display: inline-block;
}
.hover-card-footer {
background-color: #f7f7f7;
border-top: 1px solid #ebebeb;
padding: 0 10px;
}
-118
View File
@@ -1,118 +0,0 @@
/**
* @file view/theme/frio/css/mod_event.css
*/
/**
* The different views of js fullcalendar
*/
#fc-header {
margin-top: 20px;
margin-bottom: 10px;
}
#fc-header-left,
#fc-header-right,
#event-calendar-title {
display: inline-block;
}
#fc-title {
margin: 0;
padding-left: 20px;
}
#fc-header-right {
margin-top: -4px;
}
#fc-header-right .dropdown > button {
color: inherit;
}
#event-calendar-title {
vertical-align: middle;
}
#event-calendar-views {
padding: 6px 9px;
font-size: 14px
}
.fc .fc-toolbar {
display: none;
}
.fc .fc-month-view td.fc-widget-content,
.fc .fc-list-view,
.fc .fc-list-view .fc-list-table td,
.fc .fc-body td {
border-style: none;
}
.fc td.fc-widget-header,
.fc th.fc-widget-header {
border-left: none;
border-right: none;
border-top: none;
}
.fc .fc-month-view td.fc-day {
border-left: none;
border-right: none;
border-bottom: 1px solid;
padding: 0 6px;
}
.fc .fc-day-grid-container .fc-row {
border-bottom: 1px solid;
border-color: #ddd;
}
.fc .fc-day-grid-event .fc-content {
/*white-space: normal;*/
}
.fc tr td.fc-today {
border-style: none;
}
.fc .fc-month-view .fc-content .fc-title .item-desc {
font-size: 11px;
}
.fc .fc-view-container {
margin-top: 25px;
}
.fc .fc-list-view td {
padding: 0;
}
#events-calendar.fc-ltr .fc-basic-view .fc-day-top .fc-day-number {
float: left;
font-size: 12px;
}
.fc .fc-event {
background-color: transparent;
background-color: #E3F2FD;
border: 1px solid #BBDEFB;
color: #555;
}
.fc .fc-month-view .fc-time,
.fc .fc-listMonth-view .fc-list-item-time,
.fc .fc-listMonth-view .fc-list-item-marker,
.fc .fc-listMonth-view .fc-widget-header {
display: none;
}
.fc .fc-listMonth-view .fc-list-item:hover td {
background: transparent;
cursor: pointer;
}
.fc .fc-listMonth-view .seperator {
margin-left: 30px;
width: 60px;
}
/**
* The event-card
*/
.event-card {
width: auto;
}
.event-card .event-label,
.event-card .location-label {
font-weight: bold;
}
.popover.event-card .event-card-basic-content {
margin-top: 0;
padding: 9px;
padding-left: 0px;
}
.event-card .event-hover-location .location {
color: #777;
font-size: 13px;
}
+206 -276
View File
@@ -1,27 +1,8 @@
/*
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
*/
/*
Created on : 17.02.2016, 23:55:45
Author : rabuzarus
*/
/* Imports */
/*@import url("frameworks/bootstrap/css/bootstrap.min.css");
@import url("frameworks/bootstrap/css/bootstrap-theme.min.css");
@import url("frameworks/font-awesome/css/font-awesome.min.css");
@import url("frameworks/jasny/css/jasny-bootstrap.min.css");
@import url("frameworks/bootstrap-select/css/bootstrap-select.min.css");
@import url("frameworks/awesome-bootstrap-checkbox/awesome-bootstrap-checkbox.css");
@import url("frameworks/ekko-lightbox/ekko-lightbox.min.css");
@import url("frameworks/justifiedGallery/justifiedGallery.min.css");
@import url("frameworks/bootstrap-colorpicker/css/bootstrap-colorpicker.min.css");
@import url("font/open_sans/open-sans.css");
@import url("css/hovercard.css");*/
body {
padding-top: 110px;
background-color: $background_color;
@@ -29,8 +10,7 @@ body {
background-size: $background_size_img;
background-repeat: $background_repeat;
background-attachment: fixed;
color: #777;
/*color: #555;*/
color: $font_color;
font-family: 'Open Sans',sans-serif;
}
body.minimal {
@@ -38,8 +18,6 @@ body.minimal {
}
body a {
/*color: #555;*/
/*color: #6fdbe8;*/
color: $link_color;
text-decoration: none;
}
@@ -203,7 +181,7 @@ blockquote {
.btn-default {
background: #ededed;
color: #7a7a7a;
color: $font_color;
}
.btn-sm {
padding: 4px 8px;
@@ -289,7 +267,6 @@ blockquote {
}
.form-control-sm, .input-group-sm>.form-control, .input-group-sm>.input-group-addon, .input-group-sm>.input-group-btn>.btn {
padding: .275rem .75rem;
/*font-size: .875rem;*/
line-height: 1.5;
height: 30px;
border-radius: .2rem;
@@ -418,7 +395,6 @@ header #banner #logo-img,
}
.topbar .dropdown-header .dropdown-header-link a,
.topbar .dropdown-header .dropdown-header-link .btn-link {
/*color: #6fdbe8!important;*/
color: $link_color !important;
font-size: 12px;
font-weight: 400
@@ -440,12 +416,15 @@ nav.navbar .nav > li > button
{
color: $nav_icon_color;
}
#topbar-first .nav > .open > a,
#topbar-first .nav > .open > button
{
background-color: $nav_bg;
}
#topbar-first .nav > li > a:hover,
#topbar-first .nav > li > a:focus,
#topbar-first .nav > li > button:hover,
#topbar-first .nav > li > button:focus,
#topbar-first .nav > .open > a,
#topbar-first .nav > .open > button,
#topbar-first .nav > li > button:not(#main-menu):hover,
#topbar-first .nav > li > button:not(#main-menu):focus,
nav.navbar .nav > li > a:hover,
nav.navbar .nav > li > a:focus
nav.navbar .nav > li > button:hover,
@@ -596,11 +575,11 @@ nav.navbar .nav > li > button:focus
max-height: 400px;
}
#topbar-first #nav-notifications-menu a {
color: #555;
color: $font_color_darker;
padding: 0;
}
#topbar-first #nav-notifications-menu li.notif-entry {
color: #555;
color: $font_color_darker;
padding: 10px;
border-bottom: 1px solid #eee;
position: relative;
@@ -614,23 +593,11 @@ nav.navbar .nav > li > button:focus
}
#topbar-first #nav-notifications-menu li.notif-entry:hover {
background-color: #f7f7f7;
/*border-left: 3px solid #6fdbe8;*/
border-left: 3px solid $link_color;
}
/*#topbar-first #nav-notifications-menu i.accepted {
color: #6fdbe8!important
}
#topbar-first #nav-notifications-menu i.declined {
color: #ff8989!important
}*/
#topbar-first #nav-notifications-menu li.placeholder {
border-bottom: none
}
#topbar-first #nav-notifications-menu .media .media-body {
font-size: 13px!important;
font-weight: 600!important;
cursor: pointer;
}
#topbar-first #nav-notifications-menu .media .media-body .contactname {
font-weight: bold;
}
@@ -664,14 +631,6 @@ nav.navbar .nav > li > button:focus
#myNavmenu li.nav-sitename {
font-weight: bold;
}
#topbar-first .dropdown.account > a,
#topbar-first .dropdown.account.open > a,
#topbar-first .dropdown.account > button,
#topbar-first .dropdown.account.open > button,
#topbar-first .dropdown.account > :hover,
#topbar-first .dropdown.account.open > :hover {
background-color: $nav_bg;
}
#topbar-first .dropdown.account li#nav-sitename {
padding-left: 15px;
padding-right: 15px;
@@ -710,7 +669,7 @@ nav.navbar .nav > li > button:focus
-webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, .1);
-moz-box-shadow: 0 1px 10px rgba(0, 0, 0, .1);
box-shadow: 0 1px 10px rgba(0, 0, 0, .1);
border-bottom: 1px solid #d4d4d4
border-bottom: 1px solid #d4d4d4;
}
#topbar-second > .container {
height: 100%;
@@ -757,64 +716,6 @@ nav.navbar .nav > li > button:focus
display: none;
cursor: pointer
}
#topbar-second .nav>li>a {
padding: 6px 13px 0;
text-decoration: none;
text-shadow: none;
font-weight: 600;
font-size: 10px;
text-transform: uppercase;
text-align: center;
min-height: 49px
}
#topbar-second .nav>li>a:hover,
#topbar-second .nav>li>a:active,
#topbar-second .nav>li>a:focus {
/*border-bottom: 3px solid #6fdbe8;*/
border-bottom: 3px solid $link_color;
background-color: #f7f7f7;
color: #555;
text-decoration: none
}
#topbar-second .nav>li>a i {
font-size: 14px
}
#topbar-second .nav>li>a .caret {
border-top-color: #7a7a7a
}
#topbar-second .nav>li>ul>li>a {
border-left: 3px solid #fff;
background-color: #fff;
color: #555
}
#topbar-second .nav>li>ul>li>a:hover,
#topbar-second .nav>li>ul>li>a.active {
/*border-left: 3px solid #6fdbe8;*/
border-left: 3px solid $link_color;
background-color: #f7f7f7;
color: #555
}
#topbar-second .nav>li.active>a {
min-height: 46px
}
#topbar-second .nav>li>a#space-menu {
padding-right: 13px;
border-right: 1px solid #ededed
}
#topbar-second .nav>li>a#search-menu {
padding-top: 15px
}
#topbar-second .nav>li>a:hover,
#topbar-second .nav .open>a,
#topbar-second .nav>li.active {
/*border-bottom: 3px solid #6fdbe8;*/
border-left: 3px solid $link_color;
background-color: #f7f7f7;
color: #555
}
#topbar-second .nav>li.active>a:hover {
border-bottom: none
}
#topbar-second #space-menu-dropdown li>ul>li>a>.media .media-body p {
color: #bebebe;
font-size: 11px;
@@ -864,10 +765,10 @@ nav.navbar .nav > li > button:focus
border-bottom: none;
margin: 9px 1px!important
}
.nav-pills .dropdown-menu li,
.nav-tabs .dropdown-menu li,
.account .dropdown-menu li,
.contact-photo-wrapper .dropdown-menu li {
.nav-pills .dropdown-menu li > a,
.nav-tabs .dropdown-menu li > a,
.account .dropdown-menu li > a,
.contact-photo-wrapper .dropdown-menu li > a {
border-left: 3px solid $nav_bg;
}
.nav-pills .dropdown-menu li a, .nav-pills .dropdown-menu li .btn-link,
@@ -891,39 +792,20 @@ nav.navbar .nav > li > button:focus
display: inline-block;
width: 14px
}
.nav-pills .dropdown-menu li a:hover, .nav-pills .dropdown-menu li .btn-link:hover,
.nav-tabs .dropdown-menu li a:hover, .nav-tabs .dropdown-menu li .btn-link:hover,
.account .dropdown-menu li a:hover, .account .dropdown-menu li .btn-link:hover,
.contact-photo-wrapper .dropdown-menu li a:hover, .contact-photo-wrapper .dropdown-menu li .btn-link:hover,
.nav-pills .dropdown-menu li a:visited, .nav-pills .dropdown-menu li .btn-link:visited,
.nav-tabs .dropdown-menu li a:visited, .nav-tabs .dropdown-menu li .btn-link:visited,
.account .dropdown-menu li a:visited, .account .dropdown-menu li .btn-link:visited,
.contact-photo-wrapper .dropdown-menu li a:visited, .contact-photo-wrapper .dropdown-menu li .btn-link:visited,
.nav-pills .dropdown-menu li a:hover, .nav-pills .dropdown-menu li .btn-link:hover,
.nav-tabs .dropdown-menu li a:hover, .nav-tabs .dropdown-menu li .btn-link:hover,
.account .dropdown-menu li a:hover, .account .dropdown-menu li .btn-link:hover,
.contact-photo-wrapper .dropdown-menu li a:hover, .contact-photo-wrapper .dropdown-menu li .btn-link:hover,
.nav-pills .dropdown-menu li a:focus, .nav-pills .dropdown-menu li .btn-link:focus,
.nav-tabs .dropdown-menu li a:focus, .nav-tabs .dropdown-menu li .btn-link:focus,
.account .dropdown-menu li a:focus, .account .dropdown-menu li .btn-link:focus,
.contact-photo-wrapper .dropdown-menu li a:focus, .contact-photo-wrapper .dropdown-menu li .btn-link:focus {
background: 0 0
}
.nav-pills .dropdown-menu li:hover,
.nav-tabs .dropdown-menu li:hover,
.account .dropdown-menu li:hover,
.contact-photo-wrapper .dropdown-menu li:hover,
.nav-pills .dropdown-menu li.selected,
.nav-tabs .dropdown-menu li.selected,
.account .dropdown-menu li.selected,
.contact-photo-wrapper .dropdown-menu li.selected {
/*border-left: 3px solid #6fdbe8;*/
.nav-pills .dropdown-menu li > a:hover,
.nav-tabs .dropdown-menu li > a:hover,
.account .dropdown-menu li > a:hover,
.contact-photo-wrapper .dropdown-menu li > a:hover,
.nav-pills .dropdown-menu li.selected a,
.nav-tabs .dropdown-menu li.selected a,
.account .dropdown-menu li.selected a,
.contact-photo-wrapper .dropdown-menu li.selected a {
border-left: 3px solid $link_color;
color: #fff!important;
background-color: $menu_background_hover_color !important;
color: #fff;
background: $menu_background_hover_color;
}
#photo-edit-link-wrap {
color: #555;
color: $font_color_darker;
margin-bottom: 15px;
}
@@ -940,9 +822,8 @@ nav.navbar .nav > li > button:focus
aside .widget,
.nav-container .widget {
border: none;
color: #777;
/*background-color: #fff;*/
background-color: rgba(255,255,255,$contentbg_transp);
color: $font_color;
background-color: rgba(255, 255, 255, $contentbg_transp);
box-shadow: 0 0 3px #dadada;
-webkit-box-shadow: 0 0 3px #dadada;
-moz-box-shadow: 0 0 3px #dadada;
@@ -968,7 +849,6 @@ aside .widget ul,
margin-bottom: 0px;
margin-left: -10px;
margin-right: -10px;
/*padding-left: 10px;*/
list-style: none;
}
@@ -983,16 +863,14 @@ aside .widget li:hover,
aside .widget li.selected,
.nav-container .widget li:hover {
z-index: 2;
color: #555;
/*background-color: #f7f7f7;*/
color: $font_color_darker;
background-color: rgba(247, 247, 247, $contentbg_transp);
/*border-left: 3px solid #6fdbe8!important;*/
border-left: 3px solid $link_color !important;
padding-left: 17px;
}
aside .widget li a,
aside .widget li a:hover {
color: #555;
color: $font_color_darker;
}
/* forumlist widget */
@@ -1166,12 +1044,12 @@ aside .vcard #wallmessage-link {
font-weight: bold;
}
#nav-short-info .contact-wrapper .media-heading a {
color: #555;
color: $font_color_darker;
font-size: 14px !important;
}
#vcard-short-desc > .vcard-short-addr,
#nav-short-info .contact-wrapper #contact-entry-url-network {
color: #777;
color: $font_color;
font-size: 12px;
}
.network-content-wrapper > #viewcontact_wrapper-network,
@@ -1207,16 +1085,16 @@ div#sidebar-group-list {
}
.group-edit-tool {
color: #555;
color: $font_color_darker;
}
.faded-icon {
color: #555;
color: $font_color_darker;
opacity: 0.3;
transition: all 0.1s ease-in-out;
}
.faded-icon:hover {
color: #555;
color: $font_color_darker;
opacity: 1;
}
.icon-padding {
@@ -1253,8 +1131,6 @@ aside #group-sidebar li .group-edit-tool:first-child {
.contact-block-div {
float: left;
margin: 0px 5px 5px 0px;
/* height: 90px;
width: 90px;*/
}
.contact-block-link {
@@ -1285,9 +1161,6 @@ section #jotOpen {
#jot-content {
display: none;
}
.jothidden {
/*display: none;*/
}
.modal #jot-sections {
max-height: calc(100vh - 22px);
}
@@ -1306,14 +1179,13 @@ section #jotOpen {
#jot-modal #item-Q0,
#jot-modal #profile-jot-acl-wrapper,
#jot-modal #acl-wrapper {
overflow: hidden;
display: flex;
flex: auto;
flex-direction: column;
}
#jot-modal .modal-header a, #jot-modal .modal-header .btn-link,
#profile-jot-submit-wrapper a, #profile-jot-submit-wrapper .btn-link {
color: #555;
color: $font_color_darker;
text-transform: capitalize;
}
#jot-modal .modal-header {
@@ -1334,9 +1206,6 @@ section #jotOpen {
overflow-y: auto !important;
overflow-y: overlay !important;
}
/*#jot-attachment-preview {
display: none;
}*/
#jot-text-wrap .preview textarea {
width: 100%;
}
@@ -1350,7 +1219,7 @@ section #jotOpen {
box-shadow: none;
border-radius: 0 0 4px 4px;
background: #fff;
color: #555;
color: $font_color_darker;
}
textarea#profile-jot-text:focus + #preview_profile-jot-text,
textarea.comment-edit-text:focus + .comment-edit-form .preview {
@@ -1432,7 +1301,7 @@ textarea.comment-edit-text:focus + .comment-edit-form .preview {
padding: 0;
}
.fbrowser .breadcrumb > li:last-of-type a{
color: #777;
color: $font_color;
pointer-events: none;
cursor: default;
}
@@ -1462,14 +1331,14 @@ textarea.comment-edit-text:focus + .comment-edit-form .preview {
}
.fbrowser .folders li:hover {
z-index: 2;
color: #555;
color: $font_color_darker;
background-color: rgba(247, 247, 247, $contentbg_transp);
border-left: 3px solid $link_color !important;
border-left: 3px solid $link_color;
padding-left: 17px;
}
.fbrowser .folders li a,
.fbrowser .folders li a:hover {
color: #555;
color: $font_color_darker;
font-size: 13px;
}
.fbrowser .folders + .list {
@@ -1506,7 +1375,6 @@ textarea.comment-edit-text:focus + .comment-edit-form .preview {
*/
.panel {
border: none;
/*background-color: #fff;*/
background-color: rgba(255,255,255,$contentbg_transp);
box-shadow: 0 0 3px #dadada;
-webkit-box-shadow: 0 0 3px #dadada;
@@ -1523,9 +1391,6 @@ textarea.comment-edit-text:focus + .comment-edit-form .preview {
.panel .panel-body {
word-wrap: break-word;
}
.panel .panel-body .wall-item-content {
color: #555;
}
.tread-wrapper .media {
overflow: visible;
word-wrap: break-word;
@@ -1536,11 +1401,11 @@ aside .panel-body {
/* Thread hover effects */
.desktop-view .wall-item-container .wall-item-content a,
.desktop-view .wall-item-container a,
.desktop-view .wall-item-name,
.desktop-view .wall-item-container .fakelink,
.desktop-view .toplevel_item .fakelink,
.desktop-view .toplevel_item .wall-item-container .wall-item-responses a {
color: #555;
color: $font_color;
-webkit-transition: all 0.25s ease-in-out;
-moz-transition: all 0.25s ease-in-out;
-o-transition: all 0.25s ease-in-out;
@@ -1555,7 +1420,6 @@ aside .panel-body {
.wall-item-container:hover .wall-item-content a,
.wall-item-container:hover .wall-item-name,
.wall-item-container:hover .wall-item-location a {
/*color: #6fdbe8;*/
color: $link_color;
-webkit-transition: all 0.25s ease-in-out;
-moz-transition: all 0.25s ease-in-out;
@@ -1655,7 +1519,7 @@ aside .panel-body {
.media .media-body h4.media-heading {
font-size: 14px;
font-weight: 500;
color: #555;
color: $font_color_darker;
}
.media .media-body .addional-info a, .media .media-body h5.media-heading > a {
display: block;
@@ -1738,11 +1602,11 @@ aside .panel-body {
border-radius: 3px;
}
.wall-item-body .body-attach > a {
color: #555;
color: $font_color_darker;
display: inline-block;
}
.wall-item-body .body-attach > a div {
color: #555;
color: $font_color_darker;
width: 20px;
}
@@ -1832,7 +1696,7 @@ code > .hl-main {
}
.wall-item-tags a {
color: #555;
color: $font_color_darker;
}
.wall-item-tags a:hover {
@@ -1855,7 +1719,7 @@ code > .hl-main {
}
.wall-item-actions a, .wall-item-actions button {
font-size: 13px;
color: #555;
color: $font_color_darker;
}
.wall-item-actions .active {
font-weight: bold;
@@ -1878,7 +1742,7 @@ code > .hl-main {
text-transform: capitalize;
}
.wall-item-actions button:hover {
color: #555;
color: $font_color_darker;
text-decoration: underline;
}
.wall-item-actions .separator {
@@ -1923,7 +1787,6 @@ code > .hl-main {
wall-item-comment-wrapper.well {
border: none;
box-shadow: none;
/*background-color: #ededed;*/
background-color: rgba(237, 237, 237, $contentbg_transp);
background-image: none;
margin-bottom: 1px;
@@ -1967,7 +1830,8 @@ wall-item-comment-wrapper.well hr {
padding: 10px;
border-top: 1px solid rgba(255, 255, 255, 0.8);
background-color: rgba(0, 0, 0, 0.03);
border-radius: 0 0 10px 10px;
border-radius: 0 0 4px 4px;
margin-bottom: 0;
}
.comment-fake-form {
@@ -1996,7 +1860,6 @@ wall-item-comment-wrapper.well hr {
/* acpopup + textcompletion*/
.acpopup {
/* max-height: 150px; */
background-color: #ffffff;
border-radius: 4px;
overflow: auto;
@@ -2004,13 +1867,12 @@ wall-item-comment-wrapper.well hr {
box-shadow: 0 6px 12px rgba(0,0,0,.175);
}
nav .acpopup {
/*top: 35px !important;*/
margin-left: -23px;
}
/** @todo: we schould consider the possebility to overwrite bootstrap dropdowns
at the beginning of this file to get rid of the !important */
.textcomplete-item > a {
color: #555 !important;
color: $font_color_darker !important;
padding: 5px 20px !important;
}
.textcomplete-item.active > a {
@@ -2028,27 +1890,6 @@ img.acpopup-img {
/* The wall-item thread levels */
/*.wall-item-container.thread_level_3 {
margin-left: 80px;
width: calc(100% - 90px);
}
.wall-item-container.thread_level_4 {
margin-left: 95px;
width: calc(100% - 105px);
}
.wall-item-container.thread_level_5 {
margin-left: 110px;
width: calc(100% - 120px);
}
.wall-item-container.thread_level_6 {
margin-left: 125px;
width: calc(100% - 135px);
}
.wall-item-container.thread_level_7 {
margin-left: 140px;
width: calc(100% - 150px);
}*/
.wall-item-container.thread_level_3,
.wall-item-container.thread_level_4,
.wall-item-container.thread_level_5,
@@ -2081,7 +1922,6 @@ moved it to the nav through js */
.tabbar,
.tabbar > li {
height: 100%;
/*margin-left: -15px;*/
padding: 0;
}
#tabmenu .search-heading {
@@ -2100,20 +1940,14 @@ ul.tabs li {
float: left;
margin: 0;
padding: 0;
/*border-bottom: 0 solid #6fdbe8;*/
border-bottom: 0 solid $link_color;
font-size: 13px;
height: 102%;
transition: all .15s ease;
}
/*ul.tabs.visible-xs > li.active {
min-width: 150px; This is a workaround to make the topbar-second dropdown better visible on mobile. We need something better here
}*/
ul.tabs li a {
margin-left: 10px;
margin-right: 10px;
/*color: #6fdbe8;*/
color: $link_color !important;
}
ul.tabs li:hover, ul.tabs li.active {
border-bottom-width: 4px;
@@ -2158,13 +1992,12 @@ ul.dropdown-menu li:hover {
.media .location,
.media .location a {
font-size: 11px;
color: #bebebe;
color: $font_color_darker;
}
.media-list > li {
padding: 10px;
border-bottom: 1px solid rgba(238, 238, 238, $contentbg_transp);
position: relative;
/* border-left: 3px solid rgba(255,255,255,$contentbg_transp);*/
border-left: 3px solid rgba(255,255,255,0);
font-size: 12px;
}
@@ -2177,7 +2010,6 @@ ul.dropdown-menu li:hover {
/* Forms */
.form-control {
border: 2px solid #ededed;
box-shadow: none;
}
.form-control:focus {
@@ -2185,11 +2017,31 @@ ul.dropdown-menu li:hover {
box-shadow: none;
}
.radio label::before,
.checkbox label::before {
background-color: $background_color;
}
.radio label::after {
background-color: $link_color;
}
.checkbox label::after {
color: $link_color;
}
.checkbox input[type="checkbox"]:focus + label::before,
.radio input[type="radio"]:focus + label::before {
outline-color: $link_hover_color;
}
.help-block {
color: $font_color_darker;
}
input[type=range].form-control {
padding-left: 0;
padding-right: 0;
}
/* Search form */
.form-control.form-search {
border-radius: 30px;
@@ -2232,12 +2084,10 @@ ul.dropdown-menu li:hover {
padding-bottom: 20px;
margin-bottom: 20px;
border: none;
/*background-color: #fff;*/
background-color: rgba(255,255,255,$contentbg_transp);
border-radius: 4px;
position: relative;
/*overflow: hidden;*/
color: #555;
color: $font_color_darker;
box-shadow: 0 0 3px #dadada;
-webkit-box-shadow: 0 0 3px #dadada;
-moz-box-shadow: 0 0 3px #dadada;
@@ -2262,12 +2112,10 @@ section > .generic-page-wrapper, .videos-content-wrapper,
padding-bottom: 20px;
margin-bottom: 20px;
border: none;
/*background-color: #fff;*/
background-color: rgba(255,255,255,$contentbg_transp);
border-radius: 4px;
position: relative;
/*overflow: hidden;*/
color: #555;
color: $font_color_darker;
box-shadow: 0 0 3px #dadada;
-webkit-box-shadow: 0 0 3px #dadada;
-moz-box-shadow: 0 0 3px #dadada;
@@ -2312,12 +2160,6 @@ ul.viewcontact_wrapper {
ul.viewcontact_wrapper > li {
padding-left: 15px;
}
.contact-wrapper {
/* padding: 10px;
border-bottom: 1px solid rgba(238, 238, 238, $contentbg_transp);;
position: relative;*/
/*border-left: 3px solid white;*/
}
.contact-wrapper .contact-photo-wrapper button {
padding: 0;
}
@@ -2356,7 +2198,7 @@ ul.viewcontact_wrapper > li {
}
.contact-entry-desc {
color: #555;
color: $font_color_darker;
}
.contact-entry-checkbox {
margin-top: -20px;
@@ -2373,7 +2215,7 @@ ul.viewcontact_wrapper > li {
.contact-wrapper .contact-action-link:hover,
.textcomplete-item .contact-wrapper .contact-action-link {
padding: 0 5px;
color: #555;
color: $font_color_darker;
border: 0;
}
.contact-wrapper .contact-action-link {
@@ -2406,20 +2248,11 @@ ul li:hover .contact-wrapper .contact-action-link:hover {
}
#contact-edit-status-wrapper {
border: none;
background-color: #E1F5FE;
background-color: rgba(225, 245, 254, $contentbg_transp);
margin: 15px -15px;
}
#contact-edit-tools {
margin-left: -15px;
margin-right: -15px;
}
#contact-edit-tools > .panel {
padding-left: 15px;
padding-right: 15px;
}
#contact-edit-settings {
display: block;
margin: 0;
}
/* directory page */
@@ -2504,14 +2337,9 @@ ul li:hover .contact-wrapper .contact-action-link:hover {
overflow-y: auto;
max-height: calc(100vh - 400px);
max-height: auto;
/*height: 500px;*/
margin-bottom: 0px;
padding: 0 15px;
}
#mail-conversation.can-reply {
/* border-bottom-left-radius: 0px;
border-bottom-right-radius: 0px;*/
}
.mail-conv-wrapper .media .contact-photo-wrapper img {
height: 48px;
width: 48px;
@@ -2524,10 +2352,6 @@ ul li:hover .contact-wrapper .contact-action-link:hover {
display:none;
}
.mail-thread #prvmail-message-label textarea {
/* border-top: none;
margin-top: -10px;
border-top-left-radius: 0px;
border-top-right-radius: 0px;*/
max-height: 120px;
}
.mail-conv-wrapper {
@@ -2538,7 +2362,6 @@ ul li:hover .contact-wrapper .contact-action-link:hover {
height: calc(100vh - 150px);
}
#message-preview {
/*padding: 0 10px;*/
height: calc(100% - 20px);
}
#message-preview ul {
@@ -2595,9 +2418,6 @@ ul li:hover .contact-wrapper .contact-action-link:hover {
color: $link_hover_color;
text-decoration: none;
}
/*.event-date-wrapper.medium .event-hover-short-month {
color: $link_color;
}*/
.event-wrapper .event-owner {
margin-bottom: 15px;
}
@@ -2625,7 +2445,7 @@ ul li:hover .contact-wrapper .contact-action-link:hover {
padding-top: 15px;
}
#event-nav a {
color: #555;
color: $font_color_darker;
}
#event-edit-form-wrapper #event-edit-time {
padding: 10px 0;
@@ -2682,7 +2502,7 @@ ul li:hover .contact-wrapper .contact-action-link:hover {
width: 100%;
padding: 0 5px 0 15px;
box-shadow: 1.5px 0 0 0 rgba(0, 0, 0, .1) inset;
color: #777;
color: $font_color;
position: relative;
}
.event-card .event-card-content .event-map-btn {
@@ -2693,7 +2513,7 @@ ul li:hover .contact-wrapper .contact-action-link:hover {
}
.event-card .event-card-title {
font-size: 14px;
color: #555;
color: $font_color_darker;
line-height: 15px;
font-weight: bold;
margin: 0;
@@ -2738,7 +2558,6 @@ ul li:hover .contact-wrapper .contact-action-link:hover {
top: 50%;
transform: translateZ(0);
transition: opacity .2s;
/*width: 27px;*/
width: 100px;
z-index: 11;
font-size: 64px;
@@ -2774,7 +2593,7 @@ ul li:hover .contact-wrapper .contact-action-link:hover {
position: relative;
}
.photo-comment-wrapper .wall-item-content {
color: #555;
color: $font_color_darker;
font-size: 13px;
}
.photo-comment-wrapper .comment-wwedit-wrapper,
@@ -2841,8 +2660,7 @@ details.profile-jot-net[open] summary:before {
/* Emulates Bootstrap display */
.settings-block {
margin: 0 0 5px;
color: #333;
background-color: rgba(255,255,255,0.95);
background-color: rgba(255, 255, 255, $contentbg_transp);
border-radius: 4px;
padding: 10px 15px;
box-shadow: 0 0 3px #dadada;
@@ -2927,7 +2745,7 @@ ul.notif-network-list > li {
.intro-wrapper button.intro-action-link:hover {
padding-right: 5px;
padding-left: 5px;
color: #555;
color: $font_color_darker;
}
ul li:hover .intro-wrapper button.intro-action-link {
opacity: 0.8;
@@ -2938,13 +2756,11 @@ ul li:hover .intro-wrapper button.intro-action-link:hover {
}
.intro-action-buttons {
margin-top: 15px;
/*display: none;*/
max-height: 0px;
overflow: hidden;
transition: max-height 0.1s ease-out;
}
ul.notif-network-list > li:hover .intro-action-buttons {
/*display: block;*/
max-height: 30px;
transition: max-height 0.1s ease-in;
}
@@ -2976,7 +2792,7 @@ ul.notif-network-list li.unseen {
.notif-item .notif-desc-wrapper a {
height: 100%;
display: block;
color: #555;
color: $font_color_darker;
font-size: 13px;
font-weight: 600;
}
@@ -2994,12 +2810,10 @@ little modifications to emulate a standard page template */
margin: 0;
margin-bottom: 20px;
border: none;
/*background-color: #fff;*/
background-color: rgba(255,255,255,$contentbg_transp);
border-radius: 4px;
position: relative;
/*overflow: hidden;*/
color: #555;
color: $font_color_darker;
box-shadow: 0 0 3px #dadada;
-webkit-box-shadow: 0 0 3px #dadada;
-moz-box-shadow: 0 0 3px #dadada;
@@ -3073,7 +2887,7 @@ section.help-content-wrapper li {
margin-top: 2px;
border: 1px solid #cccccc;
border-radius: 3px;
background-color: #fff;
background-color: $background_color;
-webkit-transition: border 0.15s ease-in-out, color 0.15s ease-in-out;
-o-transition: border 0.15s ease-in-out, color 0.15s ease-in-out;
transition: border 0.15s ease-in-out, color 0.15s ease-in-out;
@@ -3092,14 +2906,14 @@ section.help-content-wrapper li {
padding-left: 3px;
padding-top: 1px;
font-size: 11px;
color: #555555;
color: $link_color;
}
#adminpage .addon .desc {
padding-left: 10px;
}
.adminpage .admin-settings-action-link,
.adminpage .admin-settings-action-link:hover {
color: #555;
color: $font_color_darker;
}
.adminpage .admin-settings-action-link:hover {
opacity: 1;
@@ -3272,6 +3086,11 @@ body .tread-wrapper .hovercard:hover .hover-card-content a {
display: none;
}
.pagination li > a,
.pager li > a {
background-color: rgba(255, 255, 255, $contentbg_transp);
}
/*
* some temporary workarounds until this will solved
* elsewhere (e.g. new templates)
@@ -3388,6 +3207,117 @@ section .profile-match-wrapper {
margin-top: 15px !important;
}
/**
* The different views of js fullcalendar
*/
#fc-header {
margin-top: 20px;
margin-bottom: 10px;
}
#fc-header-left,
#fc-header-right,
#event-calendar-title {
display: inline-block;
}
#fc-title {
margin: 0;
padding-left: 20px;
}
#fc-header-right {
margin-top: -4px;
}
#fc-header-right .dropdown > button {
color: inherit;
}
#event-calendar-title {
vertical-align: middle;
}
#event-calendar-views {
padding: 6px 9px;
font-size: 14px
}
.fc .fc-toolbar {
display: none;
}
.fc .fc-month-view td.fc-widget-content,
.fc .fc-list-view,
.fc .fc-list-view .fc-list-table td,
.fc .fc-body td {
border-style: none;
}
.fc td.fc-widget-header,
.fc th.fc-widget-header {
border-left: none;
border-right: none;
border-top: none;
}
.fc .fc-month-view td.fc-day {
border-left: none;
border-right: none;
border-bottom: 1px solid;
padding: 0 6px;
}
.fc .fc-day-grid-container .fc-row {
border-bottom: 1px solid;
border-color: #ddd;
}
.fc tr td.fc-today {
border-style: none;
}
.fc .fc-month-view .fc-content .fc-title .item-desc {
font-size: 11px;
}
.fc .fc-view-container {
margin-top: 25px;
}
.fc .fc-list-view td {
padding: 0;
}
#events-calendar.fc-ltr .fc-basic-view .fc-day-top .fc-day-number {
float: left;
font-size: 12px;
}
.fc .fc-event {
background-color: #E3F2FD;
border: 1px solid #BBDEFB;
color: $font_color_darker;
}
.fc .fc-month-view .fc-time,
.fc .fc-listMonth-view .fc-list-item-time,
.fc .fc-listMonth-view .fc-list-item-marker,
.fc .fc-listMonth-view .fc-widget-header {
display: none;
}
.fc .fc-listMonth-view .fc-list-item:hover td {
background: transparent;
cursor: pointer;
}
.fc .fc-listMonth-view .seperator {
margin-left: 30px;
width: 60px;
}
/**
* The event-card
*/
.event-card {
width: auto;
}
.event-card .event-label,
.event-card .location-label {
font-weight: bold;
}
.popover.event-card .event-card-basic-content {
margin-top: 0;
padding: 9px;
padding-left: 0px;
}
.event-card .event-hover-location .location {
color: $font_color;
font-size: 13px;
}
/* Medium devices (desktops, 992px and up) */
@media (min-width: 992px) {
.mod-home.is-not-singleuser #content,
+1 -1
View File
@@ -702,7 +702,7 @@ function scrollToItem(elementId) {
scrollTop: itemPos
}, 400).promise().done( function() {
// Highlight post/commenent with ID (GUID)
$el.animate(colWhite, 1000).animate(colShiny).animate(colWhite, 600);
$el.animate(colWhite, 1000).animate(colShiny).animate({backgroundColor: 'transparent'}, 600);
});
}
+6 -9
View File
@@ -27,6 +27,7 @@
use Friendica\DI;
use Friendica\Model\Profile;
require_once 'view/theme/frio/theme.php';
require_once 'view/theme/frio/php/frio_boot.php';
// $minimal = is_modal();
@@ -62,19 +63,15 @@ $is_singleuser_class = $is_singleuser ? "is-singleuser" : "is-not-singleuser";
if ($scheme && is_string($scheme) && $scheme != '---') {
if (file_exists('view/theme/frio/scheme/' . $scheme . '.php')) {
$schemefile = 'view/theme/frio/scheme/' . $scheme . '.php';
$scheme_accent =
DI::pConfig()->get($uid, 'frio', 'scheme_accent') ?:
DI::config()->get('frio', 'scheme_accent') ?: FRIO_SCHEME_ACCENT_BLUE;
require_once $schemefile;
}
} else {
$nav_bg = DI::pConfig()->get($uid, 'frio', 'nav_bg');
}
if (empty($nav_bg)) {
$nav_bg = DI::config()->get('frio', 'nav_bg');
}
if (empty($nav_bg) || !is_string($nav_bg)) {
$nav_bg = "#708fa0";
}
$nav_bg = $nav_bg ?? DI::pConfig()->get($uid, 'frio', 'nav_bg', DI::config()->get('frio', 'nav_bg', '#708fa0'));
echo '<meta name="theme-color" content="' . $nav_bg . '" />';
?>
+4 -1
View File
@@ -52,7 +52,8 @@ function get_scheme_info($scheme)
'description' => '',
'author' => [],
'version' => '',
'overwrites' => []
'overwrites' => [],
'accented' => false,
];
if (!is_file($themepath . 'scheme/' . $scheme . '.php')) return $info;
@@ -84,6 +85,8 @@ function get_scheme_info($scheme)
foreach ($theme_settings as $key => $value) {
$info['overwrites'][$value] = true;
}
} elseif ($k == 'accented') {
$info['accented'] = $v && $v != 'false' && $v != 'no';
} else {
if (array_key_exists($k, $info)) {
$info[$k] = $v;
+347
View File
@@ -0,0 +1,347 @@
/*
Licence : AGPL
Created on : 11.08.2020
Author : Hypolite Petovan <hypolite@friendica.mrpetovan.com>
*/
#topbar-first {
background-color: $background_color;
}
#topbar-first .dropdown.account > a,
#topbar-first .dropdown.account.open > a,
#topbar-first .dropdown.account > button,
#topbar-first .dropdown.account.open > button {
background: none;
}
#topbar-first #nav-notifications-menu li.notif-entry:hover {
background-color: $nav_bg;
}
#topbar-second {
background-color: $nav_bg;
border-color: $link_color;
}
#topbar-second ul.tabs li {
border_color: $link_color;
}
.dropdown-menu, .account .dropdown-menu {
background-color: $background_color;
}
.dropdown-menu>li>a:focus, .dropdown-menu>li>a:hover {
color: $link_color;
}
.account .dropdown-menu li {
border-color: $background_color;
}
.dropdown-menu > li > a:focus, .dropdown-menu > li > a:hover {
background-image: none;
background-color: rgba(232, 232, 232, $contentbg_transp);
}
.breadcrumb,
.panel-footer,
.list-group-item {
background-color: rgba(245, 245, 245, $contentbg_transp);
}
.panel-group .panel-footer {
border-top: 1px solid $nav_bg;
}
.well {
background-image: none;
background-color: $nav_bg;
box-shadow: 0 0 3px #dadada;
-webkit-box-shadow: 0 0 3px #dadada;
border-color: #a0a0a0;
}
input[type=text],
input[type=submit],
button[type=submit]:not(.btn),
select,
textarea,
.form-control {
border: none;
background-color: $nav_bg;
color: $font_color;
box-shadow: 0 0 3px #dadada;
-webkit-box-shadow: 0 0 3px #dadada;
}
.form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control {
background-color: $background_color;
color: $font_color_darker;
}
.nav-tabs>li.active>a,
.nav-tabs>li.active>a:focus,
.nav-tabs>li.active>a:hover,
main .nav-tabs>li.active>a,
main .nav-tabs>li.active>a:focus,
main .nav-tabs>li.active>a:hover {
background-color: $nav_bg;
color: $font_color_darker;
}
.nav > li > a:focus, .nav > li > a:hover {
background-color: rgba(238, 238, 238, $contentbg_transp);
}
.modal-content {
background-color: $background_color;
}
.pager li > a,
.pager li > span {
border-color: #a0a0a0;
}
.pager li > a:focus,
.pager li > a:hover {
background-color: #303030;
}
.pagination > .active > a,
.pagination > .active > a:focus,
.pagination > .active > a:hover,
.pagination > .active > span,
.pagination > .active > span:focus,
.pagination > .active > span:hover {
border-color: $link_color;
background-color: $nav_bg;
color: $font_color;
}
.pagination>li>a:hover, .pagination>li>span:hover {
background-color: $nav_bg;
}
#jotOpen {
border: none;
background-color: $background_color;
}
.close {
color: $font_color;
text-shadow: 0 1px 0 $nav_bg;
}
.close:focus, .close:hover {
color: $link_color;
}
.input-group-addon {
color: $font_color;
background-color: $nav_bg;
box-shadow: 0 0 3px #dadada;
-webkit-box-shadow: 0 0 3px #dadada;
border: none;
}
#topbar-first #nav-notifications-menu li.notif-entry,
.panel-footer,
.panel-group .panel-heading + .panel-collapse > .list-group,
.panel-group .panel-heading + .panel-collapse > .panel-body,
.wall-item-container,
.comment-fake-form {
border-color: $nav_bg;
}
.wall-item-comment-wrapper {
border: 0;
}
.badge {
background-color: $nav_bg;
}
.btn {
box-shadow: 0 0 2px #dadada;
-webkit-box-shadow: 0 0 2px #dadada;
background: none;
color: $font_color_darker;
}
.btn.focus, .btn:focus, .btn:hover {
color: $font_color;
}
.btn-default:focus, .btn-default:hover {
background: $nav_bg;
}
.btn-default.active, .btn-default:active {
background-color: $nav_bg;
color: $font_color;
}
button[type=submit]:not(.btn),
input[type=submit],
.btn.btn-primary {
border: 1px solid $link_color;
}
.label-primary {
background-color: $background_color;
color: $link_color;
}
.panel-default>.panel-heading {
background: none;
background-color: $nav_bg;
color: $font_color;
}
.btn-success,
.label-success,
.alert-success,
.panel-success > .panel-heading {
background: rgba(60, 118, 61, 0.4);
color: #dff0d8;
}
.fc .fc-event,
.btn-info,
.label-info,
.alert-info,
.panel-info > .panel-heading,
.table > tbody > tr.info > td,
.table > tbody > tr.info > th,
.table > tbody > tr > td.info,
.table > tbody > tr > th.info,
.table > tfoot > tr.info > td,
.table > tfoot > tr.info > th,
.table > tfoot > tr > td.info,
.table > tfoot > tr > th.info,
.table > thead > tr.info > td,
.table > thead > tr.info > th,
.table > thead > tr > td.info,
.table > thead > tr > th.info {
background: rgba(49, 112, 143, 0.4);
color: #d9edf7;
}
.btn-warning,
.label-warning,
.alert-warning,
.panel-warning > .panel-heading {
background: rgba(139, 109, 59, 0.4);
color: #fcf8e3;
}
.btn-danger,
.label-danger,
.alert-danger,
.panel-danger > .panel-heading {
background: rgba(169, 68, 66, 0.4);
color: #f2dede;
}
.wall-item-actions a, .wall-item-actions button {
color: $link_color;
}
@media (min-width: 768px) {
.wall-item-container .wall-item-links,
.wall-item-container .wall-item-actions button,
.wall-item-container .body-attach > a {
opacity: 0.3;
-webkit-transition: all 0.25s ease-in-out;
-moz-transition: all 0.25s ease-in-out;
-o-transition: all 0.25s ease-in-out;
-ms-transition: all 0.25s ease-in-out;
transition: all 0.25s ease-in-out;
color: $font_color;
}
.wall-item-container:hover .wall-item-links,
.wall-item-container:hover .wall-item-actions button,
.wall-item-container:hover .body-attach > a {
opacity: 1;
-webkit-transition: all 0.25s ease-in-out;
-moz-transition: all 0.25s ease-in-out;
-o-transition: all 0.25s ease-in-out;
-ms-transition: all 0.25s ease-in-out;
transition: all 0.25s ease-in-out;
color: $link_color;
}
.wall-item-container .wall-item-body .body-attach > a:hover {
opacity: 1;
}
}
.fc-unthemed td.fc-today {
background-color: $nav_bg;
}
.nav .open > .btn-link {
background-color: $nav_bg;
}
.hovercard {
box-shadow: 0 10px 50px rgba(0, 0, 0, 0.5);
-webkit-box-shadow: 0 10px 50px rgba(0, 0, 0, 0.5);
}
.hovercard, .hover-card-footer {
background-color: $nav_bg;
}
.hovercard.top > .arrow:after {
border-top-color: $nav_bg;
}
.hovercard.right > .arrow:after {
border-right-color: $nav_bg;
}
.hovercard.bottom > .arrow:after {
border-bottom-color: $nav_bg;
}
.hovercard.left > .arrow:after {
border-left-color: $nav_bg;
}
.friendica-tagsinput .tag {
color: inherit;
}
code {
color: $font_color;
background-color: rgba(255, 255, 255, .2);
}
pre {
color: $font_color_darker;
background-color: rgba(255, 255, 255, .05);
}
legend {
color: $font_color;
}
.table-striped>tbody>tr:nth-of-type(odd),
.table-hover > tbody > tr:hover,
.adminpage .table-hover > tbody > tr:hover + tr.details {
background-color: $nav_bg;
}
section > .generic-page-wrapper,
.videos-content-wrapper,
.suggest-content-wrapper,
.help-content-wrapper,
.match-content-wrapper,
.dirfind-content-wrapper,
.delegation-content-wrapper,
.notes-content-wrapper,
.message-content-wrapper,
.apps-content-wrapper, #adminpage,
.delegate-content-wrapper,
.uexport-content-wrapper,
.dfrn_request-content-wrapper,
.friendica-content-wrapper,
.credits-content-wrapper,
.nogroup-content-wrapper,
.profperm-content-wrapper,
.invite-content-wrapper,
.tos-content-wrapper,
.fsuggest-content-wrapper,
.panel,
aside .widget,
.nav-container .widget{
box-shadow: 0 0 3px $link_color;
-webkit-box-shadow: 0 0 3px $link_color;
}
+21
View File
@@ -0,0 +1,21 @@
<?php
/*
* Name: Black
* Licence: AGPL
* Author: Hypolite Petovan <hypolite@friendica.mrpetovan.com>
* Overwrites: nav_bg, nav_icon_color, link_color, background_color, contentbg_transp
* Accented: yes
*/
require_once 'view/theme/frio/php/PHPColors/Color.php';
$accentColor = new Color($scheme_accent);
$menu_background_hover_color = '#' . $accentColor->darken(45);
$nav_bg = '#202020';
$link_color = '#' . $accentColor->lighten(10);
$nav_icon_color = '#d4d4d4';
$background_color = '#000000';
$contentbg_transp = '0';
$font_color = '#cccccc';
$font_color_darker = '#acacac';
+320
View File
@@ -0,0 +1,320 @@
/*
Licence : AGPL
Created on : 11.08.2020
Author : Hypolite Petovan <hypolite@friendica.mrpetovan.com>
*/
#topbar-first {
background-color: $background_color;
}
#topbar-first .dropdown.account > a,
#topbar-first .dropdown.account.open > a,
#topbar-first .dropdown.account > button,
#topbar-first .dropdown.account.open > button {
background: none;
}
#topbar-first #nav-notifications-menu li.notif-entry:hover {
background-color: $nav_bg;
}
#topbar-second {
background-color: $nav_bg;
border-color: $link_color;
}
#topbar-second ul.tabs li {
border_color: $link_color;
}
.dropdown-menu, .account .dropdown-menu {
background-color: $background_color;
}
.dropdown-menu>li>a:focus, .dropdown-menu>li>a:hover {
color: $link_color;
}
.account .dropdown-menu li {
border-color: $background_color;
}
.dropdown-menu > li > a:focus, .dropdown-menu > li > a:hover {
background-image: none;
background-color: rgba(232, 232, 232, $contentbg_transp);
}
.breadcrumb,
.panel-footer,
.list-group-item {
background-color: rgba(245, 245, 245, $contentbg_transp);
}
.panel-group .panel-footer {
border-top: 1px solid $nav_bg;
}
.well {
background-image: none;
background-color: $nav_bg;
box-shadow: 0 0 3px #dadada;
-webkit-box-shadow: 0 0 3px #dadada;
}
input[type=text],
input[type=submit],
button[type=submit]:not(.btn),
select,
textarea,
.form-control {
border: none;
background-color: $nav_bg;
color: $font_color;
box-shadow: 0 0 3px #dadada;
-webkit-box-shadow: 0 0 3px #dadada;
}
.form-control[disabled],
.form-control[readonly],
.ieldset[disabled] .form-control {
background-color: $background_color;
color: $font_color_darker;
}
.nav-tabs>li.active>a,
.nav-tabs>li.active>a:focus,
.nav-tabs>li.active>a:hover,
main .nav-tabs>li.active>a,
main .nav-tabs>li.active>a:focus,
main .nav-tabs>li.active>a:hover {
background-color: $nav_bg;
color: $font_color_darker;
}
.nav > li > a:focus,
.nav > li > a:hover {
background-color: rgba(238, 238, 238, $contentbg_transp);
}
.modal-content {
background-color: $background_color;
}
.pagination > .active > a,
.pagination > .active > a:focus,
.pagination > .active > a:hover,
.pagination > .active > span,
.pagination > .active > span:focus,
.pagination > .active > span:hover {
border-color: $link_color;
background-color: $nav_bg;
color: $font_color;
}
.pagination>li>a:hover,
.pagination>li>span:hover {
background-color: $nav_bg;
}
#jotOpen {
border: none;
background-color: $background_color;
}
.close {
color: $font_color;
text-shadow: 0 1px 0 $nav_bg;
}
.close:focus,
.close:hover {
color: $link_color;
}
.input-group-addon {
color: $font_color;
background-color: $nav_bg;
box-shadow: 0 0 3px #dadada;
-webkit-box-shadow: 0 0 3px #dadada;
border: none;
}
#topbar-first #nav-notifications-menu li.notif-entry,
.panel-footer,
.panel-group .panel-heading + .panel-collapse > .list-group,
.panel-group .panel-heading + .panel-collapse > .panel-body,
.wall-item-container,
.comment-fake-form {
border-color: $nav_bg;
}
.wall-item-comment-wrapper {
border: 0;
}
.badge {
background-color: $nav_bg;
}
.btn {
box-shadow: 0 0 2px #dadada;
-webkit-box-shadow: 0 0 2px #dadada;
background: none;
color: $font_color_darker;
}
.btn.focus,
.btn:focus,
.btn:hover {
color: $font_color;
}
.btn-default:focus,
.btn-default:hover {
background: $nav_bg;
}
.btn-default.active,
.btn-default:active {
background-color: $nav_bg;
color: $font_color;
}
button[type=submit]:not(.btn),
input[type=submit],
.btn.btn-primary {
border: 1px solid $link_color;
}
.label-primary {
background-color: $background_color;
color: $link_color;
}
.panel-default>.panel-heading {
background: none;
background-color: $nav_bg;
color: $font_color;
}
.btn-success,
.label-success,
.alert-success,
.panel-success > .panel-heading {
background: rgba(60, 118, 61, 0.4);
color: #dff0d8;
}
.fc .fc-event,
.btn-info,
.label-info,
.alert-info,
.panel-info > .panel-heading,
.table > tbody > tr.info > td,
.table > tbody > tr.info > th,
.table > tbody > tr > td.info,
.table > tbody > tr > th.info,
.table > tfoot > tr.info > td,
.table > tfoot > tr.info > th,
.table > tfoot > tr > td.info,
.table > tfoot > tr > th.info,
.table > thead > tr.info > td,
.table > thead > tr.info > th,
.table > thead > tr > td.info,
.table > thead > tr > th.info {
background: rgba(49, 112, 143, 0.4);
color: #d9edf7;
}
.btn-warning,
.label-warning,
.alert-warning,
.panel-warning > .panel-heading {
background: rgba(139, 109, 59, 0.4);
color: #fcf8e3;
}
.btn-danger,
.label-danger,
.alert-danger,
.panel-danger > .panel-heading {
background: rgba(169, 68, 66, 0.4);
color: #f2dede;
}
.wall-item-actions a,
.wall-item-actions button {
color: $link_color;
}
@media (min-width: 768px) {
.wall-item-container .wall-item-links,
.wall-item-container .wall-item-actions button,
.wall-item-container .body-attach > a {
opacity: 0.3;
-webkit-transition: all 0.25s ease-in-out;
-moz-transition: all 0.25s ease-in-out;
-o-transition: all 0.25s ease-in-out;
-ms-transition: all 0.25s ease-in-out;
transition: all 0.25s ease-in-out;
color: $font_color;
}
.wall-item-container:hover .wall-item-links,
.wall-item-container:hover .wall-item-actions button,
.wall-item-container:hover .body-attach > a {
opacity: 1;
-webkit-transition: all 0.25s ease-in-out;
-moz-transition: all 0.25s ease-in-out;
-o-transition: all 0.25s ease-in-out;
-ms-transition: all 0.25s ease-in-out;
transition: all 0.25s ease-in-out;
color: $link_color;
}
.wall-item-container .wall-item-body .body-attach > a:hover {
opacity: 1;
}
}
.fc-unthemed td.fc-today {
background-color: $nav_bg;
}
.nav .open > .btn-link {
background-color: $nav_bg;
}
.hovercard {
box-shadow: 0 10px 50px rgba(0, 0, 0, 0.5);
-webkit-box-shadow: 0 10px 50px rgba(0, 0, 0, 0.5);
}
.hovercard,
.hover-card-footer {
background-color: $nav_bg;
}
.hovercard.top > .arrow:after {
border-top-color: $nav_bg;
}
.hovercard.right > .arrow:after {
border-right-color: $nav_bg;
}
.hovercard.bottom > .arrow:after {
border-bottom-color: $nav_bg;
}
.hovercard.left > .arrow:after {
border-left-color: $nav_bg;
}
.friendica-tagsinput .tag {
color: inherit;
}
code {
color: $font_color;
background-color: rgba(255, 255, 255, .2);
}
pre {
color: $font_color_darker;
background-color: rgba(255, 255, 255, .05);
}
legend {
color: $font_color;
}
.table-striped>tbody>tr:nth-of-type(odd),
.table-hover > tbody > tr:hover,
.adminpage .table-hover > tbody > tr:hover + tr.details {
background-color: $nav_bg;
}
+34
View File
@@ -0,0 +1,34 @@
<?php
/*
* Name: Dark
* Licence: AGPL
* Author: Hypolite Petovan <hypolite@friendica.mrpetovan.com>
* Overwrites: nav_bg, nav_icon_color, link_color, background_color, contentbg_transp
* Accented: yes
*/
require_once 'view/theme/frio/php/PHPColors/Color.php';
$accentColor = new Color($scheme_accent);
$menu_background_hover_color = '#' . $accentColor->darken(20);
switch ($scheme_accent) {
default:
$link_color = '#' . $accentColor->lighten(25);
}
$nav_icon_color = $scheme_accent;
$nav_icon_hover_color = '#' . $accentColor->darken(20);
switch ($scheme_accent) {
case FRIO_SCHEME_ACCENT_GREEN:
case FRIO_SCHEME_ACCENT_RED:
$nav_bg = '#' . $accentColor->darken(25);
$background_color = '#' . $accentColor->darken(27);
break;
default:
$nav_bg = '#' . $accentColor->darken(30);
$background_color = '#' . $accentColor->darken(33);
}
$contentbg_transp = 4;
$font_color = '#e4e4e4';
$font_color_darker = '#dcdcdc';
+20
View File
@@ -0,0 +1,20 @@
<?php
/*
* Name: Light
* Licence: AGPL
* Author: Hypolite Petovan <hypolite@friendica.mrpetovan.com>
* Overwrites: nav_bg, nav_icon_color, link_color, background_color, login_bg_color, contentbg_transp
* Accented: yes
*/
require_once 'view/theme/frio/php/PHPColors/Color.php';
$accentColor = new Color($scheme_accent);
$nav_bg = '#' . $accentColor->darken(10);
$menu_background_hover_color = '#' . $accentColor->darken(5);
$nav_icon_color = "#fff";
$link_color = '#' . $accentColor->getHex();
$background_color = "#ededed";
$login_bg_color = "#ededed";
$contentbg_transp = 100;
+9 -4
View File
@@ -22,6 +22,7 @@
use Friendica\DI;
use Friendica\Util\Strings;
require_once 'view/theme/frio/theme.php';
require_once 'view/theme/frio/php/PHPColors/Color.php';
$scheme = '';
@@ -33,11 +34,12 @@ DI::config()->load('frio');
// Default to hard-coded values for empty settings
$scheme = DI::config()->get('frio', 'scheme', DI::config()->get('frio', 'schema'));
$scheme_accent = DI::config()->get('frio', 'scheme_accent') ?: FRIO_SCHEME_ACCENT_BLUE;
$nav_bg = DI::config()->get('frio', 'nav_bg') ?: '#708fa0';
$nav_icon_color = DI::config()->get('frio', 'nav_icon_color') ?: '#ffffff';
$link_color = DI::config()->get('frio', 'link_color') ?: '#6fdbe8';
$background_color = DI::config()->get('frio', 'background_color') ?: '#ededed';
$contentbg_transp = DI::config()->get('frio', 'contentbg_transp') ?: '';
$contentbg_transp = DI::config()->get('frio', 'contentbg_transp') ?? 100;
$background_image = DI::config()->get('frio', 'background_image') ?: 'img/none.png';
$bg_image_option = DI::config()->get('frio', 'bg_image_option') ?: '';
$login_bg_image = DI::config()->get('frio', 'login_bg_image') ?: '';
@@ -56,11 +58,12 @@ if ($uid) {
// Only override display settings that have actually been set
$scheme = DI::pConfig()->get($uid, 'frio', 'scheme', DI::pConfig()->get($uid, 'frio', 'schema')) ?: $scheme;
$scheme_accent = DI::pConfig()->get($uid, 'frio', 'scheme_accent') ?: $scheme_accent;
$nav_bg = DI::pConfig()->get($uid, 'frio', 'nav_bg') ?: $nav_bg;
$nav_icon_color = DI::pConfig()->get($uid, 'frio', 'nav_icon_color') ?: $nav_icon_color;
$link_color = DI::pConfig()->get($uid, 'frio', 'link_color') ?: $link_color;
$background_color = DI::pConfig()->get($uid, 'frio', 'background_color') ?: $background_color;
$contentbg_transp = DI::pConfig()->get($uid, 'frio', 'contentbg_transp') ?: $contentbg_transp;
$contentbg_transp = DI::pConfig()->get($uid, 'frio', 'contentbg_transp') ?? $contentbg_transp;
$background_image = DI::pConfig()->get($uid, 'frio', 'background_image') ?: $background_image;
$bg_image_option = DI::pConfig()->get($uid, 'frio', 'bg_image_option') ?: $bg_image_option;
$modified = DI::pConfig()->get($uid, 'frio', 'css_modified') ?: $modified;
@@ -123,7 +126,7 @@ if (!isset($nav_icon_hover_color)) {
if ($nihc->isLight()) {
$nav_icon_hover_color = '#' . $nihc->darken(10);
} else {
$nav_icon_hover_color = '#' . $nihc->lighten(10);
$nav_icon_hover_color = '#' . $nihc->lighten(20);
}
}
if (!isset($link_hover_color)) {
@@ -184,7 +187,9 @@ $options = [
'$background_size_img' => $background_size_img,
'$background_repeat' => $background_repeat,
'$login_bg_image' => $login_bg_image,
'$login_bg_color' => $login_bg_color
'$login_bg_color' => $login_bg_color,
'$font_color_darker' => $font_color_darker ?? '#555',
'$font_color' => $font_color ?? '#777',
];
$css_tpl = file_get_contents('view/theme/frio/css/style.css');
@@ -9,7 +9,7 @@
<div class="panel-group panel-group-settings" id="admin-settings" role="tablist" aria-multiselectable="true">
{{* The form for entering user profile which should be blocked *}}
<div class="panel">
<div class="section-subtitle-wrapper" role="tab" id="admin-settings-contactblock-block">
<div class="panel-heading section-subtitle-wrapper" role="tab" id="admin-settings-contactblock-block">
<h4>
<a class="accordion-toggle collapsed" data-toggle="collapse" data-parent="#admin-settings" href="#admin-settings-contactblock-block-collapse" aria-expanded="false" aria-controls="admin-settings-contactblock-block-collapse">
{{$h_newblock}}
@@ -17,7 +17,7 @@
</h4>
</div>
<div id="admin-settings-contactblock-block-collapse" class="panel-collapse collapse" role="tabpanel" aria-labelledby="admin-settings-contactblock-block">
<div id="admin-settings-contactblock-block-collapse" class="panel-body panel-collapse collapse" role="tabpanel" aria-labelledby="admin-settings-contactblock-block">
<form action="{{$baseurl}}/admin/blocklist/contact" method="post">
<input type="hidden" name="form_security_token" value="{{$form_security_token}}">
@@ -34,7 +34,7 @@
{{* The list of blocked user profiles with the possibility to unblock them *}}
<div class="panel">
<div class="section-subtitle-wrapper" role="tab" id="admin-settings-contactblock-blocked">
<div class="panel-heading section-subtitle-wrapper" role="tab" id="admin-settings-contactblock-blocked">
<h4>
<a class="accordion-toggle collapsed" data-toggle="collapse" data-parent="#admin-settings" href="#admin-settings-contactblock-blocked-collapse" aria-expanded="{{if count($contacts) > 0}}true{{else}}false{{/if}}" aria-controls="admin-settings-contactblock-blocked-collapse">
{{$h_contacts}} ({{$total_contacts}})
@@ -42,7 +42,7 @@
</h4>
</div>
<div id="admin-settings-contactblock-blocked-collapse" class="panel-collapse collapse {{if count($contacts) > 0}}in{{/if}}" role="tabpanel" aria-labelledby="admin-settings-contactblock-blocked">
<div id="admin-settings-contactblock-blocked-collapse" class="panel-body panel-collapse collapse {{if count($contacts) > 0}}in{{/if}}" role="tabpanel" aria-labelledby="admin-settings-contactblock-blocked">
<form action="{{$baseurl}}/admin/blocklist/contact" method="post">
<input type="hidden" name="form_security_token" value="{{$form_security_token}}">
+8 -8
View File
@@ -67,14 +67,14 @@
{{* Some information about the contact from the profile *}}
<div class="panel">
<div class="section-subtitle-wrapper" role="tab" id="contact-edit-profile">
<div class="section-subtitle-wrapper panel-heading" role="tab" id="contact-edit-profile">
<h4>
<a class="accordion-toggle" data-toggle="collapse" data-parent="#contact-edit-tools" href="#contact-edit-profile-collapse" aria-expanded="true" aria-controls="contact-edit-profile-collapse">
{{$contact_profile_label}}
</a>
</h4>
</div>
<div id="contact-edit-profile-collapse" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="contact-edit-profile">
<div id="contact-edit-profile-collapse" class="panel-body panel-collapse collapse in" role="tabpanel" aria-labelledby="contact-edit-profile">
<div class="section-content-tools-wrapper">
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
<div class="col-lg-4 col-md-4 col-sm-4 col-xs-12 text-muted">{{$profileurllabel}}</div><a target="blank" href="{{$url}}">{{$profileurl}}</a>
@@ -118,14 +118,14 @@
{{if $contact_settings_label}}
<div class="panel">
<div class="section-subtitle-wrapper" role="tab" id="contact-edit-settings">
<div class="section-subtitle-wrapper panel-heading" role="tab" id="contact-edit-settings">
<h4>
<a class="accordion-toggle collapsed" data-toggle="collapse" data-parent="#contact-edit-tools" href="#contact-edit-settings-collapse" aria-expanded="false" aria-controls="contact-edit-settings-collapse">
{{$contact_settings_label}}
</a>
</h4>
</div>
<div id="contact-edit-settings-collapse" class="panel-collapse collapse" role="tabpanel" aria-labelledby="contact-edit-settings">
<div id="contact-edit-settings-collapse" class="panel-body panel-collapse collapse" role="tabpanel" aria-labelledby="contact-edit-settings">
<div class="section-content-tools-wrapper">
<input type="hidden" name="contact_id" value="{{$contact_id}}">
@@ -137,7 +137,7 @@
{{/if}}
{{include file="field_checkbox.tpl" field=$hidden}}
<div class="form-group pull-right settings-submit-wrapper" >
<div class="pull-right settings-submit-wrapper" >
<button type="submit" name="submit" class="btn btn-primary" value="{{$submit}}">{{$submit}}</button>
</div>
<div class="clear"></div>
@@ -148,19 +148,19 @@
{{if $lbl_info1}}
<div class="panel">
<div class="section-subtitle-wrapper" role="tab" id="contact-edit-info">
<div class="section-subtitle-wrapper panel-heading" role="tab" id="contact-edit-info">
<h4>
<a class="accordion-toggle collapsed" data-toggle="collapse" data-parent="#contact-edit-tools" href="#contact-edit-info-collapse" aria-expanded="false" aria-controls="contact-edit-info-collapse">
{{$lbl_info1}}
</a>
</h4>
</div>
<div id="contact-edit-info-collapse" class="panel-collapse collapse" role="tabpanel" aria-labelledby="contact-edit-info">
<div id="contact-edit-info-collapse" class="panel-body panel-collapse collapse" role="tabpanel" aria-labelledby="contact-edit-info">
<div class="section-content-tools-wrapper">
{{include file="field_textarea.tpl" field=$cinfo}}
<div class="form-group pull-right settings-submit-wrapper" >
<div class="pull-right settings-submit-wrapper" >
<button type="submit" name="submit" class="btn btn-primary" value="{{$submit}}">{{$submit}}</button>
</div>
<div class="clear"></div>
-5
View File
@@ -1,9 +1,4 @@
<link rel="stylesheet" type="text/css" href="{{$baseurl}}/view/asset/fullcalendar/dist/fullcalendar.min.css?v={{$smarty.const.FRIENDICA_VERSION}}" />
<link rel="stylesheet" type="text/css" href="{{$baseurl}}/view/asset/fullcalendar/dist/fullcalendar.print.min.css?v={{$smarty.const.FRIENDICA_VERSION}}" media="print" />
<link rel="stylesheet" type="text/css" href="view/theme/frio/css/mod_events.css?v={{$smarty.const.FRIENDICA_VERSION}}" />
<script type="text/javascript" src="{{$baseurl}}/view/asset/moment/min/moment-with-locales.min.js?v={{$smarty.const.FRIENDICA_VERSION}}"></script>
<script type="text/javascript" src="{{$baseurl}}/view/asset/fullcalendar/dist/fullcalendar.min.js?v={{$smarty.const.FRIENDICA_VERSION}}"></script>
<script type="text/javascript" src="view/theme/frio/js/mod_events.js?v={{$smarty.const.FRIENDICA_VERSION}}"></script>
<script type="text/javascript">
+2 -1
View File
@@ -1,6 +1,7 @@
<div class="form-group field textarea">
{{if $field.1}}
<label for="id_{{$field.0}}">{{$field.1}}</label>
{{/if}}
<textarea class="form-control text-autosize" name="{{$field.0}}" id="id_{{$field.0}}" {{if $field.4}}{{$field.4 nofilter}}{{/if}} aria-describedby="{{$field.0}}_tip">{{$field.2}}</textarea>
{{if $field.3}}
<span class="help-block" id="{{$field.0}}_tip" role="tooltip">{{$field.3 nofilter}}</span>
+1 -1
View File
@@ -51,7 +51,7 @@
</div>
<div class="upload">
<button id="upload-{{$type}}">{{$upload}}</button>
<button id="upload-{{$type}}" type="button" class="btn btn-primary">{{$upload}}</button>
</div>
</div>
+4 -4
View File
@@ -25,14 +25,14 @@
<link rel="stylesheet" href="view/theme/frio/frameworks/bootstrap-toggle/css/bootstrap-toggle.min.css?v={{$smarty.const.FRIENDICA_VERSION}}" type="text/css" media="screen"/>
<link rel="stylesheet" href="view/theme/frio/font/open_sans/open-sans.css?v={{$smarty.const.FRIENDICA_VERSION}}" type="text/css" media="screen"/>
{{foreach $stylesheets as $stylesheetUrl}}
<link rel="stylesheet" href="{{$stylesheetUrl}}" type="text/css" media="screen" />
{{/foreach}}
{{* own css files *}}
<link rel="stylesheet" href="view/theme/frio/css/hovercard.css?v={{$smarty.const.FRIENDICA_VERSION}}" type="text/css" media="screen"/>
<link rel="stylesheet" href="view/theme/frio/css/font-awesome.custom.css?v={{$smarty.const.FRIENDICA_VERSION}}" type="text/css" media="screen"/>
{{foreach $stylesheets as $stylesheetUrl => $media}}
<link rel="stylesheet" href="{{$stylesheetUrl}}" type="text/css" media="{{$media}}" />
{{/foreach}}
<link rel="shortcut icon" href="{{$shortcut_icon}}" />
<link rel="apple-touch-icon" href="{{$touch_icon}}"/>
@@ -44,9 +44,6 @@
{{/if}}
</div>
<div class="panel-footer">
<button type="submit" name="submit" class="btn btn-primary" value="{{$submit}}">{{$submit}}</button>
</div>
</div>
</div>
+50 -4
View File
@@ -1,9 +1,55 @@
<script src="{{$baseurl}}/view/theme/quattro/jquery.tools.min.js?v={{$smarty.const.FRIENDICA_VERSION}}"></script>
<script type="text/javascript" src="{{$baseurl}}/view/js/ajaxupload.js?v={{$smarty.const.FRIENDICA_VERSION}}" ></script>
{{include file="field_select.tpl" field=$scheme}}
<div class="form-group field select">
<label for="id_{{$scheme.0}}">{{$scheme.1}}</label>
<select name="{{$scheme.0}}" id="id_{{$scheme.0}}" class="form-control">
<option value="---" {{if '---' == $scheme.2}}selected="selected"{{/if}}>{{$custom}}</option>
<optgroup label="{{$accented}}">
{{foreach $scheme.3 as $value => $label}}
<option value="{{$value}}" {{if $value == $scheme.2}}selected="selected"{{/if}}>{{$label}}</option>
{{/foreach}}
</optgroup>
<optgroup label="{{$legacy}}">
{{foreach $scheme.4 as $value => $label}}
<option value="{{$value}}" {{if $value == $scheme.2}}selected="selected"{{/if}}>{{$label}}</option>
{{/foreach}}
</optgroup>
</select>
</div>
{{if $nav_bg}}{{include file="field_input.tpl" field=$share_string}}{{/if}}
{{if $scheme_accent}}
<div class="form-group">
<p><label>{{$scheme_accent.1}}</label></p>
<label class="radio-inline">
<input type="radio" name="{{$scheme_accent.0}}" value="{{$smarty.const.FRIO_SCHEME_ACCENT_BLUE}}" {{if $scheme_accent.2 == $smarty.const.FRIO_SCHEME_ACCENT_BLUE}} checked{{/if}}>
<span style="border-radius: 10px; background-color: {{$smarty.const.FRIO_SCHEME_ACCENT_BLUE}}; width: 20px; display: inline-block">&nbsp;</span>
{{$scheme_accent.3.blue}}
</label>
<label class="radio-inline">
<input type="radio" name="{{$scheme_accent.0}}" value="{{$smarty.const.FRIO_SCHEME_ACCENT_RED}}" {{if $scheme_accent.2 == $smarty.const.FRIO_SCHEME_ACCENT_RED}} checked{{/if}}>
<span style="border-radius: 10px; background-color: {{$smarty.const.FRIO_SCHEME_ACCENT_RED}}; width: 20px; display: inline-block">&nbsp;</span>
{{$scheme_accent.3.red}}
</label>
<label class="radio-inline">
<input type="radio" name="{{$scheme_accent.0}}" value="{{$smarty.const.FRIO_SCHEME_ACCENT_PURPLE}}" {{if $scheme_accent.2 == $smarty.const.FRIO_SCHEME_ACCENT_PURPLE}} checked{{/if}}>
<span style="border-radius: 10px; background-color: {{$smarty.const.FRIO_SCHEME_ACCENT_PURPLE}}; width: 20px; display: inline-block">&nbsp;</span>
{{$scheme_accent.3.purple}}
</label>
<label class="radio-inline">
<input type="radio" name="{{$scheme_accent.0}}" value="{{$smarty.const.FRIO_SCHEME_ACCENT_GREEN}}" {{if $scheme_accent.2 == $smarty.const.FRIO_SCHEME_ACCENT_GREEN}} checked{{/if}}>
<span style="border-radius: 10px; background-color: {{$smarty.const.FRIO_SCHEME_ACCENT_GREEN}}; width: 20px; display: inline-block">&nbsp;</span>
{{$scheme_accent.3.green}}
</label>
<label class="radio-inline">
<input type="radio" name="{{$scheme_accent.0}}" value="{{$smarty.const.FRIO_SCHEME_ACCENT_PINK}}" {{if $scheme_accent.2 == $smarty.const.FRIO_SCHEME_ACCENT_PINK}} checked{{/if}}>
<span style="border-radius: 10px; background-color: {{$smarty.const.FRIO_SCHEME_ACCENT_PINK}}; width: 20px; display: inline-block">&nbsp;</span>
{{$scheme_accent.3.pink}}
</label>
</div>
{{/if}}
{{if $share_string}}{{include file="field_input.tpl" field=$share_string}}{{/if}}
{{if $nav_bg}}{{include file="field_colorinput.tpl" field=$nav_bg}}{{/if}}
{{if $nav_icon_color}}{{include file="field_colorinput.tpl" field=$nav_icon_color}}{{/if}}
{{if $link_color}}{{include file="field_colorinput.tpl" field=$link_color}}{{/if}}
@@ -17,7 +63,7 @@
<div class="row">
<div class="col-xs-9">
<input type="range" class="form-control color" id="{{$contentbg_transp.0}}_range" min="0" max="100" step="1" value="{{$contentbg_transp.2}}" onchange="{{$contentbg_transp.0}}.value = this.value" oninput="{{$contentbg_transp.0}}.value = this.value">
<input type="range" class="form-control" id="{{$contentbg_transp.0}}_range" min="0" max="100" step="1" value="{{$contentbg_transp.2}}" onchange="{{$contentbg_transp.0}}.value = this.value" oninput="{{$contentbg_transp.0}}.value = this.value">
</div>
<div class="col-xs-3">
<div class="input-group">
@@ -183,7 +229,7 @@
});
</script>
<div class="settings-submit-wrapper form-group pull-right">
<div class="settings-submit-wrapper pull-right">
<button type="submit" value="{{$submit}}" class="settings-submit btn btn-primary" name="frio-settings-submit">{{$submit}}</button>
</div>
<div class="clearfix"></div>
+6 -48
View File
@@ -21,6 +21,12 @@ use Friendica\Model\Contact;
use Friendica\Module;
use Friendica\Util\Strings;
const FRIO_SCHEME_ACCENT_BLUE = '#1e87c2';
const FRIO_SCHEME_ACCENT_RED = '#b50404';
const FRIO_SCHEME_ACCENT_PURPLE = '#a54bad';
const FRIO_SCHEME_ACCENT_GREEN = '#218f39';
const FRIO_SCHEME_ACCENT_PINK = '#d900a9';
function frio_init(App $a)
{
global $frio;
@@ -319,51 +325,3 @@ function frio_display_item(App $a, &$arr)
}
$arr['output']['subthread'] = $subthread;
}
/**
* @param int|null $uid
* @return string
* @see \Friendica\Core\Theme::getBackgroundColor()
*/
function frio_get_background_color(int $uid = null)
{
$background_color = DI::config()->get('frio', 'background_color') ?: '#ededed';
if ($uid) {
$background_color = DI::pConfig()->get($uid, 'frio', 'background_color') ?: $background_color;
}
$scheme = DI::config()->get('frio', 'scheme', DI::config()->get('frio', 'schema'));
$scheme = Strings::sanitizeFilePathItem($scheme);
if ($scheme && ($scheme != '---') && file_exists('view/theme/frio/scheme/' . $scheme . '.php')) {
$schemefile = 'view/theme/frio/scheme/' . $scheme . '.php';
require_once $schemefile;
}
return $background_color;
}
/**
* @param int|null $uid
* @return string
* @see \Friendica\Core\Theme::getThemeColor()
*/
function frio_get_theme_color(int $uid = null)
{
$nav_bg = DI::config()->get('frio', 'nav_bg') ?: '#708fa0';
if ($uid) {
$nav_bg = DI::pConfig()->get($uid, 'frio', 'background_color') ?: $nav_bg;
}
$scheme = DI::config()->get('frio', 'scheme', DI::config()->get('frio', 'schema'));
$scheme = Strings::sanitizeFilePathItem($scheme);
if ($scheme && ($scheme != '---') && file_exists('view/theme/frio/scheme/' . $scheme . '.php')) {
$schemefile = 'view/theme/frio/scheme/' . $scheme . '.php';
require_once $schemefile;
}
return $nav_bg;
}