diff --git a/JSMR.Application/VoiceWorks/Queries/Search/VoiceWorkSearchResult.cs b/JSMR.Application/VoiceWorks/Queries/Search/VoiceWorkSearchResult.cs index d322666..1fc2371 100644 --- a/JSMR.Application/VoiceWorks/Queries/Search/VoiceWorkSearchResult.cs +++ b/JSMR.Application/VoiceWorks/Queries/Search/VoiceWorkSearchResult.cs @@ -27,18 +27,31 @@ public record VoiceWorkSearchResult public byte Status { get; init; } public byte SubtitleLanguage { get; init; } public bool? IsValid { get; init; } + public required VoiceWorkCircleItem Circle { get; set; } public VoiceWorkTagItem[] Tags { get; set; } = []; public VoiceWorkCreatorItem[] Creators { get; set; } = []; } +public class VoiceWorkCircleItem +{ + public required string Name { get; init; } + public required string MakerId { get; init; } + public bool IsFavorite { get; init; } + public bool IsBlacklisted { get; init; } +} + public class VoiceWorkTagItem { public int TagId { get; set; } public required string Name { get; set; } + public bool IsFavorite { get; set; } + public bool IsBlacklisted { get; set; } } public class VoiceWorkCreatorItem { public int CreatorId { get; set; } public required string Name { get; set; } + public bool IsFavorite { get; set; } + public bool IsBlacklisted { get; set; } } \ No newline at end of file diff --git a/JSMR.Infrastructure/Data/Repositories/VoiceWorks/VoiceWorkSearchProvider.cs b/JSMR.Infrastructure/Data/Repositories/VoiceWorks/VoiceWorkSearchProvider.cs index e641da0..dd20a04 100644 --- a/JSMR.Infrastructure/Data/Repositories/VoiceWorks/VoiceWorkSearchProvider.cs +++ b/JSMR.Infrastructure/Data/Repositories/VoiceWorks/VoiceWorkSearchProvider.cs @@ -376,6 +376,13 @@ public class VoiceWorkSearchProvider(AppDbContext context, IVoiceWorkFullTextSea HasImage = voiceWork.HasImage, Maker = circle.Name, MakerId = circle.MakerId, + Circle = new() + { + Name = circle.Name, + MakerId = circle.MakerId, + IsFavorite = circle.Favorite, + IsBlacklisted = circle.Blacklisted + }, ExpectedDate = voiceWork.ExpectedDate, SalesDate = voiceWork.SalesDate, PlannedReleaseDate = voiceWork.PlannedReleaseDate, @@ -413,6 +420,13 @@ public class VoiceWorkSearchProvider(AppDbContext context, IVoiceWorkFullTextSea HasImage = voiceWork.HasImage, Maker = circle.Name, MakerId = circle.MakerId, + Circle = new() + { + Name = circle.Name, + MakerId = circle.MakerId, + IsFavorite = circle.Favorite, + IsBlacklisted = circle.Blacklisted + }, ExpectedDate = voiceWork.ExpectedDate, SalesDate = voiceWork.SalesDate, PlannedReleaseDate = voiceWork.PlannedReleaseDate, @@ -457,14 +471,14 @@ public class VoiceWorkSearchProvider(AppDbContext context, IVoiceWorkFullTextSea from englishTag in et.DefaultIfEmpty() where voiceWorkIds.Contains(voiceWorkTag.VoiceWorkId) orderby voiceWorkTag.VoiceWorkId, voiceWorkTag.Position - select new { voiceWorkTag.VoiceWorkId, voiceWorkTag.TagId, tag.Name, EnglishName = englishTag.Name } + select new { voiceWorkTag.VoiceWorkId, voiceWorkTag.TagId, tag.Name, EnglishName = englishTag.Name, IsFavorite = tag.Favorite, IsBlacklisted = tag.Blacklisted } ).ToListAsync(cancellationToken); return tagRows .GroupBy(r => r.VoiceWorkId) .ToDictionary( g => g.Key, - g => g.Select(r => new VoiceWorkTagItem { TagId = r.TagId, Name = r.EnglishName ?? r.Name }).ToArray() + g => g.Select(r => new VoiceWorkTagItem { TagId = r.TagId, Name = r.EnglishName ?? r.Name, IsFavorite = r.IsFavorite, IsBlacklisted = r.IsBlacklisted }).ToArray() ); } @@ -475,14 +489,14 @@ public class VoiceWorkSearchProvider(AppDbContext context, IVoiceWorkFullTextSea join creator in context.Creators.AsNoTracking() on voiceWorkCreator.CreatorId equals creator.CreatorId where voiceWorkIds.Contains(voiceWorkCreator.VoiceWorkId) orderby voiceWorkCreator.VoiceWorkId, voiceWorkCreator.Position - select new { voiceWorkCreator.VoiceWorkId, creator.CreatorId, creator.Name } + select new { voiceWorkCreator.VoiceWorkId, creator.CreatorId, creator.Name, creator.Favorite, creator.Blacklisted } ).ToListAsync(cancellationToken); return creatorRows .GroupBy(r => r.VoiceWorkId) .ToDictionary( g => g.Key, - g => g.Select(r => new VoiceWorkCreatorItem { CreatorId = r.CreatorId, Name = r.Name }).ToArray() + g => g.Select(r => new VoiceWorkCreatorItem { CreatorId = r.CreatorId, Name = r.Name, IsFavorite = r.Favorite, IsBlacklisted = r.Blacklisted }).ToArray() ); } } \ No newline at end of file diff --git a/JSMR.UI.Blazor/Components/Chip.razor b/JSMR.UI.Blazor/Components/Chip.razor index 8450ad0..17d8d27 100644 --- a/JSMR.UI.Blazor/Components/Chip.razor +++ b/JSMR.UI.Blazor/Components/Chip.razor @@ -1,12 +1,26 @@ @using JSMR.UI.Blazor.Enums -
- @if (Graphic != null) - { - - } - @ChildContent -
+@if (string.IsNullOrWhiteSpace(Url)) +{ +
+ @if (Graphic != null) + { + + } + @ChildContent +
+} +else +{ + + @if (Graphic != null) + { + + } + @ChildContent + +} + @code { [Parameter] @@ -15,6 +29,72 @@ [Parameter] public Graphic? Graphic { get; set; } + [Parameter] + public IconVarient? IconVarient { get; set; } + [Parameter] public ColorVarient Color { get; set; } = ColorVarient.Primary; + + [Parameter] + public ElementVarient Varient { get; set; } = ElementVarient.None; + + [Parameter] + public ToneVarient Tone { get; set; } = ToneVarient.None; + + [Parameter] + public string? Url { get; set; } + + [Parameter] + public string? Target { get; set; } + + [Parameter] + public EventCallback Click { get; set; } + + private string GetClasses() + { + string color = Color.ToString().ToLower(); + + List classNames = + [ + $"j-chip", + $"color-{color}" + ]; + + switch (Varient) + { + case ElementVarient.Filled: + classNames.Add($"varient-filled"); + //classNames.Add($"background-color-{color}"); + break; + case ElementVarient.Outlined: + classNames.Add($"varient-outlined"); + //classNames.Add($"border-color-{color}"); + break; + } + + switch (Tone) + { + case ToneVarient.Solid: + classNames.Add($"tone-solid"); + break; + case ToneVarient.Tint: + classNames.Add($"tone-tint"); + break; + } + + if (Click.HasDelegate || string.IsNullOrWhiteSpace(Url) == false) + { + classNames.Add("is-clickable"); + } + + return string.Join(" ", classNames); + } + + private async Task OnClickAsync() + { + if (Click.HasDelegate) + { + await Click.InvokeAsync(); + } + } } \ No newline at end of file diff --git a/JSMR.UI.Blazor/Components/Chips/CircleChip.razor b/JSMR.UI.Blazor/Components/Chips/CircleChip.razor new file mode 100644 index 0000000..97879e2 --- /dev/null +++ b/JSMR.UI.Blazor/Components/Chips/CircleChip.razor @@ -0,0 +1,43 @@ +@using JSMR.Application.Tags.Queries.Search.Contracts +@using JSMR.Application.VoiceWorks.Queries.Search +@using JSMR.UI.Blazor.Enums +@using JSMR.UI.Blazor.Filters +@using JSMR.UI.Blazor.Services +@using Microsoft.AspNetCore.WebUtilities + +@Circle.Name + +@code { + [Parameter] + public required VoiceWorkCircleItem Circle { get; set; } + + private string GetUrl() + { + return $"https://www.dlsite.com/maniax/circle/profile/=/maker_id/{Circle.MakerId}.html"; + } + + private ColorVarient GetColor() + { + if (Circle.IsFavorite) + { + return ColorVarient.Mint; + } + + if (Circle.IsBlacklisted) + { + return ColorVarient.Pink; + } + + return ColorVarient.Secondary; + } + + private ToneVarient GetTone() + { + if (Circle.IsFavorite || Circle.IsBlacklisted) + { + return ToneVarient.Tint; + } + + return ToneVarient.None; + } +} \ No newline at end of file diff --git a/JSMR.UI.Blazor/Components/Chips/CreatorChip.razor b/JSMR.UI.Blazor/Components/Chips/CreatorChip.razor new file mode 100644 index 0000000..22e7789 --- /dev/null +++ b/JSMR.UI.Blazor/Components/Chips/CreatorChip.razor @@ -0,0 +1,43 @@ +@using JSMR.Application.Tags.Queries.Search.Contracts +@using JSMR.Application.VoiceWorks.Queries.Search +@using JSMR.UI.Blazor.Enums +@using JSMR.UI.Blazor.Filters +@using JSMR.UI.Blazor.Services +@using Microsoft.AspNetCore.WebUtilities + +@Creator.Name + +@code { + [Parameter] + public required VoiceWorkCreatorItem Creator { get; set; } + + private string GetUrl() + { + return $"https://www.dlsite.com/maniax/fsr/=/keyword_creater/{Creator.Name}"; + } + + private ColorVarient GetColor() + { + if (Creator.IsFavorite) + { + return ColorVarient.Mint; + } + + if (Creator.IsBlacklisted) + { + return ColorVarient.Pink; + } + + return ColorVarient.Secondary; + } + + private ToneVarient GetTone() + { + if (Creator.IsFavorite || Creator.IsBlacklisted) + { + return ToneVarient.Tint; + } + + return ToneVarient.None; + } +} \ No newline at end of file diff --git a/JSMR.UI.Blazor/Components/Chips/TagChip.razor b/JSMR.UI.Blazor/Components/Chips/TagChip.razor new file mode 100644 index 0000000..beaa13e --- /dev/null +++ b/JSMR.UI.Blazor/Components/Chips/TagChip.razor @@ -0,0 +1,54 @@ +@using JSMR.Application.Tags.Queries.Search.Contracts +@using JSMR.Application.VoiceWorks.Queries.Search +@using JSMR.UI.Blazor.Enums +@using JSMR.UI.Blazor.Filters +@using JSMR.UI.Blazor.Services +@using Microsoft.AspNetCore.WebUtilities + +@Tag.Name + +@code { + [Inject] + protected NavigationManager NavigationManager { get; set; } = default!; + + [Parameter] + public required VoiceWorkTagItem Tag { get; set; } + + private ColorVarient GetColor() + { + if (Tag.IsFavorite) + { + return ColorVarient.Mint; + } + + if (Tag.IsBlacklisted) + { + return ColorVarient.Pink; + } + + return ColorVarient.Secondary; + } + + private ToneVarient GetTone() + { + if (Tag.IsFavorite || Tag.IsBlacklisted) + { + return ToneVarient.Tint; + } + + return ToneVarient.None; + } + + private void OnClick() + { + VoiceWorkFilterState state = new() + { + TagIds = [Tag.TagId] + }; + + string basePath = new Uri(NavigationManager.Uri).GetLeftPart(UriPartial.Authority); + string uri = QueryHelpers.AddQueryString($"{basePath}/voiceworks", state.ToQuery()); + + NavigationManager.NavigateTo(uri); + } +} \ No newline at end of file diff --git a/JSMR.UI.Blazor/Components/JImage.razor b/JSMR.UI.Blazor/Components/JImage.razor index 8653961..0d32b84 100644 --- a/JSMR.UI.Blazor/Components/JImage.razor +++ b/JSMR.UI.Blazor/Components/JImage.razor @@ -1,6 +1,6 @@ 
- +
@code { @@ -8,7 +8,7 @@ public required string Source { get; set; } [Parameter] - public string FallbackSource { get; set; } = "images/home/no_img_main.gif"; + public string FallbackSource { get; set; } = "images/web/home/not_found_img_main.png"; // "images/web/home/no_img_main.gif"; [Parameter] public bool LazyLoading { get; set; } = true; @@ -22,6 +22,10 @@ [Parameter] public string? ImageClass { get; set; } + private string? currentSource; + private bool hasSourceErrored = false; + private bool hasFallbackSourceErrored = false; + private bool _isLoaded; private string? _lastSource; @@ -33,6 +37,10 @@ protected override void OnParametersSet() { + currentSource = Source; + hasSourceErrored = false; + hasFallbackSourceErrored = false; + if (!string.Equals(_lastSource, Source, StringComparison.Ordinal)) { _lastSource = Source; @@ -103,4 +111,20 @@ { _isLoaded = true; } + + private void OnImageError() + { + if (!hasSourceErrored && !string.IsNullOrEmpty(FallbackSource)) + { + hasSourceErrored = true; + currentSource = FallbackSource; + StateHasChanged(); + } + else if (!hasFallbackSourceErrored) + { + hasFallbackSourceErrored = true; + currentSource = "images/web/home/not_found_img_main.png"; + StateHasChanged(); + } + } } \ No newline at end of file diff --git a/JSMR.UI.Blazor/Components/JProduct.razor b/JSMR.UI.Blazor/Components/JProduct.razor index fa04a23..6447ba5 100644 --- a/JSMR.UI.Blazor/Components/JProduct.razor +++ b/JSMR.UI.Blazor/Components/JProduct.razor @@ -1,5 +1,6 @@ @using JSMR.Application.VoiceWorks.Queries.Search @using JSMR.Domain.Enums +@using JSMR.UI.Blazor.Components.Chips @using JSMR.UI.Blazor.Enums @using JSMR.UI.Blazor.Filters @using JSMR.UI.Blazor.Services @@ -8,7 +9,7 @@
- +
@@ -21,6 +22,7 @@ Target="_blank" Variant="MudBlazor.Variant.Filled" Icon="@Icons.Material.Outlined.Circle">@Product.Maker + @* *@ @foreach (var creator in Product.Creators) { @creator.Name + @* *@ }
@@ -39,6 +42,12 @@ }
+
+ @foreach (var tag in Product.Tags) + { + @* *@ + } +
diff --git a/JSMR.UI.Blazor/Components/ProductTag.razor b/JSMR.UI.Blazor/Components/ProductTag.razor index 593a4b9..35246c7 100644 --- a/JSMR.UI.Blazor/Components/ProductTag.razor +++ b/JSMR.UI.Blazor/Components/ProductTag.razor @@ -1,8 +1,10 @@ -@using JSMR.Application.VoiceWorks.Queries.Search +@using JSMR.Application.Tags.Queries.Search.Contracts +@using JSMR.Application.VoiceWorks.Queries.Search @using JSMR.UI.Blazor.Filters +@using JSMR.UI.Blazor.Services @using Microsoft.AspNetCore.WebUtilities -@Tag.Name +@Tag.Name @* @Tag.Name *@ @code { @@ -12,6 +14,25 @@ [Parameter] public required VoiceWorkTagItem Tag { get; set; } + private string Classes => GetClasses(); + + private string GetClasses() + { + List classNames = ["j-tag", "j-tag-2"]; + + if (Tag.IsFavorite) + { + classNames.Add("j-tag-favorite"); + } + + if (Tag.IsBlacklisted) + { + classNames.Add("j-tag-blacklisted"); + } + + return string.Join(" ", classNames); + } + private void OnClick() { VoiceWorkFilterState state = new() diff --git a/JSMR.UI.Blazor/Enums/ColorVarient.cs b/JSMR.UI.Blazor/Enums/ColorVarient.cs index f59221e..085b9e2 100644 --- a/JSMR.UI.Blazor/Enums/ColorVarient.cs +++ b/JSMR.UI.Blazor/Enums/ColorVarient.cs @@ -16,6 +16,7 @@ public enum ColorVarient Black, Yellow, Green, + Mint, Teal, Blue, Orange, @@ -35,6 +36,7 @@ public static class CssUtil ColorVarient.SurfaceContainerOutlineLow => "surface-container-outline-low", ColorVarient.Yellow => "text-yellow", ColorVarient.Green => "text-green", + ColorVarient.Mint => "text-mint", ColorVarient.Teal => "text-teal", ColorVarient.Blue => "text-blue", ColorVarient.Orange => "text-orange", @@ -50,6 +52,7 @@ public static class CssUtil ColorVarient.SurfaceContainerLow => "surface-container-low", ColorVarient.Yellow => "text-yellow", ColorVarient.Green => "text-green", + ColorVarient.Mint => "text-mint", ColorVarient.Teal => "text-teal", ColorVarient.Blue => "text-blue", ColorVarient.Orange => "text-orange", diff --git a/JSMR.UI.Blazor/Enums/ElementVarient.cs b/JSMR.UI.Blazor/Enums/ElementVarient.cs new file mode 100644 index 0000000..3327030 --- /dev/null +++ b/JSMR.UI.Blazor/Enums/ElementVarient.cs @@ -0,0 +1,8 @@ +namespace JSMR.UI.Blazor.Enums; + +public enum ElementVarient +{ + None = 0, + Filled = 1, + Outlined = 2 +} \ No newline at end of file diff --git a/JSMR.UI.Blazor/Enums/ImageExtension.cs b/JSMR.UI.Blazor/Enums/ImageExtension.cs new file mode 100644 index 0000000..4e3af0d --- /dev/null +++ b/JSMR.UI.Blazor/Enums/ImageExtension.cs @@ -0,0 +1,7 @@ +namespace JSMR.UI.Blazor.Enums; + +public enum ImageExtension +{ + Jpeg, + WebP +} \ No newline at end of file diff --git a/JSMR.UI.Blazor/Enums/ToneVarient.cs b/JSMR.UI.Blazor/Enums/ToneVarient.cs new file mode 100644 index 0000000..d0bef80 --- /dev/null +++ b/JSMR.UI.Blazor/Enums/ToneVarient.cs @@ -0,0 +1,8 @@ +namespace JSMR.UI.Blazor.Enums; + +public enum ToneVarient +{ + None = 0, + Tint = 1, + Solid = 2 +} \ No newline at end of file diff --git a/JSMR.UI.Blazor/Services/ImageUrlProvider.cs b/JSMR.UI.Blazor/Services/ImageUrlProvider.cs index 38a92b4..9804ee6 100644 --- a/JSMR.UI.Blazor/Services/ImageUrlProvider.cs +++ b/JSMR.UI.Blazor/Services/ImageUrlProvider.cs @@ -1,15 +1,21 @@ using JSMR.Application.VoiceWorks.Queries.Search; +using JSMR.UI.Blazor.Enums; namespace JSMR.UI.Blazor.Services; public static class ImageUrlProvider { - public static string GetImageUrl(VoiceWorkSearchResult voiceWork, string size) + public static string GetImageUrl(VoiceWorkSearchResult voiceWork, string size, string extension = "jpg") { - return GetImageURL(voiceWork.OriginalProductId ?? voiceWork.ProductId, voiceWork.HasImage, voiceWork.SalesDate, size); + return GetImageURL(voiceWork.OriginalProductId ?? voiceWork.ProductId, voiceWork.HasImage, voiceWork.SalesDate, size, extension); } - public static string GetImageURL(string? productId, bool hasImage, DateTime? salesDate, string size) + public static string GetImageUrl(VoiceWorkSearchResult voiceWork, ImageSize imageSize, ImageExtension imageExtension) + { + return GetImageUrl(voiceWork.OriginalProductId ?? voiceWork.ProductId, voiceWork.HasImage, voiceWork.SalesDate.HasValue, imageSize, imageExtension); + } + + public static string GetImageURL(string? productId, bool hasImage, DateTime? salesDate, string size, string extension = "jpg") { string folder = "modpub"; string imageSize = "main"; @@ -46,7 +52,7 @@ public static class ImageUrlProvider return noImageUrl; } - var imageUrlTemplate = "//img.dlsite.jp/[folder]/images2/[imageType1]/[imageWorkType]/[fullRoundedProductId]/[productId][imageType2]_img_[imageSize].jpg"; + var imageUrlTemplate = $"//img.dlsite.jp/[folder]/images2/[imageType1]/[imageWorkType]/[fullRoundedProductId]/[productId][imageType2]_img_[imageSize].{extension}"; string productIdWithoutPrefixString = productId.Substring(2); int productIdWithoutPrefix = Convert.ToInt32(productId.Substring(2)); @@ -78,4 +84,43 @@ public static class ImageUrlProvider return imageUrl; } + + public static string GetImageUrl(string? productId, bool hasImage, bool isOnSale, ImageSize size, ImageExtension extension) + { + string imageWorkType = productId != null ? productId.StartsWith("RJ") ? "doujin" : "professional" : "doujin"; + (string imageSize, string folder) = GetImageSizeAndFolder(size, hasImage); + + if (hasImage == false || productId == null) + { + return $"/images/web/home/no_img_{imageSize}.gif"; + } + + string productIdWithoutPrefixString = productId.Substring(2); + int productIdWithoutPrefix = Convert.ToInt32(productId.Substring(2)); + + string productIdPrefix = productId[..2]; + + int roundedProductId = (int)Math.Round(Math.Ceiling((double)productIdWithoutPrefix / 1000) * 1000); + + int productIdWithPrefixStringLength = productIdWithoutPrefixString.Length; + int zeroPadLength = productIdWithPrefixStringLength - roundedProductId.ToString().Length; + + var fullRoundedProductId = productIdPrefix.PadRight(productIdPrefix.Length + zeroPadLength, '0') + roundedProductId; + + string imageType1 = isOnSale ? "work" : "ana"; + string imageType2 = isOnSale ? "" : "_ana"; + + return $"//img.dlsite.jp/{folder}/images2/{imageType1}/{imageWorkType}/{fullRoundedProductId}/{productId}{imageType2}_img_{imageSize}.{extension}"; + } + + private static (string, string) GetImageSizeAndFolder(ImageSize imageSize, bool hasImage) + { + return imageSize switch + { + ImageSize.Thumb100 => ("sam", "modpub"), + ImageSize.Square240 => (hasImage ? "main_240x240" : "main", "resize"), + ImageSize.Square300 => (hasImage ? "main_300x300" : "main", "resize"), + _ => ("main", "modpub"), + }; + } } \ No newline at end of file diff --git a/JSMR.UI.Blazor/wwwroot/css/app.css b/JSMR.UI.Blazor/wwwroot/css/app.css index f3fda9e..4569813 100644 --- a/JSMR.UI.Blazor/wwwroot/css/app.css +++ b/JSMR.UI.Blazor/wwwroot/css/app.css @@ -608,15 +608,90 @@ code { font-weight: 500;*/ } -/* Chips */ -.j-chip { +.j-tag-2 { + padding: .4rem .8rem; + font-size: .8rem; + border-color: var(--tag-text-color); + border-width: 1px; + border-style: solid; + background-color: transparent; + border-radius: 1rem; display: flex; align-items: center; - gap: .5rem; + gap: .3rem; +} + +.j-tag-favorite { + border: 1px solid rgb(167, 243, 208); + color: rgb(167, 243, 208); + background-color: rgba(67, 243, 208, .1); +} + + .j-tag-favorite > .j-icon-tag { + background-color: #a7f3d0; + } + +.j-tag-blacklisted { + border: 1px solid rgb(254, 205, 211); + color: rgb(254, 205, 211); + background-color: rgba(254, 205, 211, .1); + color: #ea9ab2; + border: 1px solid #ea9ab2; + background-color: #ea9ab222; + color: rgb(243, 167, 167); + border: 1px solid rgb(243, 167, 167); + background-color: rgba(243, 167, 167, .1); +} + +/* Chips */ +.j-chip { + display: inline-flex; + align-items: center; + gap: .4rem; font-size: 1rem; font-weight: 500; + font-size: .8rem; + font-weight: 400; + --chip-rgb: var(--secondary-rgb, 148 163 184); + --chip-tint-alpha: 0.12; } + .j-chip.is-clickable { + cursor: pointer; + user-select: none; + } + + .j-chip.varient-filled { + padding: .4rem .8rem; + border-radius: 1rem; + } + + .j-chip.varient-outlined { + border-width: 1px; + border-style: solid; + padding: .4rem .8rem; + border-radius: 1rem; + border-color: rgb(var(--chip-rgb)); + color: rgb(var(--chip-rgb)); + background: transparent; + } + + .j-chip.tone-tint { + background: rgb(var(--chip-rgb) / var(--chip-tint-alpha)); + } + + .j-chip.color-mint { + --chip-rgb: var(--rgb-mint); + } + + .j-chip.color-green { + --chip-rgb: var(--rgb-green); + } + + .j-chip.color-teal { + --chip-rgb: var(--rgb-teal); + } + /* Icons */ .j-icon { mask-repeat: no-repeat; @@ -705,6 +780,10 @@ code { mask-image: url("../svg/person.svg"); } +.j-icon-person-fill { + mask-image: url("../svg/person-fill.svg"); +} + .j-icon-sort { mask-image: url("../svg/sort.svg"); } @@ -741,6 +820,39 @@ code { background-image: url("../svg/flag-kr.svg"); } +/* Colors */ +.color-black { + color: var(--color-black); +} + +.color-yellow { + color: var(--color-yellow); +} + +.color-green { + color: var(--color-green); +} + +.color-mint { + color: var(--color-green); +} + +.color-teal { + color: var(--color-teal); +} + +.color-blue { + color: var(--color-blue); +} + +.color-orange { + color: var(--color-orange); +} + +.color-pink { + color: var(--color-pink); +} + /* Border Colors */ .border-color-black { border-color: var(--color-black); @@ -754,6 +866,11 @@ code { border-color: var(--color-green); } +.border-color-mint { + border-color: var(--color-mint); +} + + .border-color-teal { border-color: var(--color-teal); } @@ -799,6 +916,10 @@ code { background-color: var(--color-green); } +.background-color-mint { + background-color: var(--color-mint); +} + .background-color-teal { background-color: var(--color-teal); } diff --git a/JSMR.UI.Blazor/wwwroot/css/theme-frozen.css b/JSMR.UI.Blazor/wwwroot/css/theme-frozen.css index 8642a38..2b5b2b6 100644 --- a/JSMR.UI.Blazor/wwwroot/css/theme-frozen.css +++ b/JSMR.UI.Blazor/wwwroot/css/theme-frozen.css @@ -39,12 +39,17 @@ --input-background-color: rgb(0,20,34); --input-focus-border-color: #64b5f6; --input-focus-box-shadow: 0 0 0 1px #93cbf9; + /* RGB Tokens */ + --rgb-mint: 167 243 208; + --rgb-green: 175 224 125; + --rgb-teal: 110 236 255; /* Colors */ --color-primary: rgb(180,200, 214); --color-secondary: rgb(200,220,234); --color-black: #272727; --color-yellow: #ffe073; --color-green: #afe07d; + --color-mint: #a7f3d0; --color-teal: #6eecff; --color-blue: #73c4ff; --color-orange: #ffa773; diff --git a/JSMR.UI.Blazor/wwwroot/images/web/home/not_found_img_main.png b/JSMR.UI.Blazor/wwwroot/images/web/home/not_found_img_main.png new file mode 100644 index 0000000..e3933d0 Binary files /dev/null and b/JSMR.UI.Blazor/wwwroot/images/web/home/not_found_img_main.png differ