Automatic push 4.0.6

This commit is contained in:
chevereto
2023-01-03 15:42:32 +00:00
parent 9031eff702
commit bd0aed80d1
83 changed files with 1643 additions and 1152 deletions

View File

@@ -42,7 +42,7 @@ jobs:
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
restore-keys: ${{ runner.os }}-composer- restore-keys: ${{ runner.os }}-composer-
- name: Build dependencies - name: Build dependencies
run: composer install --no-progress --ignore-platform-reqs run: composer install --no-progress
working-directory: app working-directory: app
- name: Build Chevereto - name: Build Chevereto
run: | run: |

View File

@@ -1,11 +0,0 @@
Chevereto 4.0.5 (2022-11-30)
✅ Added more environment variables
✅ Renamed dashboard/settings/api to dashboard/settings/guest-api
✅ Renamed website modes (community, personal)
🐞 Fixed bug with Exif metadata removal
🐞 Fixed bug with single image redirect
🐞 Fixed bug with selectable items on iPad
🐞 Fixed bug with login page
🐞 Fixed bug with missing timestamp on upload
🐞 Fixed bug with ModerateContent

18
.package/4.0.6.txt Normal file
View File

@@ -0,0 +1,18 @@
Chevereto 4.0.6 (2022-01-03)
- ✅ Improved user avatar upload handling
- 🐘 Added support for PHP 8.2
- 🐞 Fixed bug with consent screen
- 🐞 Fixed bug with undefined constant
- 🐞 Fixed bug with flood uploads notify
- 🐞 Fixed bug with forced privacy settings
- 🐞 Fixed bug with not working enter key on textarea
- 🐞 Fixed bug with not working pages
- 🐞 Fixed bug with wrong links on notification emails
- 🐞 Fixed bug with wrong links on tabs
- 💅 Improved button display (compact style)
- 💅 Improved display for RTL languages
- 💅 Listing viewer now goes zoom-in by default
- 💅 Removed listing viewer keyboard shortcuts reference
- 🦄 Added customizable semantics for content
- 🛍️ Added custom call to action buttons for albums

490
app/composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -576,6 +576,18 @@ $settings_updates = [
SPAM, SPAM,
], ],
'4.0.5' => null, '4.0.5' => null,
'4.0.6' => [
'semantics_album' => '',
'semantics_albums' => '',
'semantics_image' => '',
'semantics_images' => '',
'semantics_user' => '',
'semantics_users' => '',
'semantics_explore' => '',
'semantics_discovery' => '',
'semantics_category' => '',
'semantics_categories' => '',
],
]; ];
$cheveretoFreeMap = [ $cheveretoFreeMap = [
'1.0.0' => '3.8.3', '1.0.0' => '3.8.3',
@@ -1793,6 +1805,20 @@ ALTER TABLE `%table_prefix%users` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8m
WHERE setting_name = 'auto_delete_guest_uploads'; WHERE setting_name = 'auto_delete_guest_uploads';
SQL, SQL,
], ],
'4.0.6' => [
'albums' => [
'album_cta_enable' => [
'op' => 'ADD',
'type' => 'tinyint(1)',
'prop' => "NOT NULL DEFAULT '0'",
],
'album_cta' => [
'op' => 'ADD',
'type' => 'longtext',
'prop' => null,
],
]
],
]; ];
$sql_update = []; $sql_update = [];
if (!$maintenance) { if (!$maintenance) {

View File

@@ -9,5 +9,5 @@
* file that was distributed with this source code. * file that was distributed with this source code.
*/ */
const APP_VERSION = '4.0.5'; const APP_VERSION = '4.0.6';
const APP_VERSION_AKA = 'macanudo'; const APP_VERSION_AKA = 'macanudo';

View File

@@ -193,7 +193,15 @@ $hook_before = function (Handler $handler) {
} }
$handler::setVar('langLinks', $langLinks); $handler::setVar('langLinks', $langLinks);
if ($handler::cond('show_consent_screen')) { if ($handler::cond('show_consent_screen')) {
$handler::setVar('consent_accept_url', get_current_url() . (parse_url(get_current_url(), PHP_URL_QUERY) ? '&' : '/?') . 'agree-consent'); $hasQs = parse_url(get_current_url(), PHP_URL_QUERY) !== null;
$consent_accept_url = get_current_url()
. ($hasQs ? '&' : '/?')
. 'agree-consent';
$consent_accept_url = '/' . ltrim($consent_accept_url, '/');
$handler::setVar(
'consent_accept_url',
$consent_accept_url
);
} }
if (!Login::getUser()) { if (!Login::getUser()) {
if (getSetting('captcha') && $failed_access_requests['day'] >= getSetting('captcha_threshold')) { if (getSetting('captcha') && $failed_access_requests['day'] >= getSetting('captcha_threshold')) {

View File

@@ -346,7 +346,6 @@ return function (Handler $handler) {
global $theme_mail; global $theme_mail;
$theme_mail = [ $theme_mail = [
'user' => $logged_user, 'user' => $logged_user,
'link' => $logged_user['url'],
]; ];
$mail['subject'] = _s('Welcome to %s', getSettings()['website_name']); $mail['subject'] = _s('Welcome to %s', getSettings()['website_name']);
$mail['message'] = get_email_body_str('mails/account-welcome'); $mail['message'] = get_email_body_str('mails/account-welcome');

View File

@@ -238,7 +238,7 @@ return function (Handler $handler) {
], $getParams); ], $getParams);
foreach ($tabsSubAlbum as $array) { foreach ($tabsSubAlbum as $array) {
if ($array['label'] == 'AZ') { if ($array['label'] == 'AZ') {
$array['label'] = _s('Sub albums'); $array['label'] = _s('Sub %s', _s('albums'));
$array['id'] = 'tab-sub'; $array['id'] = 'tab-sub';
$array['url'] = $album['url'] . '/sub'; $array['url'] = $album['url'] . '/sub';
$tabs[] = $array; $tabs[] = $array;

View File

@@ -130,6 +130,7 @@ return function (Handler $handler) {
'content' => _s('Content'), 'content' => _s('Content'),
'listings' => _s('Listings'), 'listings' => _s('Listings'),
'image-upload' => _s('Image upload'), 'image-upload' => _s('Image upload'),
'semantics' => _s('Semantics'),
'categories' => _s('Categories'), 'categories' => _s('Categories'),
'theme' => _s('Theme'), 'theme' => _s('Theme'),
'system' => _s('System'), 'system' => _s('System'),
@@ -167,6 +168,7 @@ return function (Handler $handler) {
'guest-api' => 'fas fa-project-diagram', 'guest-api' => 'fas fa-project-diagram',
'homepage' => 'fas fa-home', 'homepage' => 'fas fa-home',
'image-upload' => 'fas fa-cloud-upload-alt', 'image-upload' => 'fas fa-cloud-upload-alt',
'semantics' => 'fas fa-sign-hanging',
'ip-bans' => 'fas fa-ban', 'ip-bans' => 'fas fa-ban',
'languages' => 'fas fa-language', 'languages' => 'fas fa-language',
'listings' => 'fas fa-th-list', 'listings' => 'fas fa-th-list',

View File

@@ -411,6 +411,9 @@ return function (Handler $handler) {
'storage' => ['name', 'bucket', 'region', 'url', 'server', 'capacity', 'is_https', 'is_active', 'api_id', 'key', 'secret', 'account_id', 'account_name'], 'storage' => ['name', 'bucket', 'region', 'url', 'server', 'capacity', 'is_https', 'is_active', 'api_id', 'key', 'secret', 'account_id', 'account_name'],
'ip_ban' => ['ip', 'expires', 'message'], 'ip_ban' => ['ip', 'expires', 'message'],
]; ];
if (Handler::cond('content_manager')) {
array_push($allowed_to_edit['album'], 'cta_enable', 'cta');
}
$allowed_to_edit['images'] = $allowed_to_edit['image']; $allowed_to_edit['images'] = $allowed_to_edit['image'];
$allowed_to_edit['albums'] = $allowed_to_edit['album']; $allowed_to_edit['albums'] = $allowed_to_edit['album'];
if ($editing['new_album']) { if ($editing['new_album']) {

View File

@@ -106,15 +106,15 @@ return function (Handler $handler) {
$meta_description = ''; $meta_description = '';
switch ($search->type) { switch ($search->type) {
case 'images': case 'images':
$meta_description = _s('Image search results for %s'); $meta_description = _s('%t search results for %s', ['%t' => _s('Image')]);
break; break;
case 'albums': case 'albums':
$meta_description = _s('Album search results for %s'); $meta_description = _s('%t search results for %s', ['%t' => _s('Album')]);
break; break;
case 'users': case 'users':
$meta_description = _s('User search results for %s'); $meta_description = _s('%t search results for %s', ['%t' => _s('User')]);
break; break;
} }

View File

@@ -195,9 +195,7 @@ return function (Handler $handler) {
]; ];
$mail['subject'] = _s('Confirmation required at %s', getSettings()['website_name']); $mail['subject'] = _s('Confirmation required at %s', getSettings()['website_name']);
$mail['message'] = get_email_body_str('mails/account-confirm'); $mail['message'] = get_email_body_str('mails/account-confirm');
if (send_mail($POST['email'], $mail['subject'], $mail['message'])) { send_mail($POST['email'], $mail['subject'], $mail['message']);
$is_process_done = true;
}
} else { } else {
$user = User::getSingle($inserted_user, 'id'); $user = User::getSingle($inserted_user, 'id');
$logged_user = Login::login($user['id']); $logged_user = Login::login($user['id']);
@@ -207,9 +205,7 @@ return function (Handler $handler) {
global $theme_mail; global $theme_mail;
$theme_mail = [ $theme_mail = [
'user' => $logged_user, 'user' => $logged_user,
'link' => $logged_user['url']
]; ];
$mail['subject'] = _s('Welcome to %s', getSetting('website_name')); $mail['subject'] = _s('Welcome to %s', getSetting('website_name'));
$mail['message'] = get_email_body_str('mails/account-welcome'); $mail['message'] = get_email_body_str('mails/account-welcome');
send_mail($logged_user['email'], $mail['subject'], $mail['message']); send_mail($logged_user['email'], $mail['subject'], $mail['message']);

View File

@@ -104,11 +104,11 @@ return function (Handler $handler) {
$user_routes = []; $user_routes = [];
$user_views = [ $user_views = [
'images' => [ 'images' => [
'title' => _s("Images by %s"), 'title' => _s("%a by %s", ['%a' => _s('Images')]),
'title_short' => _s("Images"), 'title_short' => _s("Images"),
], ],
'albums' => [ 'albums' => [
'title' => _s("Albums by %s"), 'title' => _s("%a by %s", ['%a' => _s('Albums')]),
'title_short' => _s("Albums"), 'title_short' => _s("Albums"),
], ],
'search' => [ 'search' => [
@@ -206,7 +206,7 @@ return function (Handler $handler) {
if ($v['current']) { if ($v['current']) {
$current_view = $k; $current_view = $k;
if ($current_view !== 'images') { if ($current_view !== 'images') {
$base_user_url .= $k; $base_user_url .= "/$k";
} }
} }
} }
@@ -245,14 +245,14 @@ return function (Handler $handler) {
[ [
'icon' => 'fas fa-image', 'icon' => 'fas fa-image',
'type' => 'images', 'type' => 'images',
'label' => _n('Image', 'Images', 2), 'label' => _s('Images'),
'id' => 'list-user-images', 'id' => 'list-user-images',
'current' => $currentKey === 0, 'current' => $currentKey === 0,
], ],
[ [
'icon' => 'fas fa-images', 'icon' => 'fas fa-images',
'type' => 'albums', 'type' => 'albums',
'label' => _n('Album', 'Albums', 2), 'label' => _s('Albums'),
'id' => 'list-user-albums', 'id' => 'list-user-albums',
'current' => $currentKey === 1, 'current' => $currentKey === 1,
] ]

View File

@@ -15,6 +15,8 @@ CREATE TABLE `%table_prefix%albums` (
`album_views` bigint(32) NOT NULL DEFAULT '0', `album_views` bigint(32) NOT NULL DEFAULT '0',
`album_cover_id` bigint(32) DEFAULT NULL, `album_cover_id` bigint(32) DEFAULT NULL,
`album_parent_id` bigint(32) DEFAULT NULL, `album_parent_id` bigint(32) DEFAULT NULL,
`album_cta_enable` tinyint(1) NOT NULL DEFAULT '0',
`album_cta` longtext,
PRIMARY KEY (`album_id`), PRIMARY KEY (`album_id`),
KEY `album_name` (`album_name`), KEY `album_name` (`album_name`),
KEY `album_user_id` (`album_user_id`), KEY `album_user_id` (`album_user_id`),
@@ -22,5 +24,8 @@ CREATE TABLE `%table_prefix%albums` (
KEY `album_privacy` (`album_privacy`), KEY `album_privacy` (`album_privacy`),
KEY `album_image_count` (`album_image_count`), KEY `album_image_count` (`album_image_count`),
KEY `album_creation_ip` (`album_creation_ip`), KEY `album_creation_ip` (`album_creation_ip`),
KEY `album_likes` (`album_likes`),
KEY `album_views` (`album_views`),
KEY `album_parent_id` (`album_parent_id`),
FULLTEXT KEY `searchindex` (`album_name`,`album_description`) FULLTEXT KEY `searchindex` (`album_name`,`album_description`)
) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; ) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;

View File

@@ -15,6 +15,8 @@ CREATE TABLE `%table_prefix%albums` (
`album_views` bigint(32) NOT NULL DEFAULT '0', `album_views` bigint(32) NOT NULL DEFAULT '0',
`album_cover_id` bigint(32) DEFAULT NULL, `album_cover_id` bigint(32) DEFAULT NULL,
`album_parent_id` bigint(32) DEFAULT NULL, `album_parent_id` bigint(32) DEFAULT NULL,
`album_cta_enable` tinyint(1) NOT NULL DEFAULT '0',
`album_cta` longtext,
PRIMARY KEY (`album_id`), PRIMARY KEY (`album_id`),
KEY `album_name` (`album_name`), KEY `album_name` (`album_name`),
KEY `album_user_id` (`album_user_id`), KEY `album_user_id` (`album_user_id`),
@@ -22,5 +24,8 @@ CREATE TABLE `%table_prefix%albums` (
KEY `album_privacy` (`album_privacy`), KEY `album_privacy` (`album_privacy`),
KEY `album_image_count` (`album_image_count`), KEY `album_image_count` (`album_image_count`),
KEY `album_creation_ip` (`album_creation_ip`), KEY `album_creation_ip` (`album_creation_ip`),
KEY `album_likes` (`album_likes`),
KEY `album_views` (`album_views`),
KEY `album_parent_id` (`album_parent_id`),
FULLTEXT KEY `searchindex` (`album_name`,`album_description`) FULLTEXT KEY `searchindex` (`album_name`,`album_description`)
) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4; ) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4;

View File

@@ -29,7 +29,9 @@ use function Chevereto\Legacy\send_mail;
use function Chevereto\Legacy\time_elapsed_string; use function Chevereto\Legacy\time_elapsed_string;
use function Chevereto\Vars\session; use function Chevereto\Vars\session;
use function Chevereto\Vars\sessionVar; use function Chevereto\Vars\sessionVar;
use function Emoji\detect_emoji;
use Exception; use Exception;
use Throwable;
class Album class Album
{ {
@@ -180,7 +182,7 @@ class Album
); );
} }
if (!isset($values['name'])) { if (!isset($values['name'])) {
$values['name'] = _s('Untitled') . ' ' . datetime(); $values['name'] = _s('Unnamed') . ' ' . datetime();
} }
$privacyOpts = ['public', 'password', 'private_but_link']; $privacyOpts = ['public', 'password', 'private_but_link'];
if (Login::isLoggedUser()) { if (Login::isLoggedUser()) {
@@ -383,7 +385,7 @@ class Album
? encodeID((int) $album['id']) ? encodeID((int) $album['id'])
: null; : null;
if (!isset($album['name']) && isset($user['id'])) { if (!isset($album['name']) && isset($user['id'])) {
$album['name'] = _s("%s's images", $user['username']); $album['name'] = User::getStreamName($user['username']);
} }
if (!isset($album['id'])) { if (!isset($album['id'])) {
$album['url'] = $user !== [] ? User::getUrl($user['username']) : null; $album['url'] = $user !== [] ? User::getUrl($user['username']) : null;
@@ -456,6 +458,38 @@ class Album
$album['date_fixed_peer'] = Login::isLoggedUser() $album['date_fixed_peer'] = Login::isLoggedUser()
? datetimegmt_convert_tz($album['date_gmt'], Login::getUser()['timezone']) ? datetimegmt_convert_tz($album['date_gmt'], Login::getUser()['timezone'])
: $album['date_gmt']; : $album['date_gmt'];
$ctaArray = [];
if ($album['cta_enable'] ?? false) {
try {
$ctaArray = json_decode($album['cta'] ?? '', true) ?? [];
foreach ($ctaArray as &$v) {
$icon = $v['icon'];
$iconClass = '';
$emoji = detect_emoji($v['icon']);
if ($emoji === []) {
$icon = '';
if (preg_match('/\s/', $v['icon']) === 1) {
$iconClass = $v['icon'];
} else {
$iconClass = 'fas fa-' . $v['icon'];
}
}
$v['iconClass'] = $iconClass;
$v['emoji'] = $icon;
}
} catch (Throwable) {
$ctaArray = [];
}
}
$album['cta_array'] = $ctaArray;
$album['cta_array_json'] = json_encode($album['cta_array']);
$album['cta_html'] = '';
foreach ($album['cta_array'] as $button) {
$album['cta_html'] .= <<<STRING
<a class="btn btn-cta btn-small animate" title="{$button['label']}" href="{$button['href']}"><span class="btn-icon {$button['iconClass']}">{$button['emoji']}</span><span class="btn-text">{$button['label']}</span></a>
STRING;
}
$album['cta'] = $album['cta'] ?? '[]';
} }
public static function formatArray(array $dbrow, bool $safe = false): array public static function formatArray(array $dbrow, bool $safe = false): array

View File

@@ -718,7 +718,7 @@ class Image
if ($do_dupe_check && self::isDuplicatedUpload($image_upload['uploaded']['fileinfo']['md5'])) { if ($do_dupe_check && self::isDuplicatedUpload($image_upload['uploaded']['fileinfo']['md5'])) {
throw new Exception(_s('Duplicated upload'), 102); throw new Exception(_s('Duplicated upload'), 102);
} }
$image_ratio = $image_upload['uploaded']['fileinfo']['width'] / $image_upload['uploaded']['fileinfo']['height']; $image_ratio = $image_upload['uploaded']['fileinfo']['ratio'];
$must_resize = false; $must_resize = false;
$image_max_size_cfg = [ $image_max_size_cfg = [
'width' => Settings::get('upload_max_image_width') ?: $image_upload['uploaded']['fileinfo']['width'], 'width' => Settings::get('upload_max_image_width') ?: $image_upload['uploaded']['fileinfo']['width'],
@@ -1044,7 +1044,7 @@ class Image
$album = isset(session()[$session_handle]) $album = isset(session()[$session_handle])
? Album::getSingle(decodeID(session()[$session_handle])) ? Album::getSingle(decodeID(session()[$session_handle]))
: null; : null;
if (!empty($album) || !in_array($album['privacy'], $privacyTargets)) { if (!empty($album) || !in_array($album['privacy'] ?? '', $privacyTargets)) {
$inserted_album = Album::insert([ $inserted_album = Album::insert([
'name' => _s('Private upload') . ' ' . datetime('Y-m-d'), 'name' => _s('Private upload') . ' ' . datetime('Y-m-d'),
'user_id' => $user['id'], 'user_id' => $user['id'],

View File

@@ -55,6 +55,10 @@ class L10n
protected static string $forced_locale = ''; protected static string $forced_locale = '';
protected static array $override = [];
protected static array $overridePlural = [];
public static function cacheFilesystemLocales(): array public static function cacheFilesystemLocales(): array
{ {
$directory = new DirectoryIterator(PATH_APP_LANGUAGES); $directory = new DirectoryIterator(PATH_APP_LANGUAGES);
@@ -84,7 +88,7 @@ class L10n
return []; return [];
} }
return $file->raw(); return $file->get();
} }
public static function bindEnabled() public static function bindEnabled()
@@ -236,14 +240,42 @@ class L10n
self::$translation_table = self::$gettext->translation_table; self::$translation_table = self::$gettext->translation_table;
} }
public static function setOverride(string $key, string $msg): void
{
self::$override[$key] = $msg;
self::$override[mb_strtolower($key)] = mb_strtolower($msg);
}
public static function setPluralOverride(
string $key,
string $msg,
string $msg_plural,
): void {
self::$overridePlural[$key] = [$msg, $msg_plural];
self::$overridePlural[mb_strtolower($key)] = [mb_strtolower($msg), mb_strtolower($msg_plural)];
}
public static function gettext(string $msg): string public static function gettext(string $msg): string
{ {
return self::getGettext()->gettext($msg) ?? $msg; return self::$override[$msg]
?? self::getGettext()->gettext($msg)
?? $msg;
} }
public static function ngettext(string $msg, string $msg_plural, int $count): string public static function ngettext(string $msg, string $msg_plural, int $count): string
{ {
return self::getGettext()->ngettext($msg, $msg_plural, $count) ?? $msg; $overrideMsg = self::$overridePlural[$msg] ?? null;
if ($overrideMsg !== null) {
$msg = $overrideMsg[0];
$msg_plural = $overrideMsg[1];
$translated = $count == 1 ? $msg : $msg_plural;
$index_id = self::getGettext()->getPluralKey($count);
return $overrideMsg[$index_id] ?? $translated;
}
return self::getGettext()->ngettext($msg, $msg_plural, $count)
?? $msg;
} }
public static function setStatic(string $var, mixed $value): void public static function setStatic(string $var, mixed $value): void

View File

@@ -562,7 +562,7 @@ class Listing
if ($db->rowCount() > $this->limit) { if ($db->rowCount() > $this->limit) {
array_pop($this->output); array_pop($this->output);
} }
$this->output = safe_html($this->output); $this->output = safe_html(var: $this->output, skip: ['album_cta']);
$this->count = count($this->output); $this->count = count($this->output);
$this->nsfw = false; $this->nsfw = false;
$this->output_assoc = []; $this->output_assoc = [];

View File

@@ -51,6 +51,31 @@ class Settings
'xr_key', 'xr_key',
]; ];
public const SEMANTICS = [
[
'semantics_album' => 'Album',
'semantics_albums' => 'Albums',
],
[
'semantics_image' => 'Image',
'semantics_images' => 'Images',
],
[
'semantics_user' => 'User',
'semantics_users' => 'Users',
],
[
'semantics_category' => 'Category',
'semantics_categories' => 'Categories',
],
[
'semantics_explore' => 'Explore',
],
[
'semantics_discovery' => 'Discovery',
],
];
public function __construct() public function __construct()
{ {
$settings = []; $settings = [];

View File

@@ -265,8 +265,8 @@ class Upload
$this->source = [ $this->source = [
'filename' => $this->source_filename, // file.ext 'filename' => $this->source_filename, // file.ext
'name' => $this->source_name, // file 'name' => $this->source_name, // file
'image_exif' => $this->source_image_exif, // exif-reader 'image_exif' => $this->source_image_exif,
'fileinfo' => get_image_fileinfo($this->downstream), // fileinfo array 'fileinfo' => get_image_fileinfo($this->downstream),
]; ];
if (stream_resolve_include_path($this->downstream) == false) { if (stream_resolve_include_path($this->downstream) == false) {
throw new Exception('Concurrency: Downstream gone, aborting operation', 666); throw new Exception('Concurrency: Downstream gone, aborting operation', 666);
@@ -292,13 +292,16 @@ class Upload
} catch (Throwable $e) { } catch (Throwable $e) {
} }
} }
$fileinfo = get_image_fileinfo($this->uploaded_file); $fileInfo = get_image_fileinfo($this->uploaded_file);
$fileinfo['is_360'] = $is_360; if ($fileInfo === []) {
throw new Exception("Can't get uploaded info", 610);
}
$fileInfo['is_360'] = $is_360;
$this->uploaded = [ $this->uploaded = [
'file' => $this->uploaded_file, 'file' => $this->uploaded_file,
'filename' => get_filename($this->uploaded_file), 'filename' => get_filename($this->uploaded_file),
'name' => get_basename_without_extension($this->uploaded_file), 'name' => get_basename_without_extension($this->uploaded_file),
'fileinfo' => $fileinfo, 'fileinfo' => $fileInfo,
]; ];
} }
@@ -462,7 +465,7 @@ class Upload
throw new Exception("Can't fetch target upload source (downstream)", 600); throw new Exception("Can't fetch target upload source (downstream)", 600);
} }
$this->source_image_fileinfo = get_image_fileinfo($this->downstream); $this->source_image_fileinfo = get_image_fileinfo($this->downstream);
if (!$this->source_image_fileinfo) { if ($this->source_image_fileinfo === []) {
throw new Exception("Can't get target upload source info", 610); throw new Exception("Can't get target upload source info", 610);
} }
if ($this->source_image_fileinfo['width'] == '' || $this->source_image_fileinfo['height'] == '') { if ($this->source_image_fileinfo['width'] == '' || $this->source_image_fileinfo['height'] == '') {
@@ -560,7 +563,7 @@ class Upload
} }
} }
if ($is_flood) { if ($is_flood) {
if (getSetting('flood_uploads_notify') && !session()['flood_uploads_notify'][$flood_by]) { if (getSetting('flood_uploads_notify') && !(session()['flood_uploads_notify'][$flood_by] ?? false)) {
try { try {
$logged_user = Login::getUser(); $logged_user = Login::getUser();
$message = strtr('Flooding IP <a href="' . get_public_url('search/images/?q=ip:%ip') . '">%ip</a>', ['%ip' => get_client_ip()]) . '<br>'; $message = strtr('Flooding IP <a href="' . get_public_url('search/images/?q=ip:%ip') . '">%ip</a>', ['%ip' => get_client_ip()]) . '<br>';
@@ -574,7 +577,7 @@ class Upload
$message .= 'Week: ' . $flood_db['day'] . '<br>'; $message .= 'Week: ' . $flood_db['day'] . '<br>';
$message .= 'Month: ' . $flood_db['week'] . '<br>'; $message .= 'Month: ' . $flood_db['week'] . '<br>';
system_notification_email(['subject' => 'Flood report IP ' . get_client_ip(), 'message' => $message]); system_notification_email(['subject' => 'Flood report IP ' . get_client_ip(), 'message' => $message]);
$addValues = session()['flood_uploads_notify']; $addValues = session()['flood_uploads_notify'] ?? [];
$addValues[$flood_by] = true; $addValues[$flood_by] = true;
sessionVar()->put('flood_uploads_notify', $addValues); sessionVar()->put('flood_uploads_notify', $addValues);
} catch (Exception $e) { } catch (Exception $e) {

View File

@@ -177,7 +177,7 @@ class User
return [ return [
'album_id' => null, 'album_id' => null,
'album_id_encoded' => null, 'album_id_encoded' => null,
'album_name' => _s("%s's images", $user['username']), 'album_name' => self::getStreamName($user['username']),
'album_user_id' => $user['id'], 'album_user_id' => $user['id'],
'album_privacy' => 'public', 'album_privacy' => 'public',
'album_url' => $user['url'] 'album_url' => $user['url']
@@ -187,6 +187,11 @@ class User
return null; return null;
} }
public static function getStreamName(string $username): string
{
return _s("%s by %u", ['%s' => _s('Images'), '%u' => $username]);
}
public static function getUrl(array|string $handle) public static function getUrl(array|string $handle)
{ {
$username = is_array($handle) ? ($handle[isset($handle['user_username']) ? 'user_username' : 'username'] ?? null) : $handle; $username = is_array($handle) ? ($handle[isset($handle['user_username']) ? 'user_username' : 'username'] ?? null) : $handle;
@@ -257,7 +262,7 @@ class User
$table['%' . $k] = $values[$k] ?? ''; $table['%' . $k] = $values[$k] ?? '';
} }
$table['%edit'] = '<a href="' . get_public_url('dashboard/user/' . $user_id) . '">edit</a>'; $table['%edit'] = '<a href="' . get_public_url('dashboard/user/' . $user_id) . '">edit</a>';
$table['%user'] = '<a href="' . self::getUrl($values['username']) . '">' . $values['username'] . '</a>'; $table['%user'] = '<a href="' . get_public_url(self::getUrl($values['username'])) . '">' . $values['username'] . '</a>';
$table['%configure'] = '<a href="' . get_public_url('dashboard/settings/users') . '">dashboard/settings/users</a>'; $table['%configure'] = '<a href="' . get_public_url('dashboard/settings/users') . '">dashboard/settings/users</a>';
system_notification_email([ system_notification_email([
'subject' => sprintf('New user signup %s', $values['username']), 'subject' => sprintf('New user signup %s', $values['username']),
@@ -308,7 +313,7 @@ class User
/** @var array $uploaded */ /** @var array $uploaded */
$uploaded = $image_upload['uploaded']; $uploaded = $image_upload['uploaded'];
if ($type == 'avatar') { if ($type == 'avatar') {
$max_res = ['width' => 500, 'height' => 500]; $max_res = ['width' => 500, 'height' => 500, 'fitted' => true];
$must_resize = $uploaded['fileinfo']['width'] > $max_res['width'] $must_resize = $uploaded['fileinfo']['width'] > $max_res['width']
|| $uploaded['fileinfo']['height'] > $max_res['height']; || $uploaded['fileinfo']['height'] > $max_res['height'];
} else { } else {
@@ -529,6 +534,7 @@ class User
$user['image_count_display'] = isset($user['image_count']) ? abbreviate_number($user['image_count']) : 0; $user['image_count_display'] = isset($user['image_count']) ? abbreviate_number($user['image_count']) : 0;
$user['album_count_display'] = isset($user['album_count']) ? abbreviate_number($user['album_count']) : 0; $user['album_count_display'] = isset($user['album_count']) ? abbreviate_number($user['album_count']) : 0;
$user['url'] = self::getUrl($user); $user['url'] = self::getUrl($user);
$user['public_url'] = get_public_url($user['url']);
$user['url_albums'] = self::getUrlAlbums($user['url']); $user['url_albums'] = self::getUrlAlbums($user['url']);
$user['url_liked'] = $user['url'] . '/liked'; $user['url_liked'] = $user['url'] . '/liked';
$user['url_following'] = $user['url'] . '/following'; $user['url_following'] = $user['url'] . '/following';

View File

@@ -58,6 +58,12 @@ class Gettext
private $is_cached = false; private $is_cached = false;
private array $options;
private string $parse_method;
private string $cache_file;
public function __construct($options = []) public function __construct($options = [])
{ {
$this->options = array_merge(static::$default_options, (array)$options); $this->options = array_merge(static::$default_options, (array)$options);
@@ -105,18 +111,14 @@ class Gettext
if (!$this->parsed) { if (!$this->parsed) {
$this->parseFile(); $this->parseFile();
} }
if ($this->mustFixQuotes()) { if ($this->mustFixQuotes()) {
$msg = $this->fixQuotes($msg, 'escape'); $msg = $this->fixQuotes($msg, 'escape');
} }
$translated = $msg; $translated = $msg;
if (array_key_exists($msg, $this->translation_table)) { if (array_key_exists($msg, $this->translation_table)) {
$translated = $this->translation_table[$msg][0] ?? null; $translated = $this->translation_table[$msg][0] ?? null;
$translated = !empty($translated) ? $translated : $msg; $translated = !empty($translated) ? $translated : $msg;
} }
if ($this->mustFixQuotes()) { if ($this->mustFixQuotes()) {
$translated = $this->fixQuotes($translated, 'unescape'); $translated = $this->fixQuotes($translated, 'unescape');
} }
@@ -144,23 +146,18 @@ class Gettext
if (!$this->parsed) { if (!$this->parsed) {
$this->parseFile(); $this->parseFile();
} }
if ($this->mustFixQuotes()) { if ($this->mustFixQuotes()) {
$msg = $this->fixQuotes($msg, 'escape'); $msg = $this->fixQuotes($msg, 'escape');
$msg_plural = $this->fixQuotes($msg_plural, 'escape'); $msg_plural = $this->fixQuotes($msg_plural, 'escape');
} }
$translated = $count == 1 ? $msg : $msg_plural; // Failover $translated = $count == 1 ? $msg : $msg_plural; // Failover
if (array_key_exists($msg, $this->translation_table)) { if (array_key_exists($msg, $this->translation_table)) {
$plural_index = $this->getPluralIndex($count); $index_id = $this->getPluralKey($count);
$index_id = $plural_index !== false ? $plural_index : ($count - 1);
$table = $this->translation_table[$msg]; $table = $this->translation_table[$msg];
if (array_key_exists($index_id, $table)) { if (array_key_exists($index_id, $table)) {
$translated = $table[$index_id]; $translated = $table[$index_id];
} }
} }
if ($this->mustFixQuotes()) { if ($this->mustFixQuotes()) {
$translated = $this->fixQuotes($translated, 'unescape'); $translated = $this->fixQuotes($translated, 'unescape');
} }
@@ -168,6 +165,13 @@ class Gettext
return $translated; return $translated;
} }
public function getPluralKey(int $count): int
{
$plural_index = $this->getPluralIndex($count);
return $plural_index !== false ? $plural_index : ($count - 1);
}
/** /**
* Parse the source file * Parse the source file
* If cache is enabled it will try to cache the result * If cache is enabled it will try to cache the result

View File

@@ -1248,7 +1248,7 @@ function unaccent_string(string $string): string
return $string; return $string;
} }
function safe_html(mixed $var, int $flag = ENT_QUOTES): string|array|null function safe_html(mixed $var, int $flag = ENT_QUOTES, array $skip = []): string|array|null
{ {
if (!is_array($var)) { if (!is_array($var)) {
return $var === null return $var === null
@@ -1257,8 +1257,13 @@ function safe_html(mixed $var, int $flag = ENT_QUOTES): string|array|null
} }
$safe_array = []; $safe_array = [];
foreach ($var as $k => $v) { foreach ($var as $k => $v) {
if (in_array($k, $skip, true)) {
$safe_array[$k] = $v;
continue;
}
$safe_array[$k] = is_array($v) $safe_array[$k] = is_array($v)
? safe_html($v) ? safe_html($v, $flag, $skip)
: ( : (
$v === null $v === null
? null ? null

View File

@@ -76,12 +76,8 @@ function get_theme_file_url($file, $options = [])
function get_static_url($filepath, $options = []) function get_static_url($filepath, $options = [])
{ {
$options = array_merge(['versionize' => true], $options); $options = array_merge(['versionize' => true], $options);
$return = absolute_to_url( $url = getLocalUrl();
$filepath, $return = absolute_to_url($filepath, $url);
URL_APP_PUBLIC === URL_APP_PUBLIC_STATIC
? Config::host()->hostnamePath()
: URL_APP_PUBLIC_STATIC
);
if ($options['versionize']) { if ($options['versionize']) {
$return = versionize_src($return); $return = versionize_src($return);
} }
@@ -560,6 +556,11 @@ function get_peafowl_item_list($item, $template, $tools, $tpl = 'image', array $
$object['user'][$k] = $item['user'][$k] ?? ''; $object['user'][$k] = $item['user'][$k] ?? '';
} }
} }
if (isset($item['album'])) {
$object['album'] = [
'cta_html' => $item['album']['cta_html'] ?? '',
];
}
$replacements['DATA_OBJECT'] = "data-object='" . rawurlencode(json_encode(G\array_utf8encode($object))) . "'"; $replacements['DATA_OBJECT'] = "data-object='" . rawurlencode(json_encode(G\array_utf8encode($object))) . "'";
if ($stock_tpl == 'IMAGE') { if ($stock_tpl == 'IMAGE') {
$replacements['SIZE_TYPE'] = getSetting('theme_image_listing_sizing') . '-size'; $replacements['SIZE_TYPE'] = getSetting('theme_image_listing_sizing') . '-size';

View File

@@ -17,7 +17,6 @@ use function Chevere\Message\message;
use Chevere\Regex\Regex; use Chevere\Regex\Regex;
use Chevere\Throwable\Exceptions\LogicException; use Chevere\Throwable\Exceptions\LogicException;
use Chevere\Throwable\Exceptions\RuntimeException; use Chevere\Throwable\Exceptions\RuntimeException;
use function Chevere\Type\typeArray;
use function Chevere\Writer\streamFor; use function Chevere\Writer\streamFor;
use Chevere\Writer\StreamWriter; use Chevere\Writer\StreamWriter;
use function Chevere\Writer\writers; use function Chevere\Writer\writers;
@@ -612,12 +611,22 @@ function decryptString(string $string): string|bool
return sessionCrypt($string, false); return sessionCrypt($string, false);
} }
function getLocalUrl(): string
{
$url = Config::host()->hostnamePath();
if (defined('URL_APP_PUBLIC_STATIC')) {
$url = URL_APP_PUBLIC === URL_APP_PUBLIC_STATIC
? Config::host()->hostnamePath()
: URL_APP_PUBLIC_STATIC;
}
return $url;
}
function get_content_url(string $sub): string function get_content_url(string $sub): string
{ {
$dirname = dirname($sub); $dirname = dirname($sub);
$local = URL_APP_PUBLIC_STATIC === URL_APP_PUBLIC $local = getLocalUrl();
? Config::host()->hostnamePath()
: URL_APP_PUBLIC_STATIC;
$url = AssetStorage::getStorage()['url'] ?? $local; $url = AssetStorage::getStorage()['url'] ?? $local;
if (basename($dirname) == 'default') { if (basename($dirname) == 'default') {
$url = $local; $url = $local;
@@ -752,7 +761,7 @@ function upload_to_content_images(array $source, string $what): void
default: default:
throw new Exception('Unknown errors', 602); throw new Exception('Unknown errors', 602);
} }
$file_contents = @file_get_contents($source['tmp_name']); $file_contents = file_get_contents($source['tmp_name']);
if (!$file_contents) { if (!$file_contents) {
throw new Exception("Can't read uploaded file content", 600); throw new Exception("Can't read uploaded file content", 600);
} }
@@ -976,7 +985,7 @@ function loaderHandler(
$envFile = filePhpForPath(PATH_APP . 'env.php'); $envFile = filePhpForPath(PATH_APP . 'env.php');
if ($envFile->file()->exists()) { if ($envFile->file()->exists()) {
$filePhpReturn = new FilePhpReturn($envFile); $filePhpReturn = new FilePhpReturn($envFile);
$env = $filePhpReturn->variableTyped(typeArray()); $env = $filePhpReturn->getArray();
} }
$envVar = array_merge($envDefault, $env, $_env); $envVar = array_merge($envDefault, $env, $_env);
if ($envVar['CHEVERETO_CONTEXT'] === 'saas') { if ($envVar['CHEVERETO_CONTEXT'] === 'saas') {
@@ -1078,6 +1087,23 @@ function loaderHandler(
defaultLanguage: Settings::get('default_language'), defaultLanguage: Settings::get('default_language'),
autoLanguage: Settings::get('auto_language'), autoLanguage: Settings::get('auto_language'),
); );
foreach (Settings::SEMANTICS as $messages) {
$aux = 0;
foreach ($messages as $key => $message) {
$aux++;
$value = Settings::get($key);
if ($value === null) {
continue;
}
L10n::setOverride($message, $value);
if (isset($message[1]) && $aux == 1) {
$singular = $value;
}
if (isset($message[1]) && $aux == 2) {
L10n::setPluralOverride($message, $singular, $value);
}
}
}
try { try {
$xrArguments = array_filter([ $xrArguments = array_filter([
@@ -1255,3 +1281,33 @@ function assertNotStopWords(string ...$message): void
); );
} }
} }
/**
* Increases or decreases the brightness of a color by a percentage of the current brightness.
*
* @param string $hexCode Supported formats: `#FFF`, `#FFFFFF`, `FFF`, `FFFFFF`
* @param float $adjustPercent A number between -1 and 1. E.g. 0.3 = 30% lighter; -0.4 = 40% darker.
*
* @return string
*
* @author maliayas
*/
function adjustBrightness(string $hexCode, float $adjustPercent)
{
$hexCode = ltrim($hexCode, '#');
if (strlen($hexCode) == 3) {
$hexCode = $hexCode[0] . $hexCode[0] . $hexCode[1] . $hexCode[1] . $hexCode[2] . $hexCode[2];
}
$hexCode = array_map('hexdec', str_split($hexCode, 2));
foreach ($hexCode as &$color) {
$adjustableLimit = $adjustPercent < 0 ? $color : 255 - $color;
$adjustAmount = ceil($adjustableLimit * $adjustPercent);
$color = str_pad(dechex($color + $adjustAmount), 2, '0', STR_PAD_LEFT);
}
return '#' . implode($hexCode);
}

View File

@@ -122,14 +122,14 @@ ul>li {
.highlight { .highlight {
background: rgba(255, 255, 255, .5); background: rgba(255, 255, 255, .5);
border-left: 4px solid #8e44ad; border-inline-start: 4px solid #8e44ad;
} }
.alert { .alert {
position: relative; position: relative;
background: rgba(241, 196, 15, .3); background: rgba(241, 196, 15, .3);
border-left: 4px solid #f1c40f; border-inline-start: 4px solid #f1c40f;
padding-right: 2em; padding-inline-end: 2em;
} }
.alert pre { .alert pre {
@@ -157,7 +157,7 @@ ul>li {
.alert-close { .alert-close {
cursor: pointer; cursor: pointer;
position: absolute; position: absolute;
right: 1em; inset-inline-end: 1em;
top: 1em; top: 1em;
width: 1em; width: 1em;
height: 1em; height: 1em;
@@ -171,7 +171,7 @@ ul>li {
.alert-close:before, .alert-close:before,
.alert-close:after { .alert-close:after {
position: absolute; position: absolute;
left: 7.5px; inset-inline-start: 7.5px;
content: ' '; content: ' ';
height: 16px; height: 16px;
width: 2px; width: 2px;
@@ -198,7 +198,7 @@ input {
border-top-color: transparent; border-top-color: transparent;
border-left-color: transparent; border-left-color: transparent;
border-right-color: transparent; border-right-color: transparent;
padding-left: 0; padding-inline-start: 0;
transition: border-width 1s linear; transition: border-width 1s linear;
} }
@@ -227,8 +227,8 @@ button,
display: inline-block; display: inline-block;
font-size: 0.83em; font-size: 0.83em;
font-weight: bold; font-weight: bold;
padding-right: 15px; padding-inline-end: 15px;
padding-left: 15px; padding-inline-start: 15px;
line-height: 0.83em; line-height: 0.83em;
outline: 0; outline: 0;
cursor: pointer; cursor: pointer;
@@ -335,7 +335,7 @@ code {
font-size: 32px; font-size: 32px;
position: absolute; position: absolute;
top: 20px; top: 20px;
right: 20px; inset-inline-end: 20px;
margin: 0; margin: 0;
opacity: 0; opacity: 0;
} }
@@ -491,7 +491,7 @@ body.body--installing .flex-box .loader {
.flex-box+.flex-box { .flex-box+.flex-box {
margin-top: 20px; margin-top: 20px;
margin-left: 0; margin-inline-start: 0;
} }
} }
@@ -579,7 +579,7 @@ body.body--installing .flex-box .loader {
.input-warning { .input-warning {
position: absolute; position: absolute;
right: 0; inset-inline-end: 0;
top: 0; top: 0;
font-size: 80%; font-size: 80%;
} }
@@ -594,7 +594,7 @@ body.body--installing .flex-box .loader {
.input-password .input-password-strength { .input-password .input-password-strength {
position: absolute; position: absolute;
right: 0; inset-inline-end: 0;
top: 50%; top: 50%;
margin-top: 5px; margin-top: 5px;
} }

File diff suppressed because one or more lines are too long

View File

@@ -100,7 +100,6 @@ if (!defined('ACCESS') || !ACCESS) {
$open_graph_extend = [ $open_graph_extend = [
'type' => 'profile', 'type' => 'profile',
'title' => Handler::var('user')['name'], 'title' => Handler::var('user')['name'],
// 'description' => sprintf(is_user_images() ? _s("%s's Images") : _s("%s's Albums"), _var('user')["name_short"]),
'image' => isset(Handler::var('user')['avatar']) ? Handler::var('user')['avatar']['url'] : '', 'image' => isset(Handler::var('user')['avatar']) ? Handler::var('user')['avatar']['url'] : '',
]; ];

View File

@@ -2253,7 +2253,6 @@ $(function () {
var $this = $(this); var $this = $(this);
if ($this.data("XHR")) return; if ($this.data("XHR")) return;
$this.data("XHR", true); $this.data("XHR", true);
var $object = $(this).is("[data-liked]") ? var $object = $(this).is("[data-liked]") ?
$(this) : $(this) :
$(this).closest("[data-liked]"); $(this).closest("[data-liked]");
@@ -2293,15 +2292,11 @@ $(function () {
if (isSingle && typeof response.content !== typeof undefined) { if (isSingle && typeof response.content !== typeof undefined) {
$("[data-text=likes-count]").html(response.content.likes); $("[data-text=likes-count]").html(response.content.likes);
} }
$targets.attr("data-liked", liked ? 0 : 1); // Toggle indicator $targets.closest("[data-liked]").attr("data-liked", liked ? 0 : 1);
}); });
}); });
$(document).on("click", "[data-action=album-cover]", function () { $(document).on("click", "[data-action=album-cover]", function () {
// if (!PF.fn.is_user_logged()) {
// window.location.href = CHV.obj.vars.urls.login;
// return;
// }
var $this = $(this); var $this = $(this);
if ($this.data("XHR")) return; if ($this.data("XHR")) return;
$this.data("XHR", true); $this.data("XHR", true);
@@ -2462,12 +2457,10 @@ $(function () {
$(document).on("click", "[data-action=top-bar-notifications]", function (e) { $(document).on("click", "[data-action=top-bar-notifications]", function (e) {
var _this = this; var _this = this;
var $this = $(this); var $this = $(this);
var $container = $(".top-bar-notifications-container", $this); var $container = $(".top-bar-notifications-container", $this);
var $list = $(".top-bar-notifications-list", $this); var $list = $(".top-bar-notifications-list", $this);
var $ul = $("ul", $list); var $ul = $("ul", $list);
var $loading = $(".loading", $container); var $loading = $(".loading", $container);
if ($this.data("XHR")) { if ($this.data("XHR")) {
return; return;
} else { } else {
@@ -2477,7 +2470,6 @@ $(function () {
message: PF.fn._s("loading"), message: PF.fn._s("loading"),
}); });
} }
$.ajax({ $.ajax({
type: "POST", type: "POST",
data: { data: {
@@ -2802,6 +2794,44 @@ $(function () {
} }
); );
} }
$(document).on("change keyup", CHV.fn.ctaForm.selectors.rows + " input[name^='cta-']", function() {
CHV.fn.ctaForm.update($(this));
});
$(document).on("click", CHV.fn.ctaForm.selectors.rows + " [data-action=cta-add]", function () {
CHV.fn.ctaForm.insert($(this));
});
$(document).on("click", CHV.fn.ctaForm.selectors.rows + " [data-action=cta-remove]", function () {
CHV.fn.ctaForm.remove($(this));
if(CHV.fn.ctaForm.array.length == 0) {
$(CHV.fn.ctaForm.selectors.root + " " + CHV.fn.ctaForm.selectors.enable).prop("checked", false).trigger("change");
}
});
$(document).on("change", CHV.fn.ctaForm.selectors.root + " " + CHV.fn.ctaForm.selectors.enable, function() {
let $combo = $(CHV.fn.ctaForm.selectors.combo, CHV.fn.ctaForm.selectors.root);
let checked = $(this).is(":checked");
$combo.toggleClass("soft-hidden", !checked);
if(checked) {
if(CHV.fn.ctaForm.array.length == 0) {
CHV.fn.ctaForm.add();
}
CHV.fn.ctaForm.render();
}
CHV.fn.ctaForm.setEnable(checked ? 1 : 0);
});
$(document).on("change keyup", CHV.fn.ctaForm.selectors.root + " input[name^='cta-icon_']", function() {
let $row = CHV.fn.ctaForm.getRow($(this));
let $icon = $row.find("label[for^='cta-icon_'] [data-content=icon]");
$icon.removeClass();
let iconClass = CHV.fn.ctaForm.getIconClass($(this).val());
$icon.addClass(iconClass);
});
}); });
if (typeof CHV == "undefined") { if (typeof CHV == "undefined") {
@@ -2809,13 +2839,128 @@ if (typeof CHV == "undefined") {
obj: {}, obj: {},
fn: {}, fn: {},
str: {}, str: {},
}; }
} }
if (window.opener) { if (window.opener) {
CHV.obj.opener = { CHV.obj.opener = {
uploadPlugin: {}, uploadPlugin: {},
}; }
}
CHV.fn.ctaButtons = {
selectors: {
container: "[data-contains=cta-album]",
},
render: function(html="") {
$(this.selectors.container).each(function() {
$(this).html(html);
});
}
}
CHV.fn.ctaForm = {
enable: 0,
array: [],
selectors: {
root: "#cta-form",
rows: "#cta-rows",
enable: "#cta-enable",
template: "#cta-row-template",
combo: "#cta-combo",
row: ".cta-row"
},
update: function($atElement) {
let pos = this.getPos($atElement);
let key = $atElement.attr("name").match(/cta-(.*)?_\d+/)[1]
this.array[pos-1][key] = $atElement.val();
},
add: function(label="", icon="", href="") {
this.array.push(this.getRowObject(label, icon, href));
this.render();
},
insert: function($atElement) {
let pos = this.getPos($atElement);
this.array.splice(pos, 0, this.getRowObject());
this.render();
},
remove: function($atElement) {
let pos = this.getPos($atElement);
this.array.splice(pos-1, 1);
this.render();
},
getRowObject: function(label="", icon="", href="") {
return {
"label": label,
"icon": icon,
"href": href
}
},
getIconClass: function(icon) {
if(!/\s/g.test(icon)) {
return "fa-solid fa-" + icon;
}
return icon;
},
getRow: function($element) {
return $element.closest(this.selectors.row);
},
getPos: function($element) {
return this.getRow($element).data("pos");
},
getTemplateHtml: function() {
return $(this.selectors.template).html();
},
getRowHtml: function(pos, data) {
return this.getTemplateHtml()
.replaceAll(/%pos%/g, pos)
.replaceAll(/%label%/g, data.label)
.replaceAll(/%href%/g, data.href)
.replaceAll(/%icon%/g, data.icon)
.replaceAll(
/%iconClass%/g,
this.getIconClass(data.icon)
);
},
render: function() {
let $ctaForm = $(this.selectors.root);
let $ctaRows = $ctaForm.find(this.selectors.rows);
let $this = this;
this.destroy();
$.each(this.array, function(index, data) {
$ctaRows.append($this.getRowHtml(index+1, data));
});
this.setEnable(this.enable);
$ctaRows.sortable({
cursor: "grabbing",
axis: "y",
update: function() {
let array = [];
$(this).find($this.selectors.row).each(function() {
let pos = $this.getPos($(this));
array.push($this.array[pos-1]);
});
$this.array = array;
$this.render();
}
});
},
setEnable: function(integer) {
let $ctaRows = $(this.selectors.rows, this.selectors.root);
this.enable = integer;
let enable = this.enable === 1;
$('input[data-required]', $ctaRows).each(function() {
$(this).attr("required", enable);
});
},
destroy: function() {
let $ctaForm = $(this.selectors.root);
let $ctaRows = $ctaForm.find(this.selectors.rows);
try {
$ctaRows.sortable("destroy");
} catch(e) {}
$ctaRows.empty();
}
} }
CHV.fn.album = { CHV.fn.album = {
@@ -2843,7 +2988,7 @@ CHV.fn.album = {
$embed_codes.removeClass("soft-hidden"); $embed_codes.removeClass("soft-hidden");
} }
}); });
} },
} }
CHV.fn.modal = { CHV.fn.modal = {
@@ -2910,6 +3055,7 @@ CHV.fn.listingViewer = {
"KeyF": "flag", "KeyF": "flag",
"KeyE": "edit", "KeyE": "edit",
"KeyM": "move", "KeyM": "move",
"KeyA": "create-album",
"KeyO": "approve", "KeyO": "approve",
"Delete": "delete", "Delete": "delete",
"Escape": "close", "Escape": "close",
@@ -2920,6 +3066,7 @@ CHV.fn.listingViewer = {
keymap: { keymap: {
select: [".", PF.fn._s("Toggle select")], select: [".", PF.fn._s("Toggle select")],
like: ["L", PF.fn._s("Like")], like: ["L", PF.fn._s("Like")],
"create-album": ["A", PF.fn._s("Create album")],
flag: ["F", PF.fn._s("Toggle flag")], flag: ["F", PF.fn._s("Toggle flag")],
edit: ["E", PF.fn._s("Edit")], edit: ["E", PF.fn._s("Edit")],
move: ["M", PF.fn._s("Album")], move: ["M", PF.fn._s("Album")],
@@ -2935,13 +3082,9 @@ CHV.fn.listingViewer = {
$item: null, $item: null,
show: function () { show: function () {
var paramsHidden = PF.fn.deparam(this.$item.closest(PF.obj.listing.selectors.content_listing_visible).data("params-hidden")); var paramsHidden = PF.fn.deparam(this.$item.closest(PF.obj.listing.selectors.content_listing_visible).data("params-hidden"));
var cover = paramsHidden && "is_animated" in paramsHidden ?
paramsHidden.is_animated :
0;
this.getEl("root") this.getEl("root")
.removeClass(this.selectors.rootHide.substring(1)) .removeClass(this.selectors.rootHide.substring(1))
.addClass(this.selectors.rootShow.substring(1)) .addClass(this.selectors.rootShow.substring(1));
.attr("data-cover", cover);
$("body").addClass(this.selectors.bodyShown.substring(1)); $("body").addClass(this.selectors.bodyShown.substring(1));
var hammertime = new Hammer($(CHV.fn.listingViewer.selectors.root).get(0), { var hammertime = new Hammer($(CHV.fn.listingViewer.selectors.root).get(0), {
direction: Hammer.DIRECTION_VERTICAL, direction: Hammer.DIRECTION_VERTICAL,
@@ -3035,24 +3178,11 @@ CHV.fn.listingViewer = {
} }
var $tools = this.getItem().find(".list-item-image-tools[data-action='list-tools']"); var $tools = this.getItem().find(".list-item-image-tools[data-action='list-tools']");
this.getEl("tools").append($tools.html()); this.getEl("tools").append($tools.html());
var flagAdded = false; let $this = this;
$.each($tools.find("[data-action]"), function (i, v) { this.getEl("tools").find(".list-tool[data-action]").each(function() {
var action = $(this).attr("data-action"); $(this).attr("title", $(this).attr("title") + " ("+$this.keymap[$(this).attr("data-action")][0]+")");
var keymap = _this.keymap[action];
if (typeof keymap == typeof undefined || (action === 'flag' && flagAdded)) {
return false;
}
$(
'<div class="viewer-kb-key" data-key="' + keymap[0] + '"><kbd>' +
keymap[0] +
"</kbd><span>" +
PF.fn._s(keymap[1]) +
"</span></div>"
).appendTo(_this.getEl("inputMap"));
if (action === "flag") {
flagAdded = true;
}
}); });
console.log('aaaa')
this.placeholderSizing(); this.placeholderSizing();
this.trickyLoad(); this.trickyLoad();
}, },
@@ -3066,6 +3196,7 @@ CHV.fn.listingViewer = {
var object = this.getObject(true); var object = this.getObject(true);
var template = this.getEl("template").html(); var template = this.getEl("template").html();
var matches = template.match(/%(\S+)%/g); var matches = template.match(/%(\S+)%/g);
console.log(object)
if (matches) { if (matches) {
$.each(matches, function (i, v) { $.each(matches, function (i, v) {
var handle = v.slice(1, -1).split("."); var handle = v.slice(1, -1).split(".");
@@ -4819,64 +4950,72 @@ CHV.fn.complete_image_edit = {
}, },
}; };
// Album edit CHV.fn.albumEdit = {
CHV.fn.before_album_edit = function (e) { before: function () {
var modal_source = "[data-before-fn='CHV.fn.before_album_edit']"; var modal_source = "[data-before-fn='CHV.fn.albumEdit.before']";
$("[data-action=album-switch]", modal_source).remove(); $("[data-action=album-switch]", modal_source).remove();
}; var $enableCta = $(CHV.fn.ctaForm.selectors.enable, modal_source);
CHV.fn.submit_album_edit = function () { CHV.fn.ctaForm.destroy();
var $modal = $(PF.obj.modal.selectors.root); if(CHV.fn.ctaForm.enable) {
$enableCta.prop("checked", true).trigger("change");
}
},
load: function() {
var $enableCta = $(CHV.fn.ctaForm.selectors.enable, PF.obj.modal.selectors.root);
if($enableCta.is(":checked")) {
$enableCta.prop("checked", true).trigger("change");
}
},
submit: function() {
var $modal = $(PF.obj.modal.selectors.root);
if (!$("[name=form-album-name]", $modal).val()) {
PF.fn.growl.call(PF.fn._s("You must enter the album name."));
$("[name=form-album-name]", $modal).highlight();
return false;
}
PF.obj.modal.form_data = {
action: "edit",
edit: "album",
editing: {
id: CHV.obj.resource.id,
name: $("[name=form-album-name]", $modal).val(),
privacy: $("[name=form-privacy]", $modal).val(),
description: $("[name=form-album-description]", $modal).val(),
cta_enable: + CHV.fn.ctaForm.enable,
cta: JSON.stringify(CHV.fn.ctaForm.array),
},
};
if (PF.obj.modal.form_data.editing.privacy == "password") {
PF.obj.modal.form_data.editing.password = $(
"[name=form-album-password]",
$modal
).val();
}
if (!$("[name=form-album-name]", $modal).val()) { return true;
PF.fn.growl.call(PF.fn._s("You must enter the album name.")); },
$("[name=form-album-name]", $modal).highlight(); complete: {
return false; success: function (XHR) {
} var album = XHR.responseJSON.album;
$("[data-text=album-name]").html(PF.fn.htmlEncode(album.name));
PF.obj.modal.form_data = { $("[data-text=album-description]").html(
action: "edit", PF.fn.htmlEncode(album.description)
edit: "album",
editing: {
id: CHV.obj.resource.id,
name: $("[name=form-album-name]", $modal).val(),
privacy: $("[name=form-privacy]", $modal).val(),
description: $("[name=form-album-description]", $modal).val(),
},
};
if (PF.obj.modal.form_data.editing.privacy == "password") {
PF.obj.modal.form_data.editing.password = $(
"[name=form-album-password]",
$modal
).val();
}
return true;
};
CHV.fn.complete_album_edit = {
success: function (XHR) {
var album = XHR.responseJSON.album;
$("[data-text=album-name]").html(PF.fn.htmlEncode(album.name));
$("[data-text=album-description]").html(
PF.fn.htmlEncode(album.description)
);
CHV.fn.resource_privacy_toggle(album.privacy);
var stock = CHV.obj.resource.type;
CHV.obj.resource.type = null;
CHV.fn.list_editor.updateItem($(PF.obj.listing.selectors.list_item, PF.obj.listing.selectors.content_listing_visible), XHR.responseJSON);
CHV.obj.resource.type = stock;
$("[data-modal]").each(function () {
$("option[value=" + album.id_encoded + "]", this).text(
album.name +
(album.privacy !== "public" ? " (" + PF.fn._s("private") + ")" : "")
); );
}); CHV.fn.resource_privacy_toggle(album.privacy);
var stock = CHV.obj.resource.type;
CHV.fn.common.updateDoctitle(album.name); CHV.obj.resource.type = null;
CHV.fn.list_editor.updateItem($(PF.obj.listing.selectors.list_item, PF.obj.listing.selectors.content_listing_visible), XHR.responseJSON);
PF.fn.growl.expirable(PF.fn._s("Album edited successfully.")); CHV.obj.resource.type = stock;
$("[data-modal]").each(function () {
$("option[value=" + album.id_encoded + "]", this).text(
album.name +
(album.privacy !== "public" ? " (" + PF.fn._s("private") + ")" : "")
);
});
CHV.fn.common.updateDoctitle(album.name);
CHV.fn.ctaButtons.render(album.cta_html);
PF.fn.growl.expirable(PF.fn._s("Album edited successfully."));
},
}, },
}; };

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@@ -677,8 +677,12 @@ $(function () {
return; return;
} }
var submit = event.key === 'Enter' && (event.ctrlKey || event.metaKey); var submit = event.key === 'Enter' && (event.ctrlKey || event.metaKey);
var $inputEnabledEnter = $this.is(":input.search, textarea") || $this.closest(".input-with-button").exists(); if($this.is("textarea") && !submit) {
if(!$inputEnabledEnter && $this.is(":input") && event.key === 'Enter' && !submit) { e.stopPropagation();
return;
}
var $inputEnabledEnter = $this.is(":input.search") || $this.closest(".input-with-button").exists();
if(!$inputEnabledEnter && $this.is(":input, textarea") && event.key === 'Enter' && !submit) {
e.stopPropagation(); e.stopPropagation();
e.preventDefault(); e.preventDefault();
return; return;
@@ -841,6 +845,7 @@ $(function () {
$pop_btn = $(this); $pop_btn = $(this);
$pop_box = $(".pop-box", $pop_btn); $pop_box = $(".pop-box", $pop_btn);
$pop_btn.addClass("opened"); $pop_btn.addClass("opened");
var marginBox = parseInt($pop_box.css("margin-right"));
$(".pop-box-inner", $pop_box).css("max-height", ""); $(".pop-box-inner", $pop_box).css("max-height", "");
@@ -863,14 +868,11 @@ $(function () {
$(".pop-box-header", $pop_box).remove(); $(".pop-box-header", $pop_box).remove();
$pop_box.css({ bottom: "" }); $pop_box.css({ bottom: "" });
} }
if ( if ($pop_box.hasClass("anchor-center")) {
$pop_box.hasClass("anchor-center") &&
typeof $pop_box.data("guidstr") == typeof undefined
) {
if (!PF.fn.isDevice(devices)) { if (!PF.fn.isDevice(devices)) {
$pop_box.css("margin-left", -($pop_box.width() / 2)); $pop_box.css("marginInlineStart", -($pop_box.outerWidth() / 2));
} else { } else {
$pop_box.css("margin-left", ""); $pop_box.css("marginInlineStart", "");
} }
} }
@@ -905,55 +907,32 @@ $(function () {
var callback = function ($pop_box) { var callback = function ($pop_box) {
if (!$pop_box.is(":visible")) { if (!$pop_box.is(":visible")) {
var guidstr = $pop_box.attr("data-guidstr");
$pop_box $pop_box
.css("marginLeft", "") .css("marginInlineStart", "")
.removeClass(guidstr)
.removeAttr("data-guidstr") .removeAttr("data-guidstr")
.closest(".pop-btn") .closest(".pop-btn")
.removeClass("opened"); .removeClass("opened");
if (typeof guidstr !== typeof undefined) {
$("style#" + guidstr).remove();
}
} else { } else {
if (!PF.fn.isDevice(devices)) { if (!PF.fn.isDevice(devices)) {
var posMargin = $pop_box.css("marginLeft"); var posMargin = $pop_box.css("marginInlineStart");
if (typeof posMargin !== typeof undefined) { if (typeof posMargin !== typeof undefined) {
posMargin = parseFloat(posMargin); posMargin = parseFloat(posMargin);
$pop_box.css("marginLeft", ""); $pop_box.css("marginInlineStart", "");
} }
var cutoff = $pop_box.getWindowCutoff(); var cutoff = $pop_box.getWindowCutoff();
if ( if (cutoff && cutoff.right && cutoff.right < posMargin) {
cutoff &&
(cutoff.left || cutoff.right) &&
cutoff.right < posMargin
) {
var guidstr = "guid-" + PF.fn.guid();
$pop_box $pop_box
.css("marginLeft", cutoff.right + "px") .css("marginInlineStart", cutoff.right + "px");
.addClass(guidstr)
.attr("data-guidstr", guidstr);
var posArrow =
$this.outerWidth() / 2 +
$this.offset().left -
$pop_box.offset().left;
var selectors = [];
$.each(["top", "bottom"], function (i, v) {
$.each(["after", "before"], function (ii, vv) {
selectors.push("." + guidstr + ".arrow-box-" + v + ":" + vv);
});
});
$(
'<style id="' +
guidstr +
'">' +
selectors.join() +
" { left: " +
posArrow +
"px; }</style>"
).appendTo("head");
} else { } else {
$pop_box.css("marginLeft", posMargin + "px"); $pop_box.css("marginInlineStart", posMargin + "px");
cutoff = $pop_box.getWindowCutoff();
if(cutoff && cutoff.left) {
let marginFix = -(Math.abs(posMargin) + Math.abs(cutoff.left) + marginBox/2);
$pop_box.css(
"marginInlineStart",
marginFix + "px"
);
}
} }
$(".antiscroll-wrap:not(.jsly):visible", $pop_box) $(".antiscroll-wrap:not(.jsly):visible", $pop_box)
.addClass("jsly") .addClass("jsly")
@@ -4272,9 +4251,9 @@ PF.fn.loading = {
$(".loading-indicator", $target.css("textAlign", "center")).css({ $(".loading-indicator", $target.css("textAlign", "center")).css({
position: options.position, position: options.position,
top: "50%", top: "50%",
left: "50%", insetInlineStart: "50%",
marginTop: -(PF.fn.loading.spin[options.size].blocksize / 2), marginTop: -(PF.fn.loading.spin[options.size].blocksize / 2),
marginLeft: -(PF.fn.loading.spin[options.size].blocksize / 2) marginInlineStart: -(PF.fn.loading.spin[options.size].blocksize / 2)
}); });
} }
if (options.valign == "center") { if (options.valign == "center") {
@@ -4287,7 +4266,7 @@ PF.fn.loading = {
$(".spinner", $target).css({ $(".spinner", $target).css({
top: PF.fn.loading.spin[options.size].blocksize / 2 + "px", top: PF.fn.loading.spin[options.size].blocksize / 2 + "px",
left: PF.fn.loading.spin[options.size].blocksize / 2 + "px" insetInlineStart: PF.fn.loading.spin[options.size].blocksize / 2 + "px"
}); });
}, },
fullscreen: function () { fullscreen: function () {

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -10,7 +10,7 @@ if (!defined('ACCESS') || !ACCESS) {
} ?> } ?>
<?php echo include_theme_file('mails/header'); ?> <?php echo include_theme_file('mails/header'); ?>
<?php _se('We received a request to change the email of your <a href="%u">%n</a> account at %w.', ['%u' => get_global('theme_mail')['user']['url'], '%n' => get_global('theme_mail')['user']['name'], '%w' => getSetting('website_name')]); ?> <?php _se('We received a request to change the email of your <a href="%u">%n</a> account at %w.', ['%u' => get_global('theme_mail')['user']['public_url'], '%n' => get_global('theme_mail')['user']['name'], '%w' => getSetting('website_name')]); ?>
<br><br> <br><br>
<?php _se('To complete the process you must <a href="%s">activate your email</a>.', get_global('theme_mail')['link']); ?> <?php _se('To complete the process you must <a href="%s">activate your email</a>.', get_global('theme_mail')['link']); ?>
<br><br> <br><br>

View File

@@ -9,7 +9,7 @@ if (!defined('ACCESS') || !ACCESS) {
} }
echo include_theme_file('mails/header'); echo include_theme_file('mails/header');
_se('We received a request to reset the password for your <a href="%u">%n</a> account.', ['%u' => get_global('theme_mail')['user']['url'], '%n' => get_global('theme_mail')['user']['name']]); ?> _se('We received a request to reset the password for your <a href="%u">%n</a> account.', ['%u' => get_global('theme_mail')['user']['public_url'], '%n' => get_global('theme_mail')['user']['name']]); ?>
<br><br> <br><br>
<?php _se('To reset your password <a href="%s">follow this link</a>.', get_global('theme_mail')['link']); ?> <?php _se('To reset your password <a href="%s">follow this link</a>.', get_global('theme_mail')['link']); ?>
<br><br> <br><br>

View File

@@ -12,7 +12,7 @@ _se('Hi %n, welcome to %w', ['%n' => get_global('theme_mail')['user']['name'], '
<br><br> <br><br>
<?php _se('Now that your account is ready you can enjoy uploading your images, creating albums and setting the privacy of your content as well as many more cool things that you will discover.'); ?> <?php _se('Now that your account is ready you can enjoy uploading your images, creating albums and setting the privacy of your content as well as many more cool things that you will discover.'); ?>
<br><br> <br><br>
<?php _se('By the way, here is you very own awesome profile page: <a href="%u">%n</a>. Go ahead and customize it, its yours!.', ['%u' => get_global('theme_mail')['user']['url'], '%n' => get_global('theme_mail')['user']['username']]); ?> <?php _se('By the way, here is you very own awesome profile page: <a href="%u">%n</a>. Go ahead and customize it, its yours!.', ['%u' => get_global('theme_mail')['user']['public_url'], '%n' => get_global('theme_mail')['user']['username']]); ?>
<br><br> <br><br>
<?php _se('Thank you for joining'); ?>, <?php _se('Thank you for joining'); ?>,
<br> <br>

View File

@@ -109,8 +109,8 @@ if (Login::isLoggedUser()) {
} }
echo strtr($uploaded_message, [ echo strtr($uploaded_message, [
'%s' => '<a data-link="upload-target">' . $iconUser . '<span data-text="upload-target"></span></a>', '%s' => '<a data-link="upload-target">' . $iconUser . '<span data-text="upload-target"></span></a>',
'%c' => '<a data-modal="form" data-target="form-uploaded-create-album">' . $iconAlbum . _s('create a new album') . '</a>', '%c' => '<a data-modal="form" data-target="form-uploaded-create-album">' . $iconAlbum . _s('create new %s', _s('album')) . '</a>',
'%m' => '<a data-modal="form" data-target="form-uploaded-move-album">' . $iconMove . _s('move it to an existing album') . '</a>', '%m' => '<a data-modal="form" data-target="form-uploaded-move-album">' . $iconMove . _s('move it to an existing %s', _s('album')) . '</a>',
]); ]);
?> ?>
</div> </div>
@@ -120,7 +120,7 @@ if (Login::isLoggedUser()) {
<?php <?php
$uploaded_message = _s('You can %c with the content just uploaded.') . ' ' . _s('You must %s or %l to save this content into your account.'); $uploaded_message = _s('You can %c with the content just uploaded.') . ' ' . _s('You must %s or %l to save this content into your account.');
echo strtr($uploaded_message, [ echo strtr($uploaded_message, [
'%c' => '<a data-modal="form" data-target="form-uploaded-create-album">' . $iconAlbum . _s('create a new album') . '</a>', '%c' => '<a data-modal="form" data-target="form-uploaded-create-album">' . $iconAlbum . _s('create new %s', _s('album')) . '</a>',
'%s' => '<a href="' . get_base_url("signup") . '">' . $iconSignup . _s('create an account') . '</a>', '%s' => '<a href="' . get_base_url("signup") . '">' . $iconSignup . _s('create an account') . '</a>',
'%l' => '<a href="' . get_base_url("login") . '">' . $iconSignin . _s('sign in') . '</a>' '%l' => '<a href="' . get_base_url("login") . '">' . $iconSignin . _s('sign in') . '</a>'
]); ]);
@@ -172,7 +172,7 @@ if (Login::isLoggedUser()) {
<div class="input-label upload-input-col center-box text-align-left"> <div class="input-label upload-input-col center-box text-align-left">
<label for="upload-category-id"><?php _se('Category'); ?></label> <label for="upload-category-id"><?php _se('Category'); ?></label>
<select name="upload-category-id" id="upload-category-id" class="text-input"> <select name="upload-category-id" id="upload-category-id" class="text-input">
<option value><?php _se('Select category'); ?></option> <option value><?php _se('Select %s', _s('category')); ?></option>
<?php <?php
foreach (Handler::var('categories') as $category) { foreach (Handler::var('categories') as $category) {
?> ?>
@@ -243,7 +243,7 @@ if (Login::isLoggedUser()) {
<?php <?php
} ?> } ?>
<label for="uploaded-embed-toggle"><?php _se('Embed codes'); ?></label> <label for="uploaded-embed-toggle"><?php _se('Embed codes'); ?></label>
<div class="c7 margin-bottom-10"> <div class="c8 margin-bottom-10">
<select name="uploaded-embed-toggle" id="uploaded-embed-toggle" class="text-input" data-combo="uploaded-embed-toggle-combo"> <select name="uploaded-embed-toggle" id="uploaded-embed-toggle" class="text-input" data-combo="uploaded-embed-toggle-combo">
<?php <?php
$tpl = Handler::cond('moderate_uploads') ? 'embed_unapproved_tpl' : 'embed_upload_tpl'; $tpl = Handler::cond('moderate_uploads') ? 'embed_unapproved_tpl' : 'embed_upload_tpl';
@@ -295,7 +295,7 @@ if (Login::isLoggedUser()) {
</li> </li>
</div> </div>
<div id="anywhere-upload-edit-item"> <div id="anywhere-upload-edit-item">
<span class="modal-box-title"><i class="fas fa-edit"></i> <?php _se('Edit'); ?></span> <span class="modal-box-title"><i class="fas fa-edit"></i> <?php _se('Edit %s', _s('upload')); ?></span>
<div class="modal-form"> <div class="modal-form">
<div class="image-preview"></div> <div class="image-preview"></div>
<div class="input-label"> <div class="input-label">
@@ -371,7 +371,7 @@ if (Login::isLoggedUser()) {
} ?> } ?>
<div class="input-label"> <div class="input-label">
<label for="form-description"><?php _se('Description'); ?> <span class="optional"><?php _se('optional'); ?></span></label> <label for="form-description"><?php _se('Description'); ?> <span class="optional"><?php _se('optional'); ?></span></label>
<textarea id="form-description" name="form-description" class="text-input no-resize" placeholder="<?php _se('Brief description of this image'); ?>"></textarea> <textarea id="form-description" name="form-description" class="text-input no-resize" placeholder="<?php _se('Brief description of this %s', _s('image')); ?>"></textarea>
</div> </div>
</div> </div>
</div> </div>
@@ -393,7 +393,7 @@ if (Login::isLoggedUser()) {
]; ];
?> ?>
<div data-modal="form-uploaded-create-album" class="hidden" data-is-xhr data-submit-fn="CHV.fn.submit_upload_edit" data-ajax-deferred="CHV.fn.complete_upload_edit"> <div data-modal="form-uploaded-create-album" class="hidden" data-is-xhr data-submit-fn="CHV.fn.submit_upload_edit" data-ajax-deferred="CHV.fn.complete_upload_edit">
<span class="modal-box-title"><i class="fas fa-images"></i> <?php _se('Create album'); ?></span> <span class="modal-box-title"><i class="fas fa-images"></i> <?php _se('Create %s', _s('album')); ?></span>
<p><?php <p><?php
_se('The uploaded content will be moved to this newly created album.'); _se('The uploaded content will be moved to this newly created album.');
echo ' '; echo ' ';
@@ -423,7 +423,7 @@ if (Login::isLoggedUser()) {
if (Login::isLoggedUser()) { if (Login::isLoggedUser()) {
?> ?>
<div data-modal="form-uploaded-move-album" class="hidden" data-is-xhr data-submit-fn="CHV.fn.submit_upload_edit" data-ajax-deferred="CHV.fn.complete_upload_edit"> <div data-modal="form-uploaded-move-album" class="hidden" data-is-xhr data-submit-fn="CHV.fn.submit_upload_edit" data-ajax-deferred="CHV.fn.complete_upload_edit">
<span class="modal-box-title"><i class="fas fa-exchange-alt"></i> <?php _se('Move to album'); ?></span> <span class="modal-box-title"><i class="fas fa-exchange-alt"></i> <?php _se('Move to %s', _s('album')); ?></span>
<p><?php _se('Select an existing album to move the uploaded content.'); ?></p> <p><?php _se('Select an existing album to move the uploaded content.'); ?></p>
<div class="modal-form"> <div class="modal-form">
<div name="move-existing-album" id="move-existing-album" data-view="switchable" class="c7 input-label"> <div name="move-existing-album" id="move-existing-album" data-view="switchable" class="c7 input-label">

View File

@@ -25,7 +25,7 @@ if (!defined('ACCESS') || !ACCESS) {
<span class="modal-box-title"><i class="fas fa-code"></i> <?php _se('Embed codes'); ?></span> <span class="modal-box-title"><i class="fas fa-code"></i> <?php _se('Embed codes'); ?></span>
<div class="image-preview"></div> <div class="image-preview"></div>
<div class="input-label margin-bottom-0"> <div class="input-label margin-bottom-0">
<div class="c7 margin-bottom-10"> <div class="c8 margin-bottom-10">
<select name="form-embed-toggle" id="form-embed-toggle" class="text-input" data-combo="form-embed-toggle-combo"> <select name="form-embed-toggle" id="form-embed-toggle" class="text-input" data-combo="form-embed-toggle-combo">
<?php <?php
foreach (get_global('embed_share_tpl') as $key => $value) { foreach (get_global('embed_share_tpl') as $key => $value) {

View File

@@ -1,6 +1,7 @@
<?php <?php
use Chevereto\Legacy\Classes\Login; use Chevereto\Legacy\Classes\Login;
use Chevereto\Legacy\G\Handler; use Chevereto\Legacy\G\Handler;
use function Chevereto\Legacy\get_checkbox_html;
use function Chevereto\Legacy\getSetting; use function Chevereto\Legacy\getSetting;
// @phpstan-ignore-next-line // @phpstan-ignore-next-line
@@ -12,23 +13,63 @@ if (!defined('ACCESS') || !ACCESS) {
<?php <?php
$label = 'form-album-name'; $label = 'form-album-name';
?> ?>
<label for="<?php echo $label; ?>"><?php _se('Album name'); ?></label> <label for="<?php echo $label; ?>"><?php _se('Name'); ?></label>
<input type="text" name="<?php echo $label; ?>" class="text-input" value="<?php echo $album["name"] ?? null; ?>" placeholder="<?php _se('Album name'); ?>" maxlength="<?php echo getSetting('album_name_max_length'); ?>" required autocomplete="off"> <input type="text" name="<?php echo $label; ?>" id="<?php echo $label; ?>" class="text-input" value="<?php echo $album["name"] ?? null; ?>" placeholder="<?php _se('Unnamed %s', _s('album')); ?>" maxlength="<?php echo getSetting('album_name_max_length'); ?>" required autocomplete="off">
<?php if (Login::isLoggedUser() && !isset($GLOBALS['theme_include_args'], $GLOBALS['theme_include_args']['album-switch'])) { </div>
<?php if ($GLOBALS['theme_include_args']['album-root'] ?? false) {
?> ?>
<span data-action="album-switch" class="btn-alt c7"><?php _se('or'); ?> <a data-switch="move-existing-album"><i class="fas fa-exchange-alt margin-right-5"></i><?php _se('move to existing album'); ?></a></span> <div id="cta-form">
<?php <div class="input-label">
<label><?php _se('Call to action'); ?></label>
<?php echo get_checkbox_html([
'name' => 'cta-enable',
'label' => _s('Enable call to action buttons'),
'checked' => Handler::var('album')['cta_enable'] ?? false,
]); ?>
</div>
<div id="cta-combo" class="soft-hidden">
<p class="font-size-small"><?php _se('Call to action buttons will be displayed on the %s page and in content belonging to.', _s('album')); ?> <?php _se('You can use %emoji% or %package% icons.', [
'%emoji%' => '<a href="https://unicode.org/emoji/charts/full-emoji-list.html" target="_blank"><span class="btn-icon">🙂 </span>Emoji</a>',
'%package%' => '<a href="https://fontawesome.com/search?o=r&m=free&s=solid" target="_blank"><i class="fa-solid fa-font-awesome btn-icon"></i>Font Awesome</a>',
]); ?></p>
<div id="cta-rows" class="position-relative"></div>
<template id="cta-row-template">
<div class="input-label cta-row" data-pos="%pos%">
<div class="overflow-hidden">
<i class="fa-solid fa-sort cursor-grab"></i>
<span class="input-label-label" title="Drag to sort"><?php _se('Call to action'); ?> #%pos%</span>
<button data-action="cta-add" class="btn btn-small default float-right margin-left-5"><span class="fa-solid fa-add"></span></button>
<button data-action="cta-remove" class="btn btn-small default float-right"><span class="fa-solid fa-trash-alt"></span></button>
</div>
<div class="overflow-auto">
<div class="grid-columns c4 phablet-c1 margin-right-10 phone-margin-bottom-10 phablet-margin-bottom-10 phone-margin-right-0 phablet-margin-right-0">
<label for="cta-label_%pos%"><?php _se('Label'); ?></label>
<input type="text" name="cta-label_%pos%" id="cta-label_%pos%" class="text-input" value="%label%" placeholder="<?php _se('Buy now'); ?>">
</div>
<div class="grid-columns c4 phablet-c1 margin-right-10 phone-margin-bottom-10 phablet-margin-bottom-10 phone-margin-right-0 phablet-margin-right-0">
<label for="cta-icon_%pos%"><?php _se('Icon'); ?> <i data-content="icon" class="%iconClass%"></i></label>
<input data-required type="text" name="cta-icon_%pos%" id="cta-icon_%pos%" title="Emoji / Font Awesome" class="text-input" value="%icon%" placeholder="emoji">
</div>
<div class="grid-columns c8 phablet-c1">
<label for="cta-href_%pos%">Href</label>
<input data-required pattern="(\w+):\/\/.+" type="text" name="cta-href_%pos%" id="cta-href_%pos%" class="text-input" value="%href%" placeholder="protocol://">
</div>
</div>
</div>
</template>
</div>
</div>
<?php
} ?> } ?>
</div>
<div class="input-label"> <div class="input-label">
<label for="form-album-description"><?php _se('Album description'); ?> <span class="optional"><?php _se('optional'); ?></span></label> <label for="form-album-description"><?php _se('Description'); ?> <span class="optional"><?php _se('optional'); ?></span></label>
<textarea id="form-album-description" name="form-album-description" class="text-input no-resize" placeholder="<?php _se('Brief description of this album'); ?>"><?php echo $album['description'] ?? null; ?></textarea> <textarea id="form-album-description" name="form-album-description" class="text-input no-resize" placeholder="<?php _se('Brief description of this %s', _s('album')); ?>"><?php echo $album['description'] ?? null; ?></textarea>
</div> </div>
<?php if (getSetting('website_privacy_mode') == 'public' or (getSetting('website_privacy_mode') == 'private' and getSetting('website_content_privacy_mode') == 'default')) { <?php if (getSetting('website_privacy_mode') == 'public' || (getSetting('website_privacy_mode') == 'private' && getSetting('website_content_privacy_mode') == 'default')) {
?> ?>
<div class="input-label overflow-auto"> <div class="input-label overflow-auto">
<div class="c7 grid-columns"> <div class="c8 grid-columns">
<label for="form-privacy"><?php _se('Album privacy'); ?></label> <label for="form-privacy"><?php _se('Privacy'); ?></label>
<select name="form-privacy" id="form-privacy" class="text-input" data-combo="form-privacy-combo" rel="template-tooltip" data-tiptip="right" data-title="<?php _se('Who can view this content'); ?>"> <select name="form-privacy" id="form-privacy" class="text-input" data-combo="form-privacy-combo" rel="template-tooltip" data-tiptip="right" data-title="<?php _se('Who can view this content'); ?>">
<?php <?php
$permissions = [ $permissions = [
@@ -46,8 +87,8 @@ if (!defined('ACCESS') || !ACCESS) {
<div id="form-privacy-combo"> <div id="form-privacy-combo">
<div data-combo-value="password" class="switch-combo<?php echo($album['privacy'] ?? null) !== 'password' ? ' soft-hidden' : null; ?>"> <div data-combo-value="password" class="switch-combo<?php echo($album['privacy'] ?? null) !== 'password' ? ' soft-hidden' : null; ?>">
<div class="input-label overflow-auto"> <div class="input-label overflow-auto">
<div class="c7 grid-columns"> <div class="c8 grid-columns">
<label for="form-album-password"><?php _se('Album password'); ?></label> <label for="form-album-password"><?php _se('Password'); ?></label>
<p></p> <p></p>
<input type="text" name="form-album-password" class="text-input" placeholder="<?php isset($album['password']) ? _se('Change password') : _se('Set password'); ?>" data-required<?php echo($album['privacy'] ?? null) == 'password' ? ' required' : null; ?>> <input type="text" name="form-album-password" class="text-input" placeholder="<?php isset($album['password']) ? _se('Change password') : _se('Set password'); ?>" data-required<?php echo($album['privacy'] ?? null) == 'password' ? ' required' : null; ?>>
</div> </div>

View File

@@ -14,7 +14,7 @@ if (!defined('ACCESS') || !ACCESS) {
$categories = Handler::var('categories'); $categories = Handler::var('categories');
array_unshift($categories, [ array_unshift($categories, [
'id' => null, 'id' => null,
'name' => _s('Select category'), 'name' => _s('Select %s', _s('category')),
'url_key' => null, 'url_key' => null,
'url' => null 'url' => null
]); ]);

View File

@@ -5,13 +5,13 @@ if (!defined('ACCESS') || !ACCESS) {
<div class="input-label c8"> <div class="input-label c8">
<label for="form-category-name"><?php _se('Name'); ?></label> <label for="form-category-name"><?php _se('Name'); ?></label>
<input type="text" id="form-category-name" name="form-category-name" class="text-input" value="" placeholder="<?php _se("Category name") ?>" required maxlength="32"> <input type="text" id="form-category-name" name="form-category-name" class="text-input" value="" placeholder="<?php _se('%s name', _s('Category')) ?>" required maxlength="32">
</div> </div>
<div class="input-label c8"> <div class="input-label c8">
<label for="form-category-url_key"><?php _se('URL key'); ?></label> <label for="form-category-url_key"><?php _se('URL key'); ?></label>
<input type="text" id="form-category-url_key" name="form-category-url_key" class="text-input" value="" placeholder="<?php _se("Category URL key") ?>" required maxlength="32" rel="template-tooltip" data-tiptip="right" data-title="<?php _se('Only letters, numbers, and hyphens'); ?>"> <input type="text" id="form-category-url_key" name="form-category-url_key" class="text-input" value="" placeholder="<?php _se('%s URL key', _s('Category')) ?>" required maxlength="32" rel="template-tooltip" data-tiptip="right" data-title="<?php _se('Only letters, numbers, and hyphens'); ?>">
</div> </div>
<div class="input-label"> <div class="input-label">
<label for="form-category-description"><?php _se('Description'); ?> <span class="optional"><?php _se('optional'); ?></span></label> <label for="form-category-description"><?php _se('Description'); ?> <span class="optional"><?php _se('optional'); ?></span></label>
<textarea id="form-category-description" name="form-category-description" class="text-input no-resize" placeholder="<?php _se('Brief description of this category'); ?>"></textarea> <textarea id="form-category-description" name="form-category-description" class="text-input no-resize" placeholder="<?php _se('Brief description of this %s', _s('category')); ?>"></textarea>
</div> </div>

View File

@@ -11,17 +11,14 @@ if (!defined('ACCESS') || !ACCESS) {
<div class="input-label"> <div class="input-label">
<label for="form-image-title"><?php _se('Title'); ?> <span class="optional"><?php _se('optional'); ?></span></label> <label for="form-image-title"><?php _se('Title'); ?> <span class="optional"><?php _se('optional'); ?></span></label>
<input type="text" id="form-image-title" name="form-image-title" class="text-input" value="<?php echo Handler::hasVar('image_safe_html') ? Handler::var('image_safe_html')["title"] : ''; ?>" placeholder="<?php _se('Untitled image'); ?>" maxlength="<?php echo getSetting('image_title_max_length'); ?>"> <input type="text" id="form-image-title" name="form-image-title" class="text-input" value="<?php echo Handler::hasVar('image_safe_html') ? Handler::var('image_safe_html')["title"] : ''; ?>" placeholder="<?php _se('Untitled %s', _s('image')); ?>" maxlength="<?php echo getSetting('image_title_max_length'); ?>">
</div> </div>
<?php <?php
if (!Handler::hasVar('image') || isset(Handler::var('image')['user'])) { if (!Handler::hasVar('image') || isset(Handler::var('image')['user'])) {
?> ?>
<div id="move-existing-album" data-view="switchable" class="c7 input-label"> <div id="move-existing-album" data-view="switchable" class="c8 input-label">
<?php include_theme_file("snippets/form_move_existing_album"); ?> <?php include_theme_file("snippets/form_move_existing_album"); ?>
</div> </div>
<div id="move-new-album" data-content="form-new-album" data-view="switchable" class="soft-hidden">
<?php include_theme_file("snippets/form_album"); ?>
</div>
<?php <?php
} }
?> ?>
@@ -43,5 +40,5 @@ if (!Handler::cond('allowed_nsfw_flagging')) {
?>><span class="no-select"><i class="fas fa-flag"></i> <?php _se('Flag not safe'); ?></span></label></span></div> ?>><span class="no-select"><i class="fas fa-flag"></i> <?php _se('Flag not safe'); ?></span></label></span></div>
<div class="input-label"> <div class="input-label">
<label for="form-image-description"><?php _se('Description'); ?> <span class="optional"><?php _se('optional'); ?></span></label> <label for="form-image-description"><?php _se('Description'); ?> <span class="optional"><?php _se('optional'); ?></span></label>
<textarea id="form-image-description" name="form-image-description" class="text-input no-resize" placeholder="<?php _se('Brief description of this image'); ?>"><?php echo Handler::var('image_safe_html')["description"] ?? ''; ?></textarea> <textarea id="form-image-description" name="form-image-description" class="text-input no-resize" placeholder="<?php _se('Brief description of this %s', _s('image')); ?>"><?php echo Handler::var('image_safe_html')["description"] ?? ''; ?></textarea>
</div> </div>

View File

@@ -8,7 +8,7 @@ if (!defined('ACCESS') || !ACCESS) {
die('This file cannot be directly accessed.'); die('This file cannot be directly accessed.');
} ?> } ?>
<?php $user_items_editor = get_global('user_items_editor') ?: Handler::var('user_items_editor'); ?> <?php $user_items_editor = get_global('user_items_editor') ?: Handler::var('user_items_editor'); ?>
<label for="form-album-id"><?php echo !isset($user_items_editor['album']) ? _s('Existing album') : _n('Album', 'Albums', 1); ?></label> <label for="form-album-id"><?php echo !isset($user_items_editor['album']) ? _s('Album') : _n('Album', 'Albums', 1); ?></label>
<select name="form-album-id" id="form-album-id" class="text-input"> <select name="form-album-id" id="form-album-id" class="text-input">
<?php <?php
foreach ($user_items_editor['user_albums'] ?? [] as $album) { foreach ($user_items_editor['user_albums'] ?? [] as $album) {
@@ -20,4 +20,3 @@ if (!defined('ACCESS') || !ACCESS) {
} }
?> ?>
</select> </select>
<span class="btn-alt c7"><?php _se('or'); ?> <a data-switch="move-new-album"><i class="fas fa-images margin-right-5"></i><?php _se('create new album'); ?></a></span>

View File

@@ -12,18 +12,18 @@ if (!defined('ACCESS') || !ACCESS) {
<?php <?php
$label = 'form-album-name'; $label = 'form-album-name';
?> ?>
<label for="<?php echo $label; ?>"><?php _se('Album name'); ?></label> <label for="<?php echo $label; ?>"><?php _se('Name'); ?></label>
<input type="text" name="<?php echo $label; ?>" class="text-input" value="" placeholder="<?php _se('Album name'); ?>" maxlength="<?php echo getSetting('album_name_max_length'); ?>" required autocomplete="off"> <input type="text" name="<?php echo $label; ?>" class="text-input" value="" placeholder="<?php _se('Unnamed %s', _s('album')); ?>" maxlength="<?php echo getSetting('album_name_max_length'); ?>" required autocomplete="off">
</div> </div>
<div class="input-label"> <div class="input-label">
<label for="form-album-description"><?php _se('Album description'); ?> <span class="optional"><?php _se('optional'); ?></span></label> <label for="form-album-description"><?php _se('Description'); ?> <span class="optional"><?php _se('optional'); ?></span></label>
<textarea id="form-album-description" name="form-album-description" class="text-input no-resize" placeholder="<?php _se('Brief description of this album'); ?>"></textarea> <textarea id="form-album-description" name="form-album-description" class="text-input no-resize" placeholder="<?php _se('Brief description of this %s', _s('album')); ?>"></textarea>
</div> </div>
<?php if (getSetting('website_privacy_mode') == 'public' or (getSetting('website_privacy_mode') == 'private' and getSetting('website_content_privacy_mode') == 'default')) { <?php if (getSetting('website_privacy_mode') == 'public' or (getSetting('website_privacy_mode') == 'private' and getSetting('website_content_privacy_mode') == 'default')) {
?> ?>
<div class="input-label overflow-auto"> <div class="input-label overflow-auto">
<div class="c7 grid-columns"> <div class="c8 grid-columns">
<label for="form-privacy"><?php _se('Album privacy'); ?></label> <label for="form-privacy"><?php _se('Privacy'); ?></label>
<select name="form-privacy" id="form-privacy" class="text-input" data-combo="form-privacy-combo" rel="template-tooltip" data-tiptip="right" data-title="<?php _se('Who can view this content'); ?>"> <select name="form-privacy" id="form-privacy" class="text-input" data-combo="form-privacy-combo" rel="template-tooltip" data-tiptip="right" data-title="<?php _se('Who can view this content'); ?>">
<?php <?php
$permissions = [ $permissions = [
@@ -44,8 +44,8 @@ if (!defined('ACCESS') || !ACCESS) {
<div id="form-privacy-combo"> <div id="form-privacy-combo">
<div data-combo-value="password" class="switch-combo soft-hidden"> <div data-combo-value="password" class="switch-combo soft-hidden">
<div class="input-label overflow-auto"> <div class="input-label overflow-auto">
<div class="c7 grid-columns"> <div class="c8 grid-columns">
<label for="form-album-password"><?php _se('Album password'); ?></label> <label for="form-album-password"><?php _se('Password'); ?></label>
<input type="text" name="form-album-password" class="text-input" value="" placeholder="<?php _se('Set password'); ?>"> <input type="text" name="form-album-password" class="text-input" value="" placeholder="<?php _se('Set password'); ?>">
</div> </div>
</div> </div>

View File

@@ -11,9 +11,6 @@ if (!defined('ACCESS') || !ACCESS) {
var divLoading = document.createElement("div"); var divLoading = document.createElement("div");
var panelThumbs = document.querySelector('.panel-thumbs'); var panelThumbs = document.querySelector('.panel-thumbs');
var panelThumbList = document.querySelectorAll('.panel-thumb-list > li'); var panelThumbList = document.querySelectorAll('.panel-thumb-list > li');
divLoading.id = "image-viewer-loading";
divLoading.className = "soft-hidden";
document.getElementById("image-viewer").appendChild(divLoading);
image_viewer_full_fix = function() { image_viewer_full_fix = function() {
var viewer = document.getElementById("image-viewer"), var viewer = document.getElementById("image-viewer"),
container = document.getElementById("image-viewer-container"), container = document.getElementById("image-viewer-container"),
@@ -41,6 +38,7 @@ if (!defined('ACCESS') || !ACCESS) {
if (panelThumbList.length > 0) { if (panelThumbList.length > 0) {
canvas.height -= panelThumbs.offsetHeight; canvas.height -= panelThumbs.offsetHeight;
} }
canvas.height -= 60;
if(1/ratio < 2) { if(1/ratio < 2) {
container.style.height = canvas.height + "px"; container.style.height = canvas.height + "px";
} }

View File

@@ -40,8 +40,8 @@ foreach ($tabs as $tab) {
<?php <?php
if (in_array(get_route_name(), ['user', 'album']) and (array_key_exists('tools_available', $tab) ? in_array('album', $tab['tools_available']) : true)) { if (in_array(get_route_name(), ['user', 'album']) and (array_key_exists('tools_available', $tab) ? in_array('album', $tab['tools_available']) : true)) {
?> ?>
<li class="with-icon"><a data-action="create-album"><span class="btn-icon fas fa-images"></span><?php _se('Create album'); ?><kbd>A</kbd></a></li> <li class="with-icon"><a data-action="create-album"><span class="btn-icon fas fa-images"></span><?php _se('Create %s', _s('album')); ?><kbd>A</kbd></a></li>
<li class="with-icon"><a data-action="move"><span class="btn-icon fas fa-exchange-alt"></span><?php _se('Move to album'); ?><kbd>M</kbd></a></li> <li class="with-icon"><a data-action="move"><span class="btn-icon fas fa-exchange-alt"></span><?php _se('Move to %s', _s('album')); ?><kbd>M</kbd></a></li>
<?php <?php
} ?> } ?>
<?php <?php
@@ -50,7 +50,7 @@ foreach ($tabs as $tab) {
<?php <?php
if ((array_key_exists('tools_available', $tab) ? in_array('category', $tab['tools_available']) : true) and Handler::var('categories')) { if ((array_key_exists('tools_available', $tab) ? in_array('category', $tab['tools_available']) : true) and Handler::var('categories')) {
?> ?>
<li class="with-icon"><a data-action="assign-category"><span class="btn-icon fas fa-columns"></span><?php _se('Assign category'); ?><kbd>C</kbd></a></li> <li class="with-icon"><a data-action="assign-category"><span class="btn-icon fas fa-columns"></span><?php _se('Assign %s', _s('category')); ?><kbd>C</kbd></a></li>
<?php <?php
} ?> } ?>
<?php <?php

View File

@@ -7,7 +7,7 @@ if (!defined('ACCESS') || !ACCESS) {
} ?> } ?>
<div data-modal="new-album" class="hidden" data-is-xhr data-submit-fn="CHV.fn.submit_create_album" data-ajax-deferred="CHV.fn.complete_create_album"> <div data-modal="new-album" class="hidden" data-is-xhr data-submit-fn="CHV.fn.submit_create_album" data-ajax-deferred="CHV.fn.complete_create_album">
<span class="modal-box-title"><i class="fas fa-images"></i> <?php _se('Create new album'); ?></span> <span class="modal-box-title"><i class="fas fa-images"></i> <?php _se('Create new %s', _s('album')); ?></span>
<div class="modal-form"> <div class="modal-form">
<?php include_theme_file("snippets/form_album.php", ['album-switch' => false]); ?> <?php include_theme_file("snippets/form_album.php", ['album-switch' => false]); ?>
</div> </div>

View File

@@ -7,7 +7,7 @@ if (!defined('ACCESS') || !ACCESS) {
} ?> } ?>
<div data-modal="new-sub-album" class="hidden" data-is-xhr data-submit-fn="CHV.fn.submit_create_album" data-ajax-deferred="CHV.fn.complete_create_album"> <div data-modal="new-sub-album" class="hidden" data-is-xhr data-submit-fn="CHV.fn.submit_create_album" data-ajax-deferred="CHV.fn.complete_create_album">
<h1><i class="fas fa-level-down-alt"></i> <?php _se('Create sub album'); ?></h1> <h1><i class="fas fa-level-down-alt"></i> <?php _se('Create %s', _s('sub %s', _s('album'))); ?></h1>
<div class="modal-form"> <div class="modal-form">
<?php include_theme_file("snippets/form_sub_album.php", ['album-switch' => false]); ?> <?php include_theme_file("snippets/form_sub_album.php", ['album-switch' => false]); ?>
</div> </div>

View File

@@ -7,9 +7,9 @@ if (!defined('ACCESS') || !ACCESS) {
die('This file cannot be directly accessed.'); die('This file cannot be directly accessed.');
} ?> } ?>
<div id="form-modal" class="hidden" data-before-fn="CHV.fn.before_album_edit" data-submit-fn="CHV.fn.submit_album_edit" data-ajax-deferred="CHV.fn.complete_album_edit" data-ajax-url="<?php echo get_base_url("json"); ?>"> <div id="form-modal" class="hidden" data-load-fn="CHV.fn.albumEdit.load" data-before-fn="CHV.fn.albumEdit.before" data-submit-fn="CHV.fn.albumEdit.submit" data-ajax-deferred="CHV.fn.albumEdit.complete" data-ajax-url="<?php echo get_base_url("json"); ?>">
<h1><?php _se('Edit'); ?></h1> <span class="modal-box-title"><i class="fas fa-edit"></i> <?php _se('Edit %s', _s('album')); ?></span>
<div class="modal-form"> <div class="modal-form">
<?php include_theme_file('snippets/form_album'); ?> <?php include_theme_file('snippets/form_album', ['album-root' => true]); ?>
</div> </div>
</div> </div>

View File

@@ -1,4 +1,6 @@
<?php <?php
use function Chevereto\Legacy\adjustBrightness;
use function Chevereto\Legacy\G\is_valid_hex_color; use function Chevereto\Legacy\G\is_valid_hex_color;
use function Chevereto\Legacy\getSetting; use function Chevereto\Legacy\getSetting;
@@ -6,13 +8,6 @@ use function Chevereto\Legacy\getSetting;
if (!defined('ACCESS') || !ACCESS) { if (!defined('ACCESS') || !ACCESS) {
die('This file cannot be directly accessed.'); die('This file cannot be directly accessed.');
} ?> } ?>
<?php
$default_color = '#00A7DA';
$color = getSetting('theme_main_color');
if (!is_string($color) || !is_valid_hex_color($color)) {
$color = $default_color;
}
?>
<style> <style>
.palette-dark:root{ .palette-dark:root{
--alertAccent: hsl(48, 89%, 50%); --alertAccent: hsl(48, 89%, 50%);
@@ -21,12 +16,8 @@ if (!defined('ACCESS') || !ACCESS) {
--bodyBackground: hsl(245, 9%, 18%); --bodyBackground: hsl(245, 9%, 18%);
--bodyEmpty: hsl(245, 10%, 22%); --bodyEmpty: hsl(245, 10%, 22%);
--bodySeparator: var(--bodyEmpty); --bodySeparator: var(--bodyEmpty);
--bodyText: hsl(0, 0%, 80%); --bodyText: hsl(245, 5%, 80%);
--bodyTextSubtle: hsl(245, 5%, 45%); --bodyTextSubtle: hsl(245, 5%, 45%);
--buttonAccentBackground: hsl(245, 10%, 10%);
--buttonAccentHoverBackground: hsl(245, 10%, 5%);
--buttonAccentHoverText: var(--bodyText);
--buttonAccentText: var(--bodyText);
--buttonDefaultBackground: var(--bodyEmpty); --buttonDefaultBackground: var(--bodyEmpty);
--buttonDefaultHoverBackground: hsl(245, 5%, 10%); --buttonDefaultHoverBackground: hsl(245, 5%, 10%);
--buttonDefaultHoverText: var(--colorAccent); --buttonDefaultHoverText: var(--colorAccent);
@@ -36,7 +27,7 @@ if (!defined('ACCESS') || !ACCESS) {
--inputText: var(--bodyText); --inputText: var(--bodyText);
--menuBackground: hsla(245, 10%, 8%, 80%); --menuBackground: hsla(245, 10%, 8%, 80%);
--menuItemHoverBackground: var(--colorAccent); --menuItemHoverBackground: var(--colorAccent);
--menuItemHoverText: #FFF; --menuItemHoverText: hsl(245, 5%, 100%);
--menuItemText: var(--bodyText); --menuItemText: var(--bodyText);
--menuSeparator: var(--bodyBackground); --menuSeparator: var(--bodyBackground);
--menuText: var(--bodyText); --menuText: var(--bodyText);
@@ -46,8 +37,6 @@ if (!defined('ACCESS') || !ACCESS) {
--topBarText: var(--bodyText); --topBarText: var(--bodyText);
--viewerBackground: hsl(245, 5%, 12%); --viewerBackground: hsl(245, 5%, 12%);
} }
/* --topBarBackground: hsl(150, 25%, 70%);
*/
.palette-lush:root{ .palette-lush:root{
--alertAccent: hsl(48, 89%, 50%); --alertAccent: hsl(48, 89%, 50%);
--alertBackground: hsl(52, 100%, 90%); --alertBackground: hsl(52, 100%, 90%);
@@ -85,7 +74,6 @@ if (!defined('ACCESS') || !ACCESS) {
--topBarBackground: var(--bodyBackground); --topBarBackground: var(--bodyBackground);
--topBarText: var(--bodyText); --topBarText: var(--bodyText);
--listItemText: var(--bodyBackground); --listItemText: var(--bodyBackground);
/* --viewerBackground: hsl(150, 25%, 85%); */
} }
.palette-graffiti:root { .palette-graffiti:root {
--alertAccent: hsl(48, 89%, 50%); --alertAccent: hsl(48, 89%, 50%);
@@ -159,7 +147,6 @@ if (!defined('ACCESS') || !ACCESS) {
--topBarBackground: var(--bodyBackground); --topBarBackground: var(--bodyBackground);
--topBarText: var(--bodyText); --topBarText: var(--bodyText);
--listItemText: var(--bodyBackground); --listItemText: var(--bodyBackground);
/* --viewerBackground: hsl(15, 100%, 96%); */
} }
.palette-cheers:root{ .palette-cheers:root{
--alertAccent: hsl(48, 89%, 50%); --alertAccent: hsl(48, 89%, 50%);
@@ -198,7 +185,6 @@ if (!defined('ACCESS') || !ACCESS) {
--topBarBackground: var(--bodyBackground); /* hsl(42, 100%, 70%) */ --topBarBackground: var(--bodyBackground); /* hsl(42, 100%, 70%) */
--topBarText: var(--bodyText); --topBarText: var(--bodyText);
--listItemText: var(--bodyBackground); --listItemText: var(--bodyBackground);
/* --viewerBackground: hsl(42, 80%, 85%); */
} }
.palette-imgur:root { .palette-imgur:root {
--alertAccent: var(--colorAccent); --alertAccent: var(--colorAccent);
@@ -309,3 +295,17 @@ if (!defined('ACCESS') || !ACCESS) {
--viewerBackground: linear-gradient(180deg, rgba(26,28,35,1) 0%, rgba(11,13,18,1) 100%); --viewerBackground: linear-gradient(180deg, rgba(26,28,35,1) 0%, rgba(11,13,18,1) 100%);
} }
</style> </style>
<?php
// $color = getSetting('theme_main_color');
// if ($color !== null && is_valid_hex_color($color)) {
// $colorStrong = adjustBrightness($color, -0.1);
// echo <<<STYLE
// <style>
// :root {
// --colorAccent: {$color};
// --colorAccentStrong: {$colorStrong};
// }
// </style>
// STYLE;
// }
?>

View File

@@ -11,7 +11,7 @@ if (!defined('ACCESS') || !ACCESS) {
global $modal_dealing_with, $disable_album_toggle; global $modal_dealing_with, $disable_album_toggle;
$user_items_editor = Handler::var('user_items_editor') ?? false; $user_items_editor = Handler::var('user_items_editor') ?? false;
$modal_dealing_with = $user_items_editor["type"] ?? 'none'; $modal_dealing_with = $user_items_editor["type"] ?? 'none';
$modal_dealing_with_type = $modal_dealing_with == 'images' ? 'image' : 'album';
if (!in_array($modal_dealing_with, ["images", "albums"])) { if (!in_array($modal_dealing_with, ["images", "albums"])) {
$modal_dealing_with = "images"; $modal_dealing_with = "images";
} }
@@ -21,7 +21,7 @@ if ($user_items_editor !== false) {
<span class="modal-box-title"> <span class="modal-box-title">
<?php <?php
echo '<i class="fas fa-edit"></i> '; echo '<i class="fas fa-edit"></i> ';
_se('Edit'); _se('Edit %s', _s($modal_dealing_with_type));
if ($modal_dealing_with != 'images') { if ($modal_dealing_with != 'images') {
$disable_album_toggle = true; $disable_album_toggle = true;
} ?> } ?>
@@ -29,17 +29,14 @@ if ($user_items_editor !== false) {
<div class="image-preview"></div> <div class="image-preview"></div>
<div class="modal-form"> <div class="modal-form">
<?php <?php
include_theme_file('snippets/form_' . ($modal_dealing_with == 'images' ? 'image' : 'album')); ?> include_theme_file('snippets/form_' . $modal_dealing_with_type); ?>
</div> </div>
</div> </div>
<div data-modal="form-create-album" class="hidden"> <div data-modal="form-create-album" class="hidden">
<span class="modal-box-title"><i class="far fa-images"></i> <?php _se('Create album'); ?></span> <span class="modal-box-title"><i class="far fa-images"></i> <?php _se('Create %s', _s('album')); ?></span>
<div class="image-preview"></div> <div class="image-preview"></div>
<div class="modal-form"> <div class="modal-form">
<div id="move-existing-album" data-view="switchable" class="c7 input-label soft-hidden">
<?php include_theme_file("snippets/form_move_existing_album"); ?>
</div>
<div id="move-new-album" data-content="form-new-album" data-view="switchable"> <div id="move-new-album" data-content="form-new-album" data-view="switchable">
<?php <?php
include_theme_file("snippets/form_album"); ?> include_theme_file("snippets/form_album"); ?>
@@ -48,30 +45,23 @@ if ($user_items_editor !== false) {
</div> </div>
<div data-modal="form-move-single" class="hidden"> <div data-modal="form-move-single" class="hidden">
<span class="modal-box-title"><i class="fas fa-exchange-alt"></i> <?php _se('Move to album'); ?></span> <span class="modal-box-title"><i class="fas fa-exchange-alt"></i> <?php _se('Move to %s', _s('album')); ?></span>
<div class="image-preview"></div> <div class="image-preview"></div>
<div class="modal-form"> <div class="modal-form">
<div id="move-existing-album" data-view="switchable" class="c7 input-label"> <div id="move-existing-album" data-view="switchable" class="c8 input-label">
<?php include_theme_file("snippets/form_move_existing_album"); ?> <?php include_theme_file("snippets/form_move_existing_album"); ?>
</div> </div>
<div id="move-new-album" data-content="form-new-album" data-view="switchable" class="soft-hidden">
<?php
$disable_album_toggle = false;
include_theme_file("snippets/form_album"); ?>
</div>
</div> </div>
</div> </div>
<div data-modal="form-move-multiple" class="hidden"> <div data-modal="form-move-multiple" class="hidden">
<span class="modal-box-title"><i class="fas fa-exchange-alt"></i> <?php _se('Move to album'); ?></span> <span class="modal-box-title"><i class="fas fa-exchange-alt"></i> <?php _se('Move to %s', _s('album')); ?></span>
<div class="image-preview"></div> <div class="image-preview"></div>
<div class="modal-form"> <div class="modal-form">
<div id="move-existing-album" data-view="switchable" class="c7 input-label"> <div id="move-existing-album" data-view="switchable" class="c8 input-label">
<?php include_theme_file("snippets/form_move_existing_album"); ?> <?php include_theme_file("snippets/form_move_existing_album"); ?>
</div> </div>
<div id="move-new-album" data-content="form-new-album" data-view="switchable" class="soft-hidden">
<?php include_theme_file("snippets/form_album"); ?>
</div>
</div> </div>
</div> </div>
@@ -79,10 +69,10 @@ if ($user_items_editor !== false) {
} // full editor?> } // full editor?>
<div data-modal="form-assign-category" class="hidden"> <div data-modal="form-assign-category" class="hidden">
<span class="modal-box-title"><i class="fas fa-columns"></i> <?php _se('Assign category'); ?></span> <span class="modal-box-title"><i class="fas fa-columns"></i> <?php _se('Assign %s', _s('category')); ?></span>
<?php if (Handler::var('categories')) { ?> <?php if (Handler::var('categories')) { ?>
<div class="image-preview"></div> <div class="image-preview"></div>
<p><?php _se('All the selected images will be assigned to this category.'); ?></p> <p><?php _se('All the selected images will be assigned to this %s.', _s('category')); ?></p>
<div class="input-label c8"> <div class="input-label c8">
<?php include_theme_file('snippets/form_category'); ?> <?php include_theme_file('snippets/form_category'); ?>
</div> </div>

View File

@@ -6,7 +6,7 @@ if (!defined('ACCESS') || !ACCESS) {
die('This file cannot be directly accessed.'); die('This file cannot be directly accessed.');
} ?> } ?>
<script id="viewer-template" type="text/x-chv-template"> <script id="viewer-template" type="text/x-chv-template">
<div class="viewer viewer--hide list-item"> <div class="viewer viewer--hide list-item" data-cover="1">
<div class="viewer-content no-select"> <div class="viewer-content no-select">
<a href="%path_viewer%" target="_blank"><img class="viewer-src no-select animate" src="%display_url%" alt="%filename%" width="%width%" height="%height%"></a> <a href="%path_viewer%" target="_blank"><img class="viewer-src no-select animate" src="%display_url%" alt="%filename%" width="%width%" height="%height%"></a>
<div id="image-viewer-360" class="soft-hidden"></div> <div id="image-viewer-360" class="soft-hidden"></div>
@@ -16,7 +16,7 @@ if (!defined('ACCESS') || !ACCESS) {
<div class="viewer-wheel-next animate" data-action="viewer-next"><span class="icon fas fa-angle-right"></span></div> <div class="viewer-wheel-next animate" data-action="viewer-next"><span class="icon fas fa-angle-right"></span></div>
</div> </div>
<ul class="viewer-tools list-item-image-tools hover-display idle-display no-select" data-action="list-tools"> <ul class="viewer-tools list-item-image-tools hover-display idle-display no-select" data-action="list-tools">
<div data-action="viewer-close" title="<?php _se('Close'); ?>"> <div data-action="viewer-close" title="<?php _se('Close'); ?> (Esc)">
<span class="btn-icon fas fa-times"></span> <span class="btn-icon fas fa-times"></span>
</div> </div>
</ul> </ul>
@@ -26,25 +26,17 @@ if (!defined('ACCESS') || !ACCESS) {
<span class="user-image default-user-image"><span class="icon fas fa-user-circle"></span></span> <span class="user-image default-user-image"><span class="icon fas fa-user-circle"></span></span>
<img class="user-image" src="%user.avatar.url%" alt="%user.username%"> <img class="user-image" src="%user.avatar.url%" alt="%user.username%">
</a> </a>
<a href="%user.url%" class="user-name">%user.name_short_html%</a> </div>
<div class="viewer-owner header-content" data-contains="cta-album">
%album.cta_html%
</div> </div>
<div class="viewer-owner viewer-owner--guest"> <div class="viewer-owner viewer-owner--guest">
<div class="user-image default-user-image"><span class="icon fas fa-user-circle"></span></div> <div class="user-image default-user-image"><span class="icon fas fa-user-circle"></span></div>
<span class="user-name"><?php _se('Guest'); ?></span> <span class="user-name"><?php _se('Guest'); ?></span>
</div> </div>
<div class="viewer-kb phone-hide phablet-hide tablet-hide no-select"> <div class="viewer-kb phone-hide phablet-hide tablet-hide no-select display-none">
<div class="viewer-kb-input" title="<?php _se('Keyboard shortcuts'); ?>"> <div class="viewer-kb-input" title="<?php _se('Keyboard shortcuts'); ?>">
<div class="viewer-kb-key" data-key="◄"><kbd>◄</kbd><span><?php _se('Previous'); ?></span></div>
<div class="viewer-kb-key" data-key="►"><kbd>►</kbd><span><?php _se('Next'); ?></span></div>
<div class="viewer-kb-key" data-key="W"><kbd>W</kbd><kbd>R-click</kbd><span><?php _se('Zoom'); ?></span></div> <div class="viewer-kb-key" data-key="W"><kbd>W</kbd><kbd>R-click</kbd><span><?php _se('Zoom'); ?></span></div>
<?php
if (getSetting('enable_likes')) {
?>
<div class="viewer-kb-key" data-key="L"><kbd>L</kbd><span><?php _se('Like'); ?></span></div>
<?php
}
?>
<div class="viewer-kb-key" data-key="Esc"><kbd>Esc</kbd><span><?php _se('Close'); ?></span></div>
</div> </div>
</div> </div>
</div> </div>
@@ -53,22 +45,22 @@ if (!defined('ACCESS') || !ACCESS) {
</div> </div>
<div class="list-item-image-tools --bottom --right"> <div class="list-item-image-tools --bottom --right">
<?php <?php
if (getSetting('theme_show_social_share')) {
?>
<div class="list-item-share" data-action="share">
<span class="btn-icon btn-share fas fa-share-alt"></span>
</div>
<?php
}
if (getSetting('enable_likes')) { if (getSetting('enable_likes')) {
?> ?>
<div class="list-item-like" data-action="like"> <div class="list-item-like" data-action="like" title="<?php _se('Like'); ?> (L)">
<span class="btn-icon btn-like btn-liked fas fa-heart"></span> <span class="btn-icon btn-like btn-liked fas fa-heart"></span>
<span class="btn-icon btn-like btn-unliked far fa-heart"></span> <span class="btn-icon btn-like btn-unliked far fa-heart"></span>
</div> </div>
<?php <?php
} } ?>
?> <?php
if (getSetting('theme_show_social_share')) {
?>
<div class="list-item-share" data-action="share" title="<?php _se('Share'); ?> (S)">
<span class="btn-icon btn-share fas fa-share-alt"></span>
</div>
<?php
} ?>
</div> </div>
</div> </div>
</script> </script>

View File

@@ -137,16 +137,16 @@ body#upload {
.image-viewer .btn-download { .image-viewer .btn-download {
position: absolute; position: absolute;
top: 20px; top: 20px;
right: 20px; inset-inline-end: 20px;
} }
.viewer-loader, #image-viewer-loading { .viewer-loader, #image-viewer-loading {
width: 30px; width: 30px;
height: 30px; height: 30px;
position: absolute; position: absolute;
left: 50%; inset-inline-start: 50%;
top: 50%; top: 50%;
margin-left: -15px; margin-inline-start: -15px;
margin-top: -15px; margin-top: -15px;
border-radius: 100%; border-radius: 100%;
background: rgba(17, 17, 17, 0.9); background: rgba(17, 17, 17, 0.9);
@@ -322,7 +322,7 @@ body#upload {
width: 100%; width: 100%;
height: 100%; height: 100%;
top: 0; top: 0;
left: 0; inset-inline-start: 0;
overflow: hidden; overflow: hidden;
position: absolute; position: absolute;
} }
@@ -365,7 +365,7 @@ body#upload {
background: var(--buttonDefaultBackground); background: var(--buttonDefaultBackground);
color: var(--buttonDefaultText); color: var(--buttonDefaultText);
border-radius: 200px; border-radius: 200px;
left: -5px; inset-inline-start: -5px;
box-shadow: 1px 1px 4px 0px rgba(0, 0, 0, 0.5); box-shadow: 1px 1px 4px 0px rgba(0, 0, 0, 0.5);
} }
@@ -390,9 +390,9 @@ body#upload {
font-size: 5.36em; font-size: 5.36em;
width: 1em; width: 1em;
height: 1em; height: 1em;
left: 50%; inset-inline-start: 50%;
top: 50%; top: 50%;
margin-left: -0.5em; margin-inline-start: -0.5em;
margin-top: -0.5em; margin-top: -0.5em;
} }
@@ -409,7 +409,7 @@ body#upload {
.upload-box-queue .preview .canvas { .upload-box-queue .preview .canvas {
position: absolute; position: absolute;
top: 50%; top: 50%;
left: 50%; inset-inline-start: 50%;
} }
.upload-box-queue .progress { .upload-box-queue .progress {
@@ -426,6 +426,9 @@ body#upload {
width: 100%; width: 100%;
display: none; display: none;
} }
[dir="rtl"] .upload-box-queue .progress-bar {
float: left;
}
.upload-box-queue .progress-bar, .upload-box-queue .failed .result { .upload-box-queue .progress-bar, .upload-box-queue .failed .result {
-webkit-backdrop-filter: blur(15px); -webkit-backdrop-filter: blur(15px);
@@ -456,7 +459,7 @@ body#upload {
width: 100%; width: 100%;
font-size: 3.429em; font-size: 3.429em;
top: 50%; top: 50%;
left: 0; inset-inline-start: 0;
margin-top: -0.5em; margin-top: -0.5em;
text-shadow: none; text-shadow: none;
} }
@@ -538,14 +541,14 @@ body#upload [data-action="close-upload"] {
#change-background-cover { #change-background-cover {
position: absolute; position: absolute;
right: 0; inset-inline-end: 0;
top: 0; top: 0;
z-index: 500; z-index: 500;
} }
#user-background-upload { #user-background-upload {
top: 0; top: 0;
left: 0; inset-inline-start: 0;
width: 1px; width: 1px;
height: 1px; height: 1px;
} }
@@ -559,7 +562,7 @@ body#upload [data-action="close-upload"] {
#background-cover-src, #background-cover .loading-placeholder { #background-cover-src, #background-cover .loading-placeholder {
position: absolute; position: absolute;
top: 0; top: 0;
left: 0; inset-inline-start: 0;
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
@@ -605,7 +608,7 @@ body#upload [data-action="close-upload"] {
.list-item-image-tools { .list-item-image-tools {
overflow: hidden; overflow: hidden;
position: absolute; position: absolute;
right: 0; inset-inline-end: 0;
top: 0; top: 0;
transition: all 200ms ease-in-out; transition: all 200ms ease-in-out;
text-shadow: 1px 1px 5px rgba(0, 0, 0, .5); text-shadow: 1px 1px 5px rgba(0, 0, 0, .5);
@@ -617,8 +620,8 @@ body#upload [data-action="close-upload"] {
} }
.list-item-image-tools.--right { .list-item-image-tools.--right {
left: auto; inset-inline-start: auto;
right: 0; inset-inline-end: 0;
} }
.list-item-image-tools.--bottom { .list-item-image-tools.--bottom {
@@ -627,8 +630,8 @@ body#upload [data-action="close-upload"] {
} }
.list-item-image-tools.--left { .list-item-image-tools.--left {
right: auto; inset-inline-end: auto;
left: 0; inset-inline-start: 0;
} }
.list-item-image-tools>div { .list-item-image-tools>div {
@@ -636,8 +639,8 @@ body#upload [data-action="close-upload"] {
cursor: pointer; cursor: pointer;
position: relative; position: relative;
font-size: 1em; font-size: 1em;
right: 0; inset-inline-end: 0;
margin-left: auto; margin-inline-start: auto;
} }
html.--idle .list-item-image-tools>div[data-action="viewer-close"], .list-item-image-tools>div, .list-item-buttons>div { html.--idle .list-item-image-tools>div[data-action="viewer-close"], .list-item-image-tools>div, .list-item-buttons>div {
@@ -655,6 +658,9 @@ html.--idle .list-item-image-tools>div[data-action="viewer-close"], .list-item-i
.list-item-image-tools>div { .list-item-image-tools>div {
float: right; float: right;
} }
[dir="rtl"] .list-item-image-tools>div {
float: left;
}
.list-item-image-tools>div, .list-item-image-tools>div * { .list-item-image-tools>div, .list-item-image-tools>div * {
display: block; display: block;
@@ -665,6 +671,9 @@ html.--idle .list-item-image-tools>div[data-action="viewer-close"], .list-item-i
.list-item-image-tools>div span { .list-item-image-tools>div span {
float: right; float: right;
} }
[dir="rtl"] .list-item-image-tools>div span {
float: left;
}
.list-item-image-tools>div .label { .list-item-image-tools>div .label {
font-size: 0.86em; font-size: 0.86em;
@@ -680,8 +689,8 @@ html.--idle .list-item-image-tools>div[data-action="viewer-close"], .list-item-i
.list-item-image-tools>div .label { .list-item-image-tools>div .label {
text-transform: uppercase; text-transform: uppercase;
padding-left: 1em; padding-inline-start: 1em;
padding-right: 0; padding-inline-end: 0;
display: none; display: none;
height: 100%; height: 100%;
} }
@@ -777,7 +786,7 @@ body#moderate .list-item-like, body#moderate .viewer-kb-key[data-key="L"] {
.list-item-buttons { .list-item-buttons {
color: #fff; color: #fff;
position: absolute; position: absolute;
right: 0; inset-inline-end: 0;
bottom: 0; bottom: 0;
} }
@@ -786,7 +795,10 @@ body#moderate .list-item-like, body#moderate .viewer-kb-key[data-key="L"] {
cursor: pointer; cursor: pointer;
float: left; float: left;
font-size: 1em; font-size: 1em;
margin-left: -5px; margin-inline-start: -5px;
}
[dir="rtl"] .list-item-buttons>div {
float: right;
} }
.list-item .list-item-buttons>div:hover { .list-item .list-item-buttons>div:hover {
@@ -815,14 +827,14 @@ body#moderate .list-item-like, body#moderate .viewer-kb-key[data-key="L"] {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAACdCAMAAAAgwM7pAAAAAXNSR0IB2cksfwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAcVQTFRFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///9///+///+///+///+///+///9///8///1///5///9///9///u///f///+///+///+///9///q///z///9///+///9///8///9///+///+///+///+///8///w///9///+///3///8///9///2///9///7///t///+///8///b///9///9///M///+///y//+A///9///r///7///+///7///3///+///8//+////8//+q///8///+///z///+///+///9///6///m///7///j///7///9///+///+///9///9///6///+///+///+///7///V///+///9///5///9///+///+///8///9///6///8///+///9///4///+///+///+///+///4///9///5///+///v///7///9///8///o///9///9///8///6///y///9///0///+///x///+///6////////////vBUIqgAAAJd0Uk5TABQmNkZSWF5iCipmAiRKZAQuXCwYVDoMUBpgIiil+enVw7GJUBoujZkOCPf/45sMFnDPbEqhtcfZ714Qi9EgWI8adDgO21oGbmoEyxICcgw87Toe+1QEVgJg/RTru344CkIIRnrx55VmMNf1wT4GyaMoh+HlTJcyYt+pJrfTzd0ipyqtEECTXAp8aGQ2FIMWxRKzLrhG/4D2XIEAAAQlSURBVHiczZjnWxNBEMYPCCThgNC7IIKCyaCIdJCmgIooYkFCEwsqTRRQQREb9l7u7/UuuZhccm1vX5+H99Ne2d/d7uzOzowgmCgpOcWVmub2eNxpqa6U5CSzdw3lTXe5xTi5XeleNkpGZpYvnhKWLyszwzYmOydXnxJWbk62PU5ewpAShphnA5NfYIVRVJBvgckoNJibhLkqNJ2qomJ7GEXFRcacklL7HFEsLTHilHlYOKLoKdPnlNucnqh85br/w8yRSTr/VMI4rrA8CfNUxDTPUZXG2S6Dwe5aFWvXU6FTjigWxnLyHUx0RL7Y3WJrfxmpIMrJ4+GI4j9fkG3pN8zljvinHD6OKOaopjf1h3aUG14CmbwcUcwMgbL4QVkKx8uxhiLyefltH5ayAlwIkEsGcS6isNzy+Y7giGKSkIwBJQspGFAKZq6V2U7FgFKFNAwoDWN9xf6OTqFEeXAg2NBgkw0zP2xBwrYIbNPC3AjMseFcLcT5pyOPI9gBiTuyYUEELKzBBVqw0A8XjOLCY1jAjkshYEkNLs3CJX64VBSXHOPSdVwBAVfSEGBFFkWgso+AK0QJsNJYSN48RLFOFaR8CNe+isr9VQeqaw46636otu5wqOEPkKr6I0dZKQ3HGuWOx8MXTc0trW3tIVQHG6azK/QTJ7pjb3b39La29rFg/P3K19vrTrJ9PUGnBmTMwOCQySunB/ptgE4SVZ45a/rKMFHLOUvQSP/5CxavjF6ULThm46csdamV6PIVBOlql0waN3x8jQE1ETQkTZ6Y6tZ/YkQK6q6QkWmiJgaQ0BGMLH2tZoiqWMYmCLPnr+vcnQvSFNMGMNCNegreBHCEW0TVCM7kbZpn9jV6ukN011nPe1pLX6YFNotFdHSRJmKvlwLLzn5oZZHua26YuR9TrRI9cNpXozmihxCQsEbrGFA1amwbzIeUgSaJHqnNx0tPeEib1Ki2tmiNB7RKU2priTZ5QE+fRQa0Tc95QFGt0zQGFKCtPQaCDW2bhjGgJdrh6f5ia1BtvaQ2HlAzVaqtV683eEDRLcKnmE3LJ5gbkR3bUwgI5WrntGe9/41TkPY4WlkI7DrjDGkPSL/jI/twgDR++q3jIGLsneZSCWveOyPFCRVoCdfriSChn7ArB6MOc804fZDD4xGmHrMf/Xq3lYB9lIUjB+yfdB80VC10MnCUFOIzy4eNOSbpkW1ZpFm2ZSvx889YpqLLchpeb2mYGqIpi+R421Zy/GUnlK7rLhFVX+ftpOvCkFpAmLXzsrk6ayuUksbwt9ib3eO935/9YEVNhoosql16mn9GiixOLP6r9m14nvroX9mnjstnjUxXzPMUovaIfv8BgSQJhJIkEEqSQChJAqEkCYSSJBBKkkCo/wICDQ002SDzgxYkaIuANi0X5i8hpIpr8W0lCwAAAABJRU5ErkJggg=="); background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAACdCAMAAAAgwM7pAAAAAXNSR0IB2cksfwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAcVQTFRFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///9///+///+///+///+///+///9///8///1///5///9///9///u///f///+///+///+///9///q///z///9///+///9///8///9///+///+///+///+///8///w///9///+///3///8///9///2///9///7///t///+///8///b///9///9///M///+///y//+A///9///r///7///+///7///3///+///8//+////8//+q///8///+///z///+///+///9///6///m///7///j///7///9///+///+///9///9///6///+///+///+///7///V///+///9///5///9///+///+///8///9///6///8///+///9///4///+///+///+///+///4///9///5///+///v///7///9///8///o///9///9///8///6///y///9///0///+///x///+///6////////////vBUIqgAAAJd0Uk5TABQmNkZSWF5iCipmAiRKZAQuXCwYVDoMUBpgIiil+enVw7GJUBoujZkOCPf/45sMFnDPbEqhtcfZ714Qi9EgWI8adDgO21oGbmoEyxICcgw87Toe+1QEVgJg/RTru344CkIIRnrx55VmMNf1wT4GyaMoh+HlTJcyYt+pJrfTzd0ipyqtEECTXAp8aGQ2FIMWxRKzLrhG/4D2XIEAAAQlSURBVHiczZjnWxNBEMYPCCThgNC7IIKCyaCIdJCmgIooYkFCEwsqTRRQQREb9l7u7/UuuZhccm1vX5+H99Ne2d/d7uzOzowgmCgpOcWVmub2eNxpqa6U5CSzdw3lTXe5xTi5XeleNkpGZpYvnhKWLyszwzYmOydXnxJWbk62PU5ewpAShphnA5NfYIVRVJBvgckoNJibhLkqNJ2qomJ7GEXFRcacklL7HFEsLTHilHlYOKLoKdPnlNucnqh85br/w8yRSTr/VMI4rrA8CfNUxDTPUZXG2S6Dwe5aFWvXU6FTjigWxnLyHUx0RL7Y3WJrfxmpIMrJ4+GI4j9fkG3pN8zljvinHD6OKOaopjf1h3aUG14CmbwcUcwMgbL4QVkKx8uxhiLyefltH5ayAlwIkEsGcS6isNzy+Y7giGKSkIwBJQspGFAKZq6V2U7FgFKFNAwoDWN9xf6OTqFEeXAg2NBgkw0zP2xBwrYIbNPC3AjMseFcLcT5pyOPI9gBiTuyYUEELKzBBVqw0A8XjOLCY1jAjkshYEkNLs3CJX64VBSXHOPSdVwBAVfSEGBFFkWgso+AK0QJsNJYSN48RLFOFaR8CNe+isr9VQeqaw46636otu5wqOEPkKr6I0dZKQ3HGuWOx8MXTc0trW3tIVQHG6azK/QTJ7pjb3b39La29rFg/P3K19vrTrJ9PUGnBmTMwOCQySunB/ptgE4SVZ45a/rKMFHLOUvQSP/5CxavjF6ULThm46csdamV6PIVBOlql0waN3x8jQE1ETQkTZ6Y6tZ/YkQK6q6QkWmiJgaQ0BGMLH2tZoiqWMYmCLPnr+vcnQvSFNMGMNCNegreBHCEW0TVCM7kbZpn9jV6ukN011nPe1pLX6YFNotFdHSRJmKvlwLLzn5oZZHua26YuR9TrRI9cNpXozmihxCQsEbrGFA1amwbzIeUgSaJHqnNx0tPeEib1Ki2tmiNB7RKU2priTZ5QE+fRQa0Tc95QFGt0zQGFKCtPQaCDW2bhjGgJdrh6f5ia1BtvaQ2HlAzVaqtV683eEDRLcKnmE3LJ5gbkR3bUwgI5WrntGe9/41TkPY4WlkI7DrjDGkPSL/jI/twgDR++q3jIGLsneZSCWveOyPFCRVoCdfriSChn7ArB6MOc804fZDD4xGmHrMf/Xq3lYB9lIUjB+yfdB80VC10MnCUFOIzy4eNOSbpkW1ZpFm2ZSvx889YpqLLchpeb2mYGqIpi+R421Zy/GUnlK7rLhFVX+ftpOvCkFpAmLXzsrk6ayuUksbwt9ib3eO935/9YEVNhoosql16mn9GiixOLP6r9m14nvroX9mnjstnjUxXzPMUovaIfv8BgSQJhJIkEEqSQChJAqEkCYSSJBBKkkCo/wICDQ002SDzgxYkaIuANi0X5i8hpIpr8W0lCwAAAABJRU5ErkJggg==");
position: absolute; position: absolute;
top: 50%; top: 50%;
left: 50%; inset-inline-start: 50%;
} }
.list-item-play-gif { .list-item-play-gif {
scale: 0.6; scale: 0.6;
width: 72px; width: 72px;
height: 72px; height: 72px;
margin-left: -36px; margin-inline-start: -36px;
margin-top: -36px; margin-top: -36px;
background-position: 0 0; background-position: 0 0;
cursor: pointer; cursor: pointer;
@@ -844,7 +856,7 @@ body#moderate .list-item-like, body#moderate .viewer-kb-key[data-key="L"] {
.list-item-play-gif>span { .list-item-play-gif>span {
width: 66px; width: 66px;
height: 66px; height: 66px;
margin-left: -33px; margin-inline-start: -33px;
margin-top: -33px; margin-top: -33px;
background-position: 0 -73px; background-position: 0 -73px;
} }
@@ -857,7 +869,7 @@ body#moderate .list-item-like, body#moderate .viewer-kb-key[data-key="L"] {
.list-item-play-gif>i { .list-item-play-gif>i {
width: 32px; width: 32px;
height: 17px; height: 17px;
margin-left: -16px; margin-inline-start: -16px;
margin-top: -9px; margin-top: -9px;
background-position: 0 -140px; background-position: 0 -140px;
} }
@@ -1198,8 +1210,8 @@ body.split #home-cover-content, body.landing #home-cover-content {
#banner_image_image-viewer_top, #banner_image_image-viewer_foot { #banner_image_image-viewer_top, #banner_image_image-viewer_foot {
height: 90px; height: 90px;
margin-left: auto; margin-inline-start: auto;
margin-right: auto; margin-inline-end: auto;
} }
body#maintenance, body#consent-screen { body#maintenance, body#consent-screen {
@@ -1261,7 +1273,7 @@ body#maintenance, body#consent-screen {
height: 100%; height: 100%;
position: absolute; position: absolute;
top: 0; top: 0;
left: 0; inset-inline-start: 0;
background-position: center; background-position: center;
background-size: cover; background-size: cover;
} }
@@ -1288,7 +1300,7 @@ body#maintenance, body#consent-screen {
width: 2em; width: 2em;
height: auto; height: auto;
display: inline-block; display: inline-block;
margin-right: 10px; margin-inline-end: 10px;
vertical-align: top; vertical-align: top;
} }
@@ -1304,6 +1316,9 @@ body#maintenance, body#consent-screen {
float: left; float: left;
width: 20%; width: 20%;
} }
[dir="rtl"] .image-preview-container {
float: right;
}
.image-preview-container .empty { .image-preview-container .empty {
position: absolute; position: absolute;
@@ -1358,8 +1373,8 @@ body#maintenance, body#consent-screen {
} }
.content-password-gate .g-captcha>div { .content-password-gate .g-captcha>div {
margin-right: auto; margin-inline-end: auto;
margin-left: auto; margin-inline-start: auto;
} }
/* Home cover stuff */ /* Home cover stuff */
@@ -1367,15 +1382,15 @@ body#maintenance, body#consent-screen {
#home-cover-slideshow { #home-cover-slideshow {
position: absolute; position: absolute;
top: 0; top: 0;
right: 0; inset-inline-end: 0;
bottom: 0; bottom: 0;
left: 0; inset-inline-start: 0;
overflow: hidden; overflow: hidden;
} }
.home-cover-img { .home-cover-img {
position: absolute; position: absolute;
left: 0; inset-inline-start: 0;
top: 0; top: 0;
width: 100%; width: 100%;
height: 100%; height: 100%;
@@ -1570,7 +1585,7 @@ body.--viewer-shown {
.viewer-content { .viewer-content {
position: relative; position: relative;
top: 0; top: 0;
left: 0; inset-inline-start: 0;
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
@@ -1605,12 +1620,12 @@ body.--viewer-shown {
height: 2.4em; height: 2.4em;
line-height: 2.4em; line-height: 2.4em;
cursor: pointer; cursor: pointer;
right: -2.4em; inset-inline-end: -2.4em;
z-index: 500; z-index: 500;
} }
.viewer:hover .hover-display.viewer-close { .viewer:hover .hover-display.viewer-close {
right: 2px; inset-inline-end: 2px;
} }
.viewer-wheel>div { .viewer-wheel>div {
@@ -1628,12 +1643,12 @@ body.--viewer-shown {
} }
.viewer--nav-prev .viewer-wheel-prev { .viewer--nav-prev .viewer-wheel-prev {
left: 0; inset-inline-start: 0;
display: block; display: block;
} }
.viewer--nav-next .viewer-wheel-next { .viewer--nav-next .viewer-wheel-next {
right: 0; inset-inline-end: 0;
display: block; display: block;
} }
@@ -1659,11 +1674,26 @@ body.--viewer-shown {
} }
.viewer-owner { .viewer-owner {
width: 190px;
white-space: nowrap; white-space: nowrap;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
color: #fff; color: #fff;
float: left;
}
.viewer-owner .btn {
background: rgba(0, 0, 0, 0.3);
-webkit-backdrop-filter: blur(10px);
backdrop-filter: blur(10px);
color: inherit;
border-color: #FFF;
opacity: 0.8;
}
.viewer-owner .btn.btn-cta:hover {
background: #FFF;
color: #000;
border-color: transparent;
opacity: 1;
} }
.viewer-owner .user-image { .viewer-owner .user-image {
@@ -1671,7 +1701,6 @@ body.--viewer-shown {
width: 1em; width: 1em;
height: 1em; height: 1em;
vertical-align: bottom; vertical-align: bottom;
margin-right: 5px;
color: #fff; color: #fff;
} }
@@ -1699,7 +1728,7 @@ body.--viewer-shown {
} }
.viewer .viewer-kb { .viewer .viewer-kb {
padding-right: 190px; padding-inline-end: 190px;
} }
.device-mobile .viewer-kb { .device-mobile .viewer-kb {
@@ -1717,11 +1746,11 @@ body.--viewer-shown {
.viewer-kb-key { .viewer-kb-key {
display: inline-block; display: inline-block;
margin: 10px; margin: 10px;
margin-left: 0; margin-inline-start: 0;
} }
.viewer-kb-key:first-child { .viewer-kb-key:first-child {
margin-left: 10px; margin-inline-start: 10px;
} }
.viewer-kb-key kbd { .viewer-kb-key kbd {
@@ -1732,7 +1761,7 @@ body.--viewer-shown {
padding: 4px 6px; padding: 4px 6px;
border-radius: 2px; border-radius: 2px;
display: inline-block; display: inline-block;
margin-right: 5px; margin-inline-end: 5px;
line-height: 1; line-height: 1;
} }
@@ -1740,7 +1769,7 @@ body.--viewer-shown {
transform: none; transform: none;
top: auto; top: auto;
bottom: 20px; bottom: 20px;
right: 20px; inset-inline-end: 20px;
position: absolute; position: absolute;
} }
@@ -1871,7 +1900,7 @@ a {
.input-with-button button { .input-with-button button {
background: none; background: none;
position: absolute; position: absolute;
right: 0; inset-inline-end: 0;
top: 50%; top: 50%;
transform: translateY(-50%); transform: translateY(-50%);
border: none; border: none;
@@ -1889,7 +1918,7 @@ a {
#top-left { #top-left {
position: fixed; position: fixed;
padding: 5px; padding: 5px;
left: 0; inset-inline-start: 0;
top: 0; top: 0;
} }
@@ -1978,8 +2007,8 @@ a {
.fancy-fieldset input, .fancy-fieldset select { .fancy-fieldset input, .fancy-fieldset select {
padding: 10px 0; padding: 10px 0;
border-top: transparent; border-top: transparent;
border-left: transparent; border-inline-start: transparent;
border-right: transparent; border-inline-end: transparent;
} }
.fancy-fieldset input:focus, .fancy-fieldset input:focus[type="text"], .fancy-fieldset select:focus, .fancy-fieldset textarea:focus { .fancy-fieldset input:focus, .fancy-fieldset input:focus[type="text"], .fancy-fieldset select:focus, .fancy-fieldset textarea:focus {
@@ -1987,7 +2016,7 @@ a {
} }
.fancy-fieldset .input-with-button input[type="password"] { .fancy-fieldset .input-with-button input[type="password"] {
padding-right: 30px; padding-inline-end: 30px;
} }
.fancy-fieldset>div:last-child { .fancy-fieldset>div:last-child {
@@ -2022,7 +2051,7 @@ a.login-provider-button {
} }
a.login-provider-button .text { a.login-provider-button .text {
margin-left: 5px; margin-inline-start: 5px;
} }
a.login-provider-button--facebook { a.login-provider-button--facebook {
@@ -2220,7 +2249,7 @@ a.login-provider-button--qq {
border: 0; border: 0;
-webkit-backdrop-filter: blur(15px); -webkit-backdrop-filter: blur(15px);
backdrop-filter: blur(15px); backdrop-filter: blur(15px);
text-align: left; text-align: start;
} }
.phone .btn-container--fixed, .phablet .btn-container--fixed { .phone .btn-container--fixed, .phablet .btn-container--fixed {
@@ -2260,8 +2289,8 @@ body.full--wh {
.code--command { .code--command {
border-radius: 0.2em; border-radius: 0.2em;
padding: 0.5em; padding: 0.5em;
padding-right: 0.7em; padding-inline-end: 0.7em;
border-left: 0.2em solid var(--colorAccent); border-inline-start: 0.2em solid var(--colorAccent);
background-color: var(--bodyEmpty); background-color: var(--bodyEmpty);
} }
@@ -2329,7 +2358,7 @@ body.full--wh {
} }
#dashboard-chart .toolbar { #dashboard-chart .toolbar {
margin-left: 45px; margin-inline-start: 45px;
} }
#dashboard-chart button { #dashboard-chart button {
@@ -2418,16 +2447,19 @@ body.full--wh {
height: 200px; height: 200px;
display: block; display: block;
float: left; float: left;
margin-right: 10px; margin-inline-end: 10px;
scroll-snap-align: start; scroll-snap-align: start;
} }
[dir="rtl"] .card-container {
float: right;
}
.card-container:first-child { .card-container:first-child {
margin-left: 0; margin-inline-start: 0;
} }
.card-container:last-child { .card-container:last-child {
margin-right: 0; margin-inline-end: 0;
} }
.card { .card {
@@ -2494,3 +2526,36 @@ body.full--wh {
.captcha.captcha--3 [data-content="captcha"] { .captcha.captcha--3 [data-content="captcha"] {
display: none; display: none;
} }
.cta-row {
border: 1px solid var(--bodySeparator);
border-right: 0;
border-left: 0;
padding-top: 20px;
padding-bottom: 20px;
margin: 0;
cursor: grab;
margin-bottom: -1px;
}
.cta-row.ui-sortable-helper {
background: var(--modalBackground);
}
.phone .btn-cta .btn-text,
.phablet .btn-cta .btn-text {
display: none;
}
.btn-cta {
background-color: var(--bodyBackground);
color: var(--bodyText);
border-color: var(--bodyText);
}
.btn-cta:hover {
background-color: var(--colorAccent);
color: var(--buttonAccentText);
border-color: transparent;
}
.btn-cta:hover .btn-icon {
color: inherit;
}

File diff suppressed because one or more lines are too long

View File

@@ -15,7 +15,7 @@
</div> </div>
</div> </div>
<div class="list-item-image-tools --bottom --right"> <div class="list-item-image-tools --bottom --right">
%tpl_list_item/item_like%
%tpl_list_item/item_share% %tpl_list_item/item_share%
%tpl_list_item/item_like%
</div> </div>
</div> </div>

View File

@@ -14,7 +14,7 @@
</div> </div>
</div> </div>
<div class="list-item-image-tools --bottom --right"> <div class="list-item-image-tools --bottom --right">
%tpl_list_item/item_like%
%tpl_list_item/item_share% %tpl_list_item/item_share%
%tpl_list_item/item_like%
</div> </div>
</div> </div>

View File

@@ -5,6 +5,6 @@
</div> </div>
</div> </div>
<div class="list-item-image-tools --bottom --right"> <div class="list-item-image-tools --bottom --right">
%tpl_list_item/item_share%
%tpl_list_item/item_like% %tpl_list_item/item_like%
%tpl_list_item/item_share%
</div> </div>

View File

@@ -5,6 +5,6 @@
</div> </div>
</div> </div>
<div class="list-item-image-tools --bottom --right"> <div class="list-item-image-tools --bottom --right">
%tpl_list_item/item_share%
%tpl_list_item/item_like% %tpl_list_item/item_like%
%tpl_list_item/item_share%
</div> </div>

View File

@@ -5,6 +5,6 @@
</div> </div>
</div> </div>
<div class="list-item-image-tools --bottom --right"> <div class="list-item-image-tools --bottom --right">
%tpl_list_item/item_share%
%tpl_list_item/item_like% %tpl_list_item/item_like%
%tpl_list_item/item_share%
</div> </div>

View File

@@ -5,6 +5,6 @@
</div> </div>
</div> </div>
<div class="list-item-image-tools --bottom --right"> <div class="list-item-image-tools --bottom --right">
%tpl_list_item/item_share%
%tpl_list_item/item_like% %tpl_list_item/item_like%
%tpl_list_item/item_share%
</div> </div>

View File

@@ -1,8 +1,8 @@
<div class="list-item-image-tools" data-action="list-tools"> <div class="list-item-image-tools" data-action="list-tools">
<div class="tool-select" data-action="select"> <div class="list-tool tool-select" data-action="select" title="<?php _se('Select'); ?>">
<span data-icon-selected="fa-check-square" data-icon-unselected="fa-square" class="btn-icon far fa-square" title="<?php _se('Select'); ?>"></span> <span data-icon-selected="fa-check-square" data-icon-unselected="fa-square" class="btn-icon far fa-square"></span>
</div> </div>
<div class="list-tool tool-delete phone-hide" data-action="delete"> <div class="list-tool tool-delete phone-hide" data-action="delete" title="<?php _se('Delete'); ?>">
<span class="btn-icon fas fa-trash-alt" title="<?php _se('Delete'); ?>"></span> <span class="btn-icon fas fa-trash-alt"></span>
</div> </div>
</div> </div>

View File

@@ -3,18 +3,20 @@ use Chevereto\Legacy\G\Handler;
?> ?>
<div class="list-item-image-tools" data-action="list-tools"> <div class="list-item-image-tools" data-action="list-tools">
<div class="tool-select" data-action="select"> <div class="list-tool tool-select" data-action="select" title="<?php _se('Select'); ?>">
<span data-icon-selected="fa-check-square" data-icon-unselected="fa-square" class="btn-icon far fa-square" title="<?php _se('Select'); ?>"></span> <span data-icon-selected="fa-check-square" data-icon-unselected="fa-square" class="btn-icon far fa-square"></span>
</div> </div>
<div class="list-tool tool-edit phone-hide" data-action="edit"><span class="btn-icon fas fa-edit"></span><span class="label label-edit"><?php _se('Edit'); ?></span></div> <div class="list-tool tool-edit" data-action="edit">
<div class="list-tool tool-move" data-action="move"> <span class="btn-icon fas fa-edit"></span><span class="label label-edit"><?php _se('Edit'); ?></span>
<span class="btn-icon fas fa-exchange-alt" title="<?php _se('Move to album'); ?>"></span> </div>
<div class="list-tool tool-move" data-action="move" title="<?php _se('Move to %s', _s('album')); ?>">
<span class="btn-icon fas fa-exchange-alt"></span>
</div> </div>
<?php <?php
if (Handler::cond('allowed_to_delete_content')) { if (Handler::cond('allowed_to_delete_content')) {
?> ?>
<div class="list-tool tool-delete" data-action="delete"> <div class="list-tool tool-delete" data-action="delete" title="<?php _se('Delete'); ?>">
<span class="btn-icon fas fa-trash-alt" title="<?php _se('Delete'); ?>"></span> <span class="btn-icon fas fa-trash-alt"></span>
</div> </div>
<?php <?php
} }

View File

@@ -3,27 +3,27 @@ use Chevereto\Legacy\G\Handler;
?> ?>
<div class="list-item-image-tools" data-action="list-tools"> <div class="list-item-image-tools" data-action="list-tools">
<div class="tool-select" data-action="select"> <div class="list-tool tool-select" data-action="select" title="<?php _se('Select'); ?>">
<span data-icon-selected="fa-check-square" data-icon-unselected="fa-square" class="btn-icon far fa-square" title="<?php _se('Select'); ?>"></span> <span data-icon-selected="fa-check-square" data-icon-unselected="fa-square" class="btn-icon far fa-square"></span>
</div> </div>
<?php <?php
if (Handler::cond('allowed_nsfw_flagging')) { if (Handler::cond('allowed_nsfw_flagging')) {
?> ?>
<div class="list-tool tool-flag"> <div class="list-tool tool-flag" data-action="flag" title="<?php _se('Toggle unsafe flag'); ?>">
<span data-action="flag" class="btn-icon far fa-flag label-flag-unsafe" title="<?php _se('Toggle unsafe flag'); ?>"></span> <span class="btn-icon far fa-flag label-flag-unsafe"></span>
<span data-action="flag" class="btn-icon fas fa-flag label-flag-safe" title="<?php _se('Toggle unsafe flag'); ?>"></span> <span class="btn-icon fas fa-flag label-flag-safe"></span>
</div> </div>
<?php <?php
} }
if (Handler::getRouteName() == 'moderate') { if (Handler::getRouteName() == 'moderate') {
?> ?>
<div class="list-tool tool-approve" data-action="approve"> <div class="list-tool tool-approve" data-action="approve" title="<?php _se('Approve'); ?>">
<span class="btn-icon fas fa-check" title="<?php _se('Approve'); ?>"></span> <span class="btn-icon fas fa-check"></span>
</div> </div>
<?php <?php
} }
?> ?>
<div class="list-tool list-tool phone-hide" data-action="delete"> <div class="list-tool list-tool phone-hide" data-action="delete" title="<?php _se('Delete'); ?>">
<span class="btn-icon fas fa-trash-alt" title="<?php _se('Delete'); ?>"></span> <span class="btn-icon fas fa-trash-alt"></span>
</div> </div>
</div> </div>

View File

@@ -3,33 +3,33 @@ use Chevereto\Legacy\G\Handler;
?> ?>
<div class="list-item-image-tools" data-action="list-tools"> <div class="list-item-image-tools" data-action="list-tools">
<div class="list-tool tool-select" data-action="select"> <div class="list-tool tool-select" data-action="select" title="<?php _se('Select'); ?>">
<span data-icon-selected="fa-check-square" data-icon-unselected="fa-square" class="btn-icon far fa-square" title="<?php _se('Select'); ?>"></span> <span data-icon-selected="fa-check-square" data-icon-unselected="fa-square" class="btn-icon far fa-square"></span>
</div> </div>
<?php <?php
if (Handler::cond('allowed_nsfw_flagging')) { if (Handler::cond('allowed_nsfw_flagging')) {
?> ?>
<div class="list-tool tool-flag phone-hide"> <div class="list-tool tool-flag phone-hide" title="<?php _se('Toggle unsafe flag'); ?>" data-action="flag">
<span data-action="flag" class="btn-icon far fa-flag label-flag-unsafe" title="<?php _se('Toggle unsafe flag'); ?>"></span> <span class="btn-icon far fa-flag label-flag-unsafe"></span>
<span data-action="flag" class="btn-icon fas fa-flag label-flag-safe" title="<?php _se('Toggle unsafe flag'); ?>"></span> <span class="btn-icon fas fa-flag label-flag-safe"></span>
</div> </div>
<?php <?php
} }
?> ?>
<div class="list-tool tool-edit phone-hide" data-action="edit"> <div class="list-tool tool-edit" data-action="edit" title="<?php _se('Edit'); ?>">
<span class="btn-icon fas fa-edit" title="<?php _se('Edit'); ?>"></span> <span class="btn-icon fas fa-edit"></span>
</div> </div>
<div class="list-tool tool-move phone-hide" data-action="move"> <div class="list-tool tool-move phone-hide" data-action="move" title="<?php _se('Move to %s', _s('album')); ?>">
<span class="btn-icon fas fa-exchange-alt" title="<?php _se('Move to album'); ?>"></span> <span class="btn-icon fas fa-exchange-alt"></span>
</div> </div>
<div class="list-tool tool-create phone-hide" data-action="create-album"> <div class="list-tool tool-create phone-hide" data-action="create-album" title="<?php _se('Create %s', _s('album')); ?>">
<span class="btn-icon fas fa-images" title="<?php _se('Create album'); ?>"></span> <span class="btn-icon fas fa-images"></span>
</div> </div>
<?php <?php
if (Handler::cond('allowed_to_delete_content')) { if (Handler::cond('allowed_to_delete_content')) {
?> ?>
<div class="list-tool tool-delete phone-hide" data-action="delete"> <div class="list-tool tool-delete phone-hide" data-action="delete" title="<?php _se('Delete'); ?>">
<span class="btn-icon fas fa-trash-alt" title="<?php _se('Delete'); ?>"></span> <span class="btn-icon fas fa-trash-alt"></span>
</div> </div>
<?php <?php
} }

View File

@@ -1,5 +1,5 @@
<div class="list-item-image-tools" data-action="list-tools"> <div class="list-item-image-tools" data-action="list-tools">
<div class="tool-select" data-action="select"> <div class="list-tool tool-select" data-action="select" title="<?php _se('Select'); ?>">
<span data-icon-selected="fa-check-square" data-icon-unselected="fa-square" class="btn-icon far fa-square" title="<?php _se('Select'); ?>"></span> <span data-icon-selected="fa-check-square" data-icon-unselected="fa-square" class="btn-icon far fa-square"></span>
</div> </div>
</div> </div>

View File

@@ -1,4 +1,4 @@
<div class="list-item-like" data-action="like"> <div class="list-item-like" data-action="like"" title="<?php _se('Like'); ?>">
<span class="btn-icon btn-like btn-liked fas fa-heart"></span> <span class="btn-icon btn-like btn-liked fas fa-heart"></span>
<span class="btn-icon btn-like btn-unliked far fa-heart"></span> <span class="btn-icon btn-like btn-unliked far fa-heart"></span>
</div> </div>

View File

@@ -1,3 +1,3 @@
<div class="list-item-share" data-action="share"> <div class="list-item-share" data-action="share" title="<?php _se('Share'); ?>">
<span class="btn-icon btn-share fas fa-share-alt"></span> <span class="btn-icon btn-share fas fa-share-alt"></span>
</div> </div>

View File

@@ -15,7 +15,7 @@
</div> </div>
</div> </div>
<div class="list-item-image-tools --bottom --right"> <div class="list-item-image-tools --bottom --right">
%tpl_list_item/item_like%
%tpl_list_item/item_share% %tpl_list_item/item_share%
%tpl_list_item/item_like%
</div> </div>
</div> </div>

View File

@@ -35,18 +35,21 @@ if (!defined('ACCESS') || !ACCESS) {
<?php <?php
} }
?> ?>
<div class="breadcrum-item" data-contains="cta-album">
<?php echo Handler::var('album')['cta_html']; ?>
</div>
</div> </div>
</div> </div>
<div class="header-content-right breaks-ui"> <div class="header-content-right breaks-ui">
<?php <?php
if (Handler::cond('owner') || Handler::cond('content_manager')) { if (Handler::cond('owner') || Handler::cond('content_manager')) {
?> ?>
<a data-action="edit" title="E" class="btn btn-small default" data-modal="edit"><span class="icon fas fa-edit"></span><span class="phone-hide margin-left-5"><?php _se('Edit'); ?></span></a> <a data-action="edit" title="<?php _se('Edit'); ?> (E)" class="btn btn-small default" data-modal="edit"><span class="icon fas fa-edit"></span></a>
<a data-action="sub-album" title="J" class="btn btn-small default" data-modal="edit" data-target="new-sub-album"><span class="icon fas fa-level-down-alt"></span><span class="phone-hide margin-left-5"><?php _se('Sub album'); ?></span></a> <a data-action="sub-album" title="<?php _se('Sub album'); ?> (J)" class="btn btn-small default" data-modal="edit" data-target="new-sub-album"><span class="icon fas fa-level-down-alt"></span></a>
<?php <?php
if (Handler::cond('allowed_to_delete_content')) { if (Handler::cond('allowed_to_delete_content')) {
?> ?>
<a data-action="delete" title="Del" class="btn btn-small default" data-confirm="<?php _se("Do you really want to delete this album and all of its images? This can't be undone."); ?>" data-submit-fn="CHV.fn.submit_resource_delete" data-ajax-deferred="CHV.fn.complete_resource_delete" data-ajax-url="<?php echo get_base_url("json"); ?>"><span class="icon fas fa-trash-alt"></span><span class="phone-hide margin-left-5"><?php _se('Delete'); ?></span></a> <a data-action="delete" title="<?php _se('Delete'); ?> (Del)" class="btn btn-small default" data-confirm="<?php _se("Do you really want to delete this %a and all of its %i? This can't be undone.", ['%a' => _s('album'), '%i' => _s('images')]); ?>" data-submit-fn="CHV.fn.submit_resource_delete" data-ajax-deferred="CHV.fn.complete_resource_delete" data-ajax-url="<?php echo get_base_url("json"); ?>"><span class="icon fas fa-trash-alt"></span></a>
<?php <?php
} ?> } ?>
<?php <?php
@@ -56,31 +59,31 @@ if (!defined('ACCESS') || !ACCESS) {
if (Handler::cond('owner')) { if (Handler::cond('owner')) {
if (getSetting('upload_gui') == 'js' && getSetting('homepage_style') !== 'route_upload') { if (getSetting('upload_gui') == 'js' && getSetting('homepage_style') !== 'route_upload') {
$createAlbumTag = 'button'; $createAlbumTag = 'button';
$createAlbumAttr = 'data-trigger="anywhere-upload-input" data-action="upload-to-album" title="P"'; $createAlbumAttr = 'data-trigger="anywhere-upload-input" data-action="upload-to-album" title="' . _s('Upload to album') . ' (P)"';
} else { } else {
$createAlbumTag = 'a'; $createAlbumTag = 'a';
$createAlbumAttr = 'href="' . get_base_url(sprintf('upload/?toAlbum=%s', Handler::var('album')['id_encoded'])) . '"'; $createAlbumAttr = 'href="' . get_base_url(sprintf('upload/?toAlbum=%s', Handler::var('album')['id_encoded'])) . '"';
} ?> } ?>
<<?php echo $createAlbumTag; ?> class="btn btn-small default" <?php echo $createAlbumAttr; ?>><span class="btn-icon fas fa-cloud-upload-alt"></span><span class="btn-text phone-hide"><?php _se('Upload to album'); ?></span></<?php echo $createAlbumTag; ?>> <<?php echo $createAlbumTag; ?> class="btn btn-small default" <?php echo $createAlbumAttr; ?>><span class="btn-icon fas fa-cloud-upload-alt"></span></<?php echo $createAlbumTag; ?>>
<?php
}
?>
<?php
if (getSetting('theme_show_social_share')) {
?>
<a class="btn btn-small default" data-action="share" title="<?php _se('Share'); ?> (S)"><span class="btn-icon fas fa-share-alt"></span></a>
<?php <?php
} }
?> ?>
<?php <?php
if (getSetting('enable_likes')) { if (getSetting('enable_likes')) {
?> ?>
<a title="L" class="btn-like" data-type="album" data-id="<?php echo Handler::var('album')['id_encoded']; ?>" data-liked="<?php echo (int) (Handler::var('album')['liked'] ?? '0'); ?>"> <a title="<?php _se('Like'); ?> (L)" class="btn-like" data-type="album" data-id="<?php echo Handler::var('album')['id_encoded']; ?>" data-liked="<?php echo (int) (Handler::var('album')['liked'] ?? '0'); ?>">
<span data-action="like" class="btn btn-small default btn-liked" rel="tooltip" title="<?php _se("You like this"); ?>"><span class="btn-icon fas fa-heart"></span><span class="btn-text" data-text="likes-count"><?php echo Handler::var('album')['likes']; ?></span></span> <span data-action="like" class="btn btn-small default btn-liked" rel="tooltip" title="<?php _se("You like this"); ?>"><span class="btn-icon fas fa-heart"></span><span class="btn-text" data-text="likes-count"><?php echo Handler::var('album')['likes']; ?></span></span>
<span class="btn btn-small default btn-unliked"><span data-action="like" class="btn-icon far fa-heart"></span><span class="btn-text" data-text="likes-count"><?php echo Handler::var('album')['likes']; ?></span></span> <span class="btn btn-small default btn-unliked" data-action="like"><span class="btn-icon far fa-heart"></span><span class="btn-text" data-text="likes-count"><?php echo Handler::var('album')['likes']; ?></span></span>
</a> </a>
<?php <?php
} }
?>
<?php
if (getSetting('theme_show_social_share')) {
?>
<a class="btn btn-small default" data-action="share" title="S"><span class="btn-icon fas fa-share-alt"></span><span class="btn-text phone-hide"><?php _se('Share'); ?></span></a>
<?php
}
?> ?>
</div> </div>
</div> </div>
@@ -132,7 +135,7 @@ if (!defined('ACCESS') || !ACCESS) {
<div class="content-listing-loading"></div> <div class="content-listing-loading"></div>
<div id="embed-codes" class="input-label margin-bottom-0 margin-top-0 soft-hidden"> <div id="embed-codes" class="input-label margin-bottom-0 margin-top-0 soft-hidden">
<label for="album-embed-toggle"><?php _se('Embed codes'); ?></label> <label for="album-embed-toggle"><?php _se('Embed codes'); ?></label>
<div class="c7 margin-bottom-10"> <div class="c8 margin-bottom-10">
<select name="album-embed-toggle" id="album-embed-toggle" class="text-input" data-combo="album-embed-toggle-combo"> <select name="album-embed-toggle" id="album-embed-toggle" class="text-input" data-combo="album-embed-toggle-combo">
<?php <?php
foreach (get_global('embed_share_tpl') as $key => $value) { foreach (get_global('embed_share_tpl') as $key => $value) {
@@ -175,13 +178,19 @@ if (!defined('ACCESS') || !ACCESS) {
</div> </div>
</div> </div>
</div> </div>
<?php if (Handler::cond('content_manager')) { ?>
<script>
$(function() {
CHV.fn.ctaForm.enable = <?php echo Handler::var('album')['cta_enable']; ?>;
CHV.fn.ctaForm.array = <?php echo Handler::var('album')['cta']; ?>;
});
</script>
<?php
} ?>
<?php <?php
if (Handler::cond('content_manager') || Handler::cond('owner')) { if (Handler::cond('content_manager') || Handler::cond('owner')) {
?> include_theme_file('snippets/modal_edit_album');
<?php include_theme_file('snippets/modal_edit_album'); ?> include_theme_file('snippets/modal_create_sub_album');
<?php include_theme_file('snippets/modal_create_sub_album'); ?>
<?php
} }
?> ?>
<?php if (Handler::cond('content_manager') and isset(request()["deleted"])) { ?> <?php if (Handler::cond('content_manager') and isset(request()["deleted"])) { ?>

View File

@@ -25,7 +25,7 @@ function follow_sub_header(): bool
return in_array(Handler::var('dashboard'), ['settings', 'images', 'albums', 'users']); return in_array(Handler::var('dashboard'), ['settings', 'images', 'albums', 'users']);
} ?> } ?>
<?php include_theme_header(); ?> <?php include_theme_header(); ?>
<div class="top-sub-bar top-sub-bar--1<?php if (!follow_sub_header()) { ?> follow-scroll<?php } ?> margin-bottom-5 margin-top-5"> <div class="top-sub-bar top-sub-bar--1<?php if (!follow_sub_header()) { ?> follow-scroll<?php } ?>">
<div class="content-width"> <div class="content-width">
<div class="header header-tabs no-select"> <div class="header header-tabs no-select">
<h1 class="header-title"> <h1 class="header-title">
@@ -37,7 +37,7 @@ function follow_sub_header(): bool
</div> </div>
</div> </div>
<?php if (follow_sub_header()) { ?> <?php if (follow_sub_header()) { ?>
<div class="top-sub-bar top-sub-bar--2 follow-scroll margin-bottom-5 margin-top-5"> <div class="top-sub-bar top-sub-bar--2 follow-scroll">
<div class="content-width"> <div class="content-width">
<?php <?php
switch (Handler::var('dashboard')) { switch (Handler::var('dashboard')) {

View File

@@ -31,7 +31,7 @@ echo read_the_docs_settings('categories', _s('Categories')); ?>
<span class="c5 display-table-cell padding-right-10"><a data-modal="edit" data-target="form-modal" data-category-id="%ID%" data-content="category-name">%NAME%</a></span> <span class="c5 display-table-cell padding-right-10"><a data-modal="edit" data-target="form-modal" data-category-id="%ID%" data-content="category-name">%NAME%</a></span>
<span class="c4 display-table-cell padding-right-10 phone-hide phablet-hide" data-content="category-url_key">%URL_KEY%</span> <span class="c4 display-table-cell padding-right-10 phone-hide phablet-hide" data-content="category-url_key">%URL_KEY%</span>
<span class="c13 display-table-cell padding-right-10 phone-display-block" data-content="category-description">%DESCRIPTION%</span> <span class="c13 display-table-cell padding-right-10 phone-display-block" data-content="category-description">%DESCRIPTION%</span>
<span class="display-table-cell"><a class="btn btn-small default" data-category-id="%ID%" data-args="%ID%" data-confirm="' . _s("Do you really want to delete the %s category? This can't be undone.") . '" data-submit-fn="CHV.fn.category.delete.submit" data-before-fn="CHV.fn.category.delete.before" data-ajax-deferred="CHV.fn.category.delete.complete"><i class="fas fa-trash-alt margin-right-5"></i>' . _s('Delete') . '</a></span> <span class="display-table-cell"><a class="btn btn-small default" data-category-id="%ID%" data-args="%ID%" data-confirm="' . _s("Do you really want to delete %s? This can't be undone.") . '" data-submit-fn="CHV.fn.category.delete.submit" data-before-fn="CHV.fn.category.delete.before" data-ajax-deferred="CHV.fn.category.delete.complete"><i class="fas fa-trash-alt margin-right-5"></i>' . _s('Delete') . '</a></span>
</li>'; </li>';
if (Handler::var('categories')) { if (Handler::var('categories')) {
foreach (Handler::var('categories') as $category) { foreach (Handler::var('categories') as $category) {
@@ -46,9 +46,8 @@ if (Handler::var('categories')) {
<div class="hidden" data-content="category-dashboard-template"> <div class="hidden" data-content="category-dashboard-template">
<?php echo $li_template; ?> <?php echo $li_template; ?>
</div> </div>
<p><i class="fas fa-info-circle"></i> <?php _se("Note: Deleting a category doesn't delete the images that belongs to that category."); ?></p>
<div data-modal="form-modal" class="hidden" data-submit-fn="CHV.fn.category.edit.submit" data-before-fn="CHV.fn.category.edit.before" data-ajax-deferred="CHV.fn.category.edit.complete" data-ajax-url="<?php echo get_base_url('json'); ?>"> <div data-modal="form-modal" class="hidden" data-submit-fn="CHV.fn.category.edit.submit" data-before-fn="CHV.fn.category.edit.before" data-ajax-deferred="CHV.fn.category.edit.complete" data-ajax-url="<?php echo get_base_url('json'); ?>">
<span class="modal-box-title"><i class="fas fa-edit"></i> <?php _se('Edit category'); ?></span> <span class="modal-box-title"><i class="fas fa-edit"></i> <?php _se('Edit %s', _s('category')); ?></span>
<div class="modal-form"> <div class="modal-form">
<input type="hidden" name="form-category-id"> <input type="hidden" name="form-category-id">
<?php include_theme_file('snippets/form_category_edit'); ?> <?php include_theme_file('snippets/form_category_edit'); ?>

View File

@@ -41,7 +41,7 @@ echo read_the_docs_settings('homepage', _s('Homepage')); ?>
<?php if (count(Settings::get('homepage_cover_images')) > 1) { <?php if (count(Settings::get('homepage_cover_images')) > 1) {
?> ?>
<div class="margin-top-10 margin-bottom-10"> <div class="margin-top-10 margin-bottom-10">
<a class="btn btn-small default" data-confirm="<?php _se("Do you really want to delete this image? This can't be undone."); ?>" href="<?php echo get_base_url('dashboard/settings/homepage?action=delete-cover&cover=' . $cover_index); ?>"><i class="fas fa-trash-alt margin-right-5"></i><?php _se('Delete %s', $coverName); ?></a> <a class="btn btn-small default" data-confirm="<?php _se("Do you really want to delete? This can't be undone."); ?>" href="<?php echo get_base_url('dashboard/settings/homepage?action=delete-cover&cover=' . $cover_index); ?>"><i class="fas fa-trash-alt margin-right-5"></i><?php _se('Delete %s', $coverName); ?></a>
</div> </div>
<?php <?php
} ?> } ?>

View File

@@ -0,0 +1,35 @@
<?php
/*
* This file is part of Chevereto.
*
* (c) Rodolfo Berrios <rodolfo@chevereto.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
use Chevereto\Legacy\Classes\Settings;
use Chevereto\Legacy\G\Handler;
if (!defined('ACCESS') || !ACCESS) {
die('This file cannot be directly accessed.');
}
echo read_the_docs_settings('semantics', _s('Semantics')); ?>
<div class="input-label"><i class="fas fa-info-circle"></i> <?php _se('Semantics allows you to define the nouns used for content to customize your content driven experience.'); ?></div>
<?php foreach (Settings::SEMANTICS as $messages) {
foreach ($messages as $key => $message) {
$value = Settings::get($key);
$errors = Handler::var('input_errors')[$key] ?? '';
$pattern = '^[a-Z0-9]+(?:-[a-Z0-9]+)*$';
echo <<<STRING
<div class="input-label">
<label for="{$key}">{$message}</label>
<div class="c9 phablet-c1">
<input type="text" name="{$key}" id="{$key}" class="text-input" value="{$value}" pattern="{$pattern}" placeholder="{$message}">
</div>
<div class="input-below input-warning red-warning">{$errors}</div>
</div>
STRING;
}
} ?>

View File

@@ -23,11 +23,11 @@ Handler::setVar('tabs', Handler::var('sub_tabs'));
?> ?>
<div class="header-content-right"> <div class="header-content-right">
<div class="header--height header--centering"> <div class="header--height header--centering">
<a class="btn btn-small default" data-modal="form" data-target="modal-add-user"><i class="fas fa-user-plus margin-right-5"></i><?php _se('Add user'); ?></a> <a class="btn btn-small default" data-modal="form" data-target="modal-add-user"><i class="fas fa-user-plus margin-right-5"></i><?php _se('Create %s', _s('user')); ?></a>
</div> </div>
</div> </div>
<div data-modal="modal-add-user" class="hidden" data-submit-fn="CHV.fn.user.add.submit" data-ajax-deferred="CHV.fn.user.add.complete"> <div data-modal="modal-add-user" class="hidden" data-submit-fn="CHV.fn.user.add.submit" data-ajax-deferred="CHV.fn.user.add.complete">
<span class="modal-box-title"><i class="fas fa-user-plus"></i> <?php _se('Add user'); ?></span> <span class="modal-box-title"><i class="fas fa-user-plus"></i> <?php _se('Create %s', _s('user')); ?></span>
<div class="modal-form"> <div class="modal-form">
<div class="input-label c8"> <div class="input-label c8">
<label for="form-role"><?php _se('Role'); ?></label> <label for="form-role"><?php _se('Role'); ?></label>

View File

@@ -44,11 +44,11 @@ if (!defined('ACCESS') || !ACCESS) {
<?php if (Handler::var('settings')['key'] == 'categories') { ?> <?php if (Handler::var('settings')['key'] == 'categories') { ?>
<div class="header-content-right"> <div class="header-content-right">
<div class="header--height header--centering"> <div class="header--height header--centering">
<a class="btn btn-small default" data-modal="form" data-target="modal-add-category"><i class="fas fa-plus"></i><span class="margin-left-5 phone-hide"><?php _se('Add'); ?></span></a> <a class="btn btn-small default" data-modal="form" data-target="modal-add-category"><i class="fas fa-plus"></i><span class="margin-left-5 phone-hide"><?php _se('Create'); ?></span></a>
</div> </div>
</div> </div>
<div data-modal="modal-add-category" class="hidden" data-submit-fn="CHV.fn.category.add.submit" data-before-fn="CHV.fn.category.add.before" data-ajax-deferred="CHV.fn.category.add.complete"> <div data-modal="modal-add-category" class="hidden" data-submit-fn="CHV.fn.category.add.submit" data-before-fn="CHV.fn.category.add.before" data-ajax-deferred="CHV.fn.category.add.complete">
<span class="modal-box-title"><i class="fas fa-columns"></i> <?php _se('Add category'); ?></span> <span class="modal-box-title"><i class="fas fa-columns"></i> <?php _se('Create %s', _s('category')); ?></span>
<div class="modal-form"> <div class="modal-form">
<?php include_theme_file('snippets/form_category_edit'); ?> <?php include_theme_file('snippets/form_category_edit'); ?>
</div> </div>

View File

@@ -16,7 +16,10 @@ if (Handler::var('category') !== null && isset(Handler::var('category')['name'])
?> ?>
<div class="content-width"> <div class="content-width">
<div class="header margin-top-20 margin-bottom-10"> <div class="header margin-top-20 margin-bottom-10">
<h1 class="header-title" rel="tooltip" data-tipTip="right" title="ID:<?php echo Handler::var('category')['id']; ?>"><i class="fas fa-columns color-accent"></i> <strong><?php _se('%s category', '<em><b>' . Handler::var('category')['name'] . '</b></em>'); ?></strong></h1> <h1 class="header-title" rel="tooltip" data-tipTip="right" title="ID:<?php echo Handler::var('category')['id']; ?>"><i class="fas fa-columns color-accent"></i> <strong><?php _se('%s %c', [
'%s' => '<em><b>' . Handler::var('category')['name'] . '</b></em>',
'%c' => _s('category')
]); ?></strong></h1>
</div> </div>
<div><?php echo safe_html(Handler::var('category')['description']); ?></div> <div><?php echo safe_html(Handler::var('category')['description']); ?></div>
</div> </div>

View File

@@ -39,7 +39,7 @@ if (!defined('ACCESS') || !ACCESS) {
?> ?>
<div id="image-viewer-loader" data-size="<?php echo Handler::var('image')['size']; ?>"><?php if (Handler::var('image')['is_animated']) { <div id="image-viewer-loader" data-size="<?php echo Handler::var('image')['size']; ?>"><?php if (Handler::var('image')['is_animated']) {
?><span class="btn-icon icon fas fa-play-circle"></span><?php ?><span class="btn-icon icon fas fa-play-circle"></span><?php
} ?><span class="btn-text"><?php } ?><span><?php
switch (true) { switch (true) {
case Handler::var('image')['is_animated']: case Handler::var('image')['is_animated']:
_se('Play GIF'); _se('Play GIF');
@@ -65,7 +65,6 @@ if (!defined('ACCESS') || !ACCESS) {
} }
?> ?>
</div> </div>
<?php show_theme_inline_code('snippets/image.js'); ?>
<?php <?php
show_banner('image_after_image-viewer', !Handler::var('image')['nsfw']); show_banner('image_after_image-viewer', !Handler::var('image')['nsfw']);
?> ?>
@@ -93,6 +92,7 @@ if (isset(Handler::var('image')['album'], Handler::var('image_album_slice')['ima
<?php <?php
} }
?> ?>
<?php show_theme_inline_code('snippets/image.js'); ?>
<div class="content-width margin-top-10"> <div class="content-width margin-top-10">
<div class="header header-content margin-bottom-10 margin-top-10"> <div class="header header-content margin-bottom-10 margin-top-10">
<div class="header-content-left"> <div class="header-content-left">
@@ -104,14 +104,16 @@ if (isset(Handler::var('image')['album'], Handler::var('image_album_slice')['ima
<div class="user-image default-user-image"><span class="icon fas fa-user-circle"></span></div> <div class="user-image default-user-image"><span class="icon fas fa-user-circle"></span></div>
</div> </div>
<?php } ?> <?php } ?>
<div class="breadcrum-item" data-contains="cta-album">
<?php echo Handler::var('image')['album']['cta_html'] ?? ''; ?>
</div>
</div> </div>
</div> </div>
<div class="header-content-right breaks-ui"> <div class="header-content-right breaks-ui">
<?php <?php
if (Handler::cond('owner') || Handler::cond('content_manager')) { if (Handler::cond('owner') || Handler::cond('content_manager')) {
?> ?>
<a data-action="edit" title="E" class="btn btn-small default" data-modal="edit"><span class="icon fas fa-edit"></span><span class="phone-hide margin-left-5"><?php _se('Edit'); ?></span></a> <a data-action="edit" title="<?php _se('Edit'); ?> (E)" class="btn btn-small default" data-modal="edit"><span class="icon fas fa-edit"></span></a>
<?php <?php
if (!Handler::var('image')['is_approved'] && Handler::cond('content_manager')) { ?> if (!Handler::var('image')['is_approved'] && Handler::cond('content_manager')) { ?>
<a class="btn btn-small default" data-confirm="<?php _se("Do you really want to approve this image? The image will go public if you approve it."); ?>" data-submit-fn="CHV.fn.submit_resource_approve" data-ajax-deferred="CHV.fn.complete_resource_approve" data-ajax-url="<?php echo get_base_url('json'); ?>"><span class="icon fas fa-check-double"></span><span class="phone-hide margin-left-5"><?php _se('Approve'); ?></span></a> <a class="btn btn-small default" data-confirm="<?php _se("Do you really want to approve this image? The image will go public if you approve it."); ?>" data-submit-fn="CHV.fn.submit_resource_approve" data-ajax-deferred="CHV.fn.complete_resource_approve" data-ajax-url="<?php echo get_base_url('json'); ?>"><span class="icon fas fa-check-double"></span><span class="phone-hide margin-left-5"><?php _se('Approve'); ?></span></a>
@@ -119,38 +121,38 @@ if (isset(Handler::var('image')['album'], Handler::var('image_album_slice')['ima
} }
if (Handler::cond('allowed_to_delete_content')) { if (Handler::cond('allowed_to_delete_content')) {
?> ?>
<a data-action="delete" title="Del" class="btn btn-small default" data-confirm="<?php _se("Do you really want to delete this image? This can't be undone."); ?>" data-submit-fn="CHV.fn.submit_resource_delete" data-ajax-deferred="CHV.fn.complete_resource_delete" data-ajax-url="<?php echo get_base_url('json'); ?>"><span class="icon fas fa-trash-alt"></span><span class="phone-hide margin-left-5"><?php _se('Delete'); ?></span></a> <a data-action="delete" title="<?php _se('Delete'); ?> (Del)" class="btn btn-small default" data-confirm="<?php _se("Do you really want to delete this %s? This can't be undone.", _s('image')); ?>" data-submit-fn="CHV.fn.submit_resource_delete" data-ajax-deferred="CHV.fn.complete_resource_delete" data-ajax-url="<?php echo get_base_url('json'); ?>"><span class="icon fas fa-trash-alt"></span></a>
<?php <?php
} }
} }
?> ?>
<?php if (getSetting('theme_download_button')) { <?php if (getSetting('theme_download_button')) {
?> ?>
<a data-action="download" href="<?php echo Handler::var('image')['url']; ?>" download="<?php echo Handler::var('image')['filename']; ?>" class="btn btn-small default btn-download" rel="tooltip" title="<?php _se('Download'); ?>"><span class="btn-icon fas fa-download"></span></a> <a data-action="download" href="<?php echo Handler::var('image')['url']; ?>" download="<?php echo Handler::var('image')['filename']; ?>" class="btn btn-small default btn-download" title="<?php _se('Download'); ?>"><span class="btn-icon fas fa-download"></span></a>
<?php <?php
} ?> } ?>
<?php if (isset(Handler::var('image')['album']['id']) && (Handler::cond('owner') || Handler::cond('content_manager'))) { <?php if (isset(Handler::var('image')['album']['id']) && (Handler::cond('owner') || Handler::cond('content_manager'))) {
?> ?>
<a class="btn-album-cover" data-album-id="<?php echo Handler::var('image')['album']['id_encoded']; ?>" data-id="<?php echo Handler::var('image')['id_encoded']; ?>" data-cover="<?php echo (int) Handler::cond('album_cover'); ?>" title="H"> <a class="btn-album-cover" data-album-id="<?php echo Handler::var('image')['album']['id_encoded']; ?>" data-id="<?php echo Handler::var('image')['id_encoded']; ?>" data-cover="<?php echo (int) Handler::cond('album_cover'); ?>" title="<?php _se('Cover'); ?> (H)">
<span data-action="album-cover" class="btn btn-small default btn-album-is-cover" rel="tooltip" title="<?php _se('This is the album cover'); ?>"><span class="btn-icon fas fa-check-square"></span><span class="btn-text phone-hide"><?php _se('Cover'); ?></span></span> <span data-action="album-cover" class="btn btn-small default btn-album-is-cover" rel="tooltip" title="<?php _se('This is the album cover'); ?>"><span class="btn-icon fas fa-check-square"></span></span>
<span data-action="album-cover" class="btn btn-small default btn-album-not-cover"><span class="btn-icon far fa-square"></span><span class="btn-text phone-hide"><?php _se('Cover'); ?></span></span> <span data-action="album-cover" class="btn btn-small default btn-album-not-cover"><span class="btn-icon far fa-square"></span></span>
</a> </a>
<?php <?php
} ?> } ?>
<?php if (getSetting('theme_show_social_share')) {
?>
<a class="btn btn-small default" data-action="share" title="<?php _se('Share'); ?> (S)"><span class="btn-icon fas fa-share-alt"></span></a>
<?php
} ?>
<?php if (getSetting('enable_likes')) { <?php if (getSetting('enable_likes')) {
?> ?>
<a class="btn-like" title="L" data-type="image" data-id="<?php echo Handler::var('image')['id_encoded']; ?>" data-liked="<?php echo (int) (Handler::var('image')['liked'] ?? false); ?>"> <a class="btn-like" title="<?php _se('Like'); ?> (L)" data-type="image" data-id="<?php echo Handler::var('image')['id_encoded']; ?>" data-liked="<?php echo (int) (Handler::var('image')['liked'] ?? false); ?>">
<span data-action="like" class="btn btn-small default btn-liked" rel="tooltip" title="<?php _se('You like this'); ?>"><span class="btn-icon fas fa-heart"></span><span class="btn-text" data-text="likes-count"><?php echo (int) (Handler::var('image')['likes'] ?? false); ?></span></span> <span data-action="like" class="btn btn-small default btn-liked" rel="tooltip" title="<?php _se('You like this'); ?>"><span class="btn-icon fas fa-heart"></span><span class="btn-text" data-text="likes-count"><?php echo (int) (Handler::var('image')['likes'] ?? false); ?></span></span>
<span data-action="like" class="btn btn-small default btn-unliked"><span class="btn-icon far fa-heart"></span><span class="btn-text" data-text="likes-count"><?php echo (int) (Handler::var('image')['likes'] ?? false); ?></span></span> <span data-action="like" class="btn btn-small default btn-unliked"><span class="btn-icon far fa-heart"></span><span class="btn-text" data-text="likes-count"><?php echo (int) (Handler::var('image')['likes'] ?? false); ?></span></span>
</a> </a>
<?php <?php
} }
?> ?>
<?php if (getSetting('theme_show_social_share')) {
?>
<a class="btn btn-small default" data-action="share" title="S"><span class="btn-icon fas fa-share-alt"></span><span class="btn-text phone-hide"><?php _se('Share'); ?></span></a>
<?php
} ?>
</div> </div>
</div> </div>
<?php <?php
@@ -196,7 +198,7 @@ if (isset(Handler::var('image')['album'], Handler::var('image_album_slice')['ima
if (isset(Handler::var('image')['album']['id']) && (Handler::var('image')['album']['privacy'] !== 'private_but_link' || Handler::cond('owner') || Handler::cond('content_manager'))) { if (isset(Handler::var('image')['album']['id']) && (Handler::var('image')['album']['privacy'] !== 'private_but_link' || Handler::cond('owner') || Handler::cond('content_manager'))) {
$album_link = '<a href="' . Handler::var('image')['album']['url'] . '"' . (Handler::var('image')['album']['name'] !== Handler::var('image')['album']['name_truncated'] ? (' title="' . Handler::var('image')['album']['name_html'] . '"') : null) . '><i class="fas fa-images margin-right-5"></i>' . Handler::var('image')['album']['name_truncated_html'] . '</a>'; $album_link = '<a href="' . Handler::var('image')['album']['url'] . '"' . (Handler::var('image')['album']['name'] !== Handler::var('image')['album']['name_truncated'] ? (' title="' . Handler::var('image')['album']['name_html'] . '"') : null) . '><i class="fas fa-images margin-right-5"></i>' . Handler::var('image')['album']['name_truncated_html'] . '</a>';
if (isset($category_link)) { if (isset($category_link)) {
echo _s('Added to %a and categorized in %c', ['%a' => $album_link, '%c' => $category_link]); echo _s('Added to %a under %s %c', ['%a' => $album_link, '%s' => $category_link, '%c' => _s('category')]);
} else { } else {
echo _s('Added to %s', $album_link); echo _s('Added to %s', $album_link);
} }
@@ -357,7 +359,7 @@ if (isset(Handler::var('image')['album'], Handler::var('image_album_slice')['ima
if (Handler::cond('owner') || Handler::cond('content_manager')) { if (Handler::cond('owner') || Handler::cond('content_manager')) {
?> ?>
<div data-modal="form-modal" class="hidden" data-submit-fn="CHV.fn.submit_image_edit" data-before-fn="CHV.fn.before_image_edit" data-ajax-deferred="CHV.fn.complete_image_edit" data-ajax-url="<?php echo get_base_url('json'); ?>"> <div data-modal="form-modal" class="hidden" data-submit-fn="CHV.fn.submit_image_edit" data-before-fn="CHV.fn.before_image_edit" data-ajax-deferred="CHV.fn.complete_image_edit" data-ajax-url="<?php echo get_base_url('json'); ?>">
<span class="modal-box-title"><i class="fas fa-edit"></i> <?php _se('Edit'); ?></span> <span class="modal-box-title"><i class="fas fa-edit"></i> <?php _se('Edit %s', _s('image')); ?></span>
<div class="modal-form"> <div class="modal-form">
<?php <?php
include_theme_file('snippets/form_image'); ?> include_theme_file('snippets/form_image'); ?>

View File

@@ -1,6 +1,7 @@
<?php <?php
use Chevereto\Legacy\Classes\Settings; use Chevereto\Legacy\Classes\Settings;
use Chevereto\Legacy\Classes\User;
use function Chevereto\Legacy\G\get_base_url; use function Chevereto\Legacy\G\get_base_url;
use Chevereto\Legacy\G\Handler; use Chevereto\Legacy\G\Handler;
use function Chevereto\Legacy\G\include_theme_file; use function Chevereto\Legacy\G\include_theme_file;
@@ -46,7 +47,7 @@ if ($hasPrev == false) { ?>
<div class="header header-tabs"> <div class="header header-tabs">
<h2 class="header-title"><strong><?php <h2 class="header-title"><strong><?php
echo isset($home_user) echo isset($home_user)
? _s("%s's Images", $home_user['name_short']) ? User::getStreamName($home_user['name_short'])
: ('<span class="' . Handler::var('list')['icon'] . '"></span><span class="phone-hide margin-left-5">' . Handler::var('list')['label']); ?></span></strong></h1> : ('<span class="' . Handler::var('list')['icon'] . '"></span><span class="phone-hide margin-left-5">' . Handler::var('list')['label']); ?></span></strong></h1>
<?php include_theme_file("snippets/tabs"); ?> <?php include_theme_file("snippets/tabs"); ?>
<?php <?php

View File

@@ -37,7 +37,7 @@ if (!defined('ACCESS') || !ACCESS) {
?> hidden<?php ?> hidden<?php
} ?>"> } ?>">
<span class="btn btn-capsule"><span class="btn-icon fas fa-camera"></span><span class="btn-text"><?php _se('Change background'); ?></span></span> <span class="btn btn-capsule"><span class="btn-icon fas fa-camera"></span><span class="btn-text"><?php _se('Change background'); ?></span></span>
<div class="pop-box anchor-right arrow-box arrow-box-top"> <div class="pop-box anchor-right arrow-box arrow-box-top margin-top-10">
<div class="pop-box-inner pop-box-menu"> <div class="pop-box-inner pop-box-menu">
<ul> <ul>
<li class="with-icon"><a data-trigger="user-background-upload"><span class="btn-icon fas fa-camera"></span> <?php _se('Upload new image'); ?></a></li> <li class="with-icon"><a data-trigger="user-background-upload"><span class="btn-icon fas fa-camera"></span> <?php _se('Upload new image'); ?></a></li>
@@ -60,7 +60,7 @@ if (!defined('ACCESS') || !ACCESS) {
<?php show_banner('user_after_top', Handler::var('listing')->sfw()); ?> <?php show_banner('user_after_top', Handler::var('listing')->sfw()); ?>
<div id="top-user" class="top-user<?php echo !isset(Handler::var('user')["background"]) ? ' no-background' : ''; ?>"> <div id="top-user" class="top-user<?php echo !isset(Handler::var('user')["background"]) ? ' no-background' : ''; ?>">
<div class="top-user-credentials"> <div class="top-user-credentials">
<a href="<?php echo Handler::var('user')["url"]; ?>"> <a class="top-user-avatar" href="<?php echo Handler::var('user')["url"]; ?>">
<?php <?php
if (isset(Handler::var('user')["avatar"])) { if (isset(Handler::var('user')["avatar"])) {
?> ?>
@@ -130,7 +130,7 @@ if (!defined('ACCESS') || !ACCESS) {
</div> </div>
<div class="header-content-right phone-float-none"> <div class="header-content-right phone-float-none">
<div class="text-align-right"> <div class="text-align-right">
<a class="number-figures" href="<?php echo Handler::var('user')["url"]; ?>"><i class="icon far fa-image"></i> <b data-text="image-count"><?php echo Handler::var('user')["image_count"]; ?></b> <span data-text="image-label" data-label-single="<?php _ne('image', 'images', 1); ?>" data-label-plural="<?php _ne('image', 'images', 2); ?>"><?php _ne('image', 'images', Handler::var('user')['image_count']); ?></span></a> <a class="number-figures" href="<?php echo Handler::var('user')["url"]; ?>"><i class="icon far fa-image"></i> <b data-text="image-count"><?php echo Handler::var('user')["image_count"]; ?></b> <span data-text="image-label" data-label-single="<?php _se('image', 'images', 1); ?>" data-label-plural="<?php _ne('image', 'images', 2); ?>"><?php _ne('image', 'images', Handler::var('user')['image_count']); ?></span></a>
<a class="number-figures" href="<?php echo Handler::var('user')["url_albums"]; ?>"><i class="icon far fa-images"></i> <b data-text="album-count"><?php echo Handler::var('user')["album_count"]; ?></b> <span data-text="album-label" data-label-single="<?php _ne('album', 'albums', 1); ?>" data-label-plural="<?php _ne('album', 'albums', 2); ?>"><?php _ne('album', 'albums', Handler::var('user')['album_count']); ?></span></a> <a class="number-figures" href="<?php echo Handler::var('user')["url_albums"]; ?>"><i class="icon far fa-images"></i> <b data-text="album-count"><?php echo Handler::var('user')["album_count"]; ?></b> <span data-text="album-label" data-label-single="<?php _ne('album', 'albums', 1); ?>" data-label-plural="<?php _ne('album', 'albums', 2); ?>"><?php _ne('album', 'albums', Handler::var('user')['album_count']); ?></span></a>
<?php if (getSetting('enable_likes') && Handler::var('user')['is_private'] == 0) { <?php if (getSetting('enable_likes') && Handler::var('user')['is_private'] == 0) {
?> ?>
@@ -151,7 +151,7 @@ if (!defined('ACCESS') || !ACCESS) {
if (Handler::cond('owner')) { if (Handler::cond('owner')) {
?> ?>
<div class="text-align-right"> <div class="text-align-right">
<button data-action="create-album" title="A" class="btn btn-small default" data-modal="edit" data-target="new-album"><span class="btn-icon fas fa-images"></span><span class="btn-text"><?php _se('Create new album'); ?></span></button> <button data-action="create-album" title="A" class="btn btn-small default" data-modal="edit" data-target="new-album"><span class="btn-icon fas fa-images"></span><span class="btn-text"><?php _se('Create new %s', _s('album')); ?></span></button>
<?php include_theme_file('snippets/modal_create_album.php'); ?> <?php include_theme_file('snippets/modal_create_album.php'); ?>
</div> </div>
<?php <?php