diff --git a/BuildFeed.Model/Build.cs b/BuildFeed.Model/Build.cs index 3ab3823..92decb3 100644 --- a/BuildFeed.Model/Build.cs +++ b/BuildFeed.Model/Build.cs @@ -94,6 +94,34 @@ public string FullBuildString } } + public string AlternateBuildString + { + get + { + StringBuilder sb = new StringBuilder(); + sb.Append($"{MajorVersion}.{MinorVersion}.{Number}"); + + if (Revision.HasValue) + { + sb.Append($".{Revision}"); + } + + if (!string.IsNullOrWhiteSpace(Lab)) + { + sb.Append($" ({Lab}"); + + if (BuildTime.HasValue) + { + sb.Append($".{BuildTime.Value.ToString("yyMMdd-HHmm", CultureInfo.InvariantCulture.DateTimeFormat)}"); + } + + sb.Append(")"); + } + + return sb.ToString(); + } + } + public ProjectFamily Family { get diff --git a/BuildFeed/BuildFeed.csproj b/BuildFeed/BuildFeed.csproj index 72bf702..fbf0803 100644 --- a/BuildFeed/BuildFeed.csproj +++ b/BuildFeed/BuildFeed.csproj @@ -206,10 +206,13 @@ - - - - + + + + + + + dark.scss diff --git a/BuildFeed/Code/DateTimeModelBinder.cs b/BuildFeed/Code/DateTimeModelBinder.cs index 92dfbc9..4182379 100644 --- a/BuildFeed/Code/DateTimeModelBinder.cs +++ b/BuildFeed/Code/DateTimeModelBinder.cs @@ -2,7 +2,7 @@ using System.Globalization; using System.Web.Mvc; -namespace BuildFeed +namespace BuildFeed.Code { public class DateTimeModelBinder : DefaultModelBinder { diff --git a/BuildFeed/Controllers/frontController.cs b/BuildFeed/Controllers/frontController.cs index 3dd4282..2235c1f 100644 --- a/BuildFeed/Controllers/frontController.cs +++ b/BuildFeed/Controllers/frontController.cs @@ -48,16 +48,13 @@ public async Task IndexPage(int page) ViewBag.PageNumber = page; ViewBag.PageCount = Math.Ceiling(Convert.ToDouble(await _bModel.SelectAllGroupsCount()) / Convert.ToDouble(PAGE_SIZE)); - if (ViewBag.PageNumber > ViewBag.PageCount) - { - return new HttpNotFoundResult(); - } + if (ViewBag.PageNumber > ViewBag.PageCount) return new HttpNotFoundResult(); return View("Pages", buildGroups); } - [Route("group/{major}.{minor}.{number}.{revision}/", Order = 1)] - [Route("group/{major}.{minor}.{number}/", Order = 5)] // for when there is no revision + [Route("group/{major}.{minor}.{number}.{revision}/", Order = 1), Route("group/{major}.{minor}.{number}/", Order = 5)] + // for when there is no revision #if !DEBUG [OutputCache(Duration = 600, VaryByParam = "none", VaryByCustom = "userName;lang;theme"), OutputCachePush(Order = 2)] #endif @@ -89,10 +86,7 @@ public async Task ViewGroup(uint major, uint minor, uint number, u public async Task ViewBuild(Guid id) { Build b = await _bModel.SelectById(id); - if (b == null) - { - return new HttpNotFoundResult(); - } + if (b == null) return new HttpNotFoundResult(); return View(b); } @@ -100,10 +94,7 @@ public async Task ViewBuild(Guid id) public async Task ViewBuild(long id) { Build b = await _bModel.SelectByLegacyId(id); - if (b == null) - { - return new HttpNotFoundResult(); - } + if (b == null) return new HttpNotFoundResult(); return RedirectToAction(nameof(ViewBuild), new { @@ -119,12 +110,9 @@ public async Task ViewBuild(long id) public async Task TwitterCard(Guid id) { Build b = await _bModel.SelectById(id); - if (b == null) - { - return new HttpNotFoundResult(); - } + if (b == null) return new HttpNotFoundResult(); - string path = Path.Combine(Server.MapPath("~/content/card/"), $"{b.Family}.png"); + string path = Path.Combine(Server.MapPath("~/res/card/"), $"{b.Family}.png"); bool backExists = System.IO.File.Exists(path); using (Bitmap bm = backExists @@ -133,7 +121,6 @@ public async Task TwitterCard(Guid id) { using (Graphics gr = Graphics.FromImage(bm)) { - GraphicsPath gp = new GraphicsPath(); gr.CompositingMode = CompositingMode.SourceOver; gr.CompositingQuality = CompositingQuality.HighQuality; gr.InterpolationMode = InterpolationMode.HighQualityBicubic; @@ -141,23 +128,52 @@ public async Task TwitterCard(Guid id) gr.SmoothingMode = SmoothingMode.HighQuality; gr.PixelOffsetMode = PixelOffsetMode.HighQuality; - if (!backExists) + if (!backExists) gr.FillRectangle(new SolidBrush(Color.FromArgb(0x24, 0x24, 0x23)), 0, 0, 1120, 600); + + int left = 40; + using (GraphicsPath gp = new GraphicsPath()) { - gr.FillRectangle(new SolidBrush(Color.FromArgb(0x27, 0x2b, 0x30)), 0, 0, 1120, 600); + foreach (char c in "BUILDFEED") + { + gp.AddString(c.ToString(), new FontFamily("Segoe UI Semibold"), 0, 32, new Point(left, 32), StringFormat.GenericTypographic); + + RectangleF bounds = gp.GetBounds(); + left = Convert.ToInt32(bounds.Width); + left += 52; + } + + gr.FillPath(Brushes.White, gp); } - gp.AddString("BUILDFEED", new FontFamily("Segoe UI"), (int)FontStyle.Bold, 32, new Point(40, 32), StringFormat.GenericTypographic); - gp.AddString($"{MvcExtensions.GetDisplayTextForEnum(b.Family)} (WinNT {b.MajorVersion}.{b.MinorVersion})", new FontFamily("Segoe UI"), 0, 48, new Point(40, 80), StringFormat.GenericTypographic); - gp.AddString(b.Number.ToString(), new FontFamily("Segoe UI Light"), 0, 280, new Point(32, 96), StringFormat.GenericTypographic); - gp.AddString(b.BuildTime.HasValue - ? $"{b.Lab}\r\n{b.BuildTime.Value:yyyy/MM/dd HH:mm}" - : $"{b.Lab}", - new FontFamily("Segoe UI"), - 0, - 44, - new Point(40, 440), - StringFormat.GenericTypographic); - gr.FillPath(Brushes.White, gp); + using (GraphicsPath gp = new GraphicsPath()) + { + gp.AddString(b.Number.ToString(), new FontFamily("Segoe UI Light"), 0, 260, new Point(32, 114), StringFormat.GenericTypographic); + + RectangleF bounds = gp.GetBounds(); + left = Convert.ToInt32(bounds.Width); + left += 44; + + if (b.Revision.HasValue) gp.AddString($".{b.Revision}", new FontFamily("Segoe UI Light"), 0, 160, new Point(left, 220), StringFormat.GenericTypographic); + + gr.DrawPath(new Pen(new SolidBrush(Color.FromArgb(0x24, 0x24, 0x23)), 4), gp); + gr.FillPath(Brushes.White, gp); + } + + using (GraphicsPath gp = new GraphicsPath()) + { + gp.AddString($"{MvcExtensions.GetDisplayTextForEnum(b.Family)} (NT {b.MajorVersion}.{b.MinorVersion})", new FontFamily("Segoe UI Light"), 0, 48, new Point(40, 80), StringFormat.GenericTypographic); + + gp.AddString(char.ConvertFromUtf32(0xf126), new FontFamily("FontAwesome"), 0, 28, new Point(46, 468), StringFormat.GenericTypographic); + gp.AddString(b.Lab, new FontFamily("Segoe UI Light"), 0, 40, new Point(88, 450), StringFormat.GenericTypographic); + + if (b.BuildTime.HasValue) + { + gp.AddString(char.ConvertFromUtf32(0xf017), new FontFamily("FontAwesome"), 0, 28, new Point(40, 538), StringFormat.GenericTypographic); + gp.AddString($"{b.BuildTime.Value.ToShortTimeString()} on {b.BuildTime.Value.ToLongDateString()}", new FontFamily("Segoe UI Light"), 0, 40, new Point(88, 520), StringFormat.GenericTypographic); + } + + gr.FillPath(Brushes.White, gp); + } Response.ContentType = "image/png"; bm.Save(Response.OutputStream, ImageFormat.Png); @@ -171,10 +187,7 @@ public async Task TwitterCard(Guid id) public async Task TwitterCard(long id) { Build b = await _bModel.SelectByLegacyId(id); - if (b == null) - { - return new HttpNotFoundResult(); - } + if (b == null) return new HttpNotFoundResult(); return RedirectToAction(nameof(TwitterCard), new { @@ -209,10 +222,7 @@ public async Task ViewLabPage(string lab, int page) ViewBag.PageNumber = page; ViewBag.PageCount = Math.Ceiling(Convert.ToDouble(await _bModel.SelectLabCount(lab)) / Convert.ToDouble(PAGE_SIZE)); - if (ViewBag.PageNumber > ViewBag.PageCount) - { - return new HttpNotFoundResult(); - } + if (ViewBag.PageNumber > ViewBag.PageCount) return new HttpNotFoundResult(); return View("viewLab", builds); } @@ -244,10 +254,7 @@ public async Task ViewSourcePage(TypeOfSource source, int page) ViewBag.PageNumber = page; ViewBag.PageCount = Math.Ceiling(Convert.ToDouble(await _bModel.SelectSourceCount(source)) / Convert.ToDouble(PAGE_SIZE)); - if (ViewBag.PageNumber > ViewBag.PageCount) - { - return new HttpNotFoundResult(); - } + if (ViewBag.PageNumber > ViewBag.PageCount) return new HttpNotFoundResult(); return View("viewSource", builds); } @@ -279,10 +286,7 @@ public async Task ViewYearPage(int year, int page) ViewBag.PageNumber = page; ViewBag.PageCount = Math.Ceiling(await _bModel.SelectYearCount(year) / Convert.ToDouble(PAGE_SIZE)); - if (ViewBag.PageNumber > ViewBag.PageCount) - { - return new HttpNotFoundResult(); - } + if (ViewBag.PageNumber > ViewBag.PageCount) return new HttpNotFoundResult(); return View("viewYear", builds); } @@ -315,10 +319,7 @@ public async Task ViewVersionPage(uint major, uint minor, int page ViewBag.PageNumber = page; ViewBag.PageCount = Math.Ceiling(Convert.ToDouble(await _bModel.SelectVersionCount(major, minor)) / Convert.ToDouble(PAGE_SIZE)); - if (ViewBag.PageNumber > ViewBag.PageCount) - { - return new HttpNotFoundResult(); - } + if (ViewBag.PageNumber > ViewBag.PageCount) return new HttpNotFoundResult(); return View("viewVersion", builds); } @@ -342,14 +343,8 @@ public async Task AddBuild(Build build) { build.Added = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Utc); build.Modified = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Utc); - if (build.BuildTime.HasValue) - { - build.BuildTime = DateTime.SpecifyKind(build.BuildTime.Value, DateTimeKind.Utc); - } - if (build.LeakDate.HasValue) - { - build.LeakDate = DateTime.SpecifyKind(build.LeakDate.Value, DateTimeKind.Utc); - } + if (build.BuildTime.HasValue) build.BuildTime = DateTime.SpecifyKind(build.BuildTime.Value, DateTimeKind.Utc); + if (build.LeakDate.HasValue) build.LeakDate = DateTime.SpecifyKind(build.LeakDate.Value, DateTimeKind.Utc); await _bModel.Insert(build); } catch @@ -379,14 +374,8 @@ public async Task EditBuild(Guid id, Build build) { try { - if (build.BuildTime.HasValue) - { - build.BuildTime = DateTime.SpecifyKind(build.BuildTime.Value, DateTimeKind.Utc); - } - if (build.LeakDate.HasValue) - { - build.LeakDate = DateTime.SpecifyKind(build.LeakDate.Value, DateTimeKind.Utc); - } + if (build.BuildTime.HasValue) build.BuildTime = DateTime.SpecifyKind(build.BuildTime.Value, DateTimeKind.Utc); + if (build.LeakDate.HasValue) build.LeakDate = DateTime.SpecifyKind(build.LeakDate.Value, DateTimeKind.Utc); await _bModel.Update(build); } catch diff --git a/BuildFeed/Controllers/rssController.cs b/BuildFeed/Controllers/rssController.cs index c057a1b..da4e582 100644 --- a/BuildFeed/Controllers/rssController.cs +++ b/BuildFeed/Controllers/rssController.cs @@ -28,7 +28,7 @@ public async Task Index() Items = (from build in builds select new Item { - Title = build.FullBuildString, + Title = build.AlternateBuildString, Link = new Uri($"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}"), Permalink = $"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}", Categories = { @@ -58,7 +58,7 @@ public async Task Added() Items = (from build in builds select new Item { - Title = build.FullBuildString, + Title = build.AlternateBuildString, Link = new Uri($"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}"), Permalink = $"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}", Categories = { @@ -88,7 +88,7 @@ public async Task Leaked() Items = (from build in builds select new Item { - Title = build.FullBuildString, + Title = build.AlternateBuildString, Link = new Uri($"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}"), Permalink = $"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}", Categories = { @@ -118,7 +118,7 @@ public async Task Version() Items = (from build in builds select new Item { - Title = build.FullBuildString, + Title = build.AlternateBuildString, Link = new Uri($"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}"), Permalink = $"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}", Categories = { @@ -147,7 +147,7 @@ public async Task Lab(string lab) Items = (from build in builds select new Item { - Title = build.FullBuildString, + Title = build.AlternateBuildString, Link = new Uri($"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}"), Permalink = $"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}", Categories = { diff --git a/BuildFeed/Global.asax.cs b/BuildFeed/Global.asax.cs index cc4c728..fd55a2e 100644 --- a/BuildFeed/Global.asax.cs +++ b/BuildFeed/Global.asax.cs @@ -1,10 +1,10 @@ using System; using System.Collections.Generic; -using System.Globalization; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; +using BuildFeed.Code; using BuildFeed.Code.Options; using BuildFeed.Model; diff --git a/BuildFeed/content/card/Redstone.png b/BuildFeed/content/card/Redstone.png deleted file mode 100644 index 0a116c6..0000000 Binary files a/BuildFeed/content/card/Redstone.png and /dev/null differ diff --git a/BuildFeed/content/card/Redstone2.png b/BuildFeed/content/card/Redstone2.png deleted file mode 100644 index 0a116c6..0000000 Binary files a/BuildFeed/content/card/Redstone2.png and /dev/null differ diff --git a/BuildFeed/content/card/Threshold.png b/BuildFeed/content/card/Threshold.png deleted file mode 100644 index c0729dc..0000000 Binary files a/BuildFeed/content/card/Threshold.png and /dev/null differ diff --git a/BuildFeed/content/card/Threshold2.png b/BuildFeed/content/card/Threshold2.png deleted file mode 100644 index c0729dc..0000000 Binary files a/BuildFeed/content/card/Threshold2.png and /dev/null differ diff --git a/BuildFeed/res/card/Longhorn.png b/BuildFeed/res/card/Longhorn.png new file mode 100644 index 0000000..e3772b7 Binary files /dev/null and b/BuildFeed/res/card/Longhorn.png differ diff --git a/BuildFeed/res/card/Redstone.png b/BuildFeed/res/card/Redstone.png new file mode 100644 index 0000000..4b5bf81 Binary files /dev/null and b/BuildFeed/res/card/Redstone.png differ diff --git a/BuildFeed/res/card/Redstone2.png b/BuildFeed/res/card/Redstone2.png new file mode 100644 index 0000000..4b5bf81 Binary files /dev/null and b/BuildFeed/res/card/Redstone2.png differ diff --git a/BuildFeed/res/card/Threshold.png b/BuildFeed/res/card/Threshold.png new file mode 100644 index 0000000..5665f44 Binary files /dev/null and b/BuildFeed/res/card/Threshold.png differ diff --git a/BuildFeed/res/card/Threshold2.png b/BuildFeed/res/card/Threshold2.png new file mode 100644 index 0000000..5665f44 Binary files /dev/null and b/BuildFeed/res/card/Threshold2.png differ diff --git a/BuildFeed/res/card/Windows7.png b/BuildFeed/res/card/Windows7.png new file mode 100644 index 0000000..fcbb1b1 Binary files /dev/null and b/BuildFeed/res/card/Windows7.png differ diff --git a/BuildFeed/res/card/WindowsVista.png b/BuildFeed/res/card/WindowsVista.png new file mode 100644 index 0000000..dcb0972 Binary files /dev/null and b/BuildFeed/res/card/WindowsVista.png differ diff --git a/BuildFeed/res/css/default.css b/BuildFeed/res/css/default.css index 76c1c35..34e6107 100644 --- a/BuildFeed/res/css/default.css +++ b/BuildFeed/res/css/default.css @@ -179,7 +179,7 @@ article { justify-content: center; margin: 0 -0.75em; } article .build-group-listing .build-group { - width: 180px; + width: 175px; flex-grow: 1; margin: 0 0.75em 1em; box-sizing: border-box; } diff --git a/BuildFeed/res/css/default.min.css b/BuildFeed/res/css/default.min.css index 9fc4bdb..61c3b2b 100644 --- a/BuildFeed/res/css/default.min.css +++ b/BuildFeed/res/css/default.min.css @@ -1 +1 @@ -body{font-family:'Roboto',sans-serif;font-size:10pt;line-height:1.6;margin:0;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}a{text-decoration:none}a:hover,a:active,a:focus{text-decoration:underline}h1{font-size:3em;font-weight:500}p{margin:0 0 1em}table{width:100%;border-collapse:collapse}table th,table td{margin:0;border:0;padding:4px 6px}table thead th{border-bottom:1px solid;text-align:left}.at-share-btn-elements{margin-left:-8px}.at-share-btn-elements>.at_flat_counter{font-size:14px !important;vertical-align:top !important}.at-share-btn-elements>.at-share-btn{margin-left:8px !important}.container{width:1240px;max-width:80%;margin:0 auto;position:relative}.no-wrapping{-ms-text-overflow:ellipsis;-o-text-overflow:ellipsis;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.eager-wrapping{-ms-word-wrap:break-word;word-wrap:break-word}.field-validation-error{display:block;margin:.33333em 0;color:#ff2626}a.button,input[type=submit].button{display:inline-block;vertical-align:middle;padding:.33333em 1em;background-color:#1274b2;color:#fff;text-decoration:none;-moz-border-radius:.16667em;-webkit-border-radius:.16667em;border-radius:.16667em;text-align:center}a.button.edit-button,input[type=submit].button.edit-button{background-color:#ff9f19}a.button.delete-button,input[type=submit].button.delete-button{background-color:#ff2626}a.button.add-button,input[type=submit].button.add-button{background-color:#12b23f}header#page-header h1{font-weight:300;margin:.33em 0}header#page-header h1 a{text-decoration:none}nav#page-navigation #page-navigation-links{margin:0 -15px;padding:0;text-align:right}nav#page-navigation #page-navigation-links>li{display:inline-block;vertical-align:top}nav#page-navigation #page-navigation-links>li>a{display:block;padding:15px}nav#page-navigation #page-navigation-links>li>a:hover,nav#page-navigation #page-navigation-links>li>a:active,nav#page-navigation #page-navigation-links>li>a:focus{text-decoration:none}nav#page-navigation button{display:none;width:100%;border:0;font-size:1.2em;font-weight:300;padding:.66667em 0;background:none}.dropdown-parent .dropdown-menu{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;display:none;position:absolute;left:-15px;right:-15px;max-width:1240px;padding:15px;text-align:left;z-index:10}.dropdown-parent .dropdown-menu h4{margin:0 0 .5em;font-size:1.2em;font-weight:500}.dropdown-parent .dropdown-menu .dropdown-menu-block{float:left;display:inline-block;vertical-align:top}.dropdown-parent .dropdown-menu .dropdown-menu-block ul{padding:0}.dropdown-parent .dropdown-menu .dropdown-menu-block li{list-style-type:none;line-height:2em;float:left;width:20%;min-width:100px;vertical-align:top}.dropdown-parent .dropdown-menu .dropdown-menu-block li>a{display:block;padding:0 1em}.dropdown-parent .dropdown-menu .dropdown-menu-block li>a:hover,.dropdown-parent .dropdown-menu .dropdown-menu-block li>a:active,.dropdown-parent .dropdown-menu .dropdown-menu-block li>a:focus{text-decoration:none}.dropdown-parent .dropdown-menu #settings-theme-menu{width:120px}.dropdown-parent .dropdown-menu #settings-lang-menu{width:calc(100% - 120px)}.dropdown-parent.open .dropdown-menu{display:block}article{padding:2em 0}article h1{font-size:4em;font-weight:300;text-align:center;margin:0 0 .5em}article h1.eager-wrapping{font-size:4em}article h3{font-size:2em;font-weight:bold;margin:.33333em 0 .66667em;text-transform:uppercase;letter-spacing:.25em;border-bottom:1px solid}article h4{margin:1em 0 0}article .build-group-listing{display:flex;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap;justify-content:center;margin:0 -.75em}article .build-group-listing .build-group{width:180px;flex-grow:1;margin:0 .75em 1em;box-sizing:border-box}article .build-group-listing .build-group h3{font-size:1.75em;font-weight:300;padding:0;margin:0 0 .4em;letter-spacing:-.05em;border-bottom:0;text-transform:lowercase;text-align:left}article .build-group-listing .build-group p{font-size:1.1em;font-weight:300;margin:0 0 .66667em}article .build-group-listing .build-group-empty{width:180px;flex-grow:1;margin:0 .75em;box-sizing:border-box}.latest-flex{display:flex;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap;justify-content:space-between;margin:2em -2em 0 0}.latest-flex .latest-flex-item{width:240px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;background:#fff;flex-grow:1;margin:0 2em 2em 0}.latest-flex .latest-flex-item:hover,.latest-flex .latest-flex-item:active,.latest-flex .latest-flex-item:focus{text-decoration:none}.latest-flex .latest-flex-item h3.latest-flex-title{border-bottom:0;margin:0;padding:0;font-size:1.25em;font-weight:normal;text-align:center;padding:.4em .5em;margin:-1px;color:#fff}.latest-flex .latest-flex-item.latest-flex-red{border:.16667em solid #ff2626}.latest-flex .latest-flex-item.latest-flex-red h3.latest-flex-title{background:#ff2626}.latest-flex .latest-flex-item.latest-flex-yellow{border:.16667em solid #ff9f19}.latest-flex .latest-flex-item.latest-flex-yellow h3.latest-flex-title{background:#ff9f19}.latest-flex .latest-flex-item.latest-flex-green{border:.16667em solid #12b23f}.latest-flex .latest-flex-item.latest-flex-green h3.latest-flex-title{background:#12b23f}.latest-flex .latest-flex-item .latest-flex-detail{color:#373736;text-align:center;font-weight:300}.latest-flex .latest-flex-item .latest-flex-detail .latest-flex-build{font-size:2.33333em;margin:.33333em 0 .16667em}.latest-flex .latest-flex-item .latest-flex-detail .latest-flex-lab{font-size:1.5em;margin:0 0 .5em}.latest-flex .latest-flex-item .latest-flex-detail .latest-flex-time{margin:0 0 .75em}.latest-full{display:block;background:#1274b2;font-weight:normal;text-align:center;color:#fff;margin:0 0 2em;padding:.66667em}.latest-full:hover,.latest-full:active,.latest-full:focus{text-decoration:none}.build-details-flex{display:flex;font-size:1.1em;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap}.build-details-flex .build-details-flex-item{flex-grow:1;margin-bottom:1.5em;width:160px}.build-details-flex .build-details-flex-item label{font-weight:bold;display:inline-block;vertical-align:top;margin-right:1em;min-width:100px}.build-details-flex .build-details-flex-item .build-details-flex-value{display:inline-block;vertical-align:top;margin-right:20px}.form-group{margin-bottom:1.5em}.form-group>label{width:20%;text-align:right;font-weight:bold;margin-right:1em;display:inline-block;vertical-align:top;margin-top:.25em}.form-group>div{margin-left:calc(20% + 1em);width:30%;display:inline-block;vertical-align:top}.form-group>div input,.form-group>div textarea,.form-group>div select{width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid;padding:.33333em .5em;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;line-height:1em}.form-group>div input[type=submit],.form-group>div input[type=checkbox]{width:auto}.form-group>div input[type=submit],.form-group>div button{display:inline-block;vertical-align:middle;padding:.33333em 1em;background-color:#12b23f;color:#fff;text-decoration:none;-moz-border-radius:.16667em;-webkit-border-radius:.16667em;border-radius:.16667em;border:0;line-height:1.6}.form-group>div.wide-group{width:40%}.form-group>div.wide-group>.trumbowyg-box{width:100%;margin:0}.form-group>label+div{margin-left:0}.credits-wrapper{display:flex;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap}.credits-wrapper .credits-list{width:480px;max-width:100%;flex-grow:1}.credits-list dt{font-weight:bold}.credits-list dd{margin-left:0}.credits-list dd+dt{margin-top:1.5em}ul.pagination{text-align:center;margin:0 0 1em;padding:0;display:flex;justify-content:center}ul.pagination>li{list-style:none;width:1.5em;line-height:1.5em;margin:0 .25em}ul.pagination>li>a,ul.pagination>li>span{display:block;border-radius:.5em}ul.pagination>li>span{cursor:not-allowed}footer#page-footer{padding:1.33333em 0 .66667em;font-size:.85em}footer#page-footer .footer-flex{display:flex;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap}footer#page-footer .footer-flex .footer-flex-item{width:50%;min-width:200px;text-align:center;flex-grow:1}footer#page-footer .footer-flex .footer-flex-item:last-child{text-align:right}footer#page-footer .footer-flex .footer-flex-item:first-child{text-align:left}footer#page-footer p{margin:0 0 .4em}#modal-search-overlay{display:none;position:fixed;top:0;bottom:0;left:0;right:0;-moz-transition:background-color linear .6s,-webkit-backdrop-filter linear .6s,backdrop-filter linear .6s;-o-transition:background-color linear .6s,-webkit-backdrop-filter linear .6s,backdrop-filter linear .6s;-webkit-transition:background-color linear .6s,-webkit-backdrop-filter linear .6s,backdrop-filter linear .6s;transition:background-color linear .6s,-webkit-backdrop-filter linear .6s,backdrop-filter linear .6s;background-color:transparent;-webkit-backdrop-filter:blur(0);backdrop-filter:blur(0);z-index:100}#modal-search-overlay.open{display:block;background-color:rgba(0,0,0,.6);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}#modal-search-overlay #modal-search{position:absolute;top:15%;left:25%;width:50%;max-height:70%;overflow:auto;padding:2em;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #ccc}#modal-search-overlay #modal-search h3{margin:0 0 1em;font-size:1.5em;font-weight:300}#modal-search-overlay #modal-search>#modal-search-box{width:100%}#modal-search-overlay #modal-search>#modal-search-box>*{display:inline-block;height:2.5em;padding:.5em;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid}#modal-search-overlay #modal-search>#modal-search-box>#modal-search-input{width:calc(100% - 3.33333em)}#modal-search-overlay #modal-search>#modal-search-box>#modal-search-button{width:2.66667em}#modal-search-overlay #modal-search>#modal-search-result{display:flex;flex-wrap:wrap;justify-content:space-between}#modal-search-overlay #modal-search>#modal-search-result>.search-result-item{display:block;padding:0 1em;width:140px;flex-grow:1}#modal-search-overlay #modal-search>#modal-search-result>.search-result-item>.search-result-heading{font-size:1.2em;margin-bottom:0}@media(max-width:980px){#modal-search-overlay #modal-search{left:10%;width:80%}}@media(max-width:640px){header#page-header h1{text-align:center}nav#page-navigation button{display:block}nav#page-navigation #page-navigation-links{display:none}nav#page-navigation #page-navigation-links.open{display:block}nav#page-navigation #page-navigation-links>li{display:block;text-align:left}article h1,article h1.eager-wrapping{font-size:3em;line-height:1.33333}article h3{text-align:center}article .addthis_sharing_toolbox{text-align:center}footer#page-footer .footer-flex .footer-flex-item:first-child{text-align:center;margin-bottom:1.5em}footer#page-footer .footer-flex .footer-flex-item:last-child{text-align:center}} \ No newline at end of file +body{font-family:'Roboto',sans-serif;font-size:10pt;line-height:1.6;margin:0;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}a{text-decoration:none}a:hover,a:active,a:focus{text-decoration:underline}h1{font-size:3em;font-weight:500}p{margin:0 0 1em}table{width:100%;border-collapse:collapse}table th,table td{margin:0;border:0;padding:4px 6px}table thead th{border-bottom:1px solid;text-align:left}.at-share-btn-elements{margin-left:-8px}.at-share-btn-elements>.at_flat_counter{font-size:14px !important;vertical-align:top !important}.at-share-btn-elements>.at-share-btn{margin-left:8px !important}.container{width:1240px;max-width:80%;margin:0 auto;position:relative}.no-wrapping{-ms-text-overflow:ellipsis;-o-text-overflow:ellipsis;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.eager-wrapping{-ms-word-wrap:break-word;word-wrap:break-word}.field-validation-error{display:block;margin:.33333em 0;color:#ff2626}a.button,input[type=submit].button{display:inline-block;vertical-align:middle;padding:.33333em 1em;background-color:#1274b2;color:#fff;text-decoration:none;-moz-border-radius:.16667em;-webkit-border-radius:.16667em;border-radius:.16667em;text-align:center}a.button.edit-button,input[type=submit].button.edit-button{background-color:#ff9f19}a.button.delete-button,input[type=submit].button.delete-button{background-color:#ff2626}a.button.add-button,input[type=submit].button.add-button{background-color:#12b23f}header#page-header h1{font-weight:300;margin:.33em 0}header#page-header h1 a{text-decoration:none}nav#page-navigation #page-navigation-links{margin:0 -15px;padding:0;text-align:right}nav#page-navigation #page-navigation-links>li{display:inline-block;vertical-align:top}nav#page-navigation #page-navigation-links>li>a{display:block;padding:15px}nav#page-navigation #page-navigation-links>li>a:hover,nav#page-navigation #page-navigation-links>li>a:active,nav#page-navigation #page-navigation-links>li>a:focus{text-decoration:none}nav#page-navigation button{display:none;width:100%;border:0;font-size:1.2em;font-weight:300;padding:.66667em 0;background:none}.dropdown-parent .dropdown-menu{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;display:none;position:absolute;left:-15px;right:-15px;max-width:1240px;padding:15px;text-align:left;z-index:10}.dropdown-parent .dropdown-menu h4{margin:0 0 .5em;font-size:1.2em;font-weight:500}.dropdown-parent .dropdown-menu .dropdown-menu-block{float:left;display:inline-block;vertical-align:top}.dropdown-parent .dropdown-menu .dropdown-menu-block ul{padding:0}.dropdown-parent .dropdown-menu .dropdown-menu-block li{list-style-type:none;line-height:2em;float:left;width:20%;min-width:100px;vertical-align:top}.dropdown-parent .dropdown-menu .dropdown-menu-block li>a{display:block;padding:0 1em}.dropdown-parent .dropdown-menu .dropdown-menu-block li>a:hover,.dropdown-parent .dropdown-menu .dropdown-menu-block li>a:active,.dropdown-parent .dropdown-menu .dropdown-menu-block li>a:focus{text-decoration:none}.dropdown-parent .dropdown-menu #settings-theme-menu{width:120px}.dropdown-parent .dropdown-menu #settings-lang-menu{width:calc(100% - 120px)}.dropdown-parent.open .dropdown-menu{display:block}article{padding:2em 0}article h1{font-size:4em;font-weight:300;text-align:center;margin:0 0 .5em}article h1.eager-wrapping{font-size:4em}article h3{font-size:2em;font-weight:bold;margin:.33333em 0 .66667em;text-transform:uppercase;letter-spacing:.25em;border-bottom:1px solid}article h4{margin:1em 0 0}article .build-group-listing{display:flex;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap;justify-content:center;margin:0 -.75em}article .build-group-listing .build-group{width:175px;flex-grow:1;margin:0 .75em 1em;box-sizing:border-box}article .build-group-listing .build-group h3{font-size:1.75em;font-weight:300;padding:0;margin:0 0 .4em;letter-spacing:-.05em;border-bottom:0;text-transform:lowercase;text-align:left}article .build-group-listing .build-group p{font-size:1.1em;font-weight:300;margin:0 0 .66667em}article .build-group-listing .build-group-empty{width:180px;flex-grow:1;margin:0 .75em;box-sizing:border-box}.latest-flex{display:flex;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap;justify-content:space-between;margin:2em -2em 0 0}.latest-flex .latest-flex-item{width:240px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;background:#fff;flex-grow:1;margin:0 2em 2em 0}.latest-flex .latest-flex-item:hover,.latest-flex .latest-flex-item:active,.latest-flex .latest-flex-item:focus{text-decoration:none}.latest-flex .latest-flex-item h3.latest-flex-title{border-bottom:0;margin:0;padding:0;font-size:1.25em;font-weight:normal;text-align:center;padding:.4em .5em;margin:-1px;color:#fff}.latest-flex .latest-flex-item.latest-flex-red{border:.16667em solid #ff2626}.latest-flex .latest-flex-item.latest-flex-red h3.latest-flex-title{background:#ff2626}.latest-flex .latest-flex-item.latest-flex-yellow{border:.16667em solid #ff9f19}.latest-flex .latest-flex-item.latest-flex-yellow h3.latest-flex-title{background:#ff9f19}.latest-flex .latest-flex-item.latest-flex-green{border:.16667em solid #12b23f}.latest-flex .latest-flex-item.latest-flex-green h3.latest-flex-title{background:#12b23f}.latest-flex .latest-flex-item .latest-flex-detail{color:#373736;text-align:center;font-weight:300}.latest-flex .latest-flex-item .latest-flex-detail .latest-flex-build{font-size:2.33333em;margin:.33333em 0 .16667em}.latest-flex .latest-flex-item .latest-flex-detail .latest-flex-lab{font-size:1.5em;margin:0 0 .5em}.latest-flex .latest-flex-item .latest-flex-detail .latest-flex-time{margin:0 0 .75em}.latest-full{display:block;background:#1274b2;font-weight:normal;text-align:center;color:#fff;margin:0 0 2em;padding:.66667em}.latest-full:hover,.latest-full:active,.latest-full:focus{text-decoration:none}.build-details-flex{display:flex;font-size:1.1em;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap}.build-details-flex .build-details-flex-item{flex-grow:1;margin-bottom:1.5em;width:160px}.build-details-flex .build-details-flex-item label{font-weight:bold;display:inline-block;vertical-align:top;margin-right:1em;min-width:100px}.build-details-flex .build-details-flex-item .build-details-flex-value{display:inline-block;vertical-align:top;margin-right:20px}.form-group{margin-bottom:1.5em}.form-group>label{width:20%;text-align:right;font-weight:bold;margin-right:1em;display:inline-block;vertical-align:top;margin-top:.25em}.form-group>div{margin-left:calc(20% + 1em);width:30%;display:inline-block;vertical-align:top}.form-group>div input,.form-group>div textarea,.form-group>div select{width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid;padding:.33333em .5em;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;line-height:1em}.form-group>div input[type=submit],.form-group>div input[type=checkbox]{width:auto}.form-group>div input[type=submit],.form-group>div button{display:inline-block;vertical-align:middle;padding:.33333em 1em;background-color:#12b23f;color:#fff;text-decoration:none;-moz-border-radius:.16667em;-webkit-border-radius:.16667em;border-radius:.16667em;border:0;line-height:1.6}.form-group>div.wide-group{width:40%}.form-group>div.wide-group>.trumbowyg-box{width:100%;margin:0}.form-group>label+div{margin-left:0}.credits-wrapper{display:flex;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap}.credits-wrapper .credits-list{width:480px;max-width:100%;flex-grow:1}.credits-list dt{font-weight:bold}.credits-list dd{margin-left:0}.credits-list dd+dt{margin-top:1.5em}ul.pagination{text-align:center;margin:0 0 1em;padding:0;display:flex;justify-content:center}ul.pagination>li{list-style:none;width:1.5em;line-height:1.5em;margin:0 .25em}ul.pagination>li>a,ul.pagination>li>span{display:block;border-radius:.5em}ul.pagination>li>span{cursor:not-allowed}footer#page-footer{padding:1.33333em 0 .66667em;font-size:.85em}footer#page-footer .footer-flex{display:flex;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap}footer#page-footer .footer-flex .footer-flex-item{width:50%;min-width:200px;text-align:center;flex-grow:1}footer#page-footer .footer-flex .footer-flex-item:last-child{text-align:right}footer#page-footer .footer-flex .footer-flex-item:first-child{text-align:left}footer#page-footer p{margin:0 0 .4em}#modal-search-overlay{display:none;position:fixed;top:0;bottom:0;left:0;right:0;-moz-transition:background-color linear .6s,-webkit-backdrop-filter linear .6s,backdrop-filter linear .6s;-o-transition:background-color linear .6s,-webkit-backdrop-filter linear .6s,backdrop-filter linear .6s;-webkit-transition:background-color linear .6s,-webkit-backdrop-filter linear .6s,backdrop-filter linear .6s;transition:background-color linear .6s,-webkit-backdrop-filter linear .6s,backdrop-filter linear .6s;background-color:transparent;-webkit-backdrop-filter:blur(0);backdrop-filter:blur(0);z-index:100}#modal-search-overlay.open{display:block;background-color:rgba(0,0,0,.6);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}#modal-search-overlay #modal-search{position:absolute;top:15%;left:25%;width:50%;max-height:70%;overflow:auto;padding:2em;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #ccc}#modal-search-overlay #modal-search h3{margin:0 0 1em;font-size:1.5em;font-weight:300}#modal-search-overlay #modal-search>#modal-search-box{width:100%}#modal-search-overlay #modal-search>#modal-search-box>*{display:inline-block;height:2.5em;padding:.5em;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid}#modal-search-overlay #modal-search>#modal-search-box>#modal-search-input{width:calc(100% - 3.33333em)}#modal-search-overlay #modal-search>#modal-search-box>#modal-search-button{width:2.66667em}#modal-search-overlay #modal-search>#modal-search-result{display:flex;flex-wrap:wrap;justify-content:space-between}#modal-search-overlay #modal-search>#modal-search-result>.search-result-item{display:block;padding:0 1em;width:140px;flex-grow:1}#modal-search-overlay #modal-search>#modal-search-result>.search-result-item>.search-result-heading{font-size:1.2em;margin-bottom:0}@media(max-width:980px){#modal-search-overlay #modal-search{left:10%;width:80%}}@media(max-width:640px){header#page-header h1{text-align:center}nav#page-navigation button{display:block}nav#page-navigation #page-navigation-links{display:none}nav#page-navigation #page-navigation-links.open{display:block}nav#page-navigation #page-navigation-links>li{display:block;text-align:left}article h1,article h1.eager-wrapping{font-size:3em;line-height:1.33333}article h3{text-align:center}article .addthis_sharing_toolbox{text-align:center}footer#page-footer .footer-flex .footer-flex-item:first-child{text-align:center;margin-bottom:1.5em}footer#page-footer .footer-flex .footer-flex-item:last-child{text-align:center}} \ No newline at end of file diff --git a/BuildFeed/res/css/default.scss b/BuildFeed/res/css/default.scss index 0618fda..3309462 100644 --- a/BuildFeed/res/css/default.scss +++ b/BuildFeed/res/css/default.scss @@ -304,7 +304,7 @@ article .build-group { - width: 180px; + width: 175px; flex-grow: 1; margin: 0 0.75em 1em; box-sizing: border-box; diff --git a/Resources/Card Backgrounds/Longhorn.psd b/Resources/Card Backgrounds/Longhorn.psd new file mode 100644 index 0000000..c57a249 Binary files /dev/null and b/Resources/Card Backgrounds/Longhorn.psd differ diff --git a/Resources/Card Backgrounds/Redstone.psd b/Resources/Card Backgrounds/Redstone.psd new file mode 100644 index 0000000..7922212 Binary files /dev/null and b/Resources/Card Backgrounds/Redstone.psd differ diff --git a/Resources/Card Backgrounds/Threshold.psd b/Resources/Card Backgrounds/Threshold.psd new file mode 100644 index 0000000..3c9a675 Binary files /dev/null and b/Resources/Card Backgrounds/Threshold.psd differ diff --git a/Resources/Card Backgrounds/Windows7.psd b/Resources/Card Backgrounds/Windows7.psd new file mode 100644 index 0000000..af94007 Binary files /dev/null and b/Resources/Card Backgrounds/Windows7.psd differ diff --git a/Resources/Card Backgrounds/WindowsVista.psd b/Resources/Card Backgrounds/WindowsVista.psd new file mode 100644 index 0000000..3039575 Binary files /dev/null and b/Resources/Card Backgrounds/WindowsVista.psd differ