diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 000000000..0f99e80f6 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,3 @@ +output/ +.vs/ +cache/ diff --git a/docs/Program.cs b/docs/Program.cs new file mode 100644 index 000000000..4eb853462 --- /dev/null +++ b/docs/Program.cs @@ -0,0 +1,15 @@ +using System.Threading.Tasks; +using Statiq.App; +using Statiq.Docs; + +namespace docs +{ + public class Program + { + public static async Task Main(string[] args) => + await Bootstrapper + .Factory + .CreateDocs(args) + .RunAsync(); + } +} diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000..e507cbbd0 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,5 @@ +# Preview docs + +``` +dotnet run -- preview +``` diff --git a/docs/docs.csproj b/docs/docs.csproj new file mode 100644 index 000000000..d4ad91d94 --- /dev/null +++ b/docs/docs.csproj @@ -0,0 +1,24 @@ + + + + Exe + net6.0 + + + + + + + + + + + + + + + + + diff --git a/docs/docs.sln b/docs/docs.sln new file mode 100644 index 000000000..3600daed2 --- /dev/null +++ b/docs/docs.sln @@ -0,0 +1,34 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.6.30114.105 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "docs", "docs.csproj", "{C7FC1074-EE53-4787-8E49-F3805698606D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C7FC1074-EE53-4787-8E49-F3805698606D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C7FC1074-EE53-4787-8E49-F3805698606D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C7FC1074-EE53-4787-8E49-F3805698606D}.Debug|x64.ActiveCfg = Debug|Any CPU + {C7FC1074-EE53-4787-8E49-F3805698606D}.Debug|x64.Build.0 = Debug|Any CPU + {C7FC1074-EE53-4787-8E49-F3805698606D}.Debug|x86.ActiveCfg = Debug|Any CPU + {C7FC1074-EE53-4787-8E49-F3805698606D}.Debug|x86.Build.0 = Debug|Any CPU + {C7FC1074-EE53-4787-8E49-F3805698606D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C7FC1074-EE53-4787-8E49-F3805698606D}.Release|Any CPU.Build.0 = Release|Any CPU + {C7FC1074-EE53-4787-8E49-F3805698606D}.Release|x64.ActiveCfg = Release|Any CPU + {C7FC1074-EE53-4787-8E49-F3805698606D}.Release|x64.Build.0 = Release|Any CPU + {C7FC1074-EE53-4787-8E49-F3805698606D}.Release|x86.ActiveCfg = Release|Any CPU + {C7FC1074-EE53-4787-8E49-F3805698606D}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/docs/input/dap.md b/docs/input/dap.md new file mode 100644 index 000000000..5262e01e3 --- /dev/null +++ b/docs/input/dap.md @@ -0,0 +1,4 @@ +Title: Debug Adapter Protocol +ShowInSidebar: true +Order: 3 +--- diff --git a/docs/input/index.md b/docs/input/index.md new file mode 100644 index 000000000..ebb15a4d9 --- /dev/null +++ b/docs/input/index.md @@ -0,0 +1,9 @@ +Title: C# Language Server Protocol +NoSidebar: false +ShowInSidebar: false +NoTitle: true +--- + +# Welcome! + +You can explore the documentation by selecting sections from the navigation bar above. diff --git a/docs/jsonrpc.md b/docs/input/jsonrpc.md similarity index 98% rename from docs/jsonrpc.md rename to docs/input/jsonrpc.md index 6036073f2..f563046bf 100644 --- a/docs/jsonrpc.md +++ b/docs/input/jsonrpc.md @@ -1,3 +1,8 @@ +Title: JSON RPC +ShowInSidebar: true +Order: 2 +--- + # Using Json Rpc Standalone One of the benefits of the [JSON-RPC protocol](https://www.jsonrpc.org/specification) is that communication can be fully bi-directional. Through some sort of interface agreement, like LSP / DAP, both sides can act as both client (sender) and server (reciever). diff --git a/docs/lsp.md b/docs/input/lsp.md similarity index 99% rename from docs/lsp.md rename to docs/input/lsp.md index 305ad1f2b..4344e9f16 100644 --- a/docs/lsp.md +++ b/docs/input/lsp.md @@ -1,3 +1,8 @@ +Title: Language Server Protocol +ShowInSidebar: true +Order: 1 +--- + # Implementing the Language Server Protocol The goal of this library is to implement [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) as closely as possible diff --git a/docs/source-generation.md b/docs/input/source-generation.md similarity index 99% rename from docs/source-generation.md rename to docs/input/source-generation.md index 717bc2480..021f8510a 100644 --- a/docs/source-generation.md +++ b/docs/input/source-generation.md @@ -1,3 +1,8 @@ +Title: Source Generators +ShowInSidebar: true +Order: 4 +--- + # Source Generators We have built a few source generators to help with aid with implementing the plumbing of all the things. The goals of using source generation this way is to ensure that errors and mistakes are avoided and don't cause issues. diff --git a/docs/settings.yml b/docs/settings.yml new file mode 100644 index 000000000..0fd1533dc --- /dev/null +++ b/docs/settings.yml @@ -0,0 +1,4 @@ +# solutionFiles: +# - ../../LSP.sln +sourceFiles: + - ../../src/**/{!.git,!bin,!obj,!packages,!*.Tests,}/**/*.cs diff --git a/docs/theme/DocsTable.cs b/docs/theme/DocsTable.cs new file mode 100644 index 000000000..42ba41210 --- /dev/null +++ b/docs/theme/DocsTable.cs @@ -0,0 +1,17 @@ +using Statiq.Common; +using System.Collections.Generic; + +namespace Generator +{ + /// + /// This model is used for the DocsTable partial that renders documents, titles, headers, and summaries as a table. + /// + public class DocsTable + { + public IList Docs { get; set; } = new List(); + public string Title { get; set; } = string.Empty; + public string Header { get; set; } = string.Empty; + public bool HasSummary { get; set; } + public bool LinkTypeArguments { get; set; } = true; + } +} diff --git a/docs/theme/Extensions.cs b/docs/theme/Extensions.cs new file mode 100644 index 000000000..2f7d1b55b --- /dev/null +++ b/docs/theme/Extensions.cs @@ -0,0 +1,175 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Html; +using Statiq.CodeAnalysis; +using Statiq.Common; +using Statiq.Html; + +namespace Generator +{ + /// + /// Extensions used by the views. + /// + public static class Extensions + { + public static HtmlString Name(this IDocument document) => new HtmlString(FormatName(document.GetString(CodeAnalysisKeys.DisplayName))); + + public static HtmlString GetTypeLink(this IExecutionContext context, IDocument document) => context.GetTypeLink(document, null, true); + + public static HtmlString GetTypeLink(this IExecutionContext context, IDocument document, bool linkTypeArguments) => context.GetTypeLink(document, null, linkTypeArguments); + + public static HtmlString GetTypeLink(this IExecutionContext context, IDocument document, string name) => context.GetTypeLink(document, name, true); + + public static HtmlString GetTypeLink(this IExecutionContext context, IDocument document, string name, bool linkTypeArguments) + { + name = name ?? document.GetString(CodeAnalysisKeys.DisplayName); + + // Link nullable types to their type argument + if (document.GetString("Name") == "Nullable") + { + IDocument nullableType = document.GetDocumentList(CodeAnalysisKeys.TypeArguments)?.FirstOrDefault(); + if (nullableType != null) + { + return context.GetTypeLink(nullableType, name); + } + } + + // If it wasn't nullable, format the name + name = FormatName(name); + + // Link the type and type parameters seperatly for generic types + IReadOnlyList typeArguments = document.GetDocumentList(CodeAnalysisKeys.TypeArguments); + if (typeArguments?.Count > 0) + { + // Link to the original definition of the generic type + document = document.GetDocument(CodeAnalysisKeys.OriginalDefinition) ?? document; + + if (linkTypeArguments) + { + // Get the type argument positions + int begin = name.IndexOf("<") + 9; + int openParen = name.IndexOf(">("); + int end = name.LastIndexOf(">", openParen == -1 ? name.Length : openParen); // Don't look past the opening paren if there is one + + // Remove existing type arguments and insert linked type arguments (do this first to preserve original indexes) + if (end - begin > 0) + { + name = name + .Remove(begin, end - begin) + .Insert(begin, string.Join(", ", typeArguments.Select(x => context.GetTypeLink(x, true).Value))); + + // Insert the link for the type + if (!document.Destination.IsNull) + { + name = name.Insert(begin - 9, "").Insert(0, $""); + } + } + + return new HtmlString(name); + } + } + + // If it's a type parameter, create an anchor link to the declaring type's original definition + if (document.GetString("Kind") == "TypeParameter") + { + IDocument declaringType = document.GetDocument(CodeAnalysisKeys.DeclaringType)?.GetDocument(CodeAnalysisKeys.OriginalDefinition); + if (declaringType != null) + { + return new HtmlString(declaringType.Destination.IsNull + ? name + : $"{name}"); + } + } + + return new HtmlString(document.Destination.IsNull + ? name + : $"{name}"); + } + + // https://stackoverflow.com/a/3143036/807064 + private static IEnumerable SplitAndKeep(this string s, params char[] delims) + { + int start = 0, index; + + while ((index = s.IndexOfAny(delims, start)) != -1) + { + if (index - start > 0) + { + yield return s.Substring(start, index - start); + } + + yield return s.Substring(index, 1); + start = index + 1; + } + + if (start < s.Length) + { + yield return s.Substring(start); + } + } + + private static string FormatName(string name) + { + if (name == null) + { + return string.Empty; + } + + // Encode and replace .()<> with word break opportunities + name = WebUtility.HtmlEncode(name) + .Replace(".", ".") + .Replace("(", "(") + .Replace(")", ")") + .Replace(", ", ", ") + .Replace("<", "<") + .Replace(">", ">"); + + // Add additional break opportunities in long un-broken segments + List segments = name.Split(new[] { "" }, StringSplitOptions.None).ToList(); + bool replaced = false; + for (int c = 0; c < segments.Count; c++) + { + if (segments[c].Length > 20) + { + segments[c] = new string(segments[c] + .SelectMany((x, i) => char.IsUpper(x) && i != 0 ? new[] { '<', 'w', 'b', 'r', '>', x } : new[] { x }) + .ToArray()); + replaced = true; + } + } + + return replaced ? string.Join("", segments) : name; + } + + /// + /// Generates links to each heading on a page and returns a string containing all of the links. + /// + public static async Task GenerateInfobarHeadingsAsync(this IExecutionContext context, IDocument document) + { + StringBuilder content = new StringBuilder(); + IReadOnlyList headings = document.GetDocumentList(HtmlKeys.Headings); + if (headings != null) + { + foreach (IDocument heading in headings) + { + string id = heading.GetString(HtmlKeys.HeadingId); + if (id != null) + { + content.AppendLine($"

{await heading.GetContentStringAsync()}

"); + } + } + } + if (content.Length > 0) + { + content.Insert(0, "
On This Page
"); + content.AppendLine("
"); + return content.ToString(); + } + return null; + } + } +} \ No newline at end of file diff --git a/docs/theme/README.md b/docs/theme/README.md new file mode 100644 index 000000000..bd1858f86 --- /dev/null +++ b/docs/theme/README.md @@ -0,0 +1,100 @@ +This is a samson docs theme adapted from ?. + +# Installation + +Statiq themes go in a `theme` folder alongside your `input` folder. If your site is inside a git repository, you can add the theme as a git submodule: + +``` +git submodule add https://github.com/statiqdev/Samson.git theme +``` + +Alternatively you can clone the theme directly: + +``` +git clone https://github.com/statiqdev/Samson.git theme +``` + +Once inside the `theme` folder, Statiq will automatically recognize the theme. If you want to tweak the theme you can edit files directly in the `theme` folder or copy them to your `input` folder and edit them there. + +# Settings + +## Global + +**TODO** + +## Page + +**TODO** + +## Calculated + +The following keys are calculated in `settings.yml` and can be overridden by providing new values in your settings or front matter or used from your own pages. + +**TODO** + +# Partials + +Replace or copy any of these Razor partials in your `input` folder to override sections of the site: + +**TODO** + +# Sections + +In addition to globally changing sections of the site using the partials above you can also add the following Razor sections to any given page to override them for that page (which will typically disable the use of the corresponding partial): + +**TODO** + +# Index Page + +You can provide your own `index.cshtml` (or `index.md`) if you like and that will override the default index page. You'll _have_ to provide your own index page if you don't +include any blog posts since the default index page is an archive of posts. + +# Styles + +To add new styles or override existing ones, create an input file at `scss/_overrides.scss` and add Sass styles there. + +# Porting From Wyam + +This Samson theme is roughly compatible with the Wyam Samson theme. Some notes if you're porting: + +- You will need to [create a Statiq Docs app](https://statiq.dev/docs/) at the root of your site (you can keep the `input` directory). + - Run `dotnet new console` at the root of your site. + - Run `dotnet add package Statiq.Docs --version x.y.z` (using the [latest Statiq Docs version](https://www.nuget.org/packages/Statiq.Docs)). + - Change the generated `Program` class in `Program.cs` to: + +``` +using System; +using System.Threading.Tasks; +using Statiq.App; +using Statiq.Docs; + +namespace ... +{ + public class Program + { + public static async Task Main(string[] args) => + await Bootstrapper + .Factory + .CreateDocs(args) + .RunAsync(); + } +} +``` + +- Follow the [installation instructions above](#installation) to install the theme into your site. + +- Create a `settings.yml` file at the root of your site and copy over settings from your `config.wyam` file + - Since the new settings file is YAML you don't need to prefix strings or anything, for example `Settings[Keys.Host] = "daveaglick.com";` becomes `Host: daveaglick.com`. + - If you defined a global "Title" setting in `config.wyam` the new theme should set "SiteTitle" instead (and if not, a "SiteTitle" should be defined). + - If you defined an "Intro" setting, that should be placed in a new `_index.yml` file in your `input` directory with a key of "Description". + +- If you created an `input/assets/css/override.css` file, move it to `input/scss/_overrides.scss` (and you can now use Sass inside the CSS overrides file). + +- Replace any uses of `img-response` CSS class with `img-fluid` since this theme uses a newer version of Bootstrap and that CSS class changed. + +- Rename and fix up any override theme files or partials according to the supported ones documented above. + - For example, the old Wyam CleanBlog supported a `_PostFooter.cshtml` which should be renamed to `_post-footer.cshtml`. + - The CSS may not match exactly since the new CleanBlog theme is based on the most recent CleanBlog project so you may need to take a look at the default partial implementations in this theme and adjust your override files accordingly. + +- You can likely remove any build scripting and bootstrapping code since you can now run `dotnet run -- preview` to preview the site. + - You can also now setup [built-in deployment](https://statiq.dev/web/deployment/). diff --git a/docs/theme/SamsonKeys.cs b/docs/theme/SamsonKeys.cs new file mode 100644 index 000000000..e59b7bb19 --- /dev/null +++ b/docs/theme/SamsonKeys.cs @@ -0,0 +1,303 @@ +using System; +using System.Collections.Generic; + +namespace Generator +{ + /// + /// Metadata keys used by the docs recipe. + /// + public static class SamsonKeys + { + /// + /// The title of the site, post, or page. + /// + /// + public const string Title = nameof(Title); + + /// + /// The path to a logo to use for the site. + /// + /// + public const string Logo = nameof(Logo); + + /// + /// The base URL for generating edit links for content and blog pages. + /// The edit link combines this base URL with the relative path of the + /// input file. + /// + /// + public const string BaseEditUrl = nameof(BaseEditUrl); + + /// + /// Controls whether type names from the API enclosed in code fences in either + /// blog posts or content pages should be automatically linked to the + /// corresponding API documentation page (the default is true). + /// + /// + public const string AutoLinkTypes = nameof(AutoLinkTypes); + + /// + /// Set to false to prevent a search index for API types from being + /// generated and presented on the API pages. + /// + /// + public const string SearchIndex = nameof(SearchIndex); + + /// + /// The page size for blog index pages (the default is 5). + /// + /// + public const string BlogPageSize = nameof(BlogPageSize); + + /// + /// The page size for blog category index pages (the default is 5). + /// + /// + public const string CategoryPageSize = nameof(CategoryPageSize); + + /// + /// The page size for blog tag index pages (the default is 5). + /// + /// + public const string TagPageSize = nameof(TagPageSize); + + /// + /// The page size for blog author index pages (the default is 5). + /// + /// + public const string AuthorPageSize = nameof(AuthorPageSize); + + /// + /// The page size for blog monthly index pages (the default is 5). + /// + /// + public const string MonthPageSize = nameof(MonthPageSize); + + /// + /// The page size for blog yearly index pages (the default is 5). + /// + /// + public const string YearPageSize = nameof(YearPageSize); + + /// + /// Specifies the path where the blog RSS file will be output. + /// The default value is feed.rss. Set to null + /// to prevent generating an RSS feed. + /// + /// or + public const string BlogRssPath = nameof(BlogRssPath); + + /// + /// Specifies the path where the blog Atom file will be output. + /// The default value is feed.atom. Set to null + /// to prevent generating an Atom feed. + /// + /// or + public const string BlogAtomPath = nameof(BlogAtomPath); + + /// + /// Specifies the path where the blog RDF file will be output. + /// The default value is null which + /// prevents generating an RDF feed. + /// + /// or + public const string BlogRdfPath = nameof(BlogRdfPath); + + /// + /// Used to provide a description for pages and blog posts that can be used + /// in the meta description tag and also for page listings. + /// + /// + public const string Description = nameof(Description); + + /// + /// Used by blog posts to indicate the category of the post. + /// Also used by pages to indicate the category of the page. + /// + /// + public const string Category = nameof(Category); + + /// + /// The tags for a given post. + /// + /// or IEnumerable<string> + public const string Tags = nameof(Tags); + + /// + /// Set to true to make category groupings case-insensitive. + /// + /// + public const string CaseInsensitiveCategories = nameof(CaseInsensitiveCategories); + + /// + /// Set to true to make tag groupings case-insensitive. + /// + /// + public const string CaseInsensitiveTags = nameof(CaseInsensitiveTags); + + /// + /// Set to true to make author groupings case-insensitive. + /// + /// + public const string CaseInsensitiveAuthors = nameof(CaseInsensitiveAuthors); + + /// + /// Indicates the relative order of pages to each other. If + /// no value is supplied for a document, the default order + /// is 1000 (I.e., after most pages that do have a defined + /// order). + /// + /// + public const string Order = nameof(Order); + + /// + /// Setting this to true for a document will remove the + /// sidebar from the page. + /// + /// + public const string NoSidebar = nameof(NoSidebar); + + /// + /// Setting this to true for a document will remove the + /// surrounding container from a page, including the title. + /// + /// + public const string NoContainer = nameof(NoContainer); + + /// + /// Setting this to true for a document will remove the + /// title banner from the page. + /// + /// + public const string NoTitle = nameof(NoTitle); + + /// + /// Setting this to true will remove the gutter area + /// from around a page. + /// + /// + public const string NoGutter = nameof(NoGutter); + + /// + /// Controls the parent path where blog posts are placed. The default is "blog". + /// This affects both input and output files (I.e., if you change this your input + /// files must also be under the same path). + /// + /// or + public const string BlogPath = nameof(BlogPath); + + /// + /// Specifies the blog title. + /// The default value is Blog. + /// + /// + public const string BlogTitle = nameof(BlogTitle); + + /// + /// Used by blog posts and pages to indicate the author. + /// + /// + public const string Author = nameof(Author); + + /// + /// Set to true (the default value is false) to + /// validate all absolute links. Note that this may add considerable + /// time to your generation process. + /// + /// + public const string ValidateAbsoluteLinks = nameof(ValidateAbsoluteLinks); + + /// + /// Set to true (the default value) to + /// validate all relative links. + /// + /// + public const string ValidateRelativeLinks = nameof(ValidateRelativeLinks); + + /// + /// Set to true (the default value is false) to + /// report errors on link validation failures. + /// + /// + public const string ValidateLinksAsError = nameof(ValidateLinksAsError); + + /// + /// Set to true (the default value) to generate meta refresh pages + /// for any redirected documents (as indicated by a RedirectFrom + /// metadata value in the document). + /// + /// + public const string MetaRefreshRedirects = nameof(MetaRefreshRedirects); + + /// + /// Set to true (the default value is false) to generate + /// a Netlify _redirects file from redirected documents + /// (as indicated by a RedirectFrom metadata value). + /// + /// + public const string NetlifyRedirects = nameof(NetlifyRedirects); + + /// + /// Used for blog posts to store the date of the post. + /// + /// or + public const string Published = nameof(Published); + + /// + /// Setting this to true uses + /// the year and date in the output path of blog posts. + /// The default value is false. + /// + /// + public const string IncludeDateInPostPath = nameof(IncludeDateInPostPath); + + /// + /// Set this to control the activated set of Markdown extensions for the + /// Markdig Markdown renderer. The default value is "advanced+bootstrap". + /// + /// + public const string MarkdownConfiguration = nameof(MarkdownConfiguration); + + /// + /// Set this to add extension Markdown extensions for the Markdig Markdown + /// renderer. The default value is null; + /// + /// + public const string MarkdownExtensionTypes = nameof(MarkdownExtensionTypes); + + /// + /// Indicates that include statements should be processed using the module. + /// The default behavior is to process all includes. + /// + /// + public const string ProcessIncludes = nameof(ProcessIncludes); + + /// + /// This should be a string or array of strings with the name(s) + /// of root-level folders to ignore when scanning for content pages. + /// Setting this global metadata value is useful when introducing + /// your own pipelines for files under certain folders and you don't + /// want the primary content page pipelines to pick them up. + /// + /// or IEnumerable<string> + public const string IgnoreFolders = nameof(IgnoreFolders); + + /// + /// Set to false to hide a particular page from the top-level navigation bar. + /// + /// + public const string ShowInNavbar = nameof(ShowInNavbar); + + /// + /// Set to false to hide a particular page from the side navigation bar. + /// + /// + public const string ShowInSidebar = nameof(ShowInSidebar); + + /// + /// Set to true to prepend a configured LinkRoot to all root-relative Markdown links. + /// + /// + public const string MarkdownPrependLinkRoot = nameof(MarkdownPrependLinkRoot); + } +} diff --git a/docs/theme/input/ApiIndex.cshtml b/docs/theme/input/ApiIndex.cshtml new file mode 100644 index 000000000..bea3e9304 --- /dev/null +++ b/docs/theme/input/ApiIndex.cshtml @@ -0,0 +1,22 @@ +Title: API +DestinationFileName: => Settings.GetPath(DocsKeys.ApiPath).Combine("index.html") +--- + +@section Search { + @Html.Partial("_ApiSearch") +} + +@{ + Layout = "/_Layout.cshtml"; + @Html.Partial("Section\\_DocsTable", new DocsTable +{ + Docs = Outputs.FromPipeline(nameof(Statiq.Docs.Pipelines.Api)) + .Where(x => x.GetString("Kind") == "Namespace") + .OrderBy(x => x.GetString("DisplayName")) + .ToList(), + Title = "Namespaces", + Header = "Namespace", + HasSummary = true, + LinkTypeArguments = false +}); +} \ No newline at end of file diff --git a/docs/theme/input/ApiSymbol.cshtml b/docs/theme/input/ApiSymbol.cshtml new file mode 100644 index 000000000..372035bf1 --- /dev/null +++ b/docs/theme/input/ApiSymbol.cshtml @@ -0,0 +1,7 @@ +Enumerate: => Outputs.FromPipeline(nameof(Statiq.Docs.Pipelines.Api)) +DestinationFileName: => Document.GetDocument("Current")["Destination"] +--- + +@{ + Layout = "/_ApiLayout.cshtml"; +} diff --git a/docs/theme/input/Shared/Kind/_Assembly.cshtml b/docs/theme/input/Shared/Kind/_Assembly.cshtml new file mode 100644 index 000000000..aa614a4b2 --- /dev/null +++ b/docs/theme/input/Shared/Kind/_Assembly.cshtml @@ -0,0 +1,14 @@ +@foreach(IGrouping typeGroup + in Outputs.FromPipeline(nameof(Statiq.Docs.Pipelines.Api)) + .Where(x => x.GetBool("IsResult") && x["Kind"].Equals("NamedType") && x.GetDocument("ContainingAssembly") == Model) + .GroupBy(x => x.GetString("SpecificKind")) + .OrderBy(x => x.Key)) +{ + @Html.Partial("Section\\_DocsTable", new DocsTable + { + Docs = typeGroup.OrderBy(x => x["DisplayName"]).ToList(), + Title = typeGroup.Key + " Types", + Header = typeGroup.Key, + HasSummary = true + }); +} \ No newline at end of file diff --git a/docs/theme/input/Shared/Kind/_Event.cshtml b/docs/theme/input/Shared/Kind/_Event.cshtml new file mode 100644 index 000000000..7de33e697 --- /dev/null +++ b/docs/theme/input/Shared/Kind/_Event.cshtml @@ -0,0 +1,55 @@ +@Html.Partial("Section\\_Summary") +@{ + IDocument containingAssembly = Model.Get("ContainingAssembly"); + IDocument containingNamespace = Model.Get("ContainingNamespace"); + IDocument containingType = Model.Get("ContainingType"); + IDocument type = Model.Get("Type"); + IDocument overridden = Model.Get("Overridden"); + if(containingAssembly != null + || containingNamespace != null + || containingType != null + || type != null + || overridden != null) + { +
+
+
+ @if(containingAssembly != null) + { +
Assembly
+
@Context.GetTypeLink(containingAssembly)
+ } + + @if(containingNamespace != null) + { +
Namespace
+
@Context.GetTypeLink(containingNamespace)
+ } + + @if(containingType != null) + { +
Containing Type
+
@Context.GetTypeLink(containingType)
+ } + + @if(type != null) + { +
Event Type
+
@Context.GetTypeLink(type)
+ } + + @if(overridden != null) + { +
Overridden
+
@Context.GetTypeLink(overridden)
+ } +
+
+
+ } +} + +@Html.Partial("Section\\_Syntax") +@Html.Partial("Section\\_Examples") +@Html.Partial("Section\\_Remarks") +@Html.Partial("Section\\_SeeAlso") \ No newline at end of file diff --git a/docs/theme/input/Shared/Kind/_Field.cshtml b/docs/theme/input/Shared/Kind/_Field.cshtml new file mode 100644 index 000000000..c5281ae93 --- /dev/null +++ b/docs/theme/input/Shared/Kind/_Field.cshtml @@ -0,0 +1,41 @@ +@Html.Partial("Section\\_Summary") +@{ + IDocument containingAssembly = Model.Get("ContainingAssembly"); + IDocument containingNamespace = Model.Get("ContainingNamespace"); + IDocument containingType = Model.Get("ContainingType"); + if(containingAssembly != null + || containingNamespace != null + || containingType != null) + { +
+
+
+ @if(containingAssembly != null) + { +
Assembly
+
@Context.GetTypeLink(containingAssembly)
+ } + + @if(containingNamespace != null) + { +
Namespace
+
@Context.GetTypeLink(containingNamespace)
+ } + + @if(containingType != null) + { +
Containing Type
+
@Context.GetTypeLink(containingType)
+ } +
+
+
+ } +} + +@Html.Partial("Section\\_Syntax") +@Html.Partial("Section\\_Examples") +@Html.Partial("Section\\_Remarks") +@Html.Partial("Section\\_Attributes") +@Html.Partial("Section\\_ConstantValue") +@Html.Partial("Section\\_SeeAlso") \ No newline at end of file diff --git a/docs/theme/input/Shared/Kind/_Method.cshtml b/docs/theme/input/Shared/Kind/_Method.cshtml new file mode 100644 index 000000000..65892efde --- /dev/null +++ b/docs/theme/input/Shared/Kind/_Method.cshtml @@ -0,0 +1,51 @@ +@Html.Partial("Section\\_Summary") +@{ + IDocument containingAssembly = Model.Get("ContainingAssembly"); + IDocument containingNamespace = Model.Get("ContainingNamespace"); + IDocument containingType = Model.Get("ContainingType"); + IDocument overridden = Model.Get("Overridden"); + if(containingAssembly != null + || containingNamespace != null + || containingType != null + || overridden != null) + { +
+
+
+ @if(containingAssembly != null) + { +
Assembly
+
@Context.GetTypeLink(containingAssembly)
+ } + + @if(containingNamespace != null) + { +
Namespace
+
@Context.GetTypeLink(containingNamespace)
+ } + + @if(containingType != null) + { +
Containing Type
+
@Context.GetTypeLink(containingType)
+ } + + @if(overridden != null) + { +
Overridden
+
@Context.GetTypeLink(overridden)
+ } +
+
+
+ } +} + +@Html.Partial("Section\\_Syntax") +@Html.Partial("Section\\_Examples") +@Html.Partial("Section\\_Remarks") +@Html.Partial("Section\\_Attributes") +@Html.Partial("Section\\_TypeParameters") +@Html.Partial("Section\\_Parameters") +@Html.Partial("Section\\_ReturnValue") +@Html.Partial("Section\\_SeeAlso") \ No newline at end of file diff --git a/docs/theme/input/Shared/Kind/_NamedType.cshtml b/docs/theme/input/Shared/Kind/_NamedType.cshtml new file mode 100644 index 000000000..d3b528fa2 --- /dev/null +++ b/docs/theme/input/Shared/Kind/_NamedType.cshtml @@ -0,0 +1,159 @@ +@Html.Partial("Section\\_Summary") +@{ + IDocument containingAssembly = Model.Get(CodeAnalysisKeys.ContainingAssembly); + IDocument containingNamespace = Model.Get(CodeAnalysisKeys.ContainingNamespace); + IReadOnlyList allInterfaces = Model.GetList(CodeAnalysisKeys.AllInterfaces); + IReadOnlyList baseTypes = Model.GetList(CodeAnalysisKeys.BaseTypes); + IReadOnlyList derivedTypes = Model.GetList(CodeAnalysisKeys.DerivedTypes).OrderBy(x => x["DisplayName"]).ThenBy(x => x["FullName"]).ToList(); + IReadOnlyList implementingTypes = Model.GetList(CodeAnalysisKeys.ImplementingTypes).OrderBy(x => x["DisplayName"]).ThenBy(x => x["FullName"]).ToList(); + if(containingAssembly != null + || containingNamespace != null + || (allInterfaces != null && allInterfaces.Count > 0) + || (baseTypes != null && baseTypes.Count > 0) + || (derivedTypes != null && derivedTypes.Count > 0) + || (implementingTypes != null && implementingTypes.Count > 0)) + { +
+
+
+
+
+ @if(containingAssembly != null) + { +
Assembly
+
@Context.GetTypeLink(containingAssembly)
+ } + + @if(containingNamespace != null) + { +
Namespace
+
@Context.GetTypeLink(containingNamespace)
+ } + + @if(allInterfaces != null && allInterfaces.Count > 0) + { +
Interfaces
+
+
    + @foreach(IDocument interfaceDocument in allInterfaces) + { +
  • @Context.GetTypeLink(interfaceDocument)
  • + } +
+
+ } + + @if(baseTypes != null && baseTypes.Count > 0) + { +
Base Types
+
+
    + @foreach(IDocument baseType in baseTypes.Reverse()) + { +
  • @Context.GetTypeLink(baseType)
  • + } +
+
+ } + + @if(derivedTypes != null && derivedTypes.Count > 0) + { +
Derived Types
+
+
    + @foreach(IDocument derivedType in derivedTypes) + { +
  • @Context.GetTypeLink(derivedType)
  • + } +
+
+ } + + @if(implementingTypes != null && implementingTypes.Count > 0) + { +
Implementing Types
+
+
    + @foreach(IDocument implementingType in implementingTypes) + { +
  • @Context.GetTypeLink(implementingType)
  • + } +
+
+ } +
+
+
+ @{ + System.Text.StringBuilder hierarchy = new System.Text.StringBuilder(); + hierarchy.AppendLine("graph BT"); + if(baseTypes != null && baseTypes.Count > 0) + { + for(int b = 0 ; b < baseTypes.Count ; b++) + { + hierarchy.AppendLine($"\t{(b == 0 ? "Type" : "Base" + (b - 1))}-->Base{b}[\"{System.Net.WebUtility.HtmlEncode(baseTypes[b].GetString(CodeAnalysisKeys.DisplayName))}\"]"); + if(!baseTypes[b].Destination.IsNull) + { + hierarchy.AppendLine($"\tclick Base{b} \"{(Context.GetLink(baseTypes[b].Destination))}\""); + } + } + } + if(allInterfaces != null && allInterfaces.Count > 0) + { + for(int c = 0 ; c < allInterfaces.Count ; c++) + { + hierarchy.AppendLine($"\tType-.->Interface{c}[\"{System.Net.WebUtility.HtmlEncode(allInterfaces[c].GetString(CodeAnalysisKeys.DisplayName))}\"]"); + if(!allInterfaces[c].Destination.IsNull) + { + hierarchy.AppendLine($"\tclick Interface{c} \"{(Context.GetLink(allInterfaces[c].Destination))}\""); + } + } + } + hierarchy.AppendLine($"\tType[\"{System.Net.WebUtility.HtmlEncode(Model.GetString(CodeAnalysisKeys.DisplayName))}\"]"); + hierarchy.AppendLine("class Type type-node"); + if(derivedTypes != null && derivedTypes.Count > 0) + { + for(int c = 0 ; c < derivedTypes.Count ; c++) + { + hierarchy.AppendLine($"\tDerived{c}[\"{System.Net.WebUtility.HtmlEncode(derivedTypes[c].GetString(CodeAnalysisKeys.DisplayName))}\"]-->Type"); + if(!derivedTypes[c].Destination.IsNull) + { + hierarchy.AppendLine($"\tclick Derived{c} \"{(Context.GetLink(derivedTypes[c].Destination))}\""); + } + } + } + if(implementingTypes != null && implementingTypes.Count > 0) + { + for(int c = 0 ; c < implementingTypes.Count ; c++) + { + hierarchy.AppendLine($"\tImplementing{c}[\"{System.Net.WebUtility.HtmlEncode(implementingTypes[c].GetString(CodeAnalysisKeys.DisplayName))}\"]-.->Type"); + if(!implementingTypes[c].Destination.IsNull) + { + hierarchy.AppendLine($"\tclick Implementing{c} \"{(Context.GetLink(implementingTypes[c].Destination))}\""); + } + } + } + } +
+ @Html.Raw(hierarchy.ToString()) +
+
+
+
+
+ } +} + +@Html.Partial("Section\\_Syntax") +@Html.Partial("Section\\_Examples") +@Html.Partial("Section\\_Remarks") +@Html.Partial("Section\\_Attributes") +@Html.Partial("Section\\_TypeParameters") +@Html.Partial("Section\\_Constructors") +@Html.Partial("Section\\_Events") +@Html.Partial("Section\\_Fields") +@Html.Partial("Section\\_Properties") +@Html.Partial("Section\\_Methods") +@Html.Partial("Section\\_Operators") +@Html.Partial("Section\\_ExtensionMethods") +@Html.Partial("Section\\_SeeAlso") diff --git a/docs/theme/input/Shared/Kind/_Namespace.cshtml b/docs/theme/input/Shared/Kind/_Namespace.cshtml new file mode 100644 index 000000000..f8bd110bc --- /dev/null +++ b/docs/theme/input/Shared/Kind/_Namespace.cshtml @@ -0,0 +1,29 @@ +@Html.Partial("Section\\_Summary") +@{ + foreach(IGrouping typeGroup + in Model.GetList("MemberTypes") + .Where(x => x.GetBool("IsResult") && x["Kind"].Equals("NamedType")) + .GroupBy(x => x.GetString("SpecificKind")) + .OrderBy(x => x.Key)) + { + @Html.Partial("Section\\_DocsTable", new DocsTable + { + Docs = typeGroup.OrderBy(x => x["DisplayName"]).ToList(), + Title = typeGroup.Key + " Types", + Header = typeGroup.Key, + HasSummary = true + }); + } + + @Html.Partial("Section\\_DocsTable", new DocsTable + { + Docs = Model.GetList("MemberNamespaces") + ?.Where(x => x.GetBool("IsResult")) + .OrderBy(x => x["DisplayName"]) + .ToList(), + Title = "Namespaces", + Header = "Namespace", + HasSummary = true, + LinkTypeArguments = false + }); +} diff --git a/docs/theme/input/Shared/Kind/_Property.cshtml b/docs/theme/input/Shared/Kind/_Property.cshtml new file mode 100644 index 000000000..401a10e51 --- /dev/null +++ b/docs/theme/input/Shared/Kind/_Property.cshtml @@ -0,0 +1,50 @@ +@Html.Partial("Section\\_Summary") +@{ + IDocument containingAssembly = Model.Get("ContainingAssembly"); + IDocument containingNamespace = Model.Get("ContainingNamespace"); + IDocument containingType = Model.Get("ContainingType"); + IDocument overridden = Model.Get("Overridden"); + if(containingAssembly != null + || containingNamespace != null + || containingType != null + || overridden != null) + { +
+
+
+ @if(containingAssembly != null) + { +
Assembly
+
@Context.GetTypeLink(containingAssembly)
+ } + + @if(containingNamespace != null) + { +
Namespace
+
@Context.GetTypeLink(containingNamespace)
+ } + + @if(containingType != null) + { +
Containing Type
+
@Context.GetTypeLink(containingType)
+ } + + @if(overridden != null) + { +
Overridden
+
@Context.GetTypeLink(overridden)
+ } +
+
+
+ } +} + +@Html.Partial("Section\\_Syntax") +@Html.Partial("Section\\_Examples") +@Html.Partial("Section\\_Remarks") +@Html.Partial("Section\\_Attributes") +@Html.Partial("Section\\_Parameters") +@Html.Partial("Section\\_Value") +@Html.Partial("Section\\_SeeAlso") \ No newline at end of file diff --git a/docs/theme/input/Shared/Section/_Attributes.cshtml b/docs/theme/input/Shared/Section/_Attributes.cshtml new file mode 100644 index 000000000..6dc2c9a4d --- /dev/null +++ b/docs/theme/input/Shared/Section/_Attributes.cshtml @@ -0,0 +1,28 @@ +@using Microsoft.AspNetCore.Html; +@{ + IReadOnlyList attributes = Model.GetList(CodeAnalysisKeys.Attributes); +} +@if(attributes != null && attributes.Count > 0) +{ +

Attributes

+
+
+ + + + + + + + @foreach(IDocument attribute in attributes) + { + IDocument type = attribute.GetDocument(CodeAnalysisKeys.Type); + + + + + } +
TypeDescription
@Context.GetTypeLink(type)@Html.Raw(type.GetString("Summary"))
+
+
+} \ No newline at end of file diff --git a/docs/theme/input/Shared/Section/_ConstantValue.cshtml b/docs/theme/input/Shared/Section/_ConstantValue.cshtml new file mode 100644 index 000000000..0eaae4aa3 --- /dev/null +++ b/docs/theme/input/Shared/Section/_ConstantValue.cshtml @@ -0,0 +1,23 @@ +@using Microsoft.AspNetCore.Html; + +@if(Model.GetBool(CodeAnalysisKeys.HasConstantValue)) +{ + object constantValue = Model.Get(CodeAnalysisKeys.ConstantValue); +

Constant Value

+
+
+ + + + + + + + + + + +
ValueType
@(new HtmlString(constantValue?.ToString() ?? "null"))@(new HtmlString(constantValue?.GetType().Name ?? string.Empty))
+
+
+} \ No newline at end of file diff --git a/docs/theme/input/Shared/Section/_Constructors.cshtml b/docs/theme/input/Shared/Section/_Constructors.cshtml new file mode 100644 index 000000000..fe48f4dd1 --- /dev/null +++ b/docs/theme/input/Shared/Section/_Constructors.cshtml @@ -0,0 +1,13 @@ +@{ + @Html.Partial("Section\\_DocsTable", new DocsTable + { + Docs = Model.GetList("Constructors") + ?.Where(x => x.GetBool("IsResult")) + .OrderBy(x => x["DisplayName"]) + .ToList(), + Title = "Constructors", + Header = "Name", + HasSummary = true, + LinkTypeArguments = false + }); +} \ No newline at end of file diff --git a/docs/theme/input/Shared/Section/_DocsTable.cshtml b/docs/theme/input/Shared/Section/_DocsTable.cshtml new file mode 100644 index 000000000..dcaeb5023 --- /dev/null +++ b/docs/theme/input/Shared/Section/_DocsTable.cshtml @@ -0,0 +1,35 @@ +@inherits Statiq.Razor.StatiqRazorPage + +@{ + if (Model != null && Model.Docs != null && Model.Docs.Count > 0) + { + +

@Model.Title

+
+
+ + + + + @if (Model.HasSummary) + { + + } + + + @foreach (IDocument doc in Model.Docs) + { + + + @if (Model.HasSummary) + { + + } + + } +
@Model.HeaderSummary
@Context.GetTypeLink(doc, Model.LinkTypeArguments)@Html.Raw(doc["Summary"])
+
+
+
+ } +} \ No newline at end of file diff --git a/docs/theme/input/Shared/Section/_Events.cshtml b/docs/theme/input/Shared/Section/_Events.cshtml new file mode 100644 index 000000000..0100d8c0d --- /dev/null +++ b/docs/theme/input/Shared/Section/_Events.cshtml @@ -0,0 +1,48 @@ +@using Microsoft.AspNetCore.Html; +@{ + IList events = Model.GetList("Members") + ?.Where(x => x.GetBool("IsResult") && x.GetString("Kind") == "Event") + .OrderBy(x => x["DisplayName"]) + .ToList(); + if(events.Count > 0) + { + +

Events

+
+
+ + + + + + + + + @foreach(IDocument evt in events) + { + IDocument type = evt.Get("Type"); + + + + + + } +
NameTypeSummary
@Context.GetTypeLink(evt, false)@(type == null ? new HtmlString(string.Empty) : Context.GetTypeLink(type)) +
@Html.Raw(evt["Summary"])
+ @{ + IDocument containingType = evt.GetDocument(CodeAnalysisKeys.ContainingType); + if(containingType != Model) + { +
Inherited from @Context.GetTypeLink(containingType)
+ } + if(evt.GetBool(CodeAnalysisKeys.IsStatic)) + { +
static
+ } + } +
+
+
+
+ } +} \ No newline at end of file diff --git a/docs/theme/input/Shared/Section/_Examples.cshtml b/docs/theme/input/Shared/Section/_Examples.cshtml new file mode 100644 index 000000000..1ac759e0b --- /dev/null +++ b/docs/theme/input/Shared/Section/_Examples.cshtml @@ -0,0 +1,8 @@ +@{ + string examples = Model.GetString("Example"); +} +@if(!string.IsNullOrWhiteSpace(examples)) +{ +

Examples

+
@Html.Raw(examples)
+} \ No newline at end of file diff --git a/docs/theme/input/Shared/Section/_ExtensionMethods.cshtml b/docs/theme/input/Shared/Section/_ExtensionMethods.cshtml new file mode 100644 index 000000000..b4c26da0d --- /dev/null +++ b/docs/theme/input/Shared/Section/_ExtensionMethods.cshtml @@ -0,0 +1,50 @@ +@using Microsoft.AspNetCore.Html; +@using Microsoft.CodeAnalysis; +@{ + ITypeSymbol modelSymbol = Model.Get("Symbol"); + IList methods = Model.GetList("ExtensionMethods") + ?.Where(x => x.GetBool("IsResult")) + .OrderBy(x => x["DisplayName"]) + .ToList(); + if(methods.Count > 0) + { + +

Extension Methods

+
+
+ + + + + + + + + @foreach(IDocument method in methods) + { + ISymbol reducedSymbol = method.Get("Symbol")?.ReduceExtensionMethod(modelSymbol); + string reducedName = reducedSymbol?.ToDisplayString(new SymbolDisplayFormat( + typeQualificationStyle: SymbolDisplayTypeQualificationStyle.NameAndContainingTypes, + genericsOptions: SymbolDisplayGenericsOptions.IncludeTypeParameters, + parameterOptions: SymbolDisplayParameterOptions.IncludeType, + memberOptions: SymbolDisplayMemberOptions.IncludeParameters, + miscellaneousOptions: SymbolDisplayMiscellaneousOptions.UseSpecialTypes)); + IDocument returnType = method.Get("ReturnType"); + + + + + + } +
NameValueSummary
@Context.GetTypeLink(method, reducedName, false)@(returnType == null ? new HtmlString(string.Empty) : Context.GetTypeLink(returnType)) +
@Html.Raw(method["Summary"])
+ @{ + IDocument containingType = method.GetDocument(CodeAnalysisKeys.ContainingType); +
From @Context.GetTypeLink(containingType)
+ } +
+
+
+
+ } +} \ No newline at end of file diff --git a/docs/theme/input/Shared/Section/_Fields.cshtml b/docs/theme/input/Shared/Section/_Fields.cshtml new file mode 100644 index 000000000..2048d7cce --- /dev/null +++ b/docs/theme/input/Shared/Section/_Fields.cshtml @@ -0,0 +1,47 @@ +@using Microsoft.AspNetCore.Html; +@{ + IList fields = Model.GetList("Members") + ?.Where(x => x.GetBool("IsResult") && x.GetString("Kind") == "Field") + .OrderBy(x => x["DisplayName"]) + .ToList(); + if(fields.Count > 0) + { + +

Fields

+
+
+ + + + + + + + + @foreach(IDocument field in fields) + { + + + + + + } +
NameConstant ValueSummary
@Context.GetTypeLink(field, false)@(field.GetBool(CodeAnalysisKeys.HasConstantValue) ? new HtmlString(field.Get(CodeAnalysisKeys.ConstantValue)?.ToString() ?? "null") : new HtmlString(string.Empty)) +
@Html.Raw(field["Summary"])
+ @{ + IDocument containingType = field.GetDocument(CodeAnalysisKeys.ContainingType); + if(containingType != Model) + { +
Inherited from @Context.GetTypeLink(containingType)
+ } + if(field.GetBool(CodeAnalysisKeys.IsStatic)) + { +
static
+ } + } +
+
+
+
+ } +} \ No newline at end of file diff --git a/docs/theme/input/Shared/Section/_Methods.cshtml b/docs/theme/input/Shared/Section/_Methods.cshtml new file mode 100644 index 000000000..f0dd2236c --- /dev/null +++ b/docs/theme/input/Shared/Section/_Methods.cshtml @@ -0,0 +1,48 @@ +@using Microsoft.AspNetCore.Html; +@{ + IList methods = Model.GetList("Members") + ?.Where(x => x.GetBool("IsResult") && x.GetString("Kind") == "Method") + .OrderBy(x => x["DisplayName"]) + .ToList(); + if(methods.Count > 0) + { + +

Methods

+
+
+ + + + + + + + + @foreach(IDocument method in methods) + { + IDocument returnType = method.Get("ReturnType"); + + + + + + } +
NameValueSummary
@Context.GetTypeLink(method, false)@(returnType == null ? new HtmlString(string.Empty) : Context.GetTypeLink(returnType)) +
@Html.Raw(method["Summary"])
+ @{ + IDocument containingType = method.GetDocument(CodeAnalysisKeys.ContainingType); + if(containingType != Model) + { +
Inherited from @Context.GetTypeLink(containingType)
+ } + if(method.GetBool(CodeAnalysisKeys.IsStatic)) + { +
static
+ } + } +
+
+
+
+ } +} \ No newline at end of file diff --git a/docs/theme/input/Shared/Section/_Operators.cshtml b/docs/theme/input/Shared/Section/_Operators.cshtml new file mode 100644 index 000000000..5bdb47c2d --- /dev/null +++ b/docs/theme/input/Shared/Section/_Operators.cshtml @@ -0,0 +1,43 @@ +@using Microsoft.AspNetCore.Html; +@{ + IList operators = Model.GetList(CodeAnalysisKeys.Operators) + .OrderBy(x => x["DisplayName"]) + .ToList(); + if(operators.Count > 0) + { + +

Operators

+
+
+ + + + + + + + + @foreach(IDocument op in operators) + { + IDocument returnType = op.Get("ReturnType"); + + + + + + } +
NameValueSummary
@Context.GetTypeLink(op, false)@(returnType == null ? new HtmlString(string.Empty) : Context.GetTypeLink(returnType)) +
@Html.Raw(op.Get("Summary"))
+ @{ + IDocument containingType = op.GetDocument(CodeAnalysisKeys.ContainingType); + if(containingType != Model) + { +
Inherited from @Context.GetTypeLink(containingType)
+ } + } +
+
+
+
+ } +} \ No newline at end of file diff --git a/docs/theme/input/Shared/Section/_Parameters.cshtml b/docs/theme/input/Shared/Section/_Parameters.cshtml new file mode 100644 index 000000000..6c1b111c8 --- /dev/null +++ b/docs/theme/input/Shared/Section/_Parameters.cshtml @@ -0,0 +1,31 @@ +@using Microsoft.AspNetCore.Html; +@{ + IReadOnlyList parameters = Model.GetList("Parameters"); + IReadOnlyList paramComments = Model.GetList("Params"); +} +@if(parameters != null && parameters.Count > 0) +{ +

Parameters

+
+
+ + + + + + + + + @foreach(IDocument parameter in parameters) + { + IDocument parameterType = parameter.Get("Type"); + + + + + + } +
NameTypeDescription
@parameter["Name"]@(parameterType == null ? new HtmlString(string.Empty) : Context.GetTypeLink(parameterType))@Html.Raw(paramComments?.Where(x => x.Name.Equals(parameter["Name"])).Select(x => x.Html).FirstOrDefault())
+
+
+} \ No newline at end of file diff --git a/docs/theme/input/Shared/Section/_Properties.cshtml b/docs/theme/input/Shared/Section/_Properties.cshtml new file mode 100644 index 000000000..cfe839e24 --- /dev/null +++ b/docs/theme/input/Shared/Section/_Properties.cshtml @@ -0,0 +1,48 @@ +@using Microsoft.AspNetCore.Html; +@{ + IList properties = Model.GetList("Members") + ?.Where(x => x.GetBool("IsResult") && x.GetString("Kind") == "Property") + .OrderBy(x => x["DisplayName"]) + .ToList(); + if(properties.Count > 0) + { + +

Properties

+
+
+ + + + + + + + + @foreach(IDocument property in properties) + { + IDocument type = property.Get("Type"); + + + + + + } +
NameValueSummary
@Context.GetTypeLink(property, false)@(type == null ? new HtmlString(string.Empty) : Context.GetTypeLink(type)) +
@Html.Raw(property["Summary"])
+ @{ + IDocument containingType = property.GetDocument(CodeAnalysisKeys.ContainingType); + if(containingType != Model) + { +
Inherited from @Context.GetTypeLink(containingType)
+ } + if(property.GetBool(CodeAnalysisKeys.IsStatic)) + { +
static
+ } + } +
+
+
+
+ } +} \ No newline at end of file diff --git a/docs/theme/input/Shared/Section/_Remarks.cshtml b/docs/theme/input/Shared/Section/_Remarks.cshtml new file mode 100644 index 000000000..3252aa3d0 --- /dev/null +++ b/docs/theme/input/Shared/Section/_Remarks.cshtml @@ -0,0 +1,8 @@ +@{ + string remarks = Model.GetString("Remarks"); +} +@if(!string.IsNullOrWhiteSpace(remarks)) +{ +

Remarks

+
@Html.Raw(remarks)
+} \ No newline at end of file diff --git a/docs/theme/input/Shared/Section/_ReturnValue.cshtml b/docs/theme/input/Shared/Section/_ReturnValue.cshtml new file mode 100644 index 000000000..97b2ca69b --- /dev/null +++ b/docs/theme/input/Shared/Section/_ReturnValue.cshtml @@ -0,0 +1,25 @@ +@using Microsoft.AspNetCore.Html; +@{ + IDocument returnType = Model.Get("ReturnType"); + string returns = Model.GetString("Returns"); +} +@if(returnType != null || !string.IsNullOrWhiteSpace(returns)) +{ +

Return Value

+
+
+ + + + + + + + + + + +
TypeDescription
@(returnType == null ? new HtmlString("void") : Context.GetTypeLink(returnType))@Html.Raw(returns)
+
+
+} \ No newline at end of file diff --git a/docs/theme/input/Shared/Section/_SeeAlso.cshtml b/docs/theme/input/Shared/Section/_SeeAlso.cshtml new file mode 100644 index 000000000..043a1233c --- /dev/null +++ b/docs/theme/input/Shared/Section/_SeeAlso.cshtml @@ -0,0 +1,13 @@ +@{ + IReadOnlyList seeAlso = Model.GetList("SeeAlso"); +} +@if(seeAlso != null && seeAlso.Count > 0) +{ +

See Also

+
    + @foreach(string seeAlsoComment in seeAlso) + { +
  • @Html.Raw(seeAlsoComment)
  • + } +
+} \ No newline at end of file diff --git a/docs/theme/input/Shared/Section/_Summary.cshtml b/docs/theme/input/Shared/Section/_Summary.cshtml new file mode 100644 index 000000000..f229e06fc --- /dev/null +++ b/docs/theme/input/Shared/Section/_Summary.cshtml @@ -0,0 +1,8 @@ +@{ + string summary = Model.GetString("Summary"); +} +@if(!string.IsNullOrWhiteSpace(summary)) +{ +

Summary

+
@Html.Raw(summary)
+} \ No newline at end of file diff --git a/docs/theme/input/Shared/Section/_Syntax.cshtml b/docs/theme/input/Shared/Section/_Syntax.cshtml new file mode 100644 index 000000000..ee5809129 --- /dev/null +++ b/docs/theme/input/Shared/Section/_Syntax.cshtml @@ -0,0 +1,8 @@ +@{ + string syntax = Model.GetString("Syntax"); +} +@if(!string.IsNullOrWhiteSpace(syntax)) +{ +

Syntax

+
@syntax
+} \ No newline at end of file diff --git a/docs/theme/input/Shared/Section/_TypeParameters.cshtml b/docs/theme/input/Shared/Section/_TypeParameters.cshtml new file mode 100644 index 000000000..58588eacc --- /dev/null +++ b/docs/theme/input/Shared/Section/_TypeParameters.cshtml @@ -0,0 +1,29 @@ +@using Microsoft.AspNetCore.Html; +@{ + IReadOnlyList typeParameters = Model.GetList("TypeParameters"); + IReadOnlyList typeParams = Model.GetList("TypeParams"); +} +@if(typeParameters != null && typeParameters.Count > 0) +{ +

Type Parameters

+
+
+ + + + + + + + @foreach(IDocument typeParam in typeParameters) + { + IDocument declaringType = typeParam.Get("DeclaringType"); + + + + + } +
NameDescription
@(declaringType != null && declaringType["SymbolId"].Equals(Model["SymbolId"]) ? new HtmlString(typeParam.GetString("Name")) : Context.GetTypeLink(typeParam, false))@Html.Raw(typeParams?.Where(x => x.Name.Equals(typeParam["Name"])).Select(x => x.Html).FirstOrDefault())
+
+
+} \ No newline at end of file diff --git a/docs/theme/input/Shared/Section/_Value.cshtml b/docs/theme/input/Shared/Section/_Value.cshtml new file mode 100644 index 000000000..dc5a452b1 --- /dev/null +++ b/docs/theme/input/Shared/Section/_Value.cshtml @@ -0,0 +1,25 @@ +@using Microsoft.AspNetCore.Html; +@{ + IDocument type = Model.Get("Type"); + string value = Model.GetString("Value"); +} +@if(type != null || !string.IsNullOrWhiteSpace(value)) +{ +

Value

+
+
+ + + + + + + + + + + +
TypeDescription
@(type == null ? new HtmlString(string.Empty) : Context.GetTypeLink(type))@Html.Raw(value)
+
+
+} \ No newline at end of file diff --git a/docs/theme/input/Shared/Sidebar/_Assembly.cshtml b/docs/theme/input/Shared/Sidebar/_Assembly.cshtml new file mode 100644 index 000000000..a163cd0ed --- /dev/null +++ b/docs/theme/input/Shared/Sidebar/_Assembly.cshtml @@ -0,0 +1,13 @@ +
  • Assemblies
  • +@{ + IReadOnlyList assemblies = + Outputs.FromPipeline(nameof(Statiq.Docs.Pipelines.Api)) + .Where(x => x.GetString("Kind") == "Assembly") + .OrderBy(x => x.GetString("DisplayName")) + .ToList(); + foreach(IDocument assembly in assemblies) + { + string selectedClass = assembly.GetString("SymbolId") == Model.GetString("SymbolId") ? "selected" : null; +
  • @Context.GetTypeLink(assembly, false)
  • + } +} \ No newline at end of file diff --git a/docs/theme/input/Shared/Sidebar/_ChildPages.cshtml b/docs/theme/input/Shared/Sidebar/_ChildPages.cshtml new file mode 100644 index 000000000..a1b0d0d27 --- /dev/null +++ b/docs/theme/input/Shared/Sidebar/_ChildPages.cshtml @@ -0,0 +1,13 @@ +@{ + IDocument root = OutputPages[Document.Destination.ChangeFileName("index.html").FullPath].First(); + + // Display the menu + DocumentList children = OutputPages.GetChildrenOf(root) + .Where(x => x.GetBool(SamsonKeys.ShowInSidebar)) + .ToDocumentList(); + + if(children != null && children.Count > 0) + { + @Html.Partial("Sidebar/_ChildPagesMenu", children) + } +} diff --git a/docs/theme/input/Shared/Sidebar/_ChildPagesMenu.cshtml b/docs/theme/input/Shared/Sidebar/_ChildPagesMenu.cshtml new file mode 100644 index 000000000..117a63b73 --- /dev/null +++ b/docs/theme/input/Shared/Sidebar/_ChildPagesMenu.cshtml @@ -0,0 +1,44 @@ +@inherits Statiq.Razor.StatiqRazorPage> + +@{ + // Group by category + IList> categoryGroups = Model + .GroupBy(x => x.GetString(SamsonKeys.Category)) + .OrderBy(x => x.Key) + .ToList(); + foreach (IGrouping categoryGroup in categoryGroups) + { + if (!string.IsNullOrWhiteSpace(categoryGroup.Key)) + { +
  • @categoryGroup.Key
  • + } + + // Iterate documents in this category + foreach (IDocument child in categoryGroup + .Where(x => x.GetBool(SamsonKeys.ShowInSidebar, true)) + .OrderBy(x => x.Get(SamsonKeys.Order, 1000)) + .ThenBy(x => x.WithoutSettings().GetString(Keys.Title))) + { + // TODO: this doesn't take into account if a child is active. + string? parentActive = Document.IdEquals(child) ? "active" : null; + string? childSelected = Document.IdEquals(child) ? "selected" : null; + string childTitle = child.GetTitle(); + IReadOnlyList children = child.GetDocumentList(Keys.Children); + if (children != null && children.Count > 0) + { + // Parent +
  • + @childTitle +
      + @Html.Partial("Sidebar/_ChildPagesMenu", children) +
    +
  • + } + else + { + // Leaf +
  • @childTitle
  • + } + } + } +} diff --git a/docs/theme/input/Shared/Sidebar/_Event.cshtml b/docs/theme/input/Shared/Sidebar/_Event.cshtml new file mode 100644 index 000000000..be8824007 --- /dev/null +++ b/docs/theme/input/Shared/Sidebar/_Event.cshtml @@ -0,0 +1 @@ +@Html.Partial("Sidebar\\_Member") \ No newline at end of file diff --git a/docs/theme/input/Shared/Sidebar/_Field.cshtml b/docs/theme/input/Shared/Sidebar/_Field.cshtml new file mode 100644 index 000000000..be8824007 --- /dev/null +++ b/docs/theme/input/Shared/Sidebar/_Field.cshtml @@ -0,0 +1 @@ +@Html.Partial("Sidebar\\_Member") \ No newline at end of file diff --git a/docs/theme/input/Shared/Sidebar/_Member.cshtml b/docs/theme/input/Shared/Sidebar/_Member.cshtml new file mode 100644 index 000000000..5cb5f4233 --- /dev/null +++ b/docs/theme/input/Shared/Sidebar/_Member.cshtml @@ -0,0 +1,53 @@ +@{ + IDocument containingAssembly = Model.Get("ContainingAssembly"); + if(containingAssembly != null) + { +
  • Assembly
  • +
  • @Context.GetTypeLink(containingAssembly, false)
  • + } + + IDocument containingNamespace = Model.Get("ContainingNamespace"); + if(containingNamespace != null) + { +
  • Namespace
  • +
  • @Context.GetTypeLink(containingNamespace, false)
  • + } + + IDocument containingType = Model.Get("ContainingType"); + if(containingType != null) + { +
  • Type
  • +
  • @Context.GetTypeLink(containingType, false)
  • + + + + IReadOnlyList constructors = containingType + .GetList("Constructors") + .Where(x => x.GetBool("IsResult")) + .ToList(); + if(constructors != null && constructors.Count > 0) + { +
  • Constructors
  • + foreach(IDocument constructor in constructors) + { + string selectedClass = constructor.GetString("SymbolId") == Model.GetString("SymbolId") ? "selected" : null; +
  • @Context.GetTypeLink(constructor, false)
  • + } + } + + foreach(IGrouping memberGroup + in containingType.GetList("Members") + .Where(x => x.GetBool("IsResult")) + .GroupBy(x => x.GetString("Kind")) + .OrderBy(x => x.Key)) + { +
  • @memberGroup.Key Members
  • + foreach(IDocument member in memberGroup + .OrderBy(x => x.GetString("Name"))) + { + string selectedClass = member.GetString("SymbolId") == Model.GetString("SymbolId") ? "selected" : null; +
  • @Context.GetTypeLink(member, false)
  • + } + } + } +} diff --git a/docs/theme/input/Shared/Sidebar/_Method.cshtml b/docs/theme/input/Shared/Sidebar/_Method.cshtml new file mode 100644 index 000000000..be8824007 --- /dev/null +++ b/docs/theme/input/Shared/Sidebar/_Method.cshtml @@ -0,0 +1 @@ +@Html.Partial("Sidebar\\_Member") \ No newline at end of file diff --git a/docs/theme/input/Shared/Sidebar/_Modules.cshtml b/docs/theme/input/Shared/Sidebar/_Modules.cshtml new file mode 100644 index 000000000..f48df92e5 --- /dev/null +++ b/docs/theme/input/Shared/Sidebar/_Modules.cshtml @@ -0,0 +1,28 @@ +@{ + /*IList> categoryGroups = + Documents.FromPipeline("Modules") + .GroupBy(x => { + IReadOnlyList categoryComments = x.List("CategoryComments"); + return categoryComments == null ? string.Empty : categoryComments[0].Html; + }) + .OrderBy(x => x.Key) + .ToList(); + foreach(IGrouping categoryGroup in categoryGroups) + { + if(!string.IsNullOrWhiteSpace(categoryGroup.Key)) + { +
  • @categoryGroup.Key
  • + } + + foreach(IDocument childDoc in categoryGroup + .OrderBy(x => x.String("DisplayName"))) + { + string selectedClass = Model.String("RelativeFilePath") == childDoc.String("RelativeFilePath") ? "selected" : null; +
  • + + @(childDoc.String("DisplayName")) + +
  • + } + }*/ +} \ No newline at end of file diff --git a/docs/theme/input/Shared/Sidebar/_NamedType.cshtml b/docs/theme/input/Shared/Sidebar/_NamedType.cshtml new file mode 100644 index 000000000..1b12cfbbe --- /dev/null +++ b/docs/theme/input/Shared/Sidebar/_NamedType.cshtml @@ -0,0 +1,32 @@ +@{ + IDocument containingAssembly = Model.Get("ContainingAssembly"); + if(containingAssembly != null) + { +
  • Assembly
  • +
  • @Context.GetTypeLink(containingAssembly, false)
  • + } + + IDocument containingNamespace = Model.Get("ContainingNamespace"); + if(containingNamespace != null) + { +
  • Namespace
  • +
  • @Context.GetTypeLink(containingNamespace, false)
  • + + + + foreach(IGrouping typeGroup + in containingNamespace.GetList("MemberTypes") + .Where(x => x.GetBool("IsResult") && x["Kind"].Equals("NamedType")) + .GroupBy(x => x.GetString("SpecificKind")) + .OrderBy(x => x.Key)) + { +
  • @typeGroup.Key Types
  • + foreach(IDocument type in typeGroup + .OrderBy(x => x.GetString("Name"))) + { + string selectedClass = type.GetString("SymbolId") == Model.GetString("SymbolId") ? "selected" : null; +
  • @Context.GetTypeLink(type, false)
  • + } + } + } +} diff --git a/docs/theme/input/Shared/Sidebar/_Namespace.cshtml b/docs/theme/input/Shared/Sidebar/_Namespace.cshtml new file mode 100644 index 000000000..030aa7262 --- /dev/null +++ b/docs/theme/input/Shared/Sidebar/_Namespace.cshtml @@ -0,0 +1,85 @@ +
  • Namespaces
  • +@{ + IList> namespaces + = Outputs.FromPipeline(nameof(Statiq.Docs.Pipelines.Api)) + .Where(x => x.GetString("Kind") == "Namespace") + .Select(x => Tuple.Create(x.GetString("DisplayName"), x)) + .OrderBy(x => x.Item1) + //.Select(x => Tuple.Create(x.Item1.Split('.'), x.Item2)) + .ToList(); + Stack nestingStack = new Stack(); + for(int c = 0 ; c < namespaces.Count ; c++) + { + Tuple current = namespaces[c]; + string next = c < namespaces.Count - 1 ? namespaces[c + 1].Item1 : null; + + // End nesting + while(nestingStack.Count > 0 && !current.Item1.StartsWith(nestingStack.Peek() + ".")) + { + @Html.Raw(""); + nestingStack.Pop(); + } + + // Start nesting + string selectedClass = Model.GetString("Kind") == "Namespace" && Model.GetString("DisplayName") == current.Item1 + ? " selected" : null; + if(next != null && next.StartsWith(current.Item1 + ".")) + { + string activeClass = Model.GetString("Kind") == "Namespace" + && (selectedClass != null || Model.GetString("DisplayName").StartsWith(current.Item1 + ".")) + ? " active" : null; + @Html.Raw($@" +
  • + {Context.GetTypeLink(current.Item2, false)} +
      + "); + nestingStack.Push(current.Item1); + } + else + { +
    • @Context.GetTypeLink(current.Item2, false)
    • + } + } + while(nestingStack.Count > 0) + { + @Html.Raw("
  • "); + nestingStack.Pop(); + } + + /* + for(int c = 0; c < namespaces.Count ; c++) + { + Tuple current = namespaces[c]; + string currentActiveClass = Model.String("Kind") == "Namespace" + && Model.String("SymbolId") == current.Item2.String("SymbolId") ? "active" : null; + if(current.Item1.Length > 1 && c+1 < namespaces.Count + && namespaces[c+1].Item1[0] == current.Item1[0] && namespaces[c+1].Item1[1] == current.Item1[1]) + { + // Nest this namespace + string nestedActiveClass = Model.String("Kind") == "Namespace" + && (Model.String("SymbolId") == current.Item2.String("SymbolId") + || Model.String("DisplayName").StartsWith(current.Item1[0] + "." + current.Item1[1] + ".")) ? "active" : null; +
  • + @(current.Item1[0]).@(current.Item1[1])... +
      +
    • @Context.GetTypeLink(current.Item2)
    • + @{ + while(c+1 < namespaces.Count + && namespaces[c+1].Item1[0] == current.Item1[0] && namespaces[c+1].Item1[1] == current.Item1[1]) + { + nestedActiveClass = Model.String("Kind") == "Namespace" + && Model.String("SymbolId") == namespaces[c+1].Item2.String("SymbolId") ? "active" : null; +
    • @Context.GetTypeLink(namespaces[c+1].Item2)
    • + c++; + } + } +
    +
  • + } + else + { +
  • @Context.GetTypeLink(current.Item2)
  • + } + } + */ +} \ No newline at end of file diff --git a/docs/theme/input/Shared/Sidebar/_Property.cshtml b/docs/theme/input/Shared/Sidebar/_Property.cshtml new file mode 100644 index 000000000..be8824007 --- /dev/null +++ b/docs/theme/input/Shared/Sidebar/_Property.cshtml @@ -0,0 +1 @@ +@Html.Partial("Sidebar\\_Member") \ No newline at end of file diff --git a/docs/theme/input/Shared/_ApiSearch.cshtml b/docs/theme/input/Shared/_ApiSearch.cshtml new file mode 100644 index 000000000..6959216bc --- /dev/null +++ b/docs/theme/input/Shared/_ApiSearch.cshtml @@ -0,0 +1,49 @@ +@if(Context.GetBool(SamsonKeys.SearchIndex)) +{ + + + +
    +
    + +} \ No newline at end of file diff --git a/docs/theme/input/Shared/_BlogPostDetails.cshtml b/docs/theme/input/Shared/_BlogPostDetails.cshtml new file mode 100644 index 000000000..0dbf17f7a --- /dev/null +++ b/docs/theme/input/Shared/_BlogPostDetails.cshtml @@ -0,0 +1,18 @@ +@model IDocument + +
    +
    Published
    +
    @(Model.Get(SamsonKeys.Published).ToLongDateString(Context))
    + @if(Model.ContainsKey(SamsonKeys.Category)) + { + string link = Model.String(SamsonKeys.Category).Replace(" ", "-").Replace("'", string.Empty); +
    Category
    +
    @(Model.String(SamsonKeys.Category))
    + } + @if(Model.ContainsKey(SamsonKeys.Author)) + { + string link = Model.String(SamsonKeys.Author).Replace(" ", "-").Replace("'", string.Empty); +
    Author
    +
    @(Model.String(SamsonKeys.Author))
    + } +
    diff --git a/docs/theme/input/Shared/_ChildPages.cshtml b/docs/theme/input/Shared/_ChildPages.cshtml new file mode 100644 index 000000000..c72c97d05 --- /dev/null +++ b/docs/theme/input/Shared/_ChildPages.cshtml @@ -0,0 +1,47 @@ +@{ + IReadOnlyList children = Model.GetDocumentList(Keys.Children); + if(children != null && children.Count > 0) + { + IList> categoryGroups = + children + .GroupBy(x => x.GetString(SamsonKeys.Category)) + .OrderBy(x => x.Key) + .ToList(); + + foreach(IGrouping categoryGroup in categoryGroups) + { +
    +
    + + @if(!string.IsNullOrWhiteSpace(categoryGroup.Key)) + { + + + + } + + + @foreach(IDocument child in categoryGroup + .OrderBy(x => x.Get(SamsonKeys.Order, 1000)) + .ThenBy(x => x.WithoutSettings().GetString(Keys.Title))) + { + object[] childTreePath = child.Get(Keys.TreePath); + + + + + } + +
    @categoryGroup.Key
    @(child.WithoutSettings().GetString(Keys.Title, childTreePath.Last().ToString())) + @{ + if(child.ContainsKey(SamsonKeys.Description)) + { + @(child.GetString(SamsonKeys.Description)) + } + } +
    +
    +
    + } + } +} \ No newline at end of file diff --git a/docs/theme/input/Shared/_Infobar.cshtml b/docs/theme/input/Shared/_Infobar.cshtml new file mode 100644 index 000000000..4ebd1f27a --- /dev/null +++ b/docs/theme/input/Shared/_Infobar.cshtml @@ -0,0 +1,14 @@ +@{ + string baseEditUrl = Context.GetString(SamsonKeys.BaseEditUrl); + NormalizedPath editFilePath = null;// Model.GetPath(WebKeys.); + if(!string.IsNullOrWhiteSpace(baseEditUrl) && editFilePath != null) + { + if (baseEditUrl[baseEditUrl.Length - 1] != '/') + { + baseEditUrl += "/"; + } + string editUrl = baseEditUrl + editFilePath.FullPath; + + } +
    +} diff --git a/docs/dap.md b/docs/theme/input/_ApiAfterContent.cshtml similarity index 100% rename from docs/dap.md rename to docs/theme/input/_ApiAfterContent.cshtml diff --git a/docs/theme/input/_ApiBeforeContent.cshtml b/docs/theme/input/_ApiBeforeContent.cshtml new file mode 100644 index 000000000..e69de29bb diff --git a/docs/theme/input/_ApiLayout.cshtml b/docs/theme/input/_ApiLayout.cshtml new file mode 100644 index 000000000..f7464dbd5 --- /dev/null +++ b/docs/theme/input/_ApiLayout.cshtml @@ -0,0 +1,44 @@ +@{ + IDocument current = Document.GetDocument(Keys.Current); + Layout = "/_Master.cshtml"; + + IDocument containingType = current.Get("ContainingType"); + string containingTypeString = string.Empty; + while(containingType != null) + { + containingTypeString = containingTypeString + containingType.GetString("DisplayName") + "."; + containingType = containingType.Get("ContainingType"); + } + ViewData[Keys.Title] = "API - " + containingTypeString + current["DisplayName"] + " " + current["SpecificKind"]; +} + +@section Infobar { +
    +} + +@section Search { + @Html.Partial("_ApiSearch", current) +
    +} + +@section Sidebar { + @Html.Partial("Sidebar/_" + current.GetString("Kind"), current) +} + +
    + @{ + containingType = current.Get("ContainingType"); + while(containingType != null) + { +

    @Context.GetTypeLink(containingType).

    + containingType = containingType.Get("ContainingType"); + } + } +

    @current.Name() @current["SpecificKind"]

    +
    +
    + @Html.Partial("_ApiBeforeContent", current) + @RenderBody() + @Html.Partial("Kind/_" + current.GetString("Kind"), current) + @Html.Partial("_ApiAfterContent", current) +
    diff --git a/docs/theme/input/_BlogIndex.cshtml b/docs/theme/input/_BlogIndex.cshtml new file mode 100644 index 000000000..e1efe6698 --- /dev/null +++ b/docs/theme/input/_BlogIndex.cshtml @@ -0,0 +1,45 @@ +@{ + bool fullContent = Model.String(Keys.RelativeFilePath) == $"{Context.String(SamsonKeys.BlogPath)}/index.html" && Model.Get(Keys.CurrentPage) == 1; + foreach(IDocument post in Model.DocumentList(Keys.PageDocuments)) + { +

    @post.WithoutSettings.String(Keys.Title)

    + @Html.Partial("_BlogPostDetails", post) + @if(fullContent) + { +
    + @Html.Raw(post.Content) +
    + } + else + { +
    + @Html.Raw(post.String(HtmlKeys.Excerpt)) + Read more... +
    + } +
    + fullContent = false; + } + +} \ No newline at end of file diff --git a/docs/theme/input/_BlogLayout.cshtml b/docs/theme/input/_BlogLayout.cshtml new file mode 100644 index 000000000..d71617c22 --- /dev/null +++ b/docs/theme/input/_BlogLayout.cshtml @@ -0,0 +1,47 @@ +@{ + Layout = "/_Layout.cshtml"; +} + +@section Sidebar { + @if(Documents[Docs.BlogPosts].Any(x => x.ContainsKey(SamsonKeys.Category))) + { +
  • Categories
  • + @foreach(string category in Documents[Docs.BlogPosts] + .Select(x => x.String(SamsonKeys.Category)) + .Distinct() + .OrderBy(x => x)) + { + string link = category.Replace(" ", "-").Replace("'", string.Empty); + string selected = Model.String(Keys.RelativeFilePath).StartsWith($"{Context.String(SamsonKeys.BlogPath)}/{link}/") ? "selected" : null; +
  • @category
  • + } + } + +
  • Archive
  • + @foreach(DateTime published in Documents[Docs.BlogPosts] + .Select(x => x.Get(SamsonKeys.Published)) + .Select(x => new DateTime(x.Year, x.Month, 1)) + .Distinct() + .OrderByDescending(x => x)) + { + string link = published.ToString("yyyy/MM"); + string selected = Model.String(Keys.RelativeFilePath).StartsWith($"{Context.String(SamsonKeys.BlogPath)}/archive/{link}/") ? "selected" : null; +
  • @(published.ToString("MMMM, yyyy"))
  • + } + + @if(Documents[Docs.BlogPosts].Any(x => x.ContainsKey(SamsonKeys.Author))) + { +
  • Authors
  • + @foreach(string author in Documents[Docs.BlogPosts] + .Select(x => x.String(SamsonKeys.Author)) + .Distinct() + .OrderBy(x => x)) + { + string link = author.Replace(" ", "-").Replace("'", string.Empty); + string selected = Model.String(Keys.RelativeFilePath).StartsWith($"{Context.String(SamsonKeys.BlogPath)}/author/{link}/") ? "selected" : null; +
  • @author
  • + } + } +} + +@RenderBody() diff --git a/docs/theme/input/_BlogPost.cshtml b/docs/theme/input/_BlogPost.cshtml new file mode 100644 index 000000000..d2162dc59 --- /dev/null +++ b/docs/theme/input/_BlogPost.cshtml @@ -0,0 +1,7 @@ +@{ + Layout = "/_BlogLayout.cshtml"; +} + +@Html.Partial("_BlogPostDetails") + +@RenderBody() \ No newline at end of file diff --git a/docs/theme/input/_Bottom.cshtml b/docs/theme/input/_Bottom.cshtml new file mode 100644 index 000000000..e69de29bb diff --git a/docs/theme/input/_Footer.cshtml b/docs/theme/input/_Footer.cshtml new file mode 100644 index 000000000..862505311 --- /dev/null +++ b/docs/theme/input/_Footer.cshtml @@ -0,0 +1 @@ +Generated by Wyam \ No newline at end of file diff --git a/docs/theme/input/_Head.cshtml b/docs/theme/input/_Head.cshtml new file mode 100644 index 000000000..e69de29bb diff --git a/docs/theme/input/_Layout.cshtml b/docs/theme/input/_Layout.cshtml new file mode 100644 index 000000000..fe3b1a062 --- /dev/null +++ b/docs/theme/input/_Layout.cshtml @@ -0,0 +1,50 @@ +@{ + Layout = "/_Master.cshtml"; + ViewData[Keys.Title] = @Model.WithoutSettings().GetString(Keys.Title); +} + +@section Infobar { + @if (IsSectionDefined("Infobar")) + { + RenderSection("Infobar"); + } + else + { + @Html.Partial("_Infobar") + } +} + +@section Search { + @if (IsSectionDefined("Search")) + { + RenderSection("Search"); + } +} + +@section Sidebar { + @if (IsSectionDefined("Sidebar")) + { + RenderSection("Sidebar"); + } + else + { + @Html.Partial("Sidebar/_ChildPages") + } +} + +@if (Model.GetBool(SamsonKeys.NoContainer, false)) +{ + @RenderBody() +} +else +{ + @if (!Model.GetBool(SamsonKeys.NoTitle, false)) + { +
    +

    @ViewData[Keys.Title]

    +
    + } +
    + @RenderBody() +
    +} diff --git a/docs/theme/input/_Master.cshtml b/docs/theme/input/_Master.cshtml new file mode 100644 index 000000000..fa8d08bcc --- /dev/null +++ b/docs/theme/input/_Master.cshtml @@ -0,0 +1,219 @@ + + + + + + + + + + + @Context.GetString(SamsonKeys.Title, "Docs") - @ViewData[Keys.Title] + + + + + + + + + + + + + + + + + + @Html.Partial("_Head") + + @{ + string layoutTopNav = Model.GetBool(SamsonKeys.NoSidebar, false) ? "layout-top-nav" : string.Empty; + string noGutter = Model.GetBool(SamsonKeys.NoGutter, false) ? "no-gutter" : string.Empty; + } + +
    + @{ + string withContainer = Model.GetBool(SamsonKeys.NoContainer, false) ? null : "with-container"; + } +
    + +
    + + + + +
    + + + + + +
    + @RenderBody() +
    + + +
    +
    + + @* + + + +
    + *@ +
    +
    +
    + @Html.Partial("_Footer") +
    +
    + + @Html.Partial("_Bottom") + + + \ No newline at end of file diff --git a/docs/theme/input/_Navbar.cshtml b/docs/theme/input/_Navbar.cshtml new file mode 100644 index 000000000..ab1a1b83a --- /dev/null +++ b/docs/theme/input/_Navbar.cshtml @@ -0,0 +1,23 @@ +@{ + List> pages = new List>();/*Context + .Documents[Docs.Pages] + .Where(x => x.Bool(SamsonKeys.ShowInNavbar, true)) + .Where(x => x.FilePath(Keys.RelativeFilePath)?.FullPath?.StartsWith("index") == (bool?)false) + .Select(x => Tuple.Create(x.WithoutSettings.String(Keys.Title), Context.GetLink(x))) + .Where(x => !string.IsNullOrEmpty(x.Item1)) + .OrderBy(x => x.Item1) + .ToList();*/ + /*if(Documents[Docs.BlogPosts].Any()) + { + pages.Add(Tuple.Create(Context.String(SamsonKeys.BlogTitle), Context.GetLink(Context.String(DocsKeys.BlogPath)))); + }*/ + if (Outputs.FromPipeline(nameof(Statiq.Docs.Pipelines.Api)).Any()) + { + pages.Add(Tuple.Create("API", Context.GetLink(Context.GetPath(DocsKeys.ApiPath)))); + } + foreach(Tuple page in pages) + { + string active = Context.GetLink(Document).StartsWith(page.Item2) ? "active" : null; +
  • @(page.Item1)
  • + } +} \ No newline at end of file diff --git a/docs/theme/input/_SidebarFooter.cshtml b/docs/theme/input/_SidebarFooter.cshtml new file mode 100644 index 000000000..e69de29bb diff --git a/docs/theme/input/_SidebarHeader.cshtml b/docs/theme/input/_SidebarHeader.cshtml new file mode 100644 index 000000000..e69de29bb diff --git a/docs/theme/input/_ViewImports.cshtml b/docs/theme/input/_ViewImports.cshtml new file mode 100644 index 000000000..a910a5fb2 --- /dev/null +++ b/docs/theme/input/_ViewImports.cshtml @@ -0,0 +1,9 @@ +@using Statiq.App; +@using Statiq.CodeAnalysis; +@using Statiq.Common; +@using Statiq.Docs; +@using Statiq.Razor; +@using Statiq.Web; +@using Generator; + +@inherits Statiq.Razor.StatiqRazorPage \ No newline at end of file diff --git a/docs/theme/input/_ViewStart.cshtml b/docs/theme/input/_ViewStart.cshtml new file mode 100644 index 000000000..0a98885f4 --- /dev/null +++ b/docs/theme/input/_ViewStart.cshtml @@ -0,0 +1,3 @@ +@{ + Layout = "/_Layout.cshtml"; +} \ No newline at end of file diff --git a/docs/theme/input/assets/css/adminlte/AdminLTE.less b/docs/theme/input/assets/css/adminlte/AdminLTE.less new file mode 100644 index 000000000..a088d0705 --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/AdminLTE.less @@ -0,0 +1,61 @@ +/*! + * AdminLTE v2.3.8 + * Author: Almsaeed Studio + * Website: Almsaeed Studio + * License: Open source - MIT + * Please visit http://opensource.org/licenses/MIT for more information +!*/ +//google fonts +@import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic); +//Bootstrap Variables & Mixins +//The core bootstrap code have not been modified. These files +//are included only for reference. +@import (reference) "../bootstrap/mixins.less"; +@import (reference) "../bootstrap/variables.less"; +//MISC +//---- +@import "core.less"; +@import "variables.less"; +@import "mixins.less"; +//COMPONENTS +//----------- +@import "header.less"; +@import "sidebar.less"; +@import "sidebar-mini.less"; +@import "control-sidebar.less"; +@import "dropdown.less"; +@import "forms.less"; +@import "progress-bars.less"; +@import "small-box.less"; +@import "boxes.less"; +@import "info-box.less"; +@import "timeline.less"; +@import "buttons.less"; +@import "callout.less"; +@import "alerts.less"; +@import "navs.less"; +@import "products.less"; +@import "table.less"; +@import "labels.less"; +@import "direct-chat.less"; +@import "users-list.less"; +@import "carousel.less"; +@import "modal.less"; +@import "social-widgets.less"; +//PAGES +//------ +@import "mailbox.less"; +@import "lockscreen.less"; +@import "login_and_register.less"; +@import "404_500_errors.less"; +@import "invoice.less"; +@import "profile"; +//Plugins +//-------- +@import "bootstrap-social.less"; +@import "fullcalendar.less"; +@import "select2.less"; +//Miscellaneous +//------------- +@import "miscellaneous.less"; +@import "print.less"; diff --git a/docs/theme/input/assets/css/adminlte/_404_500_errors.less b/docs/theme/input/assets/css/adminlte/_404_500_errors.less new file mode 100644 index 000000000..f7fadcf54 --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_404_500_errors.less @@ -0,0 +1,36 @@ +/* + * Page: 400 and 500 error pages + * ------------------------------ + */ +.error-page { + width: 600px; + margin: 20px auto 0 auto; + @media (max-width: @screen-sm-max) { + width: 100%; + } + //For the error number e.g: 404 + > .headline { + float: left; + font-size: 100px; + font-weight: 300; + @media (max-width: @screen-sm-max) { + float: none; + text-align: center; + } + } + //For the message + > .error-content { + margin-left: 190px; + @media (max-width: @screen-sm-max) { + margin-left: 0; + } + > h3 { + font-weight: 300; + font-size: 25px; + @media (max-width: @screen-sm-max) { + text-align: center; + } + } + display: block; + } +} diff --git a/docs/theme/input/assets/css/adminlte/_alerts.less b/docs/theme/input/assets/css/adminlte/_alerts.less new file mode 100644 index 000000000..b103c6650 --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_alerts.less @@ -0,0 +1,49 @@ +/* + * Component: alert + * ---------------- + */ + +/* Prefer Bootstrap-style alerts +.alert { + .border-radius(3px); + h4 { + font-weight: 600; + } + .icon { + margin-right: 10px; + } + .close { + color: #000; + .opacity(.2); + &:hover { + .opacity(.5); + } + } + a { + color: #fff; + text-decoration: underline; + } +} + +//Alert Variants +.alert-success { + &:extend(.bg-green); + border-color: darken(@green, 5%); +} + +.alert-danger, +.alert-error { + &:extend(.bg-red); + border-color: darken(@red, 5%); +} + +.alert-warning { + &:extend(.bg-yellow); + border-color: darken(@yellow, 5%); +} + +.alert-info { + &:extend(.bg-aqua); + border-color: darken(@aqua, 5%); +} +*/ \ No newline at end of file diff --git a/docs/theme/input/assets/css/adminlte/_bootstrap-social.less b/docs/theme/input/assets/css/adminlte/_bootstrap-social.less new file mode 100644 index 000000000..93cfabd85 --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_bootstrap-social.less @@ -0,0 +1,172 @@ +/* + * Social Buttons for Bootstrap + * + * Copyright 2013-2015 Panayiotis Lipiridis + * Licensed under the MIT License + * + * https://github.com/lipis/bootstrap-social + */ + +@bs-height-base: (@line-height-computed + @padding-base-vertical * 2); +@bs-height-lg: (floor(@font-size-large * @line-height-base) + @padding-large-vertical * 2); +@bs-height-sm: (floor(@font-size-small * 1.5) + @padding-small-vertical * 2); +@bs-height-xs: (floor(@font-size-small * 1.2) + @padding-small-vertical + 1); + +.btn-social { + position: relative; + padding-left: (@bs-height-base + @padding-base-horizontal); + text-align: left; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + > :first-child { + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: @bs-height-base; + line-height: (@bs-height-base + 2); + font-size: 1.6em; + text-align: center; + border-right: 1px solid rgba(0, 0, 0, 0.2); + } + &.btn-lg { + padding-left: (@bs-height-lg + @padding-large-horizontal); + > :first-child { + line-height: @bs-height-lg; + width: @bs-height-lg; + font-size: 1.8em; + } + } + &.btn-sm { + padding-left: (@bs-height-sm + @padding-small-horizontal); + > :first-child { + line-height: @bs-height-sm; + width: @bs-height-sm; + font-size: 1.4em; + } + } + &.btn-xs { + padding-left: (@bs-height-xs + @padding-small-horizontal); + > :first-child { + line-height: @bs-height-xs; + width: @bs-height-xs; + font-size: 1.2em; + } + } +} + +.btn-social-icon { + .btn-social; + height: (@bs-height-base + 2); + width: (@bs-height-base + 2); + padding: 0; + > :first-child { + border: none; + text-align: center; + width: 100%; + } + &.btn-lg { + height: @bs-height-lg; + width: @bs-height-lg; + padding-left: 0; + padding-right: 0; + } + &.btn-sm { + height: (@bs-height-sm + 2); + width: (@bs-height-sm + 2); + padding-left: 0; + padding-right: 0; + } + &.btn-xs { + height: (@bs-height-xs + 2); + width: (@bs-height-xs + 2); + padding-left: 0; + padding-right: 0; + } +} + +.btn-social(@color-bg, @color: #fff) { + background-color: @color-bg; + .button-variant(@color, @color-bg, rgba(0, 0, 0, .2)); +} + +.btn-adn { + .btn-social(#d87a68); +} + +.btn-bitbucket { + .btn-social(#205081); +} + +.btn-dropbox { + .btn-social(#1087dd); +} + +.btn-facebook { + .btn-social(#3b5998); +} + +.btn-flickr { + .btn-social(#ff0084); +} + +.btn-foursquare { + .btn-social(#f94877); +} + +.btn-github { + .btn-social(#444444); +} + +.btn-google { + .btn-social(#dd4b39); +} + +.btn-instagram { + .btn-social(#3f729b); +} + +.btn-linkedin { + .btn-social(#007bb6); +} + +.btn-microsoft { + .btn-social(#2672ec); +} + +.btn-openid { + .btn-social(#f7931e); +} + +.btn-pinterest { + .btn-social(#cb2027); +} + +.btn-reddit { + .btn-social(#eff7ff, #000); +} + +.btn-soundcloud { + .btn-social(#ff5500); +} + +.btn-tumblr { + .btn-social(#2c4762); +} + +.btn-twitter { + .btn-social(#55acee); +} + +.btn-vimeo { + .btn-social(#1ab7ea); +} + +.btn-vk { + .btn-social(#587ea3); +} + +.btn-yahoo { + .btn-social(#720e9e); +} diff --git a/docs/theme/input/assets/css/adminlte/_boxes.less b/docs/theme/input/assets/css/adminlte/_boxes.less new file mode 100644 index 000000000..c92ef3bab --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_boxes.less @@ -0,0 +1,485 @@ +/* + * Component: Box + * -------------- + */ +.box { + position: relative; + .border-radius(@box-border-radius); + background: #ffffff; + border-top: 3px solid @box-default-border-top-color; + margin-bottom: 20px; + width: 100%; + box-shadow: @box-boxshadow; + + // Box color variations + &.box-primary { + border-top-color: @light-blue; + } + &.box-info { + border-top-color: @aqua; + } + &.box-danger { + border-top-color: @red; + } + &.box-warning { + border-top-color: @yellow; + } + &.box-success { + border-top-color: @green; + } + &.box-default { + border-top-color: @gray; + } + + // collapsed mode + &.collapsed-box { + .box-body, + .box-footer { + display: none; + } + } + + .nav-stacked { + > li { + border-bottom: 1px solid @box-border-color; + margin: 0; + &:last-of-type { + border-bottom: none; + } + } + } + + // fixed height to 300px + &.height-control { + .box-body { + max-height: 300px; + overflow: auto; + } + } + + .border-right { + border-right: 1px solid @box-border-color; + } + .border-left { + border-left: 1px solid @box-border-color; + } + + //SOLID BOX + //--------- + //use this class to get a colored header and borders + + &.box-solid { + border-top: 0; + > .box-header { + .btn.btn-default { + background: transparent; + } + .btn, + a { + &:hover { + background: rgba(0, 0, 0, 0.1); + } + } + } + + // Box color variations + &.box-default { + .box-solid-variant(@gray, #444); + } + &.box-primary { + .box-solid-variant(@light-blue); + } + &.box-info { + .box-solid-variant(@aqua); + } + &.box-danger { + .box-solid-variant(@red); + } + &.box-warning { + .box-solid-variant(@yellow); + } + &.box-success { + .box-solid-variant(@green); + } + + > .box-header > .box-tools .btn { + border: 0; + box-shadow: none; + } + + // Fix font color for tiles + &[class*='bg'] { + > .box-header { + color: #fff; + } + } + + } + + //BOX GROUP + .box-group { + > .box { + margin-bottom: 5px; + } + } + + // jQuery Knob in a box + .knob-label { + text-align: center; + color: #333; + font-weight: 100; + font-size: 12px; + margin-bottom: 0.3em; + } +} + +.box, +.overlay-wrapper { + // Box overlay for LOADING STATE effect + > .overlay, + > .loading-img { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + } + + .overlay { + z-index: 50; + background: rgba(255, 255, 255, 0.7); + .border-radius(@box-border-radius); + > .fa { + position: absolute; + top: 50%; + left: 50%; + margin-left: -15px; + margin-top: -15px; + color: #000; + font-size: 30px; + } + } + + .overlay.dark { + background: rgba(0, 0, 0, 0.5); + } +} + +//Add clearfix to header, body and footer +.box-header, +.box-body, +.box-footer { + .clearfix(); +} + +//Box header +.box-header { + color: #444; + display: block; + padding: @box-padding; + position: relative; + + //Add bottom border + &.with-border { + border-bottom: 1px solid @box-border-color; + .collapsed-box & { + border-bottom: none; + } + } + + //Icons and box title + > .fa, + > .glyphicon, + > .ion, + .box-title { + display: inline-block; + font-size: 18px; + margin: 0; + line-height: 1; + } + > .fa, + > .glyphicon, + > .ion { + margin-right: 5px; + } + > .box-tools { + position: absolute; + right: 10px; + top: 5px; + [data-toggle="tooltip"] { + position: relative; + } + + &.pull-right { + .dropdown-menu { + right: 0; + left: auto; + } + } + } +} + +//Box Tools Buttons +.btn-box-tool { + padding: 5px; + font-size: 12px; + background: transparent; + color: darken(@box-default-border-top-color, 20%); + .open &, + &:hover { + color: darken(@box-default-border-top-color, 40%); + } + &.btn:active { + box-shadow: none; + } +} + +//Box Body +.box-body { + .border-radius(0; 0; @box-border-radius; @box-border-radius); + padding: @box-padding; + .no-header & { + .border-top-radius(@box-border-radius); + } + // Tables within the box body + > .table { + margin-bottom: 0; + } + + // Calendar within the box body + .fc { + margin-top: 5px; + } + + .full-width-chart { + margin: -19px; + } + &.no-padding .full-width-chart { + margin: -9px; + } + + .box-pane { + .border-radius(0; 0; @box-border-radius; 0); + } + .box-pane-right { + .border-radius(0; 0; 0; @box-border-radius); + } +} + +//Box footer +.box-footer { + .border-radius(0; 0; @box-border-radius; @box-border-radius); + border-top: 1px solid @box-border-color; + padding: @box-padding; + background-color: @box-footer-bg; +} + +.chart-legend { + &:extend(.list-unstyled); + margin: 10px 0; + > li { + @media (max-width: @screen-sm-max) { + float: left; + margin-right: 10px; + } + } +} + +//Comment Box +.box-comments { + background: #f7f7f7; + .box-comment { + .clearfix(); + padding: 8px 0; + border-bottom: 1px solid #eee; + &:last-of-type { + border-bottom: 0; + } + &:first-of-type { + padding-top: 0; + } + img { + &:extend(.img-sm); + float: left; + } + } + .comment-text { + margin-left: 40px; + color: #555; + } + .username { + color: #444; + display: block; + font-weight: 600; + } + .text-muted { + font-weight: 400; + font-size: 12px; + } +} + +//Widgets +//----------- + +/* Widget: TODO LIST */ + +.todo-list { + margin: 0; + padding: 0; + list-style: none; + overflow: auto; + // Todo list element + > li { + .border-radius(2px); + padding: 10px; + background: #f4f4f4; + margin-bottom: 2px; + border-left: 2px solid #e6e7e8; + color: #444; + &:last-of-type { + margin-bottom: 0; + } + + > input[type='checkbox'] { + margin: 0 10px 0 5px; + } + + .text { + display: inline-block; + margin-left: 5px; + font-weight: 600; + } + + // Time labels + .label { + margin-left: 10px; + font-size: 9px; + } + + // Tools and options box + .tools { + display: none; + float: right; + color: @red; + // icons + > .fa, > .glyphicon, > .ion { + margin-right: 5px; + cursor: pointer; + } + + } + &:hover .tools { + display: inline-block; + } + + &.done { + color: #999; + .text { + text-decoration: line-through; + font-weight: 500; + } + + .label { + background: @gray !important; + } + } + } + + // Color varaity + .danger { + border-left-color: @red; + } + .warning { + border-left-color: @yellow; + } + .info { + border-left-color: @aqua; + } + .success { + border-left-color: @green; + } + .primary { + border-left-color: @light-blue; + } + + .handle { + display: inline-block; + cursor: move; + margin: 0 5px; + } + +} + +// END TODO WIDGET + +/* Chat widget (DEPRECATED - this will be removed in the next major release. Use Direct Chat instead)*/ +.chat { + padding: 5px 20px 5px 10px; + + .item { + .clearfix(); + margin-bottom: 10px; + // The image + > img { + width: 40px; + height: 40px; + border: 2px solid transparent; + .border-radius(50%); + } + + > .online { + border: 2px solid @green; + } + > .offline { + border: 2px solid @red; + } + + // The message body + > .message { + margin-left: 55px; + margin-top: -40px; + > .name { + display: block; + font-weight: 600; + } + } + + // The attachment + > .attachment { + .border-radius(@attachment-border-radius); + background: #f4f4f4; + margin-left: 65px; + margin-right: 15px; + padding: 10px; + > h4 { + margin: 0 0 5px 0; + font-weight: 600; + font-size: 14px; + } + > p, > .filename { + font-weight: 600; + font-size: 13px; + font-style: italic; + margin: 0; + + } + .clearfix(); + } + } + +} + +//END CHAT WIDGET + +//Input in box +.box-input { + max-width: 200px; +} + +//A fix for panels body text color when placed within +// a modal +.modal { + .panel-body { + color: #444; + } +} diff --git a/docs/theme/input/assets/css/adminlte/_buttons.less b/docs/theme/input/assets/css/adminlte/_buttons.less new file mode 100644 index 000000000..7a0aaa69e --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_buttons.less @@ -0,0 +1,168 @@ +/* + * Component: Button + * ----------------- + */ + +.btn { + .border-radius(@btn-border-radius); + .box-shadow(@btn-boxshadow); + border: 1px solid transparent; + + &.uppercase { + text-transform: uppercase + } + + // Flat buttons + &.btn-flat { + .border-radius(0); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + border-width: 1px; + } + + // Active state + &:active { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + } + + &:focus { + outline: none; + } + + // input file btn + &.btn-file { + position: relative; + overflow: hidden; + > input[type='file'] { + position: absolute; + top: 0; + right: 0; + min-width: 100%; + min-height: 100%; + font-size: 100px; + text-align: right; + .opacity(0); + outline: none; + background: white; + cursor: inherit; + display: block; + } + } +} + +//Button color variations +.btn-default { + background-color: #f4f4f4; + color: #444; + border-color: #ddd; + &:hover, + &:active, + &.hover { + background-color: darken(#f4f4f4, 5%); + } +} + +.btn-primary { + background-color: @light-blue; + border-color: darken(@light-blue, 5%); + &:hover, &:active, &.hover { + background-color: darken(@light-blue, 5%); + } +} + +.btn-success { + background-color: @green; + border-color: darken(@green, 5%); + &:hover, &:active, &.hover { + background-color: darken(@green, 5%); + } +} + +.btn-info { + background-color: @aqua; + border-color: darken(@aqua, 5%); + &:hover, &:active, &.hover { + background-color: darken(@aqua, 5%); + } +} + +.btn-danger { + background-color: @red; + border-color: darken(@red, 5%); + &:hover, &:active, &.hover { + background-color: darken(@red, 5%); + } +} + +.btn-warning { + background-color: @yellow; + border-color: darken(@yellow, 5%); + &:hover, &:active, &.hover { + background-color: darken(@yellow, 5%); + } +} + +.btn-outline { + border: 1px solid #fff; + background: transparent; + color: #fff; + &:hover, + &:focus, + &:active { + color: rgba(255, 255, 255, .7); + border-color: rgba(255, 255, 255, .7); + } +} + +.btn-link { + .box-shadow(none); +} + +//General .btn with bg class +.btn[class*='bg-']:hover { + .box-shadow(inset 0 0 100px rgba(0, 0, 0, 0.2)); +} + +// Application buttons +.btn-app { + .border-radius(3px); + position: relative; + padding: 15px 5px; + margin: 0 0 10px 10px; + min-width: 80px; + height: 60px; + text-align: center; + color: #666; + border: 1px solid #ddd; + background-color: #f4f4f4; + font-size: 12px; + //Icons within the btn + > .fa, > .glyphicon, > .ion { + font-size: 20px; + display: block; + } + + &:hover { + background: #f4f4f4; + color: #444; + border-color: #aaa; + } + + &:active, &:focus { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + } + + //The badge + > .badge { + position: absolute; + top: -3px; + right: -10px; + font-size: 10px; + font-weight: 400; + } +} diff --git a/docs/theme/input/assets/css/adminlte/_callout.less b/docs/theme/input/assets/css/adminlte/_callout.less new file mode 100644 index 000000000..9f6aaa1a2 --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_callout.less @@ -0,0 +1,48 @@ +/* + * Component: Callout + * ------------------ + */ + +// Base styles (regardless of theme) +.callout { + .border-radius(3px); + margin: 0 0 20px 0; + padding: 15px 30px 15px 15px; + border-left: 5px solid #eee; + a { + color: #fff; + text-decoration: underline; + &:hover { + color: #eee; + } + } + h4 { + margin-top: 0; + font-weight: 600; + } + p:last-child { + margin-bottom: 0; + } + code, + .highlight { + background-color: #fff; + } + + // Themes for different contexts + &.callout-danger { + &:extend(.bg-red); + border-color: darken(@red, 10%); + } + &.callout-warning { + &:extend(.bg-yellow); + border-color: darken(@yellow, 10%); + } + &.callout-info { + &:extend(.bg-aqua); + border-color: darken(@aqua, 10%); + } + &.callout-success { + &:extend(.bg-green); + border-color: darken(@green, 10%); + } +} diff --git a/docs/theme/input/assets/css/adminlte/_carousel.less b/docs/theme/input/assets/css/adminlte/_carousel.less new file mode 100644 index 000000000..f069109aa --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_carousel.less @@ -0,0 +1,18 @@ +/* + * Component: Carousel + * ------------------- + */ +.carousel-control { + &.left, + &.right { + background-image: none; + } + > .fa { + font-size: 40px; + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; + margin-top: -20px; + } +} diff --git a/docs/theme/input/assets/css/adminlte/_control-sidebar.less b/docs/theme/input/assets/css/adminlte/_control-sidebar.less new file mode 100644 index 000000000..fbb6d1f39 --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_control-sidebar.less @@ -0,0 +1,289 @@ +/* + * Component: Control sidebar. By default, this is the right sidebar. + */ +//The sidebar's background control class +//This is a hack to make the background visible while scrolling +.control-sidebar-bg { + position: fixed; + z-index: 1000; + bottom: 0; +} + +//Transitions +.control-sidebar-bg, +.control-sidebar { + top: 0; + right: -@control-sidebar-width; + width: @control-sidebar-width; + .transition(right @transition-speed ease-in-out); +} + +//The sidebar +.control-sidebar { + position: absolute; + padding-top: @navbar-height; + z-index: 1010; + //Fix position after header collapse + @media (max-width: @screen-sm) { + padding-top: @navbar-height + 50; + } + //Tab panes + > .tab-content { + padding: 10px 15px; + } + //Open state with slide over content effect + &.control-sidebar-open { + &, + + .control-sidebar-bg { + right: 0; + } + } +} + +//Open without slide over content +.control-sidebar-open { + .control-sidebar-bg, + .control-sidebar { + right: 0; + } + @media (min-width: @screen-sm) { + .content-wrapper, + .right-side, + .main-footer { + margin-right: @control-sidebar-width; + } + } +} + +//Control sidebar tabs +.nav-tabs.control-sidebar-tabs { + > li { + &:first-of-type > a { + &, + &:hover, + &:focus { + border-left-width: 0; + } + } + > a { + .border-radius(0); + + //Hover and active states + &, + &:hover { + border-top: none; + border-right: none; + border-left: 1px solid transparent; + border-bottom: 1px solid transparent; + } + .icon { + font-size: 16px; + } + } + //Active state + &.active { + > a { + &, + &:hover, + &:focus, + &:active { + border-top: none; + border-right: none; + border-bottom: none; + } + } + } + } + //Remove responsiveness on small screens + @media (max-width: @screen-sm) { + display: table; + > li { + display: table-cell; + } + } +} + +//Headings in the sidebar content +.control-sidebar-heading { + font-weight: 400; + font-size: 16px; + padding: 10px 0; + margin-bottom: 10px; +} + +//Subheadings +.control-sidebar-subheading { + display: block; + font-weight: 400; + font-size: 14px; +} + +//Control Sidebar Menu +.control-sidebar-menu { + list-style: none; + padding: 0; + margin: 0 -15px; + > li > a { + .clearfix(); + display: block; + padding: 10px 15px; + > .control-sidebar-subheading { + margin-top: 0; + } + } + .menu-icon { + float: left; + width: 35px; + height: 35px; + border-radius: 50%; + text-align: center; + line-height: 35px; + } + .menu-info { + margin-left: 45px; + margin-top: 3px; + > .control-sidebar-subheading { + margin: 0; + } + > p { + margin: 0; + font-size: 11px; + } + } + .progress { + margin: 0; + } +} + +//Dark skin +.control-sidebar-dark { + color: @sidebar-dark-color; + // Background + &, + + .control-sidebar-bg { + background: @sidebar-dark-bg; + } + // Sidebar tabs + .nav-tabs.control-sidebar-tabs { + border-bottom: darken(@sidebar-dark-bg, 3%); + > li { + > a { + background: darken(@sidebar-dark-bg, 5%); + color: @sidebar-dark-color; + //Hover and active states + &, + &:hover, + &:focus { + border-left-color: darken(@sidebar-dark-bg, 7%); + border-bottom-color: darken(@sidebar-dark-bg, 7%); + } + &:hover, + &:focus, + &:active { + background: darken(@sidebar-dark-bg, 3%); + } + &:hover { + color: #fff; + } + } + //Active state + &.active { + > a { + &, + &:hover, + &:focus, + &:active { + background: @sidebar-dark-bg; + color: #fff; + } + } + } + } + } + //Heading & subheading + .control-sidebar-heading, + .control-sidebar-subheading { + color: #fff; + } + //Sidebar list + .control-sidebar-menu { + > li { + > a { + &:hover { + background: @sidebar-dark-hover-bg; + } + .menu-info { + > p { + color: @sidebar-dark-color; + } + } + } + } + } +} + +//Light skin +.control-sidebar-light { + color: lighten(@sidebar-light-color, 10%); + // Background + &, + + .control-sidebar-bg { + background: @sidebar-light-bg; + border-left: 1px solid @gray; + } + // Sidebar tabs + .nav-tabs.control-sidebar-tabs { + border-bottom: @gray; + > li { + > a { + background: darken(@sidebar-light-bg, 5%); + color: @sidebar-light-color; + //Hover and active states + &, + &:hover, + &:focus { + border-left-color: @gray; + border-bottom-color: @gray; + } + &:hover, + &:focus, + &:active { + background: darken(@sidebar-light-bg, 3%); + } + } + //Active state + &.active { + > a { + &, + &:hover, + &:focus, + &:active { + background: @sidebar-light-bg; + color: #111; + } + } + } + } + } + //Heading & subheading + .control-sidebar-heading, + .control-sidebar-subheading { + color: #111; + } + //Sidebar list + .control-sidebar-menu { + margin-left: -14px; + > li { + > a { + &:hover { + background: @sidebar-light-hover-bg; + } + .menu-info { + > p { + color: lighten(@sidebar-light-color, 10%); + } + } + } + } + } +} diff --git a/docs/theme/input/assets/css/adminlte/_core.less b/docs/theme/input/assets/css/adminlte/_core.less new file mode 100644 index 000000000..bd9d1dfaa --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_core.less @@ -0,0 +1,174 @@ +/* + * Core: General Layout Style + * ------------------------- + */ +html, +body { + min-height: 100%; + .layout-boxed & { + height: 100%; + } +} + +body { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + font-family: @font-family-sans-serif; + font-weight: 400; + overflow-x: hidden; + overflow-y: auto; +} + +/* Layout */ +.wrapper { + .clearfix(); + min-height: 100%; + position: relative; + overflow: hidden; + .layout-boxed & { + max-width: 1250px; + margin: 0 auto; + min-height: 100%; + box-shadow: 0 0 8px rgba(0, 0, 0, 0.5); + position: relative; + } +} + +.layout-boxed { + background: url('@{boxed-layout-bg-image-path}') repeat fixed; +} + +/* + * Content Wrapper - contains the main content + * ```.right-side has been deprecated as of v2.0.0 in favor of .content-wrapper ``` + */ +.content-wrapper, +.right-side, +.main-footer { + //Using disposable variable to join statements with a comma + @transition-rule: @transition-speed @transition-fn, + margin @transition-speed @transition-fn; + .transition-transform(@transition-rule); + margin-left: @sidebar-width; + z-index: 820; + //Top nav layout + .layout-top-nav & { + margin-left: 0; + } + @media (max-width: @screen-xs-max) { + margin-left: 0; + } + //When opening the sidebar on large screens + .sidebar-collapse & { + @media (min-width: @screen-sm) { + margin-left: 0; + } + } + //When opening the sidebar on small screens + .sidebar-open & { + @media (max-width: @screen-xs-max) { + .translate(@sidebar-width, 0); + } + } +} + +.content-wrapper, +.right-side { + min-height: 100%; + background-color: @body-bg; + z-index: 800; +} + +.main-footer { + background: #fff; + padding: 15px; + color: #444; + border-top: 1px solid @gray; +} + +/* Fixed layout */ +.fixed { + .main-header, + .main-sidebar, + .left-side { + position: fixed; + } + .main-header { + top: 0; + right: 0; + left: 0; + } + .content-wrapper, + .right-side { + padding-top: 50px; + @media (max-width: @screen-header-collapse) { + padding-top: 100px; + } + } + &.layout-boxed { + .wrapper { + max-width: 100%; + } + } +} + +body.hold-transition { + .content-wrapper, + .right-side, + .main-footer, + .main-sidebar, + .left-side, + .main-header .navbar, + .main-header .logo { + /* Fix for IE */ + .transition(none); + } +} + +/* Content */ +.content { + min-height: 250px; + padding: 15px; + .container-fixed(@grid-gutter-width); +} + +/* H1 - H6 font */ +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: @font-family-sans-serif; +} + +/* General Links */ +a { + color: @link-color; +} + +a:hover, +a:active, +a:focus { + outline: none; + text-decoration: none; + color: @link-hover-color; +} + +/* Page Header */ +.page-header { + margin: 10px 0 20px 0; + font-size: 22px; + + > small { + color: #666; + display: block; + margin-top: 5px; + } +} diff --git a/docs/theme/input/assets/css/adminlte/_direct-chat.less b/docs/theme/input/assets/css/adminlte/_direct-chat.less new file mode 100644 index 000000000..f35c07dd1 --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_direct-chat.less @@ -0,0 +1,194 @@ +/* + * Component: Direct Chat + * ---------------------- + */ +.direct-chat { + .box-body { + .border-bottom-radius(0); + position: relative; + overflow-x: hidden; + padding: 0; + } + &.chat-pane-open { + .direct-chat-contacts { + .translate(0, 0); + } + } +} + +.direct-chat-messages { + .translate(0, 0); + padding: 10px; + height: 250px; + overflow: auto; +} + +.direct-chat-msg, +.direct-chat-text { + display: block; +} + +.direct-chat-msg { + .clearfix(); + margin-bottom: 10px; +} + +.direct-chat-messages, +.direct-chat-contacts { + .transition-transform(.5s ease-in-out); +} + +.direct-chat-text { + .border-radius(5px); + position: relative; + padding: 5px 10px; + background: @direct-chat-default-msg-bg; + border: 1px solid @direct-chat-default-msg-border-color; + margin: 5px 0 0 50px; + color: @direct-chat-default-font-color; + + //Create the arrow + &:after, + &:before { + position: absolute; + right: 100%; + top: 15px; + border: solid transparent; + border-right-color: @direct-chat-default-msg-border-color; + content: ' '; + height: 0; + width: 0; + pointer-events: none; + } + + &:after { + border-width: 5px; + margin-top: -5px; + } + &:before { + border-width: 6px; + margin-top: -6px; + } + .right & { + margin-right: 50px; + margin-left: 0; + &:after, + &:before { + right: auto; + left: 100%; + border-right-color: transparent; + border-left-color: @direct-chat-default-msg-border-color; + } + } +} + +.direct-chat-img { + .border-radius(50%); + float: left; + width: 40px; + height: 40px; + .right & { + float: right; + } +} + +.direct-chat-info { + display: block; + margin-bottom: 2px; + font-size: 12px; +} + +.direct-chat-name { + font-weight: 600; +} + +.direct-chat-timestamp { + color: #999; +} + +//Direct chat contacts pane +.direct-chat-contacts-open { + .direct-chat-contacts { + .translate(0, 0); + } +} + +.direct-chat-contacts { + .translate(101%, 0); + position: absolute; + top: 0; + bottom: 0; + height: 250px; + width: 100%; + background: #222d32; + color: #fff; + overflow: auto; +} + +//Contacts list -- for displaying contacts in direct chat contacts pane +.contacts-list { + &:extend(.list-unstyled); + > li { + .clearfix(); + border-bottom: 1px solid rgba(0, 0, 0, 0.2); + padding: 10px; + margin: 0; + &:last-of-type { + border-bottom: none; + } + } +} + +.contacts-list-img { + .border-radius(50%); + width: 40px; + float: left; +} + +.contacts-list-info { + margin-left: 45px; + color: #fff; +} + +.contacts-list-name, +.contacts-list-status { + display: block; +} + +.contacts-list-name { + font-weight: 600; +} + +.contacts-list-status { + font-size: 12px; +} + +.contacts-list-date { + color: #aaa; + font-weight: normal; +} + +.contacts-list-msg { + color: #999; +} + +//Direct Chat Variants +.direct-chat-danger { + .direct-chat-variant(@red); +} + +.direct-chat-primary { + .direct-chat-variant(@light-blue); +} + +.direct-chat-warning { + .direct-chat-variant(@yellow); +} + +.direct-chat-info { + .direct-chat-variant(@aqua); +} + +.direct-chat-success { + .direct-chat-variant(@green); +} diff --git a/docs/theme/input/assets/css/adminlte/_dropdown.less b/docs/theme/input/assets/css/adminlte/_dropdown.less new file mode 100644 index 000000000..6c0e212dc --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_dropdown.less @@ -0,0 +1,350 @@ +/* + * Component: Dropdown menus + * ------------------------- + */ + +/*Dropdowns in general*/ +.dropdown-menu { + box-shadow: none; + border-color: #eee; + > li > a { + color: #777; + } + > li > a > .glyphicon, + > li > a > .fa, + > li > a > .ion { + margin-right: 10px; + } + > li > a:hover { + background-color: lighten(@gray, 5%); + color: #333; + } + > .divider { + background-color: #eee; + } +} + +//Navbar custom dropdown menu +.navbar-nav > .notifications-menu, +.navbar-nav > .messages-menu, +.navbar-nav > .tasks-menu { + //fix width and padding + > .dropdown-menu { + > li { + position: relative; + } + width: 280px; + //Remove padding and margins + padding: 0 0 0 0; + margin: 0; + top: 100%; + } + //Define header class + > .dropdown-menu > li.header { + .border-radius(4px; 4px; 0; 0); + background-color: #ffffff; + padding: 7px 10px; + border-bottom: 1px solid #f4f4f4; + color: #444444; + font-size: 14px; + } + + //Define footer class + > .dropdown-menu > li.footer > a { + .border-radius(0; 0; 4px; 4px); + font-size: 12px; + background-color: #fff; + padding: 7px 10px; + border-bottom: 1px solid #eeeeee; + color: #444 !important; + @media (max-width: @screen-sm-max) { + background: #fff !important; + color: #444 !important; + } + text-align: center; + //Hover state + &:hover { + text-decoration: none; + font-weight: normal; + } + } + + //Clear inner menu padding and margins + > .dropdown-menu > li .menu { + max-height: 200px; + margin: 0; + padding: 0; + list-style: none; + overflow-x: hidden; + > li > a { + display: block; + white-space: nowrap; /* Prevent text from breaking */ + border-bottom: 1px solid #f4f4f4; + // Hove state + &:hover { + background: #f4f4f4; + text-decoration: none; + } + } + } +} + +//Notifications menu +.navbar-nav > .notifications-menu { + > .dropdown-menu > li .menu { + // Links inside the menu + > li > a { + color: #444444; + overflow: hidden; + text-overflow: ellipsis; + padding: 10px; + // Icons inside the menu + > .glyphicon, + > .fa, + > .ion { + width: 20px; + } + } + + } +} + +//Messages menu +.navbar-nav > .messages-menu { + //Inner menu + > .dropdown-menu > li .menu { + // Messages menu item + > li > a { + margin: 0; + //line-height: 20px; + padding: 10px 10px; + // User image + > div > img { + margin: auto 10px auto auto; + width: 40px; + height: 40px; + } + // Message heading + > h4 { + padding: 0; + margin: 0 0 0 45px; + color: #444444; + font-size: 15px; + position: relative; + // Small for message time display + > small { + color: #999999; + font-size: 10px; + position: absolute; + top: 0; + right: 0; + } + } + + > p { + margin: 0 0 0 45px; + font-size: 12px; + color: #888888; + } + + .clearfix(); + + } + + } +} + +//Tasks menu +.navbar-nav > .tasks-menu { + > .dropdown-menu > li .menu { + > li > a { + padding: 10px; + + > h3 { + font-size: 14px; + padding: 0; + margin: 0 0 10px 0; + color: #666666; + } + + > .progress { + padding: 0; + margin: 0; + } + } + } +} + +//User menu +.navbar-nav > .user-menu { + > .dropdown-menu { + .border-top-radius(0); + padding: 1px 0 0 0; + border-top-width: 0; + width: 280px; + + &, + > .user-body { + .border-bottom-radius(4px); + } + // Header menu + > li.user-header { + height: 175px; + padding: 10px; + text-align: center; + // User image + > img { + z-index: 5; + height: 90px; + width: 90px; + border: 3px solid; + border-color: transparent; + border-color: rgba(255, 255, 255, 0.2); + } + > p { + z-index: 5; + color: #fff; + color: rgba(255, 255, 255, 0.8); + font-size: 17px; + //text-shadow: 2px 2px 3px #333333; + margin-top: 10px; + > small { + display: block; + font-size: 12px; + } + } + } + + // Menu Body + > .user-body { + padding: 15px; + border-bottom: 1px solid #f4f4f4; + border-top: 1px solid #dddddd; + .clearfix(); + a { + color: #444 !important; + @media (max-width: @screen-sm-max) { + background: #fff !important; + color: #444 !important; + } + } + } + + // Menu Footer + > .user-footer { + background-color: #f9f9f9; + padding: 10px; + .clearfix(); + .btn-default { + color: #666666; + &:hover { + @media (max-width: @screen-sm-max) { + background-color: #f9f9f9; + } + } + } + } + } + .user-image { + float: left; + width: 25px; + height: 25px; + border-radius: 50%; + margin-right: 10px; + margin-top: -2px; + @media (max-width: @screen-xs-max) { + float: none; + margin-right: 0; + margin-top: -8px; + line-height: 10px; + } + } +} + +/* Add fade animation to dropdown menus by appending + the class .animated-dropdown-menu to the .dropdown-menu ul (or ol)*/ +.open:not(.dropup) > .animated-dropdown-menu { + backface-visibility: visible !important; + .animation(flipInX .7s both); + +} + +@keyframes flipInX { + 0% { + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transition-timing-function: ease-in; + opacity: 0; + } + + 40% { + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transition-timing-function: ease-in; + } + + 60% { + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + + 80% { + transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + + 100% { + transform: perspective(400px); + } +} + +@-webkit-keyframes flipInX { + 0% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + -webkit-transition-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + -webkit-transition-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + + 100% { + -webkit-transform: perspective(400px); + } +} + +/* Fix dropdown menu in navbars */ +.navbar-custom-menu > .navbar-nav { + > li { + position: relative; + > .dropdown-menu { + position: absolute; + right: 0; + left: auto; + } + } +} + +@media (max-width: @screen-sm-max) { + .navbar-custom-menu > .navbar-nav { + float: right; + > li { + position: static; + > .dropdown-menu { + position: absolute; + right: 5%; + left: auto; + border: 1px solid #ddd; + background: #fff; + } + } + } +} diff --git a/docs/theme/input/assets/css/adminlte/_forms.less b/docs/theme/input/assets/css/adminlte/_forms.less new file mode 100644 index 000000000..f8e4c5a29 --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_forms.less @@ -0,0 +1,108 @@ +/* + * Component: Form + * --------------- + */ +.form-control { + .border-radius(@input-radius); + box-shadow: none; + border-color: @gray; + &:focus { + border-color: @light-blue; + box-shadow: none; + } + &::-moz-placeholder, + &:-ms-input-placeholder, + &::-webkit-input-placeholder { + color: #bbb; + opacity: 1; + } + + &:not(select) { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + } +} + +.form-group { + &.has-success { + label { + color: @green; + } + .form-control, + .input-group-addon { + border-color: @green; + box-shadow: none; + } + .help-block { + color: @green; + } + } + + &.has-warning { + label { + color: @yellow; + } + .form-control, + .input-group-addon { + border-color: @yellow; + box-shadow: none; + } + .help-block { + color: @yellow; + } + } + + &.has-error { + label { + color: @red; + } + .form-control, + .input-group-addon { + border-color: @red; + box-shadow: none; + } + .help-block { + color: @red; + } + } +} + +/* Input group */ +.input-group { + .input-group-addon { + .border-radius(@input-radius); + border-color: @gray; + background-color: #fff; + } +} + +/* button groups */ +.btn-group-vertical { + .btn { + &.btn-flat:first-of-type, &.btn-flat:last-of-type { + .border-radius(0); + } + } +} + +.icheck > label { + padding-left: 0; +} + +/* support Font Awesome icons in form-control */ +.form-control-feedback.fa { + line-height: @input-height-base; +} + +.input-lg + .form-control-feedback.fa, +.input-group-lg + .form-control-feedback.fa, +.form-group-lg .form-control + .form-control-feedback.fa { + line-height: @input-height-large; +} + +.input-sm + .form-control-feedback.fa, +.input-group-sm + .form-control-feedback.fa, +.form-group-sm .form-control + .form-control-feedback.fa { + line-height: @input-height-small; +} diff --git a/docs/theme/input/assets/css/adminlte/_fullcalendar.less b/docs/theme/input/assets/css/adminlte/_fullcalendar.less new file mode 100644 index 000000000..f0285145f --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_fullcalendar.less @@ -0,0 +1,100 @@ +/* + * Plugin: Full Calendar + * --------------------- + */ +//Fullcalendar buttons +.fc-button { + background: #f4f4f4; + background-image: none; + color: #444; + border-color: #ddd; + border-bottom-color: #ddd; + &:hover, + &:active, + &.hover { + background-color: #e9e9e9; + } +} + +// Calendar title +.fc-header-title h2 { + font-size: 15px; + line-height: 1.6em; + color: #666; + margin-left: 10px; +} + +.fc-header-right { + padding-right: 10px; +} + +.fc-header-left { + padding-left: 10px; +} + +// Calendar table header cells +.fc-widget-header { + background: #fafafa; +} + +.fc-grid { + width: 100%; + border: 0; +} + +.fc-widget-header:first-of-type, +.fc-widget-content:first-of-type { + border-left: 0; + border-right: 0; +} + +.fc-widget-header:last-of-type, +.fc-widget-content:last-of-type { + border-right: 0; +} + +.fc-toolbar { + padding: @box-padding; + margin: 0; +} + +.fc-day-number { + font-size: 20px; + font-weight: 300; + padding-right: 10px; +} + +.fc-color-picker { + list-style: none; + margin: 0; + padding: 0; + > li { + float: left; + font-size: 30px; + margin-right: 5px; + line-height: 30px; + .fa { + .transition-transform(linear .3s); + &:hover { + .rotate(30deg); + } + } + } +} + +#add-new-event { + .transition(all linear .3s); +} + +.external-event { + padding: 5px 10px; + font-weight: bold; + margin-bottom: 4px; + box-shadow: @box-boxshadow; + text-shadow: @box-boxshadow; + border-radius: @box-border-radius; + cursor: move; + &:hover { + box-shadow: inset 0 0 90px rgba(0, 0, 0, 0.2); + } +} diff --git a/docs/theme/input/assets/css/adminlte/_header.less b/docs/theme/input/assets/css/adminlte/_header.less new file mode 100644 index 000000000..bdb202ac5 --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_header.less @@ -0,0 +1,248 @@ +/* + * Component: Main Header + * ---------------------- + */ + +.main-header { + position: relative; + max-height: 100px; + z-index: 1030; + //Navbar + .navbar { + .transition(margin-left @transition-speed @transition-fn); + margin-bottom: 0; + margin-left: @sidebar-width; + border: none; + min-height: @navbar-height; + border-radius: 0; + .layout-top-nav & { + margin-left: 0; + } + } + //Navbar search text input + #navbar-search-input.form-control { + background: rgba(255, 255, 255, .2); + border-color: transparent; + &:focus, + &:active { + border-color: rgba(0, 0, 0, .1); + background: rgba(255, 255, 255, .9); + } + &::-moz-placeholder { + color: #ccc; + opacity: 1; + } + &:-ms-input-placeholder { + color: #ccc; + } + &::-webkit-input-placeholder { + color: #ccc; + } + } + //Navbar Right Menu + .navbar-custom-menu, + .navbar-right { + float: right; + @media (max-width: @screen-sm-max) { + a { + color: inherit; + background: transparent; + } + } + } + .navbar-right { + @media (max-width: @screen-header-collapse) { + float: none; + .navbar-collapse & { + margin: 7.5px -15px; + } + + > li { + color: inherit; + border: 0; + } + } + } + //Navbar toggle button + .sidebar-toggle { + float: left; + background-color: transparent; + background-image: none; + padding: @navbar-padding-vertical @navbar-padding-horizontal; + //Add the fontawesome bars icon + font-family: fontAwesome; + &:before { + content: "\f0c9"; + } + &:hover { + color: #fff; + } + &:focus, + &:active { + background: transparent; + } + } + .sidebar-toggle .icon-bar { + display: none; + } + //Navbar User Menu + .navbar .nav > li.user > a { + > .fa, + > .glyphicon, + > .ion { + margin-right: 5px; + } + } + + //Labels in navbar + .navbar .nav > li > a > .label { + position: absolute; + top: 9px; + right: 7px; + text-align: center; + font-size: 9px; + padding: 2px 3px; + line-height: .9; + } + + //Logo bar + .logo { + .transition(width @transition-speed @transition-fn); + display: block; + float: left; + height: @navbar-height; + font-size: 20px; + line-height: 50px; + text-align: center; + width: @sidebar-width; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + padding: 0 15px; + font-weight: 300; + overflow: hidden; + //Add support to sidebar mini by allowing the user to create + //2 logo designs. mini and lg + .logo-lg { + //should be visibile when sidebar isn't collapsed + display: block; + } + .logo-mini { + display: none; + } + } + //Navbar Brand. Alternative logo with layout-top-nav + .navbar-brand { + color: #fff; + } +} + +// Content Header +.content-header { + position: relative; + padding: 15px 15px 0 15px; + // Header Text + > h1 { + margin: 0; + font-size: 24px; + > small { + font-size: 15px; + display: inline-block; + padding-left: 4px; + font-weight: 300; + } + } + + > .breadcrumb { + float: right; + background: transparent; + margin-top: 0; + margin-bottom: 0; + font-size: 12px; + padding: 7px 5px; + position: absolute; + top: 15px; + right: 10px; + .border-radius(2px); + > li > a { + color: #444; + text-decoration: none; + display: inline-block; + > .fa, > .glyphicon, > .ion { + margin-right: 5px; + } + } + > li + li:before { + content: '>\00a0'; + } + } + + @media (max-width: @screen-sm-max) { + > .breadcrumb { + position: relative; + margin-top: 5px; + top: 0; + right: 0; + float: none; + background: @gray; + padding-left: 10px; + li:before { + color: darken(@gray, 20%); + } + } + } +} + +.navbar-toggle { + color: #fff; + border: 0; + margin: 0; + padding: @navbar-padding-vertical @navbar-padding-horizontal; +} + +//Control navbar scaffolding on x-small screens +@media (max-width: @screen-sm-max) { + .navbar-custom-menu .navbar-nav > li { + float: left; + } + + //Dont't let links get full width + .navbar-custom-menu .navbar-nav { + margin: 0; + float: left; + } + + .navbar-custom-menu .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + line-height: 20px; + } +} + +// Collapse header +@media (max-width: @screen-header-collapse) { + .main-header { + position: relative; + .logo, + .navbar { + width: 100%; + float: none; + } + .navbar { + margin: 0; + } + .navbar-custom-menu { + float: right; + } + } +} + +.navbar-collapse.pull-left { + @media (max-width: @screen-sm-max) { + float: none !important; + + .navbar-custom-menu { + display: block; + position: absolute; + top: 0; + right: 40px; + } + } +} diff --git a/docs/theme/input/assets/css/adminlte/_info-box.less b/docs/theme/input/assets/css/adminlte/_info-box.less new file mode 100644 index 000000000..f8df3a8bf --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_info-box.less @@ -0,0 +1,75 @@ +/* + * Component: Info Box + * ------------------- + */ +.info-box { + display: block; + min-height: 90px; + background: #fff; + width: 100%; + box-shadow: @box-boxshadow; + .border-radius(2px); + margin-bottom: 15px; + small { + font-size: 14px; + } + .progress { + background: rgba(0, 0, 0, .2); + margin: 5px -10px 5px -10px; + height: 2px; + &, + & .progress-bar { + .border-radius(0); + } + .progress-bar { + background: #fff; + } + } +} + +.info-box-icon { + .border-radius(2px; 0; 2px; 0); + display: block; + float: left; + height: 90px; + width: 90px; + text-align: center; + font-size: 45px; + line-height: 90px; + background: rgba(0, 0, 0, 0.2); + > img { + max-width: 100%; + } +} + +.info-box-content { + padding: 5px 10px; + margin-left: 90px; +} + +.info-box-number { + display: block; + font-weight: bold; + font-size: 18px; +} + +.progress-description, +.info-box-text { + display: block; + font-size: 14px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.info-box-text { + text-transform: uppercase; +} + +.info-box-more { + display: block; +} + +.progress-description { + margin: 0; +} diff --git a/docs/theme/input/assets/css/adminlte/_invoice.less b/docs/theme/input/assets/css/adminlte/_invoice.less new file mode 100644 index 000000000..3d2fcf8dd --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_invoice.less @@ -0,0 +1,16 @@ +/* + * Page: Invoice + * ------------- + */ + +.invoice { + position: relative; + background: #fff; + border: 1px solid #f4f4f4; + padding: 20px; + margin: 10px 25px; +} + +.invoice-title { + margin-top: 0; +} diff --git a/docs/theme/input/assets/css/adminlte/_labels.less b/docs/theme/input/assets/css/adminlte/_labels.less new file mode 100644 index 000000000..902ca0030 --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_labels.less @@ -0,0 +1,28 @@ +/* + * Component: Label + * ---------------- + */ +.label-default { + background-color: @gray; + color: #444; +} + +.label-danger { + &:extend(.bg-red); +} + +.label-info { + &:extend(.bg-aqua); +} + +.label-warning { + &:extend(.bg-yellow); +} + +.label-primary { + &:extend(.bg-light-blue); +} + +.label-success { + &:extend(.bg-green); +} diff --git a/docs/theme/input/assets/css/adminlte/_lockscreen.less b/docs/theme/input/assets/css/adminlte/_lockscreen.less new file mode 100644 index 000000000..df52e3bad --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_lockscreen.less @@ -0,0 +1,73 @@ +/* + * Page: Lock Screen + * ----------------- + */ +/* ADD THIS CLASS TO THE TAG */ +.lockscreen { + background: @gray; +} + +.lockscreen-logo { + font-size: 35px; + text-align: center; + margin-bottom: 25px; + font-weight: 300; + a { + color: #444; + } +} + +.lockscreen-wrapper { + max-width: 400px; + margin: 0 auto; + margin-top: 10%; +} + +/* User name [optional] */ +.lockscreen .lockscreen-name { + text-align: center; + font-weight: 600; +} + +/* Will contain the image and the sign in form */ +.lockscreen-item { + .border-radius(4px); + padding: 0; + background: #fff; + position: relative; + margin: 10px auto 30px auto; + width: 290px; +} + +/* User image */ +.lockscreen-image { + .border-radius(50%); + position: absolute; + left: -10px; + top: -25px; + background: #fff; + padding: 5px; + z-index: 10; + > img { + .border-radius(50%); + width: 70px; + height: 70px; + } +} + +/* Contains the password input and the login button */ +.lockscreen-credentials { + margin-left: 70px; + .form-control { + border: 0; + } + .btn { + background-color: #fff; + border: 0; + padding: 0 10px; + } +} + +.lockscreen-footer { + margin-top: 10px; +} diff --git a/docs/theme/input/assets/css/adminlte/_login_and_register.less b/docs/theme/input/assets/css/adminlte/_login_and_register.less new file mode 100644 index 000000000..453043f0f --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_login_and_register.less @@ -0,0 +1,52 @@ +/* + * Page: Login & Register + * ---------------------- + */ + +.login-logo, +.register-logo { + font-size: 35px; + text-align: center; + margin-bottom: 25px; + font-weight: 300; + a { + color: #444; + } +} + +.login-page, +.register-page { + background: @gray; +} + +.login-box, +.register-box { + width: 360px; + margin: 7% auto; + @media (max-width: @screen-sm) { + width: 90%; + margin-top: 20px; + } +} + +.login-box-body, +.register-box-body { + background: #fff; + padding: 20px; + border-top: 0; + color: #666; + .form-control-feedback { + color: #777; + } +} + +.login-box-msg, +.register-box-msg { + margin: 0; + text-align: center; + padding: 0 20px 20px 20px; +} + +.social-auth-links { + margin: 10px 0; +} diff --git a/docs/theme/input/assets/css/adminlte/_mailbox.less b/docs/theme/input/assets/css/adminlte/_mailbox.less new file mode 100644 index 000000000..8e7a429f5 --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_mailbox.less @@ -0,0 +1,88 @@ +/* + * Page: Mailbox + * ------------- + */ +.mailbox-messages { + > .table { + margin: 0; + } +} + +.mailbox-controls { + padding: 5px; + &.with-border { + border-bottom: 1px solid @box-border-color; + } +} + +.mailbox-read-info { + border-bottom: 1px solid @box-border-color; + padding: 10px; + h3 { + font-size: 20px; + margin: 0; + } + h5 { + margin: 0; + padding: 5px 0 0 0; + } +} + +.mailbox-read-time { + color: #999; + font-size: 13px; +} + +.mailbox-read-message { + padding: 10px; +} + +.mailbox-attachments { + &:extend(.list-unstyled); + li { + float: left; + width: 200px; + border: 1px solid #eee; + margin-bottom: 10px; + margin-right: 10px; + } +} + +.mailbox-attachment-name { + font-weight: bold; + color: #666; +} + +.mailbox-attachment-icon, +.mailbox-attachment-info, +.mailbox-attachment-size { + display: block; +} + +.mailbox-attachment-info { + padding: 10px; + background: #f4f4f4; +} + +.mailbox-attachment-size { + color: #999; + font-size: 12px; +} + +.mailbox-attachment-icon { + text-align: center; + font-size: 65px; + color: #666; + padding: 20px 10px; + &.has-img { + padding: 0; + > img { + max-width: 100%; + height: auto; + } + } +} + +.mailbox-attachment-close { + &:extend(.close); +} diff --git a/docs/theme/input/assets/css/adminlte/_miscellaneous.less b/docs/theme/input/assets/css/adminlte/_miscellaneous.less new file mode 100644 index 000000000..04f0f2d68 --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_miscellaneous.less @@ -0,0 +1,606 @@ +/* + * General: Miscellaneous + * ---------------------- + */ +// 10px padding and margins +.pad { + padding: 10px; +} + +.margin { + margin: 10px; +} + +.margin-bottom { + margin-bottom: 20px; +} + +.margin-bottom-none { + margin-bottom: 0; +} + +.margin-r-5 { + margin-right: 5px; +} + +// Display inline +.inline { + display: inline; +} + +// Description Blocks +.description-block { + display: block; + margin: 10px 0; + text-align: center; + &.margin-bottom { + margin-bottom: 25px; + } + > .description-header { + margin: 0; + padding: 0; + font-weight: 600; + font-size: 16px; + } + > .description-text { + text-transform: uppercase; + } +} + +// Background colors +.bg-red, +.bg-yellow, +.bg-aqua, +.bg-blue, +.bg-light-blue, +.bg-green, +.bg-navy, +.bg-teal, +.bg-olive, +.bg-lime, +.bg-orange, +.bg-fuchsia, +.bg-purple, +.bg-maroon, +.bg-black, +.bg-red-active, +.bg-yellow-active, +.bg-aqua-active, +.bg-blue-active, +.bg-light-blue-active, +.bg-green-active, +.bg-navy-active, +.bg-teal-active, +.bg-olive-active, +.bg-lime-active, +.bg-orange-active, +.bg-fuchsia-active, +.bg-purple-active, +.bg-maroon-active, +.bg-black-active { + color: #fff !important; +} + +.bg-gray { + color: #000; + background-color: @gray !important; +} + +.bg-gray-light { + background-color: #f7f7f7; +} + +.bg-black { + background-color: @black !important; +} + +.bg-red { + background-color: @red !important; +} + +.bg-yellow { + background-color: @yellow !important; +} + +.bg-aqua { + background-color: @aqua !important; +} + +.bg-blue { + background-color: @blue !important; +} + +.bg-light-blue { + background-color: @light-blue !important; +} + +.bg-green { + background-color: @green !important; +} + +.bg-navy { + background-color: @navy !important; +} + +.bg-teal { + background-color: @teal !important; +} + +.bg-olive { + background-color: @olive !important; +} + +.bg-lime { + background-color: @lime !important; +} + +.bg-orange { + background-color: @orange !important; +} + +.bg-fuchsia { + background-color: @fuchsia !important; +} + +.bg-purple { + background-color: @purple !important; +} + +.bg-maroon { + background-color: @maroon !important; +} + +//Set of Active Background Colors +.bg-gray-active { + color: #000; + background-color: darken(@gray, 10%) !important; +} + +.bg-black-active { + background-color: darken(@black, 10%) !important; +} + +.bg-red-active { + background-color: darken(@red , 6%) !important; +} + +.bg-yellow-active { + background-color: darken(@yellow , 6%) !important; +} + +.bg-aqua-active { + background-color: darken(@aqua , 6%) !important; +} + +.bg-blue-active { + background-color: darken(@blue , 10%) !important; +} + +.bg-light-blue-active { + background-color: darken(@light-blue , 6%) !important; +} + +.bg-green-active { + background-color: darken(@green , 5%) !important; +} + +.bg-navy-active { + background-color: darken(@navy , 2%) !important; +} + +.bg-teal-active { + background-color: darken(@teal , 5%) !important; +} + +.bg-olive-active { + background-color: darken(@olive , 5%) !important; +} + +.bg-lime-active { + background-color: darken(@lime , 5%) !important; +} + +.bg-orange-active { + background-color: darken(@orange , 5%) !important; +} + +.bg-fuchsia-active { + background-color: darken(@fuchsia , 5%) !important; +} + +.bg-purple-active { + background-color: darken(@purple , 5%) !important; +} + +.bg-maroon-active { + background-color: darken(@maroon , 3%) !important; +} + +//Disabled! +[class^="bg-"].disabled { + .opacity(.65); +} + +// Text colors +.text-red { + color: @red !important; +} + +.text-yellow { + color: @yellow !important; +} + +.text-aqua { + color: @aqua !important; +} + +.text-blue { + color: @blue !important; +} + +.text-black { + color: @black !important; +} + +.text-light-blue { + color: @light-blue !important; +} + +.text-green { + color: @green !important; +} + +.text-gray { + color: @gray !important; +} + +.text-navy { + color: @navy !important; +} + +.text-teal { + color: @teal !important; +} + +.text-olive { + color: @olive !important; +} + +.text-lime { + color: @lime !important; +} + +.text-orange { + color: @orange !important; +} + +.text-fuchsia { + color: @fuchsia !important; +} + +.text-purple { + color: @purple !important; +} + +.text-maroon { + color: @maroon !important; +} + +.link-muted { + color: darken(@gray, 30%); + &:hover, + &:focus { + color: darken(@gray, 40%); + } +} + +.link-black { + color: #666; + &:hover, + &:focus { + color: #999; + } +} + +// Hide elements by display none only +.hide { + display: none !important; +} + +// Remove borders +.no-border { + border: 0 !important; +} + +// Remove padding +.no-padding { + padding: 0 !important; +} + +// Remove margins +.no-margin { + margin: 0 !important; +} + +// Remove box shadow +.no-shadow { + box-shadow: none !important; +} + +// Unstyled List +.list-unstyled { + list-style: none; + margin: 0; + padding: 0; +} + +.list-group-unbordered { + > .list-group-item { + border-left: 0; + border-right: 0; + border-radius: 0; + padding-left: 0; + padding-right: 0; + } +} + +// Remove border radius +.flat { + .border-radius(0) !important; +} + +.text-bold { + &, &.table td, &.table th { + font-weight: 700; + } +} + +.text-sm { + font-size: 12px; +} + +// _fix for sparkline tooltip +.jqstooltip { + padding: 5px !important; + width: auto !important; + height: auto !important; +} + +// Gradient Background colors +.bg-teal-gradient { + .gradient(@teal; @teal; lighten(@teal, 16%)) !important; + color: #fff; +} + +.bg-light-blue-gradient { + .gradient(@light-blue; @light-blue; lighten(@light-blue, 12%)) !important; + color: #fff; +} + +.bg-blue-gradient { + .gradient(@blue; @blue; lighten(@blue, 7%)) !important; + color: #fff; +} + +.bg-aqua-gradient { + .gradient(@aqua; @aqua; lighten(@aqua, 7%)) !important; + color: #fff; +} + +.bg-yellow-gradient { + .gradient(@yellow; @yellow; lighten(@yellow, 16%)) !important; + color: #fff; +} + +.bg-purple-gradient { + .gradient(@purple; @purple; lighten(@purple, 16%)) !important; + color: #fff; +} + +.bg-green-gradient { + .gradient(@green; @green; lighten(@green, 7%)) !important; + color: #fff; +} + +.bg-red-gradient { + .gradient(@red; @red; lighten(@red, 10%)) !important; + color: #fff; +} + +.bg-black-gradient { + .gradient(@black; @black; lighten(@black, 10%)) !important; + color: #fff; +} + +.bg-maroon-gradient { + .gradient(@maroon; @maroon; lighten(@maroon, 10%)) !important; + color: #fff; +} + +//Description Block Extension +.description-block { + .description-icon { + font-size: 16px; + } +} + +//Remove top padding +.no-pad-top { + padding-top: 0; +} + +//Make position static +.position-static { + position: static !important; +} + +//List utility classes +.list-header { + font-size: 15px; + padding: 10px 4px; + font-weight: bold; + color: #666; +} + +.list-seperator { + height: 1px; + background: @box-border-color; + margin: 15px 0 9px 0; +} + +.list-link { + > a { + padding: 4px; + color: #777; + &:hover { + color: #222; + } + } +} + +//Light font weight +.font-light { + font-weight: 300; +} + +//User block +.user-block { + .clearfix(); + img { + width: 40px; + height: 40px; + float: left; + } + .username, + .description, + .comment { + display: block; + margin-left: 50px; + } + .username { + font-size: 16px; + font-weight: 600; + } + .description { + color: #999; + font-size: 13px; + } + &.user-block-sm { + img { + &:extend(.img-sm); + } + .username, + .description, + .comment { + margin-left: 40px; + } + .username { + font-size: 14px; + } + } +} + +//Image sizes +.img-sm, +.img-md, +.img-lg { + float: left; +} + +.img-sm { + width: 30px !important; + height: 30px !important; + + .img-push { + margin-left: 40px; + } +} + +.img-md { + width: 60px; + height: 60px; + + .img-push { + margin-left: 70px; + } +} + +.img-lg { + width: 100px; + height: 100px; + + .img-push { + margin-left: 110px; + } +} + +// Image bordered +.img-bordered { + border: 3px solid @gray; + padding: 3px; +} + +.img-bordered-sm { + border: 2px solid @gray; + padding: 2px; +} + +//General attachemnt block +.attachment-block { + border: 1px solid @box-border-color; + padding: 5px; + margin-bottom: 10px; + background: #f7f7f7; + + .attachment-img { + max-width: 100px; + max-height: 100px; + height: auto; + float: left; + } + .attachment-pushed { + margin-left: 110px; + } + .attachment-heading { + margin: 0; + } + .attachment-text { + color: #555; + } +} + +.connectedSortable { + min-height: 100px; +} + +.ui-helper-hidden-accessible { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} + +.sort-highlight { + background: #f4f4f4; + border: 1px dashed #ddd; + margin-bottom: 10px; +} + +.full-opacity-hover { + .opacity(.65); + &:hover { + .opacity(1); + } +} + +// Charts +.chart { + position: relative; + overflow: hidden; + width: 100%; + svg, + canvas { + width: 100% !important; + } +} diff --git a/docs/theme/input/assets/css/adminlte/_mixins.less b/docs/theme/input/assets/css/adminlte/_mixins.less new file mode 100644 index 000000000..f80653870 --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_mixins.less @@ -0,0 +1,315 @@ +//AdminLTE mixins +//=============== + +//Changes the color and the hovering properties of the navbar +.navbar-variant(@color; @font-color: rgba(255, 255, 255, 0.8); @hover-color: #f6f6f6; @hover-bg: rgba(0, 0, 0, 0.1)) { + background-color: @color; + //Navbar links + .nav > li > a { + color: @font-color; + } + + .nav > li > a:hover, + .nav > li > a:active, + .nav > li > a:focus, + .nav .open > a, + .nav .open > a:hover, + .nav .open > a:focus, + .nav > .active > a { + background: @hover-bg; + color: @hover-color; + } + + //Add color to the sidebar toggle button + .sidebar-toggle { + color: @font-color; + &:hover { + color: @hover-color; + background: @hover-bg; + } + } +} + +//Logo color variation +.logo-variant(@bg-color; @color: #fff; @border-bottom-color: transparent; @border-bottom-width: 0) { + background-color: @bg-color; + color: @color; + border-bottom: @border-bottom-width solid @border-bottom-color; + + &:hover { + background-color: darken(@bg-color, 1%); + } +} + +//Box solid color variantion creator +.box-solid-variant(@color; @text-color: #fff) { + border: 1px solid @color; + > .box-header { + color: @text-color; + background: @color; + background-color: @color; + a, + .btn { + color: @text-color; + } + } +} + +//Direct Chat Variant +.direct-chat-variant(@bg-color; @color: #fff) { + .right > .direct-chat-text { + background: @bg-color; + border-color: @bg-color; + color: @color; + &:after, + &:before { + border-left-color: @bg-color; + } + } +} + +//border radius creator +.border-radius(@radius) { + border-radius: @radius; +} + +//Different radius each side +.border-radius(@top-left; +@top-right +; +@bottom-left +; +@bottom-right +) +{ + border-top-left-radius: @top-left +; + border-top-right-radius: @top-right +; + border-bottom-right-radius: @bottom-right +; + border-bottom-left-radius: @bottom-left +; +} + +//Gradient background +.gradient(@color: #F5F5F5, @start: #EEE, @stop: #FFF) { + background: @color; + background: -webkit-gradient(linear, + left bottom, + left top, + color-stop(0, @start), + color-stop(1, @stop)); + background: -ms-linear-gradient(bottom, + @start, + @stop); + background: -moz-linear-gradient(center bottom, + @start 0%, + @stop 100%); + background: -o-linear-gradient(@stop, + @start); + filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",@stop,@start)); +} + +//Added 2.1.0 +//Skins Mixins + +//Dark Sidebar Mixin +.skin-dark-sidebar(@link-hover-border-color) { + // Sidebar background color (Both .wrapper and .left-side are responsible for sidebar bg color) + .wrapper, + .main-sidebar, + .left-side { + background-color: @sidebar-dark-bg; + } + //User Panel (resides in the sidebar) + .user-panel { + > .info, > .info > a { + color: #fff; + } + } + //Sidebar Menu. First level links + .sidebar-menu > li { + //Section Headning + &.header { + color: lighten(@sidebar-dark-bg, 20%); + background: darken(@sidebar-dark-bg, 4%); + } + //links + > a { + border-left: 3px solid transparent; + } + //Hover and active states + &:hover > a, &.active > a { + color: @sidebar-dark-hover-color; + background: @sidebar-dark-hover-bg; + border-left-color: @link-hover-border-color; + } + //First Level Submenu + > .treeview-menu { + margin: 0 1px; + background: @sidebar-dark-submenu-bg; + } + } + //All links within the sidebar menu + .sidebar a { + color: @sidebar-dark-color; + &:hover { + text-decoration: none; + } + } + //All submenus + .treeview-menu { + > li { + > a { + color: @sidebar-dark-submenu-color; + } + &.active > a, > a:hover { + color: @sidebar-dark-submenu-hover-color; + } + } + } + //The sidebar search form + .sidebar-form { + .border-radius(3px); + border: 1px solid lighten(@sidebar-dark-bg, 10%); + margin: 10px 10px; + input[type="text"], .btn { + box-shadow: none; + background-color: lighten(@sidebar-dark-bg, 10%); + border: 1px solid transparent; + height: 35px; + //.transition(all @transition-speed @transition-fn); + } + input[type="text"] { + color: #666; + .border-radius(2px, 0, 2px, 0); + &:focus, + &:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; + } + &:focus + .input-group-btn .btn { + border-left-color: #fff; + + } + } + .btn { + color: #999; + .border-radius(0, 2px, 0, 2px); + } + } +} + +//Light Sidebar Mixin +.skin-light-sidebar(@icon-active-color) { + // Sidebar background color (Both .wrapper and .left-side are responsible for sidebar bg color) + .wrapper, + .main-sidebar, + .left-side { + background-color: @sidebar-light-bg; + } + .content-wrapper, + .main-footer { + border-left: 1px solid @gray; + } + //User Panel (resides in the sidebar) + .user-panel { + > .info, > .info > a { + color: @sidebar-light-color; + } + } + //Sidebar Menu. First level links + .sidebar-menu > li { + .transition(border-left-color .3s ease); + //border-left: 3px solid transparent; + //Section Headning + &.header { + color: lighten(@sidebar-light-color, 25%); + background: @sidebar-light-bg; + } + //links + > a { + border-left: 3px solid transparent; + font-weight: 600; + } + //Hover and active states + &:hover > a, + &.active > a { + color: @sidebar-light-hover-color; + background: @sidebar-light-hover-bg; + } + &:hover > a { + + } + &.active { + border-left-color: @icon-active-color; + > a { + font-weight: 600; + } + } + //First Level Submenu + > .treeview-menu { + background: @sidebar-light-submenu-bg; + } + } + //All links within the sidebar menu + .sidebar a { + color: @sidebar-light-color; + &:hover { + text-decoration: none; + } + } + //All submenus + .treeview-menu { + > li { + > a { + color: @sidebar-light-submenu-color; + } + &.active > a, + > a:hover { + color: @sidebar-light-submenu-hover-color; + } + &.active > a { + font-weight: 600; + } + } + } + //The sidebar search form + .sidebar-form { + .border-radius(3px); + border: 1px solid @gray; //darken(@sidebar-light-bg, 5%); + margin: 10px 10px; + input[type="text"], + .btn { + box-shadow: none; + background-color: #fff; //darken(@sidebar-light-bg, 3%); + border: 1px solid transparent; + height: 35px; + //.transition(all @transition-speed @transition-fn); + } + input[type="text"] { + color: #666; + .border-radius(2px, 0, 2px, 0); + &:focus, + &:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; + } + &:focus + .input-group-btn .btn { + border-left-color: #fff; + } + } + .btn { + color: #999; + .border-radius(0, 2px, 0, 2px); + } + } + @media (min-width: @screen-sm-min) { + &.sidebar-mini.sidebar-collapse { + .sidebar-menu > li > .treeview-menu { + border-left: 1px solid @gray; + } + } + } +} diff --git a/docs/theme/input/assets/css/adminlte/_modal.less b/docs/theme/input/assets/css/adminlte/_modal.less new file mode 100644 index 000000000..f42db1ccb --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_modal.less @@ -0,0 +1,80 @@ +/* + * Component: modal + * ---------------- + */ +.modal { + background: rgba(0, 0, 0, .3); +} + +.modal-content { + .border-radius(0); + .box-shadow(0 2px 3px rgba(0, 0, 0, .125)); + border: 0; + @media (min-width: @screen-sm-min) { + .box-shadow(0 2px 3px rgba(0, 0, 0, .125)); + } +} + +.modal-header { + border-bottom-color: @box-border-color; +} + +.modal-footer { + border-top-color: @box-border-color; +} + +//Modal variants +.modal-primary { + .modal-body { + &:extend(.bg-light-blue); + } + .modal-header, + .modal-footer { + &:extend(.bg-light-blue-active); + border-color: darken(@light-blue, 10%); + } +} + +.modal-warning { + .modal-body { + &:extend(.bg-yellow); + } + .modal-header, + .modal-footer { + &:extend(.bg-yellow-active); + border-color: darken(@yellow, 10%); + } +} + +.modal-info { + .modal-body { + &:extend(.bg-aqua); + } + .modal-header, + .modal-footer { + &:extend(.bg-aqua-active); + border-color: darken(@aqua, 10%); + } +} + +.modal-success { + .modal-body { + &:extend(.bg-green); + } + .modal-header, + .modal-footer { + &:extend(.bg-green-active); + border-color: darken(@green, 10%); + } +} + +.modal-danger { + .modal-body { + &:extend(.bg-red); + } + .modal-header, + .modal-footer { + &:extend(.bg-red-active); + border-color: darken(@red, 10%); + } +} diff --git a/docs/theme/input/assets/css/adminlte/_navs.less b/docs/theme/input/assets/css/adminlte/_navs.less new file mode 100644 index 000000000..af0dc6aa5 --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_navs.less @@ -0,0 +1,226 @@ +/* + * Component: Nav + * -------------- + */ + +.nav { + > li > a:hover, + > li > a:active, + > li > a:focus { + color: #444; + background: #f7f7f7; + } +} + +/* NAV PILLS */ +.nav-pills { + > li > a { + .border-radius(0); + border-top: 3px solid transparent; + color: #444; + > .fa, + > .glyphicon, + > .ion { + margin-right: 5px; + } + } + > li.active > a, + > li.active > a:hover, + > li.active > a:focus { + border-top-color: @light-blue; + } + > li.active > a { + font-weight: 600; + } +} + +/* NAV STACKED */ +.nav-stacked { + > li > a { + .border-radius(0); + border-top: 0; + border-left: 3px solid transparent; + color: #444; + } + > li.active > a, + > li.active > a:hover { + background: transparent; + color: #444; + border-top: 0; + border-left-color: @light-blue; + } + + > li.header { + border-bottom: 1px solid #ddd; + color: #777; + margin-bottom: 10px; + padding: 5px 10px; + text-transform: uppercase; + } +} + +/* NAV TABS */ +.nav-tabs-custom { + margin-bottom: 20px; + background: #fff; + box-shadow: @box-boxshadow; + border-radius: @box-border-radius; + > .nav-tabs { + margin: 0; + border-bottom-color: #f4f4f4; + .border-top-radius(@box-border-radius); + > li { + border-top: 3px solid transparent; + margin-bottom: -2px; + > a { + color: #444; + .border-radius(0); + &.text-muted { + color: #999; + } + &, + &:hover { + background: transparent; + margin: 0; + } + &:hover { + color: #999; + } + } + &:not(.active) { + > a:hover, + > a:focus, + > a:active { + border-color: transparent; + } + } + margin-right: 5px; + } + + > li.active { + border-top-color: @light-blue; + & > a, + &:hover > a { + background-color: #fff; + color: #444; + } + > a { + border-top-color: transparent; + border-left-color: #f4f4f4; + border-right-color: #f4f4f4; + } + + } + + > li:first-of-type { + margin-left: 0; + &.active { + > a { + border-left-color: transparent; + } + } + } + + //Pulled to the right + &.pull-right { + float: none !important; + > li { + float: right; + } + > li:first-of-type { + margin-right: 0; + > a { + border-left-width: 1px; + } + &.active { + > a { + border-left-color: #f4f4f4; + border-right-color: transparent; + } + } + } + } + + > li.header { + line-height: 35px; + padding: 0 10px; + font-size: 20px; + color: #444; + > .fa, + > .glyphicon, + > .ion { + margin-right: 5px; + } + } + } + + > .tab-content { + background: #fff; + padding: 10px; + .border-bottom-radius(@box-border-radius); + } + + .dropdown.open > a { + &:active, + &:focus { + background: transparent; + color: #999; + } + } + // Tab color variations + &.tab-primary { + > .nav-tabs { + > li.active { + border-top-color: @light-blue; + } + } + } + &.tab-info { + > .nav-tabs { + > li.active { + border-top-color: @aqua; + } + } + } + &.tab-danger { + > .nav-tabs { + > li.active { + border-top-color: @red; + } + } + } + &.tab-warning { + > .nav-tabs { + > li.active { + border-top-color: @yellow; + } + } + } + &.tab-success { + > .nav-tabs { + > li.active { + border-top-color: @green; + } + } + } + &.tab-default { + > .nav-tabs { + > li.active { + border-top-color: @gray; + } + } + } +} + +/* PAGINATION */ +.pagination { + > li > a { + background: #fafafa; + color: #666; + } + &.pagination-flat { + > li > a { + .border-radius(0) !important; + } + } +} diff --git a/docs/theme/input/assets/css/adminlte/_print.less b/docs/theme/input/assets/css/adminlte/_print.less new file mode 100644 index 000000000..52b14f205 --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_print.less @@ -0,0 +1,54 @@ +/* + * Misc: print + * ----------- + */ +@media print { + //Add to elements that you do not want to show when printing + .no-print { + display: none !important; + } + + //Elements that we want to hide when printing + .main-sidebar, + .left-side, + .main-header, + .content-header { + &:extend(.no-print); + } + + //This is the only element that should appear, so let's remove the margins + .content-wrapper, + .right-side, + .main-footer { + margin-left: 0 !important; + min-height: 0 !important; + .translate(0, 0) !important; + } + + .fixed .content-wrapper, + .fixed .right-side { + padding-top: 0 !important; + } + + //Invoice printing + .invoice { + width: 100%; + border: 0; + margin: 0; + padding: 0; + } + + .invoice-col { + float: left; + width: 33.3333333%; + } + + //Make sure table content displays properly + .table-responsive { + overflow: auto; + > .table tr th, + > .table tr td { + white-space: normal !important; + } + } +} diff --git a/docs/theme/input/assets/css/adminlte/_products.less b/docs/theme/input/assets/css/adminlte/_products.less new file mode 100644 index 000000000..49f30a6be --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_products.less @@ -0,0 +1,45 @@ +/* + * Component: Products List + * ------------------------ + */ +.products-list { + list-style: none; + margin: 0; + padding: 0; + > .item { + .border-radius(@box-border-radius); + .box-shadow(@box-boxshadow); + .clearfix(); + padding: 10px 0; + background: #fff; + } + .product-img { + float: left; + img { + width: 50px; + height: 50px; + } + } + .product-info { + margin-left: 60px; + } + .product-title { + font-weight: 600; + } + .product-description { + display: block; + color: #999; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } +} + +.product-list-in-box > .item { + .box-shadow(none); + .border-radius(0); + border-bottom: 1px solid @box-border-color; + &:last-of-type { + border-bottom-width: 0; + } +} diff --git a/docs/theme/input/assets/css/adminlte/_profile.less b/docs/theme/input/assets/css/adminlte/_profile.less new file mode 100644 index 000000000..3cb8e0914 --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_profile.less @@ -0,0 +1,31 @@ +/* + * Page: Profile + * ------------- + */ + +.profile-user-img { + margin: 0 auto; + width: 100px; + padding: 3px; + border: 3px solid @gray; +} + +.profile-username { + font-size: 21px; + margin-top: 5px; +} + +.post { + border-bottom: 1px solid @gray; + margin-bottom: 15px; + padding-bottom: 15px; + color: #666; + &:last-of-type { + border-bottom: 0; + margin-bottom: 0; + padding-bottom: 0; + } + .user-block { + margin-bottom: 15px; + } +} diff --git a/docs/theme/input/assets/css/adminlte/_progress-bars.less b/docs/theme/input/assets/css/adminlte/_progress-bars.less new file mode 100644 index 000000000..423edc44a --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_progress-bars.less @@ -0,0 +1,111 @@ +/* + * Component: Progress Bar + * ----------------------- + */ + +//General CSS +.progress, +.progress > .progress-bar { + .box-shadow(none); + &, .progress-bar { + .border-radius(@progress-bar-border-radius); + } +} + +/* size variation */ +.progress.sm, +.progress-sm { + height: 10px; + &, .progress-bar { + .border-radius(@progress-bar-sm-border-radius); + } +} + +.progress.xs, +.progress-xs { + height: 7px; + &, .progress-bar { + .border-radius(@progress-bar-xs-border-radius); + } +} + +.progress.xxs, +.progress-xxs { + height: 3px; + &, .progress-bar { + .border-radius(@progress-bar-xs-border-radius); + } +} + +/* Vertical bars */ +.progress.vertical { + position: relative; + width: 30px; + height: 200px; + display: inline-block; + margin-right: 10px; + > .progress-bar { + width: 100%; + position: absolute; + bottom: 0; + } + + //Sizes + &.sm, + &.progress-sm { + width: 20px; + } + + &.xs, + &.progress-xs { + width: 10px; + } + &.xxs, + &.progress-xxs { + width: 3px; + } +} + +//Progress Groups +.progress-group { + .progress-text { + font-weight: 600; + } + .progress-number { + float: right; + } +} + +/* Remove margins from progress bars when put in a table */ +.table { + tr > td .progress { + margin: 0; + } +} + +// Variations +// ------------------------- +.progress-bar-light-blue, +.progress-bar-primary { + .progress-bar-variant(@light-blue); +} + +.progress-bar-green, +.progress-bar-success { + .progress-bar-variant(@green); +} + +.progress-bar-aqua, +.progress-bar-info { + .progress-bar-variant(@aqua); +} + +.progress-bar-yellow, +.progress-bar-warning { + .progress-bar-variant(@yellow); +} + +.progress-bar-red, +.progress-bar-danger { + .progress-bar-variant(@red); +} diff --git a/docs/theme/input/assets/css/adminlte/_select2.less b/docs/theme/input/assets/css/adminlte/_select2.less new file mode 100644 index 000000000..d144da085 --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_select2.less @@ -0,0 +1,117 @@ +/* + * Plugin: Select2 + * --------------- + */ + +//Signle select +.select2-container--default, +.select2-selection { + &.select2-container--focus, + &:focus, + &:active { + outline: none; + } + .select2-selection--single { + border: 1px solid @gray; + border-radius: @input-radius; + padding: 6px 12px; + height: 34px; + } +} + +.select2-container--default.select2-container--open { + border-color: @light-blue; +} + +.select2-dropdown { + border: 1px solid @gray; + border-radius: @input-radius; +} + +.select2-container--default .select2-results__option--highlighted[aria-selected] { + background-color: @light-blue; + color: white; +} + +.select2-results__option { + padding: 6px 12px; + user-select: none; + -webkit-user-select: none; +} + +.select2-container .select2-selection--single .select2-selection__rendered { + padding-left: 0; + padding-right: 0; + height: auto; + margin-top: -4px; +} + +.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered { + padding-right: 6px; + padding-left: 20px; +} + +.select2-container--default .select2-selection--single .select2-selection__arrow { + height: 28px; + right: 3px; +} + +.select2-container--default .select2-selection--single .select2-selection__arrow b { + margin-top: 0; +} + +.select2-dropdown, +.select2-search--inline { + .select2-search__field { + border: 1px solid @gray; + &:focus { + outline: none; + border: 1px solid @light-blue; + } + } +} + +.select2-container--default .select2-results__option[aria-disabled=true] { + color: #999; +} + +.select2-container--default .select2-results__option[aria-selected=true] { + background-color: #ddd; + &, + &:hover { + color: #444; + } +} + +//Multiple select +.select2-container--default { + .select2-selection--multiple { + border: 1px solid @gray; + border-radius: @input-radius; + &:focus { + border-color: @light-blue; + } + } + &.select2-container--focus .select2-selection--multiple { + border-color: @gray; + } +} + +.select2-container--default .select2-selection--multiple .select2-selection__choice { + background-color: @light-blue; + border-color: darken(@light-blue, 5%); + padding: 1px 10px; + color: #fff; +} + +.select2-container--default .select2-selection--multiple .select2-selection__choice__remove { + margin-right: 5px; + color: rgba(255, 255, 255, .7); + &:hover { + color: #fff; + } +} + +.select2-container .select2-selection--single .select2-selection__rendered { + padding-right: 10px; +} diff --git a/docs/theme/input/assets/css/adminlte/_sidebar-mini.less b/docs/theme/input/assets/css/adminlte/_sidebar-mini.less new file mode 100644 index 000000000..344176ec2 --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_sidebar-mini.less @@ -0,0 +1,151 @@ +/* + * Component: Sidebar Mini + */ + +//Add sidebar-mini class to the body tag to activate this feature +.sidebar-mini { + //Sidebar mini should work only on devices larger than @screen-sm + @media (min-width: @screen-sm) { + //When the sidebar is collapsed... + &.sidebar-collapse { + + //Apply the new margining to the main content and footer + .content-wrapper, + .right-side, + .main-footer { + margin-left: 50px !important; + z-index: 840; + } + + //Modify the sidebar to shrink instead of disappearing + .main-sidebar { + //Don't go away! Just shrink + .translate(0, 0); + width: 50px !important; + z-index: 850; + } + + .sidebar-menu { + > li { + position: relative; + > a { + margin-right: 0; + } + > a > span { + border-top-right-radius: 4px; + } + + &:not(.treeview) { + > a > span { + border-bottom-right-radius: 4px; + } + } + + > .treeview-menu { + //Add some padding to the treeview menu + padding-top: 5px; + padding-bottom: 5px; + border-bottom-right-radius: 4px; + } + + //Show menu items on hover + &:hover { + > a { + //overflow: visible; + } + > a > span:not(.pull-right),//:not(.pull-right-container), + > .treeview-menu { + display: block !important; + position: absolute; + width: @sidebar-width - 50; + left: 50px; + } + + //position the header & treeview menus + > a > span { + top: 0; + margin-left: -3px; + padding: 12px 5px 12px 20px; + background-color: inherit; + } + > a > .pull-right-container { + //display: block!important; + float: right; + width: auto!important; + left: 200px!important; + top: 10px!important; + > .label:not(:first-of-type) { + display: none; + } + } + > .treeview-menu { + top: 44px; + margin-left: 0; + } + } + } + } + + //Make the sidebar links, menus, labels, badges + //and angle icons disappear + .main-sidebar .user-panel > .info, + .sidebar-form, + .sidebar-menu > li > a > span, + .sidebar-menu > li > .treeview-menu, + .sidebar-menu > li > a > .pull-right, + .sidebar-menu li.header { + display: none !important; + -webkit-transform: translateZ(0); + } + + .main-header { + //Let's make the logo also shrink and the mini logo to appear + .logo { + width: 50px; + > .logo-mini { + display: block; + margin-left: -15px; + margin-right: -15px; + font-size: 18px; + } + > .logo-lg { + display: none; + } + } + + //Since the logo got smaller, we need to fix the navbar's position + .navbar { + margin-left: 50px; + } + } + } + } +} + +//A fix for text overflow while transitioning from sidebar mini to full sidebar +.sidebar-menu, +.main-sidebar .user-panel, +.sidebar-menu > li.header { + white-space: nowrap; + overflow: hidden; +} + +.sidebar-menu:hover { + overflow: visible; +} + +.sidebar-form, +.sidebar-menu > li.header { + overflow: hidden; + text-overflow: clip; +} + +.sidebar-menu li > a { + position: relative; + > .pull-right-container { + position: absolute; + right: 10px; + top: 50%; + margin-top: -7px; + } +} diff --git a/docs/theme/input/assets/css/adminlte/_sidebar.less b/docs/theme/input/assets/css/adminlte/_sidebar.less new file mode 100644 index 000000000..9c669a64b --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_sidebar.less @@ -0,0 +1,169 @@ +/* + * Component: Sidebar + * ------------------ + */ +//Main Sidebar +// ``` .left-side has been deprecated as of 2.0.0 in favor of .main-sidebar ``` + +.main-sidebar, +.left-side { + position: absolute; + top: 0; + left: 0; + padding-top: 50px; + min-height: 100%; + width: @sidebar-width; + z-index: 810; + //Using disposable variable to join statements with a comma + @transition-rule: @transition-speed @transition-fn, + width @transition-speed @transition-fn; + .transition-transform(@transition-rule); + @media (max-width: @screen-header-collapse) { + padding-top: 100px; + } + @media (max-width: @screen-xs-max) { + .translate(-@sidebar-width, 0); + } + .sidebar-collapse & { + @media (min-width: @screen-sm) { + .translate(-@sidebar-width, 0); + } + } + .sidebar-open & { + @media (max-width: @screen-xs-max) { + .translate(0, 0); + } + } +} + +.sidebar { + padding-bottom: 10px; +} + +// remove border from form +.sidebar-form { + input:focus { + border-color: transparent; + } +} + +//Sidebar user panel +.user-panel { + position: relative; + width: 100%; + padding: 10px; + overflow: hidden; + .clearfix(); + > .image > img { + width: 100%; + max-width: 45px; + height: auto; + } + > .info { + padding: 5px 5px 5px 15px; + line-height: 1; + position: absolute; + left: 55px; + > p { + font-weight: 600; + margin-bottom: 9px; + } + > a { + text-decoration: none; + padding-right: 5px; + margin-top: 3px; + font-size: 11px; + > .fa, + > .ion, + > .glyphicon { + margin-right: 3px; + } + } + } +} + +// Sidebar menu +.sidebar-menu { + list-style: none; + margin: 0; + padding: 0; + //First Level + > li { + position: relative; + margin: 0; + padding: 0; + > a { + padding: 12px 5px 12px 15px; + display: block; + > .fa, + > .glyphicon, + > .ion { + width: 20px; + } + } + .label, + .badge { + margin-right: 5px; + } + .badge { + margin-top: 3px; + } + } + li.header { + padding: 10px 25px 10px 15px; + font-size: 12px; + } + li > a > .fa-angle-left, + li > a > .pull-right-container > .fa-angle-left { + width: auto; + height: auto; + padding: 0; + margin-right: 10px; + } + li > a > .fa-angle-left { + position: absolute; + top: 50%; + right: 10px; + margin-top: -8px; + } + li.active { + > a > .fa-angle-left, + > a > .pull-right-container > .fa-angle-left { + .rotate(-90deg); + } + > .treeview-menu { + display: block; + } + } + + // Tree view menu + .treeview-menu { + display: none; + list-style: none; + padding: 0; + margin: 0; + padding-left: 5px; + .treeview-menu { + padding-left: 20px; + } + > li { + margin: 0; + > a { + padding: 5px 5px 5px 15px; + display: block; + font-size: 14px; + > .fa, + > .glyphicon, + > .ion { + width: 20px; + } + > .pull-right-container > .fa-angle-left, + > .pull-right-container > .fa-angle-down, + > .fa-angle-left, + > .fa-angle-down { + width: auto; + } + } + } + } +} diff --git a/docs/theme/input/assets/css/adminlte/_small-box.less b/docs/theme/input/assets/css/adminlte/_small-box.less new file mode 100644 index 000000000..8ad7cc79d --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_small-box.less @@ -0,0 +1,89 @@ +/* + * Component: Small Box + * -------------------- + */ + +.small-box { + .border-radius(2px); + position: relative; + display: block; + margin-bottom: 20px; + box-shadow: @box-boxshadow; + // content wrapper + > .inner { + padding: 10px; + } + + > .small-box-footer { + position: relative; + text-align: center; + padding: 3px 0; + color: #fff; + color: rgba(255, 255, 255, 0.8); + display: block; + z-index: 10; + background: rgba(0, 0, 0, 0.1); + text-decoration: none; + &:hover { + color: #fff; + background: rgba(0, 0, 0, 0.15); + } + } + + h3 { + font-size: 38px; + font-weight: bold; + margin: 0 0 10px 0; + white-space: nowrap; + padding: 0; + + } + + p { + font-size: 15px; + > small { + display: block; + color: #f9f9f9; + font-size: 13px; + margin-top: 5px; + } + } + + h3, p { + z-index: 5; + } + + // the icon + .icon { + .transition(all @transition-speed linear); + position: absolute; + top: -10px; + right: 10px; + z-index: 0; + font-size: 90px; + color: rgba(0, 0, 0, 0.15); + } + + // Small box hover state + &:hover { + text-decoration: none; + color: #f9f9f9; + // Animate icons on small box hover + .icon { + font-size: 95px; + } + } +} + +@media (max-width: @screen-xs-max) { + // No need for icons on very small devices + .small-box { + text-align: center; + .icon { + display: none; + } + p { + font-size: 12px; + } + } +} diff --git a/docs/theme/input/assets/css/adminlte/_social-widgets.less b/docs/theme/input/assets/css/adminlte/_social-widgets.less new file mode 100644 index 000000000..e2861a39e --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_social-widgets.less @@ -0,0 +1,78 @@ +/* + * Component: Social Widgets + * ------------------------- + */ +//General widget style +.box-widget { + border: none; + position: relative; +} + +//User Widget Style 1 +.widget-user { + //User name container + .widget-user-header { + padding: 20px; + height: 120px; + .border-top-radius(@box-border-radius); + } + //User name + .widget-user-username { + margin-top: 0; + margin-bottom: 5px; + font-size: 25px; + font-weight: 300; + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); + } + //User single line description + .widget-user-desc { + margin-top: 0; + } + //User image container + .widget-user-image { + position: absolute; + top: 65px; + left: 50%; + margin-left: -45px; + > img { + width: 90px; + height: auto; + border: 3px solid #fff; + } + } + .box-footer { + padding-top: 30px; + } +} + +//User Widget Style 2 +.widget-user-2 { + //User name container + .widget-user-header { + padding: 20px; + .border-top-radius(@box-border-radius); + } + //User name + .widget-user-username { + margin-top: 5px; + margin-bottom: 5px; + font-size: 25px; + font-weight: 300; + } + //User single line description + .widget-user-desc { + margin-top: 0; + } + .widget-user-username, + .widget-user-desc { + margin-left: 75px; + } + //User image container + .widget-user-image { + > img { + width: 65px; + height: auto; + float: left; + } + } +} diff --git a/docs/theme/input/assets/css/adminlte/_table.less b/docs/theme/input/assets/css/adminlte/_table.less new file mode 100644 index 000000000..4aa06a4c6 --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_table.less @@ -0,0 +1,71 @@ +/* + * Component: Table + * ---------------- + */ + +.table { + //Cells + > thead, + > tbody, + > tfoot { + > tr { + > th, + > td { + border-top: 1px solid @box-border-color; + } + } + } + //thead cells + > thead > tr > th { + border-bottom: 2px solid @box-border-color; + } + //progress bars in tables + tr td .progress { + margin-top: 5px; + } +} + +//Bordered Table +.table-bordered { + border: 1px solid @box-border-color; + > thead, + > tbody, + > tfoot { + > tr { + > th, + > td { + border: 1px solid @box-border-color; + } + } + } + > thead > tr { + > th, + > td { + border-bottom-width: 2px; + } + } +} + +.table.no-border { + &, + td, + th { + border: 0; + } +} + +/* .text-center in tables */ +table.text-center { + &, td, th { + text-align: center; + } +} + +.table.align { + th { + text-align: left; + } + td { + text-align: right; + } +} diff --git a/docs/theme/input/assets/css/adminlte/_timeline.less b/docs/theme/input/assets/css/adminlte/_timeline.less new file mode 100644 index 000000000..333d64856 --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_timeline.less @@ -0,0 +1,110 @@ +/* + * Component: Timeline + * ------------------- + */ + +.timeline { + position: relative; + margin: 0 0 30px 0; + padding: 0; + list-style: none; + + // The line + &:before { + content: ''; + position: absolute; + top: 0; + bottom: 0; + width: 4px; + background: #ddd; + left: 31px; + margin: 0; + .border-radius(2px); + } + + > li { + position: relative; + margin-right: 10px; + margin-bottom: 15px; + .clearfix(); + + // The content + > .timeline-item { + .box-shadow(@box-boxshadow); + .border-radius(@box-border-radius); + margin-top: 0; + background: #fff; + color: #444; + margin-left: 60px; + margin-right: 15px; + padding: 0; + position: relative; + + // The time and header + > .time { + color: #999; + float: right; + padding: 10px; + font-size: 12px; + } + > .timeline-header { + margin: 0; + color: #555; + border-bottom: 1px solid @box-border-color; + padding: 10px; + font-size: 16px; + line-height: 1.1; + > a { + font-weight: 600; + } + } + // Item body and footer + > .timeline-body, > .timeline-footer { + padding: 10px; + } + + } + + // The icons + > .fa, + > .glyphicon, + > .ion { + width: 30px; + height: 30px; + font-size: 15px; + line-height: 30px; + position: absolute; + color: #666; + background: @gray; + border-radius: 50%; + text-align: center; + left: 18px; + top: 0; + } + } + + // Time label + > .time-label { + > span { + font-weight: 600; + padding: 5px; + display: inline-block; + background-color: #fff; + + .border-radius(4px); + } + } +} + +.timeline-inverse { + > li { + > .timeline-item { + background: #f0f0f0; + border: 1px solid #ddd; + .box-shadow(none); + > .timeline-header { + border-bottom-color: #ddd; + } + } + } +} diff --git a/docs/theme/input/assets/css/adminlte/_users-list.less b/docs/theme/input/assets/css/adminlte/_users-list.less new file mode 100644 index 000000000..c5ef2a580 --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_users-list.less @@ -0,0 +1,42 @@ +/* + * Component: Users List + * --------------------- + */ +.users-list { + &:extend(.list-unstyled); + > li { + width: 25%; + float: left; + padding: 10px; + text-align: center; + img { + .border-radius(50%); + max-width: 100%; + height: auto; + } + > a:hover { + &, + .users-list-name { + color: #999; + } + } + } +} + +.users-list-name, +.users-list-date { + display: block; +} + +.users-list-name { + font-weight: 600; + color: #444; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.users-list-date { + color: #999; + font-size: 12px; +} diff --git a/docs/theme/input/assets/css/adminlte/_variables.less b/docs/theme/input/assets/css/adminlte/_variables.less new file mode 100644 index 000000000..19b9080a4 --- /dev/null +++ b/docs/theme/input/assets/css/adminlte/_variables.less @@ -0,0 +1,124 @@ +//AdminLTE 2 Variables.less +//========================= +@import "../bootstrap/variables.less"; + +//PATHS +//-------------------------------------------------------- + +@boxed-layout-bg-image-path: "../img/boxed-bg.jpg"; + +//COLORS +//-------------------------------------------------------- +//Primary +@light-blue: @brand-primary; +//Danger +@red: #dd4b39; +//Success +@green: #00a65a; +//Info +@aqua: #00c0ef; +//Warning +@yellow: #f39c12; +@blue: #0073b7; +@navy: #001F3F; +@teal: #39CCCC; +@olive: #3D9970; +@lime: #01FF70; +@orange: #FF851B; +@fuchsia: #F012BE; +@purple: #605ca8; +@maroon: #D81B60; +@black: #111; +@gray: #d2d6de; + +//LAYOUT +//-------------------------------------------------------- + +//Side bar and logo width +@sidebar-width: 230px; +//Boxed layout maximum width +@boxed-layout-max-width: 1024px; +//When the logo should go to the top of the screen +@screen-header-collapse: @screen-xs-max; + +//Link colors (Aka: tags) +//@link-color: @light-blue; +//@link-hover-color: lighten(@link-color, 15%); + +//Body background (Affects main content background only) +//@body-bg: #ecf0f5; + +//SIDEBAR SKINS +//-------------------------------------------------------- + +//Dark sidebar +@sidebar-dark-bg: #222d32; +@sidebar-dark-hover-bg: darken(@sidebar-dark-bg, 2%); +@sidebar-dark-color: lighten(@sidebar-dark-bg, 60%); +@sidebar-dark-hover-color: #fff; +@sidebar-dark-submenu-bg: lighten(@sidebar-dark-bg, 5%); +@sidebar-dark-submenu-color: lighten(@sidebar-dark-submenu-bg, 40%); +@sidebar-dark-submenu-hover-color: #fff; + +//Light sidebar +@sidebar-light-bg: #f9fafc; +@sidebar-light-hover-bg: lighten(#f0f0f1, 1.5%); +@sidebar-light-color: #444; +@sidebar-light-hover-color: #000; +@sidebar-light-submenu-bg: @sidebar-light-hover-bg; +@sidebar-light-submenu-color: #777; +@sidebar-light-submenu-hover-color: #000; + +//CONTROL SIDEBAR +//-------------------------------------------------------- +@control-sidebar-width: @sidebar-width; + +//BOXES +//-------------------------------------------------------- +@box-border-color: #f4f4f4; +@box-border-radius: 3px; +@box-footer-bg: #fff; +@box-boxshadow: 0 1px 1px rgba(0, 0, 0, .1); +@box-padding: 10px; + +//Box variants +@box-default-border-top-color: #d2d6de; + +//BUTTONS +//-------------------------------------------------------- +@btn-boxshadow: none; + +//PROGRESS BARS +//-------------------------------------------------------- +@progress-bar-border-radius: 1px; +@progress-bar-sm-border-radius: 1px; +@progress-bar-xs-border-radius: 1px; + +//FORMS +//-------------------------------------------------------- +@input-radius: 0; + +//BUTTONS +//-------------------------------------------------------- + +//Border radius for non flat buttons +@btn-border-radius: 3px; + +//DIRECT CHAT +//-------------------------------------------------------- +@direct-chat-height: 250px; +@direct-chat-default-msg-bg: @gray; +@direct-chat-default-font-color: #444; +@direct-chat-default-msg-border-color: @gray; + +//CHAT WIDGET +//-------------------------------------------------------- +@attachment-border-radius: 3px; + +//TRANSITIONS SETTINGS +//-------------------------------------------------------- + +//Transition global options +@transition-speed: .3s; +@transition-fn: ease-in-out; +//cubic-bezier(0.32,1.25,0.375,1.15); diff --git a/docs/theme/input/assets/css/bootstrap/_alerts.less b/docs/theme/input/assets/css/bootstrap/_alerts.less new file mode 100644 index 000000000..c4199db92 --- /dev/null +++ b/docs/theme/input/assets/css/bootstrap/_alerts.less @@ -0,0 +1,73 @@ +// +// Alerts +// -------------------------------------------------- + + +// Base styles +// ------------------------- + +.alert { + padding: @alert-padding; + margin-bottom: @line-height-computed; + border: 1px solid transparent; + border-radius: @alert-border-radius; + + // Headings for larger alerts + h4 { + margin-top: 0; + // Specified for the h4 to prevent conflicts of changing @headings-color + color: inherit; + } + + // Provide class for links that match alerts + .alert-link { + font-weight: @alert-link-font-weight; + } + + // Improve alignment and spacing of inner content + > p, + > ul { + margin-bottom: 0; + } + + > p + p { + margin-top: 5px; + } +} + +// Dismissible alerts +// +// Expand the right padding and account for the close button's positioning. + +.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0. +.alert-dismissible { + padding-right: (@alert-padding + 20); + + // Adjust close link position + .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; + } +} + +// Alternate styles +// +// Generate contextual modifier classes for colorizing the alert. + +.alert-success { + .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text); +} + +.alert-info { + .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text); +} + +.alert-warning { + .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text); +} + +.alert-danger { + .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text); +} diff --git a/docs/theme/input/assets/css/bootstrap/_badges.less b/docs/theme/input/assets/css/bootstrap/_badges.less new file mode 100644 index 000000000..6ee16dca4 --- /dev/null +++ b/docs/theme/input/assets/css/bootstrap/_badges.less @@ -0,0 +1,66 @@ +// +// Badges +// -------------------------------------------------- + + +// Base class +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: @font-size-small; + font-weight: @badge-font-weight; + color: @badge-color; + line-height: @badge-line-height; + vertical-align: middle; + white-space: nowrap; + text-align: center; + background-color: @badge-bg; + border-radius: @badge-border-radius; + + // Empty badges collapse automatically (not available in IE8) + &:empty { + display: none; + } + + // Quick fix for badges in buttons + .btn & { + position: relative; + top: -1px; + } + + .btn-xs &, + .btn-group-xs > .btn & { + top: 0; + padding: 1px 5px; + } + + // Hover state, but only for links + a& { + &:hover, + &:focus { + color: @badge-link-hover-color; + text-decoration: none; + cursor: pointer; + } + } + + // Account for badges in navs + .list-group-item.active > &, + .nav-pills > .active > a > & { + color: @badge-active-color; + background-color: @badge-active-bg; + } + + .list-group-item > & { + float: right; + } + + .list-group-item > & + & { + margin-right: 5px; + } + + .nav-pills > li > a > & { + margin-left: 3px; + } +} diff --git a/docs/theme/input/assets/css/bootstrap/_breadcrumbs.less b/docs/theme/input/assets/css/bootstrap/_breadcrumbs.less new file mode 100644 index 000000000..cb01d503f --- /dev/null +++ b/docs/theme/input/assets/css/bootstrap/_breadcrumbs.less @@ -0,0 +1,26 @@ +// +// Breadcrumbs +// -------------------------------------------------- + + +.breadcrumb { + padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal; + margin-bottom: @line-height-computed; + list-style: none; + background-color: @breadcrumb-bg; + border-radius: @border-radius-base; + + > li { + display: inline-block; + + + li:before { + content: "@{breadcrumb-separator}\00a0"; // Unicode space added since inline-block means non-collapsing white-space + padding: 0 5px; + color: @breadcrumb-color; + } + } + + > .active { + color: @breadcrumb-active-color; + } +} diff --git a/docs/theme/input/assets/css/bootstrap/_button-groups.less b/docs/theme/input/assets/css/bootstrap/_button-groups.less new file mode 100644 index 000000000..16db0c613 --- /dev/null +++ b/docs/theme/input/assets/css/bootstrap/_button-groups.less @@ -0,0 +1,244 @@ +// +// Button groups +// -------------------------------------------------- + +// Make the div behave like a button +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; // match .btn alignment given font-size hack above + > .btn { + position: relative; + float: left; + // Bring the "active" button to the front + &:hover, + &:focus, + &:active, + &.active { + z-index: 2; + } + } +} + +// Prevent double borders when buttons are next to each other +.btn-group { + .btn + .btn, + .btn + .btn-group, + .btn-group + .btn, + .btn-group + .btn-group { + margin-left: -1px; + } +} + +// Optional: Group multiple button groups together for a toolbar +.btn-toolbar { + margin-left: -5px; // Offset the first child's margin + &:extend(.clearfix all); + + .btn, + .btn-group, + .input-group { + float: left; + } + > .btn, + > .btn-group, + > .input-group { + margin-left: 5px; + } +} + +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} + +// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match +.btn-group > .btn:first-child { + margin-left: 0; + &:not(:last-child):not(.dropdown-toggle) { + .border-right-radius(0); + } +} +// Need .dropdown-toggle since :last-child doesn't apply, given that a .dropdown-menu is used immediately after it +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + .border-left-radius(0); +} + +// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group) +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child:not(:last-child) { + > .btn:last-child, + > .dropdown-toggle { + .border-right-radius(0); + } +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + .border-left-radius(0); +} + +// On active and open, don't show outline +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + + +// Sizing +// +// Remix the default button sizing classes into new ones for easier manipulation. + +.btn-group-xs > .btn { &:extend(.btn-xs); } +.btn-group-sm > .btn { &:extend(.btn-sm); } +.btn-group-lg > .btn { &:extend(.btn-lg); } + + +// Split button dropdowns +// ---------------------- + +// Give the line between buttons some depth +.btn-group > .btn + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; +} + +// The clickable button for toggling the menu +// Remove the gradient and set the same inset shadow as the :active state +.btn-group.open .dropdown-toggle { + .box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); + + // Show no shadow for `.btn-link` since it has no other button styles. + &.btn-link { + .box-shadow(none); + } +} + + +// Reposition the caret +.btn .caret { + margin-left: 0; +} +// Carets in other button sizes +.btn-lg .caret { + border-width: @caret-width-large @caret-width-large 0; + border-bottom-width: 0; +} +// Upside down carets for .dropup +.dropup .btn-lg .caret { + border-width: 0 @caret-width-large @caret-width-large; +} + + +// Vertical button groups +// ---------------------- + +.btn-group-vertical { + > .btn, + > .btn-group, + > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; + } + + // Clear floats so dropdown menus can be properly placed + > .btn-group { + &:extend(.clearfix all); + > .btn { + float: none; + } + } + + > .btn + .btn, + > .btn + .btn-group, + > .btn-group + .btn, + > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; + } +} + +.btn-group-vertical > .btn { + &:not(:first-child):not(:last-child) { + border-radius: 0; + } + &:first-child:not(:last-child) { + .border-top-radius(@btn-border-radius-base); + .border-bottom-radius(0); + } + &:last-child:not(:first-child) { + .border-top-radius(0); + .border-bottom-radius(@btn-border-radius-base); + } +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) { + > .btn:last-child, + > .dropdown-toggle { + .border-bottom-radius(0); + } +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + .border-top-radius(0); +} + + +// Justified button groups +// ---------------------- + +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; + > .btn, + > .btn-group { + float: none; + display: table-cell; + width: 1%; + } + > .btn-group .btn { + width: 100%; + } + + > .btn-group .dropdown-menu { + left: auto; + } +} + + +// Checkbox and radio options +// +// In order to support the browser's form validation feedback, powered by the +// `required` attribute, we have to "hide" the inputs via `clip`. We cannot use +// `display: none;` or `visibility: hidden;` as that also hides the popover. +// Simply visually hiding the inputs via `opacity` would leave them clickable in +// certain cases which is prevented by using `clip` and `pointer-events`. +// This way, we ensure a DOM element is visible to position the popover from. +// +// See https://github.com/twbs/bootstrap/pull/12794 and +// https://github.com/twbs/bootstrap/pull/14559 for more information. + +[data-toggle="buttons"] { + > .btn, + > .btn-group > .btn { + input[type="radio"], + input[type="checkbox"] { + position: absolute; + clip: rect(0,0,0,0); + pointer-events: none; + } + } +} diff --git a/docs/theme/input/assets/css/bootstrap/_buttons.less b/docs/theme/input/assets/css/bootstrap/_buttons.less new file mode 100644 index 000000000..9cbb8f416 --- /dev/null +++ b/docs/theme/input/assets/css/bootstrap/_buttons.less @@ -0,0 +1,166 @@ +// +// Buttons +// -------------------------------------------------- + + +// Base styles +// -------------------------------------------------- + +.btn { + display: inline-block; + margin-bottom: 0; // For input.btn + font-weight: @btn-font-weight; + text-align: center; + vertical-align: middle; + touch-action: manipulation; + cursor: pointer; + background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214 + border: 1px solid transparent; + white-space: nowrap; + .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @btn-border-radius-base); + .user-select(none); + + &, + &:active, + &.active { + &:focus, + &.focus { + .tab-focus(); + } + } + + &:hover, + &:focus, + &.focus { + color: @btn-default-color; + text-decoration: none; + } + + &:active, + &.active { + outline: 0; + background-image: none; + .box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); + } + + &.disabled, + &[disabled], + fieldset[disabled] & { + cursor: @cursor-disabled; + .opacity(.65); + .box-shadow(none); + } + + a& { + &.disabled, + fieldset[disabled] & { + pointer-events: none; // Future-proof disabling of clicks on `` elements + } + } +} + + +// Alternate buttons +// -------------------------------------------------- + +.btn-default { + .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border); +} +.btn-primary { + .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border); +} +// Success appears as green +.btn-success { + .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border); +} +// Info appears as blue-green +.btn-info { + .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border); +} +// Warning appears as orange +.btn-warning { + .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border); +} +// Danger and error appear as red +.btn-danger { + .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border); +} + + +// Link buttons +// ------------------------- + +// Make a button look and behave like a link +.btn-link { + color: @link-color; + font-weight: normal; + border-radius: 0; + + &, + &:active, + &.active, + &[disabled], + fieldset[disabled] & { + background-color: transparent; + .box-shadow(none); + } + &, + &:hover, + &:focus, + &:active { + border-color: transparent; + } + &:hover, + &:focus { + color: @link-hover-color; + text-decoration: @link-hover-decoration; + background-color: transparent; + } + &[disabled], + fieldset[disabled] & { + &:hover, + &:focus { + color: @btn-link-disabled-color; + text-decoration: none; + } + } +} + + +// Button Sizes +// -------------------------------------------------- + +.btn-lg { + // line-height: ensure even-numbered height of button next to large input + .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @btn-border-radius-large); +} +.btn-sm { + // line-height: ensure proper height of button next to small input + .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small); +} +.btn-xs { + .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small); +} + + +// Block button +// -------------------------------------------------- + +.btn-block { + display: block; + width: 100%; +} + +// Vertically space out multiple block buttons +.btn-block + .btn-block { + margin-top: 5px; +} + +// Specificity overrides +input[type="submit"], +input[type="reset"], +input[type="button"] { + &.btn-block { + width: 100%; + } +} diff --git a/docs/theme/input/assets/css/bootstrap/_carousel.less b/docs/theme/input/assets/css/bootstrap/_carousel.less new file mode 100644 index 000000000..252011e9e --- /dev/null +++ b/docs/theme/input/assets/css/bootstrap/_carousel.less @@ -0,0 +1,270 @@ +// +// Carousel +// -------------------------------------------------- + + +// Wrapper for the slide container and indicators +.carousel { + position: relative; +} + +.carousel-inner { + position: relative; + overflow: hidden; + width: 100%; + + > .item { + display: none; + position: relative; + .transition(.6s ease-in-out left); + + // Account for jankitude on images + > img, + > a > img { + &:extend(.img-responsive); + line-height: 1; + } + + // WebKit CSS3 transforms for supported devices + @media all and (transform-3d), (-webkit-transform-3d) { + .transition-transform(~'0.6s ease-in-out'); + .backface-visibility(~'hidden'); + .perspective(1000px); + + &.next, + &.active.right { + .translate3d(100%, 0, 0); + left: 0; + } + &.prev, + &.active.left { + .translate3d(-100%, 0, 0); + left: 0; + } + &.next.left, + &.prev.right, + &.active { + .translate3d(0, 0, 0); + left: 0; + } + } + } + + > .active, + > .next, + > .prev { + display: block; + } + + > .active { + left: 0; + } + + > .next, + > .prev { + position: absolute; + top: 0; + width: 100%; + } + + > .next { + left: 100%; + } + > .prev { + left: -100%; + } + > .next.left, + > .prev.right { + left: 0; + } + + > .active.left { + left: -100%; + } + > .active.right { + left: 100%; + } + +} + +// Left/right controls for nav +// --------------------------- + +.carousel-control { + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: @carousel-control-width; + .opacity(@carousel-control-opacity); + font-size: @carousel-control-font-size; + color: @carousel-control-color; + text-align: center; + text-shadow: @carousel-text-shadow; + background-color: rgba(0, 0, 0, 0); // Fix IE9 click-thru bug + // We can't have this transition here because WebKit cancels the carousel + // animation if you trip this while in the middle of another animation. + + // Set gradients for backgrounds + &.left { + #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001)); + } + &.right { + left: auto; + right: 0; + #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5)); + } + + // Hover/focus state + &:hover, + &:focus { + outline: 0; + color: @carousel-control-color; + text-decoration: none; + .opacity(.9); + } + + // Toggles + .icon-prev, + .icon-next, + .glyphicon-chevron-left, + .glyphicon-chevron-right { + position: absolute; + top: 50%; + margin-top: -10px; + z-index: 5; + display: inline-block; + } + .icon-prev, + .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; + } + .icon-next, + .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; + } + .icon-prev, + .icon-next { + width: 20px; + height: 20px; + line-height: 1; + font-family: serif; + } + + + .icon-prev { + &:before { + content: '\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039) + } + } + .icon-next { + &:before { + content: '\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A) + } + } +} + +// Optional indicator pips +// +// Add an unordered list with the following class and add a list item for each +// slide your carousel holds. + +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + margin-left: -30%; + padding-left: 0; + list-style: none; + text-align: center; + + li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + border: 1px solid @carousel-indicator-border-color; + border-radius: 10px; + cursor: pointer; + + // IE8-9 hack for event handling + // + // Internet Explorer 8-9 does not support clicks on elements without a set + // `background-color`. We cannot use `filter` since that's not viewed as a + // background color by the browser. Thus, a hack is needed. + // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer + // + // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we + // set alpha transparency for the best results possible. + background-color: #000 \9; // IE8 + background-color: rgba(0,0,0,0); // IE9 + } + .active { + margin: 0; + width: 12px; + height: 12px; + background-color: @carousel-indicator-active-bg; + } +} + +// Optional captions +// ----------------------------- +// Hidden by default for smaller viewports +.carousel-caption { + position: absolute; + left: 15%; + right: 15%; + bottom: 20px; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: @carousel-caption-color; + text-align: center; + text-shadow: @carousel-text-shadow; + & .btn { + text-shadow: none; // No shadow for button elements in carousel-caption + } +} + + +// Scale up controls for tablets and up +@media screen and (min-width: @screen-sm-min) { + + // Scale up the controls a smidge + .carousel-control { + .glyphicon-chevron-left, + .glyphicon-chevron-right, + .icon-prev, + .icon-next { + width: (@carousel-control-font-size * 1.5); + height: (@carousel-control-font-size * 1.5); + margin-top: (@carousel-control-font-size / -2); + font-size: (@carousel-control-font-size * 1.5); + } + .glyphicon-chevron-left, + .icon-prev { + margin-left: (@carousel-control-font-size / -2); + } + .glyphicon-chevron-right, + .icon-next { + margin-right: (@carousel-control-font-size / -2); + } + } + + // Show and left align the captions + .carousel-caption { + left: 20%; + right: 20%; + padding-bottom: 30px; + } + + // Move up the indicators + .carousel-indicators { + bottom: 20px; + } +} diff --git a/docs/theme/input/assets/css/bootstrap/_close.less b/docs/theme/input/assets/css/bootstrap/_close.less new file mode 100644 index 000000000..6d5bfe087 --- /dev/null +++ b/docs/theme/input/assets/css/bootstrap/_close.less @@ -0,0 +1,34 @@ +// +// Close icons +// -------------------------------------------------- + + +.close { + float: right; + font-size: (@font-size-base * 1.5); + font-weight: @close-font-weight; + line-height: 1; + color: @close-color; + text-shadow: @close-text-shadow; + .opacity(.2); + + &:hover, + &:focus { + color: @close-color; + text-decoration: none; + cursor: pointer; + .opacity(.5); + } + + // Additional properties for button version + // iOS requires the button element instead of an anchor tag. + // If you want the anchor version, it requires `href="#"`. + // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile + button& { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; + } +} diff --git a/docs/theme/input/assets/css/bootstrap/_code.less b/docs/theme/input/assets/css/bootstrap/_code.less new file mode 100644 index 000000000..a08b4d48c --- /dev/null +++ b/docs/theme/input/assets/css/bootstrap/_code.less @@ -0,0 +1,69 @@ +// +// Code (inline and block) +// -------------------------------------------------- + + +// Inline and block code styles +code, +kbd, +pre, +samp { + font-family: @font-family-monospace; +} + +// Inline code +code { + padding: 2px 4px; + font-size: 90%; + color: @code-color; + background-color: @code-bg; + border-radius: @border-radius-base; +} + +// User input typically entered via keyboard +kbd { + padding: 2px 4px; + font-size: 90%; + color: @kbd-color; + background-color: @kbd-bg; + border-radius: @border-radius-small; + box-shadow: inset 0 -1px 0 rgba(0,0,0,.25); + + kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + box-shadow: none; + } +} + +// Blocks of code +pre { + display: block; + padding: ((@line-height-computed - 1) / 2); + margin: 0 0 (@line-height-computed / 2); + font-size: (@font-size-base - 1); // 14px to 13px + line-height: @line-height-base; + word-break: break-all; + word-wrap: break-word; + color: @pre-color; + background-color: @pre-bg; + border: 1px solid @pre-border-color; + border-radius: @border-radius-base; + + // Account for some code outputs that place code tags in pre tags + code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; + } +} + +// Enable scrollable blocks of code +.pre-scrollable { + max-height: @pre-scrollable-max-height; + overflow-y: scroll; +} diff --git a/docs/theme/input/assets/css/bootstrap/_component-animations.less b/docs/theme/input/assets/css/bootstrap/_component-animations.less new file mode 100644 index 000000000..0bcee910a --- /dev/null +++ b/docs/theme/input/assets/css/bootstrap/_component-animations.less @@ -0,0 +1,33 @@ +// +// Component animations +// -------------------------------------------------- + +// Heads up! +// +// We don't use the `.opacity()` mixin here since it causes a bug with text +// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552. + +.fade { + opacity: 0; + .transition(opacity .15s linear); + &.in { + opacity: 1; + } +} + +.collapse { + display: none; + + &.in { display: block; } + tr&.in { display: table-row; } + tbody&.in { display: table-row-group; } +} + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + .transition-property(~"height, visibility"); + .transition-duration(.35s); + .transition-timing-function(ease); +} diff --git a/docs/theme/input/assets/css/bootstrap/_dropdowns.less b/docs/theme/input/assets/css/bootstrap/_dropdowns.less new file mode 100644 index 000000000..f6876c1a9 --- /dev/null +++ b/docs/theme/input/assets/css/bootstrap/_dropdowns.less @@ -0,0 +1,216 @@ +// +// Dropdown menus +// -------------------------------------------------- + + +// Dropdown arrow/caret +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: @caret-width-base dashed; + border-top: @caret-width-base solid ~"\9"; // IE8 + border-right: @caret-width-base solid transparent; + border-left: @caret-width-base solid transparent; +} + +// The dropdown wrapper (div) +.dropup, +.dropdown { + position: relative; +} + +// Prevent the focus on the dropdown toggle when closing dropdowns +.dropdown-toggle:focus { + outline: 0; +} + +// The dropdown menu (ul) +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: @zindex-dropdown; + display: none; // none by default, but block on "open" of the menu + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; // override default ul + list-style: none; + font-size: @font-size-base; + text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) + background-color: @dropdown-bg; + border: 1px solid @dropdown-fallback-border; // IE8 fallback + border: 1px solid @dropdown-border; + border-radius: @border-radius-base; + .box-shadow(0 6px 12px rgba(0,0,0,.175)); + background-clip: padding-box; + + // Aligns the dropdown menu to right + // + // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]` + &.pull-right { + right: 0; + left: auto; + } + + // Dividers (basically an hr) within the dropdown + .divider { + .nav-divider(@dropdown-divider-bg); + } + + // Links within the dropdown menu + > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: @line-height-base; + color: @dropdown-link-color; + white-space: nowrap; // prevent links from randomly breaking onto new lines + } +} + +// Hover/Focus state +.dropdown-menu > li > a { + &:hover, + &:focus { + text-decoration: none; + color: @dropdown-link-hover-color; + background-color: @dropdown-link-hover-bg; + } +} + +// Active state +.dropdown-menu > .active > a { + &, + &:hover, + &:focus { + color: @dropdown-link-active-color; + text-decoration: none; + outline: 0; + background-color: @dropdown-link-active-bg; + } +} + +// Disabled state +// +// Gray out text and ensure the hover/focus state remains gray + +.dropdown-menu > .disabled > a { + &, + &:hover, + &:focus { + color: @dropdown-link-disabled-color; + } + + // Nuke hover/focus effects + &:hover, + &:focus { + text-decoration: none; + background-color: transparent; + background-image: none; // Remove CSS gradient + .reset-filter(); + cursor: @cursor-disabled; + } +} + +// Open state for the dropdown +.open { + // Show the menu + > .dropdown-menu { + display: block; + } + + // Remove the outline when :focus is triggered + > a { + outline: 0; + } +} + +// Menu positioning +// +// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown +// menu with the parent. +.dropdown-menu-right { + left: auto; // Reset the default from `.dropdown-menu` + right: 0; +} +// With v3, we enabled auto-flipping if you have a dropdown within a right +// aligned nav component. To enable the undoing of that, we provide an override +// to restore the default dropdown menu alignment. +// +// This is only for left-aligning a dropdown menu within a `.navbar-right` or +// `.pull-right` nav component. +.dropdown-menu-left { + left: 0; + right: auto; +} + +// Dropdown section headers +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: @font-size-small; + line-height: @line-height-base; + color: @dropdown-header-color; + white-space: nowrap; // as with > li > a +} + +// Backdrop to catch body clicks on mobile, etc. +.dropdown-backdrop { + position: fixed; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: (@zindex-dropdown - 10); +} + +// Right aligned dropdowns +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +// Allow for dropdowns to go bottom up (aka, dropup-menu) +// +// Just add .dropup after the standard .dropdown class and you're set, bro. +// TODO: abstract this so that the navbar fixed styles are not placed here? + +.dropup, +.navbar-fixed-bottom .dropdown { + // Reverse the caret + .caret { + border-top: 0; + border-bottom: @caret-width-base dashed; + border-bottom: @caret-width-base solid ~"\9"; // IE8 + content: ""; + } + // Different positioning for bottom up menu + .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; + } +} + + +// Component alignment +// +// Reiterate per navbar.less and the modified component alignment there. + +@media (min-width: @grid-float-breakpoint) { + .navbar-right { + .dropdown-menu { + .dropdown-menu-right(); + } + // Necessary for overrides of the default right aligned menu. + // Will remove come v4 in all likelihood. + .dropdown-menu-left { + .dropdown-menu-left(); + } + } +} diff --git a/docs/theme/input/assets/css/bootstrap/_forms.less b/docs/theme/input/assets/css/bootstrap/_forms.less new file mode 100644 index 000000000..9377d3846 --- /dev/null +++ b/docs/theme/input/assets/css/bootstrap/_forms.less @@ -0,0 +1,613 @@ +// +// Forms +// -------------------------------------------------- + + +// Normalize non-controls +// +// Restyle and baseline non-control form elements. + +fieldset { + padding: 0; + margin: 0; + border: 0; + // Chrome and Firefox set a `min-width: min-content;` on fieldsets, + // so we reset that to ensure it behaves more like a standard block element. + // See https://github.com/twbs/bootstrap/issues/12359. + min-width: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: @line-height-computed; + font-size: (@font-size-base * 1.5); + line-height: inherit; + color: @legend-color; + border: 0; + border-bottom: 1px solid @legend-border-color; +} + +label { + display: inline-block; + max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141) + margin-bottom: 5px; + font-weight: bold; +} + + +// Normalize form controls +// +// While most of our form styles require extra classes, some basic normalization +// is required to ensure optimum display with or without those classes to better +// address browser inconsistencies. + +// Override content-box in Normalize (* isn't specific enough) +input[type="search"] { + .box-sizing(border-box); +} + +// Position radios and checkboxes better +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; // IE8-9 + line-height: normal; +} + +input[type="file"] { + display: block; +} + +// Make range inputs behave like textual form controls +input[type="range"] { + display: block; + width: 100%; +} + +// Make multiple select elements height not fixed +select[multiple], +select[size] { + height: auto; +} + +// Focus for file, radio, and checkbox +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + .tab-focus(); +} + +// Adjust output element +output { + display: block; + padding-top: (@padding-base-vertical + 1); + font-size: @font-size-base; + line-height: @line-height-base; + color: @input-color; +} + + +// Common form controls +// +// Shared size and type resets for form controls. Apply `.form-control` to any +// of the following form controls: +// +// select +// textarea +// input[type="text"] +// input[type="password"] +// input[type="datetime"] +// input[type="datetime-local"] +// input[type="date"] +// input[type="month"] +// input[type="time"] +// input[type="week"] +// input[type="number"] +// input[type="email"] +// input[type="url"] +// input[type="search"] +// input[type="tel"] +// input[type="color"] + +.form-control { + display: block; + width: 100%; + height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border) + padding: @padding-base-vertical @padding-base-horizontal; + font-size: @font-size-base; + line-height: @line-height-base; + color: @input-color; + background-color: @input-bg; + background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214 + border: 1px solid @input-border; + border-radius: @input-border-radius; // Note: This has no effect on s in CSS. + .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); + .transition(~"border-color ease-in-out .15s, box-shadow ease-in-out .15s"); + + // Customize the `:focus` state to imitate native WebKit styles. + .form-control-focus(); + + // Placeholder + .placeholder(); + + // Unstyle the caret on `` background color +@input-bg: #fff; +//** `` background color +@input-bg-disabled: @gray-lighter; + +//** Text color for ``s +@input-color: @gray; +//** `` border color +@input-border: #ccc; + +// TODO: Rename `@input-border-radius` to `@input-border-radius-base` in v4 +//** Default `.form-control` border radius +// This has no effect on ``s in CSS. +@input-border-radius: @border-radius-base; +//** Large `.form-control` border radius +@input-border-radius-large: @border-radius-large; +//** Small `.form-control` border radius +@input-border-radius-small: @border-radius-small; + +//** Border color for inputs on focus +@input-border-focus: #66afe9; + +//** Placeholder text color +@input-color-placeholder: #999; + +//** Default `.form-control` height +@input-height-base: (@line-height-computed + (@padding-base-vertical * 2) + 2); +//** Large `.form-control` height +@input-height-large: (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2); +//** Small `.form-control` height +@input-height-small: (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2); + +//** `.form-group` margin +@form-group-margin-bottom: 15px; + +@legend-color: @gray-dark; +@legend-border-color: #e5e5e5; + +//** Background color for textual input addons +@input-group-addon-bg: @gray-lighter; +//** Border color for textual input addons +@input-group-addon-border-color: @input-border; + +//** Disabled cursor for form controls and buttons. +@cursor-disabled: not-allowed; + + +//== Dropdowns +// +//## Dropdown menu container and contents. + +//** Background for the dropdown menu. +@dropdown-bg: #fff; +//** Dropdown menu `border-color`. +@dropdown-border: rgba(0,0,0,.15); +//** Dropdown menu `border-color` **for IE8**. +@dropdown-fallback-border: #ccc; +//** Divider color for between dropdown items. +@dropdown-divider-bg: #e5e5e5; + +//** Dropdown link text color. +@dropdown-link-color: @gray-dark; +//** Hover color for dropdown links. +@dropdown-link-hover-color: darken(@gray-dark, 5%); +//** Hover background for dropdown links. +@dropdown-link-hover-bg: #f5f5f5; + +//** Active dropdown menu item text color. +@dropdown-link-active-color: @component-active-color; +//** Active dropdown menu item background color. +@dropdown-link-active-bg: @component-active-bg; + +//** Disabled dropdown menu item background color. +@dropdown-link-disabled-color: @gray-light; + +//** Text color for headers within dropdown menus. +@dropdown-header-color: @gray-light; + +//** Deprecated `@dropdown-caret-color` as of v3.1.0 +@dropdown-caret-color: #000; + + +//-- Z-index master list +// +// Warning: Avoid customizing these values. They're used for a bird's eye view +// of components dependent on the z-axis and are designed to all work together. +// +// Note: These variables are not generated into the Customizer. + +@zindex-navbar: 1000; +@zindex-dropdown: 1000; +@zindex-popover: 1060; +@zindex-tooltip: 1070; +@zindex-navbar-fixed: 1030; +@zindex-modal-background: 1040; +@zindex-modal: 1050; + + +//== Media queries breakpoints +// +//## Define the breakpoints at which your layout will change, adapting to different screen sizes. + +// Extra small screen / phone +//** Deprecated `@screen-xs` as of v3.0.1 +@screen-xs: 480px; +//** Deprecated `@screen-xs-min` as of v3.2.0 +@screen-xs-min: @screen-xs; +//** Deprecated `@screen-phone` as of v3.0.1 +@screen-phone: @screen-xs-min; + +// Small screen / tablet +//** Deprecated `@screen-sm` as of v3.0.1 +@screen-sm: 768px; +@screen-sm-min: @screen-sm; +//** Deprecated `@screen-tablet` as of v3.0.1 +@screen-tablet: @screen-sm-min; + +// Medium screen / desktop +//** Deprecated `@screen-md` as of v3.0.1 +@screen-md: 992px; +@screen-md-min: @screen-md; +//** Deprecated `@screen-desktop` as of v3.0.1 +@screen-desktop: @screen-md-min; + +// Large screen / wide desktop +//** Deprecated `@screen-lg` as of v3.0.1 +@screen-lg: 1200px; +@screen-lg-min: @screen-lg; +//** Deprecated `@screen-lg-desktop` as of v3.0.1 +@screen-lg-desktop: @screen-lg-min; + +// So media queries don't overlap when required, provide a maximum +@screen-xs-max: (@screen-sm-min - 1); +@screen-sm-max: (@screen-md-min - 1); +@screen-md-max: (@screen-lg-min - 1); + + +//== Grid system +// +//## Define your custom responsive grid. + +//** Number of columns in the grid. +@grid-columns: 12; +//** Padding between columns. Gets divided in half for the left and right. +@grid-gutter-width: 30px; +// Navbar collapse +//** Point at which the navbar becomes uncollapsed. +@grid-float-breakpoint: @screen-sm-min; +//** Point at which the navbar begins collapsing. +@grid-float-breakpoint-max: (@grid-float-breakpoint - 1); + + +//== Container sizes +// +//## Define the maximum width of `.container` for different screen sizes. + +// Small screen / tablet +@container-tablet: (720px + @grid-gutter-width); +//** For `@screen-sm-min` and up. +@container-sm: @container-tablet; + +// Medium screen / desktop +@container-desktop: (940px + @grid-gutter-width); +//** For `@screen-md-min` and up. +@container-md: @container-desktop; + +// Large screen / wide desktop +@container-large-desktop: (1140px + @grid-gutter-width); +//** For `@screen-lg-min` and up. +@container-lg: @container-large-desktop; + + +//== Navbar +// +//## + +// Basics of a navbar +@navbar-height: 50px; +@navbar-margin-bottom: @line-height-computed; +@navbar-border-radius: @border-radius-base; +@navbar-padding-horizontal: floor((@grid-gutter-width / 2)); +@navbar-padding-vertical: ((@navbar-height - @line-height-computed) / 2); +@navbar-collapse-max-height: 340px; + +@navbar-default-color: #777; +@navbar-default-bg: #f8f8f8; +@navbar-default-border: darken(@navbar-default-bg, 6.5%); + +// Navbar links +@navbar-default-link-color: #777; +@navbar-default-link-hover-color: #333; +@navbar-default-link-hover-bg: transparent; +@navbar-default-link-active-color: #555; +@navbar-default-link-active-bg: darken(@navbar-default-bg, 6.5%); +@navbar-default-link-disabled-color: #ccc; +@navbar-default-link-disabled-bg: transparent; + +// Navbar brand label +@navbar-default-brand-color: @navbar-default-link-color; +@navbar-default-brand-hover-color: darken(@navbar-default-brand-color, 10%); +@navbar-default-brand-hover-bg: transparent; + +// Navbar toggle +@navbar-default-toggle-hover-bg: #ddd; +@navbar-default-toggle-icon-bar-bg: #888; +@navbar-default-toggle-border-color: #ddd; + + +//=== Inverted navbar +// Reset inverted navbar basics +@navbar-inverse-color: lighten(@gray-light, 15%); +@navbar-inverse-bg: #222; +@navbar-inverse-border: darken(@navbar-inverse-bg, 10%); + +// Inverted navbar links +@navbar-inverse-link-color: lighten(@gray-light, 15%); +@navbar-inverse-link-hover-color: #fff; +@navbar-inverse-link-hover-bg: transparent; +@navbar-inverse-link-active-color: @navbar-inverse-link-hover-color; +@navbar-inverse-link-active-bg: darken(@navbar-inverse-bg, 10%); +@navbar-inverse-link-disabled-color: #444; +@navbar-inverse-link-disabled-bg: transparent; + +// Inverted navbar brand label +@navbar-inverse-brand-color: @navbar-inverse-link-color; +@navbar-inverse-brand-hover-color: #fff; +@navbar-inverse-brand-hover-bg: transparent; + +// Inverted navbar toggle +@navbar-inverse-toggle-hover-bg: #333; +@navbar-inverse-toggle-icon-bar-bg: #fff; +@navbar-inverse-toggle-border-color: #333; + + +//== Navs +// +//## + +//=== Shared nav styles +@nav-link-padding: 10px 15px; +@nav-link-hover-bg: @gray-lighter; + +@nav-disabled-link-color: @gray-light; +@nav-disabled-link-hover-color: @gray-light; + +//== Tabs +@nav-tabs-border-color: #ddd; + +@nav-tabs-link-hover-border-color: @gray-lighter; + +@nav-tabs-active-link-hover-bg: @body-bg; +@nav-tabs-active-link-hover-color: @gray; +@nav-tabs-active-link-hover-border-color: #ddd; + +@nav-tabs-justified-link-border-color: #ddd; +@nav-tabs-justified-active-link-border-color: @body-bg; + +//== Pills +@nav-pills-border-radius: @border-radius-base; +@nav-pills-active-link-hover-bg: @component-active-bg; +@nav-pills-active-link-hover-color: @component-active-color; + + +//== Pagination +// +//## + +@pagination-color: @link-color; +@pagination-bg: #fff; +@pagination-border: #ddd; + +@pagination-hover-color: @link-hover-color; +@pagination-hover-bg: @gray-lighter; +@pagination-hover-border: #ddd; + +@pagination-active-color: #fff; +@pagination-active-bg: @brand-primary; +@pagination-active-border: @brand-primary; + +@pagination-disabled-color: @gray-light; +@pagination-disabled-bg: #fff; +@pagination-disabled-border: #ddd; + + +//== Pager +// +//## + +@pager-bg: @pagination-bg; +@pager-border: @pagination-border; +@pager-border-radius: 15px; + +@pager-hover-bg: @pagination-hover-bg; + +@pager-active-bg: @pagination-active-bg; +@pager-active-color: @pagination-active-color; + +@pager-disabled-color: @pagination-disabled-color; + + +//== Jumbotron +// +//## + +@jumbotron-padding: 30px; +@jumbotron-color: inherit; +@jumbotron-bg: @gray-lighter; +@jumbotron-heading-color: inherit; +@jumbotron-font-size: ceil((@font-size-base * 1.5)); +@jumbotron-heading-font-size: ceil((@font-size-base * 4.5)); + + +//== Form states and alerts +// +//## Define colors for form feedback states and, by default, alerts. + +@state-success-text: #3c763d; +@state-success-bg: #dff0d8; +@state-success-border: darken(spin(@state-success-bg, -10), 5%); + +@state-info-text: #31708f; +@state-info-bg: #d9edf7; +@state-info-border: darken(spin(@state-info-bg, -10), 7%); + +@state-warning-text: #8a6d3b; +@state-warning-bg: #fcf8e3; +@state-warning-border: darken(spin(@state-warning-bg, -10), 5%); + +@state-danger-text: #a94442; +@state-danger-bg: #f2dede; +@state-danger-border: darken(spin(@state-danger-bg, -10), 5%); + + +//== Tooltips +// +//## + +//** Tooltip max width +@tooltip-max-width: 200px; +//** Tooltip text color +@tooltip-color: #fff; +//** Tooltip background color +@tooltip-bg: #000; +@tooltip-opacity: .9; + +//** Tooltip arrow width +@tooltip-arrow-width: 5px; +//** Tooltip arrow color +@tooltip-arrow-color: @tooltip-bg; + + +//== Popovers +// +//## + +//** Popover body background color +@popover-bg: #fff; +//** Popover maximum width +@popover-max-width: 276px; +//** Popover border color +@popover-border-color: rgba(0,0,0,.2); +//** Popover fallback border color +@popover-fallback-border-color: #ccc; + +//** Popover title background color +@popover-title-bg: darken(@popover-bg, 3%); + +//** Popover arrow width +@popover-arrow-width: 10px; +//** Popover arrow color +@popover-arrow-color: @popover-bg; + +//** Popover outer arrow width +@popover-arrow-outer-width: (@popover-arrow-width + 1); +//** Popover outer arrow color +@popover-arrow-outer-color: fadein(@popover-border-color, 5%); +//** Popover outer arrow fallback color +@popover-arrow-outer-fallback-color: darken(@popover-fallback-border-color, 20%); + + +//== Labels +// +//## + +//** Default label background color +@label-default-bg: @gray-light; +//** Primary label background color +@label-primary-bg: @brand-primary; +//** Success label background color +@label-success-bg: @brand-success; +//** Info label background color +@label-info-bg: @brand-info; +//** Warning label background color +@label-warning-bg: @brand-warning; +//** Danger label background color +@label-danger-bg: @brand-danger; + +//** Default label text color +@label-color: #fff; +//** Default text color of a linked label +@label-link-hover-color: #fff; + + +//== Modals +// +//## + +//** Padding applied to the modal body +@modal-inner-padding: 15px; + +//** Padding applied to the modal title +@modal-title-padding: 15px; +//** Modal title line-height +@modal-title-line-height: @line-height-base; + +//** Background color of modal content area +@modal-content-bg: #fff; +//** Modal content border color +@modal-content-border-color: rgba(0,0,0,.2); +//** Modal content border color **for IE8** +@modal-content-fallback-border-color: #999; + +//** Modal backdrop background color +@modal-backdrop-bg: #000; +//** Modal backdrop opacity +@modal-backdrop-opacity: .5; +//** Modal header border color +@modal-header-border-color: #e5e5e5; +//** Modal footer border color +@modal-footer-border-color: @modal-header-border-color; + +@modal-lg: 900px; +@modal-md: 600px; +@modal-sm: 300px; + + +//== Alerts +// +//## Define alert colors, border radius, and padding. + +@alert-padding: 15px; +@alert-border-radius: @border-radius-base; +@alert-link-font-weight: bold; + +@alert-success-bg: @state-success-bg; +@alert-success-text: @state-success-text; +@alert-success-border: @state-success-border; + +@alert-info-bg: @state-info-bg; +@alert-info-text: @state-info-text; +@alert-info-border: @state-info-border; + +@alert-warning-bg: @state-warning-bg; +@alert-warning-text: @state-warning-text; +@alert-warning-border: @state-warning-border; + +@alert-danger-bg: @state-danger-bg; +@alert-danger-text: @state-danger-text; +@alert-danger-border: @state-danger-border; + + +//== Progress bars +// +//## + +//** Background color of the whole progress component +@progress-bg: #f5f5f5; +//** Progress bar text color +@progress-bar-color: #fff; +//** Variable for setting rounded corners on progress bar. +@progress-border-radius: @border-radius-base; + +//** Default progress bar color +@progress-bar-bg: @brand-primary; +//** Success progress bar color +@progress-bar-success-bg: @brand-success; +//** Warning progress bar color +@progress-bar-warning-bg: @brand-warning; +//** Danger progress bar color +@progress-bar-danger-bg: @brand-danger; +//** Info progress bar color +@progress-bar-info-bg: @brand-info; + + +//== List group +// +//## + +//** Background color on `.list-group-item` +@list-group-bg: #fff; +//** `.list-group-item` border color +@list-group-border: #ddd; +//** List group border radius +@list-group-border-radius: @border-radius-base; + +//** Background color of single list items on hover +@list-group-hover-bg: #f5f5f5; +//** Text color of active list items +@list-group-active-color: @component-active-color; +//** Background color of active list items +@list-group-active-bg: @component-active-bg; +//** Border color of active list elements +@list-group-active-border: @list-group-active-bg; +//** Text color for content within active list items +@list-group-active-text-color: lighten(@list-group-active-bg, 40%); + +//** Text color of disabled list items +@list-group-disabled-color: @gray-light; +//** Background color of disabled list items +@list-group-disabled-bg: @gray-lighter; +//** Text color for content within disabled list items +@list-group-disabled-text-color: @list-group-disabled-color; + +@list-group-link-color: #555; +@list-group-link-hover-color: @list-group-link-color; +@list-group-link-heading-color: #333; + + +//== Panels +// +//## + +@panel-bg: #fff; +@panel-body-padding: 15px; +@panel-heading-padding: 10px 15px; +@panel-footer-padding: @panel-heading-padding; +@panel-border-radius: @border-radius-base; + +//** Border color for elements within panels +@panel-inner-border: #ddd; +@panel-footer-bg: #f5f5f5; + +@panel-default-text: @gray-dark; +@panel-default-border: #ddd; +@panel-default-heading-bg: #f5f5f5; + +@panel-primary-text: #fff; +@panel-primary-border: @brand-primary; +@panel-primary-heading-bg: @brand-primary; + +@panel-success-text: @state-success-text; +@panel-success-border: @state-success-border; +@panel-success-heading-bg: @state-success-bg; + +@panel-info-text: @state-info-text; +@panel-info-border: @state-info-border; +@panel-info-heading-bg: @state-info-bg; + +@panel-warning-text: @state-warning-text; +@panel-warning-border: @state-warning-border; +@panel-warning-heading-bg: @state-warning-bg; + +@panel-danger-text: @state-danger-text; +@panel-danger-border: @state-danger-border; +@panel-danger-heading-bg: @state-danger-bg; + + +//== Thumbnails +// +//## + +//** Padding around the thumbnail image +@thumbnail-padding: 4px; +//** Thumbnail background color +@thumbnail-bg: @body-bg; +//** Thumbnail border color +@thumbnail-border: #ddd; +//** Thumbnail border radius +@thumbnail-border-radius: @border-radius-base; + +//** Custom text color for thumbnail captions +@thumbnail-caption-color: @text-color; +//** Padding around the thumbnail caption +@thumbnail-caption-padding: 9px; + + +//== Wells +// +//## + +@well-bg: #f5f5f5; +@well-border: darken(@well-bg, 7%); + + +//== Badges +// +//## + +@badge-color: #fff; +//** Linked badge text color on hover +@badge-link-hover-color: #fff; +@badge-bg: @gray-light; + +//** Badge text color in active nav link +@badge-active-color: @link-color; +//** Badge background color in active nav link +@badge-active-bg: #fff; + +@badge-font-weight: bold; +@badge-line-height: 1; +@badge-border-radius: 10px; + + +//== Breadcrumbs +// +//## + +@breadcrumb-padding-vertical: 8px; +@breadcrumb-padding-horizontal: 15px; +//** Breadcrumb background color +@breadcrumb-bg: #f5f5f5; +//** Breadcrumb text color +@breadcrumb-color: #ccc; +//** Text color of current page in the breadcrumb +@breadcrumb-active-color: @gray-light; +//** Textual separator for between breadcrumb elements +@breadcrumb-separator: "/"; + + +//== Carousel +// +//## + +@carousel-text-shadow: 0 1px 2px rgba(0,0,0,.6); + +@carousel-control-color: #fff; +@carousel-control-width: 15%; +@carousel-control-opacity: .5; +@carousel-control-font-size: 20px; + +@carousel-indicator-active-bg: #fff; +@carousel-indicator-border-color: #fff; + +@carousel-caption-color: #fff; + + +//== Close +// +//## + +@close-font-weight: bold; +@close-color: #000; +@close-text-shadow: 0 1px 0 #fff; + + +//== Code +// +//## + +@code-color: @gray-dark; +@code-bg: #f5f5f5; + +@kbd-color: #fff; +@kbd-bg: #333; + +@pre-bg: #f5f5f5; +@pre-color: @gray-dark; +@pre-border-color: #ccc; +@pre-scrollable-max-height: 340px; + + +//== Type +// +//## + +//** Horizontal offset for forms and lists. +@component-offset-horizontal: 180px; +//** Text muted color +@text-muted: @gray-light; +//** Abbreviations and acronyms border color +@abbr-border-color: @gray-light; +//** Headings small color +@headings-small-color: @gray-light; +//** Blockquote small color +@blockquote-small-color: @gray-light; +//** Blockquote font size +@blockquote-font-size: (@font-size-base * 1.25); +//** Blockquote border color +@blockquote-border-color: @gray-lighter; +//** Page header border color +@page-header-border-color: @gray-lighter; +//** Width of horizontal description list titles +@dl-horizontal-offset: @component-offset-horizontal; +//** Point at which .dl-horizontal becomes horizontal +@dl-horizontal-breakpoint: @grid-float-breakpoint; +//** Horizontal line color. +@hr-border: @gray-lighter; diff --git a/docs/theme/input/assets/css/bootstrap/_wells.less b/docs/theme/input/assets/css/bootstrap/_wells.less new file mode 100644 index 000000000..15d072b0c --- /dev/null +++ b/docs/theme/input/assets/css/bootstrap/_wells.less @@ -0,0 +1,29 @@ +// +// Wells +// -------------------------------------------------- + + +// Base class +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: @well-bg; + border: 1px solid @well-border; + border-radius: @border-radius-base; + .box-shadow(inset 0 1px 1px rgba(0,0,0,.05)); + blockquote { + border-color: #ddd; + border-color: rgba(0,0,0,.15); + } +} + +// Sizes +.well-lg { + padding: 24px; + border-radius: @border-radius-large; +} +.well-sm { + padding: 9px; + border-radius: @border-radius-small; +} diff --git a/docs/theme/input/assets/css/bootstrap/bootstrap.less b/docs/theme/input/assets/css/bootstrap/bootstrap.less new file mode 100644 index 000000000..f0aa08f3a --- /dev/null +++ b/docs/theme/input/assets/css/bootstrap/bootstrap.less @@ -0,0 +1,56 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +// Core variables and mixins +@import "variables.less"; +@import "mixins.less"; + +// Reset and dependencies +@import "normalize.less"; +@import "print.less"; +@import "glyphicons.less"; + +// Core CSS +@import "scaffolding.less"; +@import "type.less"; +@import "code.less"; +@import "grid.less"; +@import "tables.less"; +@import "forms.less"; +@import "buttons.less"; + +// Components +@import "component-animations.less"; +@import "dropdowns.less"; +@import "button-groups.less"; +@import "input-groups.less"; +@import "navs.less"; +@import "navbar.less"; +@import "breadcrumbs.less"; +@import "pagination.less"; +@import "pager.less"; +@import "labels.less"; +@import "badges.less"; +@import "jumbotron.less"; +@import "thumbnails.less"; +@import "alerts.less"; +@import "progress-bars.less"; +@import "media.less"; +@import "list-group.less"; +@import "panels.less"; +@import "responsive-embed.less"; +@import "wells.less"; +@import "close.less"; + +// Components w/ JavaScript +@import "modals.less"; +@import "tooltip.less"; +@import "popovers.less"; +@import "carousel.less"; + +// Utility classes +@import "utilities.less"; +@import "responsive-utilities.less"; diff --git a/docs/theme/input/assets/css/bootstrap/mixins/_alerts.less b/docs/theme/input/assets/css/bootstrap/mixins/_alerts.less new file mode 100644 index 000000000..396196f43 --- /dev/null +++ b/docs/theme/input/assets/css/bootstrap/mixins/_alerts.less @@ -0,0 +1,14 @@ +// Alerts + +.alert-variant(@background; @border; @text-color) { + background-color: @background; + border-color: @border; + color: @text-color; + + hr { + border-top-color: darken(@border, 5%); + } + .alert-link { + color: darken(@text-color, 10%); + } +} diff --git a/docs/theme/input/assets/css/bootstrap/mixins/_background-variant.less b/docs/theme/input/assets/css/bootstrap/mixins/_background-variant.less new file mode 100644 index 000000000..a85c22b74 --- /dev/null +++ b/docs/theme/input/assets/css/bootstrap/mixins/_background-variant.less @@ -0,0 +1,9 @@ +// Contextual backgrounds + +.bg-variant(@color) { + background-color: @color; + a&:hover, + a&:focus { + background-color: darken(@color, 10%); + } +} diff --git a/docs/theme/input/assets/css/bootstrap/mixins/_border-radius.less b/docs/theme/input/assets/css/bootstrap/mixins/_border-radius.less new file mode 100644 index 000000000..ca05dbf45 --- /dev/null +++ b/docs/theme/input/assets/css/bootstrap/mixins/_border-radius.less @@ -0,0 +1,18 @@ +// Single side border-radius + +.border-top-radius(@radius) { + border-top-right-radius: @radius; + border-top-left-radius: @radius; +} +.border-right-radius(@radius) { + border-bottom-right-radius: @radius; + border-top-right-radius: @radius; +} +.border-bottom-radius(@radius) { + border-bottom-right-radius: @radius; + border-bottom-left-radius: @radius; +} +.border-left-radius(@radius) { + border-bottom-left-radius: @radius; + border-top-left-radius: @radius; +} diff --git a/docs/theme/input/assets/css/bootstrap/mixins/_buttons.less b/docs/theme/input/assets/css/bootstrap/mixins/_buttons.less new file mode 100644 index 000000000..b294d8c21 --- /dev/null +++ b/docs/theme/input/assets/css/bootstrap/mixins/_buttons.less @@ -0,0 +1,65 @@ +// Button variants +// +// Easily pump out default styles, as well as :hover, :focus, :active, +// and disabled options for all buttons + +.button-variant(@color; @background; @border) { + color: @color; + background-color: @background; + border-color: @border; + + &:focus, + &.focus { + color: @color; + background-color: darken(@background, 10%); + border-color: darken(@border, 25%); + } + &:hover { + color: @color; + background-color: darken(@background, 10%); + border-color: darken(@border, 12%); + } + &:active, + &.active, + .open > .dropdown-toggle& { + color: @color; + background-color: darken(@background, 10%); + border-color: darken(@border, 12%); + + &:hover, + &:focus, + &.focus { + color: @color; + background-color: darken(@background, 17%); + border-color: darken(@border, 25%); + } + } + &:active, + &.active, + .open > .dropdown-toggle& { + background-image: none; + } + &.disabled, + &[disabled], + fieldset[disabled] & { + &:hover, + &:focus, + &.focus { + background-color: @background; + border-color: @border; + } + } + + .badge { + color: @background; + background-color: @color; + } +} + +// Button sizes +.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) { + padding: @padding-vertical @padding-horizontal; + font-size: @font-size; + line-height: @line-height; + border-radius: @border-radius; +} diff --git a/docs/theme/input/assets/css/bootstrap/mixins/_center-block.less b/docs/theme/input/assets/css/bootstrap/mixins/_center-block.less new file mode 100644 index 000000000..d18d6de9e --- /dev/null +++ b/docs/theme/input/assets/css/bootstrap/mixins/_center-block.less @@ -0,0 +1,7 @@ +// Center-align a block level element + +.center-block() { + display: block; + margin-left: auto; + margin-right: auto; +} diff --git a/docs/theme/input/assets/css/bootstrap/mixins/_clearfix.less b/docs/theme/input/assets/css/bootstrap/mixins/_clearfix.less new file mode 100644 index 000000000..3f7a3820c --- /dev/null +++ b/docs/theme/input/assets/css/bootstrap/mixins/_clearfix.less @@ -0,0 +1,22 @@ +// Clearfix +// +// For modern browsers +// 1. The space content is one way to avoid an Opera bug when the +// contenteditable attribute is included anywhere else in the document. +// Otherwise it causes space to appear at the top and bottom of elements +// that are clearfixed. +// 2. The use of `table` rather than `block` is only necessary if using +// `:before` to contain the top-margins of child elements. +// +// Source: http://nicolasgallagher.com/micro-clearfix-hack/ + +.clearfix() { + &:before, + &:after { + content: " "; // 1 + display: table; // 2 + } + &:after { + clear: both; + } +} diff --git a/docs/theme/input/assets/css/bootstrap/mixins/_forms.less b/docs/theme/input/assets/css/bootstrap/mixins/_forms.less new file mode 100644 index 000000000..6f55ed967 --- /dev/null +++ b/docs/theme/input/assets/css/bootstrap/mixins/_forms.less @@ -0,0 +1,85 @@ +// Form validation states +// +// Used in forms.less to generate the form validation CSS for warnings, errors, +// and successes. + +.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) { + // Color the label and help text + .help-block, + .control-label, + .radio, + .checkbox, + .radio-inline, + .checkbox-inline, + &.radio label, + &.checkbox label, + &.radio-inline label, + &.checkbox-inline label { + color: @text-color; + } + // Set the border and box shadow on specific inputs to match + .form-control { + border-color: @border-color; + .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work + &:focus { + border-color: darken(@border-color, 10%); + @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%); + .box-shadow(@shadow); + } + } + // Set validation states also for addons + .input-group-addon { + color: @text-color; + border-color: @border-color; + background-color: @background-color; + } + // Optional feedback icon + .form-control-feedback { + color: @text-color; + } +} + + +// Form control focus state +// +// Generate a customized focus state and for any input with the specified color, +// which defaults to the `@input-border-focus` variable. +// +// We highly encourage you to not customize the default value, but instead use +// this to tweak colors on an as-needed basis. This aesthetic change is based on +// WebKit's default styles, but applicable to a wider range of browsers. Its +// usability and accessibility should be taken into account with any change. +// +// Example usage: change the default blue border and shadow to white for better +// contrast against a dark gray background. +.form-control-focus(@color: @input-border-focus) { + @color-rgba: rgba(red(@color), green(@color), blue(@color), .6); + &:focus { + border-color: @color; + outline: 0; + .box-shadow(~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}"); + } +} + +// Form control sizing +// +// Relative text size, padding, and border-radii changes for form controls. For +// horizontal sizing, wrap controls in the predefined grid classes. `",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return h.call(b,a)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&f.parentNode&&(this.length=1,this[0]=f),this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?void 0!==c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?h.call(n(a),this[0]):h.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||n.uniqueSort(e),D.test(a)&&e.reverse()),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.removeEventListener("DOMContentLoaded",J),a.removeEventListener("load",J),n.ready()}n.ready.promise=function(b){return I||(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(n.ready):(d.addEventListener("DOMContentLoaded",J),a.addEventListener("load",J))),I.promise(b)},n.ready.promise();var K=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)K(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},L=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function M(){this.expando=n.expando+M.uid++}M.uid=1,M.prototype={register:function(a,b){var c=b||{};return a.nodeType?a[this.expando]=c:Object.defineProperty(a,this.expando,{value:c,writable:!0,configurable:!0}),a[this.expando]},cache:function(a){if(!L(a))return{};var b=a[this.expando];return b||(b={},L(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[b]=c;else for(d in b)e[d]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=a[this.expando];if(void 0!==f){if(void 0===b)this.register(a);else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in f?d=[b,e]:(d=e,d=d in f?[d]:d.match(G)||[])),c=d.length;while(c--)delete f[d[c]]}(void 0===b||n.isEmptyObject(f))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!n.isEmptyObject(b)}};var N=new M,O=new M,P=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Q=/[A-Z]/g;function R(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Q,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:P.test(c)?n.parseJSON(c):c; +}catch(e){}O.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return O.hasData(a)||N.hasData(a)},data:function(a,b,c){return O.access(a,b,c)},removeData:function(a,b){O.remove(a,b)},_data:function(a,b,c){return N.access(a,b,c)},_removeData:function(a,b){N.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=O.get(f),1===f.nodeType&&!N.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),R(f,d,e[d])));N.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){O.set(this,a)}):K(this,function(b){var c,d;if(f&&void 0===b){if(c=O.get(f,a)||O.get(f,a.replace(Q,"-$&").toLowerCase()),void 0!==c)return c;if(d=n.camelCase(a),c=O.get(f,d),void 0!==c)return c;if(c=R(f,d,void 0),void 0!==c)return c}else d=n.camelCase(a),this.each(function(){var c=O.get(this,d);O.set(this,d,b),a.indexOf("-")>-1&&void 0!==c&&O.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){O.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=N.get(a,b),c&&(!d||n.isArray(c)?d=N.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return N.get(a,c)||N.access(a,c,{empty:n.Callbacks("once memory").add(function(){N.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length",""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};$.optgroup=$.option,$.tbody=$.tfoot=$.colgroup=$.caption=$.thead,$.th=$.td;function _(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function aa(a,b){for(var c=0,d=a.length;d>c;c++)N.set(a[c],"globalEval",!b||N.get(b[c],"globalEval"))}var ba=/<|&#?\w+;/;function ca(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],o=0,p=a.length;p>o;o++)if(f=a[o],f||0===f)if("object"===n.type(f))n.merge(m,f.nodeType?[f]:f);else if(ba.test(f)){g=g||l.appendChild(b.createElement("div")),h=(Y.exec(f)||["",""])[1].toLowerCase(),i=$[h]||$._default,g.innerHTML=i[1]+n.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;n.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",o=0;while(f=m[o++])if(d&&n.inArray(f,d)>-1)e&&e.push(f);else if(j=n.contains(f.ownerDocument,f),g=_(l.appendChild(f),"script"),j&&aa(g),c){k=0;while(f=g[k++])Z.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var da=/^key/,ea=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,fa=/^([^.]*)(?:\.(.+)|)/;function ga(){return!0}function ha(){return!1}function ia(){try{return d.activeElement}catch(a){}}function ja(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ja(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ha;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return"undefined"!=typeof n&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(G)||[""],j=b.length;while(j--)h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.hasData(a)&&N.get(a);if(r&&(i=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&N.remove(a,"handle events")}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(N.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!==this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,la=/\s*$/g;function pa(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function qa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function ra(a){var b=na.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function sa(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(N.hasData(a)&&(f=N.access(a),g=N.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}O.hasData(a)&&(h=O.access(a),i=n.extend({},h),O.set(b,i))}}function ta(a,b){var c=b.nodeName.toLowerCase();"input"===c&&X.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function ua(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&ma.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),ua(f,b,c,d)});if(o&&(e=ca(b,a[0].ownerDocument,!1,a,d),g=e.firstChild,1===e.childNodes.length&&(e=g),g||d)){for(h=n.map(_(e,"script"),qa),i=h.length;o>m;m++)j=e,m!==p&&(j=n.clone(j,!0,!0),i&&n.merge(h,_(j,"script"))),c.call(a[m],j,m);if(i)for(k=h[h.length-1].ownerDocument,n.map(h,ra),m=0;i>m;m++)j=h[m],Z.test(j.type||"")&&!N.access(j,"globalEval")&&n.contains(k,j)&&(j.src?n._evalUrl&&n._evalUrl(j.src):n.globalEval(j.textContent.replace(oa,"")))}return a}function va(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(_(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&aa(_(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(ka,"<$1>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=_(h),f=_(a),d=0,e=f.length;e>d;d++)ta(f[d],g[d]);if(b)if(c)for(f=f||_(a),g=g||_(h),d=0,e=f.length;e>d;d++)sa(f[d],g[d]);else sa(a,h);return g=_(h,"script"),g.length>0&&aa(g,!i&&_(a,"script")),h},cleanData:function(a){for(var b,c,d,e=n.event.special,f=0;void 0!==(c=a[f]);f++)if(L(c)){if(b=c[N.expando]){if(b.events)for(d in b.events)e[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);c[N.expando]=void 0}c[O.expando]&&(c[O.expando]=void 0)}}}),n.fn.extend({domManip:ua,detach:function(a){return va(this,a,!0)},remove:function(a){return va(this,a)},text:function(a){return K(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.appendChild(a)}})},prepend:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(_(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return K(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!la.test(a)&&!$[(Y.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(_(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return ua(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(_(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),f=e.length-1,h=0;f>=h;h++)c=h===f?this:this.clone(!0),n(e[h])[b](c),g.apply(d,c.get());return this.pushStack(d)}});var wa,xa={HTML:"block",BODY:"block"};function ya(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function za(a){var b=d,c=xa[a];return c||(c=ya(a,b),"none"!==c&&c||(wa=(wa||n("