├── .gitignore ├── CleanBlog.Core ├── Application │ └── CustomGlobal.cs ├── CleanBlog.Core.csproj ├── CleanBlog.Core.csproj.user ├── Composing │ ├── ApplicationComposer.cs │ ├── RegisterServicesComposer.cs │ └── TreeNodeRenderingComposer.cs ├── Controllers │ └── ContactSurfaceController.cs ├── Extensions │ └── HtmlExtensions.cs ├── Helpers │ └── QueryStringHelper.cs ├── Properties │ └── AssemblyInfo.cs ├── Services │ ├── ArticleService.cs │ ├── IArticleService.cs │ ├── ISmtpService.cs │ └── SmtpService.cs ├── ViewModels │ ├── ArticleResultSet.cs │ └── ContactViewModel.cs ├── ViewPages │ └── CleanBlogViewPage.cs ├── app.config └── packages.config ├── CleanBlog.Web.sln ├── CleanBlog.Web ├── App_Plugins │ └── ModelsBuilder │ │ ├── modelsbuilder.controller.js │ │ ├── modelsbuilder.html │ │ ├── modelsbuilder.resource.js │ │ └── package.manifest ├── CleanBlog.Web.csproj ├── CleanBlog.Web.csproj.user ├── Global.asax ├── IIS-Builder.ps1 ├── Media │ ├── 4yzfz3us │ │ └── mikhail-vasilyev-nodtncsldte-unsplash.jpg │ └── Web.config ├── Properties │ └── AssemblyInfo.cs ├── Views │ ├── Partials │ │ ├── Contact │ │ │ ├── contactForm.cshtml │ │ │ └── result.cshtml │ │ ├── Grid │ │ │ ├── Bootstrap3-Fluid.cshtml │ │ │ ├── Bootstrap3.cshtml │ │ │ ├── Clean.cshtml │ │ │ └── Editors │ │ │ │ ├── Base.cshtml │ │ │ │ ├── Embed.cshtml │ │ │ │ ├── Macro.cshtml │ │ │ │ ├── Media.cshtml │ │ │ │ ├── Rte.cshtml │ │ │ │ └── Textstring.cshtml │ │ ├── footer.cshtml │ │ ├── latestArticles.cshtml │ │ ├── navigation.cshtml │ │ └── pageHeader.cshtml │ ├── Redirect.cshtml │ ├── Web.config │ ├── article.cshtml │ ├── articleList.cshtml │ ├── contact.cshtml │ ├── content.cshtml │ ├── error.cshtml │ ├── home.cshtml │ ├── master.cshtml │ ├── search.cshtml │ └── xMLSitemap.cshtml ├── Web.Debug.config ├── Web.Release.config ├── Web.config ├── about.html ├── config │ ├── BackOfficeTours │ │ └── getting-started.json │ ├── ClientDependency.config │ ├── HealthChecks.config │ ├── Lang │ │ ├── cs-CZ.user.xml │ │ ├── da-DK.user.xml │ │ ├── de-DE.user.xml │ │ ├── en-GB.user.xml │ │ ├── en-US.user.xml │ │ ├── es-ES.user.xml │ │ ├── fr-FR.user.xml │ │ ├── he-IL.user.xml │ │ ├── it-IT.user.xml │ │ ├── ja-JP.user.xml │ │ ├── ko-KR.user.xml │ │ ├── nb-NO.user.xml │ │ ├── nl-NL.user.xml │ │ ├── pl-PL.user.xml │ │ ├── pt-BR.user.xml │ │ ├── ru-RU.user.xml │ │ ├── sv-SE.user.xml │ │ └── zh-CN.user.xml │ ├── grid.editors.config.js │ ├── imageprocessor │ │ ├── cache.config │ │ ├── processing.config │ │ └── security.config │ ├── logviewer.searches.config.js │ ├── serilog.config │ ├── serilog.user.config │ ├── splashes │ │ └── noNodes.aspx │ ├── tinyMceConfig.config │ └── umbracoSettings.config ├── contact.html ├── css │ ├── clean-blog.css │ └── clean-blog.min.css ├── iis-config.json ├── img │ ├── about-bg.jpg │ ├── contact-bg.jpg │ ├── home-bg.jpg │ ├── post-bg.jpg │ └── post-sample-image.jpg ├── index.html ├── js │ ├── clean-blog.js │ ├── clean-blog.min.js │ ├── contact_me.js │ └── jqBootstrapValidation.js ├── packages.config ├── post.html ├── readme.txt ├── scripts │ ├── contactForm.js │ ├── jquery-1.8.0.intellisense.js │ ├── jquery-1.8.0.js │ ├── jquery-1.8.0.min.js │ ├── jquery.unobtrusive-ajax.js │ ├── jquery.unobtrusive-ajax.min.js │ ├── jquery.validate-vsdoc.js │ ├── jquery.validate.js │ ├── jquery.validate.min.js │ ├── jquery.validate.unobtrusive.js │ ├── jquery.validate.unobtrusive.min.js │ ├── lazysizes.min.js │ ├── ls.unveilhooks.min.js │ └── pleasedontgo.js └── vendor │ ├── bootstrap │ ├── css │ │ ├── bootstrap-grid.css │ │ ├── bootstrap-grid.css.map │ │ ├── bootstrap-grid.min.css │ │ ├── bootstrap-grid.min.css.map │ │ ├── bootstrap-reboot.css │ │ ├── bootstrap-reboot.css.map │ │ ├── bootstrap-reboot.min.css │ │ ├── bootstrap-reboot.min.css.map │ │ ├── bootstrap.css │ │ ├── bootstrap.css.map │ │ ├── bootstrap.min.css │ │ └── bootstrap.min.css.map │ └── js │ │ ├── bootstrap.bundle.js │ │ ├── bootstrap.bundle.js.map │ │ ├── bootstrap.bundle.min.js │ │ ├── bootstrap.bundle.min.js.map │ │ ├── bootstrap.js │ │ ├── bootstrap.js.map │ │ ├── bootstrap.min.js │ │ └── bootstrap.min.js.map │ ├── fontawesome-free │ ├── css │ │ ├── all.css │ │ ├── all.min.css │ │ ├── brands.css │ │ ├── brands.min.css │ │ ├── fontawesome.css │ │ ├── fontawesome.min.css │ │ ├── regular.css │ │ ├── regular.min.css │ │ ├── solid.css │ │ ├── solid.min.css │ │ ├── svg-with-js.css │ │ ├── svg-with-js.min.css │ │ ├── v4-shims.css │ │ └── v4-shims.min.css │ └── webfonts │ │ ├── fa-brands-400.eot │ │ ├── fa-brands-400.svg │ │ ├── fa-brands-400.ttf │ │ ├── fa-brands-400.woff │ │ ├── fa-brands-400.woff2 │ │ ├── fa-regular-400.eot │ │ ├── fa-regular-400.svg │ │ ├── fa-regular-400.ttf │ │ ├── fa-regular-400.woff │ │ ├── fa-regular-400.woff2 │ │ ├── fa-solid-900.eot │ │ ├── fa-solid-900.svg │ │ ├── fa-solid-900.ttf │ │ ├── fa-solid-900.woff │ │ └── fa-solid-900.woff2 │ └── jquery │ ├── jquery.js │ ├── jquery.min.js │ ├── jquery.min.map │ ├── jquery.slim.js │ ├── jquery.slim.min.js │ └── jquery.slim.min.map └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | ################################################################################ 2 | # This .gitignore file was automatically created by Microsoft(R) Visual Studio. 3 | ################################################################################ 4 | 5 | /.vs 6 | /CleanBlog.Web/App_Data 7 | /CleanBlog.Web/bin 8 | /CleanBlog.Web/obj/Debug 9 | /CleanBlog.Web/Umbraco 10 | /packages 11 | /CleanBlog.Core/bin/Debug 12 | /CleanBlog.Core/obj/Debug 13 | -------------------------------------------------------------------------------- /CleanBlog.Core/Application/CustomGlobal.cs: -------------------------------------------------------------------------------- 1 | using SlackBotMessages; 2 | using SlackBotMessages.Models; 3 | using System; 4 | using System.Collections.Generic; 5 | using System.Web; 6 | using System.Web.Configuration; 7 | using Umbraco.Core.Composing; 8 | using Umbraco.Web; 9 | 10 | namespace CleanBlog.Core.Application 11 | { 12 | public class CustomGlobal : UmbracoApplication 13 | { 14 | protected override void OnApplicationError(object sender, EventArgs e) 15 | { 16 | var request = HttpContext.Current.Request; 17 | var error = HttpContext.Current.Server.GetLastError(); 18 | 19 | try 20 | { 21 | var url = request.Url.GetLeftPart(UriPartial.Authority) + request.Url; 22 | var client = new SbmClient(WebConfigurationManager.AppSettings["SlackBotMessagesWebHookUrl"]); 23 | 24 | var message = new Message 25 | { 26 | Username = "Website Robot", 27 | IconEmoji = ":robot_face:", 28 | Attachments = new List() 29 | { 30 | new Attachment() 31 | { 32 | Fallback = error.Message, 33 | Color = "danger", 34 | Fields = new List() 35 | { 36 | new Field() 37 | { 38 | Title = Emoji.Warning + " Error", 39 | Value = error.Message 40 | }, 41 | new Field() 42 | { 43 | Title = "Stack Trace", 44 | Value = error.StackTrace 45 | }, 46 | new Field() 47 | { 48 | Title = "Url", 49 | Value = url 50 | } 51 | } 52 | } 53 | } 54 | }; 55 | 56 | client.Send(message); 57 | } 58 | catch (Exception ex) 59 | { 60 | Current.Logger.Error(typeof(CustomGlobal), ex, "Unable to send slack message to notify unhandled exception"); 61 | } 62 | 63 | } 64 | 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /CleanBlog.Core/CleanBlog.Core.csproj.user: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | ShowAllFiles 5 | 6 | -------------------------------------------------------------------------------- /CleanBlog.Core/Composing/ApplicationComposer.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using SlackBotMessages; 4 | using SlackBotMessages.Models; 5 | using System.Web.Configuration; 6 | using Umbraco.Core.Composing; 7 | using Current = Umbraco.Web.Composing.Current; 8 | 9 | namespace CleanBlog.Core.Composing 10 | { 11 | public class ApplicationComposer : ComponentComposer, IUserComposer 12 | { 13 | } 14 | 15 | public class ApplicationComponent : IComponent 16 | { 17 | public void Initialize() 18 | { 19 | try 20 | { 21 | var client = new SbmClient(WebConfigurationManager.AppSettings["SlackBotMessagesWebHookUrl"]); 22 | 23 | var message = new Message 24 | { 25 | Username = "Website Robot", 26 | IconEmoji = ":robot_face:", 27 | Attachments = new List() 28 | { 29 | new Attachment() 30 | { 31 | Fallback = "Clean Blog Website Started", 32 | Color = "good", 33 | Fields = new List() 34 | { 35 | new Field() 36 | { 37 | Value = "Clean Blog Website Started" 38 | } 39 | } 40 | } 41 | } 42 | }; 43 | 44 | client.Send(message); 45 | } 46 | catch(Exception ex) 47 | { 48 | Current.Logger.Error(typeof(ApplicationComponent), ex, "Unable to send slack message to notify site starting up."); 49 | } 50 | 51 | } 52 | 53 | public void Terminate() 54 | { 55 | 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /CleanBlog.Core/Composing/RegisterServicesComposer.cs: -------------------------------------------------------------------------------- 1 | using CleanBlog.Core.Services; 2 | using Umbraco.Core; 3 | using Umbraco.Core.Composing; 4 | 5 | namespace CleanBlog.Core.Composing 6 | { 7 | public class RegisterServicesComposer : IUserComposer 8 | { 9 | public void Compose(Composition composition) 10 | { 11 | composition.Register(Lifetime.Singleton); 12 | composition.Register(Lifetime.Request); 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /CleanBlog.Core/Composing/TreeNodeRenderingComposer.cs: -------------------------------------------------------------------------------- 1 | using System.Linq; 2 | using Umbraco.Core; 3 | using Umbraco.Core.Composing; 4 | using Umbraco.Core.Services; 5 | using Umbraco.Web.Trees; 6 | 7 | namespace CleanBlog.Core.Composing 8 | { 9 | 10 | [RuntimeLevel(MinLevel = RuntimeLevel.Run)] 11 | public class TreeNodeRenderingComposer : ComponentComposer, IUserComposer 12 | { } 13 | 14 | public class TreeNodeRenderingComponent : IComponent 15 | { 16 | private readonly IContentTypeService _contentTypeService; 17 | 18 | public TreeNodeRenderingComponent(IContentTypeService contentTypeService) 19 | { 20 | _contentTypeService = contentTypeService; 21 | } 22 | 23 | public void Initialize() 24 | { 25 | TreeControllerBase.TreeNodesRendering += TreeControllerBase_TreeNodesRendering; 26 | } 27 | 28 | public void Terminate() 29 | { } 30 | 31 | private void TreeControllerBase_TreeNodesRendering(TreeControllerBase sender, TreeNodesRenderingEventArgs e) 32 | { 33 | if (sender.TreeAlias == "documentTypes") 34 | { 35 | var contentTypes = _contentTypeService.GetAll().ToDictionary(c => c.Id); 36 | foreach (var node in e.Nodes) 37 | { 38 | if (node.NodeType == "documentTypes") 39 | { 40 | if (int.TryParse(node.Id.ToString(), out var nodeId) && nodeId > 0) 41 | { 42 | var contentType = contentTypes[nodeId]; 43 | node.Icon = contentType.Icon; 44 | } 45 | } 46 | } 47 | } 48 | } 49 | } 50 | } -------------------------------------------------------------------------------- /CleanBlog.Core/Controllers/ContactSurfaceController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Net.Mail; 3 | using System.Web; 4 | using Umbraco.Web.Mvc; 5 | using System.Web.Mvc; 6 | using CleanBlog.Core.Services; 7 | using CleanBlog.Core.ViewModels; 8 | using Umbraco.Core.Logging; 9 | using Umbraco.Web; 10 | 11 | namespace CleanBlog.Core.Controllers 12 | { 13 | public class ContactSurfaceController : SurfaceController 14 | { 15 | private readonly ISmtpService _smtpService; 16 | 17 | public ContactSurfaceController(ISmtpService smtpService) 18 | { 19 | _smtpService = smtpService; 20 | } 21 | 22 | [HttpGet] 23 | public ActionResult RenderForm() 24 | { 25 | ContactViewModel model = new ContactViewModel() { ContactFormId = CurrentPage.Id }; 26 | return PartialView("~/Views/Partials/Contact/contactForm.cshtml", model); 27 | } 28 | 29 | [HttpPost] 30 | public ActionResult RenderForm(ContactViewModel model) 31 | { 32 | return PartialView("~/Views/Partials/Contact/contactForm.cshtml", model); 33 | } 34 | 35 | public ActionResult SubmitForm(ContactViewModel model) 36 | { 37 | bool success = false; 38 | 39 | if (ModelState.IsValid) 40 | { 41 | success = _smtpService.SendEmail(model); 42 | } 43 | 44 | var contactPage = UmbracoContext.Content.GetById(false, model.ContactFormId); 45 | 46 | var successMessage = contactPage.Value("successMessage"); 47 | var errorMessage = contactPage.Value("errorMessage"); 48 | 49 | return PartialView("~/Views/Partials/Contact/result.cshtml", success ? successMessage : errorMessage); 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /CleanBlog.Core/Extensions/HtmlExtensions.cs: -------------------------------------------------------------------------------- 1 | using System.Web; 2 | using System.Web.Mvc; 3 | using Umbraco.Core.Models.PublishedContent; 4 | using Umbraco.Web; 5 | 6 | namespace CleanBlog.Core.Extensions 7 | { 8 | public static class HtmlExtensions 9 | { 10 | public static IHtmlString GetGridHtml(this HtmlHelper html, IPublishedContent contentItem, string framework, string propertyAlias, bool fluidImages) 11 | { 12 | if (fluidImages) 13 | { 14 | return html.Raw(html.GetGridHtml(contentItem, framework, propertyAlias).ToString().Replace(" x.ContentType.Alias == "articleList"); 17 | } 18 | 19 | public IEnumerable GetLatestArticles(IPublishedContent siteRoot) 20 | { 21 | var articleList = GetArticleListPage(siteRoot); 22 | var articles = articleList.Descendants().Where(x => x.ContentType.Alias == "article" && x.IsVisible()).OrderByDescending(y => y.Value("articleDate")); 23 | return articles; 24 | } 25 | 26 | public ArticleResultSet GetLatestArticles(IPublishedContent currentContentItem, HttpRequestBase request) 27 | { 28 | var siteRoot = currentContentItem.Root(); 29 | var articleList = GetArticleListPage(siteRoot); 30 | var articles = articleList.Descendants() 31 | .Where(x => x.ContentType.Alias == "article" && x.IsVisible()) 32 | .OrderByDescending(y => y.Value("articleDate")); 33 | 34 | var isArticleListPage = articleList.Id == currentContentItem.Id; 35 | var fallbackPageSize = isArticleListPage ? 10 : 3; 36 | 37 | var pageNumber = QueryStringHelper.GetIntFromQueryString(request, "page", 1); 38 | var pageSize = QueryStringHelper.GetIntFromQueryString(request, "size", fallbackPageSize); 39 | 40 | var hasArticles = articles != null && articles.Any(); 41 | 42 | var pageOfArticles = hasArticles 43 | ? articles.Skip((pageNumber - 1) * pageSize).Take(pageSize).ToList() 44 | : Enumerable.Empty(); 45 | var totalItemCount = hasArticles ? articles.Count() : 0; 46 | var pageCount = totalItemCount > 0 ? Math.Ceiling((double)totalItemCount / pageSize) : 1; 47 | 48 | var resultSet = new ArticleResultSet() 49 | { 50 | PageCount = pageCount, 51 | PageNumber = pageNumber, 52 | PageSize = pageSize, 53 | Results = pageOfArticles, 54 | IsArticleListPage = isArticleListPage, 55 | Url = articleList.Url 56 | }; 57 | 58 | return resultSet; 59 | } 60 | } 61 | } -------------------------------------------------------------------------------- /CleanBlog.Core/Services/IArticleService.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Web; 3 | using CleanBlog.Core.ViewModels; 4 | using Umbraco.Core.Models.PublishedContent; 5 | 6 | namespace CleanBlog.Core.Services 7 | { 8 | public interface IArticleService 9 | { 10 | IPublishedContent GetArticleListPage(IPublishedContent siteRoot); 11 | IEnumerable GetLatestArticles(IPublishedContent siteRoot); 12 | ArticleResultSet GetLatestArticles(IPublishedContent currentContentItem, HttpRequestBase request); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /CleanBlog.Core/Services/ISmtpService.cs: -------------------------------------------------------------------------------- 1 | using CleanBlog.Core.ViewModels; 2 | 3 | namespace CleanBlog.Core.Services 4 | { 5 | public interface ISmtpService 6 | { 7 | bool SendEmail(ContactViewModel model); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /CleanBlog.Core/Services/SmtpService.cs: -------------------------------------------------------------------------------- 1 | using CleanBlog.Core.Controllers; 2 | using CleanBlog.Core.ViewModels; 3 | using System; 4 | using System.Net.Mail; 5 | using Umbraco.Core.Logging; 6 | 7 | namespace CleanBlog.Core.Services 8 | { 9 | public class SmtpService : ISmtpService 10 | { 11 | private readonly ILogger _logger; 12 | 13 | public SmtpService(ILogger logger) 14 | { 15 | _logger = logger; 16 | } 17 | 18 | public bool SendEmail(ContactViewModel model) 19 | { 20 | try 21 | { 22 | MailMessage message = new MailMessage(); 23 | SmtpClient client = new SmtpClient(); 24 | 25 | string toAddress = "to@test.com"; 26 | string fromAddress = "from@test.com"; 27 | message.Subject = $"Enquiry from: {model.Name} - {model.Email}"; 28 | message.Body = model.Message; 29 | message.To.Add(new MailAddress(toAddress, toAddress)); 30 | message.From = new MailAddress(fromAddress, fromAddress); 31 | 32 | client.Send(message); 33 | return true; 34 | } 35 | catch (Exception ex) 36 | { 37 | _logger.Error(typeof(ContactSurfaceController), ex, "Error sending contact form."); 38 | return false; 39 | } 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /CleanBlog.Core/ViewModels/ArticleResultSet.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | using Umbraco.Core.Models.PublishedContent; 7 | 8 | namespace CleanBlog.Core.ViewModels 9 | { 10 | public class ArticleResultSet 11 | { 12 | public IEnumerable Results { get; set; } 13 | public int PageSize { get; set; } 14 | public int PageNumber { get; set; } 15 | public double PageCount { get; set; } 16 | public bool IsArticleListPage { get; set; } 17 | public string Url { get; set; } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /CleanBlog.Core/ViewModels/ContactViewModel.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | 3 | namespace CleanBlog.Core.ViewModels 4 | { 5 | public class ContactViewModel 6 | { 7 | [Required(ErrorMessage = "Please enter your name")] 8 | public string Name { get; set; } 9 | 10 | [Required(ErrorMessage = "Please enter your email address")] 11 | [EmailAddress(ErrorMessage = "You must enter a valid email address")] 12 | public string Email { get; set; } 13 | 14 | [Required(ErrorMessage = "Please enter your message")] 15 | [MaxLength(500, ErrorMessage = "Your message must be no longer than 500 characters")] 16 | public string Message { get; set; } 17 | 18 | public int ContactFormId { get; set; } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /CleanBlog.Core/ViewPages/CleanBlogViewPage.cs: -------------------------------------------------------------------------------- 1 | using CleanBlog.Core.Services; 2 | using Umbraco.Core; 3 | using Umbraco.Core.Cache; 4 | using Umbraco.Core.Services; 5 | using Umbraco.Web.Mvc; 6 | using Current = Umbraco.Web.Composing.Current; 7 | 8 | namespace CleanBlog.Core.ViewPages 9 | { 10 | public abstract class CleanBlogViewPage : UmbracoViewPage 11 | { 12 | public readonly IArticleService ArticleService; 13 | 14 | public CleanBlogViewPage() : this( 15 | Current.Factory.GetInstance(), 16 | Current.Factory.GetInstance(), 17 | Current.Factory.GetInstance() 18 | ) 19 | { 20 | } 21 | public CleanBlogViewPage(IArticleService articleService, ServiceContext services, AppCaches appCaches) 22 | { 23 | ArticleService = articleService; 24 | Services = services; 25 | AppCaches = appCaches; 26 | } 27 | } 28 | 29 | public abstract class CleanBlogViewPage : UmbracoViewPage 30 | { 31 | public readonly IArticleService ArticleService; 32 | public CleanBlogViewPage() : this( 33 | Current.Factory.GetInstance(), 34 | Current.Factory.GetInstance(), 35 | Current.Factory.GetInstance() 36 | ) 37 | { } 38 | 39 | public CleanBlogViewPage(IArticleService articleService, ServiceContext services, AppCaches appCaches) 40 | { 41 | ArticleService = articleService; 42 | Services = services; 43 | AppCaches = appCaches; 44 | } 45 | } 46 | } -------------------------------------------------------------------------------- /CleanBlog.Core/app.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /CleanBlog.Core/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /CleanBlog.Web.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 15 4 | VisualStudioVersion = 15.0.28307.168 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CleanBlog.Web", "CleanBlog.Web\CleanBlog.Web.csproj", "{781623CE-C6E6-499E-A237-68B28B53CC0E}" 7 | EndProject 8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CleanBlog.Core", "CleanBlog.Core\CleanBlog.Core.csproj", "{E508AD0F-0E2A-4DDE-B0E7-213FF9D8E78E}" 9 | EndProject 10 | Global 11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 12 | Debug|Any CPU = Debug|Any CPU 13 | Release|Any CPU = Release|Any CPU 14 | EndGlobalSection 15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 16 | {781623CE-C6E6-499E-A237-68B28B53CC0E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 17 | {781623CE-C6E6-499E-A237-68B28B53CC0E}.Debug|Any CPU.Build.0 = Debug|Any CPU 18 | {781623CE-C6E6-499E-A237-68B28B53CC0E}.Release|Any CPU.ActiveCfg = Release|Any CPU 19 | {781623CE-C6E6-499E-A237-68B28B53CC0E}.Release|Any CPU.Build.0 = Release|Any CPU 20 | {E508AD0F-0E2A-4DDE-B0E7-213FF9D8E78E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 21 | {E508AD0F-0E2A-4DDE-B0E7-213FF9D8E78E}.Debug|Any CPU.Build.0 = Debug|Any CPU 22 | {E508AD0F-0E2A-4DDE-B0E7-213FF9D8E78E}.Release|Any CPU.ActiveCfg = Release|Any CPU 23 | {E508AD0F-0E2A-4DDE-B0E7-213FF9D8E78E}.Release|Any CPU.Build.0 = Release|Any CPU 24 | EndGlobalSection 25 | GlobalSection(SolutionProperties) = preSolution 26 | HideSolutionNode = FALSE 27 | EndGlobalSection 28 | GlobalSection(ExtensibilityGlobals) = postSolution 29 | SolutionGuid = {56CBF4B2-BAC5-43D6-90DE-0F8936E4CBEC} 30 | EndGlobalSection 31 | EndGlobal 32 | -------------------------------------------------------------------------------- /CleanBlog.Web/App_Plugins/ModelsBuilder/modelsbuilder.controller.js: -------------------------------------------------------------------------------- 1 | function modelsBuilderController($scope, $http, umbRequestHelper, modelsBuilderResource) { 2 | 3 | var vm = this; 4 | 5 | vm.reload = reload; 6 | vm.generate = generate; 7 | vm.dashboard = null; 8 | 9 | function generate() { 10 | vm.generating = true; 11 | umbRequestHelper.resourcePromise( 12 | $http.post(umbRequestHelper.getApiUrl("modelsBuilderBaseUrl", "BuildModels")), 13 | 'Failed to generate.') 14 | .then(function (result) { 15 | vm.generating = false; 16 | vm.dashboard = result; 17 | }); 18 | } 19 | 20 | function reload() { 21 | vm.loading = true; 22 | modelsBuilderResource.getDashboard().then(function (result) { 23 | vm.dashboard = result; 24 | vm.loading = false; 25 | }); 26 | } 27 | 28 | function init() { 29 | vm.loading = true; 30 | modelsBuilderResource.getDashboard().then(function (result) { 31 | vm.dashboard = result; 32 | vm.loading = false; 33 | }); 34 | } 35 | 36 | init(); 37 | } 38 | angular.module("umbraco").controller("Umbraco.Dashboard.ModelsBuilderController", modelsBuilderController); -------------------------------------------------------------------------------- /CleanBlog.Web/App_Plugins/ModelsBuilder/modelsbuilder.html: -------------------------------------------------------------------------------- 1 | 
2 | 3 | 4 | 5 | 6 |
7 | 8 |
9 | 10 |

Models Builder

11 | 12 | 13 | 14 |
15 |
16 | 17 |
18 |

Models are out-of-date.

19 |
20 | 21 |
22 |
23 |

Generating models will restart the application.

24 |
25 |
26 | 29 |
30 |
31 |
32 |
33 |
34 | 35 |
36 | Last generation failed with the following error: 37 |
{{vm.dashboard.lastError}}
38 |
39 |
40 | 41 |
42 |
43 | 44 |
45 | -------------------------------------------------------------------------------- /CleanBlog.Web/App_Plugins/ModelsBuilder/modelsbuilder.resource.js: -------------------------------------------------------------------------------- 1 | function modelsBuilderResource($q, $http, umbRequestHelper) { 2 | 3 | return { 4 | getModelsOutOfDateStatus: function () { 5 | return umbRequestHelper.resourcePromise( 6 | $http.get(umbRequestHelper.getApiUrl("modelsBuilderBaseUrl", "GetModelsOutOfDateStatus")), 7 | "Failed to get models out-of-date status"); 8 | }, 9 | 10 | buildModels: function () { 11 | return umbRequestHelper.resourcePromise( 12 | $http.post(umbRequestHelper.getApiUrl("modelsBuilderBaseUrl", "BuildModels")), 13 | "Failed to build models"); 14 | }, 15 | 16 | getDashboard: function () { 17 | return umbRequestHelper.resourcePromise( 18 | $http.get(umbRequestHelper.getApiUrl("modelsBuilderBaseUrl", "GetDashboard")), 19 | "Failed to get dashboard"); 20 | } 21 | }; 22 | } 23 | angular.module("umbraco.resources").factory("modelsBuilderResource", modelsBuilderResource); 24 | -------------------------------------------------------------------------------- /CleanBlog.Web/App_Plugins/ModelsBuilder/package.manifest: -------------------------------------------------------------------------------- 1 | { 2 | // array of files we want to inject into the application 3 | "javascript": [ 4 | "~/App_Plugins/ModelsBuilder/modelsbuilder.controller.js", 5 | "~/App_Plugins/ModelsBuilder/modelsbuilder.resource.js" 6 | ], 7 | 8 | // models builder dashboard 9 | "dashboards": [ 10 | { 11 | "alias": "settingsModelsBuilder", 12 | "name": "Models Builder", 13 | "view": "/App_Plugins/ModelsBuilder/modelsbuilder.html", 14 | "sections": [ "settings" ], 15 | "weight": 40 16 | } 17 | ] 18 | } -------------------------------------------------------------------------------- /CleanBlog.Web/CleanBlog.Web.csproj.user: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | true 5 | 6 | 7 | 8 | 9 | 10 | 11 | Debug|Any CPU 12 | ShowAllFiles 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | CurrentPage 21 | True 22 | False 23 | False 24 | False 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | True 34 | True 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /CleanBlog.Web/Global.asax: -------------------------------------------------------------------------------- 1 | <%@ Application Inherits="CleanBlog.Core.Application.CustomGlobal" Language="C#" %> 2 | -------------------------------------------------------------------------------- /CleanBlog.Web/IIS-Builder.ps1: -------------------------------------------------------------------------------- 1 | # Ensure our script is elevated to Admin permissions 2 | If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) 3 | 4 | { 5 | $arguments = "-noexit & '" + $myinvocation.mycommand.definition + "'" 6 | Start-Process powershell -Verb runAs -ArgumentList $arguments 7 | Break 8 | } 9 | 10 | Import-Module WebAdministration 11 | $scriptpath = $MyInvocation.MyCommand.Path 12 | $dir = Split-Path $scriptpath 13 | # Grab the json config file 14 | $iisconfig = Get-Content "$dir\iis-config.json" | Out-String | ConvertFrom-Json 15 | $iisAppPoolName = $iisconfig."IIS-Site-Name" 16 | $iisAppPoolDotNetVersion = $iisconfig."IIS-App-Pool-Dot-Net-Version" 17 | $iisAppName = $iisconfig."App-Pool-Name" 18 | $siteBinding = $iisconfig."bindings" 19 | $hostsPath = "C:\Windows\System32\drivers\etc\hosts" 20 | 21 | # Known limitations: 22 | # - does not handle entries with comments afterwards (" # comment") 23 | # https://stackoverflow.com/questions/2602460/powershell-to-manipulate-host-file 24 | # 25 | function add-host([string]$filename, [string]$ip, [string]$hostname) { 26 | remove-host $filename $hostname 27 | $ip + "`t`t" + $hostname | Out-File -encoding ASCII -append $filename 28 | } 29 | 30 | function remove-host([string]$filename, [string]$hostname) { 31 | $c = Get-Content $filename 32 | $newLines = @() 33 | 34 | foreach ($line in $c) { 35 | $bits = [regex]::Split($line, "\t+") 36 | if ($bits.count -eq 2) { 37 | if ($bits[1] -ne $hostname) { 38 | $newLines += $line 39 | } 40 | } else { 41 | $newLines += $line 42 | } 43 | } 44 | 45 | # Write file 46 | Clear-Content $filename 47 | foreach ($line in $newLines) { 48 | $line | Out-File -encoding ASCII -append $filename 49 | } 50 | } 51 | 52 | #verify the site exists before progressing 53 | 54 | if(Get-Website -Name "$iisAppName"){ 55 | #Add bindings to hosts file 56 | foreach ($binding in $siteBinding){ 57 | #Look for .localtest.me domain 58 | #if the domain is .localtest.me don't create a entry in the hosts file 59 | if(-Not ($binding -Match"https://") -or -Not ($binding -Match"http://")){ 60 | $binding = "https://$binding" 61 | } 62 | 63 | #Enable me if you would like the browser to automatically open when the script is ran 64 | #Start-Process $binding 65 | } 66 | exit 67 | } 68 | 69 | #navigate to the app pools root 70 | Set-Location IIS:\AppPools\ 71 | 72 | #check if the app pool exists 73 | if (!(Test-Path $iisAppPoolName -pathType container)) 74 | { 75 | #create the app pool 76 | $appPool = New-Item $iisAppPoolName 77 | $appPool | Set-ItemProperty -Name "managedRuntimeVersion" -Value $iisAppPoolDotNetVersion 78 | } 79 | 80 | #navigate to the sites root 81 | Set-Location IIS:\Sites\ 82 | 83 | #check if the site exists 84 | if (Test-Path $iisAppName -pathType container) 85 | { 86 | return 87 | } 88 | 89 | 90 | # create array with http bindings 91 | $IISBindingArr = @() 92 | 93 | foreach ($binding in $siteBinding){ 94 | $IISBindingArr+= @{protocol="http";bindingInformation=":80:" + $binding} 95 | } 96 | #create the site and assign http bindings 97 | $iisApp = New-Item $iisAppName -bindings $IISBindingArr -physicalPath $dir 98 | $iisApp | Set-ItemProperty -Name "applicationPool" -Value $iisAppPoolName 99 | 100 | # Assign certificates to https bindings 101 | foreach ($binding in $siteBinding){ 102 | #create a https binding 103 | if(!(Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object {$_.Subject -eq "CN=$binding"})){ 104 | New-SelfSignedCertificate -DnsName "$binding" -CertStoreLocation "cert:\LocalMachine\My" 105 | } 106 | New-WebBinding -Name $iisAppName -Protocol "https" -Port 443 -IPAddress * -HostHeader $binding -SslFlags 1 107 | 108 | 109 | $Thumbprint = (Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object {$_.Subject -eq "CN=$binding"}).Thumbprint; 110 | $cert = ( Get-ChildItem -Path "cert:\LocalMachine\My\$Thumbprint" ) 111 | 112 | #Check if certificate already exisits in trusted certificates 113 | if(!(Get-ChildItem -Path Cert:\LocalMachine\Root | Where-Object {$_.Thumbprint -eq $Thumbprint})){ 114 | $DestStore = new-object System.Security.Cryptography.X509Certificates.X509Store( 115 | [System.Security.Cryptography.X509Certificates.StoreName]::Root,"localmachine" 116 | ) 117 | 118 | 119 | $DestStore.Open([System.Security.Cryptography.X509Certificates.OpenFlags]::ReadWrite) 120 | $DestStore.Add($cert) 121 | $DestStore.Close() 122 | } 123 | 124 | 125 | 126 | #Using netsh to assign the ssl certs to the binding. powershell cmdlets seem to add certificates to all https bindings in the web site, not ideal 127 | Invoke-Expression "netsh http add sslcert hostnameport=$($binding):$(443) certhash=$Thumbprint appid='{4dc3e181-e14b-4a21-b022-59fc669b0914}' certstorename=MY" 128 | } 129 | #Assign Umbraco IIS permissions to parent folder 130 | Write-Host $dir 131 | $Acl = Get-Acl $dir 132 | $Ar = New-Object system.security.accesscontrol.filesystemaccessrule("IUSR","Modify", "ContainerInherit, ObjectInherit", "None", "Allow") 133 | $Acl.SetAccessRule($Ar) 134 | Set-Acl -Path $dir -AclObject $Acl 135 | 136 | $Ar = New-Object system.security.accesscontrol.filesystemaccessrule("IIS_IUSRS","Modify", "ContainerInherit, ObjectInherit", "None", "Allow") 137 | $Acl.SetAccessRule($Ar) 138 | Set-Acl -Path $dir -AclObject $Acl 139 | 140 | $iisAppPoolName = "IIS apppool\$iisAppPoolName" 141 | $Ar = New-Object system.security.accesscontrol.filesystemaccessrule($iisAppPoolName,"Modify", "ContainerInherit, ObjectInherit", "None", "Allow") 142 | $Acl.SetAccessRule($Ar) 143 | Set-Acl -Path $dir -AclObject $Acl 144 | 145 | #Add bindings to hosts file 146 | foreach ($binding in $siteBinding){ 147 | #Look for .localtest.me domain 148 | #if the domain is .localtest.me don't create a entry in the hosts file 149 | if(-Not ($binding -Match"localtest.me")){ 150 | add-host $hostsPath "127.0.0.1" $binding 151 | } 152 | if(-Not ($binding -Match"https://") -or -Not ($binding -Match"http://")){ 153 | $binding = "https://$binding" 154 | } 155 | 156 | #Enable me if you would like the browser to automatically open when the script is ran 157 | #Start-Process $binding 158 | } -------------------------------------------------------------------------------- /CleanBlog.Web/Media/4yzfz3us/mikhail-vasilyev-nodtncsldte-unsplash.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prjseal/Umbraco-v8-Tutorial/59ce1f5ad963aeb896f87e3a933d751c42639f9a/CleanBlog.Web/Media/4yzfz3us/mikhail-vasilyev-nodtncsldte-unsplash.jpg -------------------------------------------------------------------------------- /CleanBlog.Web/Media/Web.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /CleanBlog.Web/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("CleanBlog.Web")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("CleanBlog.Web")] 13 | [assembly: AssemblyCopyright("Copyright © 2019")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("781623ce-c6e6-499e-a237-68b28b53cc0e")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Revision and Build Numbers 33 | // by using the '*' as shown below: 34 | [assembly: AssemblyVersion("1.0.0.0")] 35 | [assembly: AssemblyFileVersion("1.0.0.0")] 36 | -------------------------------------------------------------------------------- /CleanBlog.Web/Views/Partials/Contact/contactForm.cshtml: -------------------------------------------------------------------------------- 1 | @inherits UmbracoViewPage 2 | 3 | @using CleanBlog.Core.ViewModels 4 | @using CleanBlog.Core.Controllers 5 | 6 |
7 | @using (Ajax.BeginForm("SubmitForm", "ContactSurface", new AjaxOptions() 8 | { 9 | UpdateTargetId = "form-result", 10 | HttpMethod = "POST", 11 | InsertionMode = InsertionMode.Replace, 12 | OnSuccess = "contactForm.showResult", 13 | OnFailure = "contactForm.showResult" 14 | }, new { id = "contact-form" })) 15 | { 16 | @Html.HiddenFor(m => m.ContactFormId) 17 | 18 |
19 |
20 | 21 | @Html.TextBoxFor(m => m.Name, new { @class="form-control", placeholder = Umbraco.GetDictionaryValue("Contact.Name") + "..." }) 22 | @Html.ValidationMessageFor(m => m.Name) 23 |
24 |
25 |
26 |
27 | 28 | @Html.TextBoxFor(m => m.Email, new { @class = "form-control", placeholder = Umbraco.GetDictionaryValue("Contact.Email") + "..." }) 29 | @Html.ValidationMessageFor(m => m.Email) 30 |
31 |
32 |
33 |
34 | 35 | @Html.TextAreaFor(m => m.Message, new { @class = "form-control", placeholder = Umbraco.GetDictionaryValue("Contact.Message") + "...", rows = "6" }) 36 | @Html.ValidationMessageFor(m => m.Message) 37 |
38 |
39 |
40 |
41 | 42 |
43 | } 44 |
45 |
-------------------------------------------------------------------------------- /CleanBlog.Web/Views/Partials/Contact/result.cshtml: -------------------------------------------------------------------------------- 1 | @model IHtmlString 2 | 3 | @Model -------------------------------------------------------------------------------- /CleanBlog.Web/Views/Partials/Grid/Bootstrap3-Fluid.cshtml: -------------------------------------------------------------------------------- 1 | @inherits UmbracoViewPage 2 | @using Umbraco.Web.Templates 3 | @using Newtonsoft.Json.Linq 4 | 5 | @* 6 | Razor helpers located at the bottom of this file 7 | *@ 8 | 9 | @if (Model != null && Model.sections != null) 10 | { 11 | var oneColumn = ((System.Collections.ICollection)Model.sections).Count == 1; 12 | 13 |
14 | @if (oneColumn) 15 | { 16 | foreach (var section in Model.sections) { 17 |
18 | @foreach (var row in section.rows) { 19 | @renderRow(row); 20 | } 21 |
22 | } 23 | }else { 24 |
25 | @foreach (var s in Model.sections) { 26 |
27 |
28 | @foreach (var row in s.rows) { 29 | @renderRow(row); 30 | } 31 |
32 |
33 | } 34 |
35 | } 36 |
37 | } 38 | 39 | @helper renderRow(dynamic row){ 40 |
41 |
42 | @foreach ( var area in row.areas ) { 43 |
44 |
45 | @foreach (var control in area.controls) { 46 | if (control !=null && control.editor != null && control.editor.view != null ) { 47 | @Html.Partial("grid/editors/base", (object)control) 48 | } 49 | } 50 |
51 |
} 52 |
53 |
54 | } 55 | 56 | @functions { 57 | public static MvcHtmlString RenderElementAttributes(dynamic contentItem) 58 | { 59 | var attrs = new List(); 60 | JObject cfg = contentItem.config; 61 | 62 | if(cfg != null) 63 | foreach (JProperty property in cfg.Properties()) 64 | { 65 | var propertyValue = HttpUtility.HtmlAttributeEncode(property.Value.ToString()); 66 | attrs.Add(property.Name + "=\"" + propertyValue + "\""); 67 | } 68 | 69 | JObject style = contentItem.styles; 70 | 71 | if (style != null) { 72 | var cssVals = new List(); 73 | foreach (JProperty property in style.Properties()) 74 | { 75 | var propertyValue = property.Value.ToString(); 76 | if (string.IsNullOrWhiteSpace(propertyValue) == false) 77 | { 78 | cssVals.Add(property.Name + ":" + propertyValue + ";"); 79 | } 80 | } 81 | 82 | if (cssVals.Any()) 83 | attrs.Add("style='" + HttpUtility.HtmlAttributeEncode(string.Join(" ", cssVals)) + "'"); 84 | } 85 | 86 | return new MvcHtmlString(string.Join(" ", attrs)); 87 | } 88 | } -------------------------------------------------------------------------------- /CleanBlog.Web/Views/Partials/Grid/Bootstrap3.cshtml: -------------------------------------------------------------------------------- 1 | @inherits UmbracoViewPage 2 | @using Umbraco.Web.Templates 3 | @using Newtonsoft.Json.Linq 4 | 5 | @if (Model != null && Model.sections != null) 6 | { 7 | var oneColumn = ((System.Collections.ICollection)Model.sections).Count == 1; 8 | 9 |
10 | @if (oneColumn) 11 | { 12 | foreach (var section in Model.sections) { 13 |
14 | @foreach (var row in section.rows) { 15 | @renderRow(row, true); 16 | } 17 |
18 | } 19 | }else { 20 |
21 |
22 | @foreach (var s in Model.sections) { 23 |
24 |
25 | @foreach (var row in s.rows) { 26 | @renderRow(row, false); 27 | } 28 |
29 |
30 | } 31 |
32 |
33 | } 34 |
35 | } 36 | 37 | @helper renderRow(dynamic row, bool singleColumn){ 38 |
39 | @Html.If(singleColumn, "
") 40 |
41 | @foreach ( var area in row.areas ) { 42 |
43 |
44 | @foreach (var control in area.controls) { 45 | if (control !=null && control.editor != null && control.editor.view != null ) { 46 | @Html.Partial("grid/editors/base", (object)control) 47 | } 48 | } 49 |
50 |
} 51 |
52 | @Html.If(singleColumn, "
") 53 |
54 | } 55 | 56 | @functions { 57 | public static MvcHtmlString RenderElementAttributes(dynamic contentItem) 58 | { 59 | var attrs = new List(); 60 | JObject cfg = contentItem.config; 61 | 62 | if(cfg != null) 63 | foreach (JProperty property in cfg.Properties()) 64 | { 65 | var propertyValue = HttpUtility.HtmlAttributeEncode(property.Value.ToString()); 66 | attrs.Add(property.Name + "=\"" + propertyValue + "\""); 67 | } 68 | 69 | JObject style = contentItem.styles; 70 | 71 | if (style != null) { 72 | var cssVals = new List(); 73 | foreach (JProperty property in style.Properties()) 74 | { 75 | var propertyValue = property.Value.ToString(); 76 | if (string.IsNullOrWhiteSpace(propertyValue) == false) 77 | { 78 | cssVals.Add(property.Name + ":" + propertyValue + ";"); 79 | } 80 | } 81 | 82 | if (cssVals.Any()) 83 | attrs.Add("style=\"" + HttpUtility.HtmlAttributeEncode(string.Join(" ", cssVals)) + "\""); 84 | } 85 | 86 | return new MvcHtmlString(string.Join(" ", attrs)); 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /CleanBlog.Web/Views/Partials/Grid/Clean.cshtml: -------------------------------------------------------------------------------- 1 | @inherits UmbracoViewPage 2 | @using Umbraco.Web.Templates 3 | @using Newtonsoft.Json.Linq 4 | 5 | @if (Model != null && Model.sections != null) 6 | { 7 |
8 | @foreach (var section in Model.sections) 9 | { 10 |
11 |
12 |
13 |
14 | @foreach (var row in section.rows) 15 | { 16 | @renderRow(row); 17 | } 18 |
19 |
20 |
21 |
22 | } 23 |
24 | } 25 | 26 | @helper renderRow(dynamic row) 27 | { 28 |
29 |
30 | @foreach (var area in row.areas) 31 | { 32 |
33 |
34 | @foreach (var control in area.controls) 35 | { 36 | if (control != null && control.editor != null && control.editor.view != null) 37 | { 38 | @Html.Partial("grid/editors/base", (object)control) 39 | } 40 | } 41 |
42 |
} 43 |
44 |
45 | } 46 | 47 | @functions { 48 | public static MvcHtmlString RenderElementAttributes(dynamic contentItem) 49 | { 50 | var attrs = new List(); 51 | JObject cfg = contentItem.config; 52 | 53 | if (cfg != null) 54 | foreach (JProperty property in cfg.Properties()) 55 | { 56 | var propertyValue = HttpUtility.HtmlAttributeEncode(property.Value.ToString()); 57 | attrs.Add(property.Name + "=\"" + propertyValue + "\""); 58 | } 59 | 60 | JObject style = contentItem.styles; 61 | 62 | if (style != null) 63 | { 64 | var cssVals = new List(); 65 | foreach (JProperty property in style.Properties()) 66 | { 67 | var propertyValue = property.Value.ToString(); 68 | if (string.IsNullOrWhiteSpace(propertyValue) == false) 69 | { 70 | cssVals.Add(property.Name + ":" + propertyValue + ";"); 71 | } 72 | } 73 | 74 | if (cssVals.Any()) 75 | attrs.Add("style=\"" + HttpUtility.HtmlAttributeEncode(string.Join(" ", cssVals)) + "\""); 76 | } 77 | 78 | return new MvcHtmlString(string.Join(" ", attrs)); 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /CleanBlog.Web/Views/Partials/Grid/Editors/Base.cshtml: -------------------------------------------------------------------------------- 1 | @model dynamic 2 | @using Umbraco.Web.Templates 3 | 4 | @functions { 5 | public static string EditorView(dynamic contentItem) 6 | { 7 | string view = contentItem.editor.render != null ? contentItem.editor.render.ToString() : contentItem.editor.view.ToString(); 8 | view = view.ToLower().Replace(".html", ".cshtml"); 9 | 10 | if (!view.Contains("/")) { 11 | view = "grid/editors/" + view; 12 | } 13 | 14 | return view; 15 | } 16 | } 17 | @try 18 | { 19 | string editor = EditorView(Model); 20 | @Html.Partial(editor, (object)Model) 21 | } 22 | catch (Exception ex) { 23 |
@ex.ToString()
24 | } -------------------------------------------------------------------------------- /CleanBlog.Web/Views/Partials/Grid/Editors/Embed.cshtml: -------------------------------------------------------------------------------- 1 | @model dynamic 2 | @using Umbraco.Web.Templates 3 | 4 | 5 |
6 | @Html.Raw(Model.value) 7 |
8 | -------------------------------------------------------------------------------- /CleanBlog.Web/Views/Partials/Grid/Editors/Macro.cshtml: -------------------------------------------------------------------------------- 1 | @inherits UmbracoViewPage 2 | @using Umbraco.Web.Templates 3 | 4 | 5 | @if (Model.value != null) 6 | { 7 | string macroAlias = Model.value.macroAlias.ToString(); 8 | ViewDataDictionary parameters = new ViewDataDictionary(); 9 | foreach (dynamic mpd in Model.value.macroParamsDictionary) 10 | { 11 | parameters.Add(mpd.Name, mpd.Value); 12 | } 13 | 14 | 15 | @Umbraco.RenderMacro(macroAlias, parameters) 16 | 17 | } 18 | -------------------------------------------------------------------------------- /CleanBlog.Web/Views/Partials/Grid/Editors/Media.cshtml: -------------------------------------------------------------------------------- 1 | @model dynamic 2 | @using Umbraco.Web.Templates 3 | 4 | @if (Model.value != null) 5 | { 6 | var url = Model.value.image; 7 | if(Model.editor.config != null && Model.editor.config.size != null){ 8 | url += "?width=" + Model.editor.config.size.width; 9 | url += "&height=" + Model.editor.config.size.height; 10 | 11 | if(Model.value.focalPoint != null){ 12 | url += "¢er=" + Model.value.focalPoint.top +"," + Model.value.focalPoint.left; 13 | url += "&mode=crop"; 14 | } 15 | } 16 | 17 | var altText = Model.value.altText ?? Model.value.caption ?? string.Empty; 18 | 19 | @altText 20 | 21 | if (Model.value.caption != null) 22 | { 23 |

@Model.value.caption

24 | } 25 | } 26 | -------------------------------------------------------------------------------- /CleanBlog.Web/Views/Partials/Grid/Editors/Rte.cshtml: -------------------------------------------------------------------------------- 1 | @model dynamic 2 | @using Umbraco.Web.Composing 3 | @using Umbraco.Web.Templates 4 | 5 | @Html.Raw(TemplateUtilities.ParseInternalLinks(Model.value.ToString(), Current.UmbracoContext.UrlProvider)) 6 | -------------------------------------------------------------------------------- /CleanBlog.Web/Views/Partials/Grid/Editors/Textstring.cshtml: -------------------------------------------------------------------------------- 1 | @model dynamic 2 | @using Umbraco.Web.Composing 3 | @using Umbraco.Web.Templates 4 | 5 | @if (Model.editor.config.markup != null) 6 | { 7 | string markup = Model.editor.config.markup.ToString(); 8 | markup = markup.Replace("#value#", Html.ReplaceLineBreaksForHtml(HttpUtility.HtmlEncode((string)Model.value.ToString())).ToString()); 9 | 10 | if (Model.editor.config.style != null) 11 | { 12 | markup = markup.Replace("#style#", Model.editor.config.style.ToString()); 13 | } 14 | 15 | 16 | @Html.Raw(markup) 17 | 18 | } 19 | else 20 | { 21 | 22 |
@Model.value
23 |
24 | } 25 | -------------------------------------------------------------------------------- /CleanBlog.Web/Views/Partials/footer.cshtml: -------------------------------------------------------------------------------- 1 | @using Umbraco.Web.Models 2 | @inherits UmbracoViewPage 3 | 4 | @{ 5 | var homePage = Model.AncestorOrSelf(); 6 | var socialLinks = homePage.Value>("socialLinks"); 7 | } 8 | 9 |
10 | 11 |
12 |
13 |
14 |
15 | @if (socialLinks != null && socialLinks.Any()) 16 | { 17 |
    18 | @foreach (var item in socialLinks) 19 | { 20 | var link = item.Value("link"); 21 | var iconClass = item.Value("iconClass"); 22 |
  • 23 | 24 | 25 | 26 | 27 | 28 | 29 |
  • 30 | } 31 |
32 | } 33 | 34 |
35 |
36 |
37 |
-------------------------------------------------------------------------------- /CleanBlog.Web/Views/Partials/latestArticles.cshtml: -------------------------------------------------------------------------------- 1 | @inherits CleanBlogViewPage 2 | 3 | @using CleanBlog.Core.ViewPages 4 | @using System.Linq; 5 | 6 | @{ 7 | var resultSet = ArticleService.GetLatestArticles(Model, Request); 8 | } 9 | 10 | @if (resultSet?.Results != null && resultSet.Results.Any()) 11 | { 12 | var articles = resultSet.Results.Cast
(); 13 |
14 |
15 |
16 | @foreach (var article in articles) 17 | { 18 |
19 | 20 |

21 | @(!string.IsNullOrWhiteSpace(article.Title) ? article.Title : article.Name) 22 |

23 | @if (!string.IsNullOrWhiteSpace(article.Subtitle)) 24 | { 25 |

26 | @article.Subtitle 27 |

28 | } 29 |
30 | 38 |
39 |
40 | } 41 | 42 |
43 | @if (resultSet.IsArticleListPage) 44 | { 45 | if (resultSet.PageCount > 1) 46 | { 47 |
48 | @if (resultSet.PageNumber > 1) 49 | { 50 | @Umbraco.GetDictionaryValue("Blog.Prev") 51 | } 52 | else 53 | { 54 | @Html.Raw(" ") 55 | } 56 |
57 |
58 | Page @resultSet.PageNumber of @resultSet.PageCount 59 |
60 |
61 | @if (resultSet.PageNumber < resultSet.PageCount) 62 | { 63 | @Umbraco.GetDictionaryValue("Blog.Next") 64 | } 65 | else 66 | { 67 | @Html.Raw(" ") 68 | } 69 |
70 | 71 | } 72 | } 73 | else 74 | { 75 | @Umbraco.GetDictionaryValue("Blog.ViewAll") 76 | } 77 |
78 |
79 |
80 |
81 | } -------------------------------------------------------------------------------- /CleanBlog.Web/Views/Partials/navigation.cshtml: -------------------------------------------------------------------------------- 1 | @inherits UmbracoViewPage 2 | 3 | @{ 4 | var homePage = Model.AncestorOrSelf(); 5 | var navItems = homePage.Children.Where(x => x.IsVisible()); 6 | } 7 | 8 | 9 | -------------------------------------------------------------------------------- /CleanBlog.Web/Views/Partials/pageHeader.cshtml: -------------------------------------------------------------------------------- 1 | @inherits UmbracoViewPage 2 | 3 | @{ 4 | var title = Model.HasValue("title") ? Model.Value("title") : Model.Name; 5 | var subtitle = Model.HasValue("subtitle") ? Model.Value("subtitle") : ""; 6 | var image = Model.Value("mainImage", fallback: Fallback.ToAncestors); 7 | 8 | string smallImageUrl = ""; 9 | string imageUrl = ""; 10 | if (image != null) 11 | { 12 | smallImageUrl = image.GetCropUrl("PageHeader.Tiny"); 13 | imageUrl = image.GetCropUrl("PageHeader.Large"); 14 | } 15 | 16 | var authorName = Model.HasProperty("authorName") && Model.HasValue("authorName") ? Model.Value("authorName") : ""; 17 | DateTime articleDate = Model.HasProperty("articleDate") && Model.HasValue("articleDate") ? Model.Value("articleDate") : DateTime.MinValue; 18 | 19 | bool hasAuthorDetails = !string.IsNullOrWhiteSpace(authorName) || articleDate != DateTime.MinValue; 20 | } 21 | 22 | 23 |
24 |
25 |
26 |
27 |
28 |
29 |

@title

30 | @if (!string.IsNullOrWhiteSpace(subtitle)) 31 | { 32 | if (hasAuthorDetails) 33 | { 34 |

@subtitle

35 | } 36 | else 37 | { 38 | @subtitle 39 | } 40 | } 41 | 42 | @if (hasAuthorDetails) 43 | { 44 | 45 | Posted 46 | @if (!string.IsNullOrWhiteSpace(authorName)) 47 | { 48 | @Html.Raw("by ") @authorName 49 | } 50 | on @articleDate.ToString("MMMM dd, yyyy") 51 | 52 | } 53 |
54 |
55 |
56 |
57 |
-------------------------------------------------------------------------------- /CleanBlog.Web/Views/Redirect.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 | @using ContentModels = Umbraco.Web.PublishedModels; 3 | @{ 4 | Layout = null; 5 | 6 | if (Model.IsTemporaryRedirect) 7 | { 8 | Response.Redirect(Model.Link.Url); 9 | } 10 | else 11 | { 12 | Response.RedirectPermanent(Model.Link.Url); 13 | } 14 | } -------------------------------------------------------------------------------- /CleanBlog.Web/Views/Web.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 |
6 |
7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 64 | 65 | 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /CleanBlog.Web/Views/article.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 | 3 | @using CleanBlog.Core.Extensions 4 | 5 | @{ 6 | Layout = "master.cshtml"; 7 | } 8 | 9 | @Html.Partial("~/Views/Partials/pageHeader.cshtml") 10 | 11 | 12 |
13 | @Html.GetGridHtml(Model, "mainContent", "Clean", true) 14 |
-------------------------------------------------------------------------------- /CleanBlog.Web/Views/articleList.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 | 3 | @{ 4 | Layout = "master.cshtml"; 5 | } 6 | 7 | @Html.Partial("~/Views/Partials/pageHeader.cshtml") 8 | 9 | @Html.Partial("~/Views/Partials/latestArticles.cshtml") -------------------------------------------------------------------------------- /CleanBlog.Web/Views/contact.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 | 3 | @using ClientDependency.Core.Mvc 4 | 5 | @{ 6 | Layout = "master.cshtml"; 7 | 8 | Html.EnableClientValidation(); 9 | Html.EnableUnobtrusiveJavaScript(); 10 | 11 | Html.RequiresJs("https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"); 12 | Html.RequiresJs("https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"); 13 | Html.RequiresJs("/scripts/jquery.validate.min.js"); 14 | Html.RequiresJs("/scripts/jquery.validate.unobtrusive.min.js"); 15 | Html.RequiresJs("/scripts/jquery.unobtrusive-ajax.min.js"); 16 | Html.RequiresJs("/scripts/contactForm.js"); 17 | } 18 | 19 | @Html.Partial("~/Views/Partials/pageHeader.cshtml") 20 | 21 |
22 |
23 |
24 | @{ Html.RenderAction("RenderForm", "ContactSurface"); } 25 |
26 |
27 |
-------------------------------------------------------------------------------- /CleanBlog.Web/Views/content.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 | 3 | @using CleanBlog.Core.Extensions 4 | 5 | @{ 6 | Layout = "master.cshtml"; 7 | } 8 | 9 | @Html.Partial("~/Views/Partials/pageHeader.cshtml") 10 | 11 | 12 |
13 | @Html.GetGridHtml(Model, "mainContent","Clean", true) 14 |
-------------------------------------------------------------------------------- /CleanBlog.Web/Views/error.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 | 3 | @using CleanBlog.Core.Extensions 4 | 5 | @{ 6 | Layout = "master.cshtml"; 7 | } 8 | 9 | @Html.Partial("~/Views/Partials/pageHeader.cshtml") 10 | 11 | 12 |
13 | @Html.GetGridHtml(Model, "mainContent", "Clean", true) 14 |
-------------------------------------------------------------------------------- /CleanBlog.Web/Views/home.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 | 3 | @{ 4 | Layout = "master.cshtml"; 5 | var leaveMessage = Model.LeaveMessage; 6 | } 7 | 8 | @Html.Partial("~/Views/Partials/pageHeader.cshtml") 9 | 10 | @Html.CachedPartial("~/Views/Partials/latestArticles.cshtml", Model, 3600, true) 11 | 12 | @section ScriptsBottom 13 | { 14 | 19 | } 20 | -------------------------------------------------------------------------------- /CleanBlog.Web/Views/master.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 | 3 | @using ClientDependency.Core.Mvc 4 | @using Our.Umbraco.EditLink 5 | 6 | @{ 7 | Layout = null; 8 | 9 | Html.RequiresCss("/vendor/bootstrap/css/bootstrap.min.css"); 10 | Html.RequiresCss("/vendor/fontawesome-free/css/all.min.css"); 11 | Html.RequiresCss("https://fonts.googleapis.com/css?family=Lora:400,700,400italic,700italic"); 12 | Html.RequiresCss("https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800"); 13 | Html.RequiresCss("/css/clean-blog.min.css"); 14 | 15 | Html.RequiresJs("/scripts/lazysizes.min.js", new {async = "async"}); 16 | Html.RequiresJs("/scripts/ls.unveilhooks.min.js", new { async = "async" }); 17 | Html.RequiresJs("/vendor/jquery/jquery.min.js"); 18 | Html.RequiresJs("/vendor/bootstrap/js/bootstrap.bundle.min.js"); 19 | Html.RequiresJs("/js/clean-blog.min.js"); 20 | Html.RequiresJs("/scripts/pleasedontgo.js"); 21 | } 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | Clean Blog - Start Bootstrap Theme 31 | 32 | @Html.RenderCssHere() 33 | 34 | 35 | @Html.RenderEditLink(Model) 36 | @Html.CachedPartial("~/Views/Partials/navigation.cshtml", Model, 3600, false) 37 | 38 | @RenderBody() 39 | @Html.Partial("~/Views/Partials/footer.cshtml") 40 | @Html.RenderJsHere() 41 | @RenderSection("ScriptsBottom", false) 42 | 43 | -------------------------------------------------------------------------------- /CleanBlog.Web/Views/search.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 | 3 | @{ 4 | Layout = "master.cshtml"; 5 | var searchQuery = Request.QueryString["q"]; 6 | } 7 | 8 | @Html.Partial("~/Views/Partials/pageHeader.cshtml") 9 | 10 |
11 | 63 |
-------------------------------------------------------------------------------- /CleanBlog.Web/Views/xMLSitemap.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 | @{ 3 | Layout = null; 4 | } 5 | 6 | @* the fun starts here *@ 7 | 8 | -------------------------------------------------------------------------------- /CleanBlog.Web/Web.Debug.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 17 | 18 | 29 | 30 | -------------------------------------------------------------------------------- /CleanBlog.Web/Web.Release.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 17 | 18 | 19 | 30 | 31 | -------------------------------------------------------------------------------- /CleanBlog.Web/about.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | Clean Blog - Start Bootstrap Theme 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 54 | 55 | 56 |
57 |
58 |
59 |
60 |
61 |
62 |

About Me

63 | This is what I do. 64 |
65 |
66 |
67 |
68 |
69 | 70 | 71 |
72 |
73 |
74 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Saepe nostrum ullam eveniet pariatur voluptates odit, fuga atque ea nobis sit soluta odio, adipisci quas excepturi maxime quae totam ducimus consectetur?

75 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eius praesentium recusandae illo eaque architecto error, repellendus iusto reprehenderit, doloribus, minus sunt. Numquam at quae voluptatum in officia voluptas voluptatibus, minus!

76 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aut consequuntur magnam, excepturi aliquid ex itaque esse est vero natus quae optio aperiam soluta voluptatibus corporis atque iste neque sit tempora!

77 |
78 |
79 |
80 | 81 |
82 | 83 | 84 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | -------------------------------------------------------------------------------- /CleanBlog.Web/config/ClientDependency.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 13 | 14 | 15 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 45 | 46 | 47 | 56 | 57 | 58 | 59 | 60 | 63 | 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /CleanBlog.Web/config/HealthChecks.config: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /CleanBlog.Web/config/Lang/cs-CZ.user.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | -------------------------------------------------------------------------------- /CleanBlog.Web/config/Lang/da-DK.user.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /CleanBlog.Web/config/Lang/de-DE.user.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /CleanBlog.Web/config/Lang/en-GB.user.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /CleanBlog.Web/config/Lang/en-US.user.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /CleanBlog.Web/config/Lang/es-ES.user.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /CleanBlog.Web/config/Lang/fr-FR.user.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /CleanBlog.Web/config/Lang/he-IL.user.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | -------------------------------------------------------------------------------- /CleanBlog.Web/config/Lang/it-IT.user.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | -------------------------------------------------------------------------------- /CleanBlog.Web/config/Lang/ja-JP.user.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /CleanBlog.Web/config/Lang/ko-KR.user.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | -------------------------------------------------------------------------------- /CleanBlog.Web/config/Lang/nb-NO.user.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | -------------------------------------------------------------------------------- /CleanBlog.Web/config/Lang/nl-NL.user.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /CleanBlog.Web/config/Lang/pl-PL.user.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | -------------------------------------------------------------------------------- /CleanBlog.Web/config/Lang/pt-BR.user.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | -------------------------------------------------------------------------------- /CleanBlog.Web/config/Lang/ru-RU.user.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /CleanBlog.Web/config/Lang/sv-SE.user.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | -------------------------------------------------------------------------------- /CleanBlog.Web/config/Lang/zh-CN.user.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /CleanBlog.Web/config/grid.editors.config.js: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "Rich text editor", 4 | "alias": "rte", 5 | "view": "rte", 6 | "icon": "icon-article" 7 | }, 8 | { 9 | "name": "Image", 10 | "alias": "media", 11 | "view": "media", 12 | "icon": "icon-picture" 13 | }, 14 | { 15 | "name": "Macro", 16 | "alias": "macro", 17 | "view": "macro", 18 | "icon": "icon-settings-alt" 19 | }, 20 | { 21 | "name": "Embed", 22 | "alias": "embed", 23 | "view": "embed", 24 | "icon": "icon-movie-alt" 25 | }, 26 | { 27 | "name": "Headline", 28 | "alias": "headline", 29 | "view": "textstring", 30 | "icon": "icon-coin", 31 | "config": { 32 | "style": "font-size: 36px; line-height: 45px; font-weight: bold", 33 | "markup": "

#value#

" 34 | } 35 | }, 36 | { 37 | "name": "Quote", 38 | "alias": "quote", 39 | "view": "textstring", 40 | "icon": "icon-quote", 41 | "config": { 42 | "style": "border-left: 3px solid #ccc; padding: 10px; color: #ccc; font-family: serif; font-style: italic; font-size: 18px", 43 | "markup": "
#value#
" 44 | } 45 | } 46 | ] -------------------------------------------------------------------------------- /CleanBlog.Web/config/imageprocessor/cache.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /CleanBlog.Web/config/imageprocessor/processing.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /CleanBlog.Web/config/imageprocessor/security.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /CleanBlog.Web/config/logviewer.searches.config.js: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "Find all logs where the Level is NOT Verbose and NOT Debug", 4 | "query": "Not(@Level='Verbose') and Not(@Level='Debug')" 5 | }, 6 | { 7 | "name": "Find all logs that has an exception property (Warning, Error & Critical with Exceptions)", 8 | "query": "Has(@Exception)" 9 | }, 10 | { 11 | "name": "Find all logs that have the property 'Duration'", 12 | "query": "Has(Duration)" 13 | }, 14 | { 15 | "name": "Find all logs that have the property 'Duration' and the duration is greater than 1000ms", 16 | "query": "Has(Duration) and Duration > 1000" 17 | }, 18 | { 19 | "name": "Find all logs that are from the namespace 'Umbraco.Core'", 20 | "query": "StartsWith(SourceContext, 'Umbraco.Core')" 21 | }, 22 | { 23 | "name": "Find all logs that use a specific log message template", 24 | "query": "@MessageTemplate = '[Timing {TimingId}] {EndMessage} ({TimingDuration}ms)'" 25 | }, 26 | { 27 | "name": "Find logs where one of the items in the SortedComponentTypes property array is equal to", 28 | "query": "SortedComponentTypes[?] = 'Umbraco.Web.Search.ExamineComponent'" 29 | }, 30 | { 31 | "name": "Find logs where one of the items in the SortedComponentTypes property array contains", 32 | "query": "Contains(SortedComponentTypes[?], 'DatabaseServer')" 33 | }, 34 | { 35 | "name": "Find all logs that the message has localhost in it with SQL like", 36 | "query": "@Message like '%localhost%'" 37 | }, 38 | { 39 | "name": "Find all logs that the message that starts with 'end' in it with SQL like", 40 | "query": "@Message like 'end%'" 41 | } 42 | ] 43 | -------------------------------------------------------------------------------- /CleanBlog.Web/config/serilog.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /CleanBlog.Web/config/serilog.user.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 15 | 16 | 17 | 20 | 21 | 22 | 28 | 29 | 30 | 31 | 32 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /CleanBlog.Web/config/splashes/noNodes.aspx: -------------------------------------------------------------------------------- 1 | <%@ Page Language="C#" AutoEventWireup="True" Inherits="Umbraco.Web.UI.Config.Splashes.NoNodes" CodeBehind="NoNodes.aspx.cs" %> 2 | <%@ Import Namespace="Umbraco.Core.Configuration" %> 3 | <%@ Import Namespace="Umbraco.Core.IO" %> 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 |
26 |
27 | 28 | 29 |

Welcome to your Umbraco installation

30 |

You're seeing this wonderful page because your website doesn't contain any published content yet.

31 | 32 |
33 | Open Umbraco 34 |
35 | 36 | 37 |
38 |
39 |

Easy start with Umbraco.tv

40 |

We have created a bunch of 'how-to' videos, to get you easily started with Umbraco. Learn how to build projects in just a couple of minutes. Easiest CMS in the world.

41 | 42 | Umbraco.tv → 43 |
44 | 45 |
46 |

Be a part of the community

47 |

The Umbraco community is the best of its kind, be sure to visit, and if you have any questions, we're sure that you can get your answers from the community.

48 | 49 | our.Umbraco → 50 |
51 |
52 | 53 |
54 |
55 | 56 |
57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /CleanBlog.Web/config/tinyMceConfig.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | paste 41 | anchor 42 | charmap 43 | table 44 | lists 45 | advlist 46 | hr 47 | autolink 48 | directionality 49 | tabfocus 50 | searchreplace 51 | fullscreen 52 | 53 | 54 | 66 | 67 | font 68 | 69 | 70 | 71 | 72 | raw 73 | 74 | 75 | -------------------------------------------------------------------------------- /CleanBlog.Web/config/umbracoSettings.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 1 19 | 25 | 31 | 32 | 33 | 34 | 35 | 36 | your@email.here 37 | 38 | 39 | 40 | 41 | In Preview Mode - click to end 43 | ]]> 44 | 45 | 51 | throw 52 | 53 | 54 | ashx,aspx,ascx,config,cshtml,vbhtml,asmx,air,axd,swf,xml,xhtml,html,htm,php,htaccess 55 | 56 | 57 | assets/img/login.jpg 58 | 59 | 60 | 61 | 62 | 63 | false 64 | 65 | true 66 | 67 | false 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 108 | 112 | 113 | 114 | 115 | -------------------------------------------------------------------------------- /CleanBlog.Web/contact.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | Clean Blog - Start Bootstrap Theme 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 54 | 55 | 56 |
57 |
58 |
59 |
60 |
61 |
62 |

Contact Me

63 | Have questions? I have answers. 64 |
65 |
66 |
67 |
68 |
69 | 70 | 71 |
72 |
73 |
74 |

Want to get in touch? Fill out the form below to send me a message and I will get back to you as soon as possible!

75 | 76 | 77 | 78 |
79 |
80 |
81 | 82 | 83 |

84 |
85 |
86 |
87 |
88 | 89 | 90 |

91 |
92 |
93 |
94 |
95 | 96 | 97 |

98 |
99 |
100 |
101 |
102 | 103 | 104 |

105 |
106 |
107 |
108 |
109 |
110 | 111 |
112 |
113 |
114 |
115 |
116 | 117 |
118 | 119 | 120 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | -------------------------------------------------------------------------------- /CleanBlog.Web/css/clean-blog.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Start Bootstrap - Clean Blog v5.0.8 (https://startbootstrap.com/template-overviews/clean-blog) 3 | * Copyright 2013-2019 Start Bootstrap 4 | * Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap-clean-blog/blob/master/LICENSE) 5 | */body{font-size:20px;color:#212529;font-family:Lora,'Times New Roman',serif}p{line-height:1.5;margin:30px 0}p a{text-decoration:underline}h1,h2,h3,h4,h5,h6{font-weight:800;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif}a{color:#212529;transition:all .2s}a:focus,a:hover{color:#0085a1}blockquote{font-style:italic;color:#868e96}.section-heading{font-size:36px;font-weight:700;margin-top:60px}.caption{font-size:14px;font-style:italic;display:block;margin:0;padding:10px;text-align:center;border-bottom-right-radius:5px;border-bottom-left-radius:5px}::-moz-selection{color:#fff;background:#0085a1;text-shadow:none}::selection{color:#fff;background:#0085a1;text-shadow:none}img::-moz-selection{color:#fff;background:0 0}img::selection{color:#fff;background:0 0}img::-moz-selection{color:#fff;background:0 0}#mainNav{position:absolute;border-bottom:1px solid #e9ecef;background-color:#fff;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif}#mainNav .navbar-brand{font-weight:800;color:#343a40}#mainNav .navbar-toggler{font-size:12px;font-weight:800;padding:13px;text-transform:uppercase;color:#343a40}#mainNav .navbar-nav>li.nav-item>a{font-size:12px;font-weight:800;letter-spacing:1px;text-transform:uppercase}@media only screen and (min-width:992px){#mainNav{border-bottom:1px solid transparent;background:0 0}#mainNav .navbar-brand{padding:10px 20px;color:#fff}#mainNav .navbar-brand:focus,#mainNav .navbar-brand:hover{color:rgba(255,255,255,.8)}#mainNav .navbar-nav>li.nav-item>a{padding:10px 20px;color:#fff}#mainNav .navbar-nav>li.nav-item>a:focus,#mainNav .navbar-nav>li.nav-item>a:hover{color:rgba(255,255,255,.8)}}@media only screen and (min-width:992px){#mainNav{transition:background-color .2s;transform:translate3d(0,0,0);-webkit-backface-visibility:hidden}#mainNav.is-fixed{position:fixed;top:-67px;transition:transform .2s;border-bottom:1px solid #fff;background-color:rgba(255,255,255,.9)}#mainNav.is-fixed .navbar-brand{color:#212529}#mainNav.is-fixed .navbar-brand:focus,#mainNav.is-fixed .navbar-brand:hover{color:#0085a1}#mainNav.is-fixed .navbar-nav>li.nav-item>a{color:#212529}#mainNav.is-fixed .navbar-nav>li.nav-item>a:focus,#mainNav.is-fixed .navbar-nav>li.nav-item>a:hover{color:#0085a1}#mainNav.is-visible{transform:translate3d(0,100%,0)}}header.masthead{margin-bottom:50px;background:no-repeat center center;background-color:#868e96;background-attachment:scroll;position:relative;background-size:cover}header.masthead .overlay{position:absolute;top:0;left:0;height:100%;width:100%;background-color:#212529;opacity:.5}header.masthead .page-heading,header.masthead .post-heading,header.masthead .site-heading{padding:200px 0 150px;color:#fff}@media only screen and (min-width:768px){header.masthead .page-heading,header.masthead .post-heading,header.masthead .site-heading{padding:200px 0}}header.masthead .page-heading,header.masthead .site-heading{text-align:center}header.masthead .page-heading h1,header.masthead .site-heading h1{font-size:50px;margin-top:0}header.masthead .page-heading .subheading,header.masthead .site-heading .subheading{font-size:24px;font-weight:300;line-height:1.1;display:block;margin:10px 0 0;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif}@media only screen and (min-width:768px){header.masthead .page-heading h1,header.masthead .site-heading h1{font-size:80px}}header.masthead .post-heading h1{font-size:35px}header.masthead .post-heading .meta,header.masthead .post-heading .subheading{line-height:1.1;display:block}header.masthead .post-heading .subheading{font-size:24px;font-weight:600;margin:10px 0 30px;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif}header.masthead .post-heading .meta{font-size:20px;font-weight:300;font-style:italic;font-family:Lora,'Times New Roman',serif}header.masthead .post-heading .meta a{color:#fff}@media only screen and (min-width:768px){header.masthead .post-heading h1{font-size:55px}header.masthead .post-heading .subheading{font-size:30px}}.post-preview>a{color:#212529}.post-preview>a:focus,.post-preview>a:hover{text-decoration:none;color:#0085a1}.post-preview>a>.post-title{font-size:30px;margin-top:30px;margin-bottom:10px}.post-preview>a>.post-subtitle{font-weight:300;margin:0 0 10px}.post-preview>.post-meta{font-size:18px;font-style:italic;margin-top:0;color:#868e96}.post-preview>.post-meta>a{text-decoration:none;color:#212529}.post-preview>.post-meta>a:focus,.post-preview>.post-meta>a:hover{text-decoration:underline;color:#0085a1}@media only screen and (min-width:768px){.post-preview>a>.post-title{font-size:36px}}.floating-label-form-group{font-size:14px;position:relative;margin-bottom:0;padding-bottom:.5em;border-bottom:1px solid #dee2e6}.floating-label-form-group input,.floating-label-form-group textarea{font-size:1.5em;position:relative;z-index:1;padding:0;resize:none;border:none;border-radius:0;background:0 0;box-shadow:none!important;font-family:Lora,'Times New Roman',serif}.floating-label-form-group input::-webkit-input-placeholder,.floating-label-form-group textarea::-webkit-input-placeholder{color:#868e96;font-family:Lora,'Times New Roman',serif}.floating-label-form-group label{font-size:.85em;line-height:1.764705882em;position:relative;z-index:0;top:2em;display:block;margin:0;transition:top .3s ease,opacity .3s ease;vertical-align:middle;vertical-align:baseline;opacity:0}.floating-label-form-group .help-block{margin:15px 0}.floating-label-form-group-with-value label{top:0;opacity:1}.floating-label-form-group-with-focus label{color:#0085a1}form .form-group:first-child .floating-label-form-group{border-top:1px solid #dee2e6}footer{padding:50px 0 65px}footer .list-inline{margin:0;padding:0}footer .copyright{font-size:14px;margin-bottom:0;text-align:center}.btn{font-size:14px;font-weight:800;padding:15px 25px;letter-spacing:1px;text-transform:uppercase;border-radius:0;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif}.btn-primary{background-color:#0085a1;border-color:#0085a1}.btn-primary:active,.btn-primary:focus,.btn-primary:hover{color:#fff;background-color:#00657b!important;border-color:#00657b!important}.btn-lg{font-size:16px;padding:25px 35px} -------------------------------------------------------------------------------- /CleanBlog.Web/iis-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "IIS-Site-Name": "clean-blog", 3 | "App-Pool-Name": "clean-blog", 4 | "IIS-App-Pool-Dot-Net-Version": "v4.0", 5 | "bindings": ["clean-blog.localtest.me"] 6 | } -------------------------------------------------------------------------------- /CleanBlog.Web/img/about-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prjseal/Umbraco-v8-Tutorial/59ce1f5ad963aeb896f87e3a933d751c42639f9a/CleanBlog.Web/img/about-bg.jpg -------------------------------------------------------------------------------- /CleanBlog.Web/img/contact-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prjseal/Umbraco-v8-Tutorial/59ce1f5ad963aeb896f87e3a933d751c42639f9a/CleanBlog.Web/img/contact-bg.jpg -------------------------------------------------------------------------------- /CleanBlog.Web/img/home-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prjseal/Umbraco-v8-Tutorial/59ce1f5ad963aeb896f87e3a933d751c42639f9a/CleanBlog.Web/img/home-bg.jpg -------------------------------------------------------------------------------- /CleanBlog.Web/img/post-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prjseal/Umbraco-v8-Tutorial/59ce1f5ad963aeb896f87e3a933d751c42639f9a/CleanBlog.Web/img/post-bg.jpg -------------------------------------------------------------------------------- /CleanBlog.Web/img/post-sample-image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prjseal/Umbraco-v8-Tutorial/59ce1f5ad963aeb896f87e3a933d751c42639f9a/CleanBlog.Web/img/post-sample-image.jpg -------------------------------------------------------------------------------- /CleanBlog.Web/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | Clean Blog - Start Bootstrap Theme 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 54 | 55 | 56 |
57 |
58 |
59 |
60 |
61 |
62 |

Clean Blog

63 | A Blog Theme by Start Bootstrap 64 |
65 |
66 |
67 |
68 |
69 | 70 | 71 | 134 | 135 |
136 | 137 | 138 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | -------------------------------------------------------------------------------- /CleanBlog.Web/js/clean-blog.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | "use strict"; // Start of use strict 3 | 4 | // Floating label headings for the contact form 5 | $("body").on("input propertychange", ".floating-label-form-group", function(e) { 6 | $(this).toggleClass("floating-label-form-group-with-value", !!$(e.target).val()); 7 | }).on("focus", ".floating-label-form-group", function() { 8 | $(this).addClass("floating-label-form-group-with-focus"); 9 | }).on("blur", ".floating-label-form-group", function() { 10 | $(this).removeClass("floating-label-form-group-with-focus"); 11 | }); 12 | 13 | // Show the navbar when the page is scrolled up 14 | var MQL = 992; 15 | 16 | //primary navigation slide-in effect 17 | if ($(window).width() > MQL) { 18 | var headerHeight = $('#mainNav').height(); 19 | $(window).on('scroll', { 20 | previousTop: 0 21 | }, 22 | function() { 23 | var currentTop = $(window).scrollTop(); 24 | //check if user is scrolling up 25 | if (currentTop < this.previousTop) { 26 | //if scrolling up... 27 | if (currentTop > 0 && $('#mainNav').hasClass('is-fixed')) { 28 | $('#mainNav').addClass('is-visible'); 29 | } else { 30 | $('#mainNav').removeClass('is-visible is-fixed'); 31 | } 32 | } else if (currentTop > this.previousTop) { 33 | //if scrolling down... 34 | $('#mainNav').removeClass('is-visible'); 35 | if (currentTop > headerHeight && !$('#mainNav').hasClass('is-fixed')) $('#mainNav').addClass('is-fixed'); 36 | } 37 | this.previousTop = currentTop; 38 | }); 39 | } 40 | 41 | })(jQuery); // End of use strict 42 | -------------------------------------------------------------------------------- /CleanBlog.Web/js/clean-blog.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Start Bootstrap - Clean Blog v5.0.8 (https://startbootstrap.com/template-overviews/clean-blog) 3 | * Copyright 2013-2019 Start Bootstrap 4 | * Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap-clean-blog/blob/master/LICENSE) 5 | */ 6 | 7 | !function(o){"use strict";o("body").on("input propertychange",".floating-label-form-group",function(i){o(this).toggleClass("floating-label-form-group-with-value",!!o(i.target).val())}).on("focus",".floating-label-form-group",function(){o(this).addClass("floating-label-form-group-with-focus")}).on("blur",".floating-label-form-group",function(){o(this).removeClass("floating-label-form-group-with-focus")});if(992this.previousTop&&(o("#mainNav").removeClass("is-visible"),s= 0) { 18 | firstName = name.split(' ').slice(0, -1).join(' '); 19 | } 20 | $this = $("#sendMessageButton"); 21 | $this.prop("disabled", true); // Disable submit button until AJAX call is complete to prevent duplicate messages 22 | $.ajax({ 23 | url: "././mail/contact_me.php", 24 | type: "POST", 25 | data: { 26 | name: name, 27 | phone: phone, 28 | email: email, 29 | message: message 30 | }, 31 | cache: false, 32 | success: function() { 33 | // Success message 34 | $('#success').html("
"); 35 | $('#success > .alert-success').html(""); 37 | $('#success > .alert-success') 38 | .append("Your message has been sent. "); 39 | $('#success > .alert-success') 40 | .append('
'); 41 | //clear all fields 42 | $('#contactForm').trigger("reset"); 43 | }, 44 | error: function() { 45 | // Fail message 46 | $('#success').html("
"); 47 | $('#success > .alert-danger').html(""); 49 | $('#success > .alert-danger').append($("").text("Sorry " + firstName + ", it seems that my mail server is not responding. Please try again later!")); 50 | $('#success > .alert-danger').append('
'); 51 | //clear all fields 52 | $('#contactForm').trigger("reset"); 53 | }, 54 | complete: function() { 55 | setTimeout(function() { 56 | $this.prop("disabled", false); // Re-enable submit button when AJAX call is complete 57 | }, 1000); 58 | } 59 | }); 60 | }, 61 | filter: function() { 62 | return $(this).is(":visible"); 63 | }, 64 | }); 65 | 66 | $("a[data-toggle=\"tab\"]").click(function(e) { 67 | e.preventDefault(); 68 | $(this).tab("show"); 69 | }); 70 | }); 71 | 72 | /*When clicking on Full hide fail/success boxes */ 73 | $('#name').focus(function() { 74 | $('#success').html(''); 75 | }); 76 | -------------------------------------------------------------------------------- /CleanBlog.Web/post.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | Clean Blog - Start Bootstrap Theme 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 54 | 55 | 56 |
57 |
58 |
59 |
60 |
61 |
62 |

Man must explore, and this is exploration at its greatest

63 |

Problems look mighty small from 150 miles up

64 | Posted by 65 | Start Bootstrap 66 | on August 24, 2019 67 |
68 |
69 |
70 |
71 |
72 | 73 | 74 |
75 |
76 |
77 |
78 |

Never in all their history have men been able truly to conceive of the world as one: a single sphere, a globe, having the qualities of a globe, a round earth in which all the directions eventually meet, in which there is no center because every point, or none, is center — an equal earth which all men occupy as equals. The airman's earth, if free men make it, will be truly round: a globe in practice, not in theory.

79 | 80 |

Science cuts two ways, of course; its products can be used for both good and evil. But there's no turning back from science. The early warnings about technological dangers also come from science.

81 | 82 |

What was most significant about the lunar voyage was not that man set foot on the Moon but that they set eye on the earth.

83 | 84 |

A Chinese tale tells of some men sent to harm a young girl who, upon seeing her beauty, become her protectors rather than her violators. That's how I felt seeing the Earth for the first time. I could not help but love and cherish her.

85 | 86 |

For those who have seen the Earth from space, and for the hundreds and perhaps thousands more who will, the experience most certainly changes your perspective. The things that we share in our world are far more valuable than those which divide us.

87 | 88 |

The Final Frontier

89 | 90 |

There can be no thought of finishing for ‘aiming for the stars.’ Both figuratively and literally, it is a task to occupy the generations. And no matter how much progress one makes, there is always the thrill of just beginning.

91 | 92 |

There can be no thought of finishing for ‘aiming for the stars.’ Both figuratively and literally, it is a task to occupy the generations. And no matter how much progress one makes, there is always the thrill of just beginning.

93 | 94 |
The dreams of yesterday are the hopes of today and the reality of tomorrow. Science has not yet mastered prophecy. We predict too much for the next year and yet far too little for the next ten.
95 | 96 |

Spaceflights cannot be stopped. This is not the work of any one man or even a group of men. It is a historical process which mankind is carrying out in accordance with the natural laws of human development.

97 | 98 |

Reaching for the Stars

99 | 100 |

As we got further and further away, it [the Earth] diminished in size. Finally it shrank to the size of a marble, the most beautiful you can imagine. That beautiful, warm, living object looked so fragile, so delicate, that if you touched it with a finger it would crumble and fall apart. Seeing this has to change a man.

101 | 102 | 103 | 104 | 105 | To go places and do things that have never been done before – that’s what living is all about. 106 | 107 |

Space, the final frontier. These are the voyages of the Starship Enterprise. Its five-year mission: to explore strange new worlds, to seek out new life and new civilizations, to boldly go where no man has gone before.

108 | 109 |

As I stand out here in the wonders of the unknown at Hadley, I sort of realize there’s a fundamental truth to our nature, Man must explore, and this is exploration at its greatest.

110 | 111 |

Placeholder text by 112 | Space Ipsum. Photographs by 113 | NASA on The Commons.

114 |
115 |
116 |
117 |
118 | 119 |
120 | 121 | 122 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | -------------------------------------------------------------------------------- /CleanBlog.Web/readme.txt: -------------------------------------------------------------------------------- 1 |  2 | ✍✍✍✍ ✍✍✍ ✍ ✍✍✍✍✍ ✍ ✍ ✍ ✍ ✍ ✍ 3 | ✍ ✍ ✍ ✍ ✍ ✍ ✍ ✍✍ ✍ ✍ ✍ 4 | ✍✍✍ ✍ ✍ ✍ ✍ ✍ ✍ ✍ ✍ ✍ ✍✍ 5 | ✍ ✍ ✍ ✍ ✍ ✍ ✍ ✍ ✍✍ ✍ ✍ 6 | ✍✍✍✍ ✍✍✍ ✍ ✍ ✍✍✍✍ ✍ ✍ ✍ ✍ ✍ 7 | 8 | ------------------------------------------------------------------- 9 | 10 | A simple package for Umbraco by Paul Seal from https://codeshare.co.uk 11 | 12 | This package is useful on sites with lots of content, where you just 13 | need to edit a page that you can find easily on the front end of the 14 | site, but it is harder to find in the backoffice. 15 | 16 | With this package installed, if you are logged into the Umbraco backoffice whilst 17 | browsing the front end of the site, you will see a link to edit the page. 18 | 19 | When you click the link it will open the page in a new tab. 20 | 21 | ## Dev Instructions ## 22 | 23 | In your master view add 24 | 25 | @Using Our.Umbraco.EditLink 26 | 27 | Then inside the body tag somewhere, just add 28 | 29 | @RenderEditLink(Model) 30 | 31 | You can pass in different parameters to override these defaults: 32 | 33 | EditLinkPosition position = EditLinkPosition.TopLeft, 34 | bool applyInlineLinkStyles = true, 35 | string editMessage = "Edit", 36 | string linkColour = "#fff", 37 | string linkBackgroundColour = "#1b264f", 38 | int fontSize = 16, 39 | int linkPadding = 10, 40 | int borderRadius = 6, 41 | string linkClassName = "edit-link-inner", 42 | bool applyInlineOuterElementStyles = true, 43 | int margin = 10, 44 | int zindex = 10000, 45 | string umbracoEditContentUrl = "/umbraco#/content/content/edit/", 46 | string outerClassName = "edit-link-outer", 47 | string outerPosition = "fixed", 48 | string linkPosition = "absolute" 49 | 50 | Here is the link to the GitHub project https://github.com/prjseal/Our.Umbraco.EditLink 51 | 52 | ------------------------------------------------------------------------------------- 53 | 54 | ( ( 55 | ) ) If you would like to show your appreciation for this package, 56 | ........ you could buy me a coffee, if you want. 57 | | |] 58 | \ / https://codeshare.co.uk/coffee 59 | `----' -------------------------------------------------------------------------------- /CleanBlog.Web/scripts/contactForm.js: -------------------------------------------------------------------------------- 1 | var contactForm = contactForm || 2 | { 3 | init: function() { 4 | this.listeners(); 5 | }, 6 | listeners: function() { 7 | $(document).on('click', 8 | '.contact-submit', 9 | function() { 10 | e.preventDefault(); 11 | var form = $("#contact-form"); 12 | form.submit(); 13 | }); 14 | }, 15 | showResult: function() { 16 | $('#form-outer').hide('slow'); 17 | $('#form-result').show('slow'); 18 | } 19 | } -------------------------------------------------------------------------------- /CleanBlog.Web/scripts/jquery.unobtrusive-ajax.min.js: -------------------------------------------------------------------------------- 1 | // Unobtrusive Ajax support library for jQuery 2 | // Copyright (c) .NET Foundation. All rights reserved. 3 | // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. 4 | // @version v3.2.6 5 | // 6 | // Microsoft grants you the right to use these script files for the sole 7 | // purpose of either: (i) interacting through your browser with the Microsoft 8 | // website or online service, subject to the applicable licensing or use 9 | // terms; or (ii) using the files as included with a Microsoft product subject 10 | // to that product's license terms. Microsoft reserves all other rights to the 11 | // files not expressly granted by Microsoft, whether by implication, estoppel 12 | // or otherwise. Insofar as a script file is dual licensed under GPL, 13 | // Microsoft neither took the code under GPL nor distributes it thereunder but 14 | // under the terms set out in this paragraph. All notices and licenses 15 | // below are for informational purposes only. 16 | !function(t){function a(t,a){for(var e=window,r=(t||"").split(".");e&&r.length;)e=e[r.shift()];return"function"==typeof e?e:(a.push(t),Function.constructor.apply(null,a))}function e(t){return"GET"===t||"POST"===t}function r(t,a){e(a)||t.setRequestHeader("X-HTTP-Method-Override",a)}function n(a,e,r){var n;r.indexOf("application/x-javascript")===-1&&(n=(a.getAttribute("data-ajax-mode")||"").toUpperCase(),t(a.getAttribute("data-ajax-update")).each(function(a,r){switch(n){case"BEFORE":t(r).prepend(e);break;case"AFTER":t(r).append(e);break;case"REPLACE-WITH":t(r).replaceWith(e);break;default:t(r).html(e)}}))}function i(i,u){var o,c,d,s;if(o=i.getAttribute("data-ajax-confirm"),!o||window.confirm(o)){c=t(i.getAttribute("data-ajax-loading")),s=parseInt(i.getAttribute("data-ajax-loading-duration"),10)||0,t.extend(u,{type:i.getAttribute("data-ajax-method")||void 0,url:i.getAttribute("data-ajax-url")||void 0,cache:"true"===(i.getAttribute("data-ajax-cache")||"").toLowerCase(),beforeSend:function(t){var e;return r(t,d),e=a(i.getAttribute("data-ajax-begin"),["xhr"]).apply(i,arguments),e!==!1&&c.show(s),e},complete:function(){c.hide(s),a(i.getAttribute("data-ajax-complete"),["xhr","status"]).apply(i,arguments)},success:function(t,e,r){n(i,t,r.getResponseHeader("Content-Type")||"text/html"),a(i.getAttribute("data-ajax-success"),["data","status","xhr"]).apply(i,arguments)},error:function(){a(i.getAttribute("data-ajax-failure"),["xhr","status","error"]).apply(i,arguments)}}),u.data.push({name:"X-Requested-With",value:"XMLHttpRequest"}),d=u.type.toUpperCase(),e(d)||(u.type="POST",u.data.push({name:"X-HTTP-Method-Override",value:d}));var p=t(i);if(p.is("form")&&"multipart/form-data"==p.attr("enctype")){var f=new FormData;t.each(u.data,function(t,a){f.append(a.name,a.value)}),t("input[type=file]",p).each(function(){var a=this;t.each(a.files,function(t,e){f.append(a.name,e)})}),t.extend(u,{processData:!1,contentType:!1,data:f})}t.ajax(u)}}function u(a){var e=t(a).data(d);return!e||!e.validate||e.validate()}var o="unobtrusiveAjaxClick",c="unobtrusiveAjaxClickTarget",d="unobtrusiveValidation";t(document).on("click","a[data-ajax=true]",function(t){t.preventDefault(),i(this,{url:this.href,type:"GET",data:[]})}),t(document).on("click","form[data-ajax=true] input[type=image]",function(a){var e=a.target.name,r=t(a.target),n=t(r.parents("form")[0]),i=r.offset();n.data(o,[{name:e+".x",value:Math.round(a.pageX-i.left)},{name:e+".y",value:Math.round(a.pageY-i.top)}]),setTimeout(function(){n.removeData(o)},0)}),t(document).on("click","form[data-ajax=true] :submit",function(a){var e=a.currentTarget.name,r=t(a.target),n=t(r.parents("form")[0]);n.data(o,e?[{name:e,value:a.currentTarget.value}]:[]),n.data(c,r),setTimeout(function(){n.removeData(o),n.removeData(c)},0)}),t(document).on("submit","form[data-ajax=true]",function(a){var e=t(this).data(o)||[],r=t(this).data(c),n=r&&(r.hasClass("cancel")||void 0!==r.attr("formnovalidate"));a.preventDefault(),(n||u(this))&&i(this,{url:this.action,type:this.method||"GET",data:e.concat(t(this).serializeArray())})})}(jQuery); -------------------------------------------------------------------------------- /CleanBlog.Web/scripts/jquery.validate.unobtrusive.min.js: -------------------------------------------------------------------------------- 1 | // Unobtrusive validation support library for jQuery and jQuery Validate 2 | // Copyright (c) .NET Foundation. All rights reserved. 3 | // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. 4 | // @version v3.2.11 5 | !function(a){"function"==typeof define&&define.amd?define("jquery.validate.unobtrusive",["jquery-validation"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery-validation")):jQuery.validator.unobtrusive=a(jQuery)}(function(a){function e(a,e,n){a.rules[e]=n,a.message&&(a.messages[e]=a.message)}function n(a){return a.replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g)}function t(a){return a.replace(/([!"#$%&'()*+,.\/:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function r(a){return a.substr(0,a.lastIndexOf(".")+1)}function i(a,e){return 0===a.indexOf("*.")&&(a=a.replace("*.",e)),a}function o(e,n){var r=a(this).find("[data-valmsg-for='"+t(n[0].name)+"']"),i=r.attr("data-valmsg-replace"),o=i?a.parseJSON(i)!==!1:null;r.removeClass("field-validation-valid").addClass("field-validation-error"),e.data("unobtrusiveContainer",r),o?(r.empty(),e.removeClass("input-validation-error").appendTo(r)):e.hide()}function d(e,n){var t=a(this).find("[data-valmsg-summary=true]"),r=t.find("ul");r&&r.length&&n.errorList.length&&(r.empty(),t.addClass("validation-summary-errors").removeClass("validation-summary-valid"),a.each(n.errorList,function(){a("
  • ").html(this.message).appendTo(r)}))}function s(e){var n=e.data("unobtrusiveContainer");if(n){var t=n.attr("data-valmsg-replace"),r=t?a.parseJSON(t):null;n.addClass("field-validation-valid").removeClass("field-validation-error"),e.removeData("unobtrusiveContainer"),r&&n.empty()}}function l(e){var n=a(this),t="__jquery_unobtrusive_validation_form_reset";if(!n.data(t)){n.data(t,!0);try{n.data("validator").resetForm()}finally{n.removeData(t)}n.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors"),n.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}}function u(e){var n=a(e),t=n.data(v),r=a.proxy(l,e),i=f.unobtrusive.options||{},u=function(n,t){var r=i[n];r&&a.isFunction(r)&&r.apply(e,t)};return t||(t={options:{errorClass:i.errorClass||"input-validation-error",errorElement:i.errorElement||"span",errorPlacement:function(){o.apply(e,arguments),u("errorPlacement",arguments)},invalidHandler:function(){d.apply(e,arguments),u("invalidHandler",arguments)},messages:{},rules:{},success:function(){s.apply(e,arguments),u("success",arguments)}},attachValidation:function(){n.off("reset."+v,r).on("reset."+v,r).validate(this.options)},validate:function(){return n.validate(),n.valid()}},n.data(v,t)),t}var m,f=a.validator,v="unobtrusiveValidation";return f.unobtrusive={adapters:[],parseElement:function(e,n){var t,r,i,o=a(e),d=o.parents("form")[0];d&&(t=u(d),t.options.rules[e.name]=r={},t.options.messages[e.name]=i={},a.each(this.adapters,function(){var n="data-val-"+this.name,t=o.attr(n),s={};void 0!==t&&(n+="-",a.each(this.params,function(){s[this]=o.attr(n+this)}),this.adapt({element:e,form:d,message:t,params:s,rules:r,messages:i}))}),a.extend(r,{__dummy__:!0}),n||t.attachValidation())},parse:function(e){var n=a(e),t=n.parents().addBack().filter("form").add(n.find("form")).has("[data-val=true]");n.find("[data-val=true]").each(function(){f.unobtrusive.parseElement(this,!0)}),t.each(function(){var a=u(this);a&&a.attachValidation()})}},m=f.unobtrusive.adapters,m.add=function(a,e,n){return n||(n=e,e=[]),this.push({name:a,params:e,adapt:n}),this},m.addBool=function(a,n){return this.add(a,function(t){e(t,n||a,!0)})},m.addMinMax=function(a,n,t,r,i,o){return this.add(a,[i||"min",o||"max"],function(a){var i=a.params.min,o=a.params.max;i&&o?e(a,r,[i,o]):i?e(a,n,i):o&&e(a,t,o)})},m.addSingleVal=function(a,n,t){return this.add(a,[n||"val"],function(r){e(r,t||a,r.params[n])})},f.addMethod("__dummy__",function(a,e,n){return!0}),f.addMethod("regex",function(a,e,n){var t;return!!this.optional(e)||(t=new RegExp(n).exec(a),t&&0===t.index&&t[0].length===a.length)}),f.addMethod("nonalphamin",function(a,e,n){var t;return n&&(t=a.match(/\W/g),t=t&&t.length>=n),t}),f.methods.extension?(m.addSingleVal("accept","mimtype"),m.addSingleVal("extension","extension")):m.addSingleVal("extension","extension","accept"),m.addSingleVal("regex","pattern"),m.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"),m.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range"),m.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength"),m.add("equalto",["other"],function(n){var o=r(n.element.name),d=n.params.other,s=i(d,o),l=a(n.form).find(":input").filter("[name='"+t(s)+"']")[0];e(n,"equalTo",l)}),m.add("required",function(a){"INPUT"===a.element.tagName.toUpperCase()&&"CHECKBOX"===a.element.type.toUpperCase()||e(a,"required",!0)}),m.add("remote",["url","type","additionalfields"],function(o){var d={url:o.params.url,type:o.params.type||"GET",data:{}},s=r(o.element.name);a.each(n(o.params.additionalfields||o.element.name),function(e,n){var r=i(n,s);d.data[r]=function(){var e=a(o.form).find(":input").filter("[name='"+t(r)+"']");return e.is(":checkbox")?e.filter(":checked").val()||e.filter(":hidden").val()||"":e.is(":radio")?e.filter(":checked").val()||"":e.val()}}),e(o,"remote",d)}),m.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&e(a,"minlength",a.params.min),a.params.nonalphamin&&e(a,"nonalphamin",a.params.nonalphamin),a.params.regex&&e(a,"regex",a.params.regex)}),m.add("fileextensions",["extensions"],function(a){e(a,"extension",a.params.extensions)}),a(function(){f.unobtrusive.parse(document)}),f.unobtrusive}); -------------------------------------------------------------------------------- /CleanBlog.Web/scripts/lazysizes.min.js: -------------------------------------------------------------------------------- 1 | /*! lazysizes - v5.2.0 */ 2 | !function (a, b) { var c = b(a, a.document, Date); a.lazySizes = c, "object" == typeof module && module.exports && (module.exports = c) }("undefined" != typeof window ? window : {}, function (a, b, c) { "use strict"; var d, e; if (function () { var b, c = { lazyClass: "lazyload", loadedClass: "lazyloaded", loadingClass: "lazyloading", preloadClass: "lazypreload", errorClass: "lazyerror", autosizesClass: "lazyautosizes", srcAttr: "data-src", srcsetAttr: "data-srcset", sizesAttr: "data-sizes", minSize: 40, customMedia: {}, init: !0, expFactor: 1.5, hFac: .8, loadMode: 2, loadHidden: !0, ricTimeout: 0, throttleDelay: 125 }; e = a.lazySizesConfig || a.lazysizesConfig || {}; for (b in c) b in e || (e[b] = c[b]) }(), !b || !b.getElementsByClassName) return { init: function () { }, cfg: e, noSupport: !0 }; var f = b.documentElement, g = a.HTMLPictureElement, h = "addEventListener", i = "getAttribute", j = a[h].bind(a), k = a.setTimeout, l = a.requestAnimationFrame || k, m = a.requestIdleCallback, n = /^picture$/i, o = ["load", "error", "lazyincluded", "_lazyloaded"], p = {}, q = Array.prototype.forEach, r = function (a, b) { return p[b] || (p[b] = new RegExp("(\\s|^)" + b + "(\\s|$)")), p[b].test(a[i]("class") || "") && p[b] }, s = function (a, b) { r(a, b) || a.setAttribute("class", (a[i]("class") || "").trim() + " " + b) }, t = function (a, b) { var c; (c = r(a, b)) && a.setAttribute("class", (a[i]("class") || "").replace(c, " ")) }, u = function (a, b, c) { var d = c ? h : "removeEventListener"; c && u(a, b), o.forEach(function (c) { a[d](c, b) }) }, v = function (a, c, e, f, g) { var h = b.createEvent("Event"); return e || (e = {}), e.instance = d, h.initEvent(c, !f, !g), h.detail = e, a.dispatchEvent(h), h }, w = function (b, c) { var d; !g && (d = a.picturefill || e.pf) ? (c && c.src && !b[i]("srcset") && b.setAttribute("srcset", c.src), d({ reevaluate: !0, elements: [b] })) : c && c.src && (b.src = c.src) }, x = function (a, b) { return (getComputedStyle(a, null) || {})[b] }, y = function (a, b, c) { for (c = c || a.offsetWidth; c < e.minSize && b && !a._lazysizesWidth;)c = b.offsetWidth, b = b.parentNode; return c }, z = function () { var a, c, d = [], e = [], f = d, g = function () { var b = f; for (f = d.length ? e : d, a = !0, c = !1; b.length;)b.shift()(); a = !1 }, h = function (d, e) { a && !e ? d.apply(this, arguments) : (f.push(d), c || (c = !0, (b.hidden ? k : l)(g))) }; return h._lsFlush = g, h }(), A = function (a, b) { return b ? function () { z(a) } : function () { var b = this, c = arguments; z(function () { a.apply(b, c) }) } }, B = function (a) { var b, d = 0, f = e.throttleDelay, g = e.ricTimeout, h = function () { b = !1, d = c.now(), a() }, i = m && g > 49 ? function () { m(h, { timeout: g }), g !== e.ricTimeout && (g = e.ricTimeout) } : A(function () { k(h) }, !0); return function (a) { var e; (a = !0 === a) && (g = 33), b || (b = !0, e = f - (c.now() - d), e < 0 && (e = 0), a || e < 9 ? i() : k(i, e)) } }, C = function (a) { var b, d, e = 99, f = function () { b = null, a() }, g = function () { var a = c.now() - d; a < e ? k(g, e - a) : (m || f)(f) }; return function () { d = c.now(), b || (b = k(g, e)) } }, D = function () { var g, m, o, p, y, D, F, G, H, I, J, K, L = /^img$/i, M = /^iframe$/i, N = "onscroll" in a && !/(gle|ing)bot/.test(navigator.userAgent), O = 0, P = 0, Q = 0, R = -1, S = function (a) { Q-- , (!a || Q < 0 || !a.target) && (Q = 0) }, T = function (a) { return null == K && (K = "hidden" == x(b.body, "visibility")), K || !("hidden" == x(a.parentNode, "visibility") && "hidden" == x(a, "visibility")) }, U = function (a, c) { var d, e = a, g = T(a); for (G -= c, J += c, H -= c, I += c; g && (e = e.offsetParent) && e != b.body && e != f;)(g = (x(e, "opacity") || 1) > 0) && "visible" != x(e, "overflow") && (d = e.getBoundingClientRect(), g = I > d.left && H < d.right && J > d.top - 1 && G < d.bottom + 1); return g }, V = function () { var a, c, h, j, k, l, n, o, q, r, s, t, u = d.elements; if ((p = e.loadMode) && Q < 8 && (a = u.length)) { for (c = 0, R++; c < a; c++)if (u[c] && !u[c]._lazyRace) if (!N || d.prematureUnveil && d.prematureUnveil(u[c])) ba(u[c]); else if ((o = u[c][i]("data-expand")) && (l = 1 * o) || (l = P), r || (r = !e.expand || e.expand < 1 ? f.clientHeight > 500 && f.clientWidth > 500 ? 500 : 370 : e.expand, d._defEx = r, s = r * e.expFactor, t = e.hFac, K = null, P < s && Q < 1 && R > 2 && p > 2 && !b.hidden ? (P = s, R = 0) : P = p > 1 && R > 1 && Q < 6 ? r : O), q !== l && (D = innerWidth + l * t, F = innerHeight + l, n = -1 * l, q = l), h = u[c].getBoundingClientRect(), (J = h.bottom) >= n && (G = h.top) <= F && (I = h.right) >= n * t && (H = h.left) <= D && (J || I || H || G) && (e.loadHidden || T(u[c])) && (m && Q < 3 && !o && (p < 3 || R < 4) || U(u[c], l))) { if (ba(u[c]), k = !0, Q > 9) break } else !k && m && !j && Q < 4 && R < 4 && p > 2 && (g[0] || e.preloadAfterLoad) && (g[0] || !o && (J || I || H || G || "auto" != u[c][i](e.sizesAttr))) && (j = g[0] || u[c]); j && !k && ba(j) } }, W = B(V), X = function (a) { var b = a.target; if (b._lazyCache) return void delete b._lazyCache; S(a), s(b, e.loadedClass), t(b, e.loadingClass), u(b, Z), v(b, "lazyloaded") }, Y = A(X), Z = function (a) { Y({ target: a.target }) }, $ = function (a, b) { try { a.contentWindow.location.replace(b) } catch (c) { a.src = b } }, _ = function (a) { var b, c = a[i](e.srcsetAttr); (b = e.customMedia[a[i]("data-media") || a[i]("media")]) && a.setAttribute("media", b), c && a.setAttribute("srcset", c) }, aa = A(function (a, b, c, d, f) { var g, h, j, l, m, p; (m = v(a, "lazybeforeunveil", b)).defaultPrevented || (d && (c ? s(a, e.autosizesClass) : a.setAttribute("sizes", d)), h = a[i](e.srcsetAttr), g = a[i](e.srcAttr), f && (j = a.parentNode, l = j && n.test(j.nodeName || "")), p = b.firesLoad || "src" in a && (h || g || l), m = { target: a }, s(a, e.loadingClass), p && (clearTimeout(o), o = k(S, 2500), u(a, Z, !0)), l && q.call(j.getElementsByTagName("source"), _), h ? a.setAttribute("srcset", h) : g && !l && (M.test(a.nodeName) ? $(a, g) : a.src = g), f && (h || l) && w(a, { src: g })), a._lazyRace && delete a._lazyRace, t(a, e.lazyClass), z(function () { var b = a.complete && a.naturalWidth > 1; p && !b || (b && s(a, "ls-is-cached"), X(m), a._lazyCache = !0, k(function () { "_lazyCache" in a && delete a._lazyCache }, 9)), "lazy" == a.loading && Q-- }, !0) }), ba = function (a) { if (!a._lazyRace) { var b, c = L.test(a.nodeName), d = c && (a[i](e.sizesAttr) || a[i]("sizes")), f = "auto" == d; (!f && m || !c || !a[i]("src") && !a.srcset || a.complete || r(a, e.errorClass) || !r(a, e.lazyClass)) && (b = v(a, "lazyunveilread").detail, f && E.updateElem(a, !0, a.offsetWidth), a._lazyRace = !0, Q++ , aa(a, b, f, d, c)) } }, ca = C(function () { e.loadMode = 3, W() }), da = function () { 3 == e.loadMode && (e.loadMode = 2), ca() }, ea = function () { if (!m) { if (c.now() - y < 999) return void k(ea, 999); m = !0, e.loadMode = 3, W(), j("scroll", da, !0) } }; return { _: function () { y = c.now(), d.elements = b.getElementsByClassName(e.lazyClass), g = b.getElementsByClassName(e.lazyClass + " " + e.preloadClass), j("scroll", W, !0), j("resize", W, !0), j("pageshow", function (a) { if (a.persisted) { var c = b.querySelectorAll("." + e.loadingClass); c.length && c.forEach && l(function () { c.forEach(function (a) { a.complete && ba(a) }) }) } }), a.MutationObserver ? new MutationObserver(W).observe(f, { childList: !0, subtree: !0, attributes: !0 }) : (f[h]("DOMNodeInserted", W, !0), f[h]("DOMAttrModified", W, !0), setInterval(W, 999)), j("hashchange", W, !0), ["focus", "mouseover", "click", "load", "transitionend", "animationend"].forEach(function (a) { b[h](a, W, !0) }), /d$|^c/.test(b.readyState) ? ea() : (j("load", ea), b[h]("DOMContentLoaded", W), k(ea, 2e4)), d.elements.length ? (V(), z._lsFlush()) : W() }, checkElems: W, unveil: ba, _aLSL: da } }(), E = function () { var a, c = A(function (a, b, c, d) { var e, f, g; if (a._lazysizesWidth = d, d += "px", a.setAttribute("sizes", d), n.test(b.nodeName || "")) for (e = b.getElementsByTagName("source"), f = 0, g = e.length; f < g; f++)e[f].setAttribute("sizes", d); c.detail.dataAttr || w(a, c.detail) }), d = function (a, b, d) { var e, f = a.parentNode; f && (d = y(a, f, d), e = v(a, "lazybeforesizes", { width: d, dataAttr: !!b }), e.defaultPrevented || (d = e.detail.width) && d !== a._lazysizesWidth && c(a, f, e, d)) }, f = function () { var b, c = a.length; if (c) for (b = 0; b < c; b++)d(a[b]) }, g = C(f); return { _: function () { a = b.getElementsByClassName(e.autosizesClass), j("resize", g) }, checkElems: g, updateElem: d } }(), F = function () { !F.i && b.getElementsByClassName && (F.i = !0, E._(), D._()) }; return k(function () { e.init && F() }), d = { cfg: e, autoSizer: E, loader: D, init: F, uP: w, aC: s, rC: t, hC: r, fire: v, gW: y, rAF: z } }); -------------------------------------------------------------------------------- /CleanBlog.Web/scripts/ls.unveilhooks.min.js: -------------------------------------------------------------------------------- 1 | /*! lazysizes - v5.2.0 */ 2 | !function (a, b) { var c = function () { b(a.lazySizes), a.removeEventListener("lazyunveilread", c, !0) }; b = b.bind(null, a, a.document), "object" == typeof module && module.exports ? b(require("lazysizes")) : a.lazySizes ? c() : a.addEventListener("lazyunveilread", c, !0) }(window, function (a, b, c) { "use strict"; function d(a, c) { if (!g[a]) { var d = b.createElement(c ? "link" : "script"), e = b.getElementsByTagName("script")[0]; c ? (d.rel = "stylesheet", d.href = a) : d.src = a, g[a] = !0, g[d.src || d.href] = !0, e.parentNode.insertBefore(d, e) } } var e, f, g = {}; b.addEventListener && (f = /\(|\)|\s|'/, e = function (a, c) { var d = b.createElement("img"); d.onload = function () { d.onload = null, d.onerror = null, d = null, c() }, d.onerror = d.onload, d.src = a, d && d.complete && d.onload && d.onload() }, addEventListener("lazybeforeunveil", function (a) { if (a.detail.instance == c) { var b, g, h, i; if (!a.defaultPrevented) { var j = a.target; if ("none" == j.preload && (j.preload = j.getAttribute("data-preload") || "auto"), null != j.getAttribute("data-autoplay")) if (j.getAttribute("data-expand") && !j.autoplay) try { j.play() } catch (a) { } else requestAnimationFrame(function () { j.setAttribute("data-expand", "-10"), c.aC(j, c.cfg.lazyClass) }); b = j.getAttribute("data-link"), b && d(b, !0), b = j.getAttribute("data-script"), b && d(b), b = j.getAttribute("data-require"), b && (c.cfg.requireJs ? c.cfg.requireJs([b]) : d(b)), h = j.getAttribute("data-bg"), h && (a.detail.firesLoad = !0, g = function () { j.style.backgroundImage = "url(" + (f.test(h) ? JSON.stringify(h) : h) + ")", a.detail.firesLoad = !1, c.fire(j, "_lazyloaded", {}, !0, !0) }, e(h, g)), i = j.getAttribute("data-poster"), i && (a.detail.firesLoad = !0, g = function () { j.poster = i, a.detail.firesLoad = !1, c.fire(j, "_lazyloaded", {}, !0, !0) }, e(i, g)) } } }, !1)) }); -------------------------------------------------------------------------------- /CleanBlog.Web/scripts/pleasedontgo.js: -------------------------------------------------------------------------------- 1 | var PDG = PDG || { 2 | isOriginalTitle: true, 3 | originalTitle: '', 4 | leaveMessage: '😥 Please dont go!!!', 5 | init: function() { 6 | PDG.originalTitle = document.title; 7 | PDG.listeners(); 8 | }, 9 | listeners: function() { 10 | document.addEventListener('mouseout', function(e) { 11 | if(PDG.isOriginalTitle) 12 | { 13 | PDG.updateTitle(); 14 | } 15 | }, false); 16 | 17 | document.addEventListener('mousemove', function(e) { 18 | if(!PDG.isOriginalTitle) 19 | { 20 | PDG.resetTitle(); 21 | } 22 | }, false); 23 | }, 24 | resetTitle: function() { 25 | document.title = PDG.originalTitle; 26 | PDG.isOriginalTitle = true; 27 | }, 28 | updateTitle: function() { 29 | document.title = PDG.leaveMessage + ' | ' + PDG.originalTitle; 30 | PDG.isOriginalTitle = false; 31 | } 32 | }; -------------------------------------------------------------------------------- /CleanBlog.Web/vendor/bootstrap/css/bootstrap-reboot.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/) 3 | * Copyright 2011-2019 The Bootstrap Authors 4 | * Copyright 2011-2019 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 6 | * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) 7 | */ 8 | *, 9 | *::before, 10 | *::after { 11 | box-sizing: border-box; 12 | } 13 | 14 | html { 15 | font-family: sans-serif; 16 | line-height: 1.15; 17 | -webkit-text-size-adjust: 100%; 18 | -webkit-tap-highlight-color: rgba(0, 0, 0, 0); 19 | } 20 | 21 | article, aside, figcaption, figure, footer, header, hgroup, main, nav, section { 22 | display: block; 23 | } 24 | 25 | body { 26 | margin: 0; 27 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; 28 | font-size: 1rem; 29 | font-weight: 400; 30 | line-height: 1.5; 31 | color: #212529; 32 | text-align: left; 33 | background-color: #fff; 34 | } 35 | 36 | [tabindex="-1"]:focus { 37 | outline: 0 !important; 38 | } 39 | 40 | hr { 41 | box-sizing: content-box; 42 | height: 0; 43 | overflow: visible; 44 | } 45 | 46 | h1, h2, h3, h4, h5, h6 { 47 | margin-top: 0; 48 | margin-bottom: 0.5rem; 49 | } 50 | 51 | p { 52 | margin-top: 0; 53 | margin-bottom: 1rem; 54 | } 55 | 56 | abbr[title], 57 | abbr[data-original-title] { 58 | text-decoration: underline; 59 | -webkit-text-decoration: underline dotted; 60 | text-decoration: underline dotted; 61 | cursor: help; 62 | border-bottom: 0; 63 | -webkit-text-decoration-skip-ink: none; 64 | text-decoration-skip-ink: none; 65 | } 66 | 67 | address { 68 | margin-bottom: 1rem; 69 | font-style: normal; 70 | line-height: inherit; 71 | } 72 | 73 | ol, 74 | ul, 75 | dl { 76 | margin-top: 0; 77 | margin-bottom: 1rem; 78 | } 79 | 80 | ol ol, 81 | ul ul, 82 | ol ul, 83 | ul ol { 84 | margin-bottom: 0; 85 | } 86 | 87 | dt { 88 | font-weight: 700; 89 | } 90 | 91 | dd { 92 | margin-bottom: .5rem; 93 | margin-left: 0; 94 | } 95 | 96 | blockquote { 97 | margin: 0 0 1rem; 98 | } 99 | 100 | b, 101 | strong { 102 | font-weight: bolder; 103 | } 104 | 105 | small { 106 | font-size: 80%; 107 | } 108 | 109 | sub, 110 | sup { 111 | position: relative; 112 | font-size: 75%; 113 | line-height: 0; 114 | vertical-align: baseline; 115 | } 116 | 117 | sub { 118 | bottom: -.25em; 119 | } 120 | 121 | sup { 122 | top: -.5em; 123 | } 124 | 125 | a { 126 | color: #007bff; 127 | text-decoration: none; 128 | background-color: transparent; 129 | } 130 | 131 | a:hover { 132 | color: #0056b3; 133 | text-decoration: underline; 134 | } 135 | 136 | a:not([href]):not([tabindex]) { 137 | color: inherit; 138 | text-decoration: none; 139 | } 140 | 141 | a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus { 142 | color: inherit; 143 | text-decoration: none; 144 | } 145 | 146 | a:not([href]):not([tabindex]):focus { 147 | outline: 0; 148 | } 149 | 150 | pre, 151 | code, 152 | kbd, 153 | samp { 154 | font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; 155 | font-size: 1em; 156 | } 157 | 158 | pre { 159 | margin-top: 0; 160 | margin-bottom: 1rem; 161 | overflow: auto; 162 | } 163 | 164 | figure { 165 | margin: 0 0 1rem; 166 | } 167 | 168 | img { 169 | vertical-align: middle; 170 | border-style: none; 171 | } 172 | 173 | svg { 174 | overflow: hidden; 175 | vertical-align: middle; 176 | } 177 | 178 | table { 179 | border-collapse: collapse; 180 | } 181 | 182 | caption { 183 | padding-top: 0.75rem; 184 | padding-bottom: 0.75rem; 185 | color: #6c757d; 186 | text-align: left; 187 | caption-side: bottom; 188 | } 189 | 190 | th { 191 | text-align: inherit; 192 | } 193 | 194 | label { 195 | display: inline-block; 196 | margin-bottom: 0.5rem; 197 | } 198 | 199 | button { 200 | border-radius: 0; 201 | } 202 | 203 | button:focus { 204 | outline: 1px dotted; 205 | outline: 5px auto -webkit-focus-ring-color; 206 | } 207 | 208 | input, 209 | button, 210 | select, 211 | optgroup, 212 | textarea { 213 | margin: 0; 214 | font-family: inherit; 215 | font-size: inherit; 216 | line-height: inherit; 217 | } 218 | 219 | button, 220 | input { 221 | overflow: visible; 222 | } 223 | 224 | button, 225 | select { 226 | text-transform: none; 227 | } 228 | 229 | select { 230 | word-wrap: normal; 231 | } 232 | 233 | button, 234 | [type="button"], 235 | [type="reset"], 236 | [type="submit"] { 237 | -webkit-appearance: button; 238 | } 239 | 240 | button:not(:disabled), 241 | [type="button"]:not(:disabled), 242 | [type="reset"]:not(:disabled), 243 | [type="submit"]:not(:disabled) { 244 | cursor: pointer; 245 | } 246 | 247 | button::-moz-focus-inner, 248 | [type="button"]::-moz-focus-inner, 249 | [type="reset"]::-moz-focus-inner, 250 | [type="submit"]::-moz-focus-inner { 251 | padding: 0; 252 | border-style: none; 253 | } 254 | 255 | input[type="radio"], 256 | input[type="checkbox"] { 257 | box-sizing: border-box; 258 | padding: 0; 259 | } 260 | 261 | input[type="date"], 262 | input[type="time"], 263 | input[type="datetime-local"], 264 | input[type="month"] { 265 | -webkit-appearance: listbox; 266 | } 267 | 268 | textarea { 269 | overflow: auto; 270 | resize: vertical; 271 | } 272 | 273 | fieldset { 274 | min-width: 0; 275 | padding: 0; 276 | margin: 0; 277 | border: 0; 278 | } 279 | 280 | legend { 281 | display: block; 282 | width: 100%; 283 | max-width: 100%; 284 | padding: 0; 285 | margin-bottom: .5rem; 286 | font-size: 1.5rem; 287 | line-height: inherit; 288 | color: inherit; 289 | white-space: normal; 290 | } 291 | 292 | progress { 293 | vertical-align: baseline; 294 | } 295 | 296 | [type="number"]::-webkit-inner-spin-button, 297 | [type="number"]::-webkit-outer-spin-button { 298 | height: auto; 299 | } 300 | 301 | [type="search"] { 302 | outline-offset: -2px; 303 | -webkit-appearance: none; 304 | } 305 | 306 | [type="search"]::-webkit-search-decoration { 307 | -webkit-appearance: none; 308 | } 309 | 310 | ::-webkit-file-upload-button { 311 | font: inherit; 312 | -webkit-appearance: button; 313 | } 314 | 315 | output { 316 | display: inline-block; 317 | } 318 | 319 | summary { 320 | display: list-item; 321 | cursor: pointer; 322 | } 323 | 324 | template { 325 | display: none; 326 | } 327 | 328 | [hidden] { 329 | display: none !important; 330 | } 331 | /*# sourceMappingURL=bootstrap-reboot.css.map */ -------------------------------------------------------------------------------- /CleanBlog.Web/vendor/bootstrap/css/bootstrap-reboot.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/) 3 | * Copyright 2011-2019 The Bootstrap Authors 4 | * Copyright 2011-2019 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 6 | * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) 7 | */*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important} 8 | /*# sourceMappingURL=bootstrap-reboot.min.css.map */ -------------------------------------------------------------------------------- /CleanBlog.Web/vendor/fontawesome-free/css/brands.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.11.2 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face { 6 | font-family: 'Font Awesome 5 Brands'; 7 | font-style: normal; 8 | font-weight: normal; 9 | font-display: auto; 10 | src: url("../webfonts/fa-brands-400.eot"); 11 | src: url("../webfonts/fa-brands-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.woff") format("woff"), url("../webfonts/fa-brands-400.ttf") format("truetype"), url("../webfonts/fa-brands-400.svg#fontawesome") format("svg"); } 12 | 13 | .fab { 14 | font-family: 'Font Awesome 5 Brands'; } 15 | -------------------------------------------------------------------------------- /CleanBlog.Web/vendor/fontawesome-free/css/brands.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.11.2 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:normal;font-display:auto;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"} -------------------------------------------------------------------------------- /CleanBlog.Web/vendor/fontawesome-free/css/regular.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.11.2 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face { 6 | font-family: 'Font Awesome 5 Free'; 7 | font-style: normal; 8 | font-weight: 400; 9 | font-display: auto; 10 | src: url("../webfonts/fa-regular-400.eot"); 11 | src: url("../webfonts/fa-regular-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.woff") format("woff"), url("../webfonts/fa-regular-400.ttf") format("truetype"), url("../webfonts/fa-regular-400.svg#fontawesome") format("svg"); } 12 | 13 | .far { 14 | font-family: 'Font Awesome 5 Free'; 15 | font-weight: 400; } 16 | -------------------------------------------------------------------------------- /CleanBlog.Web/vendor/fontawesome-free/css/regular.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.11.2 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:auto;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-family:"Font Awesome 5 Free";font-weight:400} -------------------------------------------------------------------------------- /CleanBlog.Web/vendor/fontawesome-free/css/solid.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.11.2 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face { 6 | font-family: 'Font Awesome 5 Free'; 7 | font-style: normal; 8 | font-weight: 900; 9 | font-display: auto; 10 | src: url("../webfonts/fa-solid-900.eot"); 11 | src: url("../webfonts/fa-solid-900.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.woff") format("woff"), url("../webfonts/fa-solid-900.ttf") format("truetype"), url("../webfonts/fa-solid-900.svg#fontawesome") format("svg"); } 12 | 13 | .fa, 14 | .fas { 15 | font-family: 'Font Awesome 5 Free'; 16 | font-weight: 900; } 17 | -------------------------------------------------------------------------------- /CleanBlog.Web/vendor/fontawesome-free/css/solid.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.11.2 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.fas{font-family:"Font Awesome 5 Free";font-weight:900} -------------------------------------------------------------------------------- /CleanBlog.Web/vendor/fontawesome-free/css/svg-with-js.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.11.2 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | .svg-inline--fa,svg:not(:root).svg-inline--fa{overflow:visible}.svg-inline--fa{display:inline-block;font-size:inherit;height:1em;vertical-align:-.125em}.svg-inline--fa.fa-lg{vertical-align:-.225em}.svg-inline--fa.fa-w-1{width:.0625em}.svg-inline--fa.fa-w-2{width:.125em}.svg-inline--fa.fa-w-3{width:.1875em}.svg-inline--fa.fa-w-4{width:.25em}.svg-inline--fa.fa-w-5{width:.3125em}.svg-inline--fa.fa-w-6{width:.375em}.svg-inline--fa.fa-w-7{width:.4375em}.svg-inline--fa.fa-w-8{width:.5em}.svg-inline--fa.fa-w-9{width:.5625em}.svg-inline--fa.fa-w-10{width:.625em}.svg-inline--fa.fa-w-11{width:.6875em}.svg-inline--fa.fa-w-12{width:.75em}.svg-inline--fa.fa-w-13{width:.8125em}.svg-inline--fa.fa-w-14{width:.875em}.svg-inline--fa.fa-w-15{width:.9375em}.svg-inline--fa.fa-w-16{width:1em}.svg-inline--fa.fa-w-17{width:1.0625em}.svg-inline--fa.fa-w-18{width:1.125em}.svg-inline--fa.fa-w-19{width:1.1875em}.svg-inline--fa.fa-w-20{width:1.25em}.svg-inline--fa.fa-pull-left{margin-right:.3em;width:auto}.svg-inline--fa.fa-pull-right{margin-left:.3em;width:auto}.svg-inline--fa.fa-border{height:1.5em}.svg-inline--fa.fa-li{width:2em}.svg-inline--fa.fa-fw{width:1.25em}.fa-layers svg.svg-inline--fa{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0}.fa-layers{display:inline-block;height:1em;position:relative;text-align:center;vertical-align:-.125em;width:1em}.fa-layers svg.svg-inline--fa{-webkit-transform-origin:center center;transform-origin:center center}.fa-layers-counter,.fa-layers-text{display:inline-block;position:absolute;text-align:center}.fa-layers-text{left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transform-origin:center center;transform-origin:center center}.fa-layers-counter{background-color:#ff253a;border-radius:1em;-webkit-box-sizing:border-box;box-sizing:border-box;color:#fff;height:1.5em;line-height:1;max-width:5em;min-width:1.5em;overflow:hidden;padding:.25em;right:0;text-overflow:ellipsis;top:0;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:top right;transform-origin:top right}.fa-layers-bottom-right{bottom:0;right:0;top:auto;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:bottom right;transform-origin:bottom right}.fa-layers-bottom-left{bottom:0;left:0;right:auto;top:auto;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:bottom left;transform-origin:bottom left}.fa-layers-top-right{right:0;top:0;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:top right;transform-origin:top right}.fa-layers-top-left{left:0;right:auto;top:0;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:top left;transform-origin:top left}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;position:relative;width:2.5em}.fa-stack-1x,.fa-stack-2x{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0}.svg-inline--fa.fa-stack-1x{height:1em;width:1.25em}.svg-inline--fa.fa-stack-2x{height:2em;width:2.5em}.fa-inverse{color:#fff}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.svg-inline--fa .fa-primary{fill:var(--fa-primary-color,currentColor);opacity:1;opacity:var(--fa-primary-opacity,1)}.svg-inline--fa .fa-secondary{fill:var(--fa-secondary-color,currentColor)}.svg-inline--fa .fa-secondary,.svg-inline--fa.fa-swap-opacity .fa-primary{opacity:.4;opacity:var(--fa-secondary-opacity,.4)}.svg-inline--fa.fa-swap-opacity .fa-secondary{opacity:1;opacity:var(--fa-primary-opacity,1)}.svg-inline--fa mask .fa-primary,.svg-inline--fa mask .fa-secondary{fill:#000}.fad.fa-inverse{color:#fff} -------------------------------------------------------------------------------- /CleanBlog.Web/vendor/fontawesome-free/webfonts/fa-brands-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prjseal/Umbraco-v8-Tutorial/59ce1f5ad963aeb896f87e3a933d751c42639f9a/CleanBlog.Web/vendor/fontawesome-free/webfonts/fa-brands-400.eot -------------------------------------------------------------------------------- /CleanBlog.Web/vendor/fontawesome-free/webfonts/fa-brands-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prjseal/Umbraco-v8-Tutorial/59ce1f5ad963aeb896f87e3a933d751c42639f9a/CleanBlog.Web/vendor/fontawesome-free/webfonts/fa-brands-400.ttf -------------------------------------------------------------------------------- /CleanBlog.Web/vendor/fontawesome-free/webfonts/fa-brands-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prjseal/Umbraco-v8-Tutorial/59ce1f5ad963aeb896f87e3a933d751c42639f9a/CleanBlog.Web/vendor/fontawesome-free/webfonts/fa-brands-400.woff -------------------------------------------------------------------------------- /CleanBlog.Web/vendor/fontawesome-free/webfonts/fa-brands-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prjseal/Umbraco-v8-Tutorial/59ce1f5ad963aeb896f87e3a933d751c42639f9a/CleanBlog.Web/vendor/fontawesome-free/webfonts/fa-brands-400.woff2 -------------------------------------------------------------------------------- /CleanBlog.Web/vendor/fontawesome-free/webfonts/fa-regular-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prjseal/Umbraco-v8-Tutorial/59ce1f5ad963aeb896f87e3a933d751c42639f9a/CleanBlog.Web/vendor/fontawesome-free/webfonts/fa-regular-400.eot -------------------------------------------------------------------------------- /CleanBlog.Web/vendor/fontawesome-free/webfonts/fa-regular-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prjseal/Umbraco-v8-Tutorial/59ce1f5ad963aeb896f87e3a933d751c42639f9a/CleanBlog.Web/vendor/fontawesome-free/webfonts/fa-regular-400.ttf -------------------------------------------------------------------------------- /CleanBlog.Web/vendor/fontawesome-free/webfonts/fa-regular-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prjseal/Umbraco-v8-Tutorial/59ce1f5ad963aeb896f87e3a933d751c42639f9a/CleanBlog.Web/vendor/fontawesome-free/webfonts/fa-regular-400.woff -------------------------------------------------------------------------------- /CleanBlog.Web/vendor/fontawesome-free/webfonts/fa-regular-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prjseal/Umbraco-v8-Tutorial/59ce1f5ad963aeb896f87e3a933d751c42639f9a/CleanBlog.Web/vendor/fontawesome-free/webfonts/fa-regular-400.woff2 -------------------------------------------------------------------------------- /CleanBlog.Web/vendor/fontawesome-free/webfonts/fa-solid-900.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prjseal/Umbraco-v8-Tutorial/59ce1f5ad963aeb896f87e3a933d751c42639f9a/CleanBlog.Web/vendor/fontawesome-free/webfonts/fa-solid-900.eot -------------------------------------------------------------------------------- /CleanBlog.Web/vendor/fontawesome-free/webfonts/fa-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prjseal/Umbraco-v8-Tutorial/59ce1f5ad963aeb896f87e3a933d751c42639f9a/CleanBlog.Web/vendor/fontawesome-free/webfonts/fa-solid-900.ttf -------------------------------------------------------------------------------- /CleanBlog.Web/vendor/fontawesome-free/webfonts/fa-solid-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prjseal/Umbraco-v8-Tutorial/59ce1f5ad963aeb896f87e3a933d751c42639f9a/CleanBlog.Web/vendor/fontawesome-free/webfonts/fa-solid-900.woff -------------------------------------------------------------------------------- /CleanBlog.Web/vendor/fontawesome-free/webfonts/fa-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prjseal/Umbraco-v8-Tutorial/59ce1f5ad963aeb896f87e3a933d751c42639f9a/CleanBlog.Web/vendor/fontawesome-free/webfonts/fa-solid-900.woff2 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Umbraco-v8-Tutorial 2 | 3 | GitHub repository for people following along with my [YouTube Video Series](https://www.youtube.com/playlist?list=PL90L_HquhD-_N2mO8kYzhZL15sh1lyxVK) 4 | --------------------------------------------------------------------------------