Changeset d89d25b for KernelRecordsMVC.Web
- Timestamp:
- 09/01/26 07:17:16 (4 weeks ago)
- Branches:
- main
- Children:
- 595d2e5
- Parents:
- d2eccb3
- Location:
- KernelRecordsMVC.Web
- Files:
-
- 9 added
- 34 edited
-
Controllers/AdminController.cs (modified) (1 diff)
-
Controllers/ArtistController.cs (added)
-
Controllers/WishlistController.cs (modified) (2 diffs)
-
Views/Account/Login.cshtml (modified) (1 diff)
-
Views/Account/Register.cshtml (modified) (1 diff)
-
Views/Admin/Artists.cshtml (added)
-
Views/Admin/CreateArtist.cshtml (added)
-
Views/Admin/EditArtist.cshtml (added)
-
Views/Admin/EditRelease.cshtml (added)
-
Views/Admin/Index.cshtml (modified) (2 diffs)
-
Views/Admin/Releases.cshtml (added)
-
Views/Artist/Details.cshtml (added)
-
Views/Artist/Index.cshtml (added)
-
Views/Home/Index.cshtml (modified) (2 diffs)
-
Views/Release/Details.cshtml (modified) (11 diffs)
-
Views/Shared/_Layout.cshtml (modified) (1 diff)
-
bin/Debug/net8.0/KernelRecordsMVC.Application.dll (modified) ( previous)
-
bin/Debug/net8.0/KernelRecordsMVC.Application.pdb (modified) ( previous)
-
bin/Debug/net8.0/KernelRecordsMVC.Domain.dll (modified) ( previous)
-
bin/Debug/net8.0/KernelRecordsMVC.Domain.pdb (modified) ( previous)
-
bin/Debug/net8.0/KernelRecordsMVC.Infrastructure.dll (modified) ( previous)
-
bin/Debug/net8.0/KernelRecordsMVC.Infrastructure.pdb (modified) ( previous)
-
bin/Debug/net8.0/KernelRecordsMVC.Web.dll (modified) ( previous)
-
bin/Debug/net8.0/KernelRecordsMVC.Web.exe (modified) ( previous)
-
bin/Debug/net8.0/KernelRecordsMVC.Web.pdb (modified) ( previous)
-
bin/Debug/net8.0/KernelRecordsMVC.Web.staticwebassets.runtime.json (modified) (1 diff)
-
obj/Debug/net8.0/KernelRecordsMVC.Web.AssemblyInfo.cs (modified) (1 diff)
-
obj/Debug/net8.0/KernelRecordsMVC.Web.AssemblyInfoInputs.cache (modified) (1 diff)
-
obj/Debug/net8.0/KernelRecordsMVC.Web.GeneratedMSBuildEditorConfig.editorconfig (modified) (3 diffs)
-
obj/Debug/net8.0/KernelRecordsMVC.Web.csproj.AssemblyReference.cache (modified) ( previous)
-
obj/Debug/net8.0/KernelRecordsMVC.Web.csproj.CoreCompileInputs.cache (modified) (1 diff)
-
obj/Debug/net8.0/KernelRecordsMVC.Web.dll (modified) ( previous)
-
obj/Debug/net8.0/KernelRecordsMVC.Web.pdb (modified) ( previous)
-
obj/Debug/net8.0/KernelRecordsMVC.Web.sourcelink.json (modified) (1 diff)
-
obj/Debug/net8.0/apphost.exe (modified) ( previous)
-
obj/Debug/net8.0/ref/KernelRecordsMVC.Web.dll (modified) ( previous)
-
obj/Debug/net8.0/refint/KernelRecordsMVC.Web.dll (modified) ( previous)
-
obj/Debug/net8.0/staticwebassets.build.json (modified) (2 diffs)
-
obj/Debug/net8.0/staticwebassets.development.json (modified) (1 diff)
-
obj/Debug/net8.0/staticwebassets.pack.json (modified) (1 diff)
-
obj/Debug/net8.0/staticwebassets/msbuild.KernelRecordsMVC.Web.Microsoft.AspNetCore.StaticWebAssets.props (modified) (1 diff)
-
wwwroot/css/site.css (modified) (1 diff)
-
wwwroot/images/logo.png (added)
Legend:
- Unmodified
- Added
- Removed
-
KernelRecordsMVC.Web/Controllers/AdminController.cs
rd2eccb3 rd89d25b 1150 1150 _context.SaveChanges(); 1151 1151 } 1152 // ========================================================= 1153 // ARTISTS 1154 // ========================================================= 1155 1156 [HttpGet] 1157 public IActionResult Artists() 1158 { 1159 if (!IsAdmin()) 1160 return Forbid(); 1161 1162 var artists = _context.Artists 1163 .OrderBy(a => a.ArtistName) 1164 .ToList(); 1165 1166 return View(artists); 1152 1167 } 1168 1169 1170 // ========================================================= 1171 // CREATE ARTIST - GET 1172 // ========================================================= 1173 1174 [HttpGet] 1175 public IActionResult CreateArtist() 1176 { 1177 if (!IsAdmin()) 1178 return Forbid(); 1179 1180 return View(new CreateArtistViewModel()); 1181 } 1182 1183 1184 // ========================================================= 1185 // CREATE ARTIST - POST 1186 // ========================================================= 1187 1188 [HttpPost] 1189 [ValidateAntiForgeryToken] 1190 public IActionResult CreateArtist(CreateArtistViewModel model) 1191 { 1192 if (!IsAdmin()) 1193 return Forbid(); 1194 1195 if (!ModelState.IsValid) 1196 return View(model); 1197 1198 var duplicateExists = 1199 _context.Artists.Any(a => 1200 a.ArtistName.ToLower() == 1201 model.ArtistName.Trim().ToLower()); 1202 1203 if (duplicateExists) 1204 { 1205 ModelState.AddModelError( 1206 nameof(model.ArtistName), 1207 "An artist with this name already exists."); 1208 1209 return View(model); 1210 } 1211 1212 var artist = new Artist 1213 { 1214 ArtistId = GetNextArtistId(), 1215 1216 ArtistName = 1217 model.ArtistName.Trim(), 1218 1219 ArtistDescription = 1220 string.IsNullOrWhiteSpace(model.ArtistDescription) 1221 ? null 1222 : model.ArtistDescription.Trim(), 1223 1224 ArtistPhoto = 1225 string.IsNullOrWhiteSpace(model.ArtistPhoto) 1226 ? null 1227 : model.ArtistPhoto.Trim() 1228 }; 1229 1230 _context.Artists.Add(artist); 1231 _context.SaveChanges(); 1232 1233 TempData["Success"] = 1234 $"{artist.ArtistName} was created successfully."; 1235 1236 return RedirectToAction(nameof(Artists)); 1237 } 1238 1239 1240 // ========================================================= 1241 // EDIT ARTIST - GET 1242 // ========================================================= 1243 1244 [HttpGet] 1245 public IActionResult EditArtist(long id) 1246 { 1247 if (!IsAdmin()) 1248 return Forbid(); 1249 1250 var artist = _context.Artists 1251 .FirstOrDefault(a => 1252 a.ArtistId == id); 1253 1254 if (artist == null) 1255 return NotFound(); 1256 1257 var model = new EditArtistViewModel 1258 { 1259 ArtistId = 1260 artist.ArtistId, 1261 1262 ArtistName = 1263 artist.ArtistName, 1264 1265 ArtistDescription = 1266 artist.ArtistDescription, 1267 1268 ArtistPhoto = 1269 artist.ArtistPhoto 1270 }; 1271 1272 return View(model); 1273 } 1274 1275 1276 // ========================================================= 1277 // EDIT ARTIST - POST 1278 // ========================================================= 1279 1280 [HttpPost] 1281 [ValidateAntiForgeryToken] 1282 public IActionResult EditArtist(EditArtistViewModel model) 1283 { 1284 if (!IsAdmin()) 1285 return Forbid(); 1286 1287 var artist = _context.Artists 1288 .FirstOrDefault(a => 1289 a.ArtistId == model.ArtistId); 1290 1291 if (artist == null) 1292 return NotFound(); 1293 1294 if (!ModelState.IsValid) 1295 return View(model); 1296 1297 var duplicateExists = 1298 _context.Artists.Any(a => 1299 a.ArtistId != model.ArtistId && 1300 a.ArtistName.ToLower() == 1301 model.ArtistName.Trim().ToLower()); 1302 1303 if (duplicateExists) 1304 { 1305 ModelState.AddModelError( 1306 nameof(model.ArtistName), 1307 "Another artist already uses this name."); 1308 1309 return View(model); 1310 } 1311 1312 artist.ArtistName = 1313 model.ArtistName.Trim(); 1314 1315 artist.ArtistDescription = 1316 string.IsNullOrWhiteSpace(model.ArtistDescription) 1317 ? null 1318 : model.ArtistDescription.Trim(); 1319 1320 artist.ArtistPhoto = 1321 string.IsNullOrWhiteSpace(model.ArtistPhoto) 1322 ? null 1323 : model.ArtistPhoto.Trim(); 1324 1325 _context.Artists.Update(artist); 1326 _context.SaveChanges(); 1327 1328 TempData["Success"] = 1329 $"{artist.ArtistName} was updated successfully."; 1330 1331 return RedirectToAction(nameof(Artists)); 1332 } 1333 private long GetNextArtistId() 1334 { 1335 var maxId = _context.Artists 1336 .Select(x => (long?)x.ArtistId) 1337 .Max(); 1338 1339 return (maxId ?? 0) + 1; 1340 } 1341 // ========================================================= 1342 // RELEASES 1343 // ========================================================= 1344 1345 [HttpGet] 1346 public IActionResult Releases() 1347 { 1348 if (!IsAdmin()) 1349 return Forbid(); 1350 1351 var releases = _context.Releases 1352 .Include(r => r.ReleaseArtists) 1353 .ThenInclude(ra => ra.Artist) 1354 .OrderBy(r => r.Title) 1355 .ToList(); 1356 1357 return View(releases); 1358 } 1359 1360 1361 // ========================================================= 1362 // EDIT RELEASE - GET 1363 // ========================================================= 1364 1365 [HttpGet] 1366 public IActionResult EditRelease(long id) 1367 { 1368 if (!IsAdmin()) 1369 return Forbid(); 1370 1371 1372 var release = _context.Releases 1373 .Include(r => r.ReleaseArtists) 1374 .ThenInclude(ra => ra.Artist) 1375 .FirstOrDefault(r => 1376 r.ReleaseId == id); 1377 1378 1379 if (release == null) 1380 return NotFound(); 1381 1382 1383 var mainArtist = release.ReleaseArtists 1384 .FirstOrDefault(ra => 1385 ra.Type == ArtistReleaseType.MAIN); 1386 1387 1388 var featuredArtists = release.ReleaseArtists 1389 .Where(ra => 1390 ra.Type == ArtistReleaseType.FEATURE) 1391 .OrderBy(ra => ra.ReleaseOrdinal) 1392 .Select(ra => ra.ArtistId) 1393 .ToList(); 1394 1395 1396 var model = new EditReleaseViewModel 1397 { 1398 ReleaseId = 1399 release.ReleaseId, 1400 1401 Title = 1402 release.Title, 1403 1404 RecordLabel = 1405 release.RecordLabel, 1406 1407 Genre = 1408 release.Genre, 1409 1410 ReleaseDate = 1411 release.ReleaseDate, 1412 1413 CoverPhoto = 1414 release.CoverPhoto, 1415 1416 MainArtistId = 1417 mainArtist?.ArtistId ?? 0, 1418 1419 FeaturedArtistIds = 1420 featuredArtists 1421 }; 1422 1423 1424 LoadArtists(); 1425 1426 1427 return View(model); 1428 } 1429 1430 1431 // ========================================================= 1432 // EDIT RELEASE - POST 1433 // ========================================================= 1434 1435 [HttpPost] 1436 [ValidateAntiForgeryToken] 1437 public IActionResult EditRelease( 1438 EditReleaseViewModel model) 1439 { 1440 if (!IsAdmin()) 1441 return Forbid(); 1442 1443 1444 var release = _context.Releases 1445 .Include(r => r.ReleaseArtists) 1446 .FirstOrDefault(r => 1447 r.ReleaseId == model.ReleaseId); 1448 1449 1450 if (release == null) 1451 return NotFound(); 1452 1453 1454 // ========================================== 1455 // ARTIST VALIDATION 1456 // ========================================== 1457 1458 var mainArtistExists = 1459 _context.Artists.Any(a => 1460 a.ArtistId == model.MainArtistId); 1461 1462 1463 if (!mainArtistExists) 1464 { 1465 ModelState.AddModelError( 1466 nameof(model.MainArtistId), 1467 "Please select a valid main artist."); 1468 } 1469 1470 1471 model.FeaturedArtistIds ??= 1472 new List<long>(); 1473 1474 1475 model.FeaturedArtistIds = 1476 model.FeaturedArtistIds 1477 .Distinct() 1478 .Where(id => 1479 id != model.MainArtistId) 1480 .ToList(); 1481 1482 1483 if (model.FeaturedArtistIds.Count > 0) 1484 { 1485 var validFeaturedCount = 1486 _context.Artists.Count(a => 1487 model.FeaturedArtistIds 1488 .Contains(a.ArtistId)); 1489 1490 1491 if (validFeaturedCount != 1492 model.FeaturedArtistIds.Count) 1493 { 1494 ModelState.AddModelError( 1495 nameof(model.FeaturedArtistIds), 1496 "One or more featured artists are invalid."); 1497 } 1498 } 1499 1500 1501 if (!ModelState.IsValid) 1502 { 1503 LoadArtists(); 1504 1505 return View(model); 1506 } 1507 1508 1509 using var transaction = 1510 _context.Database.BeginTransaction(); 1511 1512 1513 try 1514 { 1515 // ========================================== 1516 // UPDATE RELEASE INFORMATION 1517 // ========================================== 1518 1519 release.Title = 1520 model.Title.Trim(); 1521 1522 release.RecordLabel = 1523 string.IsNullOrWhiteSpace( 1524 model.RecordLabel) 1525 ? null 1526 : model.RecordLabel.Trim(); 1527 1528 release.Genre = 1529 model.Genre.Trim(); 1530 1531 release.ReleaseDate = 1532 model.ReleaseDate; 1533 1534 release.CoverPhoto = 1535 model.CoverPhoto.Trim(); 1536 1537 1538 _context.Releases.Update( 1539 release); 1540 1541 1542 // ========================================== 1543 // REMOVE OLD RELEASE ARTIST LINKS 1544 // ========================================== 1545 1546 var existingArtistLinks = 1547 release.ReleaseArtists.ToList(); 1548 1549 1550 _context.ReleaseArtists.RemoveRange( 1551 existingArtistLinks); 1552 1553 1554 _context.SaveChanges(); 1555 1556 1557 // ========================================== 1558 // ADD MAIN ARTIST 1559 // ========================================== 1560 1561 _context.ReleaseArtists.Add( 1562 new ReleaseArtist 1563 { 1564 ReleaseId = 1565 release.ReleaseId, 1566 1567 ArtistId = 1568 model.MainArtistId, 1569 1570 ReleaseOrdinal = 1571 1, 1572 1573 Type = 1574 ArtistReleaseType.MAIN 1575 }); 1576 1577 1578 // ========================================== 1579 // ADD FEATURED ARTISTS 1580 // ========================================== 1581 1582 long ordinal = 2; 1583 1584 1585 foreach (var artistId 1586 in model.FeaturedArtistIds) 1587 { 1588 _context.ReleaseArtists.Add( 1589 new ReleaseArtist 1590 { 1591 ReleaseId = 1592 release.ReleaseId, 1593 1594 ArtistId = 1595 artistId, 1596 1597 ReleaseOrdinal = 1598 ordinal++, 1599 1600 Type = 1601 ArtistReleaseType.FEATURE 1602 }); 1603 } 1604 1605 1606 _context.SaveChanges(); 1607 1608 1609 transaction.Commit(); 1610 1611 1612 TempData["Success"] = 1613 $"{release.Title} was updated successfully."; 1614 1615 1616 return RedirectToAction( 1617 nameof(Releases)); 1618 } 1619 catch 1620 { 1621 transaction.Rollback(); 1622 1623 throw; 1624 } 1625 } 1626 } -
KernelRecordsMVC.Web/Controllers/WishlistController.cs
rd2eccb3 rd89d25b 54 54 public IActionResult Add(long productId) 55 55 { 56 var userId = GetUserId(); 57 58 if (userId == null) 59 { 60 return RedirectToAction( 61 "Login", 62 "Account"); 63 } 64 65 var product = _context.Products 66 .Include(p => p.Release) 67 .FirstOrDefault(p => p.ProductId == productId); 56 var sessionUserId = 57 HttpContext.Session.GetInt32("UserId"); 58 59 if (!sessionUserId.HasValue) 60 { 61 return RedirectToAction( 62 "Login", 63 "Account"); 64 } 65 66 var userId = 67 (long)sessionUserId.Value; 68 69 70 var product = 71 _context.Products 72 .FirstOrDefault(p => 73 p.ProductId == productId); 68 74 69 75 if (product == null) … … 71 77 72 78 73 // Find existing wishlist 74 var wishlist = _context.Wishlists 75 .Include(w => w.WishlistProducts) 76 .FirstOrDefault(w => 77 w.UserId == userId.Value); 78 79 80 // Create wishlist if user doesn't have one 79 var wishlist = 80 _context.Wishlists 81 .FirstOrDefault(w => 82 w.UserId == userId); 83 84 85 // Create wishlist if user doesn't have one yet. 81 86 if (wishlist == null) 82 87 { 83 88 wishlist = new Wishlist 84 89 { 85 WishlistId = GetNextWishlistId(), 86 UserId = userId.Value 90 WishlistId = 91 GetNextWishlistId(), 92 93 UserId = 94 userId 87 95 }; 88 96 89 _context.Wishlists.Add(wishlist); 97 98 _context.Wishlists.Add( 99 wishlist); 100 90 101 _context.SaveChanges(); 91 102 } 92 103 93 104 94 // Check if product is already there 95 var alreadyExists = wishlist.WishlistProducts 96 .Any(x => x.ProductId == productId); 105 // Prevent duplicate product. 106 var alreadyExists = 107 _context.WishlistProducts 108 .Any(wp => 109 wp.WishlistId == 110 wishlist.WishlistId && 111 wp.ProductId == 112 productId); 113 97 114 98 115 if (!alreadyExists) 99 116 { 100 var wishlistProduct = new WishlistProduct 101 { 102 WishlistId = wishlist.WishlistId, 103 ProductId = productId, 104 AddedAt = DateTime.Today 105 }; 106 107 _context.WishlistProducts.Add(wishlistProduct); 117 var wishlistProduct = 118 new WishlistProduct 119 { 120 WishlistId = 121 wishlist.WishlistId, 122 123 ProductId = 124 productId 125 }; 126 127 128 _context.WishlistProducts.Add( 129 wishlistProduct); 130 108 131 _context.SaveChanges(); 109 110 TempData["Success"] = 111 "Product added to your wishlist."; 112 } 113 else 114 { 115 TempData["Info"] = 116 "This product is already in your wishlist."; 117 } 132 } 133 134 135 TempData["Success"] = 136 "Product added to your wishlist."; 137 118 138 119 139 return RedirectToAction( 120 "Details", 121 "Release", 122 new { id = product.ReleaseId }); 140 nameof(Index)); 123 141 } 124 142 -
KernelRecordsMVC.Web/Views/Account/Login.cshtml
rd2eccb3 rd89d25b 1 1 @model KernelRecordsMVC.Application.ViewModels.LoginViewModel 2 2 3 <h2>Login</h2> 3 @{ 4 ViewData["Title"] = "Login"; 5 } 4 6 5 < form asp-action="Login" method="post">7 <div class="auth-page"> 6 8 7 <div asp-validation-summary="ModelOnly" 8 class="text-danger"> 9 </div> 9 <div class="auth-shell"> 10 11 <div class="auth-brand-panel"> 12 13 <a asp-controller="Home" 14 asp-action="Index" 15 class="auth-logo-link"> 16 17 <img src="~/images/logo.png" 18 asp-append-version="true" 19 alt="Kernel Records" 20 class="auth-logo" /> 21 22 </a> 23 24 <div class="auth-brand-copy"> 25 26 <span class="auth-eyebrow"> 27 KERNEL RECORDS 28 </span> 29 30 <h1> 31 Welcome back. 32 </h1> 33 34 <p> 35 Sign in to manage your wishlist, 36 orders and record collection. 37 </p> 38 39 </div> 40 41 </div> 10 42 11 43 12 <div class="mb-3">44 <div class="auth-form-panel"> 13 45 14 <label asp-for="Username" 15 class="form-label"> 16 </label> 46 <div class="auth-form-header"> 17 47 18 <input asp-for="Username" 19 class="form-control"/> 48 <span class="auth-eyebrow"> 49 ACCOUNT 50 </span> 20 51 21 <span asp-validation-for="Username" 22 class="text-danger"> 23 </span> 52 <h2>Login</h2> 53 54 <p> 55 Enter your account details below. 56 </p> 57 58 </div> 59 60 61 <form asp-action="Login" 62 method="post" 63 class="auth-form"> 64 65 @Html.AntiForgeryToken() 66 67 68 <div asp-validation-summary="ModelOnly" 69 class="auth-validation-summary"> 70 </div> 71 72 73 <!-- USERNAME --> 74 75 <div class="auth-field"> 76 77 <label asp-for="Username"> 78 Username 79 </label> 80 81 <input asp-for="Username" 82 autocomplete="username" 83 placeholder="Enter your username" /> 84 85 <span asp-validation-for="Username" 86 class="auth-field-error"> 87 </span> 88 89 </div> 90 91 92 <!-- PASSWORD --> 93 94 <div class="auth-field"> 95 96 <label asp-for="Password"> 97 Password 98 </label> 99 100 <div class="auth-password-field"> 101 102 <input asp-for="Password" 103 autocomplete="current-password" 104 placeholder="Enter your password" 105 id="loginPassword" /> 106 107 <button type="button" 108 class="auth-password-toggle" 109 data-password-toggle="loginPassword" 110 aria-label="Show password"> 111 112 Show 113 114 </button> 115 116 </div> 117 118 <span asp-validation-for="Password" 119 class="auth-field-error"> 120 </span> 121 122 </div> 123 124 125 <button type="submit" 126 class="auth-submit"> 127 128 Login 129 130 </button> 131 132 </form> 133 134 135 <div class="auth-switch"> 136 137 <span> 138 Don't have an account? 139 </span> 140 141 <a asp-action="Register"> 142 Create account → 143 </a> 144 145 </div> 146 147 </div> 24 148 25 149 </div> 26 150 151 </div> 27 152 28 <div class="mb-3">29 30 <label asp-for="Password"31 class="form-label">32 </label>33 34 <input asp-for="Password"35 class="form-control"/>36 37 <span asp-validation-for="Password"38 class="text-danger">39 </span>40 41 </div>42 43 44 <button type="submit"45 class="btn btn-primary">46 47 Login48 49 </button>50 51 </form>52 53 <div class="mt-3">54 55 Don't have an account?56 57 <a asp-action="Register">58 Register59 </a>60 61 </div>62 153 63 154 @section Scripts 64 155 { 65 <partial name="_ValidationScriptsPartial"/> 156 <partial name="_ValidationScriptsPartial" /> 157 158 <script> 159 160 document 161 .querySelectorAll("[data-password-toggle]") 162 .forEach(function (button) 163 { 164 button.addEventListener( 165 "click", 166 function () 167 { 168 const input = 169 document.getElementById( 170 button.dataset.passwordToggle); 171 172 173 if (input.type === "password") 174 { 175 input.type = "text"; 176 button.textContent = "Hide"; 177 button.setAttribute( 178 "aria-label", 179 "Hide password"); 180 } 181 else 182 { 183 input.type = "password"; 184 button.textContent = "Show"; 185 button.setAttribute( 186 "aria-label", 187 "Show password"); 188 } 189 }); 190 }); 191 192 </script> 66 193 } -
KernelRecordsMVC.Web/Views/Account/Register.cshtml
rd2eccb3 rd89d25b 1 1 @model KernelRecordsMVC.Application.ViewModels.RegisterViewModel 2 2 3 <h2>Register</h2> 4 5 <form asp-action="Register" method="post"> 6 7 <div class="mb-3"> 8 <label asp-for="Email" class="form-label"></label> 9 10 <input asp-for="Email" 11 class="form-control"/> 12 13 <span asp-validation-for="Email" 14 class="text-danger"></span> 3 @{ 4 ViewData["Title"] = "Register"; 5 } 6 7 <div class="auth-page"> 8 9 <div class="auth-shell auth-shell-register"> 10 11 <div class="auth-brand-panel"> 12 13 <a asp-controller="Home" 14 asp-action="Index" 15 class="auth-logo-link"> 16 17 <img src="~/images/logo.png" 18 asp-append-version="true" 19 alt="Kernel Records" 20 class="auth-logo" /> 21 22 </a> 23 24 <div class="auth-brand-copy"> 25 26 <span class="auth-eyebrow"> 27 KERNEL RECORDS 28 </span> 29 30 <h1> 31 Start your collection. 32 </h1> 33 34 <p> 35 Create an account to save releases, 36 build your wishlist and place orders. 37 </p> 38 39 </div> 40 41 </div> 42 43 44 <div class="auth-form-panel"> 45 46 <div class="auth-form-header"> 47 48 <span class="auth-eyebrow"> 49 NEW ACCOUNT 50 </span> 51 52 <h2>Register</h2> 53 54 <p> 55 Create your Kernel Records account. 56 </p> 57 58 </div> 59 60 61 <form asp-action="Register" 62 method="post" 63 class="auth-form"> 64 65 @Html.AntiForgeryToken() 66 67 68 <div asp-validation-summary="ModelOnly" 69 class="auth-validation-summary"> 70 </div> 71 72 73 <!-- EMAIL --> 74 75 <div class="auth-field"> 76 77 <label asp-for="Email"> 78 Email 79 </label> 80 81 <input asp-for="Email" 82 autocomplete="email" 83 placeholder="mila@gmail.com" /> 84 85 <span asp-validation-for="Email" 86 class="auth-field-error"> 87 </span> 88 89 </div> 90 91 92 <!-- USERNAME --> 93 94 <div class="auth-field"> 95 96 <label asp-for="Username"> 97 Username 98 </label> 99 100 <input asp-for="Username" 101 autocomplete="username" 102 placeholder="Choose a username" /> 103 104 <span asp-validation-for="Username" 105 class="auth-field-error"> 106 </span> 107 108 </div> 109 110 111 <!-- PASSWORD ROW --> 112 113 <div class="auth-form-row"> 114 115 <div class="auth-field"> 116 117 <label asp-for="Password"> 118 Password 119 </label> 120 121 <div class="auth-password-field"> 122 123 <input asp-for="Password" 124 autocomplete="new-password" 125 placeholder="Create password" 126 id="registerPassword" /> 127 128 <button type="button" 129 class="auth-password-toggle" 130 data-password-toggle="registerPassword" 131 aria-label="Show password"> 132 133 Show 134 135 </button> 136 137 </div> 138 139 <span asp-validation-for="Password" 140 class="auth-field-error"> 141 </span> 142 143 </div> 144 145 146 <div class="auth-field"> 147 148 <label asp-for="ConfirmPassword"> 149 Confirm Password 150 </label> 151 152 <div class="auth-password-field"> 153 154 <input asp-for="ConfirmPassword" 155 autocomplete="new-password" 156 placeholder="Repeat password" 157 id="confirmPassword" /> 158 159 <button type="button" 160 class="auth-password-toggle" 161 data-password-toggle="confirmPassword" 162 aria-label="Show password"> 163 164 Show 165 166 </button> 167 168 </div> 169 170 <span asp-validation-for="ConfirmPassword" 171 class="auth-field-error"> 172 </span> 173 174 </div> 175 176 </div> 177 178 179 <!-- SHIPPING ADDRESS --> 180 181 <div class="auth-field"> 182 183 <label asp-for="ShippingAddress"> 184 Shipping Address 185 <span class="auth-optional"> 186 Optional 187 </span> 188 </label> 189 190 <input asp-for="ShippingAddress" 191 autocomplete="street-address" 192 placeholder="Shipping address" /> 193 194 <span asp-validation-for="ShippingAddress" 195 class="auth-field-error"> 196 </span> 197 198 </div> 199 200 201 <!-- TELEPHONE --> 202 203 <div class="auth-field"> 204 205 <label asp-for="TelephoneNumber"> 206 Telephone Number 207 <span class="auth-optional"> 208 Optional 209 </span> 210 </label> 211 212 <input asp-for="TelephoneNumber" 213 type="tel" 214 autocomplete="tel" 215 placeholder="+389..." /> 216 217 <span asp-validation-for="TelephoneNumber" 218 class="auth-field-error"> 219 </span> 220 221 </div> 222 223 224 <button type="submit" 225 class="auth-submit"> 226 227 Create Account 228 229 </button> 230 231 </form> 232 233 234 <div class="auth-switch"> 235 236 <span> 237 Already have an account? 238 </span> 239 240 <a asp-action="Login"> 241 Login → 242 </a> 243 244 </div> 245 246 </div> 247 15 248 </div> 16 249 17 18 <div class="mb-3">19 <label asp-for="Username" class="form-label"></label>20 21 <input asp-for="Username"22 class="form-control"/>23 24 <span asp-validation-for="Username"25 class="text-danger"></span>26 </div>27 28 29 <div class="mb-3">30 <label asp-for="Password"31 class="form-label"></label>32 33 <input asp-for="Password"34 class="form-control"/>35 36 <span asp-validation-for="Password"37 class="text-danger"></span>38 </div>39 40 41 <div class="mb-3">42 <label asp-for="ConfirmPassword"43 class="form-label"></label>44 45 <input asp-for="ConfirmPassword"46 class="form-control"/>47 48 <span asp-validation-for="ConfirmPassword"49 class="text-danger"></span>50 </div>51 52 53 <div class="mb-3">54 <label asp-for="ShippingAddress"55 class="form-label">56 57 Shipping Address58 59 </label>60 61 <input asp-for="ShippingAddress"62 class="form-control"/>63 </div>64 65 66 <div class="mb-3">67 <label asp-for="TelephoneNumber"68 class="form-label">69 70 Telephone Number71 72 </label>73 74 <input asp-for="TelephoneNumber"75 class="form-control"/>76 </div>77 78 79 <button type="submit"80 class="btn btn-primary">81 82 Register83 84 </button>85 86 </form>87 88 <div class="mt-3">89 90 Already have an account?91 92 <a asp-action="Login">93 Login94 </a>95 96 250 </div> 251 97 252 98 253 @section Scripts 99 254 { 100 <partial name="_ValidationScriptsPartial"/> 255 <partial name="_ValidationScriptsPartial" /> 256 257 <script> 258 259 document 260 .querySelectorAll("[data-password-toggle]") 261 .forEach(function (button) 262 { 263 button.addEventListener( 264 "click", 265 function () 266 { 267 const input = 268 document.getElementById( 269 button.dataset.passwordToggle); 270 271 272 if (input.type === "password") 273 { 274 input.type = "text"; 275 button.textContent = "Hide"; 276 button.setAttribute( 277 "aria-label", 278 "Hide password"); 279 } 280 else 281 { 282 input.type = "password"; 283 button.textContent = "Show"; 284 button.setAttribute( 285 "aria-label", 286 "Show password"); 287 } 288 }); 289 }); 290 291 </script> 101 292 } -
KernelRecordsMVC.Web/Views/Admin/Index.cshtml
rd2eccb3 rd89d25b 13 13 <div> 14 14 15 <span class="admin-eyebrow"> 16 KERNEL RECORDS 17 </span> 15 <img src="~/images/logo.png" 16 asp-append-version="true" 17 alt="Kernel Records" 18 class="admin-page-logo" /> 18 19 19 20 <h1>Admin Dashboard</h1> … … 256 257 257 258 </a> 259 <a asp-action="Artists" 260 class="admin-action-card"> 261 262 <div class="admin-action-icon"> 263 ♫ 264 </div> 265 266 <div> 267 268 <h3>Manage Artists</h3> 269 270 <p> 271 Create and edit artist profiles, 272 descriptions and photos. 273 </p> 274 275 </div> 276 277 <span class="admin-action-arrow"> 278 → 279 </span> 280 281 </a> 282 283 284 <a asp-action="Releases" 285 class="admin-action-card"> 286 287 <div class="admin-action-icon"> 288 ◉ 289 </div> 290 291 <div> 292 293 <h3>Manage Releases</h3> 294 295 <p> 296 Browse and edit albums and singles 297 in the catalog. 298 </p> 299 300 </div> 301 302 <span class="admin-action-arrow"> 303 → 304 </span> 305 306 </a> 258 307 259 308 </div> -
KernelRecordsMVC.Web/Views/Home/Index.cshtml
rd2eccb3 rd89d25b 12 12 13 13 <div class="home-hero-content"> 14 15 <span class="home-eyebrow">16 KERNEL RECORDS17 </span>18 14 19 15 <h1> … … 52 48 53 49 54 <div class="home-hero-mark"> 55 K 50 <div class="hero-logo"> 51 <img src="~/images/logo.png" 52 asp-append-version="true" 53 alt="Kernel Records" 54 class="hero-logo-image" /> 56 55 </div> 57 56 -
KernelRecordsMVC.Web/Views/Release/Details.cshtml
rd2eccb3 rd89d25b 68 68 </div> 69 69 70 70 71 <div> 71 72 … … 78 79 </div> 79 80 81 80 82 <div> 81 83 … … 83 85 84 86 <strong> 85 @Model.RecordLabel 87 @(string.IsNullOrWhiteSpace(Model.RecordLabel) 88 ? "Independent" 89 : Model.RecordLabel) 86 90 </strong> 87 91 … … 102 106 .OrderBy(x => x.ReleaseOrdinal)) 103 107 { 104 <span class="artist-tag"> 108 <a asp-controller="Artist" 109 asp-action="Details" 110 asp-route-id="@artist.ArtistId" 111 class="artist-tag"> 105 112 106 113 @artist.Artist.ArtistName … … 113 120 } 114 121 115 </ span>122 </a> 116 123 } 117 124 … … 172 179 @product.Format 173 180 </span> 181 174 182 175 183 @if (product.Stock > 0) … … 203 211 <div class="product-actions"> 204 212 213 <!-- ADD TO CART --> 214 205 215 <a asp-controller="Order" 206 216 asp-action="AddProduct" … … 212 222 </a> 213 223 214 <a asp-controller="Wishlist" 215 asp-action="Add" 216 asp-route-productId="@product.ProductId" 217 class="store-button secondary"> 218 219 ♡ Wishlist 220 221 </a> 224 225 <!-- ADD TO WISHLIST --> 226 227 <form asp-controller="Wishlist" 228 asp-action="Add" 229 method="post"> 230 231 @Html.AntiForgeryToken() 232 233 <input type="hidden" 234 name="productId" 235 value="@product.ProductId" /> 236 237 <button type="submit" 238 class="store-button secondary"> 239 240 ♡ Wishlist 241 242 </button> 243 244 </form> 222 245 223 246 </div> … … 227 250 <div class="product-actions"> 228 251 229 <a asp-controller="Wishlist" 230 asp-action="Add" 231 asp-route-productId="@product.ProductId" 232 class="store-button secondary full"> 233 234 ♡ Add to Wishlist 235 236 </a> 252 <!-- OUT OF STOCK: WISHLIST ONLY --> 253 254 <form asp-controller="Wishlist" 255 asp-action="Add" 256 method="post"> 257 258 @Html.AntiForgeryToken() 259 260 <input type="hidden" 261 name="productId" 262 value="@product.ProductId" /> 263 264 <button type="submit" 265 class="store-button secondary full"> 266 267 ♡ Add to Wishlist 268 269 </button> 270 271 </form> 237 272 238 273 </div> … … 277 312 278 313 279 <ol class="track-list"> 280 281 @{ 282 var trackNumber = 1; 283 } 284 285 @foreach (var albumSong in Model.Album.AlbumSongs 286 .OrderBy(x => x.SongId)) 287 { 288 <li class="track-row"> 289 290 <span class="track-number"> 291 @trackNumber.ToString("00") 292 </span> 293 294 <div class="track-main"> 295 296 <strong> 297 @albumSong.Song.SongName 298 </strong> 299 300 @if (albumSong.Song.SongArtists.Any()) 301 { 302 <div class="song-artists"> 303 304 @string.Join( 305 ", ", 306 albumSong.Song.SongArtists 307 .OrderBy(x => x.SongOrdinal) 308 .Select(x => x.Artist.ArtistName) 309 ) 310 311 </div> 312 } 313 314 </div> 315 316 <span class="track-duration"> 317 @albumSong.Song.SongDuration 318 </span> 319 320 </li> 321 322 trackNumber++; 323 } 324 325 </ol> 314 @if (!Model.Album.AlbumSongs.Any()) 315 { 316 <div class="no-products"> 317 No tracks have been added to this album. 318 </div> 319 } 320 else 321 { 322 <ol class="track-list"> 323 324 @{ 325 var trackNumber = 1; 326 } 327 328 329 @foreach (var albumSong in Model.Album.AlbumSongs 330 .OrderBy(x => x.SongId)) 331 { 332 <li class="track-row"> 333 334 <span class="track-number"> 335 @trackNumber.ToString("00") 336 </span> 337 338 339 <div class="track-main"> 340 341 <strong> 342 @albumSong.Song.SongName 343 </strong> 344 345 346 @if (albumSong.Song.SongArtists != null && 347 albumSong.Song.SongArtists.Any()) 348 { 349 <div class="song-artists"> 350 351 @string.Join( 352 ", ", 353 albumSong.Song.SongArtists 354 .OrderBy(x => x.SongOrdinal) 355 .Select(x => 356 x.Artist.ArtistName) 357 ) 358 359 </div> 360 } 361 362 </div> 363 364 365 <span class="track-duration"> 366 @albumSong.Song.SongDuration 367 </span> 368 369 </li> 370 371 trackNumber++; 372 } 373 374 </ol> 375 } 326 376 327 377 </section> … … 368 418 </div> 369 419 420 370 421 <div class="single-duration"> 371 422 -
KernelRecordsMVC.Web/Views/Shared/_Layout.cshtml
rd2eccb3 rd89d25b 31 31 <!-- LOGO --> 32 32 33 <a class="brand" 34 asp-controller="Home" 35 asp-action="Index"> 36 37 <span class="brand-main"> 38 KERNEL 39 </span> 40 41 <span class="brand-sub"> 42 RECORDS 43 </span> 33 <a asp-controller="Home" 34 asp-action="Index" 35 class="navbar-brand logo-brand"> 36 37 <img src="~/images/logo.png" 38 asp-append-version="true" 39 alt="Kernel Records" 40 class="site-logo" /> 44 41 45 42 </a> -
KernelRecordsMVC.Web/bin/Debug/net8.0/KernelRecordsMVC.Web.staticwebassets.runtime.json
rd2eccb3 rd89d25b 1 {"ContentRoots":["C:\\Users\\Marko\\RiderProjects\\KernelRecordsMVC\\KernelRecordsMVC.Web\\wwwroot\\","C:\\Users\\Marko\\RiderProjects\\KernelRecordsMVC\\KernelRecordsMVC.Web\\obj\\Debug\\net8.0\\scopedcss\\bundle\\"],"Root":{"Children":{"css":{"Children":{"site.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"css/site.css"},"Patterns":null}},"Asset":null,"Patterns":null},"favicon.ico":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"favicon.ico"},"Patterns":null}," js":{"Children":{"site.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"js/site.js"},"Patterns":null}},"Asset":null,"Patterns":null},"lib":{"Children":{"bootstrap":{"Children":{"dist":{"Children":{"css":{"Children":{"bootstrap-grid.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.css"},"Patterns":null},"bootstrap-grid.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.css.map"},"Patterns":null},"bootstrap-grid.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.min.css"},"Patterns":null},"bootstrap-grid.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.min.css.map"},"Patterns":null},"bootstrap-grid.rtl.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.rtl.css"},"Patterns":null},"bootstrap-grid.rtl.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.rtl.css.map"},"Patterns":null},"bootstrap-grid.rtl.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.rtl.min.css"},"Patterns":null},"bootstrap-grid.rtl.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.rtl.min.css.map"},"Patterns":null},"bootstrap-reboot.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.css"},"Patterns":null},"bootstrap-reboot.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.css.map"},"Patterns":null},"bootstrap-reboot.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.min.css"},"Patterns":null},"bootstrap-reboot.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.min.css.map"},"Patterns":null},"bootstrap-reboot.rtl.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.rtl.css"},"Patterns":null},"bootstrap-reboot.rtl.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.rtl.css.map"},"Patterns":null},"bootstrap-reboot.rtl.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.rtl.min.css"},"Patterns":null},"bootstrap-reboot.rtl.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.rtl.min.css.map"},"Patterns":null},"bootstrap-utilities.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.css"},"Patterns":null},"bootstrap-utilities.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.css.map"},"Patterns":null},"bootstrap-utilities.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.min.css"},"Patterns":null},"bootstrap-utilities.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.min.css.map"},"Patterns":null},"bootstrap-utilities.rtl.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.rtl.css"},"Patterns":null},"bootstrap-utilities.rtl.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.rtl.css.map"},"Patterns":null},"bootstrap-utilities.rtl.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.rtl.min.css"},"Patterns":null},"bootstrap-utilities.rtl.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.rtl.min.css.map"},"Patterns":null},"bootstrap.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.css"},"Patterns":null},"bootstrap.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.css.map"},"Patterns":null},"bootstrap.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.min.css"},"Patterns":null},"bootstrap.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.min.css.map"},"Patterns":null},"bootstrap.rtl.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.rtl.css"},"Patterns":null},"bootstrap.rtl.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.rtl.css.map"},"Patterns":null},"bootstrap.rtl.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.rtl.min.css"},"Patterns":null},"bootstrap.rtl.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.rtl.min.css.map"},"Patterns":null}},"Asset":null,"Patterns":null},"js":{"Children":{"bootstrap.bundle.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.bundle.js"},"Patterns":null},"bootstrap.bundle.js.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.bundle.js.map"},"Patterns":null},"bootstrap.bundle.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.bundle.min.js"},"Patterns":null},"bootstrap.bundle.min.js.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.bundle.min.js.map"},"Patterns":null},"bootstrap.esm.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.esm.js"},"Patterns":null},"bootstrap.esm.js.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.esm.js.map"},"Patterns":null},"bootstrap.esm.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.esm.min.js"},"Patterns":null},"bootstrap.esm.min.js.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.esm.min.js.map"},"Patterns":null},"bootstrap.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.js"},"Patterns":null},"bootstrap.js.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.js.map"},"Patterns":null},"bootstrap.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.min.js"},"Patterns":null},"bootstrap.min.js.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.min.js.map"},"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":null},"LICENSE":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/LICENSE"},"Patterns":null}},"Asset":null,"Patterns":null},"jquery-validation-unobtrusive":{"Children":{"jquery.validate.unobtrusive.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js"},"Patterns":null},"jquery.validate.unobtrusive.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"},"Patterns":null},"LICENSE.txt":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation-unobtrusive/LICENSE.txt"},"Patterns":null}},"Asset":null,"Patterns":null},"jquery-validation":{"Children":{"dist":{"Children":{"additional-methods.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation/dist/additional-methods.js"},"Patterns":null},"additional-methods.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation/dist/additional-methods.min.js"},"Patterns":null},"jquery.validate.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation/dist/jquery.validate.js"},"Patterns":null},"jquery.validate.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation/dist/jquery.validate.min.js"},"Patterns":null}},"Asset":null,"Patterns":null},"LICENSE.md":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation/LICENSE.md"},"Patterns":null}},"Asset":null,"Patterns":null},"jquery":{"Children":{"dist":{"Children":{"jquery.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery/dist/jquery.js"},"Patterns":null},"jquery.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery/dist/jquery.min.js"},"Patterns":null},"jquery.min.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery/dist/jquery.min.map"},"Patterns":null}},"Asset":null,"Patterns":null},"LICENSE.txt":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery/LICENSE.txt"},"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":null},"KernelRecordsMVC.Web.styles.css":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"KernelRecordsMVC.Web.styles.css"},"Patterns":null}},"Asset":null,"Patterns":[{"ContentRootIndex":0,"Pattern":"**","Depth":0}]}}1 {"ContentRoots":["C:\\Users\\Marko\\RiderProjects\\KernelRecordsMVC\\KernelRecordsMVC.Web\\wwwroot\\","C:\\Users\\Marko\\RiderProjects\\KernelRecordsMVC\\KernelRecordsMVC.Web\\obj\\Debug\\net8.0\\scopedcss\\bundle\\"],"Root":{"Children":{"css":{"Children":{"site.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"css/site.css"},"Patterns":null}},"Asset":null,"Patterns":null},"favicon.ico":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"favicon.ico"},"Patterns":null},"images":{"Children":{"logo.png":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"images/logo.png"},"Patterns":null}},"Asset":null,"Patterns":null},"js":{"Children":{"site.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"js/site.js"},"Patterns":null}},"Asset":null,"Patterns":null},"lib":{"Children":{"bootstrap":{"Children":{"dist":{"Children":{"css":{"Children":{"bootstrap-grid.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.css"},"Patterns":null},"bootstrap-grid.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.css.map"},"Patterns":null},"bootstrap-grid.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.min.css"},"Patterns":null},"bootstrap-grid.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.min.css.map"},"Patterns":null},"bootstrap-grid.rtl.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.rtl.css"},"Patterns":null},"bootstrap-grid.rtl.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.rtl.css.map"},"Patterns":null},"bootstrap-grid.rtl.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.rtl.min.css"},"Patterns":null},"bootstrap-grid.rtl.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.rtl.min.css.map"},"Patterns":null},"bootstrap-reboot.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.css"},"Patterns":null},"bootstrap-reboot.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.css.map"},"Patterns":null},"bootstrap-reboot.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.min.css"},"Patterns":null},"bootstrap-reboot.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.min.css.map"},"Patterns":null},"bootstrap-reboot.rtl.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.rtl.css"},"Patterns":null},"bootstrap-reboot.rtl.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.rtl.css.map"},"Patterns":null},"bootstrap-reboot.rtl.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.rtl.min.css"},"Patterns":null},"bootstrap-reboot.rtl.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.rtl.min.css.map"},"Patterns":null},"bootstrap-utilities.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.css"},"Patterns":null},"bootstrap-utilities.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.css.map"},"Patterns":null},"bootstrap-utilities.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.min.css"},"Patterns":null},"bootstrap-utilities.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.min.css.map"},"Patterns":null},"bootstrap-utilities.rtl.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.rtl.css"},"Patterns":null},"bootstrap-utilities.rtl.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.rtl.css.map"},"Patterns":null},"bootstrap-utilities.rtl.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.rtl.min.css"},"Patterns":null},"bootstrap-utilities.rtl.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.rtl.min.css.map"},"Patterns":null},"bootstrap.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.css"},"Patterns":null},"bootstrap.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.css.map"},"Patterns":null},"bootstrap.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.min.css"},"Patterns":null},"bootstrap.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.min.css.map"},"Patterns":null},"bootstrap.rtl.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.rtl.css"},"Patterns":null},"bootstrap.rtl.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.rtl.css.map"},"Patterns":null},"bootstrap.rtl.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.rtl.min.css"},"Patterns":null},"bootstrap.rtl.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.rtl.min.css.map"},"Patterns":null}},"Asset":null,"Patterns":null},"js":{"Children":{"bootstrap.bundle.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.bundle.js"},"Patterns":null},"bootstrap.bundle.js.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.bundle.js.map"},"Patterns":null},"bootstrap.bundle.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.bundle.min.js"},"Patterns":null},"bootstrap.bundle.min.js.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.bundle.min.js.map"},"Patterns":null},"bootstrap.esm.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.esm.js"},"Patterns":null},"bootstrap.esm.js.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.esm.js.map"},"Patterns":null},"bootstrap.esm.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.esm.min.js"},"Patterns":null},"bootstrap.esm.min.js.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.esm.min.js.map"},"Patterns":null},"bootstrap.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.js"},"Patterns":null},"bootstrap.js.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.js.map"},"Patterns":null},"bootstrap.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.min.js"},"Patterns":null},"bootstrap.min.js.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.min.js.map"},"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":null},"LICENSE":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/LICENSE"},"Patterns":null}},"Asset":null,"Patterns":null},"jquery-validation-unobtrusive":{"Children":{"jquery.validate.unobtrusive.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js"},"Patterns":null},"jquery.validate.unobtrusive.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"},"Patterns":null},"LICENSE.txt":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation-unobtrusive/LICENSE.txt"},"Patterns":null}},"Asset":null,"Patterns":null},"jquery-validation":{"Children":{"dist":{"Children":{"additional-methods.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation/dist/additional-methods.js"},"Patterns":null},"additional-methods.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation/dist/additional-methods.min.js"},"Patterns":null},"jquery.validate.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation/dist/jquery.validate.js"},"Patterns":null},"jquery.validate.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation/dist/jquery.validate.min.js"},"Patterns":null}},"Asset":null,"Patterns":null},"LICENSE.md":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation/LICENSE.md"},"Patterns":null}},"Asset":null,"Patterns":null},"jquery":{"Children":{"dist":{"Children":{"jquery.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery/dist/jquery.js"},"Patterns":null},"jquery.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery/dist/jquery.min.js"},"Patterns":null},"jquery.min.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery/dist/jquery.min.map"},"Patterns":null}},"Asset":null,"Patterns":null},"LICENSE.txt":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery/LICENSE.txt"},"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":null},"KernelRecordsMVC.Web.styles.css":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"KernelRecordsMVC.Web.styles.css"},"Patterns":null}},"Asset":null,"Patterns":[{"ContentRootIndex":0,"Pattern":"**","Depth":0}]}} -
KernelRecordsMVC.Web/obj/Debug/net8.0/KernelRecordsMVC.Web.AssemblyInfo.cs
rd2eccb3 rd89d25b 15 15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] 16 16 [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] 17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+ 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5")]17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+d2eccb3e3d4db7d262fc57179b8ce6f7fb060d63")] 18 18 [assembly: System.Reflection.AssemblyProductAttribute("KernelRecordsMVC.Web")] 19 19 [assembly: System.Reflection.AssemblyTitleAttribute("KernelRecordsMVC.Web")] -
KernelRecordsMVC.Web/obj/Debug/net8.0/KernelRecordsMVC.Web.AssemblyInfoInputs.cache
rd2eccb3 rd89d25b 1 c 8c33cb9ccc0e5c5e6227ad0d596fbb462f0c80224c10ca755e42b9afff049e91 c7c64d4b5585be3def76ca8244acd21f3a41a4886ee5b2db049d2b6c7160a3f4 -
KernelRecordsMVC.Web/obj/Debug/net8.0/KernelRecordsMVC.Web.GeneratedMSBuildEditorConfig.editorconfig
rd2eccb3 rd89d25b 73 73 build_metadata.AdditionalFiles.CssScope = 74 74 75 [C:/Users/Marko/RiderProjects/KernelRecordsMVC/KernelRecordsMVC.Web/Views/Admin/Artists.cshtml] 76 build_metadata.AdditionalFiles.TargetPath = Vmlld3NcQWRtaW5cQXJ0aXN0cy5jc2h0bWw= 77 build_metadata.AdditionalFiles.CssScope = 78 79 [C:/Users/Marko/RiderProjects/KernelRecordsMVC/KernelRecordsMVC.Web/Views/Admin/CreateArtist.cshtml] 80 build_metadata.AdditionalFiles.TargetPath = Vmlld3NcQWRtaW5cQ3JlYXRlQXJ0aXN0LmNzaHRtbA== 81 build_metadata.AdditionalFiles.CssScope = 82 75 83 [C:/Users/Marko/RiderProjects/KernelRecordsMVC/KernelRecordsMVC.Web/Views/Admin/CreateProduct.cshtml] 76 84 build_metadata.AdditionalFiles.TargetPath = Vmlld3NcQWRtaW5cQ3JlYXRlUHJvZHVjdC5jc2h0bWw= … … 81 89 build_metadata.AdditionalFiles.CssScope = 82 90 91 [C:/Users/Marko/RiderProjects/KernelRecordsMVC/KernelRecordsMVC.Web/Views/Admin/EditArtist.cshtml] 92 build_metadata.AdditionalFiles.TargetPath = Vmlld3NcQWRtaW5cRWRpdEFydGlzdC5jc2h0bWw= 93 build_metadata.AdditionalFiles.CssScope = 94 83 95 [C:/Users/Marko/RiderProjects/KernelRecordsMVC/KernelRecordsMVC.Web/Views/Admin/EditProduct.cshtml] 84 96 build_metadata.AdditionalFiles.TargetPath = Vmlld3NcQWRtaW5cRWRpdFByb2R1Y3QuY3NodG1s 97 build_metadata.AdditionalFiles.CssScope = 98 99 [C:/Users/Marko/RiderProjects/KernelRecordsMVC/KernelRecordsMVC.Web/Views/Admin/EditRelease.cshtml] 100 build_metadata.AdditionalFiles.TargetPath = Vmlld3NcQWRtaW5cRWRpdFJlbGVhc2UuY3NodG1s 85 101 build_metadata.AdditionalFiles.CssScope = 86 102 … … 91 107 [C:/Users/Marko/RiderProjects/KernelRecordsMVC/KernelRecordsMVC.Web/Views/Admin/Products.cshtml] 92 108 build_metadata.AdditionalFiles.TargetPath = Vmlld3NcQWRtaW5cUHJvZHVjdHMuY3NodG1s 109 build_metadata.AdditionalFiles.CssScope = 110 111 [C:/Users/Marko/RiderProjects/KernelRecordsMVC/KernelRecordsMVC.Web/Views/Admin/Releases.cshtml] 112 build_metadata.AdditionalFiles.TargetPath = Vmlld3NcQWRtaW5cUmVsZWFzZXMuY3NodG1s 113 build_metadata.AdditionalFiles.CssScope = 114 115 [C:/Users/Marko/RiderProjects/KernelRecordsMVC/KernelRecordsMVC.Web/Views/Artist/Details.cshtml] 116 build_metadata.AdditionalFiles.TargetPath = Vmlld3NcQXJ0aXN0XERldGFpbHMuY3NodG1s 117 build_metadata.AdditionalFiles.CssScope = 118 119 [C:/Users/Marko/RiderProjects/KernelRecordsMVC/KernelRecordsMVC.Web/Views/Artist/Index.cshtml] 120 build_metadata.AdditionalFiles.TargetPath = Vmlld3NcQXJ0aXN0XEluZGV4LmNzaHRtbA== 93 121 build_metadata.AdditionalFiles.CssScope = 94 122 -
KernelRecordsMVC.Web/obj/Debug/net8.0/KernelRecordsMVC.Web.csproj.CoreCompileInputs.cache
rd2eccb3 rd89d25b 1 21c22170dbd5df356be1a77b3f77b619add1a8fb50970ec121bfff2f0bc30d5a 1 0d2d313270b8273aefc58118d7951c632515785f05722e18ae44736d5db6ee4c -
KernelRecordsMVC.Web/obj/Debug/net8.0/KernelRecordsMVC.Web.sourcelink.json
rd2eccb3 rd89d25b 1 {"documents":{"C:\\Users\\Marko\\RiderProjects\\KernelRecordsMVC\\*":"https://raw.githubusercontent.com/mmilevski/kernelrecords/ 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5/*"}}1 {"documents":{"C:\\Users\\Marko\\RiderProjects\\KernelRecordsMVC\\*":"https://raw.githubusercontent.com/mmilevski/kernelrecords/d2eccb3e3d4db7d262fc57179b8ce6f7fb060d63/*"}} -
KernelRecordsMVC.Web/obj/Debug/net8.0/staticwebassets.build.json
rd2eccb3 rd89d25b 1 1 { 2 2 "Version": 1, 3 "Hash": " Z4AJGKSmCBMu/t74qsSYiHSw3hqm7Xo8YOImYZDzg10=",3 "Hash": "7gsW+gT8+cbT2+Ae6+SqVsEGmq5ACNa9l9lpi54y2vU=", 4 4 "Source": "KernelRecordsMVC.Web", 5 5 "BasePath": "_content/KernelRecordsMVC.Web", … … 94 94 }, 95 95 { 96 "Identity": "C:\\Users\\Marko\\RiderProjects\\KernelRecordsMVC\\KernelRecordsMVC.Web\\wwwroot\\images\\logo.png", 97 "SourceId": "KernelRecordsMVC.Web", 98 "SourceType": "Discovered", 99 "ContentRoot": "C:\\Users\\Marko\\RiderProjects\\KernelRecordsMVC\\KernelRecordsMVC.Web\\wwwroot\\", 100 "BasePath": "_content/KernelRecordsMVC.Web", 101 "RelativePath": "images/logo.png", 102 "AssetKind": "All", 103 "AssetMode": "All", 104 "AssetRole": "Primary", 105 "AssetMergeBehavior": "PreferTarget", 106 "AssetMergeSource": "", 107 "RelatedAsset": "", 108 "AssetTraitName": "", 109 "AssetTraitValue": "", 110 "CopyToOutputDirectory": "Never", 111 "CopyToPublishDirectory": "PreserveNewest", 112 "OriginalItemSpec": "wwwroot\\images\\logo.png" 113 }, 114 { 96 115 "Identity": "C:\\Users\\Marko\\RiderProjects\\KernelRecordsMVC\\KernelRecordsMVC.Web\\wwwroot\\js\\site.js", 97 116 "SourceId": "KernelRecordsMVC.Web", -
KernelRecordsMVC.Web/obj/Debug/net8.0/staticwebassets.development.json
rd2eccb3 rd89d25b 1 {"ContentRoots":["C:\\Users\\Marko\\RiderProjects\\KernelRecordsMVC\\KernelRecordsMVC.Web\\wwwroot\\","C:\\Users\\Marko\\RiderProjects\\KernelRecordsMVC\\KernelRecordsMVC.Web\\obj\\Debug\\net8.0\\scopedcss\\bundle\\"],"Root":{"Children":{"css":{"Children":{"site.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"css/site.css"},"Patterns":null}},"Asset":null,"Patterns":null},"favicon.ico":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"favicon.ico"},"Patterns":null}," js":{"Children":{"site.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"js/site.js"},"Patterns":null}},"Asset":null,"Patterns":null},"lib":{"Children":{"bootstrap":{"Children":{"dist":{"Children":{"css":{"Children":{"bootstrap-grid.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.css"},"Patterns":null},"bootstrap-grid.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.css.map"},"Patterns":null},"bootstrap-grid.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.min.css"},"Patterns":null},"bootstrap-grid.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.min.css.map"},"Patterns":null},"bootstrap-grid.rtl.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.rtl.css"},"Patterns":null},"bootstrap-grid.rtl.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.rtl.css.map"},"Patterns":null},"bootstrap-grid.rtl.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.rtl.min.css"},"Patterns":null},"bootstrap-grid.rtl.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.rtl.min.css.map"},"Patterns":null},"bootstrap-reboot.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.css"},"Patterns":null},"bootstrap-reboot.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.css.map"},"Patterns":null},"bootstrap-reboot.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.min.css"},"Patterns":null},"bootstrap-reboot.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.min.css.map"},"Patterns":null},"bootstrap-reboot.rtl.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.rtl.css"},"Patterns":null},"bootstrap-reboot.rtl.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.rtl.css.map"},"Patterns":null},"bootstrap-reboot.rtl.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.rtl.min.css"},"Patterns":null},"bootstrap-reboot.rtl.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.rtl.min.css.map"},"Patterns":null},"bootstrap-utilities.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.css"},"Patterns":null},"bootstrap-utilities.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.css.map"},"Patterns":null},"bootstrap-utilities.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.min.css"},"Patterns":null},"bootstrap-utilities.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.min.css.map"},"Patterns":null},"bootstrap-utilities.rtl.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.rtl.css"},"Patterns":null},"bootstrap-utilities.rtl.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.rtl.css.map"},"Patterns":null},"bootstrap-utilities.rtl.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.rtl.min.css"},"Patterns":null},"bootstrap-utilities.rtl.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.rtl.min.css.map"},"Patterns":null},"bootstrap.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.css"},"Patterns":null},"bootstrap.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.css.map"},"Patterns":null},"bootstrap.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.min.css"},"Patterns":null},"bootstrap.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.min.css.map"},"Patterns":null},"bootstrap.rtl.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.rtl.css"},"Patterns":null},"bootstrap.rtl.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.rtl.css.map"},"Patterns":null},"bootstrap.rtl.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.rtl.min.css"},"Patterns":null},"bootstrap.rtl.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.rtl.min.css.map"},"Patterns":null}},"Asset":null,"Patterns":null},"js":{"Children":{"bootstrap.bundle.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.bundle.js"},"Patterns":null},"bootstrap.bundle.js.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.bundle.js.map"},"Patterns":null},"bootstrap.bundle.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.bundle.min.js"},"Patterns":null},"bootstrap.bundle.min.js.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.bundle.min.js.map"},"Patterns":null},"bootstrap.esm.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.esm.js"},"Patterns":null},"bootstrap.esm.js.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.esm.js.map"},"Patterns":null},"bootstrap.esm.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.esm.min.js"},"Patterns":null},"bootstrap.esm.min.js.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.esm.min.js.map"},"Patterns":null},"bootstrap.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.js"},"Patterns":null},"bootstrap.js.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.js.map"},"Patterns":null},"bootstrap.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.min.js"},"Patterns":null},"bootstrap.min.js.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.min.js.map"},"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":null},"LICENSE":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/LICENSE"},"Patterns":null}},"Asset":null,"Patterns":null},"jquery-validation-unobtrusive":{"Children":{"jquery.validate.unobtrusive.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js"},"Patterns":null},"jquery.validate.unobtrusive.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"},"Patterns":null},"LICENSE.txt":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation-unobtrusive/LICENSE.txt"},"Patterns":null}},"Asset":null,"Patterns":null},"jquery-validation":{"Children":{"dist":{"Children":{"additional-methods.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation/dist/additional-methods.js"},"Patterns":null},"additional-methods.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation/dist/additional-methods.min.js"},"Patterns":null},"jquery.validate.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation/dist/jquery.validate.js"},"Patterns":null},"jquery.validate.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation/dist/jquery.validate.min.js"},"Patterns":null}},"Asset":null,"Patterns":null},"LICENSE.md":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation/LICENSE.md"},"Patterns":null}},"Asset":null,"Patterns":null},"jquery":{"Children":{"dist":{"Children":{"jquery.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery/dist/jquery.js"},"Patterns":null},"jquery.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery/dist/jquery.min.js"},"Patterns":null},"jquery.min.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery/dist/jquery.min.map"},"Patterns":null}},"Asset":null,"Patterns":null},"LICENSE.txt":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery/LICENSE.txt"},"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":null},"KernelRecordsMVC.Web.styles.css":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"KernelRecordsMVC.Web.styles.css"},"Patterns":null}},"Asset":null,"Patterns":[{"ContentRootIndex":0,"Pattern":"**","Depth":0}]}}1 {"ContentRoots":["C:\\Users\\Marko\\RiderProjects\\KernelRecordsMVC\\KernelRecordsMVC.Web\\wwwroot\\","C:\\Users\\Marko\\RiderProjects\\KernelRecordsMVC\\KernelRecordsMVC.Web\\obj\\Debug\\net8.0\\scopedcss\\bundle\\"],"Root":{"Children":{"css":{"Children":{"site.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"css/site.css"},"Patterns":null}},"Asset":null,"Patterns":null},"favicon.ico":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"favicon.ico"},"Patterns":null},"images":{"Children":{"logo.png":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"images/logo.png"},"Patterns":null}},"Asset":null,"Patterns":null},"js":{"Children":{"site.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"js/site.js"},"Patterns":null}},"Asset":null,"Patterns":null},"lib":{"Children":{"bootstrap":{"Children":{"dist":{"Children":{"css":{"Children":{"bootstrap-grid.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.css"},"Patterns":null},"bootstrap-grid.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.css.map"},"Patterns":null},"bootstrap-grid.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.min.css"},"Patterns":null},"bootstrap-grid.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.min.css.map"},"Patterns":null},"bootstrap-grid.rtl.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.rtl.css"},"Patterns":null},"bootstrap-grid.rtl.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.rtl.css.map"},"Patterns":null},"bootstrap-grid.rtl.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.rtl.min.css"},"Patterns":null},"bootstrap-grid.rtl.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.rtl.min.css.map"},"Patterns":null},"bootstrap-reboot.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.css"},"Patterns":null},"bootstrap-reboot.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.css.map"},"Patterns":null},"bootstrap-reboot.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.min.css"},"Patterns":null},"bootstrap-reboot.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.min.css.map"},"Patterns":null},"bootstrap-reboot.rtl.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.rtl.css"},"Patterns":null},"bootstrap-reboot.rtl.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.rtl.css.map"},"Patterns":null},"bootstrap-reboot.rtl.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.rtl.min.css"},"Patterns":null},"bootstrap-reboot.rtl.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.rtl.min.css.map"},"Patterns":null},"bootstrap-utilities.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.css"},"Patterns":null},"bootstrap-utilities.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.css.map"},"Patterns":null},"bootstrap-utilities.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.min.css"},"Patterns":null},"bootstrap-utilities.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.min.css.map"},"Patterns":null},"bootstrap-utilities.rtl.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.rtl.css"},"Patterns":null},"bootstrap-utilities.rtl.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.rtl.css.map"},"Patterns":null},"bootstrap-utilities.rtl.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.rtl.min.css"},"Patterns":null},"bootstrap-utilities.rtl.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.rtl.min.css.map"},"Patterns":null},"bootstrap.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.css"},"Patterns":null},"bootstrap.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.css.map"},"Patterns":null},"bootstrap.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.min.css"},"Patterns":null},"bootstrap.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.min.css.map"},"Patterns":null},"bootstrap.rtl.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.rtl.css"},"Patterns":null},"bootstrap.rtl.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.rtl.css.map"},"Patterns":null},"bootstrap.rtl.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.rtl.min.css"},"Patterns":null},"bootstrap.rtl.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.rtl.min.css.map"},"Patterns":null}},"Asset":null,"Patterns":null},"js":{"Children":{"bootstrap.bundle.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.bundle.js"},"Patterns":null},"bootstrap.bundle.js.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.bundle.js.map"},"Patterns":null},"bootstrap.bundle.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.bundle.min.js"},"Patterns":null},"bootstrap.bundle.min.js.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.bundle.min.js.map"},"Patterns":null},"bootstrap.esm.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.esm.js"},"Patterns":null},"bootstrap.esm.js.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.esm.js.map"},"Patterns":null},"bootstrap.esm.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.esm.min.js"},"Patterns":null},"bootstrap.esm.min.js.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.esm.min.js.map"},"Patterns":null},"bootstrap.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.js"},"Patterns":null},"bootstrap.js.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.js.map"},"Patterns":null},"bootstrap.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.min.js"},"Patterns":null},"bootstrap.min.js.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.min.js.map"},"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":null},"LICENSE":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/LICENSE"},"Patterns":null}},"Asset":null,"Patterns":null},"jquery-validation-unobtrusive":{"Children":{"jquery.validate.unobtrusive.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js"},"Patterns":null},"jquery.validate.unobtrusive.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"},"Patterns":null},"LICENSE.txt":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation-unobtrusive/LICENSE.txt"},"Patterns":null}},"Asset":null,"Patterns":null},"jquery-validation":{"Children":{"dist":{"Children":{"additional-methods.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation/dist/additional-methods.js"},"Patterns":null},"additional-methods.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation/dist/additional-methods.min.js"},"Patterns":null},"jquery.validate.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation/dist/jquery.validate.js"},"Patterns":null},"jquery.validate.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation/dist/jquery.validate.min.js"},"Patterns":null}},"Asset":null,"Patterns":null},"LICENSE.md":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation/LICENSE.md"},"Patterns":null}},"Asset":null,"Patterns":null},"jquery":{"Children":{"dist":{"Children":{"jquery.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery/dist/jquery.js"},"Patterns":null},"jquery.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery/dist/jquery.min.js"},"Patterns":null},"jquery.min.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery/dist/jquery.min.map"},"Patterns":null}},"Asset":null,"Patterns":null},"LICENSE.txt":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery/LICENSE.txt"},"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":null},"KernelRecordsMVC.Web.styles.css":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"KernelRecordsMVC.Web.styles.css"},"Patterns":null}},"Asset":null,"Patterns":[{"ContentRootIndex":0,"Pattern":"**","Depth":0}]}} -
KernelRecordsMVC.Web/obj/Debug/net8.0/staticwebassets.pack.json
rd2eccb3 rd89d25b 12 12 "Id": "C:\\Users\\Marko\\RiderProjects\\KernelRecordsMVC\\KernelRecordsMVC.Web\\wwwroot\\favicon.ico", 13 13 "PackagePath": "staticwebassets\\favicon.ico" 14 }, 15 { 16 "Id": "C:\\Users\\Marko\\RiderProjects\\KernelRecordsMVC\\KernelRecordsMVC.Web\\wwwroot\\images\\logo.png", 17 "PackagePath": "staticwebassets\\images\\logo.png" 14 18 }, 15 19 { -
KernelRecordsMVC.Web/obj/Debug/net8.0/staticwebassets/msbuild.KernelRecordsMVC.Web.Microsoft.AspNetCore.StaticWebAssets.props
rd2eccb3 rd89d25b 33 33 <OriginalItemSpec>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)..\staticwebassets\favicon.ico))</OriginalItemSpec> 34 34 </StaticWebAsset> 35 <StaticWebAsset Include="$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)..\staticwebassets\images\logo.png))"> 36 <SourceType>Package</SourceType> 37 <SourceId>KernelRecordsMVC.Web</SourceId> 38 <ContentRoot>$(MSBuildThisFileDirectory)..\staticwebassets\</ContentRoot> 39 <BasePath>_content/KernelRecordsMVC.Web</BasePath> 40 <RelativePath>images/logo.png</RelativePath> 41 <AssetKind>All</AssetKind> 42 <AssetMode>All</AssetMode> 43 <AssetRole>Primary</AssetRole> 44 <RelatedAsset></RelatedAsset> 45 <AssetTraitName></AssetTraitName> 46 <AssetTraitValue></AssetTraitValue> 47 <CopyToOutputDirectory>Never</CopyToOutputDirectory> 48 <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory> 49 <OriginalItemSpec>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)..\staticwebassets\images\logo.png))</OriginalItemSpec> 50 </StaticWebAsset> 35 51 <StaticWebAsset Include="$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)..\staticwebassets\js\site.js))"> 36 52 <SourceType>Package</SourceType> -
KernelRecordsMVC.Web/wwwroot/css/site.css
rd2eccb3 rd89d25b 4139 4139 4140 4140 } 4141 /* ========================================================= 4142 KERNEL RECORDS LOGO 4143 ========================================================= */ 4144 4145 .logo-brand { 4146 display: flex; 4147 align-items: center; 4148 4149 padding: 0; 4150 4151 text-decoration: none; 4152 } 4153 4154 .site-logo { 4155 display: block; 4156 4157 width: auto; 4158 height: 72px; 4159 4160 object-fit: contain; 4161 } 4162 4163 @media (max-width: 700px) { 4164 4165 .site-logo { 4166 height: 55px; 4167 } 4168 4169 } 4170 .admin-page-logo { 4171 display: block; 4172 4173 width: auto; 4174 height: 80px; 4175 4176 margin-bottom: 12px; 4177 4178 object-fit: contain; 4179 } 4180 .hero-logo { 4181 display: flex; 4182 justify-content: center; 4183 align-items: center; 4184 } 4185 4186 .hero-logo-image { 4187 width: min(520px, 90%); 4188 height: auto; 4189 display: block; 4190 object-fit: contain; 4191 transform: translate(55px, 55px); 4192 } 4193 4194 /* ========================================================= 4195 ARTISTS 4196 ========================================================= */ 4197 4198 .artist-page, 4199 .artist-details-page { 4200 max-width: 1350px; 4201 margin: 0 auto; 4202 padding: 55px 30px 80px; 4203 } 4204 4205 .artist-page-header { 4206 margin-bottom: 35px; 4207 } 4208 4209 .artist-eyebrow { 4210 display: block; 4211 margin-bottom: 8px; 4212 color: #888; 4213 font-size: 10px; 4214 font-weight: 900; 4215 letter-spacing: 2px; 4216 } 4217 4218 .artist-page-header h1, 4219 .artist-details-info h1 { 4220 margin: 0; 4221 font-size: clamp(38px, 6vw, 76px); 4222 line-height: 1; 4223 font-weight: 900; 4224 letter-spacing: -2px; 4225 } 4226 4227 .artist-page-header p { 4228 max-width: 600px; 4229 margin-top: 15px; 4230 color: #777; 4231 line-height: 1.7; 4232 } 4233 4234 /* Artist list: fixed 200 x 200 images */ 4235 4236 .artist-grid { 4237 display: grid; 4238 grid-template-columns: repeat(auto-fill, 200px); 4239 gap: 24px; 4240 align-items: start; 4241 justify-content: start; 4242 } 4243 4244 .artist-card { 4245 width: 200px; 4246 overflow: hidden; 4247 display: block; 4248 background: white; 4249 border: 1px solid #ddd; 4250 border-radius: 10px; 4251 color: inherit; 4252 text-decoration: none; 4253 transition: 4254 transform 0.2s ease, 4255 border-color 0.2s ease, 4256 box-shadow 0.2s ease; 4257 } 4258 4259 .artist-card:hover { 4260 transform: translateY(-4px); 4261 border-color: #999; 4262 box-shadow: 0 12px 28px rgba(0, 0, 0, 0.08); 4263 } 4264 4265 .artist-card-image { 4266 width: 200px; 4267 height: 200px; 4268 overflow: hidden; 4269 background: #eee; 4270 } 4271 4272 .artist-card-image img { 4273 width: 200px; 4274 height: 200px; 4275 display: block; 4276 object-fit: cover; 4277 object-position: center; 4278 } 4279 4280 .artist-photo-placeholder { 4281 width: 100%; 4282 height: 100%; 4283 display: flex; 4284 align-items: center; 4285 justify-content: center; 4286 background: #1a1a1a; 4287 color: white; 4288 font-size: 40px; 4289 } 4290 4291 .artist-card-image .artist-photo-placeholder { 4292 width: 200px; 4293 height: 200px; 4294 } 4295 4296 .artist-photo-placeholder.large { 4297 width: 200px; 4298 height: 200px; 4299 min-height: 0; 4300 font-size: 60px; 4301 } 4302 4303 .artist-card-body { 4304 width: 200px; 4305 padding: 16px; 4306 } 4307 4308 .artist-card-body h2 { 4309 margin: 0 0 10px; 4310 overflow-wrap: anywhere; 4311 font-size: 17px; 4312 line-height: 1.25; 4313 } 4314 4315 .artist-card-body p { 4316 display: -webkit-box; 4317 overflow: hidden; 4318 margin: 0 0 15px; 4319 color: #777; 4320 font-size: 12px; 4321 line-height: 1.6; 4322 -webkit-line-clamp: 3; 4323 -webkit-box-orient: vertical; 4324 } 4325 4326 .artist-card-link { 4327 font-size: 10px; 4328 font-weight: 900; 4329 letter-spacing: 1px; 4330 text-transform: uppercase; 4331 } 4332 4333 /* Artist details: fixed 200 x 200 profile image */ 4334 4335 .artist-back-link { 4336 display: inline-block; 4337 margin-bottom: 25px; 4338 color: #555; 4339 font-size: 11px; 4340 font-weight: 800; 4341 text-decoration: none; 4342 } 4343 4344 .artist-back-link:hover { 4345 color: #111; 4346 } 4347 4348 .artist-details-hero { 4349 display: grid; 4350 grid-template-columns: 200px minmax(0, 1fr); 4351 gap: 45px; 4352 align-items: center; 4353 } 4354 4355 .artist-details-image { 4356 width: 200px; 4357 height: 200px; 4358 overflow: hidden; 4359 border-radius: 10px; 4360 background: #eee; 4361 } 4362 4363 .artist-details-image img { 4364 width: 200px; 4365 height: 200px; 4366 display: block; 4367 object-fit: cover; 4368 object-position: center; 4369 } 4370 4371 .artist-details-image .artist-photo-placeholder { 4372 width: 200px; 4373 height: 200px; 4374 } 4375 4376 .artist-details-info { 4377 min-width: 0; 4378 } 4379 4380 .artist-details-info p { 4381 max-width: 650px; 4382 margin-top: 25px; 4383 color: #666; 4384 line-height: 1.8; 4385 } 4386 4387 /* Artist releases */ 4388 4389 .artist-release-section { 4390 margin-top: 70px; 4391 } 4392 4393 .artist-section-header { 4394 margin-bottom: 25px; 4395 } 4396 4397 .artist-section-header h2 { 4398 margin: 0; 4399 font-size: 30px; 4400 } 4401 4402 .artist-release-grid { 4403 display: grid; 4404 grid-template-columns: repeat(auto-fill, minmax(210px, 1fr)); 4405 gap: 20px; 4406 } 4407 4408 .artist-release-card { 4409 display: block; 4410 color: inherit; 4411 text-decoration: none; 4412 } 4413 4414 .artist-release-cover { 4415 overflow: hidden; 4416 aspect-ratio: 1 / 1; 4417 border-radius: 8px; 4418 background: #eee; 4419 } 4420 4421 .artist-release-cover img { 4422 width: 100%; 4423 height: 100%; 4424 display: block; 4425 object-fit: cover; 4426 } 4427 4428 .artist-release-cover .artist-photo-placeholder { 4429 width: 100%; 4430 height: 100%; 4431 } 4432 4433 .artist-release-body { 4434 padding-top: 12px; 4435 } 4436 4437 .artist-release-body h3 { 4438 margin: 0; 4439 font-size: 15px; 4440 } 4441 4442 .artist-release-body p, 4443 .artist-release-body span { 4444 color: #888; 4445 font-size: 11px; 4446 } 4447 4448 .artist-empty { 4449 padding: 30px; 4450 border: 1px dashed #ccc; 4451 border-radius: 8px; 4452 color: #777; 4453 } 4454 4455 /* Artist responsive */ 4456 4457 @media (max-width: 800px) { 4458 .artist-details-hero { 4459 grid-template-columns: 200px minmax(0, 1fr); 4460 gap: 28px; 4461 } 4462 } 4463 4464 @media (max-width: 600px) { 4465 .artist-page, 4466 .artist-details-page { 4467 padding: 35px 18px 60px; 4468 } 4469 4470 .artist-grid { 4471 justify-content: center; 4472 } 4473 4474 .artist-details-hero { 4475 grid-template-columns: 1fr; 4476 justify-items: start; 4477 } 4478 4479 .artist-details-image { 4480 width: 200px; 4481 height: 200px; 4482 } 4483 } 4484 4485 @media (max-width: 430px) { 4486 .artist-grid { 4487 grid-template-columns: 200px; 4488 } 4489 } 4490 /* ========================================================= 4491 AUTH - LOGIN / REGISTER 4492 ========================================================= */ 4493 4494 .auth-page { 4495 width: 100%; 4496 min-height: calc(100vh - 114px); 4497 4498 display: flex; 4499 align-items: center; 4500 justify-content: center; 4501 4502 padding: 55px 30px 80px; 4503 4504 background: #f5f5f3; 4505 } 4506 4507 .auth-shell { 4508 width: min(100%, 1050px); 4509 min-height: 600px; 4510 4511 display: grid; 4512 grid-template-columns: 4513 minmax(0, 0.9fr) 4514 minmax(0, 1.1fr); 4515 4516 overflow: hidden; 4517 4518 background: white; 4519 4520 border: 1px solid #ddd; 4521 border-radius: 14px; 4522 4523 box-shadow: 4524 0 20px 55px rgba(0, 0, 0, 0.08); 4525 } 4526 4527 .auth-shell-register { 4528 width: min(100%, 1150px); 4529 } 4530 4531 4532 /* ========================================================= 4533 AUTH BRAND SIDE 4534 ========================================================= */ 4535 4536 .auth-brand-panel { 4537 position: relative; 4538 4539 min-height: 600px; 4540 4541 display: flex; 4542 flex-direction: column; 4543 justify-content: space-between; 4544 4545 padding: 45px; 4546 4547 overflow: hidden; 4548 4549 background: #111; 4550 color: white; 4551 } 4552 4553 .auth-brand-panel::after { 4554 content: ""; 4555 4556 position: absolute; 4557 4558 width: 430px; 4559 height: 430px; 4560 4561 right: -180px; 4562 bottom: -190px; 4563 4564 border: 55px solid #1c1c1c; 4565 border-radius: 50%; 4566 } 4567 4568 .auth-logo-link { 4569 position: relative; 4570 z-index: 2; 4571 4572 width: fit-content; 4573 4574 display: block; 4575 } 4576 4577 .auth-logo { 4578 width: auto; 4579 height: 85px; 4580 4581 display: block; 4582 4583 object-fit: contain; 4584 } 4585 4586 .auth-brand-copy { 4587 position: relative; 4588 z-index: 2; 4589 4590 max-width: 390px; 4591 } 4592 4593 .auth-eyebrow { 4594 display: block; 4595 4596 margin-bottom: 10px; 4597 4598 color: #999; 4599 4600 font-size: 9px; 4601 font-weight: 900; 4602 4603 letter-spacing: 2.2px; 4604 text-transform: uppercase; 4605 } 4606 4607 .auth-brand-copy h1 { 4608 max-width: 420px; 4609 4610 font-size: clamp(42px, 5vw, 65px); 4611 line-height: .95; 4612 4613 font-weight: 900; 4614 4615 letter-spacing: -3px; 4616 } 4617 4618 .auth-brand-copy p { 4619 max-width: 360px; 4620 4621 margin-top: 22px; 4622 4623 color: #aaa; 4624 4625 font-size: 14px; 4626 line-height: 1.8; 4627 } 4628 4629 4630 /* ========================================================= 4631 AUTH FORM SIDE 4632 ========================================================= */ 4633 4634 .auth-form-panel { 4635 display: flex; 4636 flex-direction: column; 4637 justify-content: center; 4638 4639 padding: 55px 65px; 4640 } 4641 4642 .auth-form-header { 4643 margin-bottom: 30px; 4644 } 4645 4646 .auth-form-header h2 { 4647 margin: 0; 4648 4649 color: #171717; 4650 4651 font-size: 38px; 4652 font-weight: 900; 4653 4654 letter-spacing: -1.5px; 4655 } 4656 4657 .auth-form-header p { 4658 margin-top: 8px; 4659 4660 color: #777; 4661 4662 font-size: 13px; 4663 line-height: 1.6; 4664 } 4665 4666 4667 /* ========================================================= 4668 AUTH FORM 4669 ========================================================= */ 4670 4671 .auth-form { 4672 width: 100%; 4673 } 4674 4675 .auth-field { 4676 min-width: 0; 4677 4678 margin-bottom: 20px; 4679 } 4680 4681 .auth-field label { 4682 display: flex; 4683 align-items: center; 4684 4685 gap: 8px; 4686 4687 margin-bottom: 8px; 4688 4689 color: #444; 4690 4691 font-size: 10px; 4692 font-weight: 900; 4693 4694 letter-spacing: .9px; 4695 text-transform: uppercase; 4696 } 4697 4698 .auth-optional { 4699 color: #999; 4700 4701 font-size: 8px; 4702 font-weight: 700; 4703 4704 letter-spacing: .5px; 4705 } 4706 4707 .auth-field input { 4708 width: 100%; 4709 height: 48px; 4710 4711 padding: 0 14px; 4712 4713 outline: none; 4714 4715 border: 1px solid #d3d3d3; 4716 border-radius: 6px; 4717 4718 background: white; 4719 color: #171717; 4720 4721 font-size: 13px; 4722 4723 transition: 4724 border-color .2s ease, 4725 box-shadow .2s ease, 4726 background .2s ease; 4727 } 4728 4729 .auth-field input::placeholder { 4730 color: #aaa; 4731 } 4732 4733 .auth-field input:focus { 4734 border-color: #777; 4735 4736 box-shadow: 4737 0 0 0 3px rgba(0, 0, 0, 0.05); 4738 } 4739 4740 .auth-form-row { 4741 display: grid; 4742 grid-template-columns: 4743 repeat(2, minmax(0, 1fr)); 4744 4745 gap: 14px; 4746 } 4747 4748 4749 /* ========================================================= 4750 PASSWORD 4751 ========================================================= */ 4752 4753 .auth-password-field { 4754 position: relative; 4755 } 4756 4757 .auth-password-field input { 4758 padding-right: 65px; 4759 } 4760 4761 .auth-password-toggle { 4762 position: absolute; 4763 4764 top: 50%; 4765 right: 8px; 4766 4767 transform: translateY(-50%); 4768 4769 height: 32px; 4770 4771 padding: 0 9px; 4772 4773 border: none; 4774 border-radius: 4px; 4775 4776 background: #f0f0f0; 4777 color: #555; 4778 4779 font-size: 9px; 4780 font-weight: 900; 4781 4782 text-transform: uppercase; 4783 letter-spacing: .5px; 4784 } 4785 4786 .auth-password-toggle:hover { 4787 background: #ddd; 4788 color: #171717; 4789 } 4790 4791 4792 /* ========================================================= 4793 VALIDATION 4794 ========================================================= */ 4795 4796 .auth-field-error { 4797 display: block; 4798 4799 margin-top: 6px; 4800 4801 color: #a33; 4802 4803 font-size: 10px; 4804 line-height: 1.4; 4805 } 4806 4807 .auth-validation-summary { 4808 margin-bottom: 20px; 4809 } 4810 4811 .auth-validation-summary:empty { 4812 display: none; 4813 } 4814 4815 .auth-validation-summary ul { 4816 margin: 0; 4817 4818 padding: 13px 15px 13px 32px; 4819 4820 background: #fff3f3; 4821 color: #963c3c; 4822 4823 border: 1px solid #eccaca; 4824 border-radius: 6px; 4825 4826 font-size: 11px; 4827 line-height: 1.6; 4828 } 4829 4830 4831 /* ========================================================= 4832 SUBMIT 4833 ========================================================= */ 4834 4835 .auth-submit { 4836 width: 100%; 4837 min-height: 50px; 4838 4839 margin-top: 5px; 4840 4841 display: flex; 4842 align-items: center; 4843 justify-content: center; 4844 4845 border: 1px solid #171717; 4846 border-radius: 6px; 4847 4848 background: #171717; 4849 color: white; 4850 4851 font-size: 11px; 4852 font-weight: 900; 4853 4854 letter-spacing: 1px; 4855 text-transform: uppercase; 4856 4857 transition: 4858 background .2s ease, 4859 transform .2s ease; 4860 } 4861 4862 .auth-submit:hover { 4863 background: #333; 4864 4865 transform: translateY(-1px); 4866 } 4867 4868 4869 /* ========================================================= 4870 ACCOUNT SWITCH 4871 ========================================================= */ 4872 4873 .auth-switch { 4874 margin-top: 27px; 4875 padding-top: 22px; 4876 4877 display: flex; 4878 align-items: center; 4879 justify-content: center; 4880 4881 gap: 7px; 4882 4883 border-top: 1px solid #eee; 4884 4885 color: #777; 4886 4887 font-size: 11px; 4888 } 4889 4890 .auth-switch a { 4891 color: #171717; 4892 4893 font-weight: 900; 4894 } 4895 4896 .auth-switch a:hover { 4897 text-decoration: underline; 4898 } 4899 4900 4901 /* ========================================================= 4902 AUTH RESPONSIVE 4903 ========================================================= */ 4904 4905 @media (max-width: 900px) { 4906 4907 .auth-shell, 4908 .auth-shell-register { 4909 grid-template-columns: 1fr; 4910 max-width: 650px; 4911 } 4912 4913 .auth-brand-panel { 4914 min-height: 290px; 4915 4916 padding: 35px; 4917 } 4918 4919 .auth-logo { 4920 height: 70px; 4921 } 4922 4923 .auth-brand-copy h1 { 4924 font-size: 42px; 4925 } 4926 4927 .auth-brand-copy p { 4928 margin-top: 14px; 4929 } 4930 4931 .auth-form-panel { 4932 padding: 45px; 4933 } 4934 4935 } 4936 4937 @media (max-width: 600px) { 4938 4939 .auth-page { 4940 padding: 25px 15px 50px; 4941 } 4942 4943 .auth-shell, 4944 .auth-shell-register { 4945 border-radius: 10px; 4946 } 4947 4948 .auth-brand-panel { 4949 min-height: 250px; 4950 4951 padding: 27px; 4952 } 4953 4954 .auth-logo { 4955 height: 60px; 4956 } 4957 4958 .auth-brand-copy h1 { 4959 font-size: 36px; 4960 4961 letter-spacing: -2px; 4962 } 4963 4964 .auth-brand-copy p { 4965 font-size: 12px; 4966 } 4967 4968 .auth-form-panel { 4969 padding: 32px 24px; 4970 } 4971 4972 .auth-form-header h2 { 4973 font-size: 32px; 4974 } 4975 4976 .auth-form-row { 4977 grid-template-columns: 1fr; 4978 gap: 0; 4979 } 4980 4981 .auth-switch { 4982 flex-direction: column; 4983 } 4984 4985 }
Note:
See TracChangeset
for help on using the changeset viewer.
