mirror of
https://github.com/Kareadita/Kavita.git
synced 2025-06-03 21:54:47 -04:00
Misc Bugfixes (#2832)
This commit is contained in:
parent
57fb2d01b9
commit
0277f8f4c7
@ -363,7 +363,7 @@ public class AccountController : BaseApiController
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Validate no other users exist with this email
|
// Validate no other users exist with this email
|
||||||
if (user.Email!.Equals(dto.Email)) return Ok(await _localizationService.Translate(User.GetUserId(), "nothing-to-do"));
|
if (user.Email!.Equals(dto.Email)) return BadRequest(await _localizationService.Translate(User.GetUserId(), "nothing-to-do"));
|
||||||
|
|
||||||
// Check if email is used by another user
|
// Check if email is used by another user
|
||||||
var existingUserEmail = await _unitOfWork.UserRepository.GetUserByEmailAsync(dto.Email);
|
var existingUserEmail = await _unitOfWork.UserRepository.GetUserByEmailAsync(dto.Email);
|
||||||
@ -386,8 +386,12 @@ public class AccountController : BaseApiController
|
|||||||
user.ConfirmationToken = token;
|
user.ConfirmationToken = token;
|
||||||
await _userManager.UpdateAsync(user);
|
await _userManager.UpdateAsync(user);
|
||||||
|
|
||||||
|
var emailLink = await _emailService.GenerateEmailLink(Request, user.ConfirmationToken, "confirm-email-update", dto.Email);
|
||||||
|
_logger.LogCritical("[Update Email]: Email Link for {UserName}: {Link}", user.UserName, emailLink);
|
||||||
|
|
||||||
if (!shouldEmailUser)
|
if (!shouldEmailUser)
|
||||||
{
|
{
|
||||||
|
_logger.LogInformation("Cannot email admin, email not setup or admin email invalid");
|
||||||
return Ok(new InviteUserResponse
|
return Ok(new InviteUserResponse
|
||||||
{
|
{
|
||||||
EmailLink = string.Empty,
|
EmailLink = string.Empty,
|
||||||
@ -399,9 +403,6 @@ public class AccountController : BaseApiController
|
|||||||
// Send a confirmation email
|
// Send a confirmation email
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var emailLink = await _emailService.GenerateEmailLink(Request, user.ConfirmationToken, "confirm-email-update", dto.Email);
|
|
||||||
_logger.LogCritical("[Update Email]: Email Link for {UserName}: {Link}", user.UserName, emailLink);
|
|
||||||
|
|
||||||
if (!_emailService.IsValidEmail(user.Email))
|
if (!_emailService.IsValidEmail(user.Email))
|
||||||
{
|
{
|
||||||
_logger.LogCritical("[Update Email]: User is trying to update their email, but their existing email ({Email}) isn't valid. No email will be send", user.Email);
|
_logger.LogCritical("[Update Email]: User is trying to update their email, but their existing email ({Email}) isn't valid. No email will be send", user.Email);
|
||||||
@ -839,6 +840,7 @@ public class AccountController : BaseApiController
|
|||||||
return BadRequest(await _localizationService.Translate(user.Id, "generic-user-email-update"));
|
return BadRequest(await _localizationService.Translate(user.Id, "generic-user-email-update"));
|
||||||
}
|
}
|
||||||
user.ConfirmationToken = null;
|
user.ConfirmationToken = null;
|
||||||
|
user.EmailConfirmed = true;
|
||||||
await _unitOfWork.CommitAsync();
|
await _unitOfWork.CommitAsync();
|
||||||
|
|
||||||
|
|
||||||
|
@ -1123,7 +1123,9 @@ public class OpdsController : BaseApiController
|
|||||||
Id = mangaFile.Id.ToString(),
|
Id = mangaFile.Id.ToString(),
|
||||||
Title = title,
|
Title = title,
|
||||||
Extent = fileSize,
|
Extent = fileSize,
|
||||||
Summary = $"{fileType.Split("/")[1]} - {fileSize}",
|
Summary = $"File Type: {fileType.Split("/")[1]} - {fileSize}" + (string.IsNullOrWhiteSpace(chapter.Summary)
|
||||||
|
? string.Empty
|
||||||
|
: $" Summary: {chapter.Summary}"),
|
||||||
Format = mangaFile.Format.ToString(),
|
Format = mangaFile.Format.ToString(),
|
||||||
Links = new List<FeedLink>()
|
Links = new List<FeedLink>()
|
||||||
{
|
{
|
||||||
@ -1279,7 +1281,7 @@ public class OpdsController : BaseApiController
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private string SerializeXml(Feed feed)
|
private string SerializeXml(Feed? feed)
|
||||||
{
|
{
|
||||||
if (feed == null) return string.Empty;
|
if (feed == null) return string.Empty;
|
||||||
using var sm = new StringWriter();
|
using var sm = new StringWriter();
|
||||||
|
@ -511,6 +511,7 @@ public class SettingsController : BaseApiController
|
|||||||
public async Task<ActionResult<EmailTestResultDto>> TestEmailServiceUrl()
|
public async Task<ActionResult<EmailTestResultDto>> TestEmailServiceUrl()
|
||||||
{
|
{
|
||||||
var user = await _unitOfWork.UserRepository.GetUserByIdAsync(User.GetUserId());
|
var user = await _unitOfWork.UserRepository.GetUserByIdAsync(User.GetUserId());
|
||||||
|
if (string.IsNullOrEmpty(user?.Email)) return BadRequest("Your account has no email on record. Cannot email.");
|
||||||
return Ok(await _emailService.SendTestEmail(user!.Email));
|
return Ok(await _emailService.SendTestEmail(user!.Email));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -112,7 +112,6 @@ public class UsersController : BaseApiController
|
|||||||
existingPreferences.GlobalPageLayoutMode = preferencesDto.GlobalPageLayoutMode;
|
existingPreferences.GlobalPageLayoutMode = preferencesDto.GlobalPageLayoutMode;
|
||||||
existingPreferences.BlurUnreadSummaries = preferencesDto.BlurUnreadSummaries;
|
existingPreferences.BlurUnreadSummaries = preferencesDto.BlurUnreadSummaries;
|
||||||
existingPreferences.LayoutMode = preferencesDto.LayoutMode;
|
existingPreferences.LayoutMode = preferencesDto.LayoutMode;
|
||||||
existingPreferences.Theme = preferencesDto.Theme ?? await _unitOfWork.SiteThemeRepository.GetDefaultTheme();
|
|
||||||
existingPreferences.PromptForDownloadSize = preferencesDto.PromptForDownloadSize;
|
existingPreferences.PromptForDownloadSize = preferencesDto.PromptForDownloadSize;
|
||||||
existingPreferences.NoTransitions = preferencesDto.NoTransitions;
|
existingPreferences.NoTransitions = preferencesDto.NoTransitions;
|
||||||
existingPreferences.SwipeToPaginate = preferencesDto.SwipeToPaginate;
|
existingPreferences.SwipeToPaginate = preferencesDto.SwipeToPaginate;
|
||||||
@ -124,6 +123,12 @@ public class UsersController : BaseApiController
|
|||||||
existingPreferences.PdfScrollMode = preferencesDto.PdfScrollMode;
|
existingPreferences.PdfScrollMode = preferencesDto.PdfScrollMode;
|
||||||
existingPreferences.PdfSpreadMode = preferencesDto.PdfSpreadMode;
|
existingPreferences.PdfSpreadMode = preferencesDto.PdfSpreadMode;
|
||||||
|
|
||||||
|
if (existingPreferences.Theme.Id != preferencesDto.Theme?.Id)
|
||||||
|
{
|
||||||
|
existingPreferences.Theme = preferencesDto.Theme ?? await _unitOfWork.SiteThemeRepository.GetDefaultTheme();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (_localizationService.GetLocales().Contains(preferencesDto.Locale))
|
if (_localizationService.GetLocales().Contains(preferencesDto.Locale))
|
||||||
{
|
{
|
||||||
existingPreferences.Locale = preferencesDto.Locale;
|
existingPreferences.Locale = preferencesDto.Locale;
|
||||||
|
@ -4,7 +4,6 @@ using System.Linq;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using API.Data.Misc;
|
using API.Data.Misc;
|
||||||
using API.DTOs.Collection;
|
using API.DTOs.Collection;
|
||||||
using API.DTOs.CollectionTags;
|
|
||||||
using API.Entities;
|
using API.Entities;
|
||||||
using API.Entities.Enums;
|
using API.Entities.Enums;
|
||||||
using API.Extensions;
|
using API.Extensions;
|
||||||
@ -143,14 +142,6 @@ public class CollectionTagRepository : ICollectionTagRepository
|
|||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
[Obsolete("use TagExists with userId")]
|
|
||||||
public async Task<bool> TagExists(string title)
|
|
||||||
{
|
|
||||||
var normalized = title.ToNormalized();
|
|
||||||
return await _context.CollectionTag
|
|
||||||
.AnyAsync(x => x.NormalizedTitle != null && x.NormalizedTitle.Equals(normalized));
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// If any tag exists for that given user's collections
|
/// If any tag exists for that given user's collections
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -176,10 +167,9 @@ public class CollectionTagRepository : ICollectionTagRepository
|
|||||||
public async Task<IList<string>> GetRandomCoverImagesAsync(int collectionId)
|
public async Task<IList<string>> GetRandomCoverImagesAsync(int collectionId)
|
||||||
{
|
{
|
||||||
var random = new Random();
|
var random = new Random();
|
||||||
var data = await _context.CollectionTag
|
var data = await _context.AppUserCollection
|
||||||
.Where(t => t.Id == collectionId)
|
.Where(t => t.Id == collectionId)
|
||||||
.SelectMany(t => t.SeriesMetadatas)
|
.SelectMany(uc => uc.Items.Select(series => series.CoverImage))
|
||||||
.Select(sm => sm.Series.CoverImage)
|
|
||||||
.Where(t => !string.IsNullOrEmpty(t))
|
.Where(t => !string.IsNullOrEmpty(t))
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
|
|
||||||
@ -217,28 +207,6 @@ public class CollectionTagRepository : ICollectionTagRepository
|
|||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IEnumerable<CollectionTagDto>> GetAllTagDtosAsync()
|
|
||||||
{
|
|
||||||
|
|
||||||
return await _context.CollectionTag
|
|
||||||
.OrderBy(c => c.NormalizedTitle)
|
|
||||||
.AsNoTracking()
|
|
||||||
.ProjectTo<CollectionTagDto>(_mapper.ConfigurationProvider)
|
|
||||||
.ToListAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<IEnumerable<CollectionTagDto>> GetAllPromotedTagDtosAsync(int userId)
|
|
||||||
{
|
|
||||||
var userRating = await GetUserAgeRestriction(userId);
|
|
||||||
return await _context.CollectionTag
|
|
||||||
.Where(c => c.Promoted)
|
|
||||||
.RestrictAgainstAgeRestriction(userRating)
|
|
||||||
.OrderBy(c => c.NormalizedTitle)
|
|
||||||
.AsNoTracking()
|
|
||||||
.ProjectTo<CollectionTagDto>(_mapper.ConfigurationProvider)
|
|
||||||
.ToListAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public async Task<AppUserCollection?> GetCollectionAsync(int tagId, CollectionIncludes includes = CollectionIncludes.None)
|
public async Task<AppUserCollection?> GetCollectionAsync(int tagId, CollectionIncludes includes = CollectionIncludes.None)
|
||||||
{
|
{
|
||||||
|
@ -40,6 +40,8 @@
|
|||||||
"invalid-username": "Invalid username",
|
"invalid-username": "Invalid username",
|
||||||
"critical-email-migration": "There was an issue during email migration. Contact support",
|
"critical-email-migration": "There was an issue during email migration. Contact support",
|
||||||
"email-not-enabled": "Email is not enabled on this server. You cannot perform this action.",
|
"email-not-enabled": "Email is not enabled on this server. You cannot perform this action.",
|
||||||
|
"account-email-invalid": "The email on file for the admin account is not a valid email. Cannot send test email.",
|
||||||
|
"email-settings-invalid": "Email settings missing information. Ensure all email settings are saved.",
|
||||||
|
|
||||||
"chapter-doesnt-exist": "Chapter does not exist",
|
"chapter-doesnt-exist": "Chapter does not exist",
|
||||||
"file-missing": "File was not found in book",
|
"file-missing": "File was not found in book",
|
||||||
|
@ -51,16 +51,19 @@ public class EmailService : IEmailService
|
|||||||
private readonly IUnitOfWork _unitOfWork;
|
private readonly IUnitOfWork _unitOfWork;
|
||||||
private readonly IDirectoryService _directoryService;
|
private readonly IDirectoryService _directoryService;
|
||||||
private readonly IHostEnvironment _environment;
|
private readonly IHostEnvironment _environment;
|
||||||
|
private readonly ILocalizationService _localizationService;
|
||||||
|
|
||||||
private const string TemplatePath = @"{0}.html";
|
private const string TemplatePath = @"{0}.html";
|
||||||
private const string LocalHost = "localhost:4200";
|
private const string LocalHost = "localhost:4200";
|
||||||
|
|
||||||
public EmailService(ILogger<EmailService> logger, IUnitOfWork unitOfWork, IDirectoryService directoryService, IHostEnvironment environment)
|
public EmailService(ILogger<EmailService> logger, IUnitOfWork unitOfWork, IDirectoryService directoryService,
|
||||||
|
IHostEnvironment environment, ILocalizationService localizationService)
|
||||||
{
|
{
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
_unitOfWork = unitOfWork;
|
_unitOfWork = unitOfWork;
|
||||||
_directoryService = directoryService;
|
_directoryService = directoryService;
|
||||||
_environment = environment;
|
_environment = environment;
|
||||||
|
_localizationService = localizationService;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -75,9 +78,18 @@ public class EmailService : IEmailService
|
|||||||
};
|
};
|
||||||
|
|
||||||
var settings = await _unitOfWork.SettingsRepository.GetSettingsDtoAsync();
|
var settings = await _unitOfWork.SettingsRepository.GetSettingsDtoAsync();
|
||||||
if (!IsValidEmail(adminEmail) || !settings.IsEmailSetup())
|
if (!IsValidEmail(adminEmail))
|
||||||
{
|
{
|
||||||
result.ErrorMessage = "You need to fill in more information in settings and ensure your account has a valid email to send a test email";
|
var defaultAdmin = await _unitOfWork.UserRepository.GetDefaultAdminUser();
|
||||||
|
result.ErrorMessage = await _localizationService.Translate(defaultAdmin.Id, "account-email-invalid");
|
||||||
|
result.Successful = false;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!settings.IsEmailSetup())
|
||||||
|
{
|
||||||
|
var defaultAdmin = await _unitOfWork.UserRepository.GetDefaultAdminUser();
|
||||||
|
result.ErrorMessage = await _localizationService.Translate(defaultAdmin.Id, "email-settings-invalid");
|
||||||
result.Successful = false;
|
result.Successful = false;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -77,7 +77,7 @@ public class ReaderService : IReaderService
|
|||||||
|
|
||||||
public static string FormatBookmarkFolderPath(string baseDirectory, int userId, int seriesId, int chapterId)
|
public static string FormatBookmarkFolderPath(string baseDirectory, int userId, int seriesId, int chapterId)
|
||||||
{
|
{
|
||||||
return Tasks.Scanner.Parser.Parser.NormalizePath(Path.Join(baseDirectory, $"{userId}", $"{seriesId}", $"{chapterId}"));
|
return Parser.NormalizePath(Path.Join(baseDirectory, $"{userId}", $"{seriesId}", $"{chapterId}"));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"TokenKey": "super secret unguessable key that is longer because we require it",
|
"TokenKey": "super secret unguessable key that is longer because we require it",
|
||||||
"Port": 5000,
|
"Port": 5000,
|
||||||
"IpAddresses": "",
|
"IpAddresses": "0.0.0.0,::",
|
||||||
"BaseUrl": "/",
|
"BaseUrl": "/",
|
||||||
"Cache": 90,
|
"Cache": 75,
|
||||||
"AllowIFraming": false
|
"AllowIFraming": false
|
||||||
}
|
}
|
@ -270,7 +270,7 @@
|
|||||||
<table role="presentation" align="center" cellspacing="0" cellpadding="0" border="0" class="center-on-narrow" style="text-align: center;">
|
<table role="presentation" align="center" cellspacing="0" cellpadding="0" border="0" class="center-on-narrow" style="text-align: center;">
|
||||||
<tr>
|
<tr>
|
||||||
<td style="border-radius: 50px; background: #153643; text-align: center;" class="button-td">
|
<td style="border-radius: 50px; background: #153643; text-align: center;" class="button-td">
|
||||||
<a href="{{Link}}" style="background: #153643; border: 15px solid #153643; font-family: 'Montserrat', sans-serif; font-size: 14px; line-height: 1.1; text-align: center; text-decoration: none; display: block; border-radius: 50px; font-weight: bold;" class="button-a"> <span style="color:#ffffff;" class="button-link"> CONFIRM EMAIL </span> </a>
|
<a href="{{Link}}" rel="noopener noreferrer" style="background: #153643; border: 15px solid #153643; font-family: 'Montserrat', sans-serif; font-size: 14px; line-height: 1.1; text-align: center; text-decoration: none; display: block; border-radius: 50px; font-weight: bold;" class="button-a"> <span style="color:#ffffff;" class="button-link"> CONFIRM EMAIL </span> </a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
@ -278,7 +278,7 @@
|
|||||||
<!-- Button : END -->
|
<!-- Button : END -->
|
||||||
<tr>
|
<tr>
|
||||||
<td valign="top" style="text-align: center; padding: 10px 20px 15px 20px; font-family: sans-serif; font-size: 12px; line-height: 20px;">
|
<td valign="top" style="text-align: center; padding: 10px 20px 15px 20px; font-family: sans-serif; font-size: 12px; line-height: 20px;">
|
||||||
<p style="margin: 0;">If the button above does not work, please find the link here: <a style="color:inherit;margin: 0;width: 100%;word-break: break-all;" href="{{Link}}">{{Link}}</a></p>
|
<p style="margin: 0;">If the button above does not work, please find the link here: <a style="color:inherit;margin: 0;width: 100%;word-break: break-all;" rel="noopener noreferrer" href="{{Link}}">{{Link}}</a></p>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</td>
|
</td>
|
||||||
@ -312,19 +312,19 @@
|
|||||||
<table align="center" style="text-align: center;">
|
<table align="center" style="text-align: center;">
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<a href="https://discord.gg/b52wT37kt7"><img style="width:25px" src="https://www.kavitareader.com/img/email/discord-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Discord"></a>
|
<a rel="noopener noreferrer" href="https://discord.gg/b52wT37kt7"><img style="width:25px" src="https://www.kavitareader.com/img/email/discord-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Discord"></a>
|
||||||
</td>
|
</td>
|
||||||
<td width="20"> </td>
|
<td width="20"> </td>
|
||||||
<td>
|
<td>
|
||||||
<a href="https://www.reddit.com/r/KavitaManga/"><img style="width:25px" src="https://www.kavitareader.com/img/email/reddit-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Reddit"></a>
|
<a rel="noopener noreferrer" href="https://www.reddit.com/r/KavitaManga/"><img style="width:25px" src="https://www.kavitareader.com/img/email/reddit-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Reddit"></a>
|
||||||
</td>
|
</td>
|
||||||
<td width="20"> </td>
|
<td width="20"> </td>
|
||||||
<td>
|
<td>
|
||||||
<a href="https://github.com/Kareadita/Kavita/"><img style="width:25px" src="https://www.kavitareader.com/img/email/github-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Github"></a>
|
<a rel="noopener noreferrer" href="https://github.com/Kareadita/Kavita/"><img style="width:25px" src="https://www.kavitareader.com/img/email/github-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Github"></a>
|
||||||
</td>
|
</td>
|
||||||
<td width="20"> </td>
|
<td width="20"> </td>
|
||||||
<td>
|
<td>
|
||||||
<a href="https://opencollective.com/kavita"><img style="width:25px" src="https://www.kavitareader.com/img/email/open-collective-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Open Collective"></a>
|
<a rel="noopener noreferrer" href="https://opencollective.com/kavita"><img style="width:25px" src="https://www.kavitareader.com/img/email/open-collective-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Open Collective"></a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
@ -35,7 +35,7 @@
|
|||||||
@import url('https://fonts.googleapis.com/css2?family=Spartan:wght@500;700&display=swap');
|
@import url('https://fonts.googleapis.com/css2?family=Spartan:wght@500;700&display=swap');
|
||||||
/* What it does: Remove spaces around the email design added by some email clients. */
|
/* What it does: Remove spaces around the email design added by some email clients. */
|
||||||
/* Beware: It can remove the padding / margin and add a background color to the compose a reply window. */
|
/* Beware: It can remove the padding / margin and add a background color to the compose a reply window. */
|
||||||
|
|
||||||
html,
|
html,
|
||||||
body {
|
body {
|
||||||
margin: 0 auto !important;
|
margin: 0 auto !important;
|
||||||
@ -44,53 +44,53 @@
|
|||||||
width: 100% !important;
|
width: 100% !important;
|
||||||
}
|
}
|
||||||
/* What it does: Stops email clients resizing small text. */
|
/* What it does: Stops email clients resizing small text. */
|
||||||
|
|
||||||
* {
|
* {
|
||||||
-ms-text-size-adjust: 100%;
|
-ms-text-size-adjust: 100%;
|
||||||
-webkit-text-size-adjust: 100%;
|
-webkit-text-size-adjust: 100%;
|
||||||
}
|
}
|
||||||
/* What it does: Centers email on Android 4.4 */
|
/* What it does: Centers email on Android 4.4 */
|
||||||
|
|
||||||
div[style*="margin: 16px 0"] {
|
div[style*="margin: 16px 0"] {
|
||||||
margin: 0 !important;
|
margin: 0 !important;
|
||||||
}
|
}
|
||||||
/* What it does: Stops Outlook from adding extra spacing to tables. */
|
/* What it does: Stops Outlook from adding extra spacing to tables. */
|
||||||
|
|
||||||
table,
|
table,
|
||||||
td {
|
td {
|
||||||
mso-table-lspace: 0pt !important;
|
mso-table-lspace: 0pt !important;
|
||||||
mso-table-rspace: 0pt !important;
|
mso-table-rspace: 0pt !important;
|
||||||
}
|
}
|
||||||
/* What it does: Fixes webkit padding issue. Fix for Yahoo mail table alignment bug. Applies table-layout to the first 2 tables then removes for anything nested deeper. */
|
/* What it does: Fixes webkit padding issue. Fix for Yahoo mail table alignment bug. Applies table-layout to the first 2 tables then removes for anything nested deeper. */
|
||||||
|
|
||||||
table {
|
table {
|
||||||
border-spacing: 0 !important;
|
border-spacing: 0 !important;
|
||||||
border-collapse: collapse !important;
|
border-collapse: collapse !important;
|
||||||
table-layout: fixed !important;
|
table-layout: fixed !important;
|
||||||
margin: 0 auto !important;
|
margin: 0 auto !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
table table table {
|
table table table {
|
||||||
table-layout: auto;
|
table-layout: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
i {
|
i {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
font-size: 26px;
|
font-size: 26px;
|
||||||
}
|
}
|
||||||
/* What it does: Uses a better rendering method when resizing images in IE. */
|
/* What it does: Uses a better rendering method when resizing images in IE. */
|
||||||
|
|
||||||
img {
|
img {
|
||||||
-ms-interpolation-mode: bicubic;
|
-ms-interpolation-mode: bicubic;
|
||||||
}
|
}
|
||||||
/* What it does: A work-around for email clients meddling in triggered links. */
|
/* What it does: A work-around for email clients meddling in triggered links. */
|
||||||
|
|
||||||
*[x-apple-data-detectors],
|
*[x-apple-data-detectors],
|
||||||
/* iOS */
|
/* iOS */
|
||||||
|
|
||||||
.x-gmail-data-detectors,
|
.x-gmail-data-detectors,
|
||||||
/* Gmail */
|
/* Gmail */
|
||||||
|
|
||||||
.x-gmail-data-detectors *,
|
.x-gmail-data-detectors *,
|
||||||
.aBn {
|
.aBn {
|
||||||
border-bottom: 0 !important;
|
border-bottom: 0 !important;
|
||||||
@ -103,25 +103,25 @@
|
|||||||
line-height: inherit !important;
|
line-height: inherit !important;
|
||||||
}
|
}
|
||||||
/* What it does: Prevents Gmail from displaying an download button on large, non-linked images. */
|
/* What it does: Prevents Gmail from displaying an download button on large, non-linked images. */
|
||||||
|
|
||||||
.a6S {
|
.a6S {
|
||||||
display: none !important;
|
display: none !important;
|
||||||
opacity: 0.01 !important;
|
opacity: 0.01 !important;
|
||||||
}
|
}
|
||||||
/* If the above doesn't work, add a .g-img class to any image in question. */
|
/* If the above doesn't work, add a .g-img class to any image in question. */
|
||||||
|
|
||||||
img.g-img + div {
|
img.g-img + div {
|
||||||
display: none !important;
|
display: none !important;
|
||||||
}
|
}
|
||||||
/* What it does: Prevents underlining the button text in Windows 10 */
|
/* What it does: Prevents underlining the button text in Windows 10 */
|
||||||
|
|
||||||
.button-link {
|
.button-link {
|
||||||
text-decoration: none !important;
|
text-decoration: none !important;
|
||||||
}
|
}
|
||||||
/* What it does: Removes right gutter in Gmail iOS app: https://github.com/TedGoas/Cerberus/issues/89 */
|
/* What it does: Removes right gutter in Gmail iOS app: https://github.com/TedGoas/Cerberus/issues/89 */
|
||||||
/* Create one of these media queries for each additional viewport size you'd like to fix */
|
/* Create one of these media queries for each additional viewport size you'd like to fix */
|
||||||
/* Thanks to Eric Lepetit @ericlepetitsf) for help troubleshooting */
|
/* Thanks to Eric Lepetit @ericlepetitsf) for help troubleshooting */
|
||||||
|
|
||||||
@media only screen and (min-device-width: 375px) and (max-device-width: 413px) {
|
@media only screen and (min-device-width: 375px) and (max-device-width: 413px) {
|
||||||
/* iPhone 6 and 6+ */
|
/* iPhone 6 and 6+ */
|
||||||
.email-container {
|
.email-container {
|
||||||
@ -132,12 +132,12 @@
|
|||||||
<!-- Progressive Enhancements -->
|
<!-- Progressive Enhancements -->
|
||||||
<style>
|
<style>
|
||||||
/* What it does: Hover styles for buttons */
|
/* What it does: Hover styles for buttons */
|
||||||
|
|
||||||
.button-td,
|
.button-td,
|
||||||
.button-a {
|
.button-a {
|
||||||
transition: all 100ms ease-in;
|
transition: all 100ms ease-in;
|
||||||
}
|
}
|
||||||
|
|
||||||
.button-td:hover,
|
.button-td:hover,
|
||||||
.button-a:hover {
|
.button-a:hover {
|
||||||
background: #000000 !important;
|
background: #000000 !important;
|
||||||
@ -145,7 +145,7 @@
|
|||||||
color: white !important;
|
color: white !important;
|
||||||
}
|
}
|
||||||
/* Media Queries */
|
/* Media Queries */
|
||||||
|
|
||||||
@media screen and (max-width: 480px) {
|
@media screen and (max-width: 480px) {
|
||||||
/* What it does: Forces elements to resize to the full width of their container. Useful for resizing images beyond their max-width. */
|
/* What it does: Forces elements to resize to the full width of their container. Useful for resizing images beyond their max-width. */
|
||||||
.fluid {
|
.fluid {
|
||||||
@ -270,7 +270,7 @@
|
|||||||
<table role="presentation" align="center" cellspacing="0" cellpadding="0" border="0" class="center-on-narrow" style="text-align: center;">
|
<table role="presentation" align="center" cellspacing="0" cellpadding="0" border="0" class="center-on-narrow" style="text-align: center;">
|
||||||
<tr>
|
<tr>
|
||||||
<td style="border-radius: 50px; background: #153643; text-align: center;" class="button-td">
|
<td style="border-radius: 50px; background: #153643; text-align: center;" class="button-td">
|
||||||
<a href="{{Link}}" style="background: #153643; border: 15px solid #153643; font-family: 'Montserrat', sans-serif; font-size: 14px; line-height: 1.1; text-align: center; text-decoration: none; display: block; border-radius: 50px; font-weight: bold;" class="button-a"> <span style="color:#ffffff;" class="button-link"> ACCEPT INVITE </span> </a>
|
<a href="{{Link}}" rel="noopener noreferrer" style="background: #153643; border: 15px solid #153643; font-family: 'Montserrat', sans-serif; font-size: 14px; line-height: 1.1; text-align: center; text-decoration: none; display: block; border-radius: 50px; font-weight: bold;" class="button-a"> <span style="color:#ffffff;" class="button-link"> ACCEPT INVITE </span> </a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
@ -278,7 +278,7 @@
|
|||||||
<!-- Button : END -->
|
<!-- Button : END -->
|
||||||
<tr>
|
<tr>
|
||||||
<td valign="top" style="text-align: center; padding: 10px 20px 15px 20px; font-family: sans-serif; font-size: 12px; line-height: 20px;">
|
<td valign="top" style="text-align: center; padding: 10px 20px 15px 20px; font-family: sans-serif; font-size: 12px; line-height: 20px;">
|
||||||
<p style="margin: 0;">If the button above does not work, please find the link here: <a style="color:inherit;margin: 0;width: 100%;word-break: break-all;" href="{{Link}}">{{Link}}</a></p>
|
<p style="margin: 0;">If the button above does not work, please find the link here: <a style="color:inherit;margin: 0;width: 100%;word-break: break-all;" rel="noopener noreferrer" href="{{Link}}">{{Link}}</a></p>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</td>
|
</td>
|
||||||
@ -312,19 +312,19 @@
|
|||||||
<table align="center" style="text-align: center;">
|
<table align="center" style="text-align: center;">
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<a href="https://discord.gg/b52wT37kt7"><img style="width:25px" src="https://www.kavitareader.com/img/email/discord-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Discord"></a>
|
<a rel="noopener noreferrer" href="https://discord.gg/b52wT37kt7"><img style="width:25px" src="https://www.kavitareader.com/img/email/discord-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Discord"></a>
|
||||||
</td>
|
</td>
|
||||||
<td width="20"> </td>
|
<td width="20"> </td>
|
||||||
<td>
|
<td>
|
||||||
<a href="https://www.reddit.com/r/KavitaManga/"><img style="width:25px" src="https://www.kavitareader.com/img/email/reddit-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Reddit"></a>
|
<a rel="noopener noreferrer" href="https://www.reddit.com/r/KavitaManga/"><img style="width:25px" src="https://www.kavitareader.com/img/email/reddit-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Reddit"></a>
|
||||||
</td>
|
</td>
|
||||||
<td width="20"> </td>
|
<td width="20"> </td>
|
||||||
<td>
|
<td>
|
||||||
<a href="https://github.com/Kareadita/Kavita/"><img style="width:25px" src="https://www.kavitareader.com/img/email/github-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Github"></a>
|
<a rel="noopener noreferrer" href="https://github.com/Kareadita/Kavita/"><img style="width:25px" src="https://www.kavitareader.com/img/email/github-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Github"></a>
|
||||||
</td>
|
</td>
|
||||||
<td width="20"> </td>
|
<td width="20"> </td>
|
||||||
<td>
|
<td>
|
||||||
<a href="https://opencollective.com/kavita"><img style="width:25px" src="https://www.kavitareader.com/img/email/open-collective-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Open Collective"></a>
|
<a rel="noopener noreferrer" href="https://opencollective.com/kavita"><img style="width:25px" src="https://www.kavitareader.com/img/email/open-collective-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Open Collective"></a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
@ -345,4 +345,4 @@
|
|||||||
</center>
|
</center>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
@ -35,7 +35,7 @@
|
|||||||
@import url(https://fonts.googleapis.com/css2?family=Spartan:wght@500;700&display=swap);
|
@import url(https://fonts.googleapis.com/css2?family=Spartan:wght@500;700&display=swap);
|
||||||
/* What it does: Remove spaces around the email design added by some email clients. */
|
/* What it does: Remove spaces around the email design added by some email clients. */
|
||||||
/* Beware: It can remove the padding / margin and add a background color to the compose a reply window. */
|
/* Beware: It can remove the padding / margin and add a background color to the compose a reply window. */
|
||||||
|
|
||||||
html,
|
html,
|
||||||
body {
|
body {
|
||||||
margin: 0 auto !important;
|
margin: 0 auto !important;
|
||||||
@ -44,53 +44,53 @@
|
|||||||
width: 100% !important;
|
width: 100% !important;
|
||||||
}
|
}
|
||||||
/* What it does: Stops email clients resizing small text. */
|
/* What it does: Stops email clients resizing small text. */
|
||||||
|
|
||||||
* {
|
* {
|
||||||
-ms-text-size-adjust: 100%;
|
-ms-text-size-adjust: 100%;
|
||||||
-webkit-text-size-adjust: 100%;
|
-webkit-text-size-adjust: 100%;
|
||||||
}
|
}
|
||||||
/* What it does: Centers email on Android 4.4 */
|
/* What it does: Centers email on Android 4.4 */
|
||||||
|
|
||||||
div[style*="margin: 16px 0"] {
|
div[style*="margin: 16px 0"] {
|
||||||
margin: 0 !important;
|
margin: 0 !important;
|
||||||
}
|
}
|
||||||
/* What it does: Stops Outlook from adding extra spacing to tables. */
|
/* What it does: Stops Outlook from adding extra spacing to tables. */
|
||||||
|
|
||||||
table,
|
table,
|
||||||
td {
|
td {
|
||||||
mso-table-lspace: 0pt !important;
|
mso-table-lspace: 0pt !important;
|
||||||
mso-table-rspace: 0pt !important;
|
mso-table-rspace: 0pt !important;
|
||||||
}
|
}
|
||||||
/* What it does: Fixes webkit padding issue. Fix for Yahoo mail table alignment bug. Applies table-layout to the first 2 tables then removes for anything nested deeper. */
|
/* What it does: Fixes webkit padding issue. Fix for Yahoo mail table alignment bug. Applies table-layout to the first 2 tables then removes for anything nested deeper. */
|
||||||
|
|
||||||
table {
|
table {
|
||||||
border-spacing: 0 !important;
|
border-spacing: 0 !important;
|
||||||
border-collapse: collapse !important;
|
border-collapse: collapse !important;
|
||||||
table-layout: fixed !important;
|
table-layout: fixed !important;
|
||||||
margin: 0 auto !important;
|
margin: 0 auto !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
table table table {
|
table table table {
|
||||||
table-layout: auto;
|
table-layout: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
i {
|
i {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
font-size: 26px;
|
font-size: 26px;
|
||||||
}
|
}
|
||||||
/* What it does: Uses a better rendering method when resizing images in IE. */
|
/* What it does: Uses a better rendering method when resizing images in IE. */
|
||||||
|
|
||||||
img {
|
img {
|
||||||
-ms-interpolation-mode: bicubic;
|
-ms-interpolation-mode: bicubic;
|
||||||
}
|
}
|
||||||
/* What it does: A work-around for email clients meddling in triggered links. */
|
/* What it does: A work-around for email clients meddling in triggered links. */
|
||||||
|
|
||||||
*[x-apple-data-detectors],
|
*[x-apple-data-detectors],
|
||||||
/* iOS */
|
/* iOS */
|
||||||
|
|
||||||
.x-gmail-data-detectors,
|
.x-gmail-data-detectors,
|
||||||
/* Gmail */
|
/* Gmail */
|
||||||
|
|
||||||
.x-gmail-data-detectors *,
|
.x-gmail-data-detectors *,
|
||||||
.aBn {
|
.aBn {
|
||||||
border-bottom: 0 !important;
|
border-bottom: 0 !important;
|
||||||
@ -103,25 +103,25 @@
|
|||||||
line-height: inherit !important;
|
line-height: inherit !important;
|
||||||
}
|
}
|
||||||
/* What it does: Prevents Gmail from displaying an download button on large, non-linked images. */
|
/* What it does: Prevents Gmail from displaying an download button on large, non-linked images. */
|
||||||
|
|
||||||
.a6S {
|
.a6S {
|
||||||
display: none !important;
|
display: none !important;
|
||||||
opacity: 0.01 !important;
|
opacity: 0.01 !important;
|
||||||
}
|
}
|
||||||
/* If the above doesn't work, add a .g-img class to any image in question. */
|
/* If the above doesn't work, add a .g-img class to any image in question. */
|
||||||
|
|
||||||
img.g-img + div {
|
img.g-img + div {
|
||||||
display: none !important;
|
display: none !important;
|
||||||
}
|
}
|
||||||
/* What it does: Prevents underlining the button text in Windows 10 */
|
/* What it does: Prevents underlining the button text in Windows 10 */
|
||||||
|
|
||||||
.button-link {
|
.button-link {
|
||||||
text-decoration: none !important;
|
text-decoration: none !important;
|
||||||
}
|
}
|
||||||
/* What it does: Removes right gutter in Gmail iOS app: https://github.com/TedGoas/Cerberus/issues/89 */
|
/* What it does: Removes right gutter in Gmail iOS app: https://github.com/TedGoas/Cerberus/issues/89 */
|
||||||
/* Create one of these media queries for each additional viewport size you'd like to fix */
|
/* Create one of these media queries for each additional viewport size you'd like to fix */
|
||||||
/* Thanks to Eric Lepetit @ericlepetitsf) for help troubleshooting */
|
/* Thanks to Eric Lepetit @ericlepetitsf) for help troubleshooting */
|
||||||
|
|
||||||
@media only screen and (min-device-width: 375px) and (max-device-width: 413px) {
|
@media only screen and (min-device-width: 375px) and (max-device-width: 413px) {
|
||||||
/* iPhone 6 and 6+ */
|
/* iPhone 6 and 6+ */
|
||||||
.email-container {
|
.email-container {
|
||||||
@ -132,12 +132,12 @@
|
|||||||
<!-- Progressive Enhancements -->
|
<!-- Progressive Enhancements -->
|
||||||
<style>
|
<style>
|
||||||
/* What it does: Hover styles for buttons */
|
/* What it does: Hover styles for buttons */
|
||||||
|
|
||||||
.button-td,
|
.button-td,
|
||||||
.button-a {
|
.button-a {
|
||||||
transition: all 100ms ease-in;
|
transition: all 100ms ease-in;
|
||||||
}
|
}
|
||||||
|
|
||||||
.button-td:hover,
|
.button-td:hover,
|
||||||
.button-a:hover {
|
.button-a:hover {
|
||||||
background: #000000 !important;
|
background: #000000 !important;
|
||||||
@ -145,7 +145,7 @@
|
|||||||
color: white !important;
|
color: white !important;
|
||||||
}
|
}
|
||||||
/* Media Queries */
|
/* Media Queries */
|
||||||
|
|
||||||
@media screen and (max-width: 480px) {
|
@media screen and (max-width: 480px) {
|
||||||
/* What it does: Forces elements to resize to the full width of their container. Useful for resizing images beyond their max-width. */
|
/* What it does: Forces elements to resize to the full width of their container. Useful for resizing images beyond their max-width. */
|
||||||
.fluid {
|
.fluid {
|
||||||
@ -265,7 +265,7 @@
|
|||||||
<table role="presentation" align="center" cellspacing="0" cellpadding="0" border="0" class="center-on-narrow" style="text-align: center;">
|
<table role="presentation" align="center" cellspacing="0" cellpadding="0" border="0" class="center-on-narrow" style="text-align: center;">
|
||||||
<tr>
|
<tr>
|
||||||
<td style="border-radius: 50px; background: #153643; text-align: center;" class="button-td">
|
<td style="border-radius: 50px; background: #153643; text-align: center;" class="button-td">
|
||||||
<a href="{{Link}}" style="background: #153643; border: 15px solid #153643; font-family: 'Montserrat', sans-serif; font-size: 14px; line-height: 1.1; text-align: center; text-decoration: none; display: block; border-radius: 50px; font-weight: bold;" class="button-a"> <span style="color:#ffffff;" class="button-link"> CONFIRM </span> </a>
|
<a rel="noopener noreferrer" href="{{Link}}" style="background: #153643; border: 15px solid #153643; font-family: 'Montserrat', sans-serif; font-size: 14px; line-height: 1.1; text-align: center; text-decoration: none; display: block; border-radius: 50px; font-weight: bold;" class="button-a"> <span style="color:#ffffff;" class="button-link"> CONFIRM </span> </a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
@ -273,7 +273,7 @@
|
|||||||
<!-- Button : END -->
|
<!-- Button : END -->
|
||||||
<tr>
|
<tr>
|
||||||
<td valign="top" style="text-align: center; padding: 10px 20px 15px 20px; font-family: sans-serif; font-size: 12px; line-height: 20px;">
|
<td valign="top" style="text-align: center; padding: 10px 20px 15px 20px; font-family: sans-serif; font-size: 12px; line-height: 20px;">
|
||||||
<p style="margin: 0;">If the button above does not work, please find the link here: <a style="color:inherit;margin: 0;width: 100%;word-break: break-all;" href="{{Link}}">{{Link}}</a></p>
|
<p style="margin: 0;">If the button above does not work, please find the link here: <a style="color:inherit;margin: 0;width: 100%;word-break: break-all;" rel="noopener noreferrer" href="{{Link}}">{{Link}}</a></p>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</td>
|
</td>
|
||||||
@ -307,19 +307,19 @@
|
|||||||
<table align="center" style="text-align: center;">
|
<table align="center" style="text-align: center;">
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<a href="https://discord.gg/b52wT37kt7"><img style="width:25px" src="https://www.kavitareader.com/img/email/discord-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Discord"></a>
|
<a rel="noopener noreferrer" href="https://discord.gg/b52wT37kt7"><img style="width:25px" src="https://www.kavitareader.com/img/email/discord-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Discord"></a>
|
||||||
</td>
|
</td>
|
||||||
<td width="20"> </td>
|
<td width="20"> </td>
|
||||||
<td>
|
<td>
|
||||||
<a href="https://www.reddit.com/r/KavitaManga/"><img style="width:25px" src="https://www.kavitareader.com/img/email/reddit-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Reddit"></a>
|
<a rel="noopener noreferrer" href="https://www.reddit.com/r/KavitaManga/"><img style="width:25px" src="https://www.kavitareader.com/img/email/reddit-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Reddit"></a>
|
||||||
</td>
|
</td>
|
||||||
<td width="20"> </td>
|
<td width="20"> </td>
|
||||||
<td>
|
<td>
|
||||||
<a href="https://github.com/Kareadita/Kavita/"><img style="width:25px" src="https://www.kavitareader.com/img/email/github-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Github"></a>
|
<a rel="noopener noreferrer" href="https://github.com/Kareadita/Kavita/"><img style="width:25px" src="https://www.kavitareader.com/img/email/github-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Github"></a>
|
||||||
</td>
|
</td>
|
||||||
<td width="20"> </td>
|
<td width="20"> </td>
|
||||||
<td>
|
<td>
|
||||||
<a href="https://opencollective.com/kavita"><img style="width:25px" src="https://www.kavitareader.com/img/email/open-collective-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Open Collective"></a>
|
<a rel="noopener noreferrer" href="https://opencollective.com/kavita"><img style="width:25px" src="https://www.kavitareader.com/img/email/open-collective-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Open Collective"></a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
@ -340,4 +340,4 @@
|
|||||||
</center>
|
</center>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
@ -35,7 +35,7 @@
|
|||||||
@import url(https://fonts.googleapis.com/css2?family=Spartan:wght@500;700&display=swap);
|
@import url(https://fonts.googleapis.com/css2?family=Spartan:wght@500;700&display=swap);
|
||||||
/* What it does: Remove spaces around the email design added by some email clients. */
|
/* What it does: Remove spaces around the email design added by some email clients. */
|
||||||
/* Beware: It can remove the padding / margin and add a background color to the compose a reply window. */
|
/* Beware: It can remove the padding / margin and add a background color to the compose a reply window. */
|
||||||
|
|
||||||
html,
|
html,
|
||||||
body {
|
body {
|
||||||
margin: 0 auto !important;
|
margin: 0 auto !important;
|
||||||
@ -44,53 +44,53 @@
|
|||||||
width: 100% !important;
|
width: 100% !important;
|
||||||
}
|
}
|
||||||
/* What it does: Stops email clients resizing small text. */
|
/* What it does: Stops email clients resizing small text. */
|
||||||
|
|
||||||
* {
|
* {
|
||||||
-ms-text-size-adjust: 100%;
|
-ms-text-size-adjust: 100%;
|
||||||
-webkit-text-size-adjust: 100%;
|
-webkit-text-size-adjust: 100%;
|
||||||
}
|
}
|
||||||
/* What it does: Centers email on Android 4.4 */
|
/* What it does: Centers email on Android 4.4 */
|
||||||
|
|
||||||
div[style*="margin: 16px 0"] {
|
div[style*="margin: 16px 0"] {
|
||||||
margin: 0 !important;
|
margin: 0 !important;
|
||||||
}
|
}
|
||||||
/* What it does: Stops Outlook from adding extra spacing to tables. */
|
/* What it does: Stops Outlook from adding extra spacing to tables. */
|
||||||
|
|
||||||
table,
|
table,
|
||||||
td {
|
td {
|
||||||
mso-table-lspace: 0pt !important;
|
mso-table-lspace: 0pt !important;
|
||||||
mso-table-rspace: 0pt !important;
|
mso-table-rspace: 0pt !important;
|
||||||
}
|
}
|
||||||
/* What it does: Fixes webkit padding issue. Fix for Yahoo mail table alignment bug. Applies table-layout to the first 2 tables then removes for anything nested deeper. */
|
/* What it does: Fixes webkit padding issue. Fix for Yahoo mail table alignment bug. Applies table-layout to the first 2 tables then removes for anything nested deeper. */
|
||||||
|
|
||||||
table {
|
table {
|
||||||
border-spacing: 0 !important;
|
border-spacing: 0 !important;
|
||||||
border-collapse: collapse !important;
|
border-collapse: collapse !important;
|
||||||
table-layout: fixed !important;
|
table-layout: fixed !important;
|
||||||
margin: 0 auto !important;
|
margin: 0 auto !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
table table table {
|
table table table {
|
||||||
table-layout: auto;
|
table-layout: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
i {
|
i {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
font-size: 26px;
|
font-size: 26px;
|
||||||
}
|
}
|
||||||
/* What it does: Uses a better rendering method when resizing images in IE. */
|
/* What it does: Uses a better rendering method when resizing images in IE. */
|
||||||
|
|
||||||
img {
|
img {
|
||||||
-ms-interpolation-mode: bicubic;
|
-ms-interpolation-mode: bicubic;
|
||||||
}
|
}
|
||||||
/* What it does: A work-around for email clients meddling in triggered links. */
|
/* What it does: A work-around for email clients meddling in triggered links. */
|
||||||
|
|
||||||
*[x-apple-data-detectors],
|
*[x-apple-data-detectors],
|
||||||
/* iOS */
|
/* iOS */
|
||||||
|
|
||||||
.x-gmail-data-detectors,
|
.x-gmail-data-detectors,
|
||||||
/* Gmail */
|
/* Gmail */
|
||||||
|
|
||||||
.x-gmail-data-detectors *,
|
.x-gmail-data-detectors *,
|
||||||
.aBn {
|
.aBn {
|
||||||
border-bottom: 0 !important;
|
border-bottom: 0 !important;
|
||||||
@ -103,25 +103,25 @@
|
|||||||
line-height: inherit !important;
|
line-height: inherit !important;
|
||||||
}
|
}
|
||||||
/* What it does: Prevents Gmail from displaying an download button on large, non-linked images. */
|
/* What it does: Prevents Gmail from displaying an download button on large, non-linked images. */
|
||||||
|
|
||||||
.a6S {
|
.a6S {
|
||||||
display: none !important;
|
display: none !important;
|
||||||
opacity: 0.01 !important;
|
opacity: 0.01 !important;
|
||||||
}
|
}
|
||||||
/* If the above doesn't work, add a .g-img class to any image in question. */
|
/* If the above doesn't work, add a .g-img class to any image in question. */
|
||||||
|
|
||||||
img.g-img + div {
|
img.g-img + div {
|
||||||
display: none !important;
|
display: none !important;
|
||||||
}
|
}
|
||||||
/* What it does: Prevents underlining the button text in Windows 10 */
|
/* What it does: Prevents underlining the button text in Windows 10 */
|
||||||
|
|
||||||
.button-link {
|
.button-link {
|
||||||
text-decoration: none !important;
|
text-decoration: none !important;
|
||||||
}
|
}
|
||||||
/* What it does: Removes right gutter in Gmail iOS app: https://github.com/TedGoas/Cerberus/issues/89 */
|
/* What it does: Removes right gutter in Gmail iOS app: https://github.com/TedGoas/Cerberus/issues/89 */
|
||||||
/* Create one of these media queries for each additional viewport size you'd like to fix */
|
/* Create one of these media queries for each additional viewport size you'd like to fix */
|
||||||
/* Thanks to Eric Lepetit @ericlepetitsf) for help troubleshooting */
|
/* Thanks to Eric Lepetit @ericlepetitsf) for help troubleshooting */
|
||||||
|
|
||||||
@media only screen and (min-device-width: 375px) and (max-device-width: 413px) {
|
@media only screen and (min-device-width: 375px) and (max-device-width: 413px) {
|
||||||
/* iPhone 6 and 6+ */
|
/* iPhone 6 and 6+ */
|
||||||
.email-container {
|
.email-container {
|
||||||
@ -132,12 +132,12 @@
|
|||||||
<!-- Progressive Enhancements -->
|
<!-- Progressive Enhancements -->
|
||||||
<style>
|
<style>
|
||||||
/* What it does: Hover styles for buttons */
|
/* What it does: Hover styles for buttons */
|
||||||
|
|
||||||
.button-td,
|
.button-td,
|
||||||
.button-a {
|
.button-a {
|
||||||
transition: all 100ms ease-in;
|
transition: all 100ms ease-in;
|
||||||
}
|
}
|
||||||
|
|
||||||
.button-td:hover,
|
.button-td:hover,
|
||||||
.button-a:hover {
|
.button-a:hover {
|
||||||
background: #000000 !important;
|
background: #000000 !important;
|
||||||
@ -145,7 +145,7 @@
|
|||||||
color: white !important;
|
color: white !important;
|
||||||
}
|
}
|
||||||
/* Media Queries */
|
/* Media Queries */
|
||||||
|
|
||||||
@media screen and (max-width: 480px) {
|
@media screen and (max-width: 480px) {
|
||||||
/* What it does: Forces elements to resize to the full width of their container. Useful for resizing images beyond their max-width. */
|
/* What it does: Forces elements to resize to the full width of their container. Useful for resizing images beyond their max-width. */
|
||||||
.fluid {
|
.fluid {
|
||||||
@ -265,7 +265,7 @@
|
|||||||
<table role="presentation" align="center" cellspacing="0" cellpadding="0" border="0" class="center-on-narrow" style="text-align: center;">
|
<table role="presentation" align="center" cellspacing="0" cellpadding="0" border="0" class="center-on-narrow" style="text-align: center;">
|
||||||
<tr>
|
<tr>
|
||||||
<td style="border-radius: 50px; background: #153643; text-align: center;" class="button-td">
|
<td style="border-radius: 50px; background: #153643; text-align: center;" class="button-td">
|
||||||
<a href="{{Link}}" style="background: #153643; border: 15px solid #153643; font-family: 'Montserrat', sans-serif; font-size: 14px; line-height: 1.1; text-align: center; text-decoration: none; display: block; border-radius: 50px; font-weight: bold;" class="button-a"> <span style="color:#ffffff;" class="button-link"> RESET YOUR PASSWORD </span> </a>
|
<a rel="noopener noreferrer" href="{{Link}}" style="background: #153643; border: 15px solid #153643; font-family: 'Montserrat', sans-serif; font-size: 14px; line-height: 1.1; text-align: center; text-decoration: none; display: block; border-radius: 50px; font-weight: bold;" class="button-a"> <span style="color:#ffffff;" class="button-link"> RESET YOUR PASSWORD </span> </a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
@ -278,7 +278,7 @@
|
|||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td valign="top" style="text-align: center; padding: 10px 20px 15px 20px; font-family: sans-serif; font-size: 12px; line-height: 20px;">
|
<td valign="top" style="text-align: center; padding: 10px 20px 15px 20px; font-family: sans-serif; font-size: 12px; line-height: 20px;">
|
||||||
<p style="margin: 0;">If the button above does not work, please find the link here: <a style="color:inherit;margin: 0;width: 100%;word-break: break-all;" href="{{Link}}">{{Link}}</a></p>
|
<p style="margin: 0;">If the button above does not work, please find the link here: <a style="color:inherit;margin: 0;width: 100%;word-break: break-all;" rel="noopener noreferrer" href="{{Link}}">{{Link}}</a></p>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</td>
|
</td>
|
||||||
@ -312,19 +312,19 @@
|
|||||||
<table align="center" style="text-align: center;">
|
<table align="center" style="text-align: center;">
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<a href="https://discord.gg/b52wT37kt7"><img style="width:25px" src="https://www.kavitareader.com/img/email/discord-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Discord"></a>
|
<a rel="noopener noreferrer" href="https://discord.gg/b52wT37kt7"><img style="width:25px" src="https://www.kavitareader.com/img/email/discord-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Discord"></a>
|
||||||
</td>
|
</td>
|
||||||
<td width="20"> </td>
|
<td width="20"> </td>
|
||||||
<td>
|
<td>
|
||||||
<a href="https://www.reddit.com/r/KavitaManga/"><img style="width:25px" src="https://www.kavitareader.com/img/email/reddit-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Reddit"></a>
|
<a rel="noopener noreferrer" href="https://www.reddit.com/r/KavitaManga/"><img style="width:25px" src="https://www.kavitareader.com/img/email/reddit-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Reddit"></a>
|
||||||
</td>
|
</td>
|
||||||
<td width="20"> </td>
|
<td width="20"> </td>
|
||||||
<td>
|
<td>
|
||||||
<a href="https://github.com/Kareadita/Kavita/"><img style="width:25px" src="https://www.kavitareader.com/img/email/github-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Github"></a>
|
<a rel="noopener noreferrer" href="https://github.com/Kareadita/Kavita/"><img style="width:25px" src="https://www.kavitareader.com/img/email/github-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Github"></a>
|
||||||
</td>
|
</td>
|
||||||
<td width="20"> </td>
|
<td width="20"> </td>
|
||||||
<td>
|
<td>
|
||||||
<a href="https://opencollective.com/kavita"><img style="width:25px" src="https://www.kavitareader.com/img/email/open-collective-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Open Collective"></a>
|
<a rel="noopener noreferrer" href="https://opencollective.com/kavita"><img style="width:25px" src="https://www.kavitareader.com/img/email/open-collective-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Open Collective"></a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
@ -345,4 +345,4 @@
|
|||||||
</center>
|
</center>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
@ -289,19 +289,19 @@
|
|||||||
<table align="center" style="text-align: center;">
|
<table align="center" style="text-align: center;">
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<a href="https://discord.gg/b52wT37kt7"><img style="width:25px" src="https://www.kavitareader.com/img/email/discord-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Discord"></a>
|
<a rel="noopener noreferrer" href="https://discord.gg/b52wT37kt7"><img style="width:25px" src="https://www.kavitareader.com/img/email/discord-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Discord"></a>
|
||||||
</td>
|
</td>
|
||||||
<td width="20"> </td>
|
<td width="20"> </td>
|
||||||
<td>
|
<td>
|
||||||
<a href="https://www.reddit.com/r/KavitaManga/"><img style="width:25px" src="https://www.kavitareader.com/img/email/reddit-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Reddit"></a>
|
<a rel="noopener noreferrer" href="https://www.reddit.com/r/KavitaManga/"><img style="width:25px" src="https://www.kavitareader.com/img/email/reddit-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Reddit"></a>
|
||||||
</td>
|
</td>
|
||||||
<td width="20"> </td>
|
<td width="20"> </td>
|
||||||
<td>
|
<td>
|
||||||
<a href="https://github.com/Kareadita/Kavita/"><img style="width:25px" src="https://www.kavitareader.com/img/email/github-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Github"></a>
|
<a rel="noopener noreferrer" href="https://github.com/Kareadita/Kavita/"><img style="width:25px" src="https://www.kavitareader.com/img/email/github-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Github"></a>
|
||||||
</td>
|
</td>
|
||||||
<td width="20"> </td>
|
<td width="20"> </td>
|
||||||
<td>
|
<td>
|
||||||
<a href="https://opencollective.com/kavita"><img style="width:25px" src="https://www.kavitareader.com/img/email/open-collective-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Open Collective"></a>
|
<a rel="noopener noreferrer" href="https://opencollective.com/kavita"><img style="width:25px" src="https://www.kavitareader.com/img/email/open-collective-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Open Collective"></a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
@ -35,7 +35,7 @@
|
|||||||
@import url('https://fonts.googleapis.com/css2?family=Spartan:wght@500;700&display=swap');
|
@import url('https://fonts.googleapis.com/css2?family=Spartan:wght@500;700&display=swap');
|
||||||
/* What it does: Remove spaces around the email design added by some email clients. */
|
/* What it does: Remove spaces around the email design added by some email clients. */
|
||||||
/* Beware: It can remove the padding / margin and add a background color to the compose a reply window. */
|
/* Beware: It can remove the padding / margin and add a background color to the compose a reply window. */
|
||||||
|
|
||||||
html,
|
html,
|
||||||
body {
|
body {
|
||||||
margin: 0 auto !important;
|
margin: 0 auto !important;
|
||||||
@ -44,53 +44,53 @@
|
|||||||
width: 100% !important;
|
width: 100% !important;
|
||||||
}
|
}
|
||||||
/* What it does: Stops email clients resizing small text. */
|
/* What it does: Stops email clients resizing small text. */
|
||||||
|
|
||||||
* {
|
* {
|
||||||
-ms-text-size-adjust: 100%;
|
-ms-text-size-adjust: 100%;
|
||||||
-webkit-text-size-adjust: 100%;
|
-webkit-text-size-adjust: 100%;
|
||||||
}
|
}
|
||||||
/* What it does: Centers email on Android 4.4 */
|
/* What it does: Centers email on Android 4.4 */
|
||||||
|
|
||||||
div[style*="margin: 16px 0"] {
|
div[style*="margin: 16px 0"] {
|
||||||
margin: 0 !important;
|
margin: 0 !important;
|
||||||
}
|
}
|
||||||
/* What it does: Stops Outlook from adding extra spacing to tables. */
|
/* What it does: Stops Outlook from adding extra spacing to tables. */
|
||||||
|
|
||||||
table,
|
table,
|
||||||
td {
|
td {
|
||||||
mso-table-lspace: 0pt !important;
|
mso-table-lspace: 0pt !important;
|
||||||
mso-table-rspace: 0pt !important;
|
mso-table-rspace: 0pt !important;
|
||||||
}
|
}
|
||||||
/* What it does: Fixes webkit padding issue. Fix for Yahoo mail table alignment bug. Applies table-layout to the first 2 tables then removes for anything nested deeper. */
|
/* What it does: Fixes webkit padding issue. Fix for Yahoo mail table alignment bug. Applies table-layout to the first 2 tables then removes for anything nested deeper. */
|
||||||
|
|
||||||
table {
|
table {
|
||||||
border-spacing: 0 !important;
|
border-spacing: 0 !important;
|
||||||
border-collapse: collapse !important;
|
border-collapse: collapse !important;
|
||||||
table-layout: fixed !important;
|
table-layout: fixed !important;
|
||||||
margin: 0 auto !important;
|
margin: 0 auto !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
table table table {
|
table table table {
|
||||||
table-layout: auto;
|
table-layout: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
i {
|
i {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
font-size: 26px;
|
font-size: 26px;
|
||||||
}
|
}
|
||||||
/* What it does: Uses a better rendering method when resizing images in IE. */
|
/* What it does: Uses a better rendering method when resizing images in IE. */
|
||||||
|
|
||||||
img {
|
img {
|
||||||
-ms-interpolation-mode: bicubic;
|
-ms-interpolation-mode: bicubic;
|
||||||
}
|
}
|
||||||
/* What it does: A work-around for email clients meddling in triggered links. */
|
/* What it does: A work-around for email clients meddling in triggered links. */
|
||||||
|
|
||||||
*[x-apple-data-detectors],
|
*[x-apple-data-detectors],
|
||||||
/* iOS */
|
/* iOS */
|
||||||
|
|
||||||
.x-gmail-data-detectors,
|
.x-gmail-data-detectors,
|
||||||
/* Gmail */
|
/* Gmail */
|
||||||
|
|
||||||
.x-gmail-data-detectors *,
|
.x-gmail-data-detectors *,
|
||||||
.aBn {
|
.aBn {
|
||||||
border-bottom: 0 !important;
|
border-bottom: 0 !important;
|
||||||
@ -103,25 +103,25 @@
|
|||||||
line-height: inherit !important;
|
line-height: inherit !important;
|
||||||
}
|
}
|
||||||
/* What it does: Prevents Gmail from displaying an download button on large, non-linked images. */
|
/* What it does: Prevents Gmail from displaying an download button on large, non-linked images. */
|
||||||
|
|
||||||
.a6S {
|
.a6S {
|
||||||
display: none !important;
|
display: none !important;
|
||||||
opacity: 0.01 !important;
|
opacity: 0.01 !important;
|
||||||
}
|
}
|
||||||
/* If the above doesn't work, add a .g-img class to any image in question. */
|
/* If the above doesn't work, add a .g-img class to any image in question. */
|
||||||
|
|
||||||
img.g-img + div {
|
img.g-img + div {
|
||||||
display: none !important;
|
display: none !important;
|
||||||
}
|
}
|
||||||
/* What it does: Prevents underlining the button text in Windows 10 */
|
/* What it does: Prevents underlining the button text in Windows 10 */
|
||||||
|
|
||||||
.button-link {
|
.button-link {
|
||||||
text-decoration: none !important;
|
text-decoration: none !important;
|
||||||
}
|
}
|
||||||
/* What it does: Removes right gutter in Gmail iOS app: https://github.com/TedGoas/Cerberus/issues/89 */
|
/* What it does: Removes right gutter in Gmail iOS app: https://github.com/TedGoas/Cerberus/issues/89 */
|
||||||
/* Create one of these media queries for each additional viewport size you'd like to fix */
|
/* Create one of these media queries for each additional viewport size you'd like to fix */
|
||||||
/* Thanks to Eric Lepetit @ericlepetitsf) for help troubleshooting */
|
/* Thanks to Eric Lepetit @ericlepetitsf) for help troubleshooting */
|
||||||
|
|
||||||
@media only screen and (min-device-width: 375px) and (max-device-width: 413px) {
|
@media only screen and (min-device-width: 375px) and (max-device-width: 413px) {
|
||||||
/* iPhone 6 and 6+ */
|
/* iPhone 6 and 6+ */
|
||||||
.email-container {
|
.email-container {
|
||||||
@ -132,12 +132,12 @@
|
|||||||
<!-- Progressive Enhancements -->
|
<!-- Progressive Enhancements -->
|
||||||
<style>
|
<style>
|
||||||
/* What it does: Hover styles for buttons */
|
/* What it does: Hover styles for buttons */
|
||||||
|
|
||||||
.button-td,
|
.button-td,
|
||||||
.button-a {
|
.button-a {
|
||||||
transition: all 100ms ease-in;
|
transition: all 100ms ease-in;
|
||||||
}
|
}
|
||||||
|
|
||||||
.button-td:hover,
|
.button-td:hover,
|
||||||
.button-a:hover {
|
.button-a:hover {
|
||||||
background: #000000 !important;
|
background: #000000 !important;
|
||||||
@ -145,7 +145,7 @@
|
|||||||
color: white !important;
|
color: white !important;
|
||||||
}
|
}
|
||||||
/* Media Queries */
|
/* Media Queries */
|
||||||
|
|
||||||
@media screen and (max-width: 480px) {
|
@media screen and (max-width: 480px) {
|
||||||
/* What it does: Forces elements to resize to the full width of their container. Useful for resizing images beyond their max-width. */
|
/* What it does: Forces elements to resize to the full width of their container. Useful for resizing images beyond their max-width. */
|
||||||
.fluid {
|
.fluid {
|
||||||
@ -287,19 +287,19 @@
|
|||||||
<table align="center" style="text-align: center;">
|
<table align="center" style="text-align: center;">
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<a href="https://discord.gg/b52wT37kt7"><img style="width:25px" src="https://www.kavitareader.com/img/email/discord-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Discord"></a>
|
<a rel="noopener noreferrer" href="https://discord.gg/b52wT37kt7"><img style="width:25px" src="https://www.kavitareader.com/img/email/discord-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Discord"></a>
|
||||||
</td>
|
</td>
|
||||||
<td width="20"> </td>
|
<td width="20"> </td>
|
||||||
<td>
|
<td>
|
||||||
<a href="https://www.reddit.com/r/KavitaManga/"><img style="width:25px" src="https://www.kavitareader.com/img/email/reddit-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Reddit"></a>
|
<a rel="noopener noreferrer" href="https://www.reddit.com/r/KavitaManga/"><img style="width:25px" src="https://www.kavitareader.com/img/email/reddit-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Reddit"></a>
|
||||||
</td>
|
</td>
|
||||||
<td width="20"> </td>
|
<td width="20"> </td>
|
||||||
<td>
|
<td>
|
||||||
<a href="https://github.com/Kareadita/Kavita/"><img style="width:25px" src="https://www.kavitareader.com/img/email/github-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Github"></a>
|
<a rel="noopener noreferrer" href="https://github.com/Kareadita/Kavita/"><img style="width:25px" src="https://www.kavitareader.com/img/email/github-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Github"></a>
|
||||||
</td>
|
</td>
|
||||||
<td width="20"> </td>
|
<td width="20"> </td>
|
||||||
<td>
|
<td>
|
||||||
<a href="https://opencollective.com/kavita"><img style="width:25px" src="https://www.kavitareader.com/img/email/open-collective-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Open Collective"></a>
|
<a rel="noopener noreferrer" href="https://opencollective.com/kavita"><img style="width:25px" src="https://www.kavitareader.com/img/email/open-collective-white.png" width="" height="" style="margin:0; padding:0; border:none; display:block;" border="0" alt="Open Collective"></a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
@ -320,4 +320,4 @@
|
|||||||
</center>
|
</center>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
@ -120,7 +120,7 @@ export class ManageEmailSettingsComponent implements OnInit {
|
|||||||
if (res.successful) {
|
if (res.successful) {
|
||||||
this.toastr.success(translate('toasts.email-sent', {email: res.emailAddress}));
|
this.toastr.success(translate('toasts.email-sent', {email: res.emailAddress}));
|
||||||
} else {
|
} else {
|
||||||
this.toastr.error(translate('toasts.email-not-sent-test'))
|
this.toastr.error(res.errorMessage);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,7 @@ import {
|
|||||||
RendererStyleFlags2,
|
RendererStyleFlags2,
|
||||||
ViewChild
|
ViewChild
|
||||||
} from '@angular/core';
|
} from '@angular/core';
|
||||||
import { DOCUMENT, Location, NgTemplateOutlet, NgIf, NgStyle, NgClass } from '@angular/common';
|
import { DOCUMENT, NgTemplateOutlet, NgIf, NgStyle, NgClass } from '@angular/common';
|
||||||
import { ActivatedRoute, Router } from '@angular/router';
|
import { ActivatedRoute, Router } from '@angular/router';
|
||||||
import { ToastrService } from 'ngx-toastr';
|
import { ToastrService } from 'ngx-toastr';
|
||||||
import { forkJoin, fromEvent, of } from 'rxjs';
|
import { forkJoin, fromEvent, of } from 'rxjs';
|
||||||
@ -268,7 +268,6 @@ export class BookReaderComponent implements OnInit, AfterViewInit, OnDestroy {
|
|||||||
* Used for showing/hiding bottom action bar. Calculates if there is enough scroll to show it.
|
* Used for showing/hiding bottom action bar. Calculates if there is enough scroll to show it.
|
||||||
* Will hide if all content in book is absolute positioned
|
* Will hide if all content in book is absolute positioned
|
||||||
*/
|
*/
|
||||||
|
|
||||||
horizontalScrollbarNeeded = false;
|
horizontalScrollbarNeeded = false;
|
||||||
scrollbarNeeded = false;
|
scrollbarNeeded = false;
|
||||||
readingDirection: ReadingDirection = ReadingDirection.LeftToRight;
|
readingDirection: ReadingDirection = ReadingDirection.LeftToRight;
|
||||||
@ -513,7 +512,6 @@ export class BookReaderComponent implements OnInit, AfterViewInit, OnDestroy {
|
|||||||
tap((e) => {
|
tap((e) => {
|
||||||
const selection = window.getSelection();
|
const selection = window.getSelection();
|
||||||
this.hidePagination = selection !== null && selection.toString().trim() !== '';
|
this.hidePagination = selection !== null && selection.toString().trim() !== '';
|
||||||
console.log('hide pagination: ', this.hidePagination);
|
|
||||||
this.cdRef.markForCheck();
|
this.cdRef.markForCheck();
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
@ -525,7 +523,6 @@ export class BookReaderComponent implements OnInit, AfterViewInit, OnDestroy {
|
|||||||
distinctUntilChanged(),
|
distinctUntilChanged(),
|
||||||
tap((e) => {
|
tap((e) => {
|
||||||
this.hidePagination = false;
|
this.hidePagination = false;
|
||||||
console.log('hide pagination: ', this.hidePagination);
|
|
||||||
this.cdRef.markForCheck();
|
this.cdRef.markForCheck();
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
|
@ -77,9 +77,7 @@
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@if (utilityService.getActiveBreakpoint() > Breakpoint.Tablet) {
|
<pdf-zoom-toolbar ></pdf-zoom-toolbar>
|
||||||
<pdf-zoom-toolbar ></pdf-zoom-toolbar>
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
<div id="toolbarViewerRight">
|
<div id="toolbarViewerRight">
|
||||||
|
@ -1,23 +1,19 @@
|
|||||||
import {
|
import {
|
||||||
ChangeDetectionStrategy,
|
ChangeDetectionStrategy,
|
||||||
ChangeDetectorRef,
|
ChangeDetectorRef,
|
||||||
Component,
|
Component, DestroyRef,
|
||||||
ElementRef,
|
ElementRef,
|
||||||
HostListener, inject, Inject,
|
HostListener,
|
||||||
|
inject,
|
||||||
|
Inject,
|
||||||
OnDestroy,
|
OnDestroy,
|
||||||
OnInit,
|
OnInit,
|
||||||
ViewChild
|
ViewChild
|
||||||
} from '@angular/core';
|
} from '@angular/core';
|
||||||
import {ActivatedRoute, Router} from '@angular/router';
|
import {ActivatedRoute, Router} from '@angular/router';
|
||||||
import {
|
import {NgxExtendedPdfViewerModule, PageViewModeType, ProgressBarEvent, ScrollModeType} from 'ngx-extended-pdf-viewer';
|
||||||
NgxExtendedPdfViewerModule,
|
|
||||||
NgxExtendedPdfViewerService,
|
|
||||||
PageViewModeType,
|
|
||||||
ProgressBarEvent,
|
|
||||||
ScrollModeType
|
|
||||||
} from 'ngx-extended-pdf-viewer';
|
|
||||||
import {ToastrService} from 'ngx-toastr';
|
import {ToastrService} from 'ngx-toastr';
|
||||||
import {take} from 'rxjs';
|
import {Observable, take} from 'rxjs';
|
||||||
import {BookService} from 'src/app/book-reader/_services/book.service';
|
import {BookService} from 'src/app/book-reader/_services/book.service';
|
||||||
import {Breakpoint, KEY_CODES, UtilityService} from 'src/app/shared/_services/utility.service';
|
import {Breakpoint, KEY_CODES, UtilityService} from 'src/app/shared/_services/utility.service';
|
||||||
import {Chapter} from 'src/app/_models/chapter';
|
import {Chapter} from 'src/app/_models/chapter';
|
||||||
@ -61,6 +57,7 @@ export class PdfReaderComponent implements OnInit, OnDestroy {
|
|||||||
public readonly accountService = inject(AccountService);
|
public readonly accountService = inject(AccountService);
|
||||||
public readonly readerService = inject(ReaderService);
|
public readonly readerService = inject(ReaderService);
|
||||||
public readonly utilityService = inject(UtilityService);
|
public readonly utilityService = inject(UtilityService);
|
||||||
|
public readonly destroyRef = inject(DestroyRef);
|
||||||
|
|
||||||
protected readonly ScrollModeType = ScrollModeType;
|
protected readonly ScrollModeType = ScrollModeType;
|
||||||
protected readonly Breakpoint = Breakpoint;
|
protected readonly Breakpoint = Breakpoint;
|
||||||
@ -182,6 +179,7 @@ export class PdfReaderComponent implements OnInit, OnDestroy {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
calcScrollbarNeeded() {
|
calcScrollbarNeeded() {
|
||||||
const viewContainer = this.document.querySelector('#viewerContainer');
|
const viewContainer = this.document.querySelector('#viewerContainer');
|
||||||
if (viewContainer == null) return;
|
if (viewContainer == null) return;
|
||||||
@ -267,7 +265,7 @@ export class PdfReaderComponent implements OnInit, OnDestroy {
|
|||||||
}
|
}
|
||||||
this.cdRef.markForCheck();
|
this.cdRef.markForCheck();
|
||||||
});
|
});
|
||||||
setTimeout(() => this.readerService.enableWakeLock(this.container.nativeElement), 1000); // TODO: This needs to be in afterviewinit i think
|
setTimeout(() => this.readerService.enableWakeLock(this.container.nativeElement), 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -300,8 +298,13 @@ export class PdfReaderComponent implements OnInit, OnDestroy {
|
|||||||
this.scrollMode = options[index];
|
this.scrollMode = options[index];
|
||||||
|
|
||||||
this.calcScrollbarNeeded();
|
this.calcScrollbarNeeded();
|
||||||
|
const currPage = this.currentPage;
|
||||||
this.cdRef.markForCheck();
|
this.cdRef.markForCheck();
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
this.currentPage = currPage;
|
||||||
|
this.cdRef.markForCheck();
|
||||||
|
}, 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
toggleSpreadMode() {
|
toggleSpreadMode() {
|
||||||
@ -318,6 +321,10 @@ export class PdfReaderComponent implements OnInit, OnDestroy {
|
|||||||
if (this.pageLayoutMode === 'book') {
|
if (this.pageLayoutMode === 'book') {
|
||||||
this.pageLayoutMode = 'multiple';
|
this.pageLayoutMode = 'multiple';
|
||||||
} else {
|
} else {
|
||||||
|
if (this.utilityService.getActiveBreakpoint() < Breakpoint.Tablet) {
|
||||||
|
this.toastr.info(translate('toasts.pdf-book-mode-screen-size'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
this.pageLayoutMode = 'book';
|
this.pageLayoutMode = 'book';
|
||||||
// If the fit is automatic, let's adjust to 100% to ensure it renders correctly (can't do this, but it doesn't always happen)
|
// If the fit is automatic, let's adjust to 100% to ensure it renders correctly (can't do this, but it doesn't always happen)
|
||||||
}
|
}
|
||||||
|
@ -68,7 +68,6 @@ export class ChangeEmailComponent implements OnInit {
|
|||||||
const model = this.form.value;
|
const model = this.form.value;
|
||||||
this.errors = [];
|
this.errors = [];
|
||||||
this.accountService.updateEmail(model.email, model.password).subscribe(updateEmailResponse => {
|
this.accountService.updateEmail(model.email, model.password).subscribe(updateEmailResponse => {
|
||||||
|
|
||||||
if (updateEmailResponse.invalidEmail) {
|
if (updateEmailResponse.invalidEmail) {
|
||||||
this.toastr.success(translate('toasts.email-sent-to-no-existing', {email: model.email}));
|
this.toastr.success(translate('toasts.email-sent-to-no-existing', {email: model.email}));
|
||||||
}
|
}
|
||||||
|
@ -2127,7 +2127,6 @@
|
|||||||
"file-send-to": "File(s) emailed to {{name}}",
|
"file-send-to": "File(s) emailed to {{name}}",
|
||||||
"theme-missing": "The active theme no longer exists. Please refresh the page.",
|
"theme-missing": "The active theme no longer exists. Please refresh the page.",
|
||||||
"email-sent": "Email sent to {{email}}",
|
"email-sent": "Email sent to {{email}}",
|
||||||
"email-not-sent-test": "There was an exception when sending the email. Check logs for details. This indicates improper settings.",
|
|
||||||
"email-not-sent": "Email on file is not a valid email and can not be sent. A link has been dumped in logs. The admin can provide this link to complete flow.",
|
"email-not-sent": "Email on file is not a valid email and can not be sent. A link has been dumped in logs. The admin can provide this link to complete flow.",
|
||||||
"k+-license-saved": "License Key saved, but it is not valid. Click check to revalidate the subscription. First time registration may take a min to propagate.",
|
"k+-license-saved": "License Key saved, but it is not valid. Click check to revalidate the subscription. First time registration may take a min to propagate.",
|
||||||
"k+-unlocked": "Kavita+ unlocked!",
|
"k+-unlocked": "Kavita+ unlocked!",
|
||||||
@ -2177,7 +2176,8 @@
|
|||||||
"collections-promoted": "Collections promoted",
|
"collections-promoted": "Collections promoted",
|
||||||
"collections-unpromoted": "Collections un-promoted",
|
"collections-unpromoted": "Collections un-promoted",
|
||||||
"confirm-delete-collections": "Are you sure you want to delete multiple collections?",
|
"confirm-delete-collections": "Are you sure you want to delete multiple collections?",
|
||||||
"collections-deleted": "Collections deleted"
|
"collections-deleted": "Collections deleted",
|
||||||
|
"pdf-book-mode-screen-size": "Screen too small for Book mode"
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
"name": "GPL-3.0",
|
"name": "GPL-3.0",
|
||||||
"url": "https://github.com/Kareadita/Kavita/blob/develop/LICENSE"
|
"url": "https://github.com/Kareadita/Kavita/blob/develop/LICENSE"
|
||||||
},
|
},
|
||||||
"version": "0.7.14.11"
|
"version": "0.7.14.12"
|
||||||
},
|
},
|
||||||
"servers": [
|
"servers": [
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user