├── BlazorExample.Site ├── umbraco │ ├── models │ │ ├── ood.flag │ │ ├── Folder.generated.cs │ │ ├── File.generated.cs │ │ ├── UmbracoMediaAudio.generated.cs │ │ ├── UmbracoMediaVideo.generated.cs │ │ ├── UmbracoMediaArticle.generated.cs │ │ ├── UmbracoMediaVectorGraphics.generated.cs │ │ ├── Website.generated.cs │ │ ├── Image.generated.cs │ │ └── Member.generated.cs │ └── Data │ │ ├── Umbraco.mdf │ │ └── Umbraco_log.ldf ├── Tailwind │ └── styles.css ├── App_Plugins │ └── CustomPlugins │ │ ├── tailwindstyles.css │ │ ├── PropertyEditors │ │ ├── suggestionsexample.html │ │ └── suggestionsexample.js │ │ ├── Dashboards │ │ ├── lang │ │ │ └── en-US.xml │ │ ├── twitterdashboard.js │ │ └── twitterdashboard.html │ │ ├── package.manifest │ │ └── styles.min.css ├── tailwind.config.js ├── appsettings-schema.json ├── Views │ ├── Partials │ │ ├── grid │ │ │ ├── editors │ │ │ │ ├── embed.cshtml │ │ │ │ ├── rte.cshtml │ │ │ │ ├── macro.cshtml │ │ │ │ ├── textstring.cshtml │ │ │ │ ├── base.cshtml │ │ │ │ └── media.cshtml │ │ │ ├── bootstrap3-fluid.cshtml │ │ │ └── bootstrap3.cshtml │ │ ├── blockgrid │ │ │ ├── default.cshtml │ │ │ ├── areas.cshtml │ │ │ ├── area.cshtml │ │ │ └── items.cshtml │ │ └── blocklist │ │ │ └── default.cshtml │ ├── _ViewImports.cshtml │ └── Website.cshtml ├── tailwindcss-pluginconfig.js ├── package.json ├── Program.cs ├── Properties │ └── launchSettings.json ├── appsettings.json ├── Controllers │ └── Api │ │ ├── UtilitiesApiController.cs │ │ └── TwitterApiController.cs ├── Startup.cs ├── BlazorExample.Site.csproj ├── .gitignore ├── wwwroot │ └── css │ │ └── styles.css └── package-lock.json ├── package.json ├── .idea └── .idea.BlazorExample │ └── .idea │ ├── encodings.xml │ ├── vcs.xml │ ├── indexLayout.xml │ ├── misc.xml │ └── .gitignore ├── .gitignore ├── BlazorExample.Shared ├── Extensions │ └── StringExtensions.cs ├── BlazorExample.Shared.csproj ├── Comparers │ └── TweetComparer.cs └── Models │ └── Config │ └── BlazorExampleAppSettings.cs ├── BlazorExample.Components ├── Components │ ├── PropertyEditors │ │ ├── SuggestionsExample.razor │ │ └── SuggestionsExample.razor.cs │ ├── GetUmbracoData.razor │ ├── Icons │ │ └── AnimatedSpinner.razor │ ├── GetUmbracoData.razor.cs │ └── Dashboards │ │ ├── LatestUmbracoTweets.razor │ │ └── LatestUmbracoTweets.razor.cs ├── _Imports.razor ├── Program.cs ├── Properties │ └── launchSettings.json └── BlazorExample.Components.csproj ├── BlazorExample.Tests ├── StringTests.cs └── BlazorExample.Tests.csproj ├── BlazorExample.sln └── ReadMe.md /BlazorExample.Site/umbraco/models/ood.flag: -------------------------------------------------------------------------------- 1 | THIS FILE INDICATES THAT MODELS ARE OUT-OF-DATE 2 | 3 | -------------------------------------------------------------------------------- /BlazorExample.Site/Tailwind/styles.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; -------------------------------------------------------------------------------- /BlazorExample.Site/App_Plugins/CustomPlugins/tailwindstyles.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; -------------------------------------------------------------------------------- /BlazorExample.Site/umbraco/Data/Umbraco.mdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YodasMyDad/UmbracoBlazor/HEAD/BlazorExample.Site/umbraco/Data/Umbraco.mdf -------------------------------------------------------------------------------- /BlazorExample.Site/umbraco/Data/Umbraco_log.ldf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YodasMyDad/UmbracoBlazor/HEAD/BlazorExample.Site/umbraco/Data/Umbraco_log.ldf -------------------------------------------------------------------------------- /BlazorExample.Site/App_Plugins/CustomPlugins/PropertyEditors/suggestionsexample.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
-------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "devDependencies": { 3 | "@tailwindcss/typography": "^0.5.2", 4 | "autoprefixer": "^10.4.7", 5 | "postcss": "^8.4.13", 6 | "tailwindcss": "^3.0.24" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /.idea/.idea.BlazorExample/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | bin/ 2 | obj/ 3 | /packages/ 4 | riderModule.iml 5 | /_ReSharper.Caches/ 6 | .vs/ 7 | /.idea/.idea.BlazorExample/.idea/* 8 | /node_modules/* 9 | /BlazorExample.sln.DotSettings.user 10 | 11 | BlazorExample.Site/Smidge/ 12 | -------------------------------------------------------------------------------- /.idea/.idea.BlazorExample/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /BlazorExample.Site/tailwind.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | mode: "jit", 3 | content: ["Views/**/*.cshtml", "Views/**/*.razor"], 4 | theme: { 5 | extend: {} 6 | }, 7 | plugins: [ 8 | require("@tailwindcss/typography"), 9 | ], 10 | } 11 | -------------------------------------------------------------------------------- /.idea/.idea.BlazorExample/.idea/indexLayout.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /BlazorExample.Site/App_Plugins/CustomPlugins/Dashboards/lang/en-US.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | #Umbraco Tweets 5 | 6 | -------------------------------------------------------------------------------- /.idea/.idea.BlazorExample/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /BlazorExample.Shared/Extensions/StringExtensions.cs: -------------------------------------------------------------------------------- 1 | namespace BlazorExample.Shared.Extensions; 2 | 3 | public static class StringExtensions 4 | { 5 | public static string RemoveUmbracoAngularStartJson(this string json) 6 | { 7 | return json.Remove(0, 5).Trim(); 8 | } 9 | } -------------------------------------------------------------------------------- /BlazorExample.Site/App_Plugins/CustomPlugins/Dashboards/twitterdashboard.js: -------------------------------------------------------------------------------- 1 | angular.module("umbraco") 2 | .controller("TwitterDashboard", function ($scope, $location, userService, assetsService, $http, $q, notificationsService) { 3 | 4 | var vm = this; 5 | vm.Loading = false; 6 | 7 | }); -------------------------------------------------------------------------------- /BlazorExample.Site/appsettings-schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-04/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "https://json.schemastore.org/appsettings.json" 6 | }, 7 | { 8 | "$ref": "appsettings-schema.Umbraco.Cms.json#" 9 | } 10 | ] 11 | } -------------------------------------------------------------------------------- /BlazorExample.Components/Components/PropertyEditors/SuggestionsExample.razor: -------------------------------------------------------------------------------- 1 |
2 |

This property editor is a Blazor component

3 |

@_suggestionValue

4 | 5 |
6 | -------------------------------------------------------------------------------- /BlazorExample.Site/Views/Partials/grid/editors/embed.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage 2 | 3 | @{ 4 | string embedValue = Convert.ToString(Model.value); 5 | embedValue = embedValue.DetectIsJson() ? Model.value.preview : Model.value; 6 | } 7 | 8 |
9 | @Html.Raw(embedValue) 10 |
-------------------------------------------------------------------------------- /.idea/.idea.BlazorExample/.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Rider ignored files 5 | /projectSettingsUpdater.xml 6 | /modules.xml 7 | /.idea.BlazorExample.iml 8 | /contentModel.xml 9 | # Editor-based HTTP Client requests 10 | /httpRequests/ 11 | # Datasource local storage ignored files 12 | /dataSources/ 13 | /dataSources.local.xml 14 | -------------------------------------------------------------------------------- /BlazorExample.Site/tailwindcss-pluginconfig.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | prefix: "tw-", 3 | corePlugins: { 4 | preflight: false, 5 | }, 6 | mode: "jit", 7 | content: ["App_Plugins/CustomPlugins/**/**/*.html", "../BlazorExample.Components/**/*.razor"], 8 | theme: { 9 | extend: {} 10 | }, 11 | plugins: [ 12 | require("@tailwindcss/typography"), 13 | ] 14 | } -------------------------------------------------------------------------------- /BlazorExample.Site/Views/_ViewImports.cshtml: -------------------------------------------------------------------------------- 1 | @using Umbraco.Extensions 2 | @using BlazorExample 3 | @using Umbraco.Cms.Web.Common.PublishedModels 4 | @using Umbraco.Cms.Web.Common.Views 5 | @using Umbraco.Cms.Core.Models.PublishedContent 6 | @using Microsoft.AspNetCore.Html 7 | @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers 8 | @addTagHelper *, Smidge 9 | @inject Smidge.SmidgeHelper SmidgeHelper -------------------------------------------------------------------------------- /BlazorExample.Shared/BlazorExample.Shared.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net7.0 5 | enable 6 | enable 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /BlazorExample.Site/Views/Partials/grid/editors/rte.cshtml: -------------------------------------------------------------------------------- 1 | @using Umbraco.Cms.Core.Templates 2 | @model dynamic 3 | @inject HtmlLocalLinkParser HtmlLocalLinkParser; 4 | @inject HtmlUrlParser HtmlUrlParser; 5 | @inject HtmlImageSourceParser HtmlImageSourceParser; 6 | 7 | @{ 8 | var value = HtmlLocalLinkParser.EnsureInternalLinks(Model.value.ToString()); 9 | value = HtmlUrlParser.EnsureUrls(value); 10 | value = HtmlImageSourceParser.EnsureImageSources(value); 11 | } 12 | 13 | @Html.Raw(value) -------------------------------------------------------------------------------- /BlazorExample.Shared/Comparers/TweetComparer.cs: -------------------------------------------------------------------------------- 1 | using Tweetinvi.Models.V2; 2 | 3 | namespace BlazorExample.Shared.Comparers; 4 | 5 | public class TweetComparer: IEqualityComparer { 6 | public bool Equals(TweetV2 tweet1, TweetV2 tweet2) { 7 | if (tweet1.Id.Equals(tweet2.Id)) { 8 | return true; 9 | } 10 | return false; 11 | } 12 | 13 | public int GetHashCode(TweetV2 obj) 14 | { 15 | return obj.Id.GetHashCode(); 16 | } 17 | } -------------------------------------------------------------------------------- /BlazorExample.Site/Views/Partials/blockgrid/default.cshtml: -------------------------------------------------------------------------------- 1 | @using Umbraco.Extensions 2 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage 3 | @{ 4 | if (Model?.Any() != true) { return; } 5 | } 6 | 7 |
10 | @await Html.GetBlockGridItemsHtmlAsync(Model) 11 |
12 | -------------------------------------------------------------------------------- /BlazorExample.Site/Views/Partials/grid/editors/macro.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage 2 | 3 | @if (Model.value != null) 4 | { 5 | string macroAlias = Model.value.macroAlias.ToString(); 6 | var parameters = new Dictionary(); 7 | foreach (var mpd in Model.value.macroParamsDictionary) 8 | { 9 | parameters.Add(mpd.Name, mpd.Value); 10 | } 11 | 12 | 13 | @await Umbraco.RenderMacroAsync(macroAlias, parameters) 14 | 15 | } -------------------------------------------------------------------------------- /BlazorExample.Shared/Models/Config/BlazorExampleAppSettings.cs: -------------------------------------------------------------------------------- 1 | namespace BlazorExample.Shared.Models.Config; 2 | 3 | public class BlazorExampleAppSettings 4 | { 5 | public TwitterApiCredentials? TwitterApiCredentials { get; set; } 6 | } 7 | 8 | public class TwitterApiCredentials 9 | { 10 | public string? ApiKey { get; set; } 11 | public string? ApiKeySecret { get; set; } 12 | public string? BearerToken { get; set; } 13 | public string? AccessToken { get; set; } 14 | public string? AccessTokenSecret { get; set; } 15 | } -------------------------------------------------------------------------------- /BlazorExample.Site/App_Plugins/CustomPlugins/Dashboards/twitterdashboard.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 | 6 |
7 |
8 |
9 |
-------------------------------------------------------------------------------- /BlazorExample.Site/Views/Partials/blockgrid/areas.cshtml: -------------------------------------------------------------------------------- 1 | @using Umbraco.Extensions 2 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage 3 | @{ 4 | if (Model?.Areas.Any() != true) { return; } 5 | } 6 | 7 |
9 | @foreach (var area in Model.Areas) 10 | { 11 | @await Html.GetBlockGridItemAreaHtmlAsync(area) 12 | } 13 |
14 | -------------------------------------------------------------------------------- /BlazorExample.Site/Views/Partials/blocklist/default.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage 2 | @{ 3 | if (!Model.Any()) 4 | { 5 | return; 6 | } 7 | } 8 |
9 | @foreach (var block in Model) 10 | { 11 | if (block?.ContentUdi == null) 12 | { 13 | continue; 14 | } 15 | var data = block.Content; 16 | 17 | @await Html.PartialAsync("BlockList/Components/" + data.ContentType.Alias, block) 18 | } 19 |
-------------------------------------------------------------------------------- /BlazorExample.Site/Views/Partials/blockgrid/area.cshtml: -------------------------------------------------------------------------------- 1 | @using Umbraco.Extensions 2 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage 3 | 4 |
9 | @await Html.GetBlockGridItemsHtmlAsync(Model) 10 |
11 | -------------------------------------------------------------------------------- /BlazorExample.Components/_Imports.razor: -------------------------------------------------------------------------------- 1 | @using System.Net.Http 2 | @using System.Net.Http.Json 3 | @using Microsoft.AspNetCore.Authorization 4 | @using Microsoft.AspNetCore.Components.Forms 5 | @using Microsoft.AspNetCore.Components.Routing 6 | @using Microsoft.AspNetCore.Components.Web 7 | @using Microsoft.AspNetCore.Components.Web.Virtualization 8 | @using Microsoft.AspNetCore.Components.WebAssembly.Http 9 | @using Microsoft.JSInterop 10 | @using BlazorExample.Components.Components 11 | @using BlazorExample.Components.Components.Dashboards 12 | @using BlazorExample.Components.Components.Icons 13 | @using BlazorExample.Components.Components.PropertyEditors -------------------------------------------------------------------------------- /BlazorExample.Site/App_Plugins/CustomPlugins/PropertyEditors/suggestionsexample.js: -------------------------------------------------------------------------------- 1 | angular.module("umbraco") 2 | .controller("SuggestionPluginController", function ($scope, $location, userService, assetsService, $http, $q, notificationsService) { 3 | // Set the variables and methods we want Blazor to access on the window object 4 | // as Blazor can only access that 5 | window.suggestionValue = () => { 6 | return $scope.model.value; 7 | }; 8 | window.setSuggestionValue = (someValue) => { 9 | $scope.model.value = someValue; 10 | }; 11 | window.notificationsService = notificationsService; 12 | }); -------------------------------------------------------------------------------- /BlazorExample.Site/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "blazorexample.site", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "site-css": "npx tailwindcss -i tailwind/styles.css -o wwwroot/css/styles.css --watch", 8 | "dashboard-css": "npx tailwindcss -c tailwindcss-pluginconfig.js -i app_plugins/customplugins/tailwindstyles.css -o app_plugins/customplugins/styles.min.css --minify --watch" 9 | }, 10 | "keywords": [], 11 | "author": "", 12 | "license": "ISC", 13 | "devDependencies": { 14 | "tailwindcss": "^3.0.22" 15 | }, 16 | "dependencies": { 17 | "@tailwindcss/typography": "^0.5.1" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /BlazorExample.Site/Views/Partials/grid/editors/textstring.cshtml: -------------------------------------------------------------------------------- 1 | @using System.Web 2 | @model dynamic 3 | 4 | @if (Model.editor.config.markup != null) 5 | { 6 | string markup = Model.editor.config.markup.ToString(); 7 | markup = markup.Replace("#value#", Html.ReplaceLineBreaks((string)Model.value.ToString()).ToString()); 8 | 9 | if (Model.editor.config.style != null) 10 | { 11 | markup = markup.Replace("#style#", Model.editor.config.style.ToString()); 12 | } 13 | 14 | 15 | @Html.Raw(markup) 16 | 17 | } 18 | else 19 | { 20 | 21 |
@Model.value
22 |
23 | } -------------------------------------------------------------------------------- /BlazorExample.Tests/StringTests.cs: -------------------------------------------------------------------------------- 1 | using Xunit; 2 | using Xunit.Abstractions; 3 | 4 | namespace BlazorExample.Tests; 5 | 6 | public class StringTests 7 | { 8 | private readonly ITestOutputHelper _output; 9 | public StringTests(ITestOutputHelper output) 10 | { 11 | _output = output; 12 | } 13 | 14 | 15 | [Fact] 16 | public void Can_Strip_UmbracoJsonShite() 17 | { 18 | var umbracoJson = @")]}', 19 | true"; 20 | var correctJson = "true"; 21 | var strippedJson = umbracoJson.Remove(0, 9).Trim(); 22 | _output.WriteLine(strippedJson); 23 | Assert.Equal(correctJson, strippedJson); 24 | } 25 | } -------------------------------------------------------------------------------- /BlazorExample.Components/Components/GetUmbracoData.razor: -------------------------------------------------------------------------------- 1 |
2 |

@Text

3 |

Click the button below to get the name of the root node in the backoffice.

4 |

5 | 8 |

9 |

@((MarkupString)WebsiteContent)

10 |
-------------------------------------------------------------------------------- /BlazorExample.Components/Components/Icons/AnimatedSpinner.razor: -------------------------------------------------------------------------------- 1 | @implements IComponent 2 | 3 | @if (Show) 4 | { 5 | 6 | 7 | 8 | 9 | } 10 | 11 | @code { 12 | 13 | [Parameter] 14 | public string Classes { get; set; } = "tw-h-10 tw-w-10 tw-text-indigo-400"; 15 | 16 | [Parameter] 17 | public bool Show { get; set; } = true; 18 | 19 | } -------------------------------------------------------------------------------- /BlazorExample.Site/Views/Partials/grid/editors/base.cshtml: -------------------------------------------------------------------------------- 1 | @model dynamic 2 | 3 | @try 4 | { 5 | string editor = EditorView(Model); 6 | @await Html.PartialAsync(editor, (object)Model) 7 | } 8 | catch (Exception ex) 9 | { 10 |
@ex.ToString()
11 | } 12 | 13 | @functions{ 14 | 15 | public static string EditorView(dynamic contentItem) 16 | { 17 | string view = contentItem.editor.render != null ? contentItem.editor.render.ToString() : contentItem.editor.view.ToString(); 18 | view = view.ToLower().Replace(".html", ".cshtml"); 19 | 20 | if (!view.Contains("/")) 21 | { 22 | view = "grid/editors/" + view; 23 | } 24 | 25 | return view; 26 | } 27 | 28 | } -------------------------------------------------------------------------------- /BlazorExample.Components/Program.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Components.Web; 2 | using Microsoft.AspNetCore.Components.WebAssembly.Hosting; 3 | using BlazorExample.Components.Components; 4 | using BlazorExample.Components.Components.Dashboards; 5 | using BlazorExample.Components.Components.PropertyEditors; 6 | 7 | var builder = WebAssemblyHostBuilder.CreateDefault(args); 8 | builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) }); 9 | builder.RootComponents.RegisterCustomElement("umbraco-data"); 10 | builder.RootComponents.RegisterCustomElement("umbraco-tweets"); 11 | builder.RootComponents.RegisterCustomElement("umbraco-suggestions"); 12 | await builder.Build().RunAsync(); -------------------------------------------------------------------------------- /BlazorExample.Site/Program.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Hosting; 2 | using Microsoft.Extensions.Hosting; 3 | using Microsoft.Extensions.Logging; 4 | 5 | namespace BlazorExample.Site 6 | { 7 | public class Program 8 | { 9 | public static void Main(string[] args) 10 | => CreateHostBuilder(args) 11 | .Build() 12 | .Run(); 13 | 14 | public static IHostBuilder CreateHostBuilder(string[] args) => 15 | Host.CreateDefaultBuilder(args) 16 | .ConfigureUmbracoDefaults() 17 | .ConfigureWebHostDefaults(webBuilder => 18 | { 19 | webBuilder.UseStaticWebAssets(); 20 | webBuilder.UseStartup(); 21 | }); 22 | } 23 | } -------------------------------------------------------------------------------- /BlazorExample.Tests/BlazorExample.Tests.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net6.0 5 | enable 6 | 7 | false 8 | 9 | 10 | 11 | 12 | 13 | 14 | runtime; build; native; contentfiles; analyzers; buildtransitive 15 | all 16 | 17 | 18 | runtime; build; native; contentfiles; analyzers; buildtransitive 19 | all 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /BlazorExample.Components/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "iisSettings": { 3 | "windowsAuthentication": false, 4 | "anonymousAuthentication": true, 5 | "iisExpress": { 6 | "applicationUrl": "http://localhost:6254", 7 | "sslPort": 44308 8 | } 9 | }, 10 | "profiles": { 11 | "BlazorExample.Components": { 12 | "commandName": "Project", 13 | "dotnetRunMessages": true, 14 | "launchBrowser": true, 15 | "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", 16 | "applicationUrl": "https://localhost:7024;http://localhost:5024", 17 | "environmentVariables": { 18 | "ASPNETCORE_ENVIRONMENT": "Development" 19 | } 20 | }, 21 | "IIS Express": { 22 | "commandName": "IISExpress", 23 | "launchBrowser": true, 24 | "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", 25 | "environmentVariables": { 26 | "ASPNETCORE_ENVIRONMENT": "Development" 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /BlazorExample.Components/Components/GetUmbracoData.razor.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Components; 2 | 3 | namespace BlazorExample.Components.Components; 4 | 5 | public partial class GetUmbracoData : ComponentBase 6 | { 7 | [Inject] public HttpClient HttpClient { get; set; } 8 | [Inject] public NavigationManager NavigationManager { get; set; } 9 | 10 | private string Text { get; set; } = "Hello"; 11 | private string WebsiteContent { get; set; } 12 | private string BaseUri { get; set; } 13 | 14 | protected override void OnInitialized() 15 | { 16 | BaseUri = NavigationManager.BaseUri; 17 | if (BaseUri.Contains("umbraco")) 18 | { 19 | BaseUri = BaseUri.Replace("umbraco/", string.Empty); 20 | } 21 | Text = "I'm a Blazor custom element, loading text from OnInitialized() running inside an Umbraco project, styled by Tailwind CSS"; 22 | } 23 | 24 | private async Task GetWebsiteContent() 25 | { 26 | WebsiteContent = await HttpClient.GetStringAsync($"{BaseUri}Api/UtilitiesApi/GetWebsiteContent"); 27 | } 28 | } -------------------------------------------------------------------------------- /BlazorExample.Components/Components/Dashboards/LatestUmbracoTweets.razor: -------------------------------------------------------------------------------- 1 |
2 |
3 |

Latest #Umbraco Tweets

4 |

This is a Blazor component, showing the latest tweets with the hashtag #umbraco. Refreshes every 10 seconds

5 |
6 |
7 | 8 |
9 |
10 | @if (HasSettings) 11 | { 12 |
13 | @foreach (var tweet in Tweets) 14 | { 15 |
16 | @tweet.Text 17 |
18 | } 19 |
20 | } 21 | else 22 | { 23 |
24 |

Oh No!

25 |

Looks like you haven't added the Twitter API credentials in the appsettings.json.

26 |

You will need to create a Twitter App via https://developer.twitter.com/en/portal/projects-and-apps

27 |
28 | } -------------------------------------------------------------------------------- /BlazorExample.Site/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/launchsettings.json", 3 | "iisSettings": { 4 | "windowsAuthentication": false, 5 | "anonymousAuthentication": true, 6 | "iisExpress": { 7 | "applicationUrl": "http://localhost:55697", 8 | "sslPort": 44383 9 | } 10 | }, 11 | "profiles": { 12 | "IIS Express": { 13 | "commandName": "IISExpress", 14 | "launchBrowser": true, 15 | "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", 16 | "environmentVariables": { 17 | "ASPNETCORE_ENVIRONMENT": "Development" 18 | } 19 | }, 20 | "Umbraco.Web.UI": { 21 | "commandName": "Project", 22 | "dotnetRunMessages": true, 23 | "launchBrowser": true, 24 | "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", 25 | "applicationUrl": "https://localhost:44383;http://localhost:55697", 26 | "environmentVariables": { 27 | "ASPNETCORE_ENVIRONMENT": "Development" 28 | } 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /BlazorExample.Site/App_Plugins/CustomPlugins/package.manifest: -------------------------------------------------------------------------------- 1 | { 2 | "propertyEditors": [ 3 | { 4 | "alias": "Suggestions editor", 5 | "name": "Suggestions", 6 | "icon": "icon-list", 7 | "group": "Common", 8 | "editor": { 9 | "view": "~/App_Plugins/CustomPlugins/PropertyEditors/suggestionsexample.html" 10 | } 11 | } 12 | ], 13 | "dashboards": [ 14 | { 15 | "alias": "TwitterDashboard", 16 | "view": "~/App_Plugins/CustomPlugins/Dashboards/twitterdashboard.html", 17 | "sections": [ "content" ], 18 | "weight": -10, 19 | "access": [ 20 | { "grant": "admin" } 21 | ] 22 | } 23 | ], 24 | "javascript": [ 25 | "~/App_Plugins/CustomPlugins/Dashboards/twitterdashboard.js", 26 | "~/App_Plugins/CustomPlugins/PropertyEditors/suggestionsexample.js", 27 | "~/_framework/blazor.webassembly.js", 28 | 29 | ], 30 | "css": [ 31 | "~/App_Plugins/CustomPlugins/styles.min.css" 32 | ], 33 | "bundleOptions": "None" 34 | } -------------------------------------------------------------------------------- /BlazorExample.Components/BlazorExample.Components.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net7.0 5 | enable 6 | enable 7 | true 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /BlazorExample.Components/Components/PropertyEditors/SuggestionsExample.razor.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Components; 2 | using Microsoft.JSInterop; 3 | 4 | namespace BlazorExample.Components.Components.PropertyEditors; 5 | 6 | /// 7 | /// In this example we use the property editor example on Umbraco docs site 8 | /// 9 | /// 10 | /// https://our.umbraco.com/documentation/Tutorials/creating-a-property-editor/#setting-up-a-plugin 11 | /// 12 | public partial class SuggestionsExample : ComponentBase 13 | { 14 | [Inject] public IJSRuntime JS { get; set; } 15 | [Inject] public HttpClient HttpClient { get; set; } 16 | private string? _suggestionValue; 17 | private readonly List _suggestions = new() 18 | { 19 | "You should take a break", 20 | "I suggest that you visit the Eiffel Tower", 21 | "How about starting a book club today or this week?", 22 | "Go outside for a walk", 23 | "Book CodeGarden tickets" 24 | }; 25 | 26 | protected override async Task OnInitializedAsync() 27 | { 28 | _suggestionValue = await JS.InvokeAsync("suggestionValue"); 29 | } 30 | 31 | private async Task GetSuggestions() 32 | { 33 | _suggestionValue = _suggestions.MinBy(x => Guid.NewGuid()); 34 | await JS.InvokeVoidAsync("setSuggestionValue", _suggestionValue); 35 | } 36 | } -------------------------------------------------------------------------------- /BlazorExample.Site/Views/Partials/blockgrid/items.cshtml: -------------------------------------------------------------------------------- 1 | @using Umbraco.Cms.Core.Models.Blocks 2 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage> 3 | @{ 4 | if (Model?.Any() != true) { return; } 5 | } 6 | 7 |
8 | @foreach (var item in Model) 9 | { 10 |
18 | @{ 19 | var partialViewName = "blockgrid/Components/" + item.Content.ContentType.Alias; 20 | try 21 | { 22 | @await Html.PartialAsync(partialViewName, item) 23 | } 24 | catch (InvalidOperationException) 25 | { 26 |

27 | Could not render component of type: @(item.Content.ContentType.Alias) 28 |
29 | This likely happened because the partial view @partialViewName could not be found. 30 |

31 | } 32 | } 33 |
34 | } 35 |
36 | -------------------------------------------------------------------------------- /BlazorExample.Site/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./appsettings-schema.json", 3 | "Serilog": { 4 | "MinimumLevel": { 5 | "Default": "Information", 6 | "Override": { 7 | "Microsoft": "Warning", 8 | "Microsoft.Hosting.Lifetime": "Information", 9 | "System": "Warning" 10 | } 11 | } 12 | }, 13 | "ConnectionStrings": { 14 | "umbracoDbDSN": "Data Source=(localdb)\\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\\Umbraco.mdf;Integrated Security=True" 15 | }, 16 | "BlazorExampleAppSettings": { 17 | "TwitterApiCredentials": { 18 | "ApiKey" : "", 19 | "ApiKeySecret" : "", 20 | "BearerToken": "", 21 | "AccessToken": "", 22 | "AccessTokenSecret" : "" 23 | } 24 | }, 25 | "Umbraco": { 26 | "CMS": { 27 | "Content": { 28 | "ContentVersionCleanupPolicy": { 29 | "EnableCleanup": true, 30 | "KeepAllVersionsNewerThanDays": 7, 31 | "KeepLatestVersionPerDayForDays": 90 32 | } 33 | }, 34 | "Hosting": { 35 | "Debug": false, 36 | "LocalTempStorageLocation": "EnvironmentTemp" 37 | }, 38 | "Examine": { 39 | "LuceneDirectoryFactory": "SyncedTempFileSystemDirectoryFactory" 40 | }, 41 | "Global": { 42 | "MainDomLock" : "SqlMainDomLock", 43 | "UseHttps": true, 44 | "Id": "f824c7f0-fee1-476e-bd46-b00c5be0e968" 45 | }, 46 | "WebRouting": { 47 | "DisableRedirectUrlTracking": false 48 | }, 49 | "ModelsBuilder": { 50 | "ModelsMode": "SourceCodeManual" 51 | } 52 | } 53 | } 54 | } -------------------------------------------------------------------------------- /BlazorExample.Site/Controllers/Api/UtilitiesApiController.cs: -------------------------------------------------------------------------------- 1 | using System.Linq; 2 | using BlazorExample.Shared.Models.Config; 3 | using Microsoft.AspNetCore.Mvc; 4 | using Microsoft.Extensions.Options; 5 | using Umbraco.Cms.Core.Web; 6 | using Umbraco.Cms.Web.Common.PublishedModels; 7 | 8 | namespace BlazorExample.Site.Controllers.Api; 9 | 10 | public class UtilitiesApiController : ControllerBase 11 | { 12 | private readonly IUmbracoContextAccessor _umbracoContextAccessor; 13 | private readonly BlazorExampleAppSettings _blazorExampleAppSettings; 14 | 15 | public UtilitiesApiController(IUmbracoContextAccessor umbracoContextAccessor, IOptions options) 16 | { 17 | _umbracoContextAccessor = umbracoContextAccessor; 18 | _blazorExampleAppSettings = options.Value; 19 | } 20 | 21 | [HttpGet] 22 | [Route("/Api/UtilitiesApi/GetWebsiteContent")] 23 | public string GetWebsiteContent() 24 | { 25 | _umbracoContextAccessor.TryGetUmbracoContext(out var umbracoContext); 26 | var contentType = umbracoContext.Content.GetContentType("Website"); 27 | var website = umbracoContext.Content.GetByContentType(contentType).FirstOrDefault(); 28 | var websiteModel = website as Website; 29 | return $"{websiteModel.WebsiteName}. {websiteModel.WebsiteText}"; 30 | } 31 | 32 | [HttpGet] 33 | [Route("umbraco/_framework/{*path}")] 34 | public IActionResult GetBlazorFiles([FromRoute]string path) 35 | { 36 | return Redirect($"{Request.Scheme}://{Request.Host}/_framework/{path}"); 37 | } 38 | 39 | [HttpGet] 40 | [Route("umbraco/_content/{*path}")] 41 | public IActionResult GetBlazorContentFiles([FromRoute]string path) 42 | { 43 | return Redirect($"{Request.Scheme}://{Request.Host}/_content/{path}"); 44 | } 45 | } -------------------------------------------------------------------------------- /BlazorExample.Site/Controllers/Api/TwitterApiController.cs: -------------------------------------------------------------------------------- 1 | using Umbraco.Cms.Web.BackOffice.Controllers; 2 | using System.Threading.Tasks; 3 | using BlazorExample.Shared.Models.Config; 4 | using Microsoft.Extensions.Options; 5 | using Tweetinvi; 6 | using Tweetinvi.Models.V2; 7 | using Umbraco.Extensions; 8 | 9 | namespace BlazorExample.Site.Controllers.Api; 10 | 11 | public class TwitterApiController : UmbracoAuthorizedApiController 12 | { 13 | 14 | private readonly BlazorExampleAppSettings _blazorExampleAppSettings; 15 | public TwitterApiController(IOptions options) 16 | { 17 | _blazorExampleAppSettings = options.Value; 18 | } 19 | 20 | public bool HasTwitterSettings() 21 | { 22 | var hasSettings = _blazorExampleAppSettings.TwitterApiCredentials?.ApiKey.IsNullOrWhiteSpace() == false && 23 | _blazorExampleAppSettings.TwitterApiCredentials?.ApiKeySecret.IsNullOrWhiteSpace() == false && 24 | _blazorExampleAppSettings.TwitterApiCredentials?.AccessToken.IsNullOrWhiteSpace() == false && 25 | _blazorExampleAppSettings.TwitterApiCredentials?.AccessTokenSecret.IsNullOrWhiteSpace() == false; 26 | return hasSettings; 27 | } 28 | 29 | public async Task GetUmbracoTweets() 30 | { 31 | var userClient = new TwitterClient(_blazorExampleAppSettings.TwitterApiCredentials?.ApiKey, 32 | _blazorExampleAppSettings.TwitterApiCredentials?.ApiKeySecret, 33 | _blazorExampleAppSettings.TwitterApiCredentials?.AccessToken, 34 | _blazorExampleAppSettings.TwitterApiCredentials?.AccessTokenSecret); 35 | var searchResponse = await userClient.SearchV2.SearchTweetsAsync("#umbraco"); 36 | var tweets = searchResponse.Tweets; 37 | return tweets; 38 | } 39 | } -------------------------------------------------------------------------------- /BlazorExample.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlazorExample.Site", "BlazorExample.Site\BlazorExample.Site.csproj", "{C4EC16E5-90AD-4A97-AE5A-8EDFC90876DA}" 4 | EndProject 5 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlazorExample.Components", "BlazorExample.Components\BlazorExample.Components.csproj", "{BB7DC8BA-6A46-4F8C-9E8B-3EA95741C8F1}" 6 | EndProject 7 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlazorExample.Shared", "BlazorExample.Shared\BlazorExample.Shared.csproj", "{F00FCCBC-31E3-42EE-8904-3308E22296F2}" 8 | EndProject 9 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlazorExample.Tests", "BlazorExample.Tests\BlazorExample.Tests.csproj", "{3ED68DB2-D0EC-451A-BCF3-A6FB9E952D01}" 10 | EndProject 11 | Global 12 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 13 | Debug|Any CPU = Debug|Any CPU 14 | Release|Any CPU = Release|Any CPU 15 | EndGlobalSection 16 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 17 | {C4EC16E5-90AD-4A97-AE5A-8EDFC90876DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 18 | {C4EC16E5-90AD-4A97-AE5A-8EDFC90876DA}.Debug|Any CPU.Build.0 = Debug|Any CPU 19 | {C4EC16E5-90AD-4A97-AE5A-8EDFC90876DA}.Release|Any CPU.ActiveCfg = Release|Any CPU 20 | {C4EC16E5-90AD-4A97-AE5A-8EDFC90876DA}.Release|Any CPU.Build.0 = Release|Any CPU 21 | {BB7DC8BA-6A46-4F8C-9E8B-3EA95741C8F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 22 | {BB7DC8BA-6A46-4F8C-9E8B-3EA95741C8F1}.Debug|Any CPU.Build.0 = Debug|Any CPU 23 | {BB7DC8BA-6A46-4F8C-9E8B-3EA95741C8F1}.Release|Any CPU.ActiveCfg = Release|Any CPU 24 | {BB7DC8BA-6A46-4F8C-9E8B-3EA95741C8F1}.Release|Any CPU.Build.0 = Release|Any CPU 25 | {F00FCCBC-31E3-42EE-8904-3308E22296F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 26 | {F00FCCBC-31E3-42EE-8904-3308E22296F2}.Debug|Any CPU.Build.0 = Debug|Any CPU 27 | {F00FCCBC-31E3-42EE-8904-3308E22296F2}.Release|Any CPU.ActiveCfg = Release|Any CPU 28 | {F00FCCBC-31E3-42EE-8904-3308E22296F2}.Release|Any CPU.Build.0 = Release|Any CPU 29 | {3ED68DB2-D0EC-451A-BCF3-A6FB9E952D01}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 30 | {3ED68DB2-D0EC-451A-BCF3-A6FB9E952D01}.Debug|Any CPU.Build.0 = Debug|Any CPU 31 | {3ED68DB2-D0EC-451A-BCF3-A6FB9E952D01}.Release|Any CPU.ActiveCfg = Release|Any CPU 32 | {3ED68DB2-D0EC-451A-BCF3-A6FB9E952D01}.Release|Any CPU.Build.0 = Release|Any CPU 33 | EndGlobalSection 34 | EndGlobal 35 | -------------------------------------------------------------------------------- /BlazorExample.Components/Components/Dashboards/LatestUmbracoTweets.razor.cs: -------------------------------------------------------------------------------- 1 | using BlazorExample.Shared.Comparers; 2 | using BlazorExample.Shared.Extensions; 3 | using Microsoft.AspNetCore.Components; 4 | using Microsoft.JSInterop; 5 | using Newtonsoft.Json; 6 | using Tweetinvi.Models.V2; 7 | 8 | namespace BlazorExample.Components.Components.Dashboards; 9 | 10 | public partial class LatestUmbracoTweets : ComponentBase 11 | { 12 | [Inject] public HttpClient HttpClient { get; set; } 13 | [Inject] public NavigationManager NavigationManager { get; set; } 14 | [Inject] public IJSRuntime JS { get; set; } 15 | 16 | private string? BaseUri { get; set; } 17 | private IEnumerable Tweets { get; set; } 18 | 19 | private bool Loading { get; set; } 20 | private bool HasSettings { get; set; } 21 | 22 | protected override async Task OnInitializedAsync() 23 | { 24 | await base.OnInitializedAsync(); 25 | Tweets = new List(); 26 | BaseUri = NavigationManager.BaseUri; 27 | if (BaseUri.Contains("umbraco")) 28 | { 29 | BaseUri = BaseUri.Replace("umbraco/", string.Empty); 30 | } 31 | 32 | await GetSettingsCheck(); 33 | 34 | if (HasSettings) 35 | { 36 | var timer = new Timer(_ => 37 | { 38 | InvokeAsync( async () => 39 | { 40 | await GetTweets(); 41 | StateHasChanged(); 42 | }); 43 | }, null, TimeSpan.Zero, TimeSpan.FromSeconds(10)); 44 | } 45 | } 46 | 47 | private async Task GetSettingsCheck() 48 | { 49 | var json = await HttpClient.GetStringAsync($"{BaseUri}umbraco/backoffice/api/TwitterApi/HasTwitterSettings"); 50 | json = json.RemoveUmbracoAngularStartJson(); 51 | HasSettings = Convert.ToBoolean(json); 52 | } 53 | 54 | private async Task GetTweets() 55 | { 56 | Loading = true; 57 | StateHasChanged(); 58 | var json = await HttpClient.GetStringAsync($"{BaseUri}umbraco/backoffice/api/TwitterApi/GetUmbracoTweets"); 59 | json = json.RemoveUmbracoAngularStartJson(); 60 | var newTweets = JsonConvert.DeserializeObject>(json); 61 | Tweets = Tweets.Union(newTweets, new TweetComparer()).OrderByDescending(x => x.CreatedAt); 62 | Loading = false; 63 | await JS.InvokeVoidAsync("notificationsService.success", "Updated", "latest tweets added"); 64 | } 65 | } -------------------------------------------------------------------------------- /BlazorExample.Site/Views/Partials/grid/editors/media.cshtml: -------------------------------------------------------------------------------- 1 | @model dynamic 2 | @using Umbraco.Cms.Core.Media 3 | @using Umbraco.Cms.Core.PropertyEditors.ValueConverters 4 | @inject IImageUrlGenerator ImageUrlGenerator 5 | @if (Model.value != null) 6 | { 7 | var url = Model.value.image; 8 | 9 | if (Model.editor.config != null && Model.editor.config.size != null) 10 | { 11 | if (Model.value.coordinates != null) 12 | { 13 | url = ImageCropperTemplateCoreExtensions.GetCropUrl( 14 | (string)url, 15 | ImageUrlGenerator, 16 | width: (int)Model.editor.config.size.width, 17 | height: (int)Model.editor.config.size.height, 18 | cropAlias: "default", 19 | cropDataSet: new ImageCropperValue 20 | { 21 | Crops = new[] 22 | { 23 | new ImageCropperValue.ImageCropperCrop 24 | { 25 | Alias = "default", 26 | Coordinates = new ImageCropperValue.ImageCropperCropCoordinates 27 | { 28 | X1 = (decimal)Model.value.coordinates.x1, 29 | Y1 = (decimal)Model.value.coordinates.y1, 30 | X2 = (decimal)Model.value.coordinates.x2, 31 | Y2 = (decimal)Model.value.coordinates.y2 32 | } 33 | } 34 | } 35 | }); 36 | } 37 | else 38 | { 39 | url = ImageCropperTemplateCoreExtensions.GetCropUrl( 40 | (string)url, 41 | ImageUrlGenerator, 42 | width: (int)Model.editor.config.size.width, 43 | height: (int)Model.editor.config.size.height, 44 | cropDataSet: new ImageCropperValue 45 | { 46 | FocalPoint = new ImageCropperValue.ImageCropperFocalPoint 47 | { 48 | Top = Model.value.focalPoint == null ? 0.5m : Model.value.focalPoint.top, 49 | Left = Model.value.focalPoint == null ? 0.5m : Model.value.focalPoint.left 50 | } 51 | }); 52 | } 53 | } 54 | 55 | var altText = Model.value.altText ?? Model.value.caption ?? string.Empty; 56 | 57 | @altText 58 | 59 | if (Model.value.caption != null) 60 | { 61 |

@Model.value.caption

62 | } 63 | } -------------------------------------------------------------------------------- /BlazorExample.Site/umbraco/models/Folder.generated.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // 5 | // Umbraco.ModelsBuilder.Embedded v9.4.3+192eb2699ba4131addbb08236f60eb031707f751 6 | // 7 | // Changes to this file will be lost if the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | using System; 12 | using System.Linq.Expressions; 13 | using Umbraco.Cms.Core.Models.PublishedContent; 14 | using Umbraco.Cms.Core.PublishedCache; 15 | using Umbraco.Cms.Infrastructure.ModelsBuilder; 16 | using Umbraco.Cms.Core; 17 | using Umbraco.Extensions; 18 | 19 | namespace Umbraco.Cms.Web.Common.PublishedModels 20 | { 21 | /// Folder 22 | [PublishedModel("Folder")] 23 | public partial class Folder : PublishedContentModel 24 | { 25 | // helpers 26 | #pragma warning disable 0109 // new is redundant 27 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 28 | public new const string ModelTypeAlias = "Folder"; 29 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 30 | public new const PublishedItemType ModelItemType = PublishedItemType.Media; 31 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 32 | [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] 33 | public new static IPublishedContentType GetModelContentType(IPublishedSnapshotAccessor publishedSnapshotAccessor) 34 | => PublishedModelUtility.GetModelContentType(publishedSnapshotAccessor, ModelItemType, ModelTypeAlias); 35 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 36 | [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] 37 | public static IPublishedPropertyType GetModelPropertyType(IPublishedSnapshotAccessor publishedSnapshotAccessor, Expression> selector) 38 | => PublishedModelUtility.GetModelPropertyType(GetModelContentType(publishedSnapshotAccessor), selector); 39 | #pragma warning restore 0109 40 | 41 | private IPublishedValueFallback _publishedValueFallback; 42 | 43 | // ctor 44 | public Folder(IPublishedContent content, IPublishedValueFallback publishedValueFallback) 45 | : base(content, publishedValueFallback) 46 | { 47 | _publishedValueFallback = publishedValueFallback; 48 | } 49 | 50 | // properties 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /ReadMe.md: -------------------------------------------------------------------------------- 1 | ## What is this? 2 | 3 | This is a simple Umbraco 9 website, showing Blazor WASM running in the back office on a dashboard. This project also shows the setup to have Blazor hosted in the same site as Umbraco, so you don't have to deploy a front and backend. See current problems below. 4 | 5 | The way Blazor is running is using a new feature of .Net called Blazor Custom Elements, and you can [read more about that here](https://devblogs.microsoft.com/dotnet/asp-net-core-updates-in-net-6-rc-1/#blazor-custom-elements) 6 | 7 | In addition, if you are a Tailwind Css fan like me. This project shows how to have Tailwind CSS for the front end AND also have it used in the back office with a separate stylesheet, that uses prefixes so it doesn't clash/break the Umbraco styles. The Blazor dashboard is styled using Tailwind CSS. 8 | 9 | For me. This is a super exciting project, having Blazor running in the Umbraco back office is a game changer. I'm looking for the community to help get involved and fix the current problems and improve the project. 10 | 11 | ## What Components? 12 | 13 | #### Twitter Dashboard 14 | 15 | Simple Twitter dashboard that displays the latest tweets from the #umbraco hashtag, build in Blazor. Auto refreshes every 10 seconds to show latest tweets. 16 | 17 | You will need to add in your own Twitter API credentials from [https://developer.twitter.com/en/portal/projects-and-apps](https://developer.twitter.com/en/portal/projects-and-apps) 18 | 19 | Also calls the AngularJs notificationService.success once tweets are fetched. 20 | 21 | #### Reading Content 22 | 23 | Little component that grabs the content from the root website node when you click a button. 24 | 25 | #### Blazor Property Editor 26 | 27 | A copy of the Suggestions example property editor in the [Umbraco Docs](https://our.umbraco.com/documentation/Tutorials/creating-a-property-editor/), but built in Blazor which is pretty cool. 28 | 29 | Allows the value to be sent back to the AngularJs scope so the value can be saved, when the page is saved. 30 | 31 | ## Login Details 32 | 33 | Just run the site and login to the back office using the below credentials. 34 | 35 | admin@admin.com 36 | 1234567890 37 | 38 | Don't forget to run NPM if you want to change anything to do with Tailwind. 39 | 40 | ## Work Arounds 41 | 42 | Because the Blazor.Webassembly.js relies on the base url to fetch the blazor.boot.json file, which will contain the /umbraco/ url when called from the back-office, the only way to get it working would be to have it fully configured to work from the Frontend first, and then have an additional controller redirecting the /umbraco/_framework/* files back to the original frontend url so that every file can be fetched! 43 | 44 | However, this is working fine with the controller. 45 | 46 | [Read more here](https://github.com/dotnet/aspnetcore/issues/22220) 47 | 48 | Also, had to set 49 | 50 | `"bundleOptions": "None"` 51 | 52 | in the package.manifest to stop Umbraco bundling and minifying the scripts, which broke Blazor in production. 53 | -------------------------------------------------------------------------------- /BlazorExample.Site/Views/Website.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage 2 | @using ContentModels = Umbraco.Cms.Web.Common.PublishedModels; 3 | @{ 4 | Layout = null; 5 | } 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | Blazor Example 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 |
22 |
23 |
24 |
25 |

Example Umbraco 9 site showing the following features:

26 |
    27 |
  • 28 | 29 | 30 | 31 | 32 |

    33 | Blazor in the back office, running in dashboards. Project structure shows setup of how to get Blazor WASM hosted in same site as Umbraco 34 |

    35 |
  • 36 |
  • 37 | 38 | 39 | 40 | 41 |

    42 | Tailwind Css running in the front end and also using Tailwind Css for the Umbraco backoffice dashboard. Using prefixes so it doesn't clash with the umbraco styles. 43 |

    44 |
  • 45 |
46 |

Please make sure you read the ReadMe file which outlines the current issues with Blazor. The back office login details are

47 |

admin@admin.com

48 |

1234567890

49 |
50 | 51 | 52 | 53 |
54 |
55 |
56 |
57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /BlazorExample.Site/Startup.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using BlazorExample.Shared.Models.Config; 3 | using Microsoft.AspNetCore.Builder; 4 | using Microsoft.AspNetCore.Hosting; 5 | using Microsoft.Extensions.Configuration; 6 | using Microsoft.Extensions.DependencyInjection; 7 | using Microsoft.Extensions.Hosting; 8 | using Umbraco.Cms.Core.DependencyInjection; 9 | using Umbraco.Extensions; 10 | 11 | namespace BlazorExample.Site 12 | { 13 | public class Startup 14 | { 15 | private readonly IWebHostEnvironment _env; 16 | private readonly IConfiguration _config; 17 | 18 | /// 19 | /// Initializes a new instance of the class. 20 | /// 21 | /// The web hosting environment. 22 | /// The configuration. 23 | /// 24 | /// Only a few services are possible to be injected here https://github.com/dotnet/aspnetcore/issues/9337 25 | /// 26 | public Startup(IWebHostEnvironment webHostEnvironment, IConfiguration config) 27 | { 28 | _env = webHostEnvironment ?? throw new ArgumentNullException(nameof(webHostEnvironment)); 29 | _config = config ?? throw new ArgumentNullException(nameof(config)); 30 | } 31 | 32 | /// 33 | /// Configures the services. 34 | /// 35 | /// The services. 36 | /// 37 | /// This method gets called by the runtime. Use this method to add services to the container. 38 | /// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 39 | /// 40 | public void ConfigureServices(IServiceCollection services) 41 | { 42 | #pragma warning disable IDE0022 // Use expression body for methods 43 | services.AddUmbraco(_env, _config) 44 | .AddBackOffice() 45 | .AddWebsite() 46 | .AddComposers() 47 | .Build(); 48 | #pragma warning restore IDE0022 // Use expression body for methods 49 | services.AddHttpClient(); 50 | 51 | services.Configure(_config.GetSection("BlazorExampleAppSettings")); 52 | } 53 | 54 | /// 55 | /// Configures the application. 56 | /// 57 | /// The application builder. 58 | /// The web hosting environment. 59 | public void Configure(IApplicationBuilder app, IWebHostEnvironment env) 60 | { 61 | if (env.IsDevelopment()) 62 | { 63 | app.UseDeveloperExceptionPage(); 64 | app.UseWebAssemblyDebugging(); 65 | } 66 | 67 | app.UseUmbraco() 68 | .WithMiddleware(u => 69 | { 70 | u.UseBackOffice(); 71 | u.UseWebsite(); 72 | }) 73 | .WithEndpoints(u => 74 | { 75 | u.UseInstallerEndpoints(); 76 | u.UseBackOfficeEndpoints(); 77 | u.UseWebsiteEndpoints(); 78 | }); 79 | 80 | app.UseBlazorFrameworkFiles(); 81 | } 82 | } 83 | } -------------------------------------------------------------------------------- /BlazorExample.Site/Views/Partials/grid/bootstrap3-fluid.cshtml: -------------------------------------------------------------------------------- 1 | @using System.Web 2 | @using Microsoft.AspNetCore.Html 3 | @using Newtonsoft.Json.Linq 4 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage 5 | 6 | @* 7 | Razor helpers located at the bottom of this file 8 | *@ 9 | 10 | @if (Model != null && Model.GetType() == typeof(JObject) && Model.sections != null) 11 | { 12 | var oneColumn = ((System.Collections.ICollection)Model.sections).Count == 1; 13 | 14 |
15 | @if (oneColumn) 16 | { 17 | foreach (var section in Model.sections) 18 | { 19 |
20 | @foreach (var row in section.rows) 21 | { 22 | renderRow(row); 23 | } 24 |
25 | } 26 | } 27 | else 28 | { 29 |
30 | @foreach (var sec in Model.sections) 31 | { 32 |
33 |
34 | @foreach (var row in sec.rows) 35 | { 36 | renderRow(row); 37 | } 38 |
39 |
40 | } 41 |
42 | } 43 |
44 | } 45 | 46 | @functions{ 47 | 48 | private async Task renderRow(dynamic row) 49 | { 50 |
51 |
52 | @foreach (var area in row.areas) 53 | { 54 |
55 |
56 | @foreach (var control in area.controls) 57 | { 58 | if (control != null && control.editor != null && control.editor.view != null) 59 | { 60 | @await Html.PartialAsync("grid/editors/base", (object)control) 61 | } 62 | } 63 |
64 |
65 | } 66 |
67 |
68 | } 69 | 70 | } 71 | 72 | @functions{ 73 | 74 | public static HtmlString RenderElementAttributes(dynamic contentItem) 75 | { 76 | var attrs = new List(); 77 | JObject cfg = contentItem.config; 78 | 79 | if (cfg != null) 80 | { 81 | foreach (JProperty property in cfg.Properties()) 82 | { 83 | var propertyValue = HttpUtility.HtmlAttributeEncode(property.Value.ToString()); 84 | attrs.Add(property.Name + "=\"" + propertyValue + "\""); 85 | } 86 | } 87 | 88 | JObject style = contentItem.styles; 89 | 90 | if (style != null) 91 | { 92 | var cssVals = new List(); 93 | foreach (JProperty property in style.Properties()) 94 | { 95 | var propertyValue = property.Value.ToString(); 96 | if (string.IsNullOrWhiteSpace(propertyValue) == false) 97 | { 98 | cssVals.Add(property.Name + ":" + propertyValue + ";"); 99 | } 100 | } 101 | 102 | if (cssVals.Any()) 103 | attrs.Add("style='" + HttpUtility.HtmlAttributeEncode(string.Join(" ", cssVals)) + "'"); 104 | } 105 | 106 | return new HtmlString(string.Join(" ", attrs)); 107 | } 108 | 109 | } -------------------------------------------------------------------------------- /BlazorExample.Site/umbraco/models/File.generated.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // 5 | // Umbraco.ModelsBuilder.Embedded v9.4.3+192eb2699ba4131addbb08236f60eb031707f751 6 | // 7 | // Changes to this file will be lost if the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | using System; 12 | using System.Linq.Expressions; 13 | using Umbraco.Cms.Core.Models.PublishedContent; 14 | using Umbraco.Cms.Core.PublishedCache; 15 | using Umbraco.Cms.Infrastructure.ModelsBuilder; 16 | using Umbraco.Cms.Core; 17 | using Umbraco.Extensions; 18 | 19 | namespace Umbraco.Cms.Web.Common.PublishedModels 20 | { 21 | /// File 22 | [PublishedModel("File")] 23 | public partial class File : PublishedContentModel 24 | { 25 | // helpers 26 | #pragma warning disable 0109 // new is redundant 27 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 28 | public new const string ModelTypeAlias = "File"; 29 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 30 | public new const PublishedItemType ModelItemType = PublishedItemType.Media; 31 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 32 | [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] 33 | public new static IPublishedContentType GetModelContentType(IPublishedSnapshotAccessor publishedSnapshotAccessor) 34 | => PublishedModelUtility.GetModelContentType(publishedSnapshotAccessor, ModelItemType, ModelTypeAlias); 35 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 36 | [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] 37 | public static IPublishedPropertyType GetModelPropertyType(IPublishedSnapshotAccessor publishedSnapshotAccessor, Expression> selector) 38 | => PublishedModelUtility.GetModelPropertyType(GetModelContentType(publishedSnapshotAccessor), selector); 39 | #pragma warning restore 0109 40 | 41 | private IPublishedValueFallback _publishedValueFallback; 42 | 43 | // ctor 44 | public File(IPublishedContent content, IPublishedValueFallback publishedValueFallback) 45 | : base(content, publishedValueFallback) 46 | { 47 | _publishedValueFallback = publishedValueFallback; 48 | } 49 | 50 | // properties 51 | 52 | /// 53 | /// Size: in bytes 54 | /// 55 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 56 | [ImplementPropertyType("umbracoBytes")] 57 | public virtual long UmbracoBytes => this.Value(_publishedValueFallback, "umbracoBytes"); 58 | 59 | /// 60 | /// Type 61 | /// 62 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 63 | [global::System.Diagnostics.CodeAnalysis.MaybeNull] 64 | [ImplementPropertyType("umbracoExtension")] 65 | public virtual string UmbracoExtension => this.Value(_publishedValueFallback, "umbracoExtension"); 66 | 67 | /// 68 | /// File 69 | /// 70 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 71 | [global::System.Diagnostics.CodeAnalysis.MaybeNull] 72 | [ImplementPropertyType("umbracoFile")] 73 | public virtual string UmbracoFile => this.Value(_publishedValueFallback, "umbracoFile"); 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /BlazorExample.Site/umbraco/models/UmbracoMediaAudio.generated.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // 5 | // Umbraco.ModelsBuilder.Embedded v9.4.3+192eb2699ba4131addbb08236f60eb031707f751 6 | // 7 | // Changes to this file will be lost if the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | using System; 12 | using System.Linq.Expressions; 13 | using Umbraco.Cms.Core.Models.PublishedContent; 14 | using Umbraco.Cms.Core.PublishedCache; 15 | using Umbraco.Cms.Infrastructure.ModelsBuilder; 16 | using Umbraco.Cms.Core; 17 | using Umbraco.Extensions; 18 | 19 | namespace Umbraco.Cms.Web.Common.PublishedModels 20 | { 21 | /// Audio 22 | [PublishedModel("umbracoMediaAudio")] 23 | public partial class UmbracoMediaAudio : PublishedContentModel 24 | { 25 | // helpers 26 | #pragma warning disable 0109 // new is redundant 27 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 28 | public new const string ModelTypeAlias = "umbracoMediaAudio"; 29 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 30 | public new const PublishedItemType ModelItemType = PublishedItemType.Media; 31 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 32 | [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] 33 | public new static IPublishedContentType GetModelContentType(IPublishedSnapshotAccessor publishedSnapshotAccessor) 34 | => PublishedModelUtility.GetModelContentType(publishedSnapshotAccessor, ModelItemType, ModelTypeAlias); 35 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 36 | [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] 37 | public static IPublishedPropertyType GetModelPropertyType(IPublishedSnapshotAccessor publishedSnapshotAccessor, Expression> selector) 38 | => PublishedModelUtility.GetModelPropertyType(GetModelContentType(publishedSnapshotAccessor), selector); 39 | #pragma warning restore 0109 40 | 41 | private IPublishedValueFallback _publishedValueFallback; 42 | 43 | // ctor 44 | public UmbracoMediaAudio(IPublishedContent content, IPublishedValueFallback publishedValueFallback) 45 | : base(content, publishedValueFallback) 46 | { 47 | _publishedValueFallback = publishedValueFallback; 48 | } 49 | 50 | // properties 51 | 52 | /// 53 | /// Size: in bytes 54 | /// 55 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 56 | [ImplementPropertyType("umbracoBytes")] 57 | public virtual long UmbracoBytes => this.Value(_publishedValueFallback, "umbracoBytes"); 58 | 59 | /// 60 | /// Type 61 | /// 62 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 63 | [global::System.Diagnostics.CodeAnalysis.MaybeNull] 64 | [ImplementPropertyType("umbracoExtension")] 65 | public virtual string UmbracoExtension => this.Value(_publishedValueFallback, "umbracoExtension"); 66 | 67 | /// 68 | /// Audio 69 | /// 70 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 71 | [global::System.Diagnostics.CodeAnalysis.MaybeNull] 72 | [ImplementPropertyType("umbracoFile")] 73 | public virtual string UmbracoFile => this.Value(_publishedValueFallback, "umbracoFile"); 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /BlazorExample.Site/umbraco/models/UmbracoMediaVideo.generated.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // 5 | // Umbraco.ModelsBuilder.Embedded v9.4.3+192eb2699ba4131addbb08236f60eb031707f751 6 | // 7 | // Changes to this file will be lost if the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | using System; 12 | using System.Linq.Expressions; 13 | using Umbraco.Cms.Core.Models.PublishedContent; 14 | using Umbraco.Cms.Core.PublishedCache; 15 | using Umbraco.Cms.Infrastructure.ModelsBuilder; 16 | using Umbraco.Cms.Core; 17 | using Umbraco.Extensions; 18 | 19 | namespace Umbraco.Cms.Web.Common.PublishedModels 20 | { 21 | /// Video 22 | [PublishedModel("umbracoMediaVideo")] 23 | public partial class UmbracoMediaVideo : PublishedContentModel 24 | { 25 | // helpers 26 | #pragma warning disable 0109 // new is redundant 27 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 28 | public new const string ModelTypeAlias = "umbracoMediaVideo"; 29 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 30 | public new const PublishedItemType ModelItemType = PublishedItemType.Media; 31 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 32 | [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] 33 | public new static IPublishedContentType GetModelContentType(IPublishedSnapshotAccessor publishedSnapshotAccessor) 34 | => PublishedModelUtility.GetModelContentType(publishedSnapshotAccessor, ModelItemType, ModelTypeAlias); 35 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 36 | [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] 37 | public static IPublishedPropertyType GetModelPropertyType(IPublishedSnapshotAccessor publishedSnapshotAccessor, Expression> selector) 38 | => PublishedModelUtility.GetModelPropertyType(GetModelContentType(publishedSnapshotAccessor), selector); 39 | #pragma warning restore 0109 40 | 41 | private IPublishedValueFallback _publishedValueFallback; 42 | 43 | // ctor 44 | public UmbracoMediaVideo(IPublishedContent content, IPublishedValueFallback publishedValueFallback) 45 | : base(content, publishedValueFallback) 46 | { 47 | _publishedValueFallback = publishedValueFallback; 48 | } 49 | 50 | // properties 51 | 52 | /// 53 | /// Size: in bytes 54 | /// 55 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 56 | [ImplementPropertyType("umbracoBytes")] 57 | public virtual long UmbracoBytes => this.Value(_publishedValueFallback, "umbracoBytes"); 58 | 59 | /// 60 | /// Type 61 | /// 62 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 63 | [global::System.Diagnostics.CodeAnalysis.MaybeNull] 64 | [ImplementPropertyType("umbracoExtension")] 65 | public virtual string UmbracoExtension => this.Value(_publishedValueFallback, "umbracoExtension"); 66 | 67 | /// 68 | /// Video 69 | /// 70 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 71 | [global::System.Diagnostics.CodeAnalysis.MaybeNull] 72 | [ImplementPropertyType("umbracoFile")] 73 | public virtual string UmbracoFile => this.Value(_publishedValueFallback, "umbracoFile"); 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /BlazorExample.Site/umbraco/models/UmbracoMediaArticle.generated.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // 5 | // Umbraco.ModelsBuilder.Embedded v9.4.3+192eb2699ba4131addbb08236f60eb031707f751 6 | // 7 | // Changes to this file will be lost if the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | using System; 12 | using System.Linq.Expressions; 13 | using Umbraco.Cms.Core.Models.PublishedContent; 14 | using Umbraco.Cms.Core.PublishedCache; 15 | using Umbraco.Cms.Infrastructure.ModelsBuilder; 16 | using Umbraco.Cms.Core; 17 | using Umbraco.Extensions; 18 | 19 | namespace Umbraco.Cms.Web.Common.PublishedModels 20 | { 21 | /// Article 22 | [PublishedModel("umbracoMediaArticle")] 23 | public partial class UmbracoMediaArticle : PublishedContentModel 24 | { 25 | // helpers 26 | #pragma warning disable 0109 // new is redundant 27 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 28 | public new const string ModelTypeAlias = "umbracoMediaArticle"; 29 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 30 | public new const PublishedItemType ModelItemType = PublishedItemType.Media; 31 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 32 | [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] 33 | public new static IPublishedContentType GetModelContentType(IPublishedSnapshotAccessor publishedSnapshotAccessor) 34 | => PublishedModelUtility.GetModelContentType(publishedSnapshotAccessor, ModelItemType, ModelTypeAlias); 35 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 36 | [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] 37 | public static IPublishedPropertyType GetModelPropertyType(IPublishedSnapshotAccessor publishedSnapshotAccessor, Expression> selector) 38 | => PublishedModelUtility.GetModelPropertyType(GetModelContentType(publishedSnapshotAccessor), selector); 39 | #pragma warning restore 0109 40 | 41 | private IPublishedValueFallback _publishedValueFallback; 42 | 43 | // ctor 44 | public UmbracoMediaArticle(IPublishedContent content, IPublishedValueFallback publishedValueFallback) 45 | : base(content, publishedValueFallback) 46 | { 47 | _publishedValueFallback = publishedValueFallback; 48 | } 49 | 50 | // properties 51 | 52 | /// 53 | /// Size: in bytes 54 | /// 55 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 56 | [ImplementPropertyType("umbracoBytes")] 57 | public virtual long UmbracoBytes => this.Value(_publishedValueFallback, "umbracoBytes"); 58 | 59 | /// 60 | /// Type 61 | /// 62 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 63 | [global::System.Diagnostics.CodeAnalysis.MaybeNull] 64 | [ImplementPropertyType("umbracoExtension")] 65 | public virtual string UmbracoExtension => this.Value(_publishedValueFallback, "umbracoExtension"); 66 | 67 | /// 68 | /// Article 69 | /// 70 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 71 | [global::System.Diagnostics.CodeAnalysis.MaybeNull] 72 | [ImplementPropertyType("umbracoFile")] 73 | public virtual string UmbracoFile => this.Value(_publishedValueFallback, "umbracoFile"); 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /BlazorExample.Site/umbraco/models/UmbracoMediaVectorGraphics.generated.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // 5 | // Umbraco.ModelsBuilder.Embedded v9.4.3+192eb2699ba4131addbb08236f60eb031707f751 6 | // 7 | // Changes to this file will be lost if the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | using System; 12 | using System.Linq.Expressions; 13 | using Umbraco.Cms.Core.Models.PublishedContent; 14 | using Umbraco.Cms.Core.PublishedCache; 15 | using Umbraco.Cms.Infrastructure.ModelsBuilder; 16 | using Umbraco.Cms.Core; 17 | using Umbraco.Extensions; 18 | 19 | namespace Umbraco.Cms.Web.Common.PublishedModels 20 | { 21 | /// Vector Graphics (SVG) 22 | [PublishedModel("umbracoMediaVectorGraphics")] 23 | public partial class UmbracoMediaVectorGraphics : PublishedContentModel 24 | { 25 | // helpers 26 | #pragma warning disable 0109 // new is redundant 27 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 28 | public new const string ModelTypeAlias = "umbracoMediaVectorGraphics"; 29 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 30 | public new const PublishedItemType ModelItemType = PublishedItemType.Media; 31 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 32 | [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] 33 | public new static IPublishedContentType GetModelContentType(IPublishedSnapshotAccessor publishedSnapshotAccessor) 34 | => PublishedModelUtility.GetModelContentType(publishedSnapshotAccessor, ModelItemType, ModelTypeAlias); 35 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 36 | [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] 37 | public static IPublishedPropertyType GetModelPropertyType(IPublishedSnapshotAccessor publishedSnapshotAccessor, Expression> selector) 38 | => PublishedModelUtility.GetModelPropertyType(GetModelContentType(publishedSnapshotAccessor), selector); 39 | #pragma warning restore 0109 40 | 41 | private IPublishedValueFallback _publishedValueFallback; 42 | 43 | // ctor 44 | public UmbracoMediaVectorGraphics(IPublishedContent content, IPublishedValueFallback publishedValueFallback) 45 | : base(content, publishedValueFallback) 46 | { 47 | _publishedValueFallback = publishedValueFallback; 48 | } 49 | 50 | // properties 51 | 52 | /// 53 | /// Size: in bytes 54 | /// 55 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 56 | [ImplementPropertyType("umbracoBytes")] 57 | public virtual long UmbracoBytes => this.Value(_publishedValueFallback, "umbracoBytes"); 58 | 59 | /// 60 | /// Type 61 | /// 62 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 63 | [global::System.Diagnostics.CodeAnalysis.MaybeNull] 64 | [ImplementPropertyType("umbracoExtension")] 65 | public virtual string UmbracoExtension => this.Value(_publishedValueFallback, "umbracoExtension"); 66 | 67 | /// 68 | /// Vector Graphics 69 | /// 70 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 71 | [global::System.Diagnostics.CodeAnalysis.MaybeNull] 72 | [ImplementPropertyType("umbracoFile")] 73 | public virtual string UmbracoFile => this.Value(_publishedValueFallback, "umbracoFile"); 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /BlazorExample.Site/umbraco/models/Website.generated.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // 5 | // Umbraco.ModelsBuilder.Embedded v9.4.3+192eb2699ba4131addbb08236f60eb031707f751 6 | // 7 | // Changes to this file will be lost if the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | using System; 12 | using System.Linq.Expressions; 13 | using Umbraco.Cms.Core.Models.PublishedContent; 14 | using Umbraco.Cms.Core.PublishedCache; 15 | using Umbraco.Cms.Infrastructure.ModelsBuilder; 16 | using Umbraco.Cms.Core; 17 | using Umbraco.Extensions; 18 | 19 | namespace Umbraco.Cms.Web.Common.PublishedModels 20 | { 21 | /// Website 22 | [PublishedModel("website")] 23 | public partial class Website : PublishedContentModel 24 | { 25 | // helpers 26 | #pragma warning disable 0109 // new is redundant 27 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 28 | public new const string ModelTypeAlias = "website"; 29 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 30 | public new const PublishedItemType ModelItemType = PublishedItemType.Content; 31 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 32 | [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] 33 | public new static IPublishedContentType GetModelContentType(IPublishedSnapshotAccessor publishedSnapshotAccessor) 34 | => PublishedModelUtility.GetModelContentType(publishedSnapshotAccessor, ModelItemType, ModelTypeAlias); 35 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 36 | [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] 37 | public static IPublishedPropertyType GetModelPropertyType(IPublishedSnapshotAccessor publishedSnapshotAccessor, Expression> selector) 38 | => PublishedModelUtility.GetModelPropertyType(GetModelContentType(publishedSnapshotAccessor), selector); 39 | #pragma warning restore 0109 40 | 41 | private IPublishedValueFallback _publishedValueFallback; 42 | 43 | // ctor 44 | public Website(IPublishedContent content, IPublishedValueFallback publishedValueFallback) 45 | : base(content, publishedValueFallback) 46 | { 47 | _publishedValueFallback = publishedValueFallback; 48 | } 49 | 50 | // properties 51 | 52 | /// 53 | /// Suggestions 54 | /// 55 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 56 | [global::System.Diagnostics.CodeAnalysis.MaybeNull] 57 | [ImplementPropertyType("suggestions")] 58 | public virtual object Suggestions => this.Value(_publishedValueFallback, "suggestions"); 59 | 60 | /// 61 | /// Website Name 62 | /// 63 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 64 | [global::System.Diagnostics.CodeAnalysis.MaybeNull] 65 | [ImplementPropertyType("websiteName")] 66 | public virtual string WebsiteName => this.Value(_publishedValueFallback, "websiteName"); 67 | 68 | /// 69 | /// Website Text 70 | /// 71 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 72 | [global::System.Diagnostics.CodeAnalysis.MaybeNull] 73 | [ImplementPropertyType("websiteText")] 74 | public virtual global::Umbraco.Cms.Core.Strings.IHtmlEncodedString WebsiteText => this.Value(_publishedValueFallback, "websiteText"); 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /BlazorExample.Site/Views/Partials/grid/bootstrap3.cshtml: -------------------------------------------------------------------------------- 1 | @using System.Web 2 | @using Microsoft.AspNetCore.Html 3 | @using Newtonsoft.Json.Linq 4 | @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage 5 | 6 | @if (Model != null && Model.GetType() == typeof(JObject) && Model.sections != null) 7 | { 8 | var oneColumn = ((System.Collections.ICollection)Model.sections).Count == 1; 9 | 10 |
11 | @if (oneColumn) 12 | { 13 | foreach (var section in Model.sections) 14 | { 15 |
16 | @foreach (var row in section.rows) 17 | { 18 | renderRow(row, true); 19 | } 20 |
21 | } 22 | } 23 | else 24 | { 25 |
26 |
27 | @foreach (var sec in Model.sections) 28 | { 29 |
30 |
31 | @foreach (var row in sec.rows) 32 | { 33 | renderRow(row, false); 34 | } 35 |
36 |
37 | } 38 |
39 |
40 | } 41 |
42 | } 43 | 44 | @functions{ 45 | 46 | private async Task renderRow(dynamic row, bool singleColumn) 47 | { 48 |
49 | @if (singleColumn) 50 | { 51 | @:
52 | } 53 |
54 | @foreach (var area in row.areas) 55 | { 56 |
57 |
58 | @foreach (var control in area.controls) 59 | { 60 | if (control != null && control.editor != null && control.editor.view != null) 61 | { 62 | @await Html.PartialAsync("grid/editors/base", (object)control) 63 | } 64 | } 65 |
66 |
67 | } 68 |
69 | @if (singleColumn) 70 | { 71 | @:
72 | } 73 |
74 | } 75 | 76 | } 77 | 78 | @functions{ 79 | 80 | public static HtmlString RenderElementAttributes(dynamic contentItem) 81 | { 82 | var attrs = new List(); 83 | JObject cfg = contentItem.config; 84 | 85 | if (cfg != null) 86 | { 87 | foreach (JProperty property in cfg.Properties()) 88 | { 89 | var propertyValue = HttpUtility.HtmlAttributeEncode(property.Value.ToString()); 90 | attrs.Add(property.Name + "=\"" + propertyValue + "\""); 91 | } 92 | } 93 | 94 | JObject style = contentItem.styles; 95 | 96 | if (style != null) 97 | { 98 | var cssVals = new List(); 99 | foreach (JProperty property in style.Properties()) 100 | { 101 | var propertyValue = property.Value.ToString(); 102 | if (string.IsNullOrWhiteSpace(propertyValue) == false) 103 | { 104 | cssVals.Add(property.Name + ":" + propertyValue + ";"); 105 | } 106 | } 107 | 108 | if (cssVals.Any()) 109 | attrs.Add("style=\"" + HttpUtility.HtmlAttributeEncode(string.Join(" ", cssVals)) + "\""); 110 | } 111 | 112 | return new HtmlString(string.Join(" ", attrs)); 113 | } 114 | 115 | } -------------------------------------------------------------------------------- /BlazorExample.Site/App_Plugins/CustomPlugins/styles.min.css: -------------------------------------------------------------------------------- 1 | *,:after,:before{--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.tw-relative{position:relative}.tw-mx-auto{margin-left:auto;margin-right:auto}.tw-mt-3{margin-top:.75rem}.tw-flex{display:flex}.tw-inline-flex{display:inline-flex}.tw-h-10{height:2.5rem}.tw-w-full{width:100%}.tw-w-10{width:2.5rem}.tw-max-w-md{max-width:28rem}@-webkit-keyframes tw-spin{to{transform:rotate(1turn)}}@keyframes tw-spin{to{transform:rotate(1turn)}}.tw-animate-spin{-webkit-animation:tw-spin 1s linear infinite;animation:tw-spin 1s linear infinite}.tw-flex-col{flex-direction:column}.tw-items-center{align-items:center}.tw-justify-center{justify-content:center}.tw-justify-between{justify-content:space-between}.tw-space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.tw-overflow-hidden{overflow:hidden}.tw-rounded{border-radius:.25rem}.tw-rounded-md{border-radius:.375rem}.tw-border{border-width:1px}.tw-border-transparent{border-color:#0000}.tw-bg-indigo-600{--tw-bg-opacity:1;background-color:rgb(79 70 229/var(--tw-bg-opacity))}.tw-bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.tw-bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.tw-p-2{padding:.5rem}.tw-px-4{padding-left:1rem;padding-right:1rem}.tw-py-2{padding-top:.5rem;padding-bottom:.5rem}.tw-py-6{padding-top:1.5rem;padding-bottom:1.5rem}.tw-px-6{padding-left:1.5rem;padding-right:1.5rem}.tw-pt-10{padding-top:2.5rem}.tw-pb-8{padding-bottom:2rem}.tw-font-medium{font-weight:500}.tw-font-semibold{font-weight:600}.tw-text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.tw-text-indigo-400{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity))}.tw-opacity-25{opacity:.25}.tw-opacity-75{opacity:.75}.tw-shadow-sm{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.tw-shadow,.tw-shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.tw-shadow{--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.tw-shadow-xl{--tw-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.tw-ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.tw-ring-gray-900\/5{--tw-ring-color:#1118270d}.hover\:tw-bg-indigo-700:hover{--tw-bg-opacity:1;background-color:rgb(67 56 202/var(--tw-bg-opacity))}.focus\:tw-outline-none:focus{outline:2px solid #0000;outline-offset:2px}.focus\:tw-ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:tw-ring-indigo-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(99 102 241/var(--tw-ring-opacity))}.focus\:tw-ring-offset-2:focus{--tw-ring-offset-width:2px}@media (min-width:640px){.sm\:tw-mx-auto{margin-left:auto;margin-right:auto}.sm\:tw-max-w-2xl{max-width:42rem}.sm\:tw-rounded-lg{border-radius:.5rem}.sm\:tw-py-12{padding-top:3rem;padding-bottom:3rem}.sm\:tw-px-10{padding-left:2.5rem;padding-right:2.5rem}} -------------------------------------------------------------------------------- /BlazorExample.Site/BlazorExample.Site.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net7.0 5 | $(DefaultItemExcludes);App_Plugins/**; 6 | $(DefaultItemExcludes);umbraco/**; 7 | $(DefaultItemExcludes);wwwroot/media/**; 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | true 72 | 73 | 74 | 75 | 76 | true 77 | true 78 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /BlazorExample.Site/umbraco/models/Image.generated.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // 5 | // Umbraco.ModelsBuilder.Embedded v9.4.3+192eb2699ba4131addbb08236f60eb031707f751 6 | // 7 | // Changes to this file will be lost if the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | using System; 12 | using System.Linq.Expressions; 13 | using Umbraco.Cms.Core.Models.PublishedContent; 14 | using Umbraco.Cms.Core.PublishedCache; 15 | using Umbraco.Cms.Infrastructure.ModelsBuilder; 16 | using Umbraco.Cms.Core; 17 | using Umbraco.Extensions; 18 | 19 | namespace Umbraco.Cms.Web.Common.PublishedModels 20 | { 21 | /// Image 22 | [PublishedModel("Image")] 23 | public partial class Image : PublishedContentModel 24 | { 25 | // helpers 26 | #pragma warning disable 0109 // new is redundant 27 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 28 | public new const string ModelTypeAlias = "Image"; 29 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 30 | public new const PublishedItemType ModelItemType = PublishedItemType.Media; 31 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 32 | [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] 33 | public new static IPublishedContentType GetModelContentType(IPublishedSnapshotAccessor publishedSnapshotAccessor) 34 | => PublishedModelUtility.GetModelContentType(publishedSnapshotAccessor, ModelItemType, ModelTypeAlias); 35 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 36 | [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] 37 | public static IPublishedPropertyType GetModelPropertyType(IPublishedSnapshotAccessor publishedSnapshotAccessor, Expression> selector) 38 | => PublishedModelUtility.GetModelPropertyType(GetModelContentType(publishedSnapshotAccessor), selector); 39 | #pragma warning restore 0109 40 | 41 | private IPublishedValueFallback _publishedValueFallback; 42 | 43 | // ctor 44 | public Image(IPublishedContent content, IPublishedValueFallback publishedValueFallback) 45 | : base(content, publishedValueFallback) 46 | { 47 | _publishedValueFallback = publishedValueFallback; 48 | } 49 | 50 | // properties 51 | 52 | /// 53 | /// Size: in bytes 54 | /// 55 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 56 | [ImplementPropertyType("umbracoBytes")] 57 | public virtual long UmbracoBytes => this.Value(_publishedValueFallback, "umbracoBytes"); 58 | 59 | /// 60 | /// Type 61 | /// 62 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 63 | [global::System.Diagnostics.CodeAnalysis.MaybeNull] 64 | [ImplementPropertyType("umbracoExtension")] 65 | public virtual string UmbracoExtension => this.Value(_publishedValueFallback, "umbracoExtension"); 66 | 67 | /// 68 | /// Image 69 | /// 70 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 71 | [global::System.Diagnostics.CodeAnalysis.MaybeNull] 72 | [ImplementPropertyType("umbracoFile")] 73 | public virtual global::Umbraco.Cms.Core.PropertyEditors.ValueConverters.ImageCropperValue UmbracoFile => this.Value(_publishedValueFallback, "umbracoFile"); 74 | 75 | /// 76 | /// Height: in pixels 77 | /// 78 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 79 | [ImplementPropertyType("umbracoHeight")] 80 | public virtual int UmbracoHeight => this.Value(_publishedValueFallback, "umbracoHeight"); 81 | 82 | /// 83 | /// Width: in pixels 84 | /// 85 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 86 | [ImplementPropertyType("umbracoWidth")] 87 | public virtual int UmbracoWidth => this.Value(_publishedValueFallback, "umbracoWidth"); 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /BlazorExample.Site/umbraco/models/Member.generated.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // 5 | // Umbraco.ModelsBuilder.Embedded v9.4.3+192eb2699ba4131addbb08236f60eb031707f751 6 | // 7 | // Changes to this file will be lost if the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | using System; 12 | using System.Linq.Expressions; 13 | using Umbraco.Cms.Core.Models.PublishedContent; 14 | using Umbraco.Cms.Core.PublishedCache; 15 | using Umbraco.Cms.Infrastructure.ModelsBuilder; 16 | using Umbraco.Cms.Core; 17 | using Umbraco.Extensions; 18 | 19 | namespace Umbraco.Cms.Web.Common.PublishedModels 20 | { 21 | /// Member 22 | [PublishedModel("Member")] 23 | public partial class Member : PublishedContentModel 24 | { 25 | // helpers 26 | #pragma warning disable 0109 // new is redundant 27 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 28 | public new const string ModelTypeAlias = "Member"; 29 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 30 | public new const PublishedItemType ModelItemType = PublishedItemType.Member; 31 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 32 | [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] 33 | public new static IPublishedContentType GetModelContentType(IPublishedSnapshotAccessor publishedSnapshotAccessor) 34 | => PublishedModelUtility.GetModelContentType(publishedSnapshotAccessor, ModelItemType, ModelTypeAlias); 35 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 36 | [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] 37 | public static IPublishedPropertyType GetModelPropertyType(IPublishedSnapshotAccessor publishedSnapshotAccessor, Expression> selector) 38 | => PublishedModelUtility.GetModelPropertyType(GetModelContentType(publishedSnapshotAccessor), selector); 39 | #pragma warning restore 0109 40 | 41 | private IPublishedValueFallback _publishedValueFallback; 42 | 43 | // ctor 44 | public Member(IPublishedContent content, IPublishedValueFallback publishedValueFallback) 45 | : base(content, publishedValueFallback) 46 | { 47 | _publishedValueFallback = publishedValueFallback; 48 | } 49 | 50 | // properties 51 | 52 | /// 53 | /// Is Approved 54 | /// 55 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 56 | [ImplementPropertyType("umbracoMemberApproved")] 57 | public virtual bool UmbracoMemberApproved => this.Value(_publishedValueFallback, "umbracoMemberApproved"); 58 | 59 | /// 60 | /// Comments 61 | /// 62 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 63 | [global::System.Diagnostics.CodeAnalysis.MaybeNull] 64 | [ImplementPropertyType("umbracoMemberComments")] 65 | public virtual string UmbracoMemberComments => this.Value(_publishedValueFallback, "umbracoMemberComments"); 66 | 67 | /// 68 | /// Failed Password Attempts 69 | /// 70 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 71 | [ImplementPropertyType("umbracoMemberFailedPasswordAttempts")] 72 | public virtual int UmbracoMemberFailedPasswordAttempts => this.Value(_publishedValueFallback, "umbracoMemberFailedPasswordAttempts"); 73 | 74 | /// 75 | /// Last Lockout Date 76 | /// 77 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 78 | [ImplementPropertyType("umbracoMemberLastLockoutDate")] 79 | public virtual global::System.DateTime UmbracoMemberLastLockoutDate => this.Value(_publishedValueFallback, "umbracoMemberLastLockoutDate"); 80 | 81 | /// 82 | /// Last Login Date 83 | /// 84 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 85 | [ImplementPropertyType("umbracoMemberLastLogin")] 86 | public virtual global::System.DateTime UmbracoMemberLastLogin => this.Value(_publishedValueFallback, "umbracoMemberLastLogin"); 87 | 88 | /// 89 | /// Last Password Change Date 90 | /// 91 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 92 | [ImplementPropertyType("umbracoMemberLastPasswordChangeDate")] 93 | public virtual global::System.DateTime UmbracoMemberLastPasswordChangeDate => this.Value(_publishedValueFallback, "umbracoMemberLastPasswordChangeDate"); 94 | 95 | /// 96 | /// Is Locked Out 97 | /// 98 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Umbraco.ModelsBuilder.Embedded", "9.4.3+192eb2699ba4131addbb08236f60eb031707f751")] 99 | [ImplementPropertyType("umbracoMemberLockedOut")] 100 | public virtual bool UmbracoMemberLockedOut => this.Value(_publishedValueFallback, "umbracoMemberLockedOut"); 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /BlazorExample.Site/.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | ## 4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 5 | 6 | # User-specific files 7 | *.rsuser 8 | *.suo 9 | *.user 10 | *.userosscache 11 | *.sln.docstates 12 | 13 | # User-specific files (MonoDevelop/Xamarin Studio) 14 | *.userprefs 15 | 16 | # Mono auto generated files 17 | mono_crash.* 18 | 19 | # Build results 20 | [Dd]ebug/ 21 | [Dd]ebugPublic/ 22 | [Rr]elease/ 23 | [Rr]eleases/ 24 | x64/ 25 | x86/ 26 | [Ww][Ii][Nn]32/ 27 | [Aa][Rr][Mm]/ 28 | [Aa][Rr][Mm]64/ 29 | bld/ 30 | [Bb]in/ 31 | [Oo]bj/ 32 | [Ll]og/ 33 | [Ll]ogs/ 34 | 35 | # Visual Studio 2015/2017 cache/options directory 36 | .vs/ 37 | # Uncomment if you have tasks that create the project's static files in wwwroot 38 | #wwwroot/ 39 | 40 | # Visual Studio 2017 auto generated files 41 | Generated\ Files/ 42 | 43 | # MSTest test Results 44 | [Tt]est[Rr]esult*/ 45 | [Bb]uild[Ll]og.* 46 | 47 | # NUnit 48 | *.VisualState.xml 49 | TestResult.xml 50 | nunit-*.xml 51 | 52 | # Build Results of an ATL Project 53 | [Dd]ebugPS/ 54 | [Rr]eleasePS/ 55 | dlldata.c 56 | 57 | # Benchmark Results 58 | BenchmarkDotNet.Artifacts/ 59 | 60 | # .NET Core 61 | project.lock.json 62 | project.fragment.lock.json 63 | artifacts/ 64 | 65 | # Tye 66 | .tye/ 67 | 68 | # ASP.NET Scaffolding 69 | ScaffoldingReadMe.txt 70 | 71 | # StyleCop 72 | StyleCopReport.xml 73 | 74 | # Files built by Visual Studio 75 | *_i.c 76 | *_p.c 77 | *_h.h 78 | *.ilk 79 | *.meta 80 | *.obj 81 | *.iobj 82 | *.pch 83 | *.pdb 84 | *.ipdb 85 | *.pgc 86 | *.pgd 87 | *.rsp 88 | *.sbr 89 | *.tlb 90 | *.tli 91 | *.tlh 92 | *.tmp 93 | *.tmp_proj 94 | *_wpftmp.csproj 95 | *.log 96 | *.vspscc 97 | *.vssscc 98 | .builds 99 | *.pidb 100 | *.svclog 101 | *.scc 102 | 103 | # Chutzpah Test files 104 | _Chutzpah* 105 | 106 | # Visual C++ cache files 107 | ipch/ 108 | *.aps 109 | *.ncb 110 | *.opendb 111 | *.opensdf 112 | *.sdf 113 | *.cachefile 114 | *.VC.db 115 | *.VC.VC.opendb 116 | 117 | # Visual Studio profiler 118 | *.psess 119 | *.vsp 120 | *.vspx 121 | *.sap 122 | 123 | # Visual Studio Trace Files 124 | *.e2e 125 | 126 | # TFS 2012 Local Workspace 127 | $tf/ 128 | 129 | # Guidance Automation Toolkit 130 | *.gpState 131 | 132 | # ReSharper is a .NET coding add-in 133 | _ReSharper*/ 134 | *.[Rr]e[Ss]harper 135 | *.DotSettings.user 136 | 137 | # TeamCity is a build add-in 138 | _TeamCity* 139 | 140 | # DotCover is a Code Coverage Tool 141 | *.dotCover 142 | 143 | # AxoCover is a Code Coverage Tool 144 | .axoCover/* 145 | !.axoCover/settings.json 146 | 147 | # Coverlet is a free, cross platform Code Coverage Tool 148 | coverage*.json 149 | coverage*.xml 150 | coverage*.info 151 | 152 | # Visual Studio code coverage results 153 | *.coverage 154 | *.coveragexml 155 | 156 | # NCrunch 157 | _NCrunch_* 158 | .*crunch*.local.xml 159 | nCrunchTemp_* 160 | 161 | # MightyMoose 162 | *.mm.* 163 | AutoTest.Net/ 164 | 165 | # Web workbench (sass) 166 | .sass-cache/ 167 | 168 | # Installshield output folder 169 | [Ee]xpress/ 170 | 171 | # DocProject is a documentation generator add-in 172 | DocProject/buildhelp/ 173 | DocProject/Help/*.HxT 174 | DocProject/Help/*.HxC 175 | DocProject/Help/*.hhc 176 | DocProject/Help/*.hhk 177 | DocProject/Help/*.hhp 178 | DocProject/Help/Html2 179 | DocProject/Help/html 180 | 181 | # Click-Once directory 182 | publish/ 183 | 184 | # Publish Web Output 185 | *.[Pp]ublish.xml 186 | *.azurePubxml 187 | # Note: Comment the next line if you want to checkin your web deploy settings, 188 | # but database connection strings (with potential passwords) will be unencrypted 189 | *.pubxml 190 | *.publishproj 191 | 192 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 193 | # checkin your Azure Web App publish settings, but sensitive information contained 194 | # in these scripts will be unencrypted 195 | PublishScripts/ 196 | 197 | # NuGet Packages 198 | *.nupkg 199 | # NuGet Symbol Packages 200 | *.snupkg 201 | # The packages folder can be ignored because of Package Restore 202 | **/[Pp]ackages/* 203 | # except build/, which is used as an MSBuild target. 204 | !**/[Pp]ackages/build/ 205 | # Uncomment if necessary however generally it will be regenerated when needed 206 | #!**/[Pp]ackages/repositories.config 207 | # NuGet v3's project.json files produces more ignorable files 208 | *.nuget.props 209 | *.nuget.targets 210 | 211 | # Microsoft Azure Build Output 212 | csx/ 213 | *.build.csdef 214 | 215 | # Microsoft Azure Emulator 216 | ecf/ 217 | rcf/ 218 | 219 | # Windows Store app package directories and files 220 | AppPackages/ 221 | BundleArtifacts/ 222 | Package.StoreAssociation.xml 223 | _pkginfo.txt 224 | *.appx 225 | *.appxbundle 226 | *.appxupload 227 | 228 | # Visual Studio cache files 229 | # files ending in .cache can be ignored 230 | *.[Cc]ache 231 | # but keep track of directories ending in .cache 232 | !?*.[Cc]ache/ 233 | 234 | # Others 235 | ClientBin/ 236 | ~$* 237 | *~ 238 | *.dbmdl 239 | *.dbproj.schemaview 240 | *.jfm 241 | *.pfx 242 | *.publishsettings 243 | orleans.codegen.cs 244 | 245 | # Including strong name files can present a security risk 246 | # (https://github.com/github/gitignore/pull/2483#issue-259490424) 247 | #*.snk 248 | 249 | # Since there are multiple workflows, uncomment next line to ignore bower_components 250 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 251 | #bower_components/ 252 | 253 | # RIA/Silverlight projects 254 | Generated_Code/ 255 | 256 | # Backup & report files from converting an old project file 257 | # to a newer Visual Studio version. Backup files are not needed, 258 | # because we have git ;-) 259 | _UpgradeReport_Files/ 260 | Backup*/ 261 | UpgradeLog*.XML 262 | UpgradeLog*.htm 263 | ServiceFabricBackup/ 264 | *.rptproj.bak 265 | 266 | # SQL Server files 267 | *.mdf 268 | *.ldf 269 | *.ndf 270 | 271 | # Business Intelligence projects 272 | *.rdl.data 273 | *.bim.layout 274 | *.bim_*.settings 275 | *.rptproj.rsuser 276 | *- [Bb]ackup.rdl 277 | *- [Bb]ackup ([0-9]).rdl 278 | *- [Bb]ackup ([0-9][0-9]).rdl 279 | 280 | # Microsoft Fakes 281 | FakesAssemblies/ 282 | 283 | # GhostDoc plugin setting file 284 | *.GhostDoc.xml 285 | 286 | # Node.js Tools for Visual Studio 287 | .ntvs_analysis.dat 288 | node_modules/ 289 | 290 | # Visual Studio 6 build log 291 | *.plg 292 | 293 | # Visual Studio 6 workspace options file 294 | *.opt 295 | 296 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 297 | *.vbw 298 | 299 | # Visual Studio LightSwitch build output 300 | **/*.HTMLClient/GeneratedArtifacts 301 | **/*.DesktopClient/GeneratedArtifacts 302 | **/*.DesktopClient/ModelManifest.xml 303 | **/*.Server/GeneratedArtifacts 304 | **/*.Server/ModelManifest.xml 305 | _Pvt_Extensions 306 | 307 | # Paket dependency manager 308 | .paket/paket.exe 309 | paket-files/ 310 | 311 | # FAKE - F# Make 312 | .fake/ 313 | 314 | # CodeRush personal settings 315 | .cr/personal 316 | 317 | # Python Tools for Visual Studio (PTVS) 318 | __pycache__/ 319 | *.pyc 320 | 321 | # Cake - Uncomment if you are using it 322 | # tools/** 323 | # !tools/packages.config 324 | 325 | # Tabs Studio 326 | *.tss 327 | 328 | # Telerik's JustMock configuration file 329 | *.jmconfig 330 | 331 | # BizTalk build output 332 | *.btp.cs 333 | *.btm.cs 334 | *.odx.cs 335 | *.xsd.cs 336 | 337 | # OpenCover UI analysis results 338 | OpenCover/ 339 | 340 | # Azure Stream Analytics local run output 341 | ASALocalRun/ 342 | 343 | # MSBuild Binary and Structured Log 344 | *.binlog 345 | 346 | # NVidia Nsight GPU debugger configuration file 347 | *.nvuser 348 | 349 | # MFractors (Xamarin productivity tool) working folder 350 | .mfractor/ 351 | 352 | # Local History for Visual Studio 353 | .localhistory/ 354 | 355 | # BeatPulse healthcheck temp database 356 | healthchecksdb 357 | 358 | # Backup folder for Package Reference Convert tool in Visual Studio 2017 359 | MigrationBackup/ 360 | 361 | # Ionide (cross platform F# VS Code tools) working folder 362 | .ionide/ 363 | 364 | # Fody - auto-generated XML schema 365 | FodyWeavers.xsd 366 | 367 | ## 368 | ## Visual studio for Mac 369 | ## 370 | 371 | 372 | # globs 373 | Makefile.in 374 | *.userprefs 375 | *.usertasks 376 | config.make 377 | config.status 378 | aclocal.m4 379 | install-sh 380 | autom4te.cache/ 381 | *.tar.gz 382 | tarballs/ 383 | test-results/ 384 | 385 | # Mac bundle stuff 386 | *.dmg 387 | *.app 388 | 389 | # content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore 390 | # General 391 | .DS_Store 392 | .AppleDouble 393 | .LSOverride 394 | 395 | # Icon must end with two \r 396 | Icon 397 | 398 | 399 | # Thumbnails 400 | ._* 401 | 402 | # Files that might appear in the root of a volume 403 | .DocumentRevisions-V100 404 | .fseventsd 405 | .Spotlight-V100 406 | .TemporaryItems 407 | .Trashes 408 | .VolumeIcon.icns 409 | .com.apple.timemachine.donotpresent 410 | 411 | # Directories potentially created on remote AFP share 412 | .AppleDB 413 | .AppleDesktop 414 | Network Trash Folder 415 | Temporary Items 416 | .apdisk 417 | 418 | # content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore 419 | # Windows thumbnail cache files 420 | Thumbs.db 421 | ehthumbs.db 422 | ehthumbs_vista.db 423 | 424 | # Dump file 425 | *.stackdump 426 | 427 | # Folder config file 428 | [Dd]esktop.ini 429 | 430 | # Recycle Bin used on file shares 431 | $RECYCLE.BIN/ 432 | 433 | # Windows Installer files 434 | *.cab 435 | *.msi 436 | *.msix 437 | *.msm 438 | *.msp 439 | 440 | # Windows shortcuts 441 | *.lnk 442 | 443 | # JetBrains Rider 444 | .idea/ 445 | *.sln.iml 446 | 447 | ## 448 | ## Visual Studio Code 449 | ## 450 | .vscode/* 451 | !.vscode/settings.json 452 | !.vscode/tasks.json 453 | !.vscode/launch.json 454 | !.vscode/extensions.json 455 | 456 | 457 | ## 458 | ## Umbraco CMS .NETCore 459 | ## 460 | 461 | # Dont commit Umbraco TEMP folder containing Examine Indexes, NuCache etc 462 | **/umbraco/Data/TEMP/ 463 | 464 | # Dont commit files that are generated and cached from the default ImageSharp location 465 | **/umbraco/mediacache/ 466 | 467 | # Umbraco backoffice language files 468 | # Nuget package Umbraco.Cms.StaticAssets will copy them in during dotnet build 469 | # Customize langguage files in /config/lang/{language}.user.xml 470 | **/umbraco/config/lang/ 471 | 472 | # JSON Schema file for appsettings 473 | # This is auto generated from the build 474 | **/umbraco/config/appsettings-schema.json 475 | 476 | # This is the no-nodes, installer & upgrader pages from Umbraco 477 | # Nuget package Umbraco.Cms.StaticAssets will copy them in during dotnet build 478 | **/umbraco/UmbracoWebsite/ 479 | **/umbraco/UmbracoInstall/ 480 | **/umbraco/UmbracoBackOffice/ 481 | 482 | # Comment out the line below if you wish to change or add any new templates to PartialView Macros 483 | **/umbraco/PartialViewMacros/ 484 | 485 | # Umbraco Static Assets of Backoffice 486 | # Nuget package Umbraco.Cms.StaticAssets will copy them in during dotnet build 487 | **/wwwroot/umbraco/ 488 | /appsettings.Development.json 489 | -------------------------------------------------------------------------------- /BlazorExample.Site/wwwroot/css/styles.css: -------------------------------------------------------------------------------- 1 | /* 2 | ! tailwindcss v3.0.22 | MIT License | https://tailwindcss.com 3 | */ 4 | 5 | /* 6 | 1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) 7 | 2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) 8 | */ 9 | 10 | *, 11 | ::before, 12 | ::after { 13 | box-sizing: border-box; 14 | /* 1 */ 15 | border-width: 0; 16 | /* 2 */ 17 | border-style: solid; 18 | /* 2 */ 19 | border-color: #e5e7eb; 20 | /* 2 */ 21 | } 22 | 23 | ::before, 24 | ::after { 25 | --tw-content: ''; 26 | } 27 | 28 | /* 29 | 1. Use a consistent sensible line-height in all browsers. 30 | 2. Prevent adjustments of font size after orientation changes in iOS. 31 | 3. Use a more readable tab size. 32 | 4. Use the user's configured `sans` font-family by default. 33 | */ 34 | 35 | html { 36 | line-height: 1.5; 37 | /* 1 */ 38 | -webkit-text-size-adjust: 100%; 39 | /* 2 */ 40 | -moz-tab-size: 4; 41 | /* 3 */ 42 | -o-tab-size: 4; 43 | tab-size: 4; 44 | /* 3 */ 45 | font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; 46 | /* 4 */ 47 | } 48 | 49 | /* 50 | 1. Remove the margin in all browsers. 51 | 2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. 52 | */ 53 | 54 | body { 55 | margin: 0; 56 | /* 1 */ 57 | line-height: inherit; 58 | /* 2 */ 59 | } 60 | 61 | /* 62 | 1. Add the correct height in Firefox. 63 | 2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) 64 | 3. Ensure horizontal rules are visible by default. 65 | */ 66 | 67 | hr { 68 | height: 0; 69 | /* 1 */ 70 | color: inherit; 71 | /* 2 */ 72 | border-top-width: 1px; 73 | /* 3 */ 74 | } 75 | 76 | /* 77 | Add the correct text decoration in Chrome, Edge, and Safari. 78 | */ 79 | 80 | abbr:where([title]) { 81 | -webkit-text-decoration: underline dotted; 82 | text-decoration: underline dotted; 83 | } 84 | 85 | /* 86 | Remove the default font size and weight for headings. 87 | */ 88 | 89 | h1, 90 | h2, 91 | h3, 92 | h4, 93 | h5, 94 | h6 { 95 | font-size: inherit; 96 | font-weight: inherit; 97 | } 98 | 99 | /* 100 | Reset links to optimize for opt-in styling instead of opt-out. 101 | */ 102 | 103 | a { 104 | color: inherit; 105 | text-decoration: inherit; 106 | } 107 | 108 | /* 109 | Add the correct font weight in Edge and Safari. 110 | */ 111 | 112 | b, 113 | strong { 114 | font-weight: bolder; 115 | } 116 | 117 | /* 118 | 1. Use the user's configured `mono` font family by default. 119 | 2. Correct the odd `em` font sizing in all browsers. 120 | */ 121 | 122 | code, 123 | kbd, 124 | samp, 125 | pre { 126 | font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; 127 | /* 1 */ 128 | font-size: 1em; 129 | /* 2 */ 130 | } 131 | 132 | /* 133 | Add the correct font size in all browsers. 134 | */ 135 | 136 | small { 137 | font-size: 80%; 138 | } 139 | 140 | /* 141 | Prevent `sub` and `sup` elements from affecting the line height in all browsers. 142 | */ 143 | 144 | sub, 145 | sup { 146 | font-size: 75%; 147 | line-height: 0; 148 | position: relative; 149 | vertical-align: baseline; 150 | } 151 | 152 | sub { 153 | bottom: -0.25em; 154 | } 155 | 156 | sup { 157 | top: -0.5em; 158 | } 159 | 160 | /* 161 | 1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) 162 | 2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) 163 | 3. Remove gaps between table borders by default. 164 | */ 165 | 166 | table { 167 | text-indent: 0; 168 | /* 1 */ 169 | border-color: inherit; 170 | /* 2 */ 171 | border-collapse: collapse; 172 | /* 3 */ 173 | } 174 | 175 | /* 176 | 1. Change the font styles in all browsers. 177 | 2. Remove the margin in Firefox and Safari. 178 | 3. Remove default padding in all browsers. 179 | */ 180 | 181 | button, 182 | input, 183 | optgroup, 184 | select, 185 | textarea { 186 | font-family: inherit; 187 | /* 1 */ 188 | font-size: 100%; 189 | /* 1 */ 190 | line-height: inherit; 191 | /* 1 */ 192 | color: inherit; 193 | /* 1 */ 194 | margin: 0; 195 | /* 2 */ 196 | padding: 0; 197 | /* 3 */ 198 | } 199 | 200 | /* 201 | Remove the inheritance of text transform in Edge and Firefox. 202 | */ 203 | 204 | button, 205 | select { 206 | text-transform: none; 207 | } 208 | 209 | /* 210 | 1. Correct the inability to style clickable types in iOS and Safari. 211 | 2. Remove default button styles. 212 | */ 213 | 214 | button, 215 | [type='button'], 216 | [type='reset'], 217 | [type='submit'] { 218 | -webkit-appearance: button; 219 | /* 1 */ 220 | background-color: transparent; 221 | /* 2 */ 222 | background-image: none; 223 | /* 2 */ 224 | } 225 | 226 | /* 227 | Use the modern Firefox focus style for all focusable elements. 228 | */ 229 | 230 | :-moz-focusring { 231 | outline: auto; 232 | } 233 | 234 | /* 235 | Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) 236 | */ 237 | 238 | :-moz-ui-invalid { 239 | box-shadow: none; 240 | } 241 | 242 | /* 243 | Add the correct vertical alignment in Chrome and Firefox. 244 | */ 245 | 246 | progress { 247 | vertical-align: baseline; 248 | } 249 | 250 | /* 251 | Correct the cursor style of increment and decrement buttons in Safari. 252 | */ 253 | 254 | ::-webkit-inner-spin-button, 255 | ::-webkit-outer-spin-button { 256 | height: auto; 257 | } 258 | 259 | /* 260 | 1. Correct the odd appearance in Chrome and Safari. 261 | 2. Correct the outline style in Safari. 262 | */ 263 | 264 | [type='search'] { 265 | -webkit-appearance: textfield; 266 | /* 1 */ 267 | outline-offset: -2px; 268 | /* 2 */ 269 | } 270 | 271 | /* 272 | Remove the inner padding in Chrome and Safari on macOS. 273 | */ 274 | 275 | ::-webkit-search-decoration { 276 | -webkit-appearance: none; 277 | } 278 | 279 | /* 280 | 1. Correct the inability to style clickable types in iOS and Safari. 281 | 2. Change font properties to `inherit` in Safari. 282 | */ 283 | 284 | ::-webkit-file-upload-button { 285 | -webkit-appearance: button; 286 | /* 1 */ 287 | font: inherit; 288 | /* 2 */ 289 | } 290 | 291 | /* 292 | Add the correct display in Chrome and Safari. 293 | */ 294 | 295 | summary { 296 | display: list-item; 297 | } 298 | 299 | /* 300 | Removes the default spacing and border for appropriate elements. 301 | */ 302 | 303 | blockquote, 304 | dl, 305 | dd, 306 | h1, 307 | h2, 308 | h3, 309 | h4, 310 | h5, 311 | h6, 312 | hr, 313 | figure, 314 | p, 315 | pre { 316 | margin: 0; 317 | } 318 | 319 | fieldset { 320 | margin: 0; 321 | padding: 0; 322 | } 323 | 324 | legend { 325 | padding: 0; 326 | } 327 | 328 | ol, 329 | ul, 330 | menu { 331 | list-style: none; 332 | margin: 0; 333 | padding: 0; 334 | } 335 | 336 | /* 337 | Prevent resizing textareas horizontally by default. 338 | */ 339 | 340 | textarea { 341 | resize: vertical; 342 | } 343 | 344 | /* 345 | 1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) 346 | 2. Set the default placeholder color to the user's configured gray 400 color. 347 | */ 348 | 349 | input::-moz-placeholder, textarea::-moz-placeholder { 350 | opacity: 1; 351 | /* 1 */ 352 | color: #9ca3af; 353 | /* 2 */ 354 | } 355 | 356 | input:-ms-input-placeholder, textarea:-ms-input-placeholder { 357 | opacity: 1; 358 | /* 1 */ 359 | color: #9ca3af; 360 | /* 2 */ 361 | } 362 | 363 | input::placeholder, 364 | textarea::placeholder { 365 | opacity: 1; 366 | /* 1 */ 367 | color: #9ca3af; 368 | /* 2 */ 369 | } 370 | 371 | /* 372 | Set the default cursor for buttons. 373 | */ 374 | 375 | button, 376 | [role="button"] { 377 | cursor: pointer; 378 | } 379 | 380 | /* 381 | Make sure disabled buttons don't get the pointer cursor. 382 | */ 383 | 384 | :disabled { 385 | cursor: default; 386 | } 387 | 388 | /* 389 | 1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) 390 | 2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) 391 | This can trigger a poorly considered lint error in some tools but is included by design. 392 | */ 393 | 394 | img, 395 | svg, 396 | video, 397 | canvas, 398 | audio, 399 | iframe, 400 | embed, 401 | object { 402 | display: block; 403 | /* 1 */ 404 | vertical-align: middle; 405 | /* 2 */ 406 | } 407 | 408 | /* 409 | Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) 410 | */ 411 | 412 | img, 413 | video { 414 | max-width: 100%; 415 | height: auto; 416 | } 417 | 418 | /* 419 | Ensure the default browser behavior of the `hidden` attribute. 420 | */ 421 | 422 | [hidden] { 423 | display: none; 424 | } 425 | 426 | *, ::before, ::after { 427 | --tw-translate-x: 0; 428 | --tw-translate-y: 0; 429 | --tw-rotate: 0; 430 | --tw-skew-x: 0; 431 | --tw-skew-y: 0; 432 | --tw-scale-x: 1; 433 | --tw-scale-y: 1; 434 | --tw-pan-x: ; 435 | --tw-pan-y: ; 436 | --tw-pinch-zoom: ; 437 | --tw-scroll-snap-strictness: proximity; 438 | --tw-ordinal: ; 439 | --tw-slashed-zero: ; 440 | --tw-numeric-figure: ; 441 | --tw-numeric-spacing: ; 442 | --tw-numeric-fraction: ; 443 | --tw-ring-inset: ; 444 | --tw-ring-offset-width: 0px; 445 | --tw-ring-offset-color: #fff; 446 | --tw-ring-color: rgb(59 130 246 / 0.5); 447 | --tw-ring-offset-shadow: 0 0 #0000; 448 | --tw-ring-shadow: 0 0 #0000; 449 | --tw-shadow: 0 0 #0000; 450 | --tw-shadow-colored: 0 0 #0000; 451 | --tw-blur: ; 452 | --tw-brightness: ; 453 | --tw-contrast: ; 454 | --tw-grayscale: ; 455 | --tw-hue-rotate: ; 456 | --tw-invert: ; 457 | --tw-saturate: ; 458 | --tw-sepia: ; 459 | --tw-drop-shadow: ; 460 | --tw-backdrop-blur: ; 461 | --tw-backdrop-brightness: ; 462 | --tw-backdrop-contrast: ; 463 | --tw-backdrop-grayscale: ; 464 | --tw-backdrop-hue-rotate: ; 465 | --tw-backdrop-invert: ; 466 | --tw-backdrop-opacity: ; 467 | --tw-backdrop-saturate: ; 468 | --tw-backdrop-sepia: ; 469 | } 470 | 471 | .container { 472 | width: 100%; 473 | } 474 | 475 | @media (min-width: 640px) { 476 | .container { 477 | max-width: 640px; 478 | } 479 | } 480 | 481 | @media (min-width: 768px) { 482 | .container { 483 | max-width: 768px; 484 | } 485 | } 486 | 487 | @media (min-width: 1024px) { 488 | .container { 489 | max-width: 1024px; 490 | } 491 | } 492 | 493 | @media (min-width: 1280px) { 494 | .container { 495 | max-width: 1280px; 496 | } 497 | } 498 | 499 | @media (min-width: 1536px) { 500 | .container { 501 | max-width: 1536px; 502 | } 503 | } 504 | 505 | .static { 506 | position: static; 507 | } 508 | 509 | .relative { 510 | position: relative; 511 | } 512 | 513 | .mx-auto { 514 | margin-left: auto; 515 | margin-right: auto; 516 | } 517 | 518 | .ml-4 { 519 | margin-left: 1rem; 520 | } 521 | 522 | .block { 523 | display: block; 524 | } 525 | 526 | .flex { 527 | display: flex; 528 | } 529 | 530 | .grid { 531 | display: grid; 532 | } 533 | 534 | .h-6 { 535 | height: 1.5rem; 536 | } 537 | 538 | .min-h-screen { 539 | min-height: 100vh; 540 | } 541 | 542 | .w-6 { 543 | width: 1.5rem; 544 | } 545 | 546 | .max-w-md { 547 | max-width: 28rem; 548 | } 549 | 550 | .flex-none { 551 | flex: none; 552 | } 553 | 554 | .flex-col { 555 | flex-direction: column; 556 | } 557 | 558 | .items-center { 559 | align-items: center; 560 | } 561 | 562 | .justify-center { 563 | justify-content: center; 564 | } 565 | 566 | .space-y-6 > :not([hidden]) ~ :not([hidden]) { 567 | --tw-space-y-reverse: 0; 568 | margin-top: calc(1.5rem * calc(1 - var(--tw-space-y-reverse))); 569 | margin-bottom: calc(1.5rem * var(--tw-space-y-reverse)); 570 | } 571 | 572 | .space-y-4 > :not([hidden]) ~ :not([hidden]) { 573 | --tw-space-y-reverse: 0; 574 | margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse))); 575 | margin-bottom: calc(1rem * var(--tw-space-y-reverse)); 576 | } 577 | 578 | .space-y-3 > :not([hidden]) ~ :not([hidden]) { 579 | --tw-space-y-reverse: 0; 580 | margin-top: calc(0.75rem * calc(1 - var(--tw-space-y-reverse))); 581 | margin-bottom: calc(0.75rem * var(--tw-space-y-reverse)); 582 | } 583 | 584 | .divide-y > :not([hidden]) ~ :not([hidden]) { 585 | --tw-divide-y-reverse: 0; 586 | border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse))); 587 | border-bottom-width: calc(1px * var(--tw-divide-y-reverse)); 588 | } 589 | 590 | .divide-gray-300\/50 > :not([hidden]) ~ :not([hidden]) { 591 | border-color: rgb(209 213 219 / 0.5); 592 | } 593 | 594 | .overflow-hidden { 595 | overflow: hidden; 596 | } 597 | 598 | .bg-gray-50 { 599 | --tw-bg-opacity: 1; 600 | background-color: rgb(249 250 251 / var(--tw-bg-opacity)); 601 | } 602 | 603 | .bg-white { 604 | --tw-bg-opacity: 1; 605 | background-color: rgb(255 255 255 / var(--tw-bg-opacity)); 606 | } 607 | 608 | .fill-sky-100 { 609 | fill: #e0f2fe; 610 | } 611 | 612 | .stroke-sky-500 { 613 | stroke: #0ea5e9; 614 | } 615 | 616 | .stroke-2 { 617 | stroke-width: 2; 618 | } 619 | 620 | .py-6 { 621 | padding-top: 1.5rem; 622 | padding-bottom: 1.5rem; 623 | } 624 | 625 | .px-6 { 626 | padding-left: 1.5rem; 627 | padding-right: 1.5rem; 628 | } 629 | 630 | .py-8 { 631 | padding-top: 2rem; 632 | padding-bottom: 2rem; 633 | } 634 | 635 | .pt-10 { 636 | padding-top: 2.5rem; 637 | } 638 | 639 | .pb-8 { 640 | padding-bottom: 2rem; 641 | } 642 | 643 | .text-base { 644 | font-size: 1rem; 645 | line-height: 1.5rem; 646 | } 647 | 648 | .leading-7 { 649 | line-height: 1.75rem; 650 | } 651 | 652 | .text-gray-600 { 653 | --tw-text-opacity: 1; 654 | color: rgb(75 85 99 / var(--tw-text-opacity)); 655 | } 656 | 657 | .shadow-xl { 658 | --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1); 659 | --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color); 660 | box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); 661 | } 662 | 663 | .ring-1 { 664 | --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); 665 | --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); 666 | box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); 667 | } 668 | 669 | .ring-gray-900\/5 { 670 | --tw-ring-color: rgb(17 24 39 / 0.05); 671 | } 672 | 673 | @media (min-width: 640px) { 674 | .sm\:mx-auto { 675 | margin-left: auto; 676 | margin-right: auto; 677 | } 678 | 679 | .sm\:max-w-lg { 680 | max-width: 32rem; 681 | } 682 | 683 | .sm\:rounded-lg { 684 | border-radius: 0.5rem; 685 | } 686 | 687 | .sm\:py-12 { 688 | padding-top: 3rem; 689 | padding-bottom: 3rem; 690 | } 691 | 692 | .sm\:px-10 { 693 | padding-left: 2.5rem; 694 | padding-right: 2.5rem; 695 | } 696 | } -------------------------------------------------------------------------------- /BlazorExample.Site/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "blazorexample.site", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "blazorexample.site", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "@tailwindcss/typography": "^0.5.1" 13 | }, 14 | "devDependencies": { 15 | "tailwindcss": "^3.0.22" 16 | } 17 | }, 18 | "node_modules/@babel/code-frame": { 19 | "version": "7.16.7", 20 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", 21 | "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", 22 | "dependencies": { 23 | "@babel/highlight": "^7.16.7" 24 | }, 25 | "engines": { 26 | "node": ">=6.9.0" 27 | } 28 | }, 29 | "node_modules/@babel/helper-validator-identifier": { 30 | "version": "7.16.7", 31 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", 32 | "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", 33 | "engines": { 34 | "node": ">=6.9.0" 35 | } 36 | }, 37 | "node_modules/@babel/highlight": { 38 | "version": "7.16.10", 39 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", 40 | "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", 41 | "dependencies": { 42 | "@babel/helper-validator-identifier": "^7.16.7", 43 | "chalk": "^2.0.0", 44 | "js-tokens": "^4.0.0" 45 | }, 46 | "engines": { 47 | "node": ">=6.9.0" 48 | } 49 | }, 50 | "node_modules/@babel/highlight/node_modules/ansi-styles": { 51 | "version": "3.2.1", 52 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 53 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 54 | "dependencies": { 55 | "color-convert": "^1.9.0" 56 | }, 57 | "engines": { 58 | "node": ">=4" 59 | } 60 | }, 61 | "node_modules/@babel/highlight/node_modules/chalk": { 62 | "version": "2.4.2", 63 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 64 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 65 | "dependencies": { 66 | "ansi-styles": "^3.2.1", 67 | "escape-string-regexp": "^1.0.5", 68 | "supports-color": "^5.3.0" 69 | }, 70 | "engines": { 71 | "node": ">=4" 72 | } 73 | }, 74 | "node_modules/@babel/highlight/node_modules/color-convert": { 75 | "version": "1.9.3", 76 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 77 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 78 | "dependencies": { 79 | "color-name": "1.1.3" 80 | } 81 | }, 82 | "node_modules/@babel/highlight/node_modules/color-name": { 83 | "version": "1.1.3", 84 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 85 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 86 | }, 87 | "node_modules/@babel/highlight/node_modules/has-flag": { 88 | "version": "3.0.0", 89 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 90 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 91 | "engines": { 92 | "node": ">=4" 93 | } 94 | }, 95 | "node_modules/@babel/highlight/node_modules/supports-color": { 96 | "version": "5.5.0", 97 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 98 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 99 | "dependencies": { 100 | "has-flag": "^3.0.0" 101 | }, 102 | "engines": { 103 | "node": ">=4" 104 | } 105 | }, 106 | "node_modules/@nodelib/fs.scandir": { 107 | "version": "2.1.5", 108 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 109 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 110 | "dependencies": { 111 | "@nodelib/fs.stat": "2.0.5", 112 | "run-parallel": "^1.1.9" 113 | }, 114 | "engines": { 115 | "node": ">= 8" 116 | } 117 | }, 118 | "node_modules/@nodelib/fs.stat": { 119 | "version": "2.0.5", 120 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 121 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 122 | "engines": { 123 | "node": ">= 8" 124 | } 125 | }, 126 | "node_modules/@nodelib/fs.walk": { 127 | "version": "1.2.8", 128 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 129 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 130 | "dependencies": { 131 | "@nodelib/fs.scandir": "2.1.5", 132 | "fastq": "^1.6.0" 133 | }, 134 | "engines": { 135 | "node": ">= 8" 136 | } 137 | }, 138 | "node_modules/@tailwindcss/typography": { 139 | "version": "0.5.1", 140 | "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.1.tgz", 141 | "integrity": "sha512-AmSzZSgLhHKlILKduU+PKBTHL6c+al82syZlRid1xgmlWwXagLigO+O++B4C0scpMfzW//f/3YCRcwwEHWoU3w==", 142 | "dependencies": { 143 | "lodash.castarray": "^4.4.0", 144 | "lodash.isplainobject": "^4.0.6", 145 | "lodash.merge": "^4.6.2" 146 | }, 147 | "peerDependencies": { 148 | "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || insiders" 149 | } 150 | }, 151 | "node_modules/@types/parse-json": { 152 | "version": "4.0.0", 153 | "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", 154 | "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" 155 | }, 156 | "node_modules/acorn": { 157 | "version": "7.4.1", 158 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", 159 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", 160 | "bin": { 161 | "acorn": "bin/acorn" 162 | }, 163 | "engines": { 164 | "node": ">=0.4.0" 165 | } 166 | }, 167 | "node_modules/acorn-node": { 168 | "version": "1.8.2", 169 | "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", 170 | "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", 171 | "dependencies": { 172 | "acorn": "^7.0.0", 173 | "acorn-walk": "^7.0.0", 174 | "xtend": "^4.0.2" 175 | } 176 | }, 177 | "node_modules/acorn-walk": { 178 | "version": "7.2.0", 179 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", 180 | "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", 181 | "engines": { 182 | "node": ">=0.4.0" 183 | } 184 | }, 185 | "node_modules/ansi-styles": { 186 | "version": "4.3.0", 187 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 188 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 189 | "dependencies": { 190 | "color-convert": "^2.0.1" 191 | }, 192 | "engines": { 193 | "node": ">=8" 194 | }, 195 | "funding": { 196 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 197 | } 198 | }, 199 | "node_modules/anymatch": { 200 | "version": "3.1.2", 201 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 202 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 203 | "dependencies": { 204 | "normalize-path": "^3.0.0", 205 | "picomatch": "^2.0.4" 206 | }, 207 | "engines": { 208 | "node": ">= 8" 209 | } 210 | }, 211 | "node_modules/arg": { 212 | "version": "5.0.1", 213 | "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", 214 | "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==" 215 | }, 216 | "node_modules/binary-extensions": { 217 | "version": "2.2.0", 218 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 219 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 220 | "engines": { 221 | "node": ">=8" 222 | } 223 | }, 224 | "node_modules/braces": { 225 | "version": "3.0.2", 226 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 227 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 228 | "dependencies": { 229 | "fill-range": "^7.0.1" 230 | }, 231 | "engines": { 232 | "node": ">=8" 233 | } 234 | }, 235 | "node_modules/callsites": { 236 | "version": "3.1.0", 237 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 238 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 239 | "engines": { 240 | "node": ">=6" 241 | } 242 | }, 243 | "node_modules/camelcase-css": { 244 | "version": "2.0.1", 245 | "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", 246 | "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", 247 | "engines": { 248 | "node": ">= 6" 249 | } 250 | }, 251 | "node_modules/chalk": { 252 | "version": "4.1.2", 253 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 254 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 255 | "dependencies": { 256 | "ansi-styles": "^4.1.0", 257 | "supports-color": "^7.1.0" 258 | }, 259 | "engines": { 260 | "node": ">=10" 261 | }, 262 | "funding": { 263 | "url": "https://github.com/chalk/chalk?sponsor=1" 264 | } 265 | }, 266 | "node_modules/chokidar": { 267 | "version": "3.5.3", 268 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 269 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 270 | "funding": [ 271 | { 272 | "type": "individual", 273 | "url": "https://paulmillr.com/funding/" 274 | } 275 | ], 276 | "dependencies": { 277 | "anymatch": "~3.1.2", 278 | "braces": "~3.0.2", 279 | "glob-parent": "~5.1.2", 280 | "is-binary-path": "~2.1.0", 281 | "is-glob": "~4.0.1", 282 | "normalize-path": "~3.0.0", 283 | "readdirp": "~3.6.0" 284 | }, 285 | "engines": { 286 | "node": ">= 8.10.0" 287 | }, 288 | "optionalDependencies": { 289 | "fsevents": "~2.3.2" 290 | } 291 | }, 292 | "node_modules/chokidar/node_modules/glob-parent": { 293 | "version": "5.1.2", 294 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 295 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 296 | "dependencies": { 297 | "is-glob": "^4.0.1" 298 | }, 299 | "engines": { 300 | "node": ">= 6" 301 | } 302 | }, 303 | "node_modules/color-convert": { 304 | "version": "2.0.1", 305 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 306 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 307 | "dependencies": { 308 | "color-name": "~1.1.4" 309 | }, 310 | "engines": { 311 | "node": ">=7.0.0" 312 | } 313 | }, 314 | "node_modules/color-name": { 315 | "version": "1.1.4", 316 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 317 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 318 | }, 319 | "node_modules/cosmiconfig": { 320 | "version": "7.0.1", 321 | "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", 322 | "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", 323 | "dependencies": { 324 | "@types/parse-json": "^4.0.0", 325 | "import-fresh": "^3.2.1", 326 | "parse-json": "^5.0.0", 327 | "path-type": "^4.0.0", 328 | "yaml": "^1.10.0" 329 | }, 330 | "engines": { 331 | "node": ">=10" 332 | } 333 | }, 334 | "node_modules/cssesc": { 335 | "version": "3.0.0", 336 | "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", 337 | "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", 338 | "bin": { 339 | "cssesc": "bin/cssesc" 340 | }, 341 | "engines": { 342 | "node": ">=4" 343 | } 344 | }, 345 | "node_modules/defined": { 346 | "version": "1.0.0", 347 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 348 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" 349 | }, 350 | "node_modules/detective": { 351 | "version": "5.2.0", 352 | "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", 353 | "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", 354 | "dependencies": { 355 | "acorn-node": "^1.6.1", 356 | "defined": "^1.0.0", 357 | "minimist": "^1.1.1" 358 | }, 359 | "bin": { 360 | "detective": "bin/detective.js" 361 | }, 362 | "engines": { 363 | "node": ">=0.8.0" 364 | } 365 | }, 366 | "node_modules/didyoumean": { 367 | "version": "1.2.2", 368 | "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", 369 | "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" 370 | }, 371 | "node_modules/dlv": { 372 | "version": "1.1.3", 373 | "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", 374 | "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" 375 | }, 376 | "node_modules/error-ex": { 377 | "version": "1.3.2", 378 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 379 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 380 | "dependencies": { 381 | "is-arrayish": "^0.2.1" 382 | } 383 | }, 384 | "node_modules/escape-string-regexp": { 385 | "version": "1.0.5", 386 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 387 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 388 | "engines": { 389 | "node": ">=0.8.0" 390 | } 391 | }, 392 | "node_modules/fast-glob": { 393 | "version": "3.2.11", 394 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", 395 | "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", 396 | "dependencies": { 397 | "@nodelib/fs.stat": "^2.0.2", 398 | "@nodelib/fs.walk": "^1.2.3", 399 | "glob-parent": "^5.1.2", 400 | "merge2": "^1.3.0", 401 | "micromatch": "^4.0.4" 402 | }, 403 | "engines": { 404 | "node": ">=8.6.0" 405 | } 406 | }, 407 | "node_modules/fast-glob/node_modules/glob-parent": { 408 | "version": "5.1.2", 409 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 410 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 411 | "dependencies": { 412 | "is-glob": "^4.0.1" 413 | }, 414 | "engines": { 415 | "node": ">= 6" 416 | } 417 | }, 418 | "node_modules/fastq": { 419 | "version": "1.13.0", 420 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", 421 | "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", 422 | "dependencies": { 423 | "reusify": "^1.0.4" 424 | } 425 | }, 426 | "node_modules/fill-range": { 427 | "version": "7.0.1", 428 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 429 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 430 | "dependencies": { 431 | "to-regex-range": "^5.0.1" 432 | }, 433 | "engines": { 434 | "node": ">=8" 435 | } 436 | }, 437 | "node_modules/fsevents": { 438 | "version": "2.3.2", 439 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 440 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 441 | "hasInstallScript": true, 442 | "optional": true, 443 | "os": [ 444 | "darwin" 445 | ], 446 | "engines": { 447 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 448 | } 449 | }, 450 | "node_modules/function-bind": { 451 | "version": "1.1.1", 452 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 453 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 454 | }, 455 | "node_modules/glob-parent": { 456 | "version": "6.0.2", 457 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 458 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 459 | "dependencies": { 460 | "is-glob": "^4.0.3" 461 | }, 462 | "engines": { 463 | "node": ">=10.13.0" 464 | } 465 | }, 466 | "node_modules/has": { 467 | "version": "1.0.3", 468 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 469 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 470 | "dependencies": { 471 | "function-bind": "^1.1.1" 472 | }, 473 | "engines": { 474 | "node": ">= 0.4.0" 475 | } 476 | }, 477 | "node_modules/has-flag": { 478 | "version": "4.0.0", 479 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 480 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 481 | "engines": { 482 | "node": ">=8" 483 | } 484 | }, 485 | "node_modules/import-fresh": { 486 | "version": "3.3.0", 487 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 488 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 489 | "dependencies": { 490 | "parent-module": "^1.0.0", 491 | "resolve-from": "^4.0.0" 492 | }, 493 | "engines": { 494 | "node": ">=6" 495 | }, 496 | "funding": { 497 | "url": "https://github.com/sponsors/sindresorhus" 498 | } 499 | }, 500 | "node_modules/is-arrayish": { 501 | "version": "0.2.1", 502 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 503 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" 504 | }, 505 | "node_modules/is-binary-path": { 506 | "version": "2.1.0", 507 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 508 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 509 | "dependencies": { 510 | "binary-extensions": "^2.0.0" 511 | }, 512 | "engines": { 513 | "node": ">=8" 514 | } 515 | }, 516 | "node_modules/is-core-module": { 517 | "version": "2.8.1", 518 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", 519 | "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", 520 | "dependencies": { 521 | "has": "^1.0.3" 522 | }, 523 | "funding": { 524 | "url": "https://github.com/sponsors/ljharb" 525 | } 526 | }, 527 | "node_modules/is-extglob": { 528 | "version": "2.1.1", 529 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 530 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 531 | "engines": { 532 | "node": ">=0.10.0" 533 | } 534 | }, 535 | "node_modules/is-glob": { 536 | "version": "4.0.3", 537 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 538 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 539 | "dependencies": { 540 | "is-extglob": "^2.1.1" 541 | }, 542 | "engines": { 543 | "node": ">=0.10.0" 544 | } 545 | }, 546 | "node_modules/is-number": { 547 | "version": "7.0.0", 548 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 549 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 550 | "engines": { 551 | "node": ">=0.12.0" 552 | } 553 | }, 554 | "node_modules/js-tokens": { 555 | "version": "4.0.0", 556 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 557 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 558 | }, 559 | "node_modules/json-parse-even-better-errors": { 560 | "version": "2.3.1", 561 | "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", 562 | "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" 563 | }, 564 | "node_modules/lilconfig": { 565 | "version": "2.0.4", 566 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", 567 | "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==", 568 | "engines": { 569 | "node": ">=10" 570 | } 571 | }, 572 | "node_modules/lines-and-columns": { 573 | "version": "1.2.4", 574 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 575 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" 576 | }, 577 | "node_modules/lodash.castarray": { 578 | "version": "4.4.0", 579 | "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", 580 | "integrity": "sha1-wCUTUV4wna3dTCTGDP3c9ZdtkRU=" 581 | }, 582 | "node_modules/lodash.isplainobject": { 583 | "version": "4.0.6", 584 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 585 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" 586 | }, 587 | "node_modules/lodash.merge": { 588 | "version": "4.6.2", 589 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 590 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" 591 | }, 592 | "node_modules/merge2": { 593 | "version": "1.4.1", 594 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 595 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 596 | "engines": { 597 | "node": ">= 8" 598 | } 599 | }, 600 | "node_modules/micromatch": { 601 | "version": "4.0.4", 602 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", 603 | "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", 604 | "dependencies": { 605 | "braces": "^3.0.1", 606 | "picomatch": "^2.2.3" 607 | }, 608 | "engines": { 609 | "node": ">=8.6" 610 | } 611 | }, 612 | "node_modules/minimist": { 613 | "version": "1.2.5", 614 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 615 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 616 | }, 617 | "node_modules/nanoid": { 618 | "version": "3.2.0", 619 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", 620 | "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", 621 | "bin": { 622 | "nanoid": "bin/nanoid.cjs" 623 | }, 624 | "engines": { 625 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 626 | } 627 | }, 628 | "node_modules/normalize-path": { 629 | "version": "3.0.0", 630 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 631 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 632 | "engines": { 633 | "node": ">=0.10.0" 634 | } 635 | }, 636 | "node_modules/object-hash": { 637 | "version": "2.2.0", 638 | "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", 639 | "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", 640 | "engines": { 641 | "node": ">= 6" 642 | } 643 | }, 644 | "node_modules/parent-module": { 645 | "version": "1.0.1", 646 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 647 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 648 | "dependencies": { 649 | "callsites": "^3.0.0" 650 | }, 651 | "engines": { 652 | "node": ">=6" 653 | } 654 | }, 655 | "node_modules/parse-json": { 656 | "version": "5.2.0", 657 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", 658 | "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", 659 | "dependencies": { 660 | "@babel/code-frame": "^7.0.0", 661 | "error-ex": "^1.3.1", 662 | "json-parse-even-better-errors": "^2.3.0", 663 | "lines-and-columns": "^1.1.6" 664 | }, 665 | "engines": { 666 | "node": ">=8" 667 | }, 668 | "funding": { 669 | "url": "https://github.com/sponsors/sindresorhus" 670 | } 671 | }, 672 | "node_modules/path-parse": { 673 | "version": "1.0.7", 674 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 675 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" 676 | }, 677 | "node_modules/path-type": { 678 | "version": "4.0.0", 679 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 680 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 681 | "engines": { 682 | "node": ">=8" 683 | } 684 | }, 685 | "node_modules/picocolors": { 686 | "version": "1.0.0", 687 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 688 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 689 | }, 690 | "node_modules/picomatch": { 691 | "version": "2.3.1", 692 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 693 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 694 | "engines": { 695 | "node": ">=8.6" 696 | }, 697 | "funding": { 698 | "url": "https://github.com/sponsors/jonschlinkert" 699 | } 700 | }, 701 | "node_modules/postcss": { 702 | "version": "8.4.6", 703 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.6.tgz", 704 | "integrity": "sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA==", 705 | "dependencies": { 706 | "nanoid": "^3.2.0", 707 | "picocolors": "^1.0.0", 708 | "source-map-js": "^1.0.2" 709 | }, 710 | "engines": { 711 | "node": "^10 || ^12 || >=14" 712 | }, 713 | "funding": { 714 | "type": "opencollective", 715 | "url": "https://opencollective.com/postcss/" 716 | } 717 | }, 718 | "node_modules/postcss-js": { 719 | "version": "4.0.0", 720 | "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", 721 | "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", 722 | "dependencies": { 723 | "camelcase-css": "^2.0.1" 724 | }, 725 | "engines": { 726 | "node": "^12 || ^14 || >= 16" 727 | }, 728 | "funding": { 729 | "type": "opencollective", 730 | "url": "https://opencollective.com/postcss/" 731 | }, 732 | "peerDependencies": { 733 | "postcss": "^8.3.3" 734 | } 735 | }, 736 | "node_modules/postcss-load-config": { 737 | "version": "3.1.3", 738 | "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.3.tgz", 739 | "integrity": "sha512-5EYgaM9auHGtO//ljHH+v/aC/TQ5LHXtL7bQajNAUBKUVKiYE8rYpFms7+V26D9FncaGe2zwCoPQsFKb5zF/Hw==", 740 | "dependencies": { 741 | "lilconfig": "^2.0.4", 742 | "yaml": "^1.10.2" 743 | }, 744 | "engines": { 745 | "node": ">= 10" 746 | }, 747 | "funding": { 748 | "type": "opencollective", 749 | "url": "https://opencollective.com/postcss/" 750 | }, 751 | "peerDependencies": { 752 | "ts-node": ">=9.0.0" 753 | }, 754 | "peerDependenciesMeta": { 755 | "ts-node": { 756 | "optional": true 757 | } 758 | } 759 | }, 760 | "node_modules/postcss-nested": { 761 | "version": "5.0.6", 762 | "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", 763 | "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", 764 | "dependencies": { 765 | "postcss-selector-parser": "^6.0.6" 766 | }, 767 | "engines": { 768 | "node": ">=12.0" 769 | }, 770 | "funding": { 771 | "type": "opencollective", 772 | "url": "https://opencollective.com/postcss/" 773 | }, 774 | "peerDependencies": { 775 | "postcss": "^8.2.14" 776 | } 777 | }, 778 | "node_modules/postcss-selector-parser": { 779 | "version": "6.0.9", 780 | "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz", 781 | "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==", 782 | "dependencies": { 783 | "cssesc": "^3.0.0", 784 | "util-deprecate": "^1.0.2" 785 | }, 786 | "engines": { 787 | "node": ">=4" 788 | } 789 | }, 790 | "node_modules/postcss-value-parser": { 791 | "version": "4.2.0", 792 | "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", 793 | "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" 794 | }, 795 | "node_modules/queue-microtask": { 796 | "version": "1.2.3", 797 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 798 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 799 | "funding": [ 800 | { 801 | "type": "github", 802 | "url": "https://github.com/sponsors/feross" 803 | }, 804 | { 805 | "type": "patreon", 806 | "url": "https://www.patreon.com/feross" 807 | }, 808 | { 809 | "type": "consulting", 810 | "url": "https://feross.org/support" 811 | } 812 | ] 813 | }, 814 | "node_modules/quick-lru": { 815 | "version": "5.1.1", 816 | "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", 817 | "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", 818 | "engines": { 819 | "node": ">=10" 820 | }, 821 | "funding": { 822 | "url": "https://github.com/sponsors/sindresorhus" 823 | } 824 | }, 825 | "node_modules/readdirp": { 826 | "version": "3.6.0", 827 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 828 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 829 | "dependencies": { 830 | "picomatch": "^2.2.1" 831 | }, 832 | "engines": { 833 | "node": ">=8.10.0" 834 | } 835 | }, 836 | "node_modules/resolve": { 837 | "version": "1.22.0", 838 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", 839 | "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", 840 | "dependencies": { 841 | "is-core-module": "^2.8.1", 842 | "path-parse": "^1.0.7", 843 | "supports-preserve-symlinks-flag": "^1.0.0" 844 | }, 845 | "bin": { 846 | "resolve": "bin/resolve" 847 | }, 848 | "funding": { 849 | "url": "https://github.com/sponsors/ljharb" 850 | } 851 | }, 852 | "node_modules/resolve-from": { 853 | "version": "4.0.0", 854 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 855 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 856 | "engines": { 857 | "node": ">=4" 858 | } 859 | }, 860 | "node_modules/reusify": { 861 | "version": "1.0.4", 862 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 863 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 864 | "engines": { 865 | "iojs": ">=1.0.0", 866 | "node": ">=0.10.0" 867 | } 868 | }, 869 | "node_modules/run-parallel": { 870 | "version": "1.2.0", 871 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 872 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 873 | "funding": [ 874 | { 875 | "type": "github", 876 | "url": "https://github.com/sponsors/feross" 877 | }, 878 | { 879 | "type": "patreon", 880 | "url": "https://www.patreon.com/feross" 881 | }, 882 | { 883 | "type": "consulting", 884 | "url": "https://feross.org/support" 885 | } 886 | ], 887 | "dependencies": { 888 | "queue-microtask": "^1.2.2" 889 | } 890 | }, 891 | "node_modules/source-map-js": { 892 | "version": "1.0.2", 893 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 894 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 895 | "engines": { 896 | "node": ">=0.10.0" 897 | } 898 | }, 899 | "node_modules/supports-color": { 900 | "version": "7.2.0", 901 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 902 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 903 | "dependencies": { 904 | "has-flag": "^4.0.0" 905 | }, 906 | "engines": { 907 | "node": ">=8" 908 | } 909 | }, 910 | "node_modules/supports-preserve-symlinks-flag": { 911 | "version": "1.0.0", 912 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 913 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 914 | "engines": { 915 | "node": ">= 0.4" 916 | }, 917 | "funding": { 918 | "url": "https://github.com/sponsors/ljharb" 919 | } 920 | }, 921 | "node_modules/tailwindcss": { 922 | "version": "3.0.22", 923 | "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.22.tgz", 924 | "integrity": "sha512-F8lt74RlNZirnkaSk310+vGQta7c0/hgx7/bqxruM4wS9lp8oqV93lzavajC3VT0Lp4UUtUVIt8ifKcmGzkr0A==", 925 | "dependencies": { 926 | "arg": "^5.0.1", 927 | "chalk": "^4.1.2", 928 | "chokidar": "^3.5.3", 929 | "color-name": "^1.1.4", 930 | "cosmiconfig": "^7.0.1", 931 | "detective": "^5.2.0", 932 | "didyoumean": "^1.2.2", 933 | "dlv": "^1.1.3", 934 | "fast-glob": "^3.2.11", 935 | "glob-parent": "^6.0.2", 936 | "is-glob": "^4.0.3", 937 | "normalize-path": "^3.0.0", 938 | "object-hash": "^2.2.0", 939 | "postcss": "^8.4.6", 940 | "postcss-js": "^4.0.0", 941 | "postcss-load-config": "^3.1.0", 942 | "postcss-nested": "5.0.6", 943 | "postcss-selector-parser": "^6.0.9", 944 | "postcss-value-parser": "^4.2.0", 945 | "quick-lru": "^5.1.1", 946 | "resolve": "^1.22.0" 947 | }, 948 | "bin": { 949 | "tailwind": "lib/cli.js", 950 | "tailwindcss": "lib/cli.js" 951 | }, 952 | "engines": { 953 | "node": ">=12.13.0" 954 | }, 955 | "peerDependencies": { 956 | "autoprefixer": "^10.0.2", 957 | "postcss": "^8.0.9" 958 | } 959 | }, 960 | "node_modules/to-regex-range": { 961 | "version": "5.0.1", 962 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 963 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 964 | "dependencies": { 965 | "is-number": "^7.0.0" 966 | }, 967 | "engines": { 968 | "node": ">=8.0" 969 | } 970 | }, 971 | "node_modules/util-deprecate": { 972 | "version": "1.0.2", 973 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 974 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 975 | }, 976 | "node_modules/xtend": { 977 | "version": "4.0.2", 978 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 979 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 980 | "engines": { 981 | "node": ">=0.4" 982 | } 983 | }, 984 | "node_modules/yaml": { 985 | "version": "1.10.2", 986 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", 987 | "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", 988 | "engines": { 989 | "node": ">= 6" 990 | } 991 | } 992 | }, 993 | "dependencies": { 994 | "@babel/code-frame": { 995 | "version": "7.16.7", 996 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", 997 | "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", 998 | "requires": { 999 | "@babel/highlight": "^7.16.7" 1000 | } 1001 | }, 1002 | "@babel/helper-validator-identifier": { 1003 | "version": "7.16.7", 1004 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", 1005 | "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" 1006 | }, 1007 | "@babel/highlight": { 1008 | "version": "7.16.10", 1009 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", 1010 | "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", 1011 | "requires": { 1012 | "@babel/helper-validator-identifier": "^7.16.7", 1013 | "chalk": "^2.0.0", 1014 | "js-tokens": "^4.0.0" 1015 | }, 1016 | "dependencies": { 1017 | "ansi-styles": { 1018 | "version": "3.2.1", 1019 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 1020 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 1021 | "requires": { 1022 | "color-convert": "^1.9.0" 1023 | } 1024 | }, 1025 | "chalk": { 1026 | "version": "2.4.2", 1027 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 1028 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 1029 | "requires": { 1030 | "ansi-styles": "^3.2.1", 1031 | "escape-string-regexp": "^1.0.5", 1032 | "supports-color": "^5.3.0" 1033 | } 1034 | }, 1035 | "color-convert": { 1036 | "version": "1.9.3", 1037 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 1038 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 1039 | "requires": { 1040 | "color-name": "1.1.3" 1041 | } 1042 | }, 1043 | "color-name": { 1044 | "version": "1.1.3", 1045 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 1046 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 1047 | }, 1048 | "has-flag": { 1049 | "version": "3.0.0", 1050 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1051 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 1052 | }, 1053 | "supports-color": { 1054 | "version": "5.5.0", 1055 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1056 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1057 | "requires": { 1058 | "has-flag": "^3.0.0" 1059 | } 1060 | } 1061 | } 1062 | }, 1063 | "@nodelib/fs.scandir": { 1064 | "version": "2.1.5", 1065 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 1066 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 1067 | "requires": { 1068 | "@nodelib/fs.stat": "2.0.5", 1069 | "run-parallel": "^1.1.9" 1070 | } 1071 | }, 1072 | "@nodelib/fs.stat": { 1073 | "version": "2.0.5", 1074 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 1075 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" 1076 | }, 1077 | "@nodelib/fs.walk": { 1078 | "version": "1.2.8", 1079 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 1080 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 1081 | "requires": { 1082 | "@nodelib/fs.scandir": "2.1.5", 1083 | "fastq": "^1.6.0" 1084 | } 1085 | }, 1086 | "@tailwindcss/typography": { 1087 | "version": "0.5.1", 1088 | "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.1.tgz", 1089 | "integrity": "sha512-AmSzZSgLhHKlILKduU+PKBTHL6c+al82syZlRid1xgmlWwXagLigO+O++B4C0scpMfzW//f/3YCRcwwEHWoU3w==", 1090 | "requires": { 1091 | "lodash.castarray": "^4.4.0", 1092 | "lodash.isplainobject": "^4.0.6", 1093 | "lodash.merge": "^4.6.2" 1094 | } 1095 | }, 1096 | "@types/parse-json": { 1097 | "version": "4.0.0", 1098 | "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", 1099 | "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" 1100 | }, 1101 | "acorn": { 1102 | "version": "7.4.1", 1103 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", 1104 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" 1105 | }, 1106 | "acorn-node": { 1107 | "version": "1.8.2", 1108 | "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", 1109 | "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", 1110 | "requires": { 1111 | "acorn": "^7.0.0", 1112 | "acorn-walk": "^7.0.0", 1113 | "xtend": "^4.0.2" 1114 | } 1115 | }, 1116 | "acorn-walk": { 1117 | "version": "7.2.0", 1118 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", 1119 | "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" 1120 | }, 1121 | "ansi-styles": { 1122 | "version": "4.3.0", 1123 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1124 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1125 | "requires": { 1126 | "color-convert": "^2.0.1" 1127 | } 1128 | }, 1129 | "anymatch": { 1130 | "version": "3.1.2", 1131 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 1132 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 1133 | "requires": { 1134 | "normalize-path": "^3.0.0", 1135 | "picomatch": "^2.0.4" 1136 | } 1137 | }, 1138 | "arg": { 1139 | "version": "5.0.1", 1140 | "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", 1141 | "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==" 1142 | }, 1143 | "binary-extensions": { 1144 | "version": "2.2.0", 1145 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 1146 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" 1147 | }, 1148 | "braces": { 1149 | "version": "3.0.2", 1150 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 1151 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 1152 | "requires": { 1153 | "fill-range": "^7.0.1" 1154 | } 1155 | }, 1156 | "callsites": { 1157 | "version": "3.1.0", 1158 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 1159 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" 1160 | }, 1161 | "camelcase-css": { 1162 | "version": "2.0.1", 1163 | "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", 1164 | "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" 1165 | }, 1166 | "chalk": { 1167 | "version": "4.1.2", 1168 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1169 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1170 | "requires": { 1171 | "ansi-styles": "^4.1.0", 1172 | "supports-color": "^7.1.0" 1173 | } 1174 | }, 1175 | "chokidar": { 1176 | "version": "3.5.3", 1177 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 1178 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 1179 | "requires": { 1180 | "anymatch": "~3.1.2", 1181 | "braces": "~3.0.2", 1182 | "fsevents": "~2.3.2", 1183 | "glob-parent": "~5.1.2", 1184 | "is-binary-path": "~2.1.0", 1185 | "is-glob": "~4.0.1", 1186 | "normalize-path": "~3.0.0", 1187 | "readdirp": "~3.6.0" 1188 | }, 1189 | "dependencies": { 1190 | "glob-parent": { 1191 | "version": "5.1.2", 1192 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1193 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1194 | "requires": { 1195 | "is-glob": "^4.0.1" 1196 | } 1197 | } 1198 | } 1199 | }, 1200 | "color-convert": { 1201 | "version": "2.0.1", 1202 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1203 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1204 | "requires": { 1205 | "color-name": "~1.1.4" 1206 | } 1207 | }, 1208 | "color-name": { 1209 | "version": "1.1.4", 1210 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1211 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 1212 | }, 1213 | "cosmiconfig": { 1214 | "version": "7.0.1", 1215 | "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", 1216 | "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", 1217 | "requires": { 1218 | "@types/parse-json": "^4.0.0", 1219 | "import-fresh": "^3.2.1", 1220 | "parse-json": "^5.0.0", 1221 | "path-type": "^4.0.0", 1222 | "yaml": "^1.10.0" 1223 | } 1224 | }, 1225 | "cssesc": { 1226 | "version": "3.0.0", 1227 | "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", 1228 | "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" 1229 | }, 1230 | "defined": { 1231 | "version": "1.0.0", 1232 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 1233 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" 1234 | }, 1235 | "detective": { 1236 | "version": "5.2.0", 1237 | "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", 1238 | "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", 1239 | "requires": { 1240 | "acorn-node": "^1.6.1", 1241 | "defined": "^1.0.0", 1242 | "minimist": "^1.1.1" 1243 | } 1244 | }, 1245 | "didyoumean": { 1246 | "version": "1.2.2", 1247 | "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", 1248 | "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" 1249 | }, 1250 | "dlv": { 1251 | "version": "1.1.3", 1252 | "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", 1253 | "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" 1254 | }, 1255 | "error-ex": { 1256 | "version": "1.3.2", 1257 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 1258 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 1259 | "requires": { 1260 | "is-arrayish": "^0.2.1" 1261 | } 1262 | }, 1263 | "escape-string-regexp": { 1264 | "version": "1.0.5", 1265 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1266 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 1267 | }, 1268 | "fast-glob": { 1269 | "version": "3.2.11", 1270 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", 1271 | "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", 1272 | "requires": { 1273 | "@nodelib/fs.stat": "^2.0.2", 1274 | "@nodelib/fs.walk": "^1.2.3", 1275 | "glob-parent": "^5.1.2", 1276 | "merge2": "^1.3.0", 1277 | "micromatch": "^4.0.4" 1278 | }, 1279 | "dependencies": { 1280 | "glob-parent": { 1281 | "version": "5.1.2", 1282 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1283 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1284 | "requires": { 1285 | "is-glob": "^4.0.1" 1286 | } 1287 | } 1288 | } 1289 | }, 1290 | "fastq": { 1291 | "version": "1.13.0", 1292 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", 1293 | "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", 1294 | "requires": { 1295 | "reusify": "^1.0.4" 1296 | } 1297 | }, 1298 | "fill-range": { 1299 | "version": "7.0.1", 1300 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1301 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1302 | "requires": { 1303 | "to-regex-range": "^5.0.1" 1304 | } 1305 | }, 1306 | "fsevents": { 1307 | "version": "2.3.2", 1308 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1309 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1310 | "optional": true 1311 | }, 1312 | "function-bind": { 1313 | "version": "1.1.1", 1314 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1315 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 1316 | }, 1317 | "glob-parent": { 1318 | "version": "6.0.2", 1319 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 1320 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 1321 | "requires": { 1322 | "is-glob": "^4.0.3" 1323 | } 1324 | }, 1325 | "has": { 1326 | "version": "1.0.3", 1327 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1328 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1329 | "requires": { 1330 | "function-bind": "^1.1.1" 1331 | } 1332 | }, 1333 | "has-flag": { 1334 | "version": "4.0.0", 1335 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1336 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" 1337 | }, 1338 | "import-fresh": { 1339 | "version": "3.3.0", 1340 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 1341 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 1342 | "requires": { 1343 | "parent-module": "^1.0.0", 1344 | "resolve-from": "^4.0.0" 1345 | } 1346 | }, 1347 | "is-arrayish": { 1348 | "version": "0.2.1", 1349 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1350 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" 1351 | }, 1352 | "is-binary-path": { 1353 | "version": "2.1.0", 1354 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1355 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1356 | "requires": { 1357 | "binary-extensions": "^2.0.0" 1358 | } 1359 | }, 1360 | "is-core-module": { 1361 | "version": "2.8.1", 1362 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", 1363 | "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", 1364 | "requires": { 1365 | "has": "^1.0.3" 1366 | } 1367 | }, 1368 | "is-extglob": { 1369 | "version": "2.1.1", 1370 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1371 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" 1372 | }, 1373 | "is-glob": { 1374 | "version": "4.0.3", 1375 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1376 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1377 | "requires": { 1378 | "is-extglob": "^2.1.1" 1379 | } 1380 | }, 1381 | "is-number": { 1382 | "version": "7.0.0", 1383 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1384 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 1385 | }, 1386 | "js-tokens": { 1387 | "version": "4.0.0", 1388 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1389 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 1390 | }, 1391 | "json-parse-even-better-errors": { 1392 | "version": "2.3.1", 1393 | "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", 1394 | "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" 1395 | }, 1396 | "lilconfig": { 1397 | "version": "2.0.4", 1398 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", 1399 | "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==" 1400 | }, 1401 | "lines-and-columns": { 1402 | "version": "1.2.4", 1403 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 1404 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" 1405 | }, 1406 | "lodash.castarray": { 1407 | "version": "4.4.0", 1408 | "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", 1409 | "integrity": "sha1-wCUTUV4wna3dTCTGDP3c9ZdtkRU=" 1410 | }, 1411 | "lodash.isplainobject": { 1412 | "version": "4.0.6", 1413 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 1414 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" 1415 | }, 1416 | "lodash.merge": { 1417 | "version": "4.6.2", 1418 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 1419 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" 1420 | }, 1421 | "merge2": { 1422 | "version": "1.4.1", 1423 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 1424 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" 1425 | }, 1426 | "micromatch": { 1427 | "version": "4.0.4", 1428 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", 1429 | "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", 1430 | "requires": { 1431 | "braces": "^3.0.1", 1432 | "picomatch": "^2.2.3" 1433 | } 1434 | }, 1435 | "minimist": { 1436 | "version": "1.2.5", 1437 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1438 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 1439 | }, 1440 | "nanoid": { 1441 | "version": "3.2.0", 1442 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", 1443 | "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==" 1444 | }, 1445 | "normalize-path": { 1446 | "version": "3.0.0", 1447 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1448 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" 1449 | }, 1450 | "object-hash": { 1451 | "version": "2.2.0", 1452 | "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", 1453 | "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==" 1454 | }, 1455 | "parent-module": { 1456 | "version": "1.0.1", 1457 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1458 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1459 | "requires": { 1460 | "callsites": "^3.0.0" 1461 | } 1462 | }, 1463 | "parse-json": { 1464 | "version": "5.2.0", 1465 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", 1466 | "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", 1467 | "requires": { 1468 | "@babel/code-frame": "^7.0.0", 1469 | "error-ex": "^1.3.1", 1470 | "json-parse-even-better-errors": "^2.3.0", 1471 | "lines-and-columns": "^1.1.6" 1472 | } 1473 | }, 1474 | "path-parse": { 1475 | "version": "1.0.7", 1476 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1477 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" 1478 | }, 1479 | "path-type": { 1480 | "version": "4.0.0", 1481 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 1482 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" 1483 | }, 1484 | "picocolors": { 1485 | "version": "1.0.0", 1486 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 1487 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 1488 | }, 1489 | "picomatch": { 1490 | "version": "2.3.1", 1491 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1492 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" 1493 | }, 1494 | "postcss": { 1495 | "version": "8.4.6", 1496 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.6.tgz", 1497 | "integrity": "sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA==", 1498 | "requires": { 1499 | "nanoid": "^3.2.0", 1500 | "picocolors": "^1.0.0", 1501 | "source-map-js": "^1.0.2" 1502 | } 1503 | }, 1504 | "postcss-js": { 1505 | "version": "4.0.0", 1506 | "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", 1507 | "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", 1508 | "requires": { 1509 | "camelcase-css": "^2.0.1" 1510 | } 1511 | }, 1512 | "postcss-load-config": { 1513 | "version": "3.1.3", 1514 | "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.3.tgz", 1515 | "integrity": "sha512-5EYgaM9auHGtO//ljHH+v/aC/TQ5LHXtL7bQajNAUBKUVKiYE8rYpFms7+V26D9FncaGe2zwCoPQsFKb5zF/Hw==", 1516 | "requires": { 1517 | "lilconfig": "^2.0.4", 1518 | "yaml": "^1.10.2" 1519 | } 1520 | }, 1521 | "postcss-nested": { 1522 | "version": "5.0.6", 1523 | "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", 1524 | "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", 1525 | "requires": { 1526 | "postcss-selector-parser": "^6.0.6" 1527 | } 1528 | }, 1529 | "postcss-selector-parser": { 1530 | "version": "6.0.9", 1531 | "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz", 1532 | "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==", 1533 | "requires": { 1534 | "cssesc": "^3.0.0", 1535 | "util-deprecate": "^1.0.2" 1536 | } 1537 | }, 1538 | "postcss-value-parser": { 1539 | "version": "4.2.0", 1540 | "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", 1541 | "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" 1542 | }, 1543 | "queue-microtask": { 1544 | "version": "1.2.3", 1545 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1546 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" 1547 | }, 1548 | "quick-lru": { 1549 | "version": "5.1.1", 1550 | "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", 1551 | "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" 1552 | }, 1553 | "readdirp": { 1554 | "version": "3.6.0", 1555 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1556 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1557 | "requires": { 1558 | "picomatch": "^2.2.1" 1559 | } 1560 | }, 1561 | "resolve": { 1562 | "version": "1.22.0", 1563 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", 1564 | "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", 1565 | "requires": { 1566 | "is-core-module": "^2.8.1", 1567 | "path-parse": "^1.0.7", 1568 | "supports-preserve-symlinks-flag": "^1.0.0" 1569 | } 1570 | }, 1571 | "resolve-from": { 1572 | "version": "4.0.0", 1573 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1574 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" 1575 | }, 1576 | "reusify": { 1577 | "version": "1.0.4", 1578 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1579 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" 1580 | }, 1581 | "run-parallel": { 1582 | "version": "1.2.0", 1583 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1584 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1585 | "requires": { 1586 | "queue-microtask": "^1.2.2" 1587 | } 1588 | }, 1589 | "source-map-js": { 1590 | "version": "1.0.2", 1591 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 1592 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" 1593 | }, 1594 | "supports-color": { 1595 | "version": "7.2.0", 1596 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1597 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1598 | "requires": { 1599 | "has-flag": "^4.0.0" 1600 | } 1601 | }, 1602 | "supports-preserve-symlinks-flag": { 1603 | "version": "1.0.0", 1604 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1605 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" 1606 | }, 1607 | "tailwindcss": { 1608 | "version": "3.0.22", 1609 | "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.22.tgz", 1610 | "integrity": "sha512-F8lt74RlNZirnkaSk310+vGQta7c0/hgx7/bqxruM4wS9lp8oqV93lzavajC3VT0Lp4UUtUVIt8ifKcmGzkr0A==", 1611 | "requires": { 1612 | "arg": "^5.0.1", 1613 | "chalk": "^4.1.2", 1614 | "chokidar": "^3.5.3", 1615 | "color-name": "^1.1.4", 1616 | "cosmiconfig": "^7.0.1", 1617 | "detective": "^5.2.0", 1618 | "didyoumean": "^1.2.2", 1619 | "dlv": "^1.1.3", 1620 | "fast-glob": "^3.2.11", 1621 | "glob-parent": "^6.0.2", 1622 | "is-glob": "^4.0.3", 1623 | "normalize-path": "^3.0.0", 1624 | "object-hash": "^2.2.0", 1625 | "postcss": "^8.4.6", 1626 | "postcss-js": "^4.0.0", 1627 | "postcss-load-config": "^3.1.0", 1628 | "postcss-nested": "5.0.6", 1629 | "postcss-selector-parser": "^6.0.9", 1630 | "postcss-value-parser": "^4.2.0", 1631 | "quick-lru": "^5.1.1", 1632 | "resolve": "^1.22.0" 1633 | } 1634 | }, 1635 | "to-regex-range": { 1636 | "version": "5.0.1", 1637 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1638 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1639 | "requires": { 1640 | "is-number": "^7.0.0" 1641 | } 1642 | }, 1643 | "util-deprecate": { 1644 | "version": "1.0.2", 1645 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1646 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1647 | }, 1648 | "xtend": { 1649 | "version": "4.0.2", 1650 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1651 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" 1652 | }, 1653 | "yaml": { 1654 | "version": "1.10.2", 1655 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", 1656 | "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" 1657 | } 1658 | } 1659 | } 1660 | --------------------------------------------------------------------------------