diff --git a/.stylelintrc.js b/.stylelintrc.js index 04fb875540..77bb26c568 100644 --- a/.stylelintrc.js +++ b/.stylelintrc.js @@ -1,7 +1,11 @@ // #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/.stylelintrc.js and https://github.com/paranext/paranext-extension-template/blob/main/.stylelintrc.js module.exports = { - extends: ['stylelint-config-recommended', 'stylelint-config-sass-guidelines'], + extends: [ + 'stylelint-config-recommended', + 'stylelint-config-sass-guidelines', + 'stylelint-config-tailwindcss/scss', + ], overrides: [ { files: ['**/*.scss'], diff --git a/c-sharp/.config/dotnet-tools.json b/c-sharp/.config/dotnet-tools.json index 92ed07676b..decf14ab9c 100644 --- a/c-sharp/.config/dotnet-tools.json +++ b/c-sharp/.config/dotnet-tools.json @@ -3,7 +3,7 @@ "isRoot": true, "tools": { "csharpier": { - "version": "0.23.0", + "version": "0.29.2", "commands": ["dotnet-csharpier"] } } diff --git a/c-sharp/Checks/CheckRunner.cs b/c-sharp/Checks/CheckRunner.cs index 1374db9ae9..d97005f4b9 100644 --- a/c-sharp/Checks/CheckRunner.cs +++ b/c-sharp/Checks/CheckRunner.cs @@ -94,23 +94,20 @@ protected override ResponseToRequest HandleRequest(string functionName, JsonArra return functionName switch { - "disableCheck" - => DisableCheck( - args[0].Deserialize() ?? "", - args.Count > 1 ? args[1].Deserialize() : null - ), - "enableCheck" - => EnableCheck( - args[0].Deserialize() ?? "", - args[1].Deserialize() ?? "" - ), + "disableCheck" => DisableCheck( + args[0].Deserialize() ?? "", + args.Count > 1 ? args[1].Deserialize() : null + ), + "enableCheck" => EnableCheck( + args[0].Deserialize() ?? "", + args[1].Deserialize() ?? "" + ), "getActiveRanges" => GetActiveRanges(), "getAvailableChecks" => GetAvailableChecks(), "getCheckResults" => GetCheckResults(), - "setActiveRanges" - => SetActiveRanges( - CheckInputRangeConverter.CreateCheckInputRangeArray(args[1]) - ), + "setActiveRanges" => SetActiveRanges( + CheckInputRangeConverter.CreateCheckInputRangeArray(args[1]) + ), _ => ResponseToRequest.Failed($"Unknown function: {functionName}"), }; } diff --git a/c-sharp/JsonUtils/PrivateConstructorResolver.cs b/c-sharp/JsonUtils/PrivateConstructorResolver.cs index 8e190c7dde..f2a1f16c84 100644 --- a/c-sharp/JsonUtils/PrivateConstructorResolver.cs +++ b/c-sharp/JsonUtils/PrivateConstructorResolver.cs @@ -16,8 +16,8 @@ public override JsonTypeInfo GetTypeInfo(Type type, JsonSerializerOptions option if (jsonTypeInfo is { Kind: JsonTypeInfoKind.Object, CreateObject: null }) { if ( - jsonTypeInfo.Type - .GetConstructors(BindingFlags.Public | BindingFlags.Instance) + jsonTypeInfo + .Type.GetConstructors(BindingFlags.Public | BindingFlags.Instance) .All(c => c.GetParameters().Length > 0) ) { diff --git a/c-sharp/MessageHandlers/MessageHandlerRequestByRequestType.cs b/c-sharp/MessageHandlers/MessageHandlerRequestByRequestType.cs index aaf1a30221..4fa4fd4b49 100644 --- a/c-sharp/MessageHandlers/MessageHandlerRequestByRequestType.cs +++ b/c-sharp/MessageHandlers/MessageHandlerRequestByRequestType.cs @@ -1,6 +1,6 @@ -using Paranext.DataProvider.Messages; using System.Collections.Concurrent; using System.Text.Json; +using Paranext.DataProvider.Messages; namespace Paranext.DataProvider.MessageHandlers; diff --git a/c-sharp/Messages/MessageEventClientConnect.cs b/c-sharp/Messages/MessageEventClientConnect.cs index e4c6b477ba..e284157ebb 100644 --- a/c-sharp/Messages/MessageEventClientConnect.cs +++ b/c-sharp/Messages/MessageEventClientConnect.cs @@ -23,7 +23,7 @@ public MessageEventClientConnect(int clientId, bool didReconnect) new MessageEventClientConnectContents { ClientId = clientId, - DidReconnect = didReconnect + DidReconnect = didReconnect, } ) { } } diff --git a/c-sharp/Messages/MessageEventObjectCreated.cs b/c-sharp/Messages/MessageEventObjectCreated.cs index 25b1d2073f..292fb749b2 100644 --- a/c-sharp/Messages/MessageEventObjectCreated.cs +++ b/c-sharp/Messages/MessageEventObjectCreated.cs @@ -24,7 +24,7 @@ public MessageEventObjectCreated(string id, string objectType, string[] function { Id = id, ObjectType = objectType, - Functions = functions + Functions = functions, } ) { } } diff --git a/c-sharp/Messages/MessageEventProjectDataProviderCreated.cs b/c-sharp/Messages/MessageEventProjectDataProviderCreated.cs index cadcb74f68..6bb4f6ac5a 100644 --- a/c-sharp/Messages/MessageEventProjectDataProviderCreated.cs +++ b/c-sharp/Messages/MessageEventProjectDataProviderCreated.cs @@ -36,7 +36,7 @@ List projectInterfaces { ProjectId = projectID, ProjectInterfaces = projectInterfaces, - } + }, } ) { } } diff --git a/c-sharp/Messages/MessageEventProjectDataProviderFactoryCreated.cs b/c-sharp/Messages/MessageEventProjectDataProviderFactoryCreated.cs index 9a61b2975a..d455a2ccc9 100644 --- a/c-sharp/Messages/MessageEventProjectDataProviderFactoryCreated.cs +++ b/c-sharp/Messages/MessageEventProjectDataProviderFactoryCreated.cs @@ -34,7 +34,7 @@ List projectInterfaces Attributes = new ProjectDataProviderFactoryAttributes { ProjectInterfaces = projectInterfaces, - } + }, } ) { } } diff --git a/c-sharp/Messages/MessageResponse.cs b/c-sharp/Messages/MessageResponse.cs index 094b6b510d..d7fdfc2838 100644 --- a/c-sharp/Messages/MessageResponse.cs +++ b/c-sharp/Messages/MessageResponse.cs @@ -33,7 +33,7 @@ string errorMessage RequestId = requestId, RequesterId = requesterId, Success = false, - ErrorMessage = errorMessage + ErrorMessage = errorMessage, }; } @@ -53,7 +53,7 @@ public static MessageResponse Succeeded( RequestId = requestId, RequesterId = requesterId, Success = true, - Contents = contents + Contents = contents, }; } diff --git a/c-sharp/NetworkObjects/DataProvider.cs b/c-sharp/NetworkObjects/DataProvider.cs index 60c6d6f9cd..864e764f03 100644 --- a/c-sharp/NetworkObjects/DataProvider.cs +++ b/c-sharp/NetworkObjects/DataProvider.cs @@ -1,9 +1,9 @@ -using Paranext.DataProvider.MessageHandlers; -using Paranext.DataProvider.Messages; -using Paranext.DataProvider.MessageTransports; using System.Collections.Concurrent; using System.Text.Json; using System.Text.Json.Nodes; +using Paranext.DataProvider.MessageHandlers; +using Paranext.DataProvider.Messages; +using Paranext.DataProvider.MessageTransports; namespace Paranext.DataProvider.NetworkObjects; diff --git a/c-sharp/NetworkObjects/TimeDataProvider.cs b/c-sharp/NetworkObjects/TimeDataProvider.cs index 007493f5f2..3c53046a6c 100644 --- a/c-sharp/NetworkObjects/TimeDataProvider.cs +++ b/c-sharp/NetworkObjects/TimeDataProvider.cs @@ -38,10 +38,11 @@ protected override ResponseToRequest HandleRequest(string functionName, JsonArra { return functionName switch { - "getTime" - => ResponseToRequest.Succeeded(DateTime.Now.ToISO8601TimeFormatWithUTCString()), + "getTime" => ResponseToRequest.Succeeded( + DateTime.Now.ToISO8601TimeFormatWithUTCString() + ), "setTime" => ResponseToRequest.Failed("Cannot set the time"), - _ => ResponseToRequest.Failed($"Unexpected function: {functionName}") + _ => ResponseToRequest.Failed($"Unexpected function: {functionName}"), }; } } diff --git a/c-sharp/ParatextUtils/UsfmBookIndexer.cs b/c-sharp/ParatextUtils/UsfmBookIndexer.cs index 26ca47b97e..acbe811387 100644 --- a/c-sharp/ParatextUtils/UsfmBookIndexer.cs +++ b/c-sharp/ParatextUtils/UsfmBookIndexer.cs @@ -24,7 +24,10 @@ public UsfmBookIndexer(string usfm) #region Properties - public string Usfm { get { return _usfm;} } + public string Usfm + { + get { return _usfm; } + } #endregion @@ -119,9 +122,9 @@ private Dictionary> BuildIndexes() if (_usfm[i] != '\\') continue; - if (_usfm[i+1] == 'c') + if (_usfm[i + 1] == 'c') { - var chapterNumber = ExtractNumber(_usfm, i+2); + var chapterNumber = ExtractNumber(_usfm, i + 2); if (chapterNumber.HasValue && chapterNumber.Value > 1) { onChapter = chapterNumber.Value; @@ -129,9 +132,9 @@ private Dictionary> BuildIndexes() retVal[onChapter].Add(0, i); } } - else if (_usfm[i+1] == 'v') + else if (_usfm[i + 1] == 'v') { - var verseNumber = ExtractNumber(_usfm, i+2); + var verseNumber = ExtractNumber(_usfm, i + 2); if (verseNumber.HasValue) retVal[onChapter].Add(verseNumber.Value, i); } diff --git a/c-sharp/Projects/LocalParatextProjects.cs b/c-sharp/Projects/LocalParatextProjects.cs index d429989be9..e2a78398eb 100644 --- a/c-sharp/Projects/LocalParatextProjects.cs +++ b/c-sharp/Projects/LocalParatextProjects.cs @@ -25,7 +25,8 @@ internal class LocalParatextProjects private readonly List _requiredProjectRootFiles = ["usfm.sty", "Attribution.md"]; - private static readonly List s_paratextProjectInterfaces = [ + private static readonly List s_paratextProjectInterfaces = + [ ProjectInterfaces.BASE, ProjectInterfaces.USFM_BOOK, ProjectInterfaces.USFM_CHAPTER, @@ -33,7 +34,8 @@ internal class LocalParatextProjects ProjectInterfaces.USX_BOOK, ProjectInterfaces.USX_CHAPTER, ProjectInterfaces.USX_VERSE, - ProjectInterfaces.PLAIN_TEXT_VERSE]; + ProjectInterfaces.PLAIN_TEXT_VERSE, + ]; public LocalParatextProjects() { @@ -44,7 +46,10 @@ public LocalParatextProjects() "Paratext 9 Projects" ); - Paratext9ProjectsFolder = Path.Join(Path.GetPathRoot(Environment.CurrentDirectory), "My Paratext 9 Projects"); + Paratext9ProjectsFolder = Path.Join( + Path.GetPathRoot(Environment.CurrentDirectory), + "My Paratext 9 Projects" + ); } #endregion @@ -68,15 +73,18 @@ public virtual void Initialize(bool shouldIncludePT9ProjectsOnWindows) ParatextGlobals.Initialize(ProjectRootFolder); Console.WriteLine( - $"Projects loaded from {ProjectRootFolder}: {string.Join(",", GetScrTexts().Select(scrText => scrText.Name))}"); + $"Projects loaded from {ProjectRootFolder}: {string.Join(",", GetScrTexts().Select(scrText => scrText.Name))}" + ); // Read the projects in any locations other than project root folder - IEnumerable otherProjectDetails = - LoadOtherProjectDetails(shouldIncludePT9ProjectsOnWindows); + IEnumerable otherProjectDetails = LoadOtherProjectDetails( + shouldIncludePT9ProjectsOnWindows + ); if (otherProjectDetails.Any()) Console.WriteLine( - $"Projects found in other locations: {string.Join(",", otherProjectDetails.Select(projectDetails => projectDetails.Name))}"); + $"Projects found in other locations: {string.Join(",", otherProjectDetails.Select(projectDetails => projectDetails.Name))}" + ); foreach (ProjectDetails projectDetails in otherProjectDetails) { @@ -121,7 +129,7 @@ public static ScrText GetParatextProject(string projectId) public static List GetParatextProjectInterfaces() { - return [..s_paratextProjectInterfaces]; + return [.. s_paratextProjectInterfaces]; } #endregion @@ -149,7 +157,8 @@ protected static void CreateDirectory(string dir) #region Private properties and methods - private static IEnumerable GetScrTexts() { + private static IEnumerable GetScrTexts() + { return ScrTextCollection.ScrTexts(IncludeProjects.ScriptureOnly); } @@ -160,7 +169,7 @@ private static void AddProjectToScrTextCollection(ProjectDetails projectDetails) var projectName = new ProjectName { ShortName = projectDetails.Name, - ProjectPath = projectPath + ProjectPath = projectPath, }; ScrTextCollection.Add(new ScrText(projectName, RegistrationInfo.DefaultUser)); } @@ -169,11 +178,18 @@ private static void AddProjectToScrTextCollection(ProjectDetails projectDetails) /// Return projects that are available on disk on the local machine /// /// Enumeration of (ProjectMetadata, project directory) tuples for all projects - private IEnumerable LoadOtherProjectDetails(bool shouldIncludePT9ProjectsOnWindows) + private IEnumerable LoadOtherProjectDetails( + bool shouldIncludePT9ProjectsOnWindows + ) { // Get project info for projects outside the normal project root folder List nonPT9ProjectRootFolders = []; - if (OperatingSystem.IsWindows() && shouldIncludePT9ProjectsOnWindows && Directory.Exists(Paratext9ProjectsFolder)) nonPT9ProjectRootFolders.Add(Paratext9ProjectsFolder); + if ( + OperatingSystem.IsWindows() + && shouldIncludePT9ProjectsOnWindows + && Directory.Exists(Paratext9ProjectsFolder) + ) + nonPT9ProjectRootFolders.Add(Paratext9ProjectsFolder); foreach (var rootFolder in nonPT9ProjectRootFolders) { @@ -181,7 +197,11 @@ private IEnumerable LoadOtherProjectDetails(bool shouldIncludePT { // There are a lot of folders with underscores in the name that we should ignore in // My Paratext 9 Projects - if (rootFolder == Paratext9ProjectsFolder && Path.GetFileNameWithoutExtension(dir).StartsWith('_')) continue; + if ( + rootFolder == Paratext9ProjectsFolder + && Path.GetFileNameWithoutExtension(dir).StartsWith('_') + ) + continue; ProjectDetails? projectDetails; string errorMessage; @@ -224,7 +244,9 @@ out string errorMessage // https://github.com/ubsicap/Paratext/blob/aaadecd828a9b02e6f55d18e4c5dda8703ce2429/ParatextData/ScrText.cs#L258 // Removing extension twice because file may be in form name.id.ext to match Paratext // https://github.com/ubsicap/Paratext/blob/aaadecd828a9b02e6f55d18e4c5dda8703ce2429/ParatextData/ScrTextCollection.cs#L1661 - var shortName = Path.GetFileNameWithoutExtension(Path.GetFileNameWithoutExtension(projectHomeDir)); + var shortName = Path.GetFileNameWithoutExtension( + Path.GetFileNameWithoutExtension(projectHomeDir) + ); var idNode = settings.SelectSingleNode("/ScriptureText/Guid"); if (idNode == null) @@ -267,10 +289,7 @@ private void SetUpSampleProject() { File.Copy( filePath, - filePath.Replace( - "assets/" + projectName, - Path.Join(projectFolder) - ) + filePath.Replace("assets/" + projectName, Path.Join(projectFolder)) ); } } diff --git a/c-sharp/Projects/ParatextProjectDataProvider.cs b/c-sharp/Projects/ParatextProjectDataProvider.cs index d604f85b50..41c29a4ea2 100644 --- a/c-sharp/Projects/ParatextProjectDataProvider.cs +++ b/c-sharp/Projects/ParatextProjectDataProvider.cs @@ -74,9 +74,14 @@ protected override Task StartDataProvider() bool? shouldIncludePT9ProjectsOnWindows = false; if (OperatingSystem.IsWindows()) { - shouldIncludePT9ProjectsOnWindows = SettingsService.GetSettingValue(PapiClient, Settings.INCLUDE_MY_PARATEXT_9_PROJECTS); + shouldIncludePT9ProjectsOnWindows = SettingsService.GetSettingValue( + PapiClient, + Settings.INCLUDE_MY_PARATEXT_9_PROJECTS + ); if (!shouldIncludePT9ProjectsOnWindows.HasValue) - throw new InvalidDataException($"Setting {Settings.INCLUDE_MY_PARATEXT_9_PROJECTS} was null!"); + throw new InvalidDataException( + $"Setting {Settings.INCLUDE_MY_PARATEXT_9_PROJECTS} was null!" + ); } _paratextProjects.Initialize(shouldIncludePT9ProjectsOnWindows.Value); return Task.CompletedTask; @@ -89,7 +94,7 @@ protected override ResponseToRequest HandleRequest(string functionName, JsonArra return functionName switch { "resetSetting" => ResetProjectSetting(args[0]!.ToJsonString()), - _ => base.HandleRequest(functionName, args) + _ => base.HandleRequest(functionName, args), }; } catch (Exception e) @@ -195,15 +200,18 @@ protected virtual IProjectStreamManager CreateStreamManager(ProjectDetails proje #region Settings public static string VisibilitySettingName => Setting.Visibility.ToString(); + private void RegisterSettingsValidators() { - ProjectSettingsService.RegisterValidator(PapiClient, VisibilitySettingName, - VisibilityValidator); + ProjectSettingsService.RegisterValidator( + PapiClient, + VisibilitySettingName, + VisibilityValidator + ); - (bool result, string? error) VisibilityValidator(( - string newValueJson, - string currentValueJson, - string allChangesJson) data) + (bool result, string? error) VisibilityValidator( + (string newValueJson, string currentValueJson, string allChangesJson) data + ) { try { @@ -231,11 +239,12 @@ private void RegisterSettingsValidators() public ResponseToRequest GetProjectSetting(string jsonKey) { - var settingName = jsonKey.DeserializeFromJson() + var settingName = + jsonKey.DeserializeFromJson() ?? throw new InvalidDataException($"No project setting provided: {jsonKey}"); var paratextSettingName = - ProjectSettingsNames.GetParatextSettingNameFromPlatformBibleSettingName(settingName) ?? - settingName; + ProjectSettingsNames.GetParatextSettingNameFromPlatformBibleSettingName(settingName) + ?? settingName; var scrText = LocalParatextProjects.GetParatextProject(ProjectDetails.Metadata.Id); // ScrText always prioritizes the folder name over the Name setting as the "name" even when @@ -245,7 +254,13 @@ public ResponseToRequest GetProjectSetting(string jsonKey) if (paratextSettingName == ProjectSettingsNames.PT_NAME) return ResponseToRequest.Succeeded(scrText.Name); - if (scrText.Settings.ParametersDictionary.TryGetValue(paratextSettingName, out string? settingValue)) { + if ( + scrText.Settings.ParametersDictionary.TryGetValue( + paratextSettingName, + out string? settingValue + ) + ) + { // Paratext project setting value found, so return the value with the appropriate type if (ProjectSettingsNames.IsParatextSettingABoolean(paratextSettingName)) { @@ -253,17 +268,16 @@ public ResponseToRequest GetProjectSetting(string jsonKey) { "T" => ResponseToRequest.Succeeded(true), "F" => ResponseToRequest.Succeeded(false), - _ => ResponseToRequest.Failed($"Failed to convert Paratext setting {settingName} to boolean. Value was not T or F"), + _ => ResponseToRequest.Failed( + $"Failed to convert Paratext setting {settingName} to boolean. Value was not T or F" + ), }; } return ResponseToRequest.Succeeded(settingValue); } // Setting not found, so get the default value - string? defaultValue = ProjectSettingsService.GetDefault( - PapiClient, - settingName - ); + string? defaultValue = ProjectSettingsService.GetDefault(PapiClient, settingName); if (defaultValue == null) return ResponseToRequest.Failed($"Default value for {settingName} was null"); @@ -272,7 +286,8 @@ public ResponseToRequest GetProjectSetting(string jsonKey) public ResponseToRequest SetProjectSetting(string jsonKey, string value) { - var settingName = jsonKey.DeserializeFromJson() + var settingName = + jsonKey.DeserializeFromJson() ?? throw new InvalidDataException($"No project setting provided: {jsonKey}"); var scrText = LocalParatextProjects.GetParatextProject(ProjectDetails.Metadata.Id); @@ -284,17 +299,13 @@ public ResponseToRequest SetProjectSetting(string jsonKey, string value) var currentValueJson = currentValueResponse.Success ? currentValueResponse.Contents.SerializeToJson() : ""; - if (!ProjectSettingsService.IsValid( - PapiClient, - value, - currentValueJson, - settingName, - "")) + if (!ProjectSettingsService.IsValid(PapiClient, value, currentValueJson, settingName, "")) return ResponseToRequest.Failed($"Validation failed for {settingName}"); // Figure out which setting name to use - var paratextSettingName = ProjectSettingsNames.GetParatextSettingNameFromPlatformBibleSettingName( - settingName) ?? settingName; + var paratextSettingName = + ProjectSettingsNames.GetParatextSettingNameFromPlatformBibleSettingName(settingName) + ?? settingName; // Now actually write the setting string? errorMessage = null; @@ -311,34 +322,38 @@ public ResponseToRequest SetProjectSetting(string jsonKey, string value) // https://github.com/ubsicap/Paratext/blob/aaadecd828a9b02e6f55d18e4c5dda8703ce2429/ParatextData/ScrText.cs#L1793 RunWithinLock( WriteScope.EntireProject(scrText), - _ => { - try - { - scrText.Name = value; - } - catch (Exception ex) - { - errorMessage = ex.Message; - } - }); + _ => + { + try + { + scrText.Name = value; + } + catch (Exception ex) + { + errorMessage = ex.Message; + } + } + ); } else { RunWithinLock( WriteScope.EntireProject(scrText), - _ => { - try - { - scrText.Settings.SetSetting(paratextSettingName, value); - // We are notifying when we release our lock, so don't automatically - // notify in `Save` - scrText.Settings.Save(false); - } - catch (Exception ex) - { - errorMessage = ex.Message; - } - }); + _ => + { + try + { + scrText.Settings.SetSetting(paratextSettingName, value); + // We are notifying when we release our lock, so don't automatically + // notify in `Save` + scrText.Settings.Save(false); + } + catch (Exception ex) + { + errorMessage = ex.Message; + } + } + ); } return (errorMessage != null) @@ -351,12 +366,10 @@ public ResponseToRequest SetProjectSetting(string jsonKey, string value) // store here, though, we want to keep all properties filled in inside of Settings.xml files public ResponseToRequest ResetProjectSetting(string jsonKey) { - string settingName = jsonKey.DeserializeFromJson() + string settingName = + jsonKey.DeserializeFromJson() ?? throw new InvalidDataException($"No setting name provided: {jsonKey}"); - string? defaultValue = ProjectSettingsService.GetDefault( - PapiClient, - settingName - ); + string? defaultValue = ProjectSettingsService.GetDefault(PapiClient, settingName); if (defaultValue == null) return ResponseToRequest.Failed($"Default value for {settingName} was null"); var retVal = SetProjectSetting(jsonKey, defaultValue); @@ -383,20 +396,26 @@ public void SendFullProjectUpdateEvent() public ResponseToRequest GetBookUsfm(string jsonString) { - return GetFromScrText(jsonString, - (ScrText scrText, VerseRef verseRef) => scrText.GetText(verseRef, false, true)); + return GetFromScrText( + jsonString, + (ScrText scrText, VerseRef verseRef) => scrText.GetText(verseRef, false, true) + ); } public ResponseToRequest GetChapterUsfm(string jsonString) { - return GetFromScrText(jsonString, - (ScrText scrText, VerseRef verseRef) => scrText.GetText(verseRef, true, true)); + return GetFromScrText( + jsonString, + (ScrText scrText, VerseRef verseRef) => scrText.GetText(verseRef, true, true) + ); } public ResponseToRequest GetVerseUsfm(string jsonString) { - return GetFromScrText(jsonString, - (ScrText scrText, VerseRef verseRef) => scrText.Parser.GetVerseUsfmText(verseRef)); + return GetFromScrText( + jsonString, + (ScrText scrText, VerseRef verseRef) => scrText.Parser.GetVerseUsfmText(verseRef) + ); } public ResponseToRequest SetBookUsfm(string jsonString, string data) @@ -411,13 +430,19 @@ public ResponseToRequest SetBookUsfm(string jsonString, string data) _ => { BookSet localBooksPresentSet = scrText.Settings.LocalBooksPresentSet; - if (!localBooksPresentSet.IsSelected(verseRef.BookNum) && !scrText.Creatable(verseRef.BookNum)) + if ( + !localBooksPresentSet.IsSelected(verseRef.BookNum) + && !scrText.Creatable(verseRef.BookNum) + ) throw new InvalidOperationException($"{verseRef.Book} cannot be created"); if (!scrText.Writable(verseRef.BookNum, 0)) throw new InvalidOperationException($"{verseRef.Book} is not writable"); if (!scrText.Settings.Editable) throw new InvalidOperationException($"{verseRef.Book} is not editable"); - byte[] rawData = scrText.Settings.Encoder.Convert(data, out string errorMessage); + byte[] rawData = scrText.Settings.Encoder.Convert( + data, + out string errorMessage + ); if (!string.IsNullOrEmpty(errorMessage)) throw new InvalidOperationException(errorMessage); string bookFilePath = scrText.Settings.BookFileName(verseRef.BookNum, true); @@ -445,19 +470,15 @@ public ResponseToRequest SetChapterUsfm(string jsonString, string data) WriteScope.EntireProject(scrText), writeLock => { - scrText.PutText( - verseRef.BookNum, - verseRef.ChapterNum, - false, - data, - writeLock - ); + scrText.PutText(verseRef.BookNum, verseRef.ChapterNum, false, data, writeLock); } ); } catch (Exception e) when (e is ArgumentException or ProjectNotFoundException) { - return ResponseToRequest.Failed($"Project with ID '{ProjectDetails.Metadata.Id}' was not found"); + return ResponseToRequest.Failed( + $"Project with ID '{ProjectDetails.Metadata.Id}' was not found" + ); } // The value of returned strings are case-sensitive and cannot change unless data provider subscriptions change @@ -470,14 +491,18 @@ public ResponseToRequest SetChapterUsfm(string jsonString, string data) public ResponseToRequest GetBookUsx(string jsonString) { - return GetFromScrText(jsonString, - (ScrText scrText, VerseRef verseRef) => ConvertUsfmToUsx(scrText, verseRef, false)); + return GetFromScrText( + jsonString, + (ScrText scrText, VerseRef verseRef) => ConvertUsfmToUsx(scrText, verseRef, false) + ); } public ResponseToRequest GetChapterUsx(string jsonString) { - return GetFromScrText(jsonString, - (ScrText scrText, VerseRef verseRef) => ConvertUsfmToUsx(scrText, verseRef, true)); + return GetFromScrText( + jsonString, + (ScrText scrText, VerseRef verseRef) => ConvertUsfmToUsx(scrText, verseRef, true) + ); } public ResponseToRequest GetVerseUsx(string jsonString) @@ -514,7 +539,8 @@ public ResponseToRequest SetChapterUsx(string jsonString, string data) { var usfm = ConvertUsxToUsfm(scrText, verseRef, data); scrText.PutText(verseRef.BookNum, verseRef.ChapterNum, true, usfm, writeLock); - }); + } + ); } catch (Exception e) when (e is ArgumentException or ProjectNotFoundException) { @@ -532,15 +558,20 @@ public ResponseToRequest SetChapterUsx(string jsonString, string data) public ResponseToRequest GetVersePlainText(string jsonString) { - return GetFromScrText(jsonString, - (ScrText scrText, VerseRef verseRef) => scrText.GetVerseText(verseRef)); + return GetFromScrText( + jsonString, + (ScrText scrText, VerseRef verseRef) => scrText.GetVerseText(verseRef) + ); } #endregion #region Private helper methods - private ResponseToRequest GetFromScrText(string verseRefJson, Func getTextFromScrText) + private ResponseToRequest GetFromScrText( + string verseRefJson, + Func getTextFromScrText + ) { var verseRef = verseRefJson.DeserializeFromJson(); try @@ -550,7 +581,9 @@ private ResponseToRequest GetFromScrText(string verseRefJson, Func{allXmlData.Substring(verseIndex, nextVerseIndex - verseIndex)}"; diff --git a/c-sharp/Projects/ProjectDataProviderFactory.cs b/c-sharp/Projects/ProjectDataProviderFactory.cs index 6ffb84122d..ab1e739595 100644 --- a/c-sharp/Projects/ProjectDataProviderFactory.cs +++ b/c-sharp/Projects/ProjectDataProviderFactory.cs @@ -15,7 +15,11 @@ internal abstract class ProjectDataProviderFactory : NetworkObject private readonly List _projectInterfaces; private readonly string _pdpfName; - protected ProjectDataProviderFactory(List projectInterfaces, string pdpfName, PapiClient papiClient) + protected ProjectDataProviderFactory( + List projectInterfaces, + string pdpfName, + PapiClient papiClient + ) : base(papiClient) { _projectInterfaces = projectInterfaces; diff --git a/c-sharp/Projects/RawDirectoryProjectStreamManager.cs b/c-sharp/Projects/RawDirectoryProjectStreamManager.cs index 9c56a4728d..420a627781 100644 --- a/c-sharp/Projects/RawDirectoryProjectStreamManager.cs +++ b/c-sharp/Projects/RawDirectoryProjectStreamManager.cs @@ -38,7 +38,7 @@ public string[] GetExistingDataStreamNames() // TODO: This doesn't seem to be us { MatchType = MatchType.Simple, RecurseSubdirectories = true, - ReturnSpecialDirectories = false + ReturnSpecialDirectories = false, } ); diff --git a/c-sharp/Services/LocalizationService.cs b/c-sharp/Services/LocalizationService.cs index 488d2daf9c..ea68838e17 100644 --- a/c-sharp/Services/LocalizationService.cs +++ b/c-sharp/Services/LocalizationService.cs @@ -17,7 +17,12 @@ internal static class LocalizationService /// Default value if the key comes back as the value or the request fails /// if set to `true`, will throw errors instead of ignoring and returning default value. Defaults to `false` /// - public static string GetLocalizedString(PapiClient papiClient, string key, string? defaultValue = null, bool shouldThrowErrors = false) + public static string GetLocalizedString( + PapiClient papiClient, + string key, + string? defaultValue = null, + bool shouldThrowErrors = false + ) { string value = defaultValue ?? key; TaskCompletionSource taskSource = new(); @@ -47,7 +52,8 @@ public static string GetLocalizedString(PapiClient papiClient, string key, strin { if (shouldThrowErrors) taskSource.TrySetException(ex); - else { + else + { Trace.TraceError(ex.Message); taskSource.TrySetResult(); } diff --git a/c-sharp/Services/PersistedParatextDataSettings.cs b/c-sharp/Services/PersistedParatextDataSettings.cs index f64c71389d..899c926262 100644 --- a/c-sharp/Services/PersistedParatextDataSettings.cs +++ b/c-sharp/Services/PersistedParatextDataSettings.cs @@ -6,10 +6,11 @@ namespace Paranext.DataProvider.Services; internal class PersistedParatextDataSettings(PapiClient papiClient) : IParatextDataSettings { - public SerializableStringDictionary LastRegistryDataCachedTimes { get; set; } = SettingsService.GetSettingObject( - papiClient, - Settings.PARATEXT_DATA_LAST_REGISTRY_DATA_CACHED_TIMES - ) ?? []; + public SerializableStringDictionary LastRegistryDataCachedTimes { get; set; } = + SettingsService.GetSettingObject( + papiClient, + Settings.PARATEXT_DATA_LAST_REGISTRY_DATA_CACHED_TIMES + ) ?? []; public void SafeSave() { diff --git a/c-sharp/Services/PersistedPtxUtilsSettings.cs b/c-sharp/Services/PersistedPtxUtilsSettings.cs index 63c21ba916..75284b8bd5 100644 --- a/c-sharp/Services/PersistedPtxUtilsSettings.cs +++ b/c-sharp/Services/PersistedPtxUtilsSettings.cs @@ -5,10 +5,11 @@ namespace Paranext.DataProvider.Services; internal class PersistedPtxUtilsSettings(PapiClient papiClient) : IPtxUtilsSettings { - public SerializableStringDictionary MementoData { get; set;} = SettingsService.GetSettingObject( - papiClient, - Settings.PTX_UTILS_MEMENTO_DATA - ) ?? []; + public SerializableStringDictionary MementoData { get; set; } = + SettingsService.GetSettingObject( + papiClient, + Settings.PTX_UTILS_MEMENTO_DATA + ) ?? []; public bool UpgradeNeeded { diff --git a/c-sharp/Services/ProjectSettingsNames.cs b/c-sharp/Services/ProjectSettingsNames.cs index 4fa972f982..d635a99e20 100644 --- a/c-sharp/Services/ProjectSettingsNames.cs +++ b/c-sharp/Services/ProjectSettingsNames.cs @@ -35,7 +35,13 @@ public sealed class ProjectSettingsNames /// /// Paratext setting names that are either T or F and need to be converted to booleans /// - private static readonly HashSet s_ptSettingBooleans = ["Editable", "MatchBasedOnStems", "AllowReadAccess", "AllowSharingWithSLDR", ]; + private static readonly HashSet s_ptSettingBooleans = + [ + "Editable", + "MatchBasedOnStems", + "AllowReadAccess", + "AllowSharingWithSLDR", + ]; // Make sure this dictionary gets updated whenever new settings are added private static readonly Dictionary s_platformBibleToParatextSettingsNames = diff --git a/c-sharp/Services/ProjectSettingsService.cs b/c-sharp/Services/ProjectSettingsService.cs index 9a5f0684bd..71fbdf0b55 100644 --- a/c-sharp/Services/ProjectSettingsService.cs +++ b/c-sharp/Services/ProjectSettingsService.cs @@ -42,7 +42,7 @@ string allChangesJson papiClient.SendRequest( PROJECT_SETTINGS_SERVICE, - new object[] { "isValid", key, newValueJson, currentValueJson, allChangesJson, }, + new object[] { "isValid", key, newValueJson, currentValueJson, allChangesJson }, (bool success, object? returnValue) => { try @@ -142,7 +142,8 @@ ResponseToRequest requestHandler(JsonElement jsonElement) { // Check if the JsonElement is an array if ( - jsonElement.ValueKind != JsonValueKind.Array || jsonElement.GetArrayLength() < 3 + jsonElement.ValueKind != JsonValueKind.Array + || jsonElement.GetArrayLength() < 3 ) { return ResponseToRequest.Failed( diff --git a/extensions/.stylelintrc.cjs b/extensions/.stylelintrc.cjs index 1c386816f5..a8534cc879 100644 --- a/extensions/.stylelintrc.cjs +++ b/extensions/.stylelintrc.cjs @@ -1,7 +1,11 @@ // #region shared with https://github.com/paranext/paranext-core/blob/main/.stylelintrc.js and https://github.com/paranext/paranext-extension-template/blob/main/.stylelintrc.js module.exports = { - extends: ['stylelint-config-recommended', 'stylelint-config-sass-guidelines'], + extends: [ + 'stylelint-config-recommended', + 'stylelint-config-sass-guidelines', + 'stylelint-config-tailwindcss/scss', + ], overrides: [ { files: ['**/*.scss'], diff --git a/extensions/.vscode/settings.json b/extensions/.vscode/settings.json index cefc6be5ed..89083d1150 100644 --- a/extensions/.vscode/settings.json +++ b/extensions/.vscode/settings.json @@ -1,4 +1,6 @@ { + "css.customData": [".vscode/tailwindcss.json"], + "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true, "editor.rulers": [100], diff --git a/extensions/.vscode/tailwindcss.json b/extensions/.vscode/tailwindcss.json new file mode 100644 index 0000000000..83f02d51a9 --- /dev/null +++ b/extensions/.vscode/tailwindcss.json @@ -0,0 +1,56 @@ +{ + "version": 1.1, + "credit": "https://duncanleung.com/tailwind-css-unknown-at-rule/", + "atDirectives": [ + { + "name": "@tailwind", + "description": "Use the `@tailwind` directive to insert Tailwind's `base`, `components`, `utilities` and `screens` styles into your CSS.", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#tailwind" + } + ] + }, + { + "name": "@apply", + "description": "Use the `@apply` directive to inline any existing utility classes into your own custom CSS. This is useful when you find a common utility pattern in your HTML that you’d like to extract to a new component.", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#apply" + } + ] + }, + { + "name": "@responsive", + "description": "You can generate responsive variants of your own classes by wrapping their definitions in the `@responsive` directive:\n```css\n@responsive {\n .alert {\n background-color: #E53E3E;\n }\n}\n```\n", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#responsive" + } + ] + }, + { + "name": "@screen", + "description": "The `@screen` directive allows you to create media queries that reference your breakpoints by **name** instead of duplicating their values in your own CSS:\n```css\n@screen sm {\n /* ... */\n}\n```\n…gets transformed into this:\n```css\n@media (min-width: 640px) {\n /* ... */\n}\n```\n", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#screen" + } + ] + }, + { + "name": "@variants", + "description": "Generate `hover`, `focus`, `active` and other **variants** of your own utilities by wrapping their definitions in the `@variants` directive:\n```css\n@variants hover, focus {\n .btn-brand {\n background-color: #3182CE;\n }\n}\n```\n", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#variants" + } + ] + } + ] +} diff --git a/extensions/README.md b/extensions/README.md index f52a337a4a..a10a357bc0 100644 --- a/extensions/README.md +++ b/extensions/README.md @@ -1,6 +1,52 @@ # paranext-core/extensions -Official extensions provided by Paranext +Official extensions provided by Paranext. + + ## Summary @@ -168,6 +214,22 @@ Platform.Bible WebViews must be treated differently than other code, so this pro - Note: while watching for changes, if you add a new `.web-view.tsx` file, you must either restart webpack or make a nominal change and save in an existing `.web-view.tsx` file for webpack to discover and bundle this new file. - WebView code and styles must be provided to the `papi` as strings, so you can import WebView files with [`?inline`](#special-imports) after the file path to import the file as a string. +### Built-in Tailwind CSS support + +This project is equipped with [Tailwind CSS](https://tailwindcss.com/) configured the same way it is configured in Platform.Bible's React component library `platform-bible-react` to enable WebViews to match Platform.Bible's look and feel. To add Tailwind CSS to your WebView, simply import your extension's `./src/tailwind.scss` file into your WebView's style `.scss` file: + +```scss +@import './path/to/src/tailwind.scss'; +``` + +Adding this import to your WebView's styles enables Tailwind CSS in the WebView. Important Tailwind configuration notes: + +- This project's Tailwind's configuration is set up with the prefix `tw-`, so all Tailwind classes must have `tw-` at the beginning (e.g. `tw-bg-purple-500`). +- [Tailwind's preflight](https://tailwindcss.com/docs/preflight) is enabled by default, meaning some default HTML tag styles are significantly modified. You can [disable it](https://tailwindcss.com/docs/preflight#disabling-preflight) or [restrict its scope](https://www.npmjs.com/package/tailwindcss-scoped-preflight) if desired. However, we generally recommend instead using [`@tailwindcss/typography`](https://github.com/tailwindlabs/tailwindcss-typography), included in this project's Tailwind configuration by default, when displaying flowing content. +- You can apply theme colors using Tailwind classes corresponding to the CSS property and theme color variable name like `tw-bg-primary`. + +Please see the wiki's [Tailwind CSS in Web Views](https://github.com/paranext/paranext-extension-template/wiki/Extension-Anatomy#web-view-component) page for more information about using Tailwind in your web view. + ### Special imports - Adding `?inline` to the end of a file import causes that file to be imported as a string after being transformed by webpack loaders but before bundling dependencies (except if that file is a React WebView file, in which case dependencies will be bundled). The contents of the file will be on the file's default export. diff --git a/extensions/package.json b/extensions/package.json index 43df15a87b..831477faef 100644 --- a/extensions/package.json +++ b/extensions/package.json @@ -46,29 +46,37 @@ "@emotion/react": "^11.11.4", "@emotion/styled": "^11.11.0", "@mui/material": "^5.15.10", - "@swc/core": "^1.7.26", - "@types/node": "^20.16.10", + "@swc/core": "^1.7.35", + "@tailwindcss/typography": "^0.5.15", + "@types/node": "^20.16.11", "@types/react": "^18.3.11", - "@types/react-dom": "^18.3.0", + "@types/react-dom": "^18.3.1", "@types/webpack": "^5.28.5", "@typescript-eslint/parser": "^6.21.0", + "autoprefixer": "^10.4.20", "concurrently": "^9.0.1", "copy-webpack-plugin": "^12.0.2", "cross-env": "^7.0.3", "css-loader": "^6.11.0", "escape-string-regexp": "^5.0.0", "glob": "^10.4.5", + "lucide-react": "^0.452.0", "papi-dts": "file:../lib/papi-dts", "platform-bible-react": "file:../lib/platform-bible-react", + "postcss": "^8.4.47", + "postcss-loader": "^8.1.1", "prettier": "^3.3.3", "prettier-plugin-jsdoc": "^1.3.0", "replace-in-file": "^7.2.0", - "sass": "^1.78.0", - "sass-loader": "^14.2.1", - "stylelint": "^16.9.0", + "sass": "^1.79.5", + "sass-loader": "^16.0.2", + "stylelint": "^16.10.0", "stylelint-config-recommended": "^14.0.1", "stylelint-config-sass-guidelines": "^12.1.0", + "stylelint-config-tailwindcss": "^0.0.7", "swc-loader": "^0.2.6", + "tailwindcss": "^3.4.13", + "tailwindcss-animate": "^1.0.7", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", "tsconfig-paths-webpack-plugin": "^4.1.0", diff --git a/extensions/postcss.config.ts b/extensions/postcss.config.ts new file mode 100644 index 0000000000..65ea2a1763 --- /dev/null +++ b/extensions/postcss.config.ts @@ -0,0 +1,12 @@ +// #region shared with https://github.com/paranext/paranext-extension-template/blob/main/postcss.config.js and https://github.com/paranext/paranext-core/blob/main/lib/platform-bible-react/postcss.config.js + +const config = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; + +export default config; + +// #endregion diff --git a/extensions/src/hello-someone/.stylelintrc.js b/extensions/src/hello-someone/.stylelintrc.js index 70f5dd2d0e..7161ad789c 100644 --- a/extensions/src/hello-someone/.stylelintrc.js +++ b/extensions/src/hello-someone/.stylelintrc.js @@ -1,7 +1,11 @@ // #region shared with https://github.com/paranext/paranext-core/blob/main/.stylelintrc.js and https://github.com/paranext/paranext-multi-extension-template/blob/main/.stylelintrc.cjs module.exports = { - extends: ['stylelint-config-recommended', 'stylelint-config-sass-guidelines'], + extends: [ + 'stylelint-config-recommended', + 'stylelint-config-sass-guidelines', + 'stylelint-config-tailwindcss/scss', + ], overrides: [ { files: ['**/*.scss'], diff --git a/extensions/src/hello-someone/.vscode/settings.json b/extensions/src/hello-someone/.vscode/settings.json index cefc6be5ed..89083d1150 100644 --- a/extensions/src/hello-someone/.vscode/settings.json +++ b/extensions/src/hello-someone/.vscode/settings.json @@ -1,4 +1,6 @@ { + "css.customData": [".vscode/tailwindcss.json"], + "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true, "editor.rulers": [100], diff --git a/extensions/src/hello-someone/.vscode/tailwindcss.json b/extensions/src/hello-someone/.vscode/tailwindcss.json new file mode 100644 index 0000000000..83f02d51a9 --- /dev/null +++ b/extensions/src/hello-someone/.vscode/tailwindcss.json @@ -0,0 +1,56 @@ +{ + "version": 1.1, + "credit": "https://duncanleung.com/tailwind-css-unknown-at-rule/", + "atDirectives": [ + { + "name": "@tailwind", + "description": "Use the `@tailwind` directive to insert Tailwind's `base`, `components`, `utilities` and `screens` styles into your CSS.", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#tailwind" + } + ] + }, + { + "name": "@apply", + "description": "Use the `@apply` directive to inline any existing utility classes into your own custom CSS. This is useful when you find a common utility pattern in your HTML that you’d like to extract to a new component.", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#apply" + } + ] + }, + { + "name": "@responsive", + "description": "You can generate responsive variants of your own classes by wrapping their definitions in the `@responsive` directive:\n```css\n@responsive {\n .alert {\n background-color: #E53E3E;\n }\n}\n```\n", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#responsive" + } + ] + }, + { + "name": "@screen", + "description": "The `@screen` directive allows you to create media queries that reference your breakpoints by **name** instead of duplicating their values in your own CSS:\n```css\n@screen sm {\n /* ... */\n}\n```\n…gets transformed into this:\n```css\n@media (min-width: 640px) {\n /* ... */\n}\n```\n", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#screen" + } + ] + }, + { + "name": "@variants", + "description": "Generate `hover`, `focus`, `active` and other **variants** of your own utilities by wrapping their definitions in the `@variants` directive:\n```css\n@variants hover, focus {\n .btn-brand {\n background-color: #3182CE;\n }\n}\n```\n", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#variants" + } + ] + } + ] +} diff --git a/extensions/src/hello-someone/README.md b/extensions/src/hello-someone/README.md index 958bbe4116..52f722b82d 100644 --- a/extensions/src/hello-someone/README.md +++ b/extensions/src/hello-someone/README.md @@ -71,7 +71,7 @@ The `manifest.json` and `package.json` files contain information specific to you #### Hide Template Info -Once finished customizing this template to be your own, you can uncomment the [HTML comment tag](https://www.w3schools.com/html/html_comments.asp) above the [Template Info](#template-info) section to hide this template-related info in this readme. You can do this by clicking on the line and doing CTRL + / in VS Code. You can also do this manually by removing the first opening '<!--' and the only closing '-->' on the line. Leaving this info commented in your readme will hide it in your readme while avoiding merge conflicts if you decide to [update this extension from the template](#to-update-this-extension-from-the-template) in the future. If you never want to update this extension from the template, you can remove the [Template Info](#template-info) section and sub-sections of this readme. +Once finished customizing this template to be your own, you can uncomment the [HTML comment tag](https://www.w3schools.com/html/html_comments.asp) above the [Template Info](#template-info) section to hide this template-related info in this readme. You can do this by clicking on the line and doing CTRL + / in VS Code. You can also do this manually by removing the first opening '<!--' and the only closing '-->' on the line. Leaving this info commented in your readme will hide it in your readme while avoiding merge conflicts if you decide to [update this extension from the template](#to-update-this-extension-from-the-template) in the future. If you never want to update this extension from the template, you can remove the [Template Info](#template-info) section and sub-sections of this readme. Note: if you [update this extension from the template](#to-update-this-extension-from-the-template), there may be important changes in this section like additional customizations you must make to this extension. Please keep an eye out for readme changes when updating from the template. diff --git a/extensions/src/hello-someone/package.json b/extensions/src/hello-someone/package.json index e3af7920d4..4687aec00b 100644 --- a/extensions/src/hello-someone/package.json +++ b/extensions/src/hello-someone/package.json @@ -35,13 +35,15 @@ "platform-bible-utils": "file:../../../lib/platform-bible-utils" }, "devDependencies": { - "@swc/core": "^1.7.26", - "@types/node": "^20.16.10", + "@swc/core": "^1.7.35", + "@tailwindcss/typography": "^0.5.15", + "@types/node": "^20.16.11", "@types/react": "^18.3.11", - "@types/react-dom": "^18.3.0", + "@types/react-dom": "^18.3.1", "@types/webpack": "^5.28.5", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", + "autoprefixer": "^10.4.20", "concurrently": "^9.0.1", "copy-webpack-plugin": "^12.0.2", "cross-env": "^7.0.3", @@ -52,7 +54,7 @@ "eslint-config-erb": "^4.1.0", "eslint-import-resolver-typescript": "^3.6.3", "eslint-plugin-compat": "^4.2.0", - "eslint-plugin-import": "^2.30.0", + "eslint-plugin-import": "^2.31.0", "eslint-plugin-jest": "^27.9.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-no-null": "^1.0.2", @@ -61,16 +63,22 @@ "eslint-plugin-react": "^7.37.1", "eslint-plugin-react-hooks": "^4.6.2", "glob": "^10.4.5", + "lucide-react": "^0.452.0", "papi-dts": "file:../../../lib/papi-dts", "platform-bible-react": "file:../../../lib/platform-bible-react", + "postcss": "^8.4.47", + "postcss-loader": "^8.1.1", "prettier": "^3.3.3", "prettier-plugin-jsdoc": "^1.3.0", - "sass": "^1.78.0", - "sass-loader": "^14.2.1", - "stylelint": "^16.9.0", + "sass": "^1.79.5", + "sass-loader": "^16.0.2", + "stylelint": "^16.10.0", "stylelint-config-recommended": "^14.0.1", "stylelint-config-sass-guidelines": "^12.1.0", + "stylelint-config-tailwindcss": "^0.0.7", "swc-loader": "^0.2.6", + "tailwindcss": "^3.4.13", + "tailwindcss-animate": "^1.0.7", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", "tsconfig-paths-webpack-plugin": "^4.1.0", diff --git a/extensions/src/hello-someone/postcss.config.ts b/extensions/src/hello-someone/postcss.config.ts new file mode 100644 index 0000000000..6b6f0992eb --- /dev/null +++ b/extensions/src/hello-someone/postcss.config.ts @@ -0,0 +1,12 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/postcss.config.js and https://github.com/paranext/paranext-core/blob/main/lib/platform-bible-react/postcss.config.js + +const config = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; + +export default config; + +// #endregion diff --git a/extensions/src/hello-someone/src/tailwind.scss b/extensions/src/hello-someone/src/tailwind.scss new file mode 100644 index 0000000000..22f74a02c1 --- /dev/null +++ b/extensions/src/hello-someone/src/tailwind.scss @@ -0,0 +1,140 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +/* #region shared with https://github.com/paranext/paranext-core/blob/main/lib/platform-bible-react/src/index.css */ + +@layer base { + @font-face { + font-family: 'Inter'; + font-display: 'swap'; + src: url('https://fonts.googleapis.com/css2?family=Inter:wght@100..900&display=swap'); + } + + /* + * Theme colors in Platform.Bible. These are applied in CSS properties using `hsl(var(--varName))` + * or Tailwind classes like `tw-bg-primary` + * + * See the wiki's + * [Matching Application Theme](https://github.com/paranext/paranext-extension-template/wiki/Extension-Anatomy#matching-application-theme) + * section for more information + */ + :root { + --background: 0 0% 100%; + --foreground: 222.2 84% 4.9%; + + --card: 0 0% 100%; + --card-foreground: 222.2 84% 4.9%; + + --popover: 0 0% 100%; + --popover-foreground: 222.2 84% 4.9%; + + --primary: 222.2 47.4% 11.2%; + --primary-foreground: 210 40% 98%; + + --secondary: 210 40% 96.1%; + --secondary-foreground: 222.2 47.4% 11.2%; + + --muted: 210 40% 96.1%; + --muted-foreground: 215.4 16.3% 46.9%; + + --accent: 210 40% 96.1%; + --accent-foreground: 222.2 47.4% 11.2%; + + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 210 40% 98%; + + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + --ring: 222.2 84% 4.9%; + + --radius: 0.5rem; + } + + .dark { + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + + --card: 222.2 84% 4.9%; + --card-foreground: 210 40% 98%; + + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + + --primary: 210 40% 98%; + --primary-foreground: 222.2 47.4% 11.2%; + + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + + --accent: 217.2 32.6% 17.5%; + --accent-foreground: 210 40% 98%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + + --border: 217.2 32.6% 17.5%; + --input: 217.2 32.6% 17.5%; + --ring: 212.7 26.8% 83.9%; + } + + /* using color palette https://supercolorpalette.com/?scp=G0-hsl-99827A-E7DDD0-FEF4E7-FEFAF1-FFFFFF-D8E9E3-719892-07463D-0A433D-083030-041616-000000-85DBB8-F2F52E-CD3737 */ + .paratext-light { + --background: 0 0% 100%; + --foreground: 0 0% 0%; + --muted: 33.9 32.4% 86.1%; + --muted-foreground: 15.5 13.2% 53.9%; + --popover: 0 0% 100%; + --popover-foreground: 0 0% 0%; + --card: 0 0% 100%; + --card-foreground: 0 0% 0%; + --border: 220 13% 91%; + --input: 161.3 26.7% 88.2%; + --primary: 173.4 82.1% 15.3%; + --primary-foreground: 40 85.7% 97.3%; + --secondary: 161.3 26.7% 88.2%; + --secondary-foreground: 173.4 82.1% 15.3%; + --accent: 161.3 26.7% 88.2%; + --accent-foreground: 173.4 82.1% 15.3%; + --destructive: 0 60% 51%; + --destructive-foreground: 210 20% 98%; + --ring: 13.5 13.2% 53.9%; + } + + .paratext-dark { + --background: 0 0% 0%; + --foreground: 0 0% 100%; + --muted: 15.5 13.2% 53.9%; + --muted-foreground: 33.9 32.4% 86.1%; + --popover: 180 71.4% 5%; + --popover-foreground: 0 0% 100%; + --card: 0 0% 0%; + --card-foreground: 0 0% 100%; + --border: 220 13% 20%; + --input: 220 13% 20%; + --primary: 161.3 26.7% 88.2%; + --primary-foreground: 173.4 82.1% 15.3%; + --secondary: 180 71.4% 11%; + --secondary-foreground: 161.3 26.7% 88.2%; + --accent: 180 71.4% 11%; + --accent-foreground: 161.3 26.7% 88.2%; + --destructive: 0 60% 51%; + --destructive-foreground: 210 20% 98%; + --ring: 13.5 13.2% 53.9%; + } +} + +@layer base { + * { + @apply tw-border-border; + } + + body { + @apply tw-bg-background tw-text-foreground; + } +} + +/* #endregion */ diff --git a/extensions/src/hello-someone/tailwind.config.ts b/extensions/src/hello-someone/tailwind.config.ts new file mode 100644 index 0000000000..d9c586c403 --- /dev/null +++ b/extensions/src/hello-someone/tailwind.config.ts @@ -0,0 +1,93 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/tailwind.config.ts + +// #region shared with https://github.com/paranext/paranext-core/blob/main/lib/platform-bible-react/tailwind.config.ts + +import { Config } from 'tailwindcss'; +import typography from '@tailwindcss/typography'; +import tailwindCssAnimate from 'tailwindcss-animate'; + +const config: Config = { + content: ['./src/**/*.{js,ts,jsx,tsx}'], + // Prefix on all tailwind classes so they don't clash with built-in classes + // short for tailwind - we hope to have the same prefix as users of this library so the cn + // function that uses tailwind-merge can properly overwrite related tailwind classes + prefix: 'tw-', + // Theme from shadcn/ui + theme: { + container: { + center: true, + padding: '2rem', + screens: { + '2xl': '1400px', + }, + }, + extend: { + colors: { + border: 'hsl(var(--border))', + input: 'hsl(var(--input))', + ring: 'hsl(var(--ring))', + background: 'hsl(var(--background))', + foreground: 'hsl(var(--foreground))', + primary: { + DEFAULT: 'hsl(var(--primary))', + foreground: 'hsl(var(--primary-foreground))', + }, + secondary: { + DEFAULT: 'hsl(var(--secondary))', + foreground: 'hsl(var(--secondary-foreground))', + }, + destructive: { + DEFAULT: 'hsl(var(--destructive))', + foreground: 'hsl(var(--destructive-foreground))', + }, + muted: { + DEFAULT: 'hsl(var(--muted))', + foreground: 'hsl(var(--muted-foreground))', + }, + accent: { + DEFAULT: 'hsl(var(--accent))', + foreground: 'hsl(var(--accent-foreground))', + }, + popover: { + DEFAULT: 'hsl(var(--popover))', + foreground: 'hsl(var(--popover-foreground))', + }, + card: { + DEFAULT: 'hsl(var(--card))', + foreground: 'hsl(var(--card-foreground))', + }, + }, + borderRadius: { + lg: 'var(--radius)', + md: 'calc(var(--radius) - 2px)', + sm: 'calc(var(--radius) - 4px)', + }, + keyframes: { + 'accordion-down': { + from: { height: '0' }, + to: { height: 'var(--radix-accordion-content-height)' }, + }, + 'accordion-up': { + from: { height: 'var(--radix-accordion-content-height)' }, + to: { height: '0' }, + }, + }, + animation: { + 'accordion-down': 'accordion-down 0.2s ease-out', + 'accordion-up': 'accordion-up 0.2s ease-out', + }, + }, + }, + plugins: [ + // Prose styles as sensible defaults for markdown renderer component + typography(), + // Animations in tailwind style + tailwindCssAnimate, + + // #endregion + ], +}; + +export default config; + +// #endregion diff --git a/extensions/src/hello-someone/webpack/webpack.config.base.ts b/extensions/src/hello-someone/webpack/webpack.config.base.ts index 3eafc61c32..fc52d7d847 100644 --- a/extensions/src/hello-someone/webpack/webpack.config.base.ts +++ b/extensions/src/hello-someone/webpack/webpack.config.base.ts @@ -1,8 +1,9 @@ -// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/webpack/webpack.config.base.ts - import path from 'path'; import TsconfigPathsPlugin from 'tsconfig-paths-webpack-plugin'; import webpack from 'webpack'; +import { LIBRARY_TYPE } from './webpack.util'; + +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/webpack/webpack.config.base.ts const isDev = process.env.NODE_ENV !== 'production'; const shouldGenerateSourceMaps = isDev || process.env.DEBUG_PROD; @@ -10,16 +11,6 @@ const shouldGenerateSourceMaps = isDev || process.env.DEBUG_PROD; /** The base directory from which webpack should operate (should be the root repo folder) */ export const rootDir = path.resolve(__dirname, '..'); -/** - * The module format of library we want webpack to use for externals and create for our extensions - * - * @see webpack.Configuration['externalsType'] for info about external import format - * @see webpack.LibraryOptions['type'] for info about library format - */ -// commonjs-static formats the code to export everything on module.exports. so it works -// well in cjs or esm https://webpack.js.org/configuration/output/#type-commonjs-static -export const LIBRARY_TYPE: NonNullable = 'commonjs-static'; - // Note: we do not want to do any chunking because neither webViews nor main can import dependencies // other than those listed in configBase.externals. Each webView must contain all its dependency // code, and main must contain all its dependency code. @@ -98,6 +89,8 @@ const configBase: webpack.Configuration = { // into dom. style-loader would add html style elements for our styles if we used it // We are not using css-loader since we are getting style files using ?inline. css-loader // would allow us to import CSS into CommonJS + // Processes style transformations in PostCSS - after scss so PostCSS runs on just css + 'postcss-loader', // Compiles Sass to CSS 'sass-loader', ], diff --git a/extensions/src/hello-someone/webpack/webpack.config.main.ts b/extensions/src/hello-someone/webpack/webpack.config.main.ts index 5a25bc6dde..ec85634147 100644 --- a/extensions/src/hello-someone/webpack/webpack.config.main.ts +++ b/extensions/src/hello-someone/webpack/webpack.config.main.ts @@ -2,9 +2,9 @@ import webpack from 'webpack'; import path from 'path'; import merge from 'webpack-merge'; import CopyPlugin from 'copy-webpack-plugin'; -import configBase, { LIBRARY_TYPE, rootDir } from './webpack.config.base'; +import configBase, { rootDir } from './webpack.config.base'; import WebViewResolveWebpackPlugin from './web-view-resolve-webpack-plugin'; -import { outputFolder } from './webpack.util'; +import { LIBRARY_TYPE, outputFolder } from './webpack.util'; /** Webpack configuration for building main */ const configMain: webpack.Configuration = merge(configBase, { diff --git a/extensions/src/hello-someone/webpack/webpack.util.ts b/extensions/src/hello-someone/webpack/webpack.util.ts index cf465e3832..ea78e4acc3 100644 --- a/extensions/src/hello-someone/webpack/webpack.util.ts +++ b/extensions/src/hello-someone/webpack/webpack.util.ts @@ -25,6 +25,16 @@ export const webViewTempDir = 'temp-build'; /** Folder containing the built extension files */ export const outputFolder = 'dist'; +/** + * The module format of library we want webpack to use for externals and create for our extensions + * + * @see webpack.Configuration['externalsType'] for info about external import format + * @see webpack.LibraryOptions['type'] for info about library format + */ +// commonjs-static formats the code to export everything on module.exports. so it works +// well in cjs or esm https://webpack.js.org/configuration/output/#type-commonjs-static +export const LIBRARY_TYPE: NonNullable = 'commonjs-static'; + /** Get a list of TypeScript WebView files to bundle. Path relative to project root */ function getWebViewTsxPaths() { return glob(webViewTsxGlob, { ignore: 'node_modules/**' }); diff --git a/extensions/src/hello-world/.stylelintrc.js b/extensions/src/hello-world/.stylelintrc.js index 70f5dd2d0e..7161ad789c 100644 --- a/extensions/src/hello-world/.stylelintrc.js +++ b/extensions/src/hello-world/.stylelintrc.js @@ -1,7 +1,11 @@ // #region shared with https://github.com/paranext/paranext-core/blob/main/.stylelintrc.js and https://github.com/paranext/paranext-multi-extension-template/blob/main/.stylelintrc.cjs module.exports = { - extends: ['stylelint-config-recommended', 'stylelint-config-sass-guidelines'], + extends: [ + 'stylelint-config-recommended', + 'stylelint-config-sass-guidelines', + 'stylelint-config-tailwindcss/scss', + ], overrides: [ { files: ['**/*.scss'], diff --git a/extensions/src/hello-world/.vscode/settings.json b/extensions/src/hello-world/.vscode/settings.json index cefc6be5ed..89083d1150 100644 --- a/extensions/src/hello-world/.vscode/settings.json +++ b/extensions/src/hello-world/.vscode/settings.json @@ -1,4 +1,6 @@ { + "css.customData": [".vscode/tailwindcss.json"], + "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true, "editor.rulers": [100], diff --git a/extensions/src/hello-world/.vscode/tailwindcss.json b/extensions/src/hello-world/.vscode/tailwindcss.json new file mode 100644 index 0000000000..83f02d51a9 --- /dev/null +++ b/extensions/src/hello-world/.vscode/tailwindcss.json @@ -0,0 +1,56 @@ +{ + "version": 1.1, + "credit": "https://duncanleung.com/tailwind-css-unknown-at-rule/", + "atDirectives": [ + { + "name": "@tailwind", + "description": "Use the `@tailwind` directive to insert Tailwind's `base`, `components`, `utilities` and `screens` styles into your CSS.", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#tailwind" + } + ] + }, + { + "name": "@apply", + "description": "Use the `@apply` directive to inline any existing utility classes into your own custom CSS. This is useful when you find a common utility pattern in your HTML that you’d like to extract to a new component.", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#apply" + } + ] + }, + { + "name": "@responsive", + "description": "You can generate responsive variants of your own classes by wrapping their definitions in the `@responsive` directive:\n```css\n@responsive {\n .alert {\n background-color: #E53E3E;\n }\n}\n```\n", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#responsive" + } + ] + }, + { + "name": "@screen", + "description": "The `@screen` directive allows you to create media queries that reference your breakpoints by **name** instead of duplicating their values in your own CSS:\n```css\n@screen sm {\n /* ... */\n}\n```\n…gets transformed into this:\n```css\n@media (min-width: 640px) {\n /* ... */\n}\n```\n", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#screen" + } + ] + }, + { + "name": "@variants", + "description": "Generate `hover`, `focus`, `active` and other **variants** of your own utilities by wrapping their definitions in the `@variants` directive:\n```css\n@variants hover, focus {\n .btn-brand {\n background-color: #3182CE;\n }\n}\n```\n", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#variants" + } + ] + } + ] +} diff --git a/extensions/src/hello-world/README.md b/extensions/src/hello-world/README.md index 9083cd844c..57947ca05c 100644 --- a/extensions/src/hello-world/README.md +++ b/extensions/src/hello-world/README.md @@ -71,7 +71,7 @@ The `manifest.json` and `package.json` files contain information specific to you #### Hide Template Info -Once finished customizing this template to be your own, you can uncomment the [HTML comment tag](https://www.w3schools.com/html/html_comments.asp) above the [Template Info](#template-info) section to hide this template-related info in this readme. You can do this by clicking on the line and doing CTRL + / in VS Code. You can also do this manually by removing the first opening '<!--' and the only closing '-->' on the line. Leaving this info commented in your readme will hide it in your readme while avoiding merge conflicts if you decide to [update this extension from the template](#to-update-this-extension-from-the-template) in the future. If you never want to update this extension from the template, you can remove the [Template Info](#template-info) section and sub-sections of this readme. +Once finished customizing this template to be your own, you can uncomment the [HTML comment tag](https://www.w3schools.com/html/html_comments.asp) above the [Template Info](#template-info) section to hide this template-related info in this readme. You can do this by clicking on the line and doing CTRL + / in VS Code. You can also do this manually by removing the first opening '<!--' and the only closing '-->' on the line. Leaving this info commented in your readme will hide it in your readme while avoiding merge conflicts if you decide to [update this extension from the template](#to-update-this-extension-from-the-template) in the future. If you never want to update this extension from the template, you can remove the [Template Info](#template-info) section and sub-sections of this readme. Note: if you [update this extension from the template](#to-update-this-extension-from-the-template), there may be important changes in this section like additional customizations you must make to this extension. Please keep an eye out for readme changes when updating from the template. diff --git a/extensions/src/hello-world/package.json b/extensions/src/hello-world/package.json index a9b5650028..33ada0f8b2 100644 --- a/extensions/src/hello-world/package.json +++ b/extensions/src/hello-world/package.json @@ -35,13 +35,15 @@ "platform-bible-utils": "file:../../../lib/platform-bible-utils" }, "devDependencies": { - "@swc/core": "^1.7.26", - "@types/node": "^20.16.10", + "@swc/core": "^1.7.35", + "@tailwindcss/typography": "^0.5.15", + "@types/node": "^20.16.11", "@types/react": "^18.3.11", - "@types/react-dom": "^18.3.0", + "@types/react-dom": "^18.3.1", "@types/webpack": "^5.28.5", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", + "autoprefixer": "^10.4.20", "concurrently": "^9.0.1", "copy-webpack-plugin": "^12.0.2", "cross-env": "^7.0.3", @@ -52,7 +54,7 @@ "eslint-config-erb": "^4.1.0", "eslint-import-resolver-typescript": "^3.6.3", "eslint-plugin-compat": "^4.2.0", - "eslint-plugin-import": "^2.30.0", + "eslint-plugin-import": "^2.31.0", "eslint-plugin-jest": "^27.9.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-no-null": "^1.0.2", @@ -61,16 +63,22 @@ "eslint-plugin-react": "^7.37.1", "eslint-plugin-react-hooks": "^4.6.2", "glob": "^10.4.5", + "lucide-react": "^0.452.0", "papi-dts": "file:../../../lib/papi-dts", "platform-bible-react": "file:../../../lib/platform-bible-react", + "postcss": "^8.4.47", + "postcss-loader": "^8.1.1", "prettier": "^3.3.3", "prettier-plugin-jsdoc": "^1.3.0", - "sass": "^1.78.0", - "sass-loader": "^14.2.1", - "stylelint": "^16.9.0", + "sass": "^1.79.5", + "sass-loader": "^16.0.2", + "stylelint": "^16.10.0", "stylelint-config-recommended": "^14.0.1", "stylelint-config-sass-guidelines": "^12.1.0", + "stylelint-config-tailwindcss": "^0.0.7", "swc-loader": "^0.2.6", + "tailwindcss": "^3.4.13", + "tailwindcss-animate": "^1.0.7", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", "tsconfig-paths-webpack-plugin": "^4.1.0", diff --git a/extensions/src/hello-world/postcss.config.ts b/extensions/src/hello-world/postcss.config.ts new file mode 100644 index 0000000000..6b6f0992eb --- /dev/null +++ b/extensions/src/hello-world/postcss.config.ts @@ -0,0 +1,12 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/postcss.config.js and https://github.com/paranext/paranext-core/blob/main/lib/platform-bible-react/postcss.config.js + +const config = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; + +export default config; + +// #endregion diff --git a/extensions/src/hello-world/src/tailwind.scss b/extensions/src/hello-world/src/tailwind.scss new file mode 100644 index 0000000000..22f74a02c1 --- /dev/null +++ b/extensions/src/hello-world/src/tailwind.scss @@ -0,0 +1,140 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +/* #region shared with https://github.com/paranext/paranext-core/blob/main/lib/platform-bible-react/src/index.css */ + +@layer base { + @font-face { + font-family: 'Inter'; + font-display: 'swap'; + src: url('https://fonts.googleapis.com/css2?family=Inter:wght@100..900&display=swap'); + } + + /* + * Theme colors in Platform.Bible. These are applied in CSS properties using `hsl(var(--varName))` + * or Tailwind classes like `tw-bg-primary` + * + * See the wiki's + * [Matching Application Theme](https://github.com/paranext/paranext-extension-template/wiki/Extension-Anatomy#matching-application-theme) + * section for more information + */ + :root { + --background: 0 0% 100%; + --foreground: 222.2 84% 4.9%; + + --card: 0 0% 100%; + --card-foreground: 222.2 84% 4.9%; + + --popover: 0 0% 100%; + --popover-foreground: 222.2 84% 4.9%; + + --primary: 222.2 47.4% 11.2%; + --primary-foreground: 210 40% 98%; + + --secondary: 210 40% 96.1%; + --secondary-foreground: 222.2 47.4% 11.2%; + + --muted: 210 40% 96.1%; + --muted-foreground: 215.4 16.3% 46.9%; + + --accent: 210 40% 96.1%; + --accent-foreground: 222.2 47.4% 11.2%; + + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 210 40% 98%; + + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + --ring: 222.2 84% 4.9%; + + --radius: 0.5rem; + } + + .dark { + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + + --card: 222.2 84% 4.9%; + --card-foreground: 210 40% 98%; + + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + + --primary: 210 40% 98%; + --primary-foreground: 222.2 47.4% 11.2%; + + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + + --accent: 217.2 32.6% 17.5%; + --accent-foreground: 210 40% 98%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + + --border: 217.2 32.6% 17.5%; + --input: 217.2 32.6% 17.5%; + --ring: 212.7 26.8% 83.9%; + } + + /* using color palette https://supercolorpalette.com/?scp=G0-hsl-99827A-E7DDD0-FEF4E7-FEFAF1-FFFFFF-D8E9E3-719892-07463D-0A433D-083030-041616-000000-85DBB8-F2F52E-CD3737 */ + .paratext-light { + --background: 0 0% 100%; + --foreground: 0 0% 0%; + --muted: 33.9 32.4% 86.1%; + --muted-foreground: 15.5 13.2% 53.9%; + --popover: 0 0% 100%; + --popover-foreground: 0 0% 0%; + --card: 0 0% 100%; + --card-foreground: 0 0% 0%; + --border: 220 13% 91%; + --input: 161.3 26.7% 88.2%; + --primary: 173.4 82.1% 15.3%; + --primary-foreground: 40 85.7% 97.3%; + --secondary: 161.3 26.7% 88.2%; + --secondary-foreground: 173.4 82.1% 15.3%; + --accent: 161.3 26.7% 88.2%; + --accent-foreground: 173.4 82.1% 15.3%; + --destructive: 0 60% 51%; + --destructive-foreground: 210 20% 98%; + --ring: 13.5 13.2% 53.9%; + } + + .paratext-dark { + --background: 0 0% 0%; + --foreground: 0 0% 100%; + --muted: 15.5 13.2% 53.9%; + --muted-foreground: 33.9 32.4% 86.1%; + --popover: 180 71.4% 5%; + --popover-foreground: 0 0% 100%; + --card: 0 0% 0%; + --card-foreground: 0 0% 100%; + --border: 220 13% 20%; + --input: 220 13% 20%; + --primary: 161.3 26.7% 88.2%; + --primary-foreground: 173.4 82.1% 15.3%; + --secondary: 180 71.4% 11%; + --secondary-foreground: 161.3 26.7% 88.2%; + --accent: 180 71.4% 11%; + --accent-foreground: 161.3 26.7% 88.2%; + --destructive: 0 60% 51%; + --destructive-foreground: 210 20% 98%; + --ring: 13.5 13.2% 53.9%; + } +} + +@layer base { + * { + @apply tw-border-border; + } + + body { + @apply tw-bg-background tw-text-foreground; + } +} + +/* #endregion */ diff --git a/extensions/src/hello-world/tailwind.config.ts b/extensions/src/hello-world/tailwind.config.ts new file mode 100644 index 0000000000..d9c586c403 --- /dev/null +++ b/extensions/src/hello-world/tailwind.config.ts @@ -0,0 +1,93 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/tailwind.config.ts + +// #region shared with https://github.com/paranext/paranext-core/blob/main/lib/platform-bible-react/tailwind.config.ts + +import { Config } from 'tailwindcss'; +import typography from '@tailwindcss/typography'; +import tailwindCssAnimate from 'tailwindcss-animate'; + +const config: Config = { + content: ['./src/**/*.{js,ts,jsx,tsx}'], + // Prefix on all tailwind classes so they don't clash with built-in classes + // short for tailwind - we hope to have the same prefix as users of this library so the cn + // function that uses tailwind-merge can properly overwrite related tailwind classes + prefix: 'tw-', + // Theme from shadcn/ui + theme: { + container: { + center: true, + padding: '2rem', + screens: { + '2xl': '1400px', + }, + }, + extend: { + colors: { + border: 'hsl(var(--border))', + input: 'hsl(var(--input))', + ring: 'hsl(var(--ring))', + background: 'hsl(var(--background))', + foreground: 'hsl(var(--foreground))', + primary: { + DEFAULT: 'hsl(var(--primary))', + foreground: 'hsl(var(--primary-foreground))', + }, + secondary: { + DEFAULT: 'hsl(var(--secondary))', + foreground: 'hsl(var(--secondary-foreground))', + }, + destructive: { + DEFAULT: 'hsl(var(--destructive))', + foreground: 'hsl(var(--destructive-foreground))', + }, + muted: { + DEFAULT: 'hsl(var(--muted))', + foreground: 'hsl(var(--muted-foreground))', + }, + accent: { + DEFAULT: 'hsl(var(--accent))', + foreground: 'hsl(var(--accent-foreground))', + }, + popover: { + DEFAULT: 'hsl(var(--popover))', + foreground: 'hsl(var(--popover-foreground))', + }, + card: { + DEFAULT: 'hsl(var(--card))', + foreground: 'hsl(var(--card-foreground))', + }, + }, + borderRadius: { + lg: 'var(--radius)', + md: 'calc(var(--radius) - 2px)', + sm: 'calc(var(--radius) - 4px)', + }, + keyframes: { + 'accordion-down': { + from: { height: '0' }, + to: { height: 'var(--radix-accordion-content-height)' }, + }, + 'accordion-up': { + from: { height: 'var(--radix-accordion-content-height)' }, + to: { height: '0' }, + }, + }, + animation: { + 'accordion-down': 'accordion-down 0.2s ease-out', + 'accordion-up': 'accordion-up 0.2s ease-out', + }, + }, + }, + plugins: [ + // Prose styles as sensible defaults for markdown renderer component + typography(), + // Animations in tailwind style + tailwindCssAnimate, + + // #endregion + ], +}; + +export default config; + +// #endregion diff --git a/extensions/src/hello-world/webpack/webpack.config.base.ts b/extensions/src/hello-world/webpack/webpack.config.base.ts index 3eafc61c32..fc52d7d847 100644 --- a/extensions/src/hello-world/webpack/webpack.config.base.ts +++ b/extensions/src/hello-world/webpack/webpack.config.base.ts @@ -1,8 +1,9 @@ -// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/webpack/webpack.config.base.ts - import path from 'path'; import TsconfigPathsPlugin from 'tsconfig-paths-webpack-plugin'; import webpack from 'webpack'; +import { LIBRARY_TYPE } from './webpack.util'; + +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/webpack/webpack.config.base.ts const isDev = process.env.NODE_ENV !== 'production'; const shouldGenerateSourceMaps = isDev || process.env.DEBUG_PROD; @@ -10,16 +11,6 @@ const shouldGenerateSourceMaps = isDev || process.env.DEBUG_PROD; /** The base directory from which webpack should operate (should be the root repo folder) */ export const rootDir = path.resolve(__dirname, '..'); -/** - * The module format of library we want webpack to use for externals and create for our extensions - * - * @see webpack.Configuration['externalsType'] for info about external import format - * @see webpack.LibraryOptions['type'] for info about library format - */ -// commonjs-static formats the code to export everything on module.exports. so it works -// well in cjs or esm https://webpack.js.org/configuration/output/#type-commonjs-static -export const LIBRARY_TYPE: NonNullable = 'commonjs-static'; - // Note: we do not want to do any chunking because neither webViews nor main can import dependencies // other than those listed in configBase.externals. Each webView must contain all its dependency // code, and main must contain all its dependency code. @@ -98,6 +89,8 @@ const configBase: webpack.Configuration = { // into dom. style-loader would add html style elements for our styles if we used it // We are not using css-loader since we are getting style files using ?inline. css-loader // would allow us to import CSS into CommonJS + // Processes style transformations in PostCSS - after scss so PostCSS runs on just css + 'postcss-loader', // Compiles Sass to CSS 'sass-loader', ], diff --git a/extensions/src/hello-world/webpack/webpack.config.main.ts b/extensions/src/hello-world/webpack/webpack.config.main.ts index 5a25bc6dde..ec85634147 100644 --- a/extensions/src/hello-world/webpack/webpack.config.main.ts +++ b/extensions/src/hello-world/webpack/webpack.config.main.ts @@ -2,9 +2,9 @@ import webpack from 'webpack'; import path from 'path'; import merge from 'webpack-merge'; import CopyPlugin from 'copy-webpack-plugin'; -import configBase, { LIBRARY_TYPE, rootDir } from './webpack.config.base'; +import configBase, { rootDir } from './webpack.config.base'; import WebViewResolveWebpackPlugin from './web-view-resolve-webpack-plugin'; -import { outputFolder } from './webpack.util'; +import { LIBRARY_TYPE, outputFolder } from './webpack.util'; /** Webpack configuration for building main */ const configMain: webpack.Configuration = merge(configBase, { diff --git a/extensions/src/hello-world/webpack/webpack.util.ts b/extensions/src/hello-world/webpack/webpack.util.ts index cf465e3832..ea78e4acc3 100644 --- a/extensions/src/hello-world/webpack/webpack.util.ts +++ b/extensions/src/hello-world/webpack/webpack.util.ts @@ -25,6 +25,16 @@ export const webViewTempDir = 'temp-build'; /** Folder containing the built extension files */ export const outputFolder = 'dist'; +/** + * The module format of library we want webpack to use for externals and create for our extensions + * + * @see webpack.Configuration['externalsType'] for info about external import format + * @see webpack.LibraryOptions['type'] for info about library format + */ +// commonjs-static formats the code to export everything on module.exports. so it works +// well in cjs or esm https://webpack.js.org/configuration/output/#type-commonjs-static +export const LIBRARY_TYPE: NonNullable = 'commonjs-static'; + /** Get a list of TypeScript WebView files to bundle. Path relative to project root */ function getWebViewTsxPaths() { return glob(webViewTsxGlob, { ignore: 'node_modules/**' }); diff --git a/extensions/src/legacy-comment-manager/.stylelintrc.js b/extensions/src/legacy-comment-manager/.stylelintrc.js index 70f5dd2d0e..7161ad789c 100644 --- a/extensions/src/legacy-comment-manager/.stylelintrc.js +++ b/extensions/src/legacy-comment-manager/.stylelintrc.js @@ -1,7 +1,11 @@ // #region shared with https://github.com/paranext/paranext-core/blob/main/.stylelintrc.js and https://github.com/paranext/paranext-multi-extension-template/blob/main/.stylelintrc.cjs module.exports = { - extends: ['stylelint-config-recommended', 'stylelint-config-sass-guidelines'], + extends: [ + 'stylelint-config-recommended', + 'stylelint-config-sass-guidelines', + 'stylelint-config-tailwindcss/scss', + ], overrides: [ { files: ['**/*.scss'], diff --git a/extensions/src/legacy-comment-manager/.vscode/settings.json b/extensions/src/legacy-comment-manager/.vscode/settings.json index cefc6be5ed..89083d1150 100644 --- a/extensions/src/legacy-comment-manager/.vscode/settings.json +++ b/extensions/src/legacy-comment-manager/.vscode/settings.json @@ -1,4 +1,6 @@ { + "css.customData": [".vscode/tailwindcss.json"], + "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true, "editor.rulers": [100], diff --git a/extensions/src/legacy-comment-manager/.vscode/tailwindcss.json b/extensions/src/legacy-comment-manager/.vscode/tailwindcss.json new file mode 100644 index 0000000000..83f02d51a9 --- /dev/null +++ b/extensions/src/legacy-comment-manager/.vscode/tailwindcss.json @@ -0,0 +1,56 @@ +{ + "version": 1.1, + "credit": "https://duncanleung.com/tailwind-css-unknown-at-rule/", + "atDirectives": [ + { + "name": "@tailwind", + "description": "Use the `@tailwind` directive to insert Tailwind's `base`, `components`, `utilities` and `screens` styles into your CSS.", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#tailwind" + } + ] + }, + { + "name": "@apply", + "description": "Use the `@apply` directive to inline any existing utility classes into your own custom CSS. This is useful when you find a common utility pattern in your HTML that you’d like to extract to a new component.", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#apply" + } + ] + }, + { + "name": "@responsive", + "description": "You can generate responsive variants of your own classes by wrapping their definitions in the `@responsive` directive:\n```css\n@responsive {\n .alert {\n background-color: #E53E3E;\n }\n}\n```\n", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#responsive" + } + ] + }, + { + "name": "@screen", + "description": "The `@screen` directive allows you to create media queries that reference your breakpoints by **name** instead of duplicating their values in your own CSS:\n```css\n@screen sm {\n /* ... */\n}\n```\n…gets transformed into this:\n```css\n@media (min-width: 640px) {\n /* ... */\n}\n```\n", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#screen" + } + ] + }, + { + "name": "@variants", + "description": "Generate `hover`, `focus`, `active` and other **variants** of your own utilities by wrapping their definitions in the `@variants` directive:\n```css\n@variants hover, focus {\n .btn-brand {\n background-color: #3182CE;\n }\n}\n```\n", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#variants" + } + ] + } + ] +} diff --git a/extensions/src/legacy-comment-manager/README.md b/extensions/src/legacy-comment-manager/README.md index e44dcadfa5..bb5b22653d 100644 --- a/extensions/src/legacy-comment-manager/README.md +++ b/extensions/src/legacy-comment-manager/README.md @@ -71,7 +71,7 @@ The `manifest.json` and `package.json` files contain information specific to you #### Hide Template Info -Once finished customizing this template to be your own, you can uncomment the [HTML comment tag](https://www.w3schools.com/html/html_comments.asp) above the [Template Info](#template-info) section to hide this template-related info in this readme. You can do this by clicking on the line and doing CTRL + / in VS Code. You can also do this manually by removing the first opening '<!--' and the only closing '-->' on the line. Leaving this info commented in your readme will hide it in your readme while avoiding merge conflicts if you decide to [update this extension from the template](#to-update-this-extension-from-the-template) in the future. If you never want to update this extension from the template, you can remove the [Template Info](#template-info) section and sub-sections of this readme. +Once finished customizing this template to be your own, you can uncomment the [HTML comment tag](https://www.w3schools.com/html/html_comments.asp) above the [Template Info](#template-info) section to hide this template-related info in this readme. You can do this by clicking on the line and doing CTRL + / in VS Code. You can also do this manually by removing the first opening '<!--' and the only closing '-->' on the line. Leaving this info commented in your readme will hide it in your readme while avoiding merge conflicts if you decide to [update this extension from the template](#to-update-this-extension-from-the-template) in the future. If you never want to update this extension from the template, you can remove the [Template Info](#template-info) section and sub-sections of this readme. Note: if you [update this extension from the template](#to-update-this-extension-from-the-template), there may be important changes in this section like additional customizations you must make to this extension. Please keep an eye out for readme changes when updating from the template. diff --git a/extensions/src/legacy-comment-manager/package.json b/extensions/src/legacy-comment-manager/package.json index 872be5bbc2..78279ae565 100644 --- a/extensions/src/legacy-comment-manager/package.json +++ b/extensions/src/legacy-comment-manager/package.json @@ -35,13 +35,15 @@ "platform-bible-utils": "file:../../../lib/platform-bible-utils" }, "devDependencies": { - "@swc/core": "^1.7.26", - "@types/node": "^20.16.10", + "@swc/core": "^1.7.35", + "@tailwindcss/typography": "^0.5.15", + "@types/node": "^20.16.11", "@types/react": "^18.3.11", - "@types/react-dom": "^18.3.0", + "@types/react-dom": "^18.3.1", "@types/webpack": "^5.28.5", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", + "autoprefixer": "^10.4.20", "concurrently": "^9.0.1", "copy-webpack-plugin": "^12.0.2", "cross-env": "^7.0.3", @@ -52,7 +54,7 @@ "eslint-config-erb": "^4.1.0", "eslint-import-resolver-typescript": "^3.6.3", "eslint-plugin-compat": "^4.2.0", - "eslint-plugin-import": "^2.30.0", + "eslint-plugin-import": "^2.31.0", "eslint-plugin-jest": "^27.9.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-no-null": "^1.0.2", @@ -61,16 +63,22 @@ "eslint-plugin-react": "^7.37.1", "eslint-plugin-react-hooks": "^4.6.2", "glob": "^10.4.5", + "lucide-react": "^0.452.0", "papi-dts": "file:../../../lib/papi-dts", "platform-bible-react": "file:../../../lib/platform-bible-react", + "postcss": "^8.4.47", + "postcss-loader": "^8.1.1", "prettier": "^3.3.3", "prettier-plugin-jsdoc": "^1.3.0", - "sass": "^1.78.0", - "sass-loader": "^14.2.1", - "stylelint": "^16.9.0", + "sass": "^1.79.5", + "sass-loader": "^16.0.2", + "stylelint": "^16.10.0", "stylelint-config-recommended": "^14.0.1", "stylelint-config-sass-guidelines": "^12.1.0", + "stylelint-config-tailwindcss": "^0.0.7", "swc-loader": "^0.2.6", + "tailwindcss": "^3.4.13", + "tailwindcss-animate": "^1.0.7", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", "tsconfig-paths-webpack-plugin": "^4.1.0", diff --git a/extensions/src/legacy-comment-manager/postcss.config.ts b/extensions/src/legacy-comment-manager/postcss.config.ts new file mode 100644 index 0000000000..6b6f0992eb --- /dev/null +++ b/extensions/src/legacy-comment-manager/postcss.config.ts @@ -0,0 +1,12 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/postcss.config.js and https://github.com/paranext/paranext-core/blob/main/lib/platform-bible-react/postcss.config.js + +const config = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; + +export default config; + +// #endregion diff --git a/extensions/src/legacy-comment-manager/src/tailwind.scss b/extensions/src/legacy-comment-manager/src/tailwind.scss new file mode 100644 index 0000000000..22f74a02c1 --- /dev/null +++ b/extensions/src/legacy-comment-manager/src/tailwind.scss @@ -0,0 +1,140 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +/* #region shared with https://github.com/paranext/paranext-core/blob/main/lib/platform-bible-react/src/index.css */ + +@layer base { + @font-face { + font-family: 'Inter'; + font-display: 'swap'; + src: url('https://fonts.googleapis.com/css2?family=Inter:wght@100..900&display=swap'); + } + + /* + * Theme colors in Platform.Bible. These are applied in CSS properties using `hsl(var(--varName))` + * or Tailwind classes like `tw-bg-primary` + * + * See the wiki's + * [Matching Application Theme](https://github.com/paranext/paranext-extension-template/wiki/Extension-Anatomy#matching-application-theme) + * section for more information + */ + :root { + --background: 0 0% 100%; + --foreground: 222.2 84% 4.9%; + + --card: 0 0% 100%; + --card-foreground: 222.2 84% 4.9%; + + --popover: 0 0% 100%; + --popover-foreground: 222.2 84% 4.9%; + + --primary: 222.2 47.4% 11.2%; + --primary-foreground: 210 40% 98%; + + --secondary: 210 40% 96.1%; + --secondary-foreground: 222.2 47.4% 11.2%; + + --muted: 210 40% 96.1%; + --muted-foreground: 215.4 16.3% 46.9%; + + --accent: 210 40% 96.1%; + --accent-foreground: 222.2 47.4% 11.2%; + + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 210 40% 98%; + + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + --ring: 222.2 84% 4.9%; + + --radius: 0.5rem; + } + + .dark { + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + + --card: 222.2 84% 4.9%; + --card-foreground: 210 40% 98%; + + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + + --primary: 210 40% 98%; + --primary-foreground: 222.2 47.4% 11.2%; + + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + + --accent: 217.2 32.6% 17.5%; + --accent-foreground: 210 40% 98%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + + --border: 217.2 32.6% 17.5%; + --input: 217.2 32.6% 17.5%; + --ring: 212.7 26.8% 83.9%; + } + + /* using color palette https://supercolorpalette.com/?scp=G0-hsl-99827A-E7DDD0-FEF4E7-FEFAF1-FFFFFF-D8E9E3-719892-07463D-0A433D-083030-041616-000000-85DBB8-F2F52E-CD3737 */ + .paratext-light { + --background: 0 0% 100%; + --foreground: 0 0% 0%; + --muted: 33.9 32.4% 86.1%; + --muted-foreground: 15.5 13.2% 53.9%; + --popover: 0 0% 100%; + --popover-foreground: 0 0% 0%; + --card: 0 0% 100%; + --card-foreground: 0 0% 0%; + --border: 220 13% 91%; + --input: 161.3 26.7% 88.2%; + --primary: 173.4 82.1% 15.3%; + --primary-foreground: 40 85.7% 97.3%; + --secondary: 161.3 26.7% 88.2%; + --secondary-foreground: 173.4 82.1% 15.3%; + --accent: 161.3 26.7% 88.2%; + --accent-foreground: 173.4 82.1% 15.3%; + --destructive: 0 60% 51%; + --destructive-foreground: 210 20% 98%; + --ring: 13.5 13.2% 53.9%; + } + + .paratext-dark { + --background: 0 0% 0%; + --foreground: 0 0% 100%; + --muted: 15.5 13.2% 53.9%; + --muted-foreground: 33.9 32.4% 86.1%; + --popover: 180 71.4% 5%; + --popover-foreground: 0 0% 100%; + --card: 0 0% 0%; + --card-foreground: 0 0% 100%; + --border: 220 13% 20%; + --input: 220 13% 20%; + --primary: 161.3 26.7% 88.2%; + --primary-foreground: 173.4 82.1% 15.3%; + --secondary: 180 71.4% 11%; + --secondary-foreground: 161.3 26.7% 88.2%; + --accent: 180 71.4% 11%; + --accent-foreground: 161.3 26.7% 88.2%; + --destructive: 0 60% 51%; + --destructive-foreground: 210 20% 98%; + --ring: 13.5 13.2% 53.9%; + } +} + +@layer base { + * { + @apply tw-border-border; + } + + body { + @apply tw-bg-background tw-text-foreground; + } +} + +/* #endregion */ diff --git a/extensions/src/legacy-comment-manager/tailwind.config.ts b/extensions/src/legacy-comment-manager/tailwind.config.ts new file mode 100644 index 0000000000..d9c586c403 --- /dev/null +++ b/extensions/src/legacy-comment-manager/tailwind.config.ts @@ -0,0 +1,93 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/tailwind.config.ts + +// #region shared with https://github.com/paranext/paranext-core/blob/main/lib/platform-bible-react/tailwind.config.ts + +import { Config } from 'tailwindcss'; +import typography from '@tailwindcss/typography'; +import tailwindCssAnimate from 'tailwindcss-animate'; + +const config: Config = { + content: ['./src/**/*.{js,ts,jsx,tsx}'], + // Prefix on all tailwind classes so they don't clash with built-in classes + // short for tailwind - we hope to have the same prefix as users of this library so the cn + // function that uses tailwind-merge can properly overwrite related tailwind classes + prefix: 'tw-', + // Theme from shadcn/ui + theme: { + container: { + center: true, + padding: '2rem', + screens: { + '2xl': '1400px', + }, + }, + extend: { + colors: { + border: 'hsl(var(--border))', + input: 'hsl(var(--input))', + ring: 'hsl(var(--ring))', + background: 'hsl(var(--background))', + foreground: 'hsl(var(--foreground))', + primary: { + DEFAULT: 'hsl(var(--primary))', + foreground: 'hsl(var(--primary-foreground))', + }, + secondary: { + DEFAULT: 'hsl(var(--secondary))', + foreground: 'hsl(var(--secondary-foreground))', + }, + destructive: { + DEFAULT: 'hsl(var(--destructive))', + foreground: 'hsl(var(--destructive-foreground))', + }, + muted: { + DEFAULT: 'hsl(var(--muted))', + foreground: 'hsl(var(--muted-foreground))', + }, + accent: { + DEFAULT: 'hsl(var(--accent))', + foreground: 'hsl(var(--accent-foreground))', + }, + popover: { + DEFAULT: 'hsl(var(--popover))', + foreground: 'hsl(var(--popover-foreground))', + }, + card: { + DEFAULT: 'hsl(var(--card))', + foreground: 'hsl(var(--card-foreground))', + }, + }, + borderRadius: { + lg: 'var(--radius)', + md: 'calc(var(--radius) - 2px)', + sm: 'calc(var(--radius) - 4px)', + }, + keyframes: { + 'accordion-down': { + from: { height: '0' }, + to: { height: 'var(--radix-accordion-content-height)' }, + }, + 'accordion-up': { + from: { height: 'var(--radix-accordion-content-height)' }, + to: { height: '0' }, + }, + }, + animation: { + 'accordion-down': 'accordion-down 0.2s ease-out', + 'accordion-up': 'accordion-up 0.2s ease-out', + }, + }, + }, + plugins: [ + // Prose styles as sensible defaults for markdown renderer component + typography(), + // Animations in tailwind style + tailwindCssAnimate, + + // #endregion + ], +}; + +export default config; + +// #endregion diff --git a/extensions/src/legacy-comment-manager/webpack/webpack.config.base.ts b/extensions/src/legacy-comment-manager/webpack/webpack.config.base.ts index 3eafc61c32..fc52d7d847 100644 --- a/extensions/src/legacy-comment-manager/webpack/webpack.config.base.ts +++ b/extensions/src/legacy-comment-manager/webpack/webpack.config.base.ts @@ -1,8 +1,9 @@ -// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/webpack/webpack.config.base.ts - import path from 'path'; import TsconfigPathsPlugin from 'tsconfig-paths-webpack-plugin'; import webpack from 'webpack'; +import { LIBRARY_TYPE } from './webpack.util'; + +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/webpack/webpack.config.base.ts const isDev = process.env.NODE_ENV !== 'production'; const shouldGenerateSourceMaps = isDev || process.env.DEBUG_PROD; @@ -10,16 +11,6 @@ const shouldGenerateSourceMaps = isDev || process.env.DEBUG_PROD; /** The base directory from which webpack should operate (should be the root repo folder) */ export const rootDir = path.resolve(__dirname, '..'); -/** - * The module format of library we want webpack to use for externals and create for our extensions - * - * @see webpack.Configuration['externalsType'] for info about external import format - * @see webpack.LibraryOptions['type'] for info about library format - */ -// commonjs-static formats the code to export everything on module.exports. so it works -// well in cjs or esm https://webpack.js.org/configuration/output/#type-commonjs-static -export const LIBRARY_TYPE: NonNullable = 'commonjs-static'; - // Note: we do not want to do any chunking because neither webViews nor main can import dependencies // other than those listed in configBase.externals. Each webView must contain all its dependency // code, and main must contain all its dependency code. @@ -98,6 +89,8 @@ const configBase: webpack.Configuration = { // into dom. style-loader would add html style elements for our styles if we used it // We are not using css-loader since we are getting style files using ?inline. css-loader // would allow us to import CSS into CommonJS + // Processes style transformations in PostCSS - after scss so PostCSS runs on just css + 'postcss-loader', // Compiles Sass to CSS 'sass-loader', ], diff --git a/extensions/src/legacy-comment-manager/webpack/webpack.config.main.ts b/extensions/src/legacy-comment-manager/webpack/webpack.config.main.ts index 5a25bc6dde..ec85634147 100644 --- a/extensions/src/legacy-comment-manager/webpack/webpack.config.main.ts +++ b/extensions/src/legacy-comment-manager/webpack/webpack.config.main.ts @@ -2,9 +2,9 @@ import webpack from 'webpack'; import path from 'path'; import merge from 'webpack-merge'; import CopyPlugin from 'copy-webpack-plugin'; -import configBase, { LIBRARY_TYPE, rootDir } from './webpack.config.base'; +import configBase, { rootDir } from './webpack.config.base'; import WebViewResolveWebpackPlugin from './web-view-resolve-webpack-plugin'; -import { outputFolder } from './webpack.util'; +import { LIBRARY_TYPE, outputFolder } from './webpack.util'; /** Webpack configuration for building main */ const configMain: webpack.Configuration = merge(configBase, { diff --git a/extensions/src/legacy-comment-manager/webpack/webpack.util.ts b/extensions/src/legacy-comment-manager/webpack/webpack.util.ts index cf465e3832..ea78e4acc3 100644 --- a/extensions/src/legacy-comment-manager/webpack/webpack.util.ts +++ b/extensions/src/legacy-comment-manager/webpack/webpack.util.ts @@ -25,6 +25,16 @@ export const webViewTempDir = 'temp-build'; /** Folder containing the built extension files */ export const outputFolder = 'dist'; +/** + * The module format of library we want webpack to use for externals and create for our extensions + * + * @see webpack.Configuration['externalsType'] for info about external import format + * @see webpack.LibraryOptions['type'] for info about library format + */ +// commonjs-static formats the code to export everything on module.exports. so it works +// well in cjs or esm https://webpack.js.org/configuration/output/#type-commonjs-static +export const LIBRARY_TYPE: NonNullable = 'commonjs-static'; + /** Get a list of TypeScript WebView files to bundle. Path relative to project root */ function getWebViewTsxPaths() { return glob(webViewTsxGlob, { ignore: 'node_modules/**' }); diff --git a/extensions/src/platform-scripture-editor/.stylelintrc.js b/extensions/src/platform-scripture-editor/.stylelintrc.js index c6349f79ef..b004535c29 100644 --- a/extensions/src/platform-scripture-editor/.stylelintrc.js +++ b/extensions/src/platform-scripture-editor/.stylelintrc.js @@ -1,7 +1,11 @@ // #region shared with https://github.com/paranext/paranext-core/blob/main/.stylelintrc.js and https://github.com/paranext/paranext-multi-extension-template/blob/main/.stylelintrc.cjs module.exports = { - extends: ['stylelint-config-recommended', 'stylelint-config-sass-guidelines'], + extends: [ + 'stylelint-config-recommended', + 'stylelint-config-sass-guidelines', + 'stylelint-config-tailwindcss/scss', + ], overrides: [ { files: ['**/*.scss'], @@ -14,9 +18,10 @@ module.exports = { 'no-descending-specificity': null, 'selector-max-compound-selectors': 4, 'selector-max-id': 1, + + // #endregion + // only -webkit-mask-... rules are working, not the ones without -webkit 'property-no-vendor-prefix': [true, { ignoreProperties: [/mask-.*/] }], }, }; - -// #endregion diff --git a/extensions/src/platform-scripture-editor/.vscode/settings.json b/extensions/src/platform-scripture-editor/.vscode/settings.json index cefc6be5ed..89083d1150 100644 --- a/extensions/src/platform-scripture-editor/.vscode/settings.json +++ b/extensions/src/platform-scripture-editor/.vscode/settings.json @@ -1,4 +1,6 @@ { + "css.customData": [".vscode/tailwindcss.json"], + "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true, "editor.rulers": [100], diff --git a/extensions/src/platform-scripture-editor/.vscode/tailwindcss.json b/extensions/src/platform-scripture-editor/.vscode/tailwindcss.json new file mode 100644 index 0000000000..83f02d51a9 --- /dev/null +++ b/extensions/src/platform-scripture-editor/.vscode/tailwindcss.json @@ -0,0 +1,56 @@ +{ + "version": 1.1, + "credit": "https://duncanleung.com/tailwind-css-unknown-at-rule/", + "atDirectives": [ + { + "name": "@tailwind", + "description": "Use the `@tailwind` directive to insert Tailwind's `base`, `components`, `utilities` and `screens` styles into your CSS.", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#tailwind" + } + ] + }, + { + "name": "@apply", + "description": "Use the `@apply` directive to inline any existing utility classes into your own custom CSS. This is useful when you find a common utility pattern in your HTML that you’d like to extract to a new component.", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#apply" + } + ] + }, + { + "name": "@responsive", + "description": "You can generate responsive variants of your own classes by wrapping their definitions in the `@responsive` directive:\n```css\n@responsive {\n .alert {\n background-color: #E53E3E;\n }\n}\n```\n", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#responsive" + } + ] + }, + { + "name": "@screen", + "description": "The `@screen` directive allows you to create media queries that reference your breakpoints by **name** instead of duplicating their values in your own CSS:\n```css\n@screen sm {\n /* ... */\n}\n```\n…gets transformed into this:\n```css\n@media (min-width: 640px) {\n /* ... */\n}\n```\n", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#screen" + } + ] + }, + { + "name": "@variants", + "description": "Generate `hover`, `focus`, `active` and other **variants** of your own utilities by wrapping their definitions in the `@variants` directive:\n```css\n@variants hover, focus {\n .btn-brand {\n background-color: #3182CE;\n }\n}\n```\n", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#variants" + } + ] + } + ] +} diff --git a/extensions/src/platform-scripture-editor/README.md b/extensions/src/platform-scripture-editor/README.md index 437483b6f0..be6d2c4ed3 100644 --- a/extensions/src/platform-scripture-editor/README.md +++ b/extensions/src/platform-scripture-editor/README.md @@ -71,7 +71,7 @@ The `manifest.json` and `package.json` files contain information specific to you #### Hide Template Info -Once finished customizing this template to be your own, you can uncomment the [HTML comment tag](https://www.w3schools.com/html/html_comments.asp) above the [Template Info](#template-info) section to hide this template-related info in this readme. You can do this by clicking on the line and doing CTRL + / in VS Code. You can also do this manually by removing the first opening '<!--' and the only closing '-->' on the line. Leaving this info commented in your readme will hide it in your readme while avoiding merge conflicts if you decide to [update this extension from the template](#to-update-this-extension-from-the-template) in the future. If you never want to update this extension from the template, you can remove the [Template Info](#template-info) section and sub-sections of this readme. +Once finished customizing this template to be your own, you can uncomment the [HTML comment tag](https://www.w3schools.com/html/html_comments.asp) above the [Template Info](#template-info) section to hide this template-related info in this readme. You can do this by clicking on the line and doing CTRL + / in VS Code. You can also do this manually by removing the first opening '<!--' and the only closing '-->' on the line. Leaving this info commented in your readme will hide it in your readme while avoiding merge conflicts if you decide to [update this extension from the template](#to-update-this-extension-from-the-template) in the future. If you never want to update this extension from the template, you can remove the [Template Info](#template-info) section and sub-sections of this readme. Note: if you [update this extension from the template](#to-update-this-extension-from-the-template), there may be important changes in this section like additional customizations you must make to this extension. Please keep an eye out for readme changes when updating from the template. diff --git a/extensions/src/platform-scripture-editor/package.json b/extensions/src/platform-scripture-editor/package.json index 55597cf92a..bdbd552669 100644 --- a/extensions/src/platform-scripture-editor/package.json +++ b/extensions/src/platform-scripture-editor/package.json @@ -37,13 +37,15 @@ "devDependencies": { "@biblionexus-foundation/platform-editor": "^0.6.3", "@biblionexus-foundation/scripture-utilities": "^0.0.4", - "@swc/core": "^1.7.26", - "@types/node": "^20.16.10", + "@swc/core": "^1.7.35", + "@tailwindcss/typography": "^0.5.15", + "@types/node": "^20.16.11", "@types/react": "^18.3.11", - "@types/react-dom": "^18.3.0", + "@types/react-dom": "^18.3.1", "@types/webpack": "^5.28.5", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", + "autoprefixer": "^10.4.20", "concurrently": "^9.0.1", "copy-webpack-plugin": "^12.0.2", "cross-env": "^7.0.3", @@ -54,7 +56,7 @@ "eslint-config-erb": "^4.1.0", "eslint-import-resolver-typescript": "^3.6.3", "eslint-plugin-compat": "^4.2.0", - "eslint-plugin-import": "^2.30.0", + "eslint-plugin-import": "^2.31.0", "eslint-plugin-jest": "^27.9.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-no-null": "^1.0.2", @@ -63,16 +65,22 @@ "eslint-plugin-react": "^7.37.1", "eslint-plugin-react-hooks": "^4.6.2", "glob": "^10.4.5", + "lucide-react": "^0.452.0", "papi-dts": "file:../../../lib/papi-dts", "platform-bible-react": "file:../../../lib/platform-bible-react", + "postcss": "^8.4.47", + "postcss-loader": "^8.1.1", "prettier": "^3.3.3", "prettier-plugin-jsdoc": "^1.3.0", - "sass": "^1.78.0", - "sass-loader": "^14.2.1", - "stylelint": "^16.9.0", + "sass": "^1.79.5", + "sass-loader": "^16.0.2", + "stylelint": "^16.10.0", "stylelint-config-recommended": "^14.0.1", "stylelint-config-sass-guidelines": "^12.1.0", + "stylelint-config-tailwindcss": "^0.0.7", "swc-loader": "^0.2.6", + "tailwindcss": "^3.4.13", + "tailwindcss-animate": "^1.0.7", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", "tsconfig-paths-webpack-plugin": "^4.1.0", diff --git a/extensions/src/platform-scripture-editor/postcss.config.ts b/extensions/src/platform-scripture-editor/postcss.config.ts new file mode 100644 index 0000000000..6b6f0992eb --- /dev/null +++ b/extensions/src/platform-scripture-editor/postcss.config.ts @@ -0,0 +1,12 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/postcss.config.js and https://github.com/paranext/paranext-core/blob/main/lib/platform-bible-react/postcss.config.js + +const config = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; + +export default config; + +// #endregion diff --git a/extensions/src/platform-scripture-editor/src/_editor-overrides.scss b/extensions/src/platform-scripture-editor/src/_editor-overrides.scss index df92d025a7..42b984f1f5 100644 --- a/extensions/src/platform-scripture-editor/src/_editor-overrides.scss +++ b/extensions/src/platform-scripture-editor/src/_editor-overrides.scss @@ -308,55 +308,81 @@ i.redo { background-image: none; } -%paragraph { +.icon.m, +.icon.nb, +.icon.p, +.icon.pi, +.icon.paragraph { // could be replaced with lucid icon text -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/text-paragraph.svg'); background-image: none; } -%h-one { +.icon.ms, +.icon.ms1, +.icon.r, +.icon.s, +.icon.large-heading, +.icon.h1 { // could be replaced with lucid icon heading-1 -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/type-h1.svg'); background-image: none; } -%h-two { +.icon.ms2, +.icon.small-heading, +.icon.h2 { // could be replaced with lucid icon heading-2 -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/type-h2.svg'); background-image: none; } -%h-three { +.icon.ms3, +.icon.h3 { -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/type-h3.svg'); background-image: none; } -%square-one { +.icon.mt, +.icon.mt1, +.icon.square-1 { -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/1-square.svg'); background-image: none; } -%square-two { +.icon.mt2, +.icon.square-2 { -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/2-square.svg'); background-image: none; } -%square-three { +.icon.mt3, +.icon.square-3 { -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/3-square.svg'); background-image: none; } -%square-four { +.icon.mt4, +.icon.square-4 { -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/4-square.svg'); background-image: none; } -%bookmark { +.icon.cl, +.icon.bookmark { -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/bookmark.svg'); background-image: none; } -%file-earmark { +.icon.ide, +.icon.h, +.icon.h1, +.icon.h2, +.icon.h3, +.icon.toc1, +.icon.toc2, +.icon.toc3, +.icon.file-earmark { -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/file-earmark.svg'); background-image: none; } @@ -373,7 +399,10 @@ i.redo { background-image: none; } -%quote { +.icon.b, +.icon.q1, +.icon.q2, +.icon.quote { // could be replaced with lucid icon message-square-quote -webkit-mask-image: url('papi-extension://platformScriptureEditor/assets/images/icons/chat-square-quote.svg'); background-image: none; diff --git a/extensions/src/platform-scripture-editor/src/_editor.scss b/extensions/src/platform-scripture-editor/src/_editor.scss index 86f2eb924a..3d3109e264 100644 --- a/extensions/src/platform-scripture-editor/src/_editor.scss +++ b/extensions/src/platform-scripture-editor/src/_editor.scss @@ -52,7 +52,7 @@ pointer-events: none; margin-block-start: 1em; margin-inline-start: calc(10px + 2.5vw); - width: fill-available; + width: stretch; } .editor-text-bold { @@ -402,20 +402,12 @@ i.redo { background-image: url('/assets/images/icons/arrow-clockwise.svg'); } -%paragraph { - background-image: url('/assets/images/icons/text-paragraph.svg'); -} - .icon.m, .icon.nb, .icon.p, .icon.pi, .icon.paragraph { - @extend %paragraph; -} - -%h-one { - background-image: url('/assets/images/icons/type-h1.svg'); + background-image: url('/assets/images/icons/text-paragraph.svg'); } .icon.ms, @@ -424,77 +416,45 @@ i.redo { .icon.s, .icon.large-heading, .icon.h1 { - @extend %h-one; -} - -%h-two { - background-image: url('/assets/images/icons/type-h2.svg'); + background-image: url('/assets/images/icons/type-h1.svg'); } .icon.ms2, .icon.small-heading, .icon.h2 { - @extend %h-two; -} - -%h-three { - background-image: url('/assets/images/icons/type-h3.svg'); + background-image: url('/assets/images/icons/type-h2.svg'); } .icon.ms3, .icon.h3 { - @extend %h-three; + background-image: url('/assets/images/icons/type-h3.svg'); } -%square-one { - background-image: url('/assets/images/icons/1-square.svg'); -} - .icon.mt, .icon.mt1, .icon.square-1 { - @extend %square-one; -} - -%square-two { - background-image: url('/assets/images/icons/2-square.svg'); + background-image: url('/assets/images/icons/1-square.svg'); } .icon.mt2, .icon.square-2 { - @extend %square-two; -} - -%square-three { - background-image: url('/assets/images/icons/3-square.svg'); + background-image: url('/assets/images/icons/2-square.svg'); } .icon.mt3, .icon.square-3 { - @extend %square-three; -} - -%square-four { - background-image: url('/assets/images/icons/4-square.svg'); + background-image: url('/assets/images/icons/3-square.svg'); } .icon.mt4, .icon.square-4 { - @extend %square-four; -} - -%bookmark { - background-image: url('/assets/images/icons/bookmark.svg'); + background-image: url('/assets/images/icons/4-square.svg'); } .icon.cl, .icon.bookmark { - @extend %bookmark; -} - -%file-earmark { - background-image: url('/assets/images/icons/file-earmark.svg'); + background-image: url('/assets/images/icons/bookmark.svg'); } .icon.ide, @@ -506,7 +466,7 @@ i.redo { .icon.toc2, .icon.toc3, .icon.file-earmark { - @extend %file-earmark; + background-image: url('/assets/images/icons/file-earmark.svg'); } .icon.bullet-list, @@ -519,15 +479,11 @@ i.redo { background-image: url('/assets/images/icons/list-ol.svg'); } -%quote { - background-image: url('/assets/images/icons/chat-square-quote.svg'); -} - .icon.b, .icon.q1, .icon.q2, .icon.quote { - @extend %quote; + background-image: url('/assets/images/icons/chat-square-quote.svg'); } .icon.ban { diff --git a/extensions/src/platform-scripture-editor/src/tailwind.scss b/extensions/src/platform-scripture-editor/src/tailwind.scss new file mode 100644 index 0000000000..22f74a02c1 --- /dev/null +++ b/extensions/src/platform-scripture-editor/src/tailwind.scss @@ -0,0 +1,140 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +/* #region shared with https://github.com/paranext/paranext-core/blob/main/lib/platform-bible-react/src/index.css */ + +@layer base { + @font-face { + font-family: 'Inter'; + font-display: 'swap'; + src: url('https://fonts.googleapis.com/css2?family=Inter:wght@100..900&display=swap'); + } + + /* + * Theme colors in Platform.Bible. These are applied in CSS properties using `hsl(var(--varName))` + * or Tailwind classes like `tw-bg-primary` + * + * See the wiki's + * [Matching Application Theme](https://github.com/paranext/paranext-extension-template/wiki/Extension-Anatomy#matching-application-theme) + * section for more information + */ + :root { + --background: 0 0% 100%; + --foreground: 222.2 84% 4.9%; + + --card: 0 0% 100%; + --card-foreground: 222.2 84% 4.9%; + + --popover: 0 0% 100%; + --popover-foreground: 222.2 84% 4.9%; + + --primary: 222.2 47.4% 11.2%; + --primary-foreground: 210 40% 98%; + + --secondary: 210 40% 96.1%; + --secondary-foreground: 222.2 47.4% 11.2%; + + --muted: 210 40% 96.1%; + --muted-foreground: 215.4 16.3% 46.9%; + + --accent: 210 40% 96.1%; + --accent-foreground: 222.2 47.4% 11.2%; + + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 210 40% 98%; + + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + --ring: 222.2 84% 4.9%; + + --radius: 0.5rem; + } + + .dark { + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + + --card: 222.2 84% 4.9%; + --card-foreground: 210 40% 98%; + + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + + --primary: 210 40% 98%; + --primary-foreground: 222.2 47.4% 11.2%; + + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + + --accent: 217.2 32.6% 17.5%; + --accent-foreground: 210 40% 98%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + + --border: 217.2 32.6% 17.5%; + --input: 217.2 32.6% 17.5%; + --ring: 212.7 26.8% 83.9%; + } + + /* using color palette https://supercolorpalette.com/?scp=G0-hsl-99827A-E7DDD0-FEF4E7-FEFAF1-FFFFFF-D8E9E3-719892-07463D-0A433D-083030-041616-000000-85DBB8-F2F52E-CD3737 */ + .paratext-light { + --background: 0 0% 100%; + --foreground: 0 0% 0%; + --muted: 33.9 32.4% 86.1%; + --muted-foreground: 15.5 13.2% 53.9%; + --popover: 0 0% 100%; + --popover-foreground: 0 0% 0%; + --card: 0 0% 100%; + --card-foreground: 0 0% 0%; + --border: 220 13% 91%; + --input: 161.3 26.7% 88.2%; + --primary: 173.4 82.1% 15.3%; + --primary-foreground: 40 85.7% 97.3%; + --secondary: 161.3 26.7% 88.2%; + --secondary-foreground: 173.4 82.1% 15.3%; + --accent: 161.3 26.7% 88.2%; + --accent-foreground: 173.4 82.1% 15.3%; + --destructive: 0 60% 51%; + --destructive-foreground: 210 20% 98%; + --ring: 13.5 13.2% 53.9%; + } + + .paratext-dark { + --background: 0 0% 0%; + --foreground: 0 0% 100%; + --muted: 15.5 13.2% 53.9%; + --muted-foreground: 33.9 32.4% 86.1%; + --popover: 180 71.4% 5%; + --popover-foreground: 0 0% 100%; + --card: 0 0% 0%; + --card-foreground: 0 0% 100%; + --border: 220 13% 20%; + --input: 220 13% 20%; + --primary: 161.3 26.7% 88.2%; + --primary-foreground: 173.4 82.1% 15.3%; + --secondary: 180 71.4% 11%; + --secondary-foreground: 161.3 26.7% 88.2%; + --accent: 180 71.4% 11%; + --accent-foreground: 161.3 26.7% 88.2%; + --destructive: 0 60% 51%; + --destructive-foreground: 210 20% 98%; + --ring: 13.5 13.2% 53.9%; + } +} + +@layer base { + * { + @apply tw-border-border; + } + + body { + @apply tw-bg-background tw-text-foreground; + } +} + +/* #endregion */ diff --git a/extensions/src/platform-scripture-editor/tailwind.config.ts b/extensions/src/platform-scripture-editor/tailwind.config.ts new file mode 100644 index 0000000000..d9c586c403 --- /dev/null +++ b/extensions/src/platform-scripture-editor/tailwind.config.ts @@ -0,0 +1,93 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/tailwind.config.ts + +// #region shared with https://github.com/paranext/paranext-core/blob/main/lib/platform-bible-react/tailwind.config.ts + +import { Config } from 'tailwindcss'; +import typography from '@tailwindcss/typography'; +import tailwindCssAnimate from 'tailwindcss-animate'; + +const config: Config = { + content: ['./src/**/*.{js,ts,jsx,tsx}'], + // Prefix on all tailwind classes so they don't clash with built-in classes + // short for tailwind - we hope to have the same prefix as users of this library so the cn + // function that uses tailwind-merge can properly overwrite related tailwind classes + prefix: 'tw-', + // Theme from shadcn/ui + theme: { + container: { + center: true, + padding: '2rem', + screens: { + '2xl': '1400px', + }, + }, + extend: { + colors: { + border: 'hsl(var(--border))', + input: 'hsl(var(--input))', + ring: 'hsl(var(--ring))', + background: 'hsl(var(--background))', + foreground: 'hsl(var(--foreground))', + primary: { + DEFAULT: 'hsl(var(--primary))', + foreground: 'hsl(var(--primary-foreground))', + }, + secondary: { + DEFAULT: 'hsl(var(--secondary))', + foreground: 'hsl(var(--secondary-foreground))', + }, + destructive: { + DEFAULT: 'hsl(var(--destructive))', + foreground: 'hsl(var(--destructive-foreground))', + }, + muted: { + DEFAULT: 'hsl(var(--muted))', + foreground: 'hsl(var(--muted-foreground))', + }, + accent: { + DEFAULT: 'hsl(var(--accent))', + foreground: 'hsl(var(--accent-foreground))', + }, + popover: { + DEFAULT: 'hsl(var(--popover))', + foreground: 'hsl(var(--popover-foreground))', + }, + card: { + DEFAULT: 'hsl(var(--card))', + foreground: 'hsl(var(--card-foreground))', + }, + }, + borderRadius: { + lg: 'var(--radius)', + md: 'calc(var(--radius) - 2px)', + sm: 'calc(var(--radius) - 4px)', + }, + keyframes: { + 'accordion-down': { + from: { height: '0' }, + to: { height: 'var(--radix-accordion-content-height)' }, + }, + 'accordion-up': { + from: { height: 'var(--radix-accordion-content-height)' }, + to: { height: '0' }, + }, + }, + animation: { + 'accordion-down': 'accordion-down 0.2s ease-out', + 'accordion-up': 'accordion-up 0.2s ease-out', + }, + }, + }, + plugins: [ + // Prose styles as sensible defaults for markdown renderer component + typography(), + // Animations in tailwind style + tailwindCssAnimate, + + // #endregion + ], +}; + +export default config; + +// #endregion diff --git a/extensions/src/platform-scripture-editor/webpack/webpack.config.base.ts b/extensions/src/platform-scripture-editor/webpack/webpack.config.base.ts index 3eafc61c32..fc52d7d847 100644 --- a/extensions/src/platform-scripture-editor/webpack/webpack.config.base.ts +++ b/extensions/src/platform-scripture-editor/webpack/webpack.config.base.ts @@ -1,8 +1,9 @@ -// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/webpack/webpack.config.base.ts - import path from 'path'; import TsconfigPathsPlugin from 'tsconfig-paths-webpack-plugin'; import webpack from 'webpack'; +import { LIBRARY_TYPE } from './webpack.util'; + +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/webpack/webpack.config.base.ts const isDev = process.env.NODE_ENV !== 'production'; const shouldGenerateSourceMaps = isDev || process.env.DEBUG_PROD; @@ -10,16 +11,6 @@ const shouldGenerateSourceMaps = isDev || process.env.DEBUG_PROD; /** The base directory from which webpack should operate (should be the root repo folder) */ export const rootDir = path.resolve(__dirname, '..'); -/** - * The module format of library we want webpack to use for externals and create for our extensions - * - * @see webpack.Configuration['externalsType'] for info about external import format - * @see webpack.LibraryOptions['type'] for info about library format - */ -// commonjs-static formats the code to export everything on module.exports. so it works -// well in cjs or esm https://webpack.js.org/configuration/output/#type-commonjs-static -export const LIBRARY_TYPE: NonNullable = 'commonjs-static'; - // Note: we do not want to do any chunking because neither webViews nor main can import dependencies // other than those listed in configBase.externals. Each webView must contain all its dependency // code, and main must contain all its dependency code. @@ -98,6 +89,8 @@ const configBase: webpack.Configuration = { // into dom. style-loader would add html style elements for our styles if we used it // We are not using css-loader since we are getting style files using ?inline. css-loader // would allow us to import CSS into CommonJS + // Processes style transformations in PostCSS - after scss so PostCSS runs on just css + 'postcss-loader', // Compiles Sass to CSS 'sass-loader', ], diff --git a/extensions/src/platform-scripture-editor/webpack/webpack.config.main.ts b/extensions/src/platform-scripture-editor/webpack/webpack.config.main.ts index 5a25bc6dde..ec85634147 100644 --- a/extensions/src/platform-scripture-editor/webpack/webpack.config.main.ts +++ b/extensions/src/platform-scripture-editor/webpack/webpack.config.main.ts @@ -2,9 +2,9 @@ import webpack from 'webpack'; import path from 'path'; import merge from 'webpack-merge'; import CopyPlugin from 'copy-webpack-plugin'; -import configBase, { LIBRARY_TYPE, rootDir } from './webpack.config.base'; +import configBase, { rootDir } from './webpack.config.base'; import WebViewResolveWebpackPlugin from './web-view-resolve-webpack-plugin'; -import { outputFolder } from './webpack.util'; +import { LIBRARY_TYPE, outputFolder } from './webpack.util'; /** Webpack configuration for building main */ const configMain: webpack.Configuration = merge(configBase, { diff --git a/extensions/src/platform-scripture-editor/webpack/webpack.util.ts b/extensions/src/platform-scripture-editor/webpack/webpack.util.ts index cf465e3832..ea78e4acc3 100644 --- a/extensions/src/platform-scripture-editor/webpack/webpack.util.ts +++ b/extensions/src/platform-scripture-editor/webpack/webpack.util.ts @@ -25,6 +25,16 @@ export const webViewTempDir = 'temp-build'; /** Folder containing the built extension files */ export const outputFolder = 'dist'; +/** + * The module format of library we want webpack to use for externals and create for our extensions + * + * @see webpack.Configuration['externalsType'] for info about external import format + * @see webpack.LibraryOptions['type'] for info about library format + */ +// commonjs-static formats the code to export everything on module.exports. so it works +// well in cjs or esm https://webpack.js.org/configuration/output/#type-commonjs-static +export const LIBRARY_TYPE: NonNullable = 'commonjs-static'; + /** Get a list of TypeScript WebView files to bundle. Path relative to project root */ function getWebViewTsxPaths() { return glob(webViewTsxGlob, { ignore: 'node_modules/**' }); diff --git a/extensions/src/platform-scripture/.stylelintrc.js b/extensions/src/platform-scripture/.stylelintrc.js index 70f5dd2d0e..7161ad789c 100644 --- a/extensions/src/platform-scripture/.stylelintrc.js +++ b/extensions/src/platform-scripture/.stylelintrc.js @@ -1,7 +1,11 @@ // #region shared with https://github.com/paranext/paranext-core/blob/main/.stylelintrc.js and https://github.com/paranext/paranext-multi-extension-template/blob/main/.stylelintrc.cjs module.exports = { - extends: ['stylelint-config-recommended', 'stylelint-config-sass-guidelines'], + extends: [ + 'stylelint-config-recommended', + 'stylelint-config-sass-guidelines', + 'stylelint-config-tailwindcss/scss', + ], overrides: [ { files: ['**/*.scss'], diff --git a/extensions/src/platform-scripture/.vscode/settings.json b/extensions/src/platform-scripture/.vscode/settings.json index cefc6be5ed..89083d1150 100644 --- a/extensions/src/platform-scripture/.vscode/settings.json +++ b/extensions/src/platform-scripture/.vscode/settings.json @@ -1,4 +1,6 @@ { + "css.customData": [".vscode/tailwindcss.json"], + "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true, "editor.rulers": [100], diff --git a/extensions/src/platform-scripture/.vscode/tailwindcss.json b/extensions/src/platform-scripture/.vscode/tailwindcss.json new file mode 100644 index 0000000000..83f02d51a9 --- /dev/null +++ b/extensions/src/platform-scripture/.vscode/tailwindcss.json @@ -0,0 +1,56 @@ +{ + "version": 1.1, + "credit": "https://duncanleung.com/tailwind-css-unknown-at-rule/", + "atDirectives": [ + { + "name": "@tailwind", + "description": "Use the `@tailwind` directive to insert Tailwind's `base`, `components`, `utilities` and `screens` styles into your CSS.", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#tailwind" + } + ] + }, + { + "name": "@apply", + "description": "Use the `@apply` directive to inline any existing utility classes into your own custom CSS. This is useful when you find a common utility pattern in your HTML that you’d like to extract to a new component.", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#apply" + } + ] + }, + { + "name": "@responsive", + "description": "You can generate responsive variants of your own classes by wrapping their definitions in the `@responsive` directive:\n```css\n@responsive {\n .alert {\n background-color: #E53E3E;\n }\n}\n```\n", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#responsive" + } + ] + }, + { + "name": "@screen", + "description": "The `@screen` directive allows you to create media queries that reference your breakpoints by **name** instead of duplicating their values in your own CSS:\n```css\n@screen sm {\n /* ... */\n}\n```\n…gets transformed into this:\n```css\n@media (min-width: 640px) {\n /* ... */\n}\n```\n", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#screen" + } + ] + }, + { + "name": "@variants", + "description": "Generate `hover`, `focus`, `active` and other **variants** of your own utilities by wrapping their definitions in the `@variants` directive:\n```css\n@variants hover, focus {\n .btn-brand {\n background-color: #3182CE;\n }\n}\n```\n", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#variants" + } + ] + } + ] +} diff --git a/extensions/src/platform-scripture/README.md b/extensions/src/platform-scripture/README.md index 66b121479c..338f8b398f 100644 --- a/extensions/src/platform-scripture/README.md +++ b/extensions/src/platform-scripture/README.md @@ -71,7 +71,7 @@ The `manifest.json` and `package.json` files contain information specific to you #### Hide Template Info -Once finished customizing this template to be your own, you can uncomment the [HTML comment tag](https://www.w3schools.com/html/html_comments.asp) above the [Template Info](#template-info) section to hide this template-related info in this readme. You can do this by clicking on the line and doing CTRL + / in VS Code. You can also do this manually by removing the first opening '<!--' and the only closing '-->' on the line. Leaving this info commented in your readme will hide it in your readme while avoiding merge conflicts if you decide to [update this extension from the template](#to-update-this-extension-from-the-template) in the future. If you never want to update this extension from the template, you can remove the [Template Info](#template-info) section and sub-sections of this readme. +Once finished customizing this template to be your own, you can uncomment the [HTML comment tag](https://www.w3schools.com/html/html_comments.asp) above the [Template Info](#template-info) section to hide this template-related info in this readme. You can do this by clicking on the line and doing CTRL + / in VS Code. You can also do this manually by removing the first opening '<!--' and the only closing '-->' on the line. Leaving this info commented in your readme will hide it in your readme while avoiding merge conflicts if you decide to [update this extension from the template](#to-update-this-extension-from-the-template) in the future. If you never want to update this extension from the template, you can remove the [Template Info](#template-info) section and sub-sections of this readme. Note: if you [update this extension from the template](#to-update-this-extension-from-the-template), there may be important changes in this section like additional customizations you must make to this extension. Please keep an eye out for readme changes when updating from the template. diff --git a/extensions/src/platform-scripture/package.json b/extensions/src/platform-scripture/package.json index b308232440..7c14b83004 100644 --- a/extensions/src/platform-scripture/package.json +++ b/extensions/src/platform-scripture/package.json @@ -36,13 +36,15 @@ }, "devDependencies": { "@biblionexus-foundation/scripture-utilities": "^0.0.4", - "@swc/core": "^1.7.26", - "@types/node": "^20.16.10", + "@swc/core": "^1.7.35", + "@tailwindcss/typography": "^0.5.15", + "@types/node": "^20.16.11", "@types/react": "^18.3.11", - "@types/react-dom": "^18.3.0", + "@types/react-dom": "^18.3.1", "@types/webpack": "^5.28.5", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", + "autoprefixer": "^10.4.20", "concurrently": "^9.0.1", "copy-webpack-plugin": "^12.0.2", "cross-env": "^7.0.3", @@ -53,7 +55,7 @@ "eslint-config-erb": "^4.1.0", "eslint-import-resolver-typescript": "^3.6.3", "eslint-plugin-compat": "^4.2.0", - "eslint-plugin-import": "^2.30.0", + "eslint-plugin-import": "^2.31.0", "eslint-plugin-jest": "^27.9.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-no-null": "^1.0.2", @@ -62,16 +64,22 @@ "eslint-plugin-react": "^7.37.1", "eslint-plugin-react-hooks": "^4.6.2", "glob": "^10.4.5", + "lucide-react": "^0.452.0", "papi-dts": "file:../../../lib/papi-dts", "platform-bible-react": "file:../../../lib/platform-bible-react", + "postcss": "^8.4.47", + "postcss-loader": "^8.1.1", "prettier": "^3.3.3", "prettier-plugin-jsdoc": "^1.3.0", - "sass": "^1.78.0", - "sass-loader": "^14.2.1", - "stylelint": "^16.9.0", + "sass": "^1.79.5", + "sass-loader": "^16.0.2", + "stylelint": "^16.10.0", "stylelint-config-recommended": "^14.0.1", "stylelint-config-sass-guidelines": "^12.1.0", + "stylelint-config-tailwindcss": "^0.0.7", "swc-loader": "^0.2.6", + "tailwindcss": "^3.4.13", + "tailwindcss-animate": "^1.0.7", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", "tsconfig-paths-webpack-plugin": "^4.1.0", @@ -82,6 +90,6 @@ "zip-build": "^1.8.0" }, "volta": { - "node": "20.11.1" + "extends": "../../package.json" } } diff --git a/extensions/src/platform-scripture/postcss.config.ts b/extensions/src/platform-scripture/postcss.config.ts new file mode 100644 index 0000000000..6b6f0992eb --- /dev/null +++ b/extensions/src/platform-scripture/postcss.config.ts @@ -0,0 +1,12 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/postcss.config.js and https://github.com/paranext/paranext-core/blob/main/lib/platform-bible-react/postcss.config.js + +const config = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; + +export default config; + +// #endregion diff --git a/extensions/src/platform-scripture/src/tailwind.scss b/extensions/src/platform-scripture/src/tailwind.scss new file mode 100644 index 0000000000..22f74a02c1 --- /dev/null +++ b/extensions/src/platform-scripture/src/tailwind.scss @@ -0,0 +1,140 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +/* #region shared with https://github.com/paranext/paranext-core/blob/main/lib/platform-bible-react/src/index.css */ + +@layer base { + @font-face { + font-family: 'Inter'; + font-display: 'swap'; + src: url('https://fonts.googleapis.com/css2?family=Inter:wght@100..900&display=swap'); + } + + /* + * Theme colors in Platform.Bible. These are applied in CSS properties using `hsl(var(--varName))` + * or Tailwind classes like `tw-bg-primary` + * + * See the wiki's + * [Matching Application Theme](https://github.com/paranext/paranext-extension-template/wiki/Extension-Anatomy#matching-application-theme) + * section for more information + */ + :root { + --background: 0 0% 100%; + --foreground: 222.2 84% 4.9%; + + --card: 0 0% 100%; + --card-foreground: 222.2 84% 4.9%; + + --popover: 0 0% 100%; + --popover-foreground: 222.2 84% 4.9%; + + --primary: 222.2 47.4% 11.2%; + --primary-foreground: 210 40% 98%; + + --secondary: 210 40% 96.1%; + --secondary-foreground: 222.2 47.4% 11.2%; + + --muted: 210 40% 96.1%; + --muted-foreground: 215.4 16.3% 46.9%; + + --accent: 210 40% 96.1%; + --accent-foreground: 222.2 47.4% 11.2%; + + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 210 40% 98%; + + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + --ring: 222.2 84% 4.9%; + + --radius: 0.5rem; + } + + .dark { + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + + --card: 222.2 84% 4.9%; + --card-foreground: 210 40% 98%; + + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + + --primary: 210 40% 98%; + --primary-foreground: 222.2 47.4% 11.2%; + + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + + --accent: 217.2 32.6% 17.5%; + --accent-foreground: 210 40% 98%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + + --border: 217.2 32.6% 17.5%; + --input: 217.2 32.6% 17.5%; + --ring: 212.7 26.8% 83.9%; + } + + /* using color palette https://supercolorpalette.com/?scp=G0-hsl-99827A-E7DDD0-FEF4E7-FEFAF1-FFFFFF-D8E9E3-719892-07463D-0A433D-083030-041616-000000-85DBB8-F2F52E-CD3737 */ + .paratext-light { + --background: 0 0% 100%; + --foreground: 0 0% 0%; + --muted: 33.9 32.4% 86.1%; + --muted-foreground: 15.5 13.2% 53.9%; + --popover: 0 0% 100%; + --popover-foreground: 0 0% 0%; + --card: 0 0% 100%; + --card-foreground: 0 0% 0%; + --border: 220 13% 91%; + --input: 161.3 26.7% 88.2%; + --primary: 173.4 82.1% 15.3%; + --primary-foreground: 40 85.7% 97.3%; + --secondary: 161.3 26.7% 88.2%; + --secondary-foreground: 173.4 82.1% 15.3%; + --accent: 161.3 26.7% 88.2%; + --accent-foreground: 173.4 82.1% 15.3%; + --destructive: 0 60% 51%; + --destructive-foreground: 210 20% 98%; + --ring: 13.5 13.2% 53.9%; + } + + .paratext-dark { + --background: 0 0% 0%; + --foreground: 0 0% 100%; + --muted: 15.5 13.2% 53.9%; + --muted-foreground: 33.9 32.4% 86.1%; + --popover: 180 71.4% 5%; + --popover-foreground: 0 0% 100%; + --card: 0 0% 0%; + --card-foreground: 0 0% 100%; + --border: 220 13% 20%; + --input: 220 13% 20%; + --primary: 161.3 26.7% 88.2%; + --primary-foreground: 173.4 82.1% 15.3%; + --secondary: 180 71.4% 11%; + --secondary-foreground: 161.3 26.7% 88.2%; + --accent: 180 71.4% 11%; + --accent-foreground: 161.3 26.7% 88.2%; + --destructive: 0 60% 51%; + --destructive-foreground: 210 20% 98%; + --ring: 13.5 13.2% 53.9%; + } +} + +@layer base { + * { + @apply tw-border-border; + } + + body { + @apply tw-bg-background tw-text-foreground; + } +} + +/* #endregion */ diff --git a/extensions/src/platform-scripture/tailwind.config.ts b/extensions/src/platform-scripture/tailwind.config.ts new file mode 100644 index 0000000000..d9c586c403 --- /dev/null +++ b/extensions/src/platform-scripture/tailwind.config.ts @@ -0,0 +1,93 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/tailwind.config.ts + +// #region shared with https://github.com/paranext/paranext-core/blob/main/lib/platform-bible-react/tailwind.config.ts + +import { Config } from 'tailwindcss'; +import typography from '@tailwindcss/typography'; +import tailwindCssAnimate from 'tailwindcss-animate'; + +const config: Config = { + content: ['./src/**/*.{js,ts,jsx,tsx}'], + // Prefix on all tailwind classes so they don't clash with built-in classes + // short for tailwind - we hope to have the same prefix as users of this library so the cn + // function that uses tailwind-merge can properly overwrite related tailwind classes + prefix: 'tw-', + // Theme from shadcn/ui + theme: { + container: { + center: true, + padding: '2rem', + screens: { + '2xl': '1400px', + }, + }, + extend: { + colors: { + border: 'hsl(var(--border))', + input: 'hsl(var(--input))', + ring: 'hsl(var(--ring))', + background: 'hsl(var(--background))', + foreground: 'hsl(var(--foreground))', + primary: { + DEFAULT: 'hsl(var(--primary))', + foreground: 'hsl(var(--primary-foreground))', + }, + secondary: { + DEFAULT: 'hsl(var(--secondary))', + foreground: 'hsl(var(--secondary-foreground))', + }, + destructive: { + DEFAULT: 'hsl(var(--destructive))', + foreground: 'hsl(var(--destructive-foreground))', + }, + muted: { + DEFAULT: 'hsl(var(--muted))', + foreground: 'hsl(var(--muted-foreground))', + }, + accent: { + DEFAULT: 'hsl(var(--accent))', + foreground: 'hsl(var(--accent-foreground))', + }, + popover: { + DEFAULT: 'hsl(var(--popover))', + foreground: 'hsl(var(--popover-foreground))', + }, + card: { + DEFAULT: 'hsl(var(--card))', + foreground: 'hsl(var(--card-foreground))', + }, + }, + borderRadius: { + lg: 'var(--radius)', + md: 'calc(var(--radius) - 2px)', + sm: 'calc(var(--radius) - 4px)', + }, + keyframes: { + 'accordion-down': { + from: { height: '0' }, + to: { height: 'var(--radix-accordion-content-height)' }, + }, + 'accordion-up': { + from: { height: 'var(--radix-accordion-content-height)' }, + to: { height: '0' }, + }, + }, + animation: { + 'accordion-down': 'accordion-down 0.2s ease-out', + 'accordion-up': 'accordion-up 0.2s ease-out', + }, + }, + }, + plugins: [ + // Prose styles as sensible defaults for markdown renderer component + typography(), + // Animations in tailwind style + tailwindCssAnimate, + + // #endregion + ], +}; + +export default config; + +// #endregion diff --git a/extensions/src/platform-scripture/webpack/webpack.config.base.ts b/extensions/src/platform-scripture/webpack/webpack.config.base.ts index 3eafc61c32..fc52d7d847 100644 --- a/extensions/src/platform-scripture/webpack/webpack.config.base.ts +++ b/extensions/src/platform-scripture/webpack/webpack.config.base.ts @@ -1,8 +1,9 @@ -// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/webpack/webpack.config.base.ts - import path from 'path'; import TsconfigPathsPlugin from 'tsconfig-paths-webpack-plugin'; import webpack from 'webpack'; +import { LIBRARY_TYPE } from './webpack.util'; + +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/webpack/webpack.config.base.ts const isDev = process.env.NODE_ENV !== 'production'; const shouldGenerateSourceMaps = isDev || process.env.DEBUG_PROD; @@ -10,16 +11,6 @@ const shouldGenerateSourceMaps = isDev || process.env.DEBUG_PROD; /** The base directory from which webpack should operate (should be the root repo folder) */ export const rootDir = path.resolve(__dirname, '..'); -/** - * The module format of library we want webpack to use for externals and create for our extensions - * - * @see webpack.Configuration['externalsType'] for info about external import format - * @see webpack.LibraryOptions['type'] for info about library format - */ -// commonjs-static formats the code to export everything on module.exports. so it works -// well in cjs or esm https://webpack.js.org/configuration/output/#type-commonjs-static -export const LIBRARY_TYPE: NonNullable = 'commonjs-static'; - // Note: we do not want to do any chunking because neither webViews nor main can import dependencies // other than those listed in configBase.externals. Each webView must contain all its dependency // code, and main must contain all its dependency code. @@ -98,6 +89,8 @@ const configBase: webpack.Configuration = { // into dom. style-loader would add html style elements for our styles if we used it // We are not using css-loader since we are getting style files using ?inline. css-loader // would allow us to import CSS into CommonJS + // Processes style transformations in PostCSS - after scss so PostCSS runs on just css + 'postcss-loader', // Compiles Sass to CSS 'sass-loader', ], diff --git a/extensions/src/platform-scripture/webpack/webpack.config.main.ts b/extensions/src/platform-scripture/webpack/webpack.config.main.ts index 5a25bc6dde..ec85634147 100644 --- a/extensions/src/platform-scripture/webpack/webpack.config.main.ts +++ b/extensions/src/platform-scripture/webpack/webpack.config.main.ts @@ -2,9 +2,9 @@ import webpack from 'webpack'; import path from 'path'; import merge from 'webpack-merge'; import CopyPlugin from 'copy-webpack-plugin'; -import configBase, { LIBRARY_TYPE, rootDir } from './webpack.config.base'; +import configBase, { rootDir } from './webpack.config.base'; import WebViewResolveWebpackPlugin from './web-view-resolve-webpack-plugin'; -import { outputFolder } from './webpack.util'; +import { LIBRARY_TYPE, outputFolder } from './webpack.util'; /** Webpack configuration for building main */ const configMain: webpack.Configuration = merge(configBase, { diff --git a/extensions/src/platform-scripture/webpack/webpack.util.ts b/extensions/src/platform-scripture/webpack/webpack.util.ts index cf465e3832..ea78e4acc3 100644 --- a/extensions/src/platform-scripture/webpack/webpack.util.ts +++ b/extensions/src/platform-scripture/webpack/webpack.util.ts @@ -25,6 +25,16 @@ export const webViewTempDir = 'temp-build'; /** Folder containing the built extension files */ export const outputFolder = 'dist'; +/** + * The module format of library we want webpack to use for externals and create for our extensions + * + * @see webpack.Configuration['externalsType'] for info about external import format + * @see webpack.LibraryOptions['type'] for info about library format + */ +// commonjs-static formats the code to export everything on module.exports. so it works +// well in cjs or esm https://webpack.js.org/configuration/output/#type-commonjs-static +export const LIBRARY_TYPE: NonNullable = 'commonjs-static'; + /** Get a list of TypeScript WebView files to bundle. Path relative to project root */ function getWebViewTsxPaths() { return glob(webViewTsxGlob, { ignore: 'node_modules/**' }); diff --git a/extensions/src/quick-verse/.stylelintrc.js b/extensions/src/quick-verse/.stylelintrc.js index 70f5dd2d0e..7161ad789c 100644 --- a/extensions/src/quick-verse/.stylelintrc.js +++ b/extensions/src/quick-verse/.stylelintrc.js @@ -1,7 +1,11 @@ // #region shared with https://github.com/paranext/paranext-core/blob/main/.stylelintrc.js and https://github.com/paranext/paranext-multi-extension-template/blob/main/.stylelintrc.cjs module.exports = { - extends: ['stylelint-config-recommended', 'stylelint-config-sass-guidelines'], + extends: [ + 'stylelint-config-recommended', + 'stylelint-config-sass-guidelines', + 'stylelint-config-tailwindcss/scss', + ], overrides: [ { files: ['**/*.scss'], diff --git a/extensions/src/quick-verse/.vscode/settings.json b/extensions/src/quick-verse/.vscode/settings.json index cefc6be5ed..89083d1150 100644 --- a/extensions/src/quick-verse/.vscode/settings.json +++ b/extensions/src/quick-verse/.vscode/settings.json @@ -1,4 +1,6 @@ { + "css.customData": [".vscode/tailwindcss.json"], + "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true, "editor.rulers": [100], diff --git a/extensions/src/quick-verse/.vscode/tailwindcss.json b/extensions/src/quick-verse/.vscode/tailwindcss.json new file mode 100644 index 0000000000..83f02d51a9 --- /dev/null +++ b/extensions/src/quick-verse/.vscode/tailwindcss.json @@ -0,0 +1,56 @@ +{ + "version": 1.1, + "credit": "https://duncanleung.com/tailwind-css-unknown-at-rule/", + "atDirectives": [ + { + "name": "@tailwind", + "description": "Use the `@tailwind` directive to insert Tailwind's `base`, `components`, `utilities` and `screens` styles into your CSS.", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#tailwind" + } + ] + }, + { + "name": "@apply", + "description": "Use the `@apply` directive to inline any existing utility classes into your own custom CSS. This is useful when you find a common utility pattern in your HTML that you’d like to extract to a new component.", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#apply" + } + ] + }, + { + "name": "@responsive", + "description": "You can generate responsive variants of your own classes by wrapping their definitions in the `@responsive` directive:\n```css\n@responsive {\n .alert {\n background-color: #E53E3E;\n }\n}\n```\n", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#responsive" + } + ] + }, + { + "name": "@screen", + "description": "The `@screen` directive allows you to create media queries that reference your breakpoints by **name** instead of duplicating their values in your own CSS:\n```css\n@screen sm {\n /* ... */\n}\n```\n…gets transformed into this:\n```css\n@media (min-width: 640px) {\n /* ... */\n}\n```\n", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#screen" + } + ] + }, + { + "name": "@variants", + "description": "Generate `hover`, `focus`, `active` and other **variants** of your own utilities by wrapping their definitions in the `@variants` directive:\n```css\n@variants hover, focus {\n .btn-brand {\n background-color: #3182CE;\n }\n}\n```\n", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#variants" + } + ] + } + ] +} diff --git a/extensions/src/quick-verse/README.md b/extensions/src/quick-verse/README.md index 7fdd26cdd6..e2525e47be 100644 --- a/extensions/src/quick-verse/README.md +++ b/extensions/src/quick-verse/README.md @@ -71,7 +71,7 @@ The `manifest.json` and `package.json` files contain information specific to you #### Hide Template Info -Once finished customizing this template to be your own, you can uncomment the [HTML comment tag](https://www.w3schools.com/html/html_comments.asp) above the [Template Info](#template-info) section to hide this template-related info in this readme. You can do this by clicking on the line and doing CTRL + / in VS Code. You can also do this manually by removing the first opening '<!--' and the only closing '-->' on the line. Leaving this info commented in your readme will hide it in your readme while avoiding merge conflicts if you decide to [update this extension from the template](#to-update-this-extension-from-the-template) in the future. If you never want to update this extension from the template, you can remove the [Template Info](#template-info) section and sub-sections of this readme. +Once finished customizing this template to be your own, you can uncomment the [HTML comment tag](https://www.w3schools.com/html/html_comments.asp) above the [Template Info](#template-info) section to hide this template-related info in this readme. You can do this by clicking on the line and doing CTRL + / in VS Code. You can also do this manually by removing the first opening '<!--' and the only closing '-->' on the line. Leaving this info commented in your readme will hide it in your readme while avoiding merge conflicts if you decide to [update this extension from the template](#to-update-this-extension-from-the-template) in the future. If you never want to update this extension from the template, you can remove the [Template Info](#template-info) section and sub-sections of this readme. Note: if you [update this extension from the template](#to-update-this-extension-from-the-template), there may be important changes in this section like additional customizations you must make to this extension. Please keep an eye out for readme changes when updating from the template. diff --git a/extensions/src/quick-verse/package.json b/extensions/src/quick-verse/package.json index 84764f7746..befd192c15 100644 --- a/extensions/src/quick-verse/package.json +++ b/extensions/src/quick-verse/package.json @@ -36,13 +36,15 @@ "platform-bible-utils": "file:../../../lib/platform-bible-utils" }, "devDependencies": { - "@swc/core": "^1.7.26", - "@types/node": "^20.16.10", + "@swc/core": "^1.7.35", + "@tailwindcss/typography": "^0.5.15", + "@types/node": "^20.16.11", "@types/react": "^18.3.11", - "@types/react-dom": "^18.3.0", + "@types/react-dom": "^18.3.1", "@types/webpack": "^5.28.5", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", + "autoprefixer": "^10.4.20", "concurrently": "^9.0.1", "copy-webpack-plugin": "^12.0.2", "cross-env": "^7.0.3", @@ -53,7 +55,7 @@ "eslint-config-erb": "^4.1.0", "eslint-import-resolver-typescript": "^3.6.3", "eslint-plugin-compat": "^4.2.0", - "eslint-plugin-import": "^2.30.0", + "eslint-plugin-import": "^2.31.0", "eslint-plugin-jest": "^27.9.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-no-null": "^1.0.2", @@ -62,16 +64,22 @@ "eslint-plugin-react": "^7.37.1", "eslint-plugin-react-hooks": "^4.6.2", "glob": "^10.4.5", + "lucide-react": "^0.452.0", "papi-dts": "file:../../../lib/papi-dts", "platform-bible-react": "file:../../../lib/platform-bible-react", + "postcss": "^8.4.47", + "postcss-loader": "^8.1.1", "prettier": "^3.3.3", "prettier-plugin-jsdoc": "^1.3.0", - "sass": "^1.78.0", - "sass-loader": "^14.2.1", - "stylelint": "^16.9.0", + "sass": "^1.79.5", + "sass-loader": "^16.0.2", + "stylelint": "^16.10.0", "stylelint-config-recommended": "^14.0.1", "stylelint-config-sass-guidelines": "^12.1.0", + "stylelint-config-tailwindcss": "^0.0.7", "swc-loader": "^0.2.6", + "tailwindcss": "^3.4.13", + "tailwindcss-animate": "^1.0.7", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", "tsconfig-paths-webpack-plugin": "^4.1.0", diff --git a/extensions/src/quick-verse/postcss.config.ts b/extensions/src/quick-verse/postcss.config.ts new file mode 100644 index 0000000000..6b6f0992eb --- /dev/null +++ b/extensions/src/quick-verse/postcss.config.ts @@ -0,0 +1,12 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/postcss.config.js and https://github.com/paranext/paranext-core/blob/main/lib/platform-bible-react/postcss.config.js + +const config = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; + +export default config; + +// #endregion diff --git a/extensions/src/quick-verse/src/tailwind.scss b/extensions/src/quick-verse/src/tailwind.scss new file mode 100644 index 0000000000..22f74a02c1 --- /dev/null +++ b/extensions/src/quick-verse/src/tailwind.scss @@ -0,0 +1,140 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +/* #region shared with https://github.com/paranext/paranext-core/blob/main/lib/platform-bible-react/src/index.css */ + +@layer base { + @font-face { + font-family: 'Inter'; + font-display: 'swap'; + src: url('https://fonts.googleapis.com/css2?family=Inter:wght@100..900&display=swap'); + } + + /* + * Theme colors in Platform.Bible. These are applied in CSS properties using `hsl(var(--varName))` + * or Tailwind classes like `tw-bg-primary` + * + * See the wiki's + * [Matching Application Theme](https://github.com/paranext/paranext-extension-template/wiki/Extension-Anatomy#matching-application-theme) + * section for more information + */ + :root { + --background: 0 0% 100%; + --foreground: 222.2 84% 4.9%; + + --card: 0 0% 100%; + --card-foreground: 222.2 84% 4.9%; + + --popover: 0 0% 100%; + --popover-foreground: 222.2 84% 4.9%; + + --primary: 222.2 47.4% 11.2%; + --primary-foreground: 210 40% 98%; + + --secondary: 210 40% 96.1%; + --secondary-foreground: 222.2 47.4% 11.2%; + + --muted: 210 40% 96.1%; + --muted-foreground: 215.4 16.3% 46.9%; + + --accent: 210 40% 96.1%; + --accent-foreground: 222.2 47.4% 11.2%; + + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 210 40% 98%; + + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + --ring: 222.2 84% 4.9%; + + --radius: 0.5rem; + } + + .dark { + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + + --card: 222.2 84% 4.9%; + --card-foreground: 210 40% 98%; + + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + + --primary: 210 40% 98%; + --primary-foreground: 222.2 47.4% 11.2%; + + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + + --accent: 217.2 32.6% 17.5%; + --accent-foreground: 210 40% 98%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + + --border: 217.2 32.6% 17.5%; + --input: 217.2 32.6% 17.5%; + --ring: 212.7 26.8% 83.9%; + } + + /* using color palette https://supercolorpalette.com/?scp=G0-hsl-99827A-E7DDD0-FEF4E7-FEFAF1-FFFFFF-D8E9E3-719892-07463D-0A433D-083030-041616-000000-85DBB8-F2F52E-CD3737 */ + .paratext-light { + --background: 0 0% 100%; + --foreground: 0 0% 0%; + --muted: 33.9 32.4% 86.1%; + --muted-foreground: 15.5 13.2% 53.9%; + --popover: 0 0% 100%; + --popover-foreground: 0 0% 0%; + --card: 0 0% 100%; + --card-foreground: 0 0% 0%; + --border: 220 13% 91%; + --input: 161.3 26.7% 88.2%; + --primary: 173.4 82.1% 15.3%; + --primary-foreground: 40 85.7% 97.3%; + --secondary: 161.3 26.7% 88.2%; + --secondary-foreground: 173.4 82.1% 15.3%; + --accent: 161.3 26.7% 88.2%; + --accent-foreground: 173.4 82.1% 15.3%; + --destructive: 0 60% 51%; + --destructive-foreground: 210 20% 98%; + --ring: 13.5 13.2% 53.9%; + } + + .paratext-dark { + --background: 0 0% 0%; + --foreground: 0 0% 100%; + --muted: 15.5 13.2% 53.9%; + --muted-foreground: 33.9 32.4% 86.1%; + --popover: 180 71.4% 5%; + --popover-foreground: 0 0% 100%; + --card: 0 0% 0%; + --card-foreground: 0 0% 100%; + --border: 220 13% 20%; + --input: 220 13% 20%; + --primary: 161.3 26.7% 88.2%; + --primary-foreground: 173.4 82.1% 15.3%; + --secondary: 180 71.4% 11%; + --secondary-foreground: 161.3 26.7% 88.2%; + --accent: 180 71.4% 11%; + --accent-foreground: 161.3 26.7% 88.2%; + --destructive: 0 60% 51%; + --destructive-foreground: 210 20% 98%; + --ring: 13.5 13.2% 53.9%; + } +} + +@layer base { + * { + @apply tw-border-border; + } + + body { + @apply tw-bg-background tw-text-foreground; + } +} + +/* #endregion */ diff --git a/extensions/src/quick-verse/tailwind.config.ts b/extensions/src/quick-verse/tailwind.config.ts new file mode 100644 index 0000000000..d9c586c403 --- /dev/null +++ b/extensions/src/quick-verse/tailwind.config.ts @@ -0,0 +1,93 @@ +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/tailwind.config.ts + +// #region shared with https://github.com/paranext/paranext-core/blob/main/lib/platform-bible-react/tailwind.config.ts + +import { Config } from 'tailwindcss'; +import typography from '@tailwindcss/typography'; +import tailwindCssAnimate from 'tailwindcss-animate'; + +const config: Config = { + content: ['./src/**/*.{js,ts,jsx,tsx}'], + // Prefix on all tailwind classes so they don't clash with built-in classes + // short for tailwind - we hope to have the same prefix as users of this library so the cn + // function that uses tailwind-merge can properly overwrite related tailwind classes + prefix: 'tw-', + // Theme from shadcn/ui + theme: { + container: { + center: true, + padding: '2rem', + screens: { + '2xl': '1400px', + }, + }, + extend: { + colors: { + border: 'hsl(var(--border))', + input: 'hsl(var(--input))', + ring: 'hsl(var(--ring))', + background: 'hsl(var(--background))', + foreground: 'hsl(var(--foreground))', + primary: { + DEFAULT: 'hsl(var(--primary))', + foreground: 'hsl(var(--primary-foreground))', + }, + secondary: { + DEFAULT: 'hsl(var(--secondary))', + foreground: 'hsl(var(--secondary-foreground))', + }, + destructive: { + DEFAULT: 'hsl(var(--destructive))', + foreground: 'hsl(var(--destructive-foreground))', + }, + muted: { + DEFAULT: 'hsl(var(--muted))', + foreground: 'hsl(var(--muted-foreground))', + }, + accent: { + DEFAULT: 'hsl(var(--accent))', + foreground: 'hsl(var(--accent-foreground))', + }, + popover: { + DEFAULT: 'hsl(var(--popover))', + foreground: 'hsl(var(--popover-foreground))', + }, + card: { + DEFAULT: 'hsl(var(--card))', + foreground: 'hsl(var(--card-foreground))', + }, + }, + borderRadius: { + lg: 'var(--radius)', + md: 'calc(var(--radius) - 2px)', + sm: 'calc(var(--radius) - 4px)', + }, + keyframes: { + 'accordion-down': { + from: { height: '0' }, + to: { height: 'var(--radix-accordion-content-height)' }, + }, + 'accordion-up': { + from: { height: 'var(--radix-accordion-content-height)' }, + to: { height: '0' }, + }, + }, + animation: { + 'accordion-down': 'accordion-down 0.2s ease-out', + 'accordion-up': 'accordion-up 0.2s ease-out', + }, + }, + }, + plugins: [ + // Prose styles as sensible defaults for markdown renderer component + typography(), + // Animations in tailwind style + tailwindCssAnimate, + + // #endregion + ], +}; + +export default config; + +// #endregion diff --git a/extensions/src/quick-verse/webpack/webpack.config.base.ts b/extensions/src/quick-verse/webpack/webpack.config.base.ts index 3eafc61c32..fc52d7d847 100644 --- a/extensions/src/quick-verse/webpack/webpack.config.base.ts +++ b/extensions/src/quick-verse/webpack/webpack.config.base.ts @@ -1,8 +1,9 @@ -// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/webpack/webpack.config.base.ts - import path from 'path'; import TsconfigPathsPlugin from 'tsconfig-paths-webpack-plugin'; import webpack from 'webpack'; +import { LIBRARY_TYPE } from './webpack.util'; + +// #region shared with https://github.com/paranext/paranext-multi-extension-template/blob/main/webpack/webpack.config.base.ts const isDev = process.env.NODE_ENV !== 'production'; const shouldGenerateSourceMaps = isDev || process.env.DEBUG_PROD; @@ -10,16 +11,6 @@ const shouldGenerateSourceMaps = isDev || process.env.DEBUG_PROD; /** The base directory from which webpack should operate (should be the root repo folder) */ export const rootDir = path.resolve(__dirname, '..'); -/** - * The module format of library we want webpack to use for externals and create for our extensions - * - * @see webpack.Configuration['externalsType'] for info about external import format - * @see webpack.LibraryOptions['type'] for info about library format - */ -// commonjs-static formats the code to export everything on module.exports. so it works -// well in cjs or esm https://webpack.js.org/configuration/output/#type-commonjs-static -export const LIBRARY_TYPE: NonNullable = 'commonjs-static'; - // Note: we do not want to do any chunking because neither webViews nor main can import dependencies // other than those listed in configBase.externals. Each webView must contain all its dependency // code, and main must contain all its dependency code. @@ -98,6 +89,8 @@ const configBase: webpack.Configuration = { // into dom. style-loader would add html style elements for our styles if we used it // We are not using css-loader since we are getting style files using ?inline. css-loader // would allow us to import CSS into CommonJS + // Processes style transformations in PostCSS - after scss so PostCSS runs on just css + 'postcss-loader', // Compiles Sass to CSS 'sass-loader', ], diff --git a/extensions/src/quick-verse/webpack/webpack.config.main.ts b/extensions/src/quick-verse/webpack/webpack.config.main.ts index 5a25bc6dde..ec85634147 100644 --- a/extensions/src/quick-verse/webpack/webpack.config.main.ts +++ b/extensions/src/quick-verse/webpack/webpack.config.main.ts @@ -2,9 +2,9 @@ import webpack from 'webpack'; import path from 'path'; import merge from 'webpack-merge'; import CopyPlugin from 'copy-webpack-plugin'; -import configBase, { LIBRARY_TYPE, rootDir } from './webpack.config.base'; +import configBase, { rootDir } from './webpack.config.base'; import WebViewResolveWebpackPlugin from './web-view-resolve-webpack-plugin'; -import { outputFolder } from './webpack.util'; +import { LIBRARY_TYPE, outputFolder } from './webpack.util'; /** Webpack configuration for building main */ const configMain: webpack.Configuration = merge(configBase, { diff --git a/extensions/src/quick-verse/webpack/webpack.util.ts b/extensions/src/quick-verse/webpack/webpack.util.ts index cf465e3832..ea78e4acc3 100644 --- a/extensions/src/quick-verse/webpack/webpack.util.ts +++ b/extensions/src/quick-verse/webpack/webpack.util.ts @@ -25,6 +25,16 @@ export const webViewTempDir = 'temp-build'; /** Folder containing the built extension files */ export const outputFolder = 'dist'; +/** + * The module format of library we want webpack to use for externals and create for our extensions + * + * @see webpack.Configuration['externalsType'] for info about external import format + * @see webpack.LibraryOptions['type'] for info about library format + */ +// commonjs-static formats the code to export everything on module.exports. so it works +// well in cjs or esm https://webpack.js.org/configuration/output/#type-commonjs-static +export const LIBRARY_TYPE: NonNullable = 'commonjs-static'; + /** Get a list of TypeScript WebView files to bundle. Path relative to project root */ function getWebViewTsxPaths() { return glob(webViewTsxGlob, { ignore: 'node_modules/**' }); diff --git a/extensions/tailwind.config.ts b/extensions/tailwind.config.ts new file mode 100644 index 0000000000..abbd71051b --- /dev/null +++ b/extensions/tailwind.config.ts @@ -0,0 +1,93 @@ +// #region shared with https://github.com/paranext/paranext-extension-template/blob/main/tailwind.config.ts + +// #region shared with https://github.com/paranext/paranext-core/blob/main/lib/platform-bible-react/tailwind.config.ts + +import { Config } from 'tailwindcss'; +import typography from '@tailwindcss/typography'; +import tailwindCssAnimate from 'tailwindcss-animate'; + +const config: Config = { + content: ['./src/**/*.{js,ts,jsx,tsx}'], + // Prefix on all tailwind classes so they don't clash with built-in classes + // short for tailwind - we hope to have the same prefix as users of this library so the cn + // function that uses tailwind-merge can properly overwrite related tailwind classes + prefix: 'tw-', + // Theme from shadcn/ui + theme: { + container: { + center: true, + padding: '2rem', + screens: { + '2xl': '1400px', + }, + }, + extend: { + colors: { + border: 'hsl(var(--border))', + input: 'hsl(var(--input))', + ring: 'hsl(var(--ring))', + background: 'hsl(var(--background))', + foreground: 'hsl(var(--foreground))', + primary: { + DEFAULT: 'hsl(var(--primary))', + foreground: 'hsl(var(--primary-foreground))', + }, + secondary: { + DEFAULT: 'hsl(var(--secondary))', + foreground: 'hsl(var(--secondary-foreground))', + }, + destructive: { + DEFAULT: 'hsl(var(--destructive))', + foreground: 'hsl(var(--destructive-foreground))', + }, + muted: { + DEFAULT: 'hsl(var(--muted))', + foreground: 'hsl(var(--muted-foreground))', + }, + accent: { + DEFAULT: 'hsl(var(--accent))', + foreground: 'hsl(var(--accent-foreground))', + }, + popover: { + DEFAULT: 'hsl(var(--popover))', + foreground: 'hsl(var(--popover-foreground))', + }, + card: { + DEFAULT: 'hsl(var(--card))', + foreground: 'hsl(var(--card-foreground))', + }, + }, + borderRadius: { + lg: 'var(--radius)', + md: 'calc(var(--radius) - 2px)', + sm: 'calc(var(--radius) - 4px)', + }, + keyframes: { + 'accordion-down': { + from: { height: '0' }, + to: { height: 'var(--radix-accordion-content-height)' }, + }, + 'accordion-up': { + from: { height: 'var(--radix-accordion-content-height)' }, + to: { height: '0' }, + }, + }, + animation: { + 'accordion-down': 'accordion-down 0.2s ease-out', + 'accordion-up': 'accordion-up 0.2s ease-out', + }, + }, + }, + plugins: [ + // Prose styles as sensible defaults for markdown renderer component + typography(), + // Animations in tailwind style + tailwindCssAnimate, + + // #endregion + ], +}; + +export default config; + +// #endregion diff --git a/extensions/webpack/webpack.config.base.ts b/extensions/webpack/webpack.config.base.ts index 5f579faf71..bd13b18c7d 100644 --- a/extensions/webpack/webpack.config.base.ts +++ b/extensions/webpack/webpack.config.base.ts @@ -1,8 +1,20 @@ -// #region shared with https://github.com/paranext/paranext-extension-template/blob/main/webpack/webpack.config.base.ts - import path from 'path'; import TsconfigPathsPlugin from 'tsconfig-paths-webpack-plugin'; import webpack from 'webpack'; +import { getExtensionFolderNamesSync, LIBRARY_TYPE } from './webpack.util'; + +// Exit if there are no extensions yet +const areExtensionsPresent = getExtensionFolderNamesSync().length > 0; +if (!areExtensionsPresent) { + // This is a command-line utility for which it is fine to print to the console + // eslint-disable-next-line no-console + console.log( + 'No extensions found! Please run `npm run create-extension -- ` to create an extension. See README.md for more information.', + ); + process.exit(0); +} + +// #region shared with https://github.com/paranext/paranext-extension-template/blob/main/webpack/webpack.config.base.ts const isDev = process.env.NODE_ENV !== 'production'; const shouldGenerateSourceMaps = isDev || process.env.DEBUG_PROD; @@ -10,16 +22,6 @@ const shouldGenerateSourceMaps = isDev || process.env.DEBUG_PROD; /** The base directory from which webpack should operate (should be the root repo folder) */ export const rootDir = path.resolve(__dirname, '..'); -/** - * The module format of library we want webpack to use for externals and create for our extensions - * - * @see webpack.Configuration['externalsType'] for info about external import format - * @see webpack.LibraryOptions['type'] for info about library format - */ -// commonjs-static formats the code to export everything on module.exports. so it works -// well in cjs or esm https://webpack.js.org/configuration/output/#type-commonjs-static -export const LIBRARY_TYPE: NonNullable = 'commonjs-static'; - // Note: we do not want to do any chunking because neither webViews nor main can import dependencies // other than those listed in configBase.externals. Each webView must contain all its dependency // code, and main must contain all its dependency code. @@ -98,6 +100,8 @@ const configBase: webpack.Configuration = { // into dom. style-loader would add html style elements for our styles if we used it // We are not using css-loader since we are getting style files using ?inline. css-loader // would allow us to import CSS into CommonJS + // Processes style transformations in PostCSS - after scss so PostCSS runs on just css + 'postcss-loader', // Compiles Sass to CSS 'sass-loader', ], diff --git a/extensions/webpack/webpack.config.main.ts b/extensions/webpack/webpack.config.main.ts index 2258c1c307..cf47381a78 100644 --- a/extensions/webpack/webpack.config.main.ts +++ b/extensions/webpack/webpack.config.main.ts @@ -2,13 +2,14 @@ import webpack from 'webpack'; import path from 'path'; import merge from 'webpack-merge'; import CopyPlugin from 'copy-webpack-plugin'; -import configBase, { LIBRARY_TYPE, rootDir } from './webpack.config.base'; +import configBase, { rootDir } from './webpack.config.base'; import WebViewResolveWebpackPlugin from './web-view-resolve-webpack-plugin'; import { outputFolder, getExtensions, getMainCopyFilePatterns, getMainEntries, + LIBRARY_TYPE, } from './webpack.util'; /** Webpack configuration for building main */ diff --git a/extensions/webpack/webpack.util.ts b/extensions/webpack/webpack.util.ts index 022e37e1c0..d06b01aaa7 100644 --- a/extensions/webpack/webpack.util.ts +++ b/extensions/webpack/webpack.util.ts @@ -3,7 +3,6 @@ import path from 'path'; import { glob } from 'glob'; import fs from 'fs'; import { Pattern } from 'copy-webpack-plugin'; -import { LIBRARY_TYPE } from './webpack.config.base'; // #region shared with https://github.com/paranext/paranext-extension-template/blob/main/webpack/webpack.util.ts @@ -28,6 +27,16 @@ export const webViewTempDir = 'temp-build'; /** Folder containing the built extension files */ export const outputFolder = 'dist'; +/** + * The module format of library we want webpack to use for externals and create for our extensions + * + * @see webpack.Configuration['externalsType'] for info about external import format + * @see webpack.LibraryOptions['type'] for info about library format + */ +// commonjs-static formats the code to export everything on module.exports. so it works +// well in cjs or esm https://webpack.js.org/configuration/output/#type-commonjs-static +export const LIBRARY_TYPE: NonNullable = 'commonjs-static'; + /** Get a list of TypeScript WebView files to bundle. Path relative to project root */ function getWebViewTsxPaths() { return glob(webViewTsxGlob, { ignore: 'node_modules/**' }); @@ -333,14 +342,36 @@ export type ExtensionInfo = ExtensionManifest & { shouldCopyOnly?: boolean; }; +/** Cached list of extension folder names */ +let extensionFolderNamesCached: string[] | undefined; + /** - * Gets a list of the extension folders and their respective entry files + * Get a list of the names of the folders with extensions in them (in the source folder) * - * Note that this does not transform the main file .ts into .js unlike extension.service + * Synchronous version of `getExtensionFolderNames` */ -export async function getExtensions(): Promise { - // Get names of each folder in the source folder - const extensionFolderNames = ( +export function getExtensionFolderNamesSync(): string[] { + if (extensionFolderNamesCached) return extensionFolderNamesCached; + + extensionFolderNamesCached = fs + .readdirSync(sourceFolder, { + withFileTypes: true, + }) + .filter((dirEntry) => dirEntry.isDirectory()) + .map((dirEntry) => dirEntry.name); + + return extensionFolderNamesCached; +} + +/** + * Get a list of the names of the folders with extensions in them (in the source folder) + * + * Asynchronous version of `getExtensionFolderNamesSync` + */ +export async function getExtensionFolderNames(): Promise { + if (extensionFolderNamesCached) return extensionFolderNamesCached; + + extensionFolderNamesCached = ( await fs.promises.readdir(sourceFolder, { withFileTypes: true, }) @@ -348,6 +379,18 @@ export async function getExtensions(): Promise { .filter((dirEntry) => dirEntry.isDirectory()) .map((dirEntry) => dirEntry.name); + return extensionFolderNamesCached; +} + +/** + * Gets a list of the extension folders and their respective entry files + * + * Note that this does not transform the main file .ts into .js unlike extension.service + */ +export async function getExtensions(): Promise { + // Get names of each folder in the source folder + const extensionFolderNames = await getExtensionFolderNames(); + // Return extension info for each extension folder // We're filtering out the `undefined` entries, so assert that there is no `undefined` // eslint-disable-next-line no-type-assertion/no-type-assertion diff --git a/lib/papi-dts/package.json b/lib/papi-dts/package.json index 0f89f9a773..b6eb775061 100644 --- a/lib/papi-dts/package.json +++ b/lib/papi-dts/package.json @@ -45,7 +45,7 @@ "devDependencies": { "escape-string-regexp": "^5.0.0", "rimraf": "^6.0.1", - "typedoc": "^0.26.7", + "typedoc": "^0.26.9", "typescript": "^5.4.5" }, "volta": { diff --git a/lib/platform-bible-react/package.json b/lib/platform-bible-react/package.json index cdea86130b..149a9cf8bb 100644 --- a/lib/platform-bible-react/package.json +++ b/lib/platform-bible-react/package.json @@ -65,11 +65,11 @@ "@radix-ui/react-toggle": "^1.1.0", "@radix-ui/react-toggle-group": "^1.1.0", "@tanstack/react-table": "^8.19.2", - "autoprefixer": "^10.4.19", + "autoprefixer": "^10.4.20", "class-variance-authority": "^0.7.0", "clsx": "^2.1.0", "cmdk": "^1.0.0", - "lucide-react": "^0.367.0", + "lucide-react": "^0.452.0", "next-themes": "^0.3.0", "platform-bible-utils": "file:../platform-bible-utils", "react-data-grid": ">=7.0.0-beta.42", @@ -78,7 +78,7 @@ "tailwindcss-animate": "^1.0.7" }, "devDependencies": { - "@babel/preset-env": "^7.25.7", + "@babel/preset-env": "^7.25.8", "@babel/preset-react": "^7.25.7", "@babel/preset-typescript": "^7.25.7", "@mui/icons-material": "^5.15.10", @@ -90,7 +90,7 @@ "@testing-library/user-event": "^14.5.2", "@types/jest": "^29.5.13", "@types/react": "^18.3.11", - "@types/react-dom": "^18.3.0", + "@types/react-dom": "^18.3.1", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", "@vitejs/plugin-react": "^4.3.2", @@ -103,15 +103,15 @@ "prettier": "^3.3.3", "prettier-plugin-jsdoc": "^1.3.0", "prettier-plugin-tailwindcss": "^0.6.1", - "stylelint": "^16.9.0", + "stylelint": "^16.10.0", "stylelint-config-recommended": "^14.0.1", - "stylelint-config-sass-guidelines": "^11.1.0", + "stylelint-config-sass-guidelines": "^12.1.0", "stylelint-config-tailwindcss": "^0.0.7", "tailwindcss": "^3.4.3", "tailwindcss-scoped-preflight": "^2.1.0", "ts-jest": "^29.2.5", "tslib": "^2.7.0", - "typedoc": "^0.26.7", + "typedoc": "^0.26.9", "typescript": "^5.4.5", "vite": "^4.5.5", "vite-tsconfig-paths": "^4.3.2" diff --git a/lib/platform-bible-utils/package.json b/lib/platform-bible-utils/package.json index 4c510e663b..108f370046 100644 --- a/lib/platform-bible-utils/package.json +++ b/lib/platform-bible-utils/package.json @@ -56,9 +56,9 @@ "prettier-plugin-jsdoc": "^1.3.0", "stringz": "^2.1.0", "tslib": "^2.7.0", - "typedoc": "^0.26.7", + "typedoc": "^0.26.9", "typescript": "^5.4.5", - "vite": "^5.4.8" + "vite": "^5.4.9" }, "volta": { "extends": "../../package.json" diff --git a/package-lock.json b/package-lock.json index edf3e3224e..3f3a608c28 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35,15 +35,15 @@ "react": "^18.3.1", "react-data-grid": "^7.0.0-beta.42", "react-dom": "^18.3.1", - "react-router-dom": "^6.26.2", + "react-router-dom": "^6.27.0", "ws": "^8.18.0" }, "devDependencies": { - "@babel/preset-env": "^7.25.7", + "@babel/preset-env": "^7.25.8", "@babel/preset-react": "^7.25.7", "@babel/preset-typescript": "^7.25.7", "@electron/notarize": "^2.3.2", - "@electron/rebuild": "^3.6.2", + "@electron/rebuild": "^3.7.0", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.15", "@storybook/addon-essentials": "^8.3.4", "@storybook/addon-interactions": "^8.3.4", @@ -61,10 +61,10 @@ "@testing-library/react": "^16.0.1", "@types/electron-devtools-installer": "^2.2.5", "@types/jest": "^29.5.13", - "@types/node": "^20.16.10", + "@types/node": "^20.16.11", "@types/node-localstorage": "^1.3.3", "@types/react": "^18.3.11", - "@types/react-dom": "^18.3.0", + "@types/react-dom": "^18.3.1", "@types/react-test-renderer": "^18.3.0", "@types/source-map-support": "^0.5.10", "@types/webpack-bundle-analyzer": "^4.7.0", @@ -88,7 +88,7 @@ "eslint-import-resolver-typescript": "^3.6.3", "eslint-import-resolver-webpack": "^0.13.9", "eslint-plugin-compat": "^4.2.0", - "eslint-plugin-import": "^2.30.0", + "eslint-plugin-import": "^2.31.0", "eslint-plugin-jest": "^27.9.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-no-null": "^1.0.2", @@ -115,11 +115,11 @@ "react-test-renderer": "^18.3.1", "rimraf": "^6.0.1", "run-script-os": "^1.1.6", - "sass": "^1.79.4", + "sass": "^1.79.5", "sass-loader": "^16.0.2", "storybook": "^8.3.4", "style-loader": "^4.0.0", - "stylelint": "^16.9.0", + "stylelint": "^16.10.0", "stylelint-config-recommended": "^14.0.1", "stylelint-config-sass-guidelines": "^12.1.0", "terser-webpack-plugin": "^5.3.10", @@ -130,7 +130,7 @@ "tsconfig-paths": "^4.2.0", "tsconfig-paths-webpack-plugin": "^4.1.0", "tsx": "^4.19.1", - "typedoc": "^0.26.7", + "typedoc": "^0.26.9", "typescript": "^5.4.5", "url-loader": "^4.1.1", "webpack": "^5.95.0", @@ -154,29 +154,37 @@ "@emotion/react": "^11.11.4", "@emotion/styled": "^11.11.0", "@mui/material": "^5.15.10", - "@swc/core": "^1.7.26", - "@types/node": "^20.16.10", + "@swc/core": "^1.7.35", + "@tailwindcss/typography": "^0.5.15", + "@types/node": "^20.16.11", "@types/react": "^18.3.11", - "@types/react-dom": "^18.3.0", + "@types/react-dom": "^18.3.1", "@types/webpack": "^5.28.5", "@typescript-eslint/parser": "^6.21.0", + "autoprefixer": "^10.4.20", "concurrently": "^9.0.1", "copy-webpack-plugin": "^12.0.2", "cross-env": "^7.0.3", "css-loader": "^6.11.0", "escape-string-regexp": "^5.0.0", "glob": "^10.4.5", + "lucide-react": "^0.452.0", "papi-dts": "file:../lib/papi-dts", "platform-bible-react": "file:../lib/platform-bible-react", + "postcss": "^8.4.47", + "postcss-loader": "^8.1.1", "prettier": "^3.3.3", "prettier-plugin-jsdoc": "^1.3.0", "replace-in-file": "^7.2.0", - "sass": "^1.78.0", - "sass-loader": "^14.2.1", - "stylelint": "^16.9.0", + "sass": "^1.79.5", + "sass-loader": "^16.0.2", + "stylelint": "^16.10.0", "stylelint-config-recommended": "^14.0.1", "stylelint-config-sass-guidelines": "^12.1.0", + "stylelint-config-tailwindcss": "^0.0.7", "swc-loader": "^0.2.6", + "tailwindcss": "^3.4.13", + "tailwindcss-animate": "^1.0.7", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", "tsconfig-paths-webpack-plugin": "^4.1.0", @@ -272,46 +280,6 @@ "node": ">=16 || 14 >=14.17" } }, - "extensions/node_modules/sass-loader": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-14.2.1.tgz", - "integrity": "sha512-G0VcnMYU18a4N7VoNDegg2OuMjYtxnqzQWARVWCIVSZwJeiL9kg8QMsuIZOplsJgTzZLF6jGxI3AClj8I9nRdQ==", - "dev": true, - "dependencies": { - "neo-async": "^2.6.2" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", - "sass": "^1.3.0", - "sass-embedded": "*", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, "extensions/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -342,13 +310,15 @@ "platform-bible-utils": "file:../../../lib/platform-bible-utils" }, "devDependencies": { - "@swc/core": "^1.7.26", - "@types/node": "^20.16.10", + "@swc/core": "^1.7.35", + "@tailwindcss/typography": "^0.5.15", + "@types/node": "^20.16.11", "@types/react": "^18.3.11", - "@types/react-dom": "^18.3.0", + "@types/react-dom": "^18.3.1", "@types/webpack": "^5.28.5", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", + "autoprefixer": "^10.4.20", "concurrently": "^9.0.1", "copy-webpack-plugin": "^12.0.2", "cross-env": "^7.0.3", @@ -359,7 +329,7 @@ "eslint-config-erb": "^4.1.0", "eslint-import-resolver-typescript": "^3.6.3", "eslint-plugin-compat": "^4.2.0", - "eslint-plugin-import": "^2.30.0", + "eslint-plugin-import": "^2.31.0", "eslint-plugin-jest": "^27.9.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-no-null": "^1.0.2", @@ -368,16 +338,22 @@ "eslint-plugin-react": "^7.37.1", "eslint-plugin-react-hooks": "^4.6.2", "glob": "^10.4.5", + "lucide-react": "^0.452.0", "papi-dts": "file:../../../lib/papi-dts", "platform-bible-react": "file:../../../lib/platform-bible-react", + "postcss": "^8.4.47", + "postcss-loader": "^8.1.1", "prettier": "^3.3.3", "prettier-plugin-jsdoc": "^1.3.0", - "sass": "^1.78.0", - "sass-loader": "^14.2.1", - "stylelint": "^16.9.0", + "sass": "^1.79.5", + "sass-loader": "^16.0.2", + "stylelint": "^16.10.0", "stylelint-config-recommended": "^14.0.1", "stylelint-config-sass-guidelines": "^12.1.0", + "stylelint-config-tailwindcss": "^0.0.7", "swc-loader": "^0.2.6", + "tailwindcss": "^3.4.13", + "tailwindcss-animate": "^1.0.7", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", "tsconfig-paths-webpack-plugin": "^4.1.0", @@ -392,6 +368,47 @@ "react-dom": ">=18.3.1" } }, + "extensions/src/hello-someone/node_modules/sass-loader": { + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.2.tgz", + "integrity": "sha512-Ll6iXZ1EYwYT19SqW4mSBb76vSSi8JgzElmzIerhEGgzB5hRjDQIWsPmuk1UrAXkR16KJHqVY0eH+5/uw9Tmfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, "extensions/src/hello-world": { "version": "0.0.1", "license": "MIT", @@ -400,13 +417,15 @@ "platform-bible-utils": "file:../../../lib/platform-bible-utils" }, "devDependencies": { - "@swc/core": "^1.7.26", - "@types/node": "^20.16.10", + "@swc/core": "^1.7.35", + "@tailwindcss/typography": "^0.5.15", + "@types/node": "^20.16.11", "@types/react": "^18.3.11", - "@types/react-dom": "^18.3.0", + "@types/react-dom": "^18.3.1", "@types/webpack": "^5.28.5", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", + "autoprefixer": "^10.4.20", "concurrently": "^9.0.1", "copy-webpack-plugin": "^12.0.2", "cross-env": "^7.0.3", @@ -417,7 +436,7 @@ "eslint-config-erb": "^4.1.0", "eslint-import-resolver-typescript": "^3.6.3", "eslint-plugin-compat": "^4.2.0", - "eslint-plugin-import": "^2.30.0", + "eslint-plugin-import": "^2.31.0", "eslint-plugin-jest": "^27.9.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-no-null": "^1.0.2", @@ -426,16 +445,22 @@ "eslint-plugin-react": "^7.37.1", "eslint-plugin-react-hooks": "^4.6.2", "glob": "^10.4.5", + "lucide-react": "^0.452.0", "papi-dts": "file:../../../lib/papi-dts", "platform-bible-react": "file:../../../lib/platform-bible-react", + "postcss": "^8.4.47", + "postcss-loader": "^8.1.1", "prettier": "^3.3.3", "prettier-plugin-jsdoc": "^1.3.0", - "sass": "^1.78.0", - "sass-loader": "^14.2.1", - "stylelint": "^16.9.0", + "sass": "^1.79.5", + "sass-loader": "^16.0.2", + "stylelint": "^16.10.0", "stylelint-config-recommended": "^14.0.1", "stylelint-config-sass-guidelines": "^12.1.0", + "stylelint-config-tailwindcss": "^0.0.7", "swc-loader": "^0.2.6", + "tailwindcss": "^3.4.13", + "tailwindcss-animate": "^1.0.7", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", "tsconfig-paths-webpack-plugin": "^4.1.0", @@ -450,6 +475,47 @@ "react-dom": ">=18.3.1" } }, + "extensions/src/hello-world/node_modules/sass-loader": { + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.2.tgz", + "integrity": "sha512-Ll6iXZ1EYwYT19SqW4mSBb76vSSi8JgzElmzIerhEGgzB5hRjDQIWsPmuk1UrAXkR16KJHqVY0eH+5/uw9Tmfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, "extensions/src/legacy-comment-manager": { "version": "0.0.1", "license": "MIT", @@ -458,13 +524,15 @@ "platform-bible-utils": "file:../../../lib/platform-bible-utils" }, "devDependencies": { - "@swc/core": "^1.7.26", - "@types/node": "^20.16.10", + "@swc/core": "^1.7.35", + "@tailwindcss/typography": "^0.5.15", + "@types/node": "^20.16.11", "@types/react": "^18.3.11", - "@types/react-dom": "^18.3.0", + "@types/react-dom": "^18.3.1", "@types/webpack": "^5.28.5", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", + "autoprefixer": "^10.4.20", "concurrently": "^9.0.1", "copy-webpack-plugin": "^12.0.2", "cross-env": "^7.0.3", @@ -475,7 +543,7 @@ "eslint-config-erb": "^4.1.0", "eslint-import-resolver-typescript": "^3.6.3", "eslint-plugin-compat": "^4.2.0", - "eslint-plugin-import": "^2.30.0", + "eslint-plugin-import": "^2.31.0", "eslint-plugin-jest": "^27.9.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-no-null": "^1.0.2", @@ -484,16 +552,22 @@ "eslint-plugin-react": "^7.37.1", "eslint-plugin-react-hooks": "^4.6.2", "glob": "^10.4.5", + "lucide-react": "^0.452.0", "papi-dts": "file:../../../lib/papi-dts", "platform-bible-react": "file:../../../lib/platform-bible-react", + "postcss": "^8.4.47", + "postcss-loader": "^8.1.1", "prettier": "^3.3.3", "prettier-plugin-jsdoc": "^1.3.0", - "sass": "^1.78.0", - "sass-loader": "^14.2.1", - "stylelint": "^16.9.0", + "sass": "^1.79.5", + "sass-loader": "^16.0.2", + "stylelint": "^16.10.0", "stylelint-config-recommended": "^14.0.1", "stylelint-config-sass-guidelines": "^12.1.0", + "stylelint-config-tailwindcss": "^0.0.7", "swc-loader": "^0.2.6", + "tailwindcss": "^3.4.13", + "tailwindcss-animate": "^1.0.7", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", "tsconfig-paths-webpack-plugin": "^4.1.0", @@ -508,6 +582,47 @@ "react-dom": ">=18.3.1" } }, + "extensions/src/legacy-comment-manager/node_modules/sass-loader": { + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.2.tgz", + "integrity": "sha512-Ll6iXZ1EYwYT19SqW4mSBb76vSSi8JgzElmzIerhEGgzB5hRjDQIWsPmuk1UrAXkR16KJHqVY0eH+5/uw9Tmfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, "extensions/src/platform-scripture": { "version": "0.0.1", "license": "MIT", @@ -517,13 +632,15 @@ }, "devDependencies": { "@biblionexus-foundation/scripture-utilities": "^0.0.4", - "@swc/core": "^1.7.26", - "@types/node": "^20.16.10", + "@swc/core": "^1.7.35", + "@tailwindcss/typography": "^0.5.15", + "@types/node": "^20.16.11", "@types/react": "^18.3.11", - "@types/react-dom": "^18.3.0", + "@types/react-dom": "^18.3.1", "@types/webpack": "^5.28.5", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", + "autoprefixer": "^10.4.20", "concurrently": "^9.0.1", "copy-webpack-plugin": "^12.0.2", "cross-env": "^7.0.3", @@ -534,7 +651,7 @@ "eslint-config-erb": "^4.1.0", "eslint-import-resolver-typescript": "^3.6.3", "eslint-plugin-compat": "^4.2.0", - "eslint-plugin-import": "^2.30.0", + "eslint-plugin-import": "^2.31.0", "eslint-plugin-jest": "^27.9.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-no-null": "^1.0.2", @@ -543,16 +660,22 @@ "eslint-plugin-react": "^7.37.1", "eslint-plugin-react-hooks": "^4.6.2", "glob": "^10.4.5", + "lucide-react": "^0.452.0", "papi-dts": "file:../../../lib/papi-dts", "platform-bible-react": "file:../../../lib/platform-bible-react", + "postcss": "^8.4.47", + "postcss-loader": "^8.1.1", "prettier": "^3.3.3", "prettier-plugin-jsdoc": "^1.3.0", - "sass": "^1.78.0", - "sass-loader": "^14.2.1", - "stylelint": "^16.9.0", + "sass": "^1.79.5", + "sass-loader": "^16.0.2", + "stylelint": "^16.10.0", "stylelint-config-recommended": "^14.0.1", "stylelint-config-sass-guidelines": "^12.1.0", + "stylelint-config-tailwindcss": "^0.0.7", "swc-loader": "^0.2.6", + "tailwindcss": "^3.4.13", + "tailwindcss-animate": "^1.0.7", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", "tsconfig-paths-webpack-plugin": "^4.1.0", @@ -577,13 +700,15 @@ "devDependencies": { "@biblionexus-foundation/platform-editor": "^0.6.3", "@biblionexus-foundation/scripture-utilities": "^0.0.4", - "@swc/core": "^1.7.26", - "@types/node": "^20.16.10", + "@swc/core": "^1.7.35", + "@tailwindcss/typography": "^0.5.15", + "@types/node": "^20.16.11", "@types/react": "^18.3.11", - "@types/react-dom": "^18.3.0", + "@types/react-dom": "^18.3.1", "@types/webpack": "^5.28.5", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", + "autoprefixer": "^10.4.20", "concurrently": "^9.0.1", "copy-webpack-plugin": "^12.0.2", "cross-env": "^7.0.3", @@ -594,7 +719,7 @@ "eslint-config-erb": "^4.1.0", "eslint-import-resolver-typescript": "^3.6.3", "eslint-plugin-compat": "^4.2.0", - "eslint-plugin-import": "^2.30.0", + "eslint-plugin-import": "^2.31.0", "eslint-plugin-jest": "^27.9.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-no-null": "^1.0.2", @@ -603,16 +728,22 @@ "eslint-plugin-react": "^7.37.1", "eslint-plugin-react-hooks": "^4.6.2", "glob": "^10.4.5", + "lucide-react": "^0.452.0", "papi-dts": "file:../../../lib/papi-dts", "platform-bible-react": "file:../../../lib/platform-bible-react", + "postcss": "^8.4.47", + "postcss-loader": "^8.1.1", "prettier": "^3.3.3", "prettier-plugin-jsdoc": "^1.3.0", - "sass": "^1.78.0", - "sass-loader": "^14.2.1", - "stylelint": "^16.9.0", + "sass": "^1.79.5", + "sass-loader": "^16.0.2", + "stylelint": "^16.10.0", "stylelint-config-recommended": "^14.0.1", "stylelint-config-sass-guidelines": "^12.1.0", + "stylelint-config-tailwindcss": "^0.0.7", "swc-loader": "^0.2.6", + "tailwindcss": "^3.4.13", + "tailwindcss-animate": "^1.0.7", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", "tsconfig-paths-webpack-plugin": "^4.1.0", @@ -654,6 +785,47 @@ "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" } }, + "extensions/src/platform-scripture-editor/node_modules/sass-loader": { + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.2.tgz", + "integrity": "sha512-Ll6iXZ1EYwYT19SqW4mSBb76vSSi8JgzElmzIerhEGgzB5hRjDQIWsPmuk1UrAXkR16KJHqVY0eH+5/uw9Tmfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, "extensions/src/platform-scripture-editor/node_modules/stylelint-config-sass-guidelines": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/stylelint-config-sass-guidelines/-/stylelint-config-sass-guidelines-11.1.0.tgz", @@ -685,6 +857,47 @@ "node": ">=10.0.0" } }, + "extensions/src/platform-scripture/node_modules/sass-loader": { + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.2.tgz", + "integrity": "sha512-Ll6iXZ1EYwYT19SqW4mSBb76vSSi8JgzElmzIerhEGgzB5hRjDQIWsPmuk1UrAXkR16KJHqVY0eH+5/uw9Tmfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, "extensions/src/quick-verse": { "version": "0.0.1", "license": "MIT", @@ -693,13 +906,15 @@ "platform-bible-utils": "file:../../../lib/platform-bible-utils" }, "devDependencies": { - "@swc/core": "^1.7.26", - "@types/node": "^20.16.10", + "@swc/core": "^1.7.35", + "@tailwindcss/typography": "^0.5.15", + "@types/node": "^20.16.11", "@types/react": "^18.3.11", - "@types/react-dom": "^18.3.0", + "@types/react-dom": "^18.3.1", "@types/webpack": "^5.28.5", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", + "autoprefixer": "^10.4.20", "concurrently": "^9.0.1", "copy-webpack-plugin": "^12.0.2", "cross-env": "^7.0.3", @@ -710,7 +925,7 @@ "eslint-config-erb": "^4.1.0", "eslint-import-resolver-typescript": "^3.6.3", "eslint-plugin-compat": "^4.2.0", - "eslint-plugin-import": "^2.30.0", + "eslint-plugin-import": "^2.31.0", "eslint-plugin-jest": "^27.9.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-no-null": "^1.0.2", @@ -719,16 +934,22 @@ "eslint-plugin-react": "^7.37.1", "eslint-plugin-react-hooks": "^4.6.2", "glob": "^10.4.5", + "lucide-react": "^0.452.0", "papi-dts": "file:../../../lib/papi-dts", "platform-bible-react": "file:../../../lib/platform-bible-react", + "postcss": "^8.4.47", + "postcss-loader": "^8.1.1", "prettier": "^3.3.3", "prettier-plugin-jsdoc": "^1.3.0", - "sass": "^1.78.0", - "sass-loader": "^14.2.1", - "stylelint": "^16.9.0", + "sass": "^1.79.5", + "sass-loader": "^16.0.2", + "stylelint": "^16.10.0", "stylelint-config-recommended": "^14.0.1", "stylelint-config-sass-guidelines": "^12.1.0", + "stylelint-config-tailwindcss": "^0.0.7", "swc-loader": "^0.2.6", + "tailwindcss": "^3.4.13", + "tailwindcss-animate": "^1.0.7", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", "tsconfig-paths-webpack-plugin": "^4.1.0", @@ -788,7 +1009,7 @@ "devDependencies": { "escape-string-regexp": "^5.0.0", "rimraf": "^6.0.1", - "typedoc": "^0.26.7", + "typedoc": "^0.26.9", "typescript": "^5.4.5" } }, @@ -827,11 +1048,11 @@ "@radix-ui/react-toggle": "^1.1.0", "@radix-ui/react-toggle-group": "^1.1.0", "@tanstack/react-table": "^8.19.2", - "autoprefixer": "^10.4.19", + "autoprefixer": "^10.4.20", "class-variance-authority": "^0.7.0", "clsx": "^2.1.0", "cmdk": "^1.0.0", - "lucide-react": "^0.367.0", + "lucide-react": "^0.452.0", "next-themes": "^0.3.0", "platform-bible-utils": "file:../platform-bible-utils", "react-data-grid": ">=7.0.0-beta.42", @@ -840,7 +1061,7 @@ "tailwindcss-animate": "^1.0.7" }, "devDependencies": { - "@babel/preset-env": "^7.25.7", + "@babel/preset-env": "^7.25.8", "@babel/preset-react": "^7.25.7", "@babel/preset-typescript": "^7.25.7", "@mui/icons-material": "^5.15.10", @@ -852,7 +1073,7 @@ "@testing-library/user-event": "^14.5.2", "@types/jest": "^29.5.13", "@types/react": "^18.3.11", - "@types/react-dom": "^18.3.0", + "@types/react-dom": "^18.3.1", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", "@vitejs/plugin-react": "^4.3.2", @@ -865,15 +1086,15 @@ "prettier": "^3.3.3", "prettier-plugin-jsdoc": "^1.3.0", "prettier-plugin-tailwindcss": "^0.6.1", - "stylelint": "^16.9.0", + "stylelint": "^16.10.0", "stylelint-config-recommended": "^14.0.1", - "stylelint-config-sass-guidelines": "^11.1.0", + "stylelint-config-sass-guidelines": "^12.1.0", "stylelint-config-tailwindcss": "^0.0.7", "tailwindcss": "^3.4.3", "tailwindcss-scoped-preflight": "^2.1.0", "ts-jest": "^29.2.5", "tslib": "^2.7.0", - "typedoc": "^0.26.7", + "typedoc": "^0.26.9", "typescript": "^5.4.5", "vite": "^4.5.5", "vite-tsconfig-paths": "^4.3.2" @@ -1231,23 +1452,6 @@ } } }, - "lib/platform-bible-react/node_modules/stylelint-config-sass-guidelines": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/stylelint-config-sass-guidelines/-/stylelint-config-sass-guidelines-11.1.0.tgz", - "integrity": "sha512-mVE3UmN8MlshK4Gb3eYk6f8tw9DkQ9yjMF4W9krlmpaNZpSXOdh13AL0sU7l/9l4Pnpt4KMobNNIRI0tJl56Cw==", - "dev": true, - "dependencies": { - "postcss-scss": "^4.0.9", - "stylelint-scss": "^6.2.1" - }, - "engines": { - "node": ">=18.12.0" - }, - "peerDependencies": { - "postcss": "^8.4.21", - "stylelint": "^16.1.0" - } - }, "lib/platform-bible-react/node_modules/tailwindcss-scoped-preflight": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tailwindcss-scoped-preflight/-/tailwindcss-scoped-preflight-2.2.0.tgz", @@ -1278,9 +1482,9 @@ "prettier-plugin-jsdoc": "^1.3.0", "stringz": "^2.1.0", "tslib": "^2.7.0", - "typedoc": "^0.26.7", + "typedoc": "^0.26.9", "typescript": "^5.4.5", - "vite": "^5.4.8" + "vite": "^5.4.9" } }, "lib/platform-bible-utils/node_modules/@esbuild/aix-ppc64": { @@ -1771,10 +1975,11 @@ } }, "lib/platform-bible-utils/node_modules/vite": { - "version": "5.4.8", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz", - "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==", + "version": "5.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.9.tgz", + "integrity": "sha512-20OVpJHh0PAM0oSOELa5GaZNWeDjcAvQjGXy2Uyr+Tp+/D2/Hdz6NLgpJLsarPTA2QJ6v8mX2P1ZfbsSKvdMkg==", "dev": true, + "license": "MIT", "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", @@ -1880,10 +2085,11 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.7.tgz", - "integrity": "sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.8.tgz", + "integrity": "sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -2489,45 +2695,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-import-assertions": { "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.7.tgz", @@ -2661,21 +2828,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", "dev": true, @@ -2737,14 +2889,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.7.tgz", - "integrity": "sha512-4B6OhTrwYKHYYgcwErvZjbmH9X5TxQBsaBHdzEIB4l71gR5jh/tuHGlb9in47udL2+wVUcOz5XXhhfhVJwEpEg==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.8.tgz", + "integrity": "sha512-9ypqkozyzpG+HxlH4o4gdctalFGIjjdufzo7I2XPda0iBnZ6a+FO0rIEQcdSPXp02CkvGsII1exJhmROPQd5oA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.7", "@babel/helper-remap-async-to-generator": "^7.25.7", - "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/traverse": "^7.25.7" }, "engines": { @@ -2818,14 +2970,14 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.7.tgz", - "integrity": "sha512-rvUUtoVlkDWtDWxGAiiQj0aNktTPn3eFynBcMC2IhsXweehwgdI9ODe+XjWw515kEmv22sSOTp/rxIRuTiB7zg==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.8.tgz", + "integrity": "sha512-e82gl3TCorath6YLf9xUwFehVvjvfqFhdOo4+0iVIVju+6XOi5XHkqB3P2AXnSwoeTX0HBoXq5gJFtvotJzFnQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-class-static-block": "^7.14.5" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -2933,13 +3085,13 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.7.tgz", - "integrity": "sha512-UvcLuual4h7/GfylKm2IAA3aph9rwvAM2XBA0uPKU3lca+Maai4jBjjEVUS568ld6kJcgbouuumCBhMd/Yz17w==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.8.tgz", + "integrity": "sha512-gznWY+mr4ZQL/EWPcbBQUP3BXS5FwZp8RUOw06BaRn8tQLzN4XLIxXejpHN9Qo8x8jjBmAAKp6FoS51AgkSA/A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -2965,13 +3117,13 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.7.tgz", - "integrity": "sha512-h3MDAP5l34NQkkNulsTNyjdaR+OiB0Im67VU//sFupouP8Q6m9Spy7l66DcaAQxtmCqGdanPByLsnwFttxKISQ==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.8.tgz", + "integrity": "sha512-sPtYrduWINTQTW7FtOy99VCTWp4H23UX7vYcut7S4CIMEXU+54zKX9uCoGkLsWXteyaMXzVHgzWbLfQ1w4GZgw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -3014,13 +3166,13 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.7.tgz", - "integrity": "sha512-Ot43PrL9TEAiCe8C/2erAjXMeVSnE/BLEx6eyrKLNFCCw5jvhTHKyHxdI1pA0kz5njZRYAnMO2KObGqOCRDYSA==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.8.tgz", + "integrity": "sha512-4OMNv7eHTmJ2YXs3tvxAfa/I43di+VcF+M4Wt66c88EAED1RoGaf1D64cL5FkRpNL+Vx9Hds84lksWvd/wMIdA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -3045,13 +3197,13 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.7.tgz", - "integrity": "sha512-iImzbA55BjiovLyG2bggWS+V+OLkaBorNvc/yJoeeDQGztknRnDdYfp2d/UPmunZYEnZi6Lg8QcTmNMHOB0lGA==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.8.tgz", + "integrity": "sha512-f5W0AhSbbI+yY6VakT04jmxdxz+WsID0neG7+kQZbCOjuyJNdL5Nn4WIBm4hRpKnUcO9lP0eipUhFN12JpoH8g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -3174,13 +3326,13 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.7.tgz", - "integrity": "sha512-FbuJ63/4LEL32mIxrxwYaqjJxpbzxPVQj5a+Ebrc8JICV6YX8nE53jY+K0RZT3um56GoNWgkS2BQ/uLGTjtwfw==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.8.tgz", + "integrity": "sha512-Z7WJJWdQc8yCWgAmjI3hyC+5PXIubH9yRKzkl9ZEG647O9szl9zvmKLzpbItlijBnVhTUf1cpyWBsZ3+2wjWPQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -3190,13 +3342,13 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.7.tgz", - "integrity": "sha512-8CbutzSSh4hmD+jJHIA8vdTNk15kAzOnFLVVgBSMGr28rt85ouT01/rezMecks9pkU939wDInImwCKv4ahU4IA==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.8.tgz", + "integrity": "sha512-rm9a5iEFPS4iMIy+/A/PiS0QN0UyjPIeVvbU5EMZFKJZHt8vQnasbpo3T3EFcxzCeYO0BHfc4RqooCZc51J86Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -3206,14 +3358,14 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.7.tgz", - "integrity": "sha512-1JdVKPhD7Y5PvgfFy0Mv2brdrolzpzSoUq2pr6xsR+m+3viGGeHEokFKsCgOkbeFOQxfB1Vt2F0cPJLRpFI4Zg==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.8.tgz", + "integrity": "sha512-LkUu0O2hnUKHKE7/zYOIjByMa4VRaV2CD/cdGz0AxU9we+VA3kDDggKEzI0Oz1IroG+6gUP6UmWEHBMWZU316g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.25.7", "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-transform-parameters": "^7.25.7" }, "engines": { @@ -3240,13 +3392,13 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.7.tgz", - "integrity": "sha512-m9obYBA39mDPN7lJzD5WkGGb0GO54PPLXsbcnj1Hyeu8mSRz7Gb4b1A6zxNX32ZuUySDK4G6it8SDFWD1nCnqg==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.8.tgz", + "integrity": "sha512-EbQYweoMAHOn7iJ9GgZo14ghhb9tTjgOc88xFgYngifx7Z9u580cENCV159M4xDh3q/irbhSjZVpuhpC2gKBbg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -3256,14 +3408,14 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.7.tgz", - "integrity": "sha512-h39agClImgPWg4H8mYVAbD1qP9vClFbEjqoJmt87Zen8pjqK8FTPUwrOXAvqu5soytwxrLMd2fx2KSCp2CHcNg==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.8.tgz", + "integrity": "sha512-q05Bk7gXOxpTHoQ8RSzGSh/LHVB9JEIkKnk3myAWwZHnYiTGYtbdrYkIsS8Xyh4ltKf7GNUSgzs/6P2bJtBAQg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -3277,6 +3429,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.7.tgz", "integrity": "sha512-FYiTvku63me9+1Nz7TOx4YMtW3tWXzfANZtrzHhUZrz4d47EEtMQhzFoZWESfXuAMMT5mwzD4+y1N8ONAX6lMQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.7" }, @@ -3304,15 +3457,15 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.7.tgz", - "integrity": "sha512-LzA5ESzBy7tqj00Yjey9yWfs3FKy4EmJyKOSWld144OxkTji81WWnUT8nkLUn+imN/zHL8ZQlOu/MTUAhHaX3g==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.8.tgz", + "integrity": "sha512-8Uh966svuB4V8RHHg0QJOB32QK287NBksJOByoKmHMp1TAobNniNalIkI2i5IPj5+S9NYCG4VIjbEuiSN8r+ow==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.7", "@babel/helper-create-class-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -3636,12 +3789,13 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.7.tgz", - "integrity": "sha512-Gibz4OUdyNqqLj+7OAvBZxOD7CklCtMA5/j0JgUEwOnaRULsPDXmic2iKxL2DX2vQduPR5wH2hjZas/Vr/Oc0g==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.8.tgz", + "integrity": "sha512-58T2yulDHMN8YMUxiLq5YmWUnlDCyY1FsHM+v12VMx+1/FlrUj5tY50iDCpofFQEM8fMYOaY9YRvym2jcjn1Dg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.7", + "@babel/compat-data": "^7.25.8", "@babel/helper-compilation-targets": "^7.25.7", "@babel/helper-plugin-utils": "^7.25.7", "@babel/helper-validator-option": "^7.25.7", @@ -3651,45 +3805,30 @@ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.7", "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.7", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-import-assertions": "^7.25.7", "@babel/plugin-syntax-import-attributes": "^7.25.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.25.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.8", "@babel/plugin-transform-async-to-generator": "^7.25.7", "@babel/plugin-transform-block-scoped-functions": "^7.25.7", "@babel/plugin-transform-block-scoping": "^7.25.7", "@babel/plugin-transform-class-properties": "^7.25.7", - "@babel/plugin-transform-class-static-block": "^7.25.7", + "@babel/plugin-transform-class-static-block": "^7.25.8", "@babel/plugin-transform-classes": "^7.25.7", "@babel/plugin-transform-computed-properties": "^7.25.7", "@babel/plugin-transform-destructuring": "^7.25.7", "@babel/plugin-transform-dotall-regex": "^7.25.7", "@babel/plugin-transform-duplicate-keys": "^7.25.7", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.7", - "@babel/plugin-transform-dynamic-import": "^7.25.7", + "@babel/plugin-transform-dynamic-import": "^7.25.8", "@babel/plugin-transform-exponentiation-operator": "^7.25.7", - "@babel/plugin-transform-export-namespace-from": "^7.25.7", + "@babel/plugin-transform-export-namespace-from": "^7.25.8", "@babel/plugin-transform-for-of": "^7.25.7", "@babel/plugin-transform-function-name": "^7.25.7", - "@babel/plugin-transform-json-strings": "^7.25.7", + "@babel/plugin-transform-json-strings": "^7.25.8", "@babel/plugin-transform-literals": "^7.25.7", - "@babel/plugin-transform-logical-assignment-operators": "^7.25.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.8", "@babel/plugin-transform-member-expression-literals": "^7.25.7", "@babel/plugin-transform-modules-amd": "^7.25.7", "@babel/plugin-transform-modules-commonjs": "^7.25.7", @@ -3697,15 +3836,15 @@ "@babel/plugin-transform-modules-umd": "^7.25.7", "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.7", "@babel/plugin-transform-new-target": "^7.25.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.7", - "@babel/plugin-transform-numeric-separator": "^7.25.7", - "@babel/plugin-transform-object-rest-spread": "^7.25.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.8", + "@babel/plugin-transform-numeric-separator": "^7.25.8", + "@babel/plugin-transform-object-rest-spread": "^7.25.8", "@babel/plugin-transform-object-super": "^7.25.7", - "@babel/plugin-transform-optional-catch-binding": "^7.25.7", - "@babel/plugin-transform-optional-chaining": "^7.25.7", + "@babel/plugin-transform-optional-catch-binding": "^7.25.8", + "@babel/plugin-transform-optional-chaining": "^7.25.8", "@babel/plugin-transform-parameters": "^7.25.7", "@babel/plugin-transform-private-methods": "^7.25.7", - "@babel/plugin-transform-private-property-in-object": "^7.25.7", + "@babel/plugin-transform-private-property-in-object": "^7.25.8", "@babel/plugin-transform-property-literals": "^7.25.7", "@babel/plugin-transform-regenerator": "^7.25.7", "@babel/plugin-transform-reserved-words": "^7.25.7", @@ -3909,6 +4048,96 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.2" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-3.0.1.tgz", + "integrity": "sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.1", + "@csstools/css-tokenizer": "^3.0.1" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-4.0.0.tgz", + "integrity": "sha512-189nelqtPd8++phaHNwYovKZI0FOzH1vQEE3QhHHkNIGrg5fSs9CbYP3RvfEH5geztnIA9Jwq91wyOIwAW5JIQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^6.1.0" + } + }, "node_modules/@develar/schema-utils": { "version": "2.6.5", "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", @@ -4021,6 +4250,75 @@ "semver": "bin/semver.js" } }, + "node_modules/@electron/node-gyp": { + "version": "10.2.0-electron.1", + "resolved": "git+ssh://git@github.com/electron/node-gyp.git#06b29aafb7708acef8b3669835c8a7857ebc92d2", + "integrity": "sha512-4MSBTT8y07YUDqf69/vSh80Hh791epYqGtWHO3zSKhYFwQg+gx9wi1PqbqP6YqC4WMsNxZ5l9oDmnWdK5pfCKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^8.1.0", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.2.1", + "nopt": "^6.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "tar": "^6.2.1", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/@electron/node-gyp/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@electron/node-gyp/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@electron/node-gyp/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@electron/notarize": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.3.2.tgz", @@ -4137,11 +4435,13 @@ } }, "node_modules/@electron/rebuild": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.6.2.tgz", - "integrity": "sha512-fTSoWdbrPTmQOwvct4VnJH45aJg79WRabuNqt7cAWIno5kTXv1QD6qVmR2e8wmHi/xryaiVINl1gcEhKGjREVw==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.7.0.tgz", + "integrity": "sha512-VW++CNSlZwMYP7MyXEbrKjpzEwhB5kDNbzGtiPEjwYysqyTCF+YbNJ210Dj3AjWsGSV4iEEwNkmJN9yGZmVvmw==", "dev": true, + "license": "MIT", "dependencies": { + "@electron/node-gyp": "git+https://github.com/electron/node-gyp.git#06b29aafb7708acef8b3669835c8a7857ebc92d2", "@malept/cross-spawn-promise": "^2.0.0", "chalk": "^4.0.0", "debug": "^4.1.1", @@ -4150,7 +4450,6 @@ "got": "^11.7.0", "node-abi": "^3.45.0", "node-api-version": "^0.2.0", - "node-gyp": "^9.0.0", "ora": "^5.1.0", "read-binary-file-arch": "^1.0.6", "semver": "^7.3.5", @@ -4937,6 +5236,8 @@ }, "node_modules/@gar/promisify": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", "dev": true, "license": "MIT" }, @@ -6331,6 +6632,8 @@ }, "node_modules/@npmcli/fs": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", "dev": true, "license": "ISC", "dependencies": { @@ -6343,6 +6646,9 @@ }, "node_modules/@npmcli/move-file": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", "dev": true, "license": "MIT", "dependencies": { @@ -6355,6 +6661,8 @@ }, "node_modules/@npmcli/move-file/node_modules/mkdirp": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, "license": "MIT", "bin": { @@ -6366,6 +6674,9 @@ }, "node_modules/@npmcli/move-file/node_modules/rimraf": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -6378,6 +6689,312 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@parcel/watcher": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.1.tgz", + "integrity": "sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.4.1", + "@parcel/watcher-darwin-arm64": "2.4.1", + "@parcel/watcher-darwin-x64": "2.4.1", + "@parcel/watcher-freebsd-x64": "2.4.1", + "@parcel/watcher-linux-arm-glibc": "2.4.1", + "@parcel/watcher-linux-arm64-glibc": "2.4.1", + "@parcel/watcher-linux-arm64-musl": "2.4.1", + "@parcel/watcher-linux-x64-glibc": "2.4.1", + "@parcel/watcher-linux-x64-musl": "2.4.1", + "@parcel/watcher-win32-arm64": "2.4.1", + "@parcel/watcher-win32-ia32": "2.4.1", + "@parcel/watcher-win32-x64": "2.4.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz", + "integrity": "sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz", + "integrity": "sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz", + "integrity": "sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz", + "integrity": "sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz", + "integrity": "sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz", + "integrity": "sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz", + "integrity": "sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz", + "integrity": "sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz", + "integrity": "sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz", + "integrity": "sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz", + "integrity": "sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz", + "integrity": "sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher/node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/@parcel/watcher/node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -9175,9 +9792,10 @@ } }, "node_modules/@remix-run/router": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.2.tgz", - "integrity": "sha512-baiMx18+IMuD1yyvOGaHM9QrVUPGGG0jC+z+IPHnRJWUAUvaKuWKyE8gjDj2rzv3sz9zOGoRSPgeBVHRhZnBlA==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.20.0.tgz", + "integrity": "sha512-mUnk8rPJBI9loFDZ+YzPGdeniYK+FTmRD1TMCz7ev2SNIozyKKpnGgsxO34u6Z4z/t0ITuu7voi/AshfsGsgFg==", + "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -10436,70 +11054,6 @@ "stylelint": "^16.8.0" } }, - "node_modules/@stylistic/stylelint-plugin/node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.1" - } - }, - "node_modules/@stylistic/stylelint-plugin/node_modules/@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@stylistic/stylelint-plugin/node_modules/@csstools/media-query-list-parser": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-3.0.1.tgz", - "integrity": "sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" - } - }, "node_modules/@stylistic/stylelint-plugin/node_modules/is-plain-object": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", @@ -10815,14 +11369,15 @@ } }, "node_modules/@swc/core": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.7.26.tgz", - "integrity": "sha512-f5uYFf+TmMQyYIoxkn/evWhNGuUzC730dFwAKGwBVHHVoPyak1/GvJUm6i1SKl+2Hrj9oN0i3WSoWWZ4pgI8lw==", + "version": "1.7.35", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.7.35.tgz", + "integrity": "sha512-3cUteCTbr2r5jqfgx0r091sfq5Mgh6F1SQh8XAOnSvtKzwv2bC31mvBHVAieD1uPa2kHJhLav20DQgXOhpEitw==", "dev": true, "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.12" + "@swc/types": "^0.1.13" }, "engines": { "node": ">=10" @@ -10832,16 +11387,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.7.26", - "@swc/core-darwin-x64": "1.7.26", - "@swc/core-linux-arm-gnueabihf": "1.7.26", - "@swc/core-linux-arm64-gnu": "1.7.26", - "@swc/core-linux-arm64-musl": "1.7.26", - "@swc/core-linux-x64-gnu": "1.7.26", - "@swc/core-linux-x64-musl": "1.7.26", - "@swc/core-win32-arm64-msvc": "1.7.26", - "@swc/core-win32-ia32-msvc": "1.7.26", - "@swc/core-win32-x64-msvc": "1.7.26" + "@swc/core-darwin-arm64": "1.7.35", + "@swc/core-darwin-x64": "1.7.35", + "@swc/core-linux-arm-gnueabihf": "1.7.35", + "@swc/core-linux-arm64-gnu": "1.7.35", + "@swc/core-linux-arm64-musl": "1.7.35", + "@swc/core-linux-x64-gnu": "1.7.35", + "@swc/core-linux-x64-musl": "1.7.35", + "@swc/core-win32-arm64-msvc": "1.7.35", + "@swc/core-win32-ia32-msvc": "1.7.35", + "@swc/core-win32-x64-msvc": "1.7.35" }, "peerDependencies": { "@swc/helpers": "*" @@ -10853,13 +11408,14 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.26.tgz", - "integrity": "sha512-FF3CRYTg6a7ZVW4yT9mesxoVVZTrcSWtmZhxKCYJX9brH4CS/7PRPjAKNk6kzWgWuRoglP7hkjQcd6EpMcZEAw==", + "version": "1.7.35", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.35.tgz", + "integrity": "sha512-BQSSozVxjxS+SVQz6e3GC/+OBWGIK3jfe52pWdANmycdjF3ch7lrCKTHTU7eHwyoJ96mofszPf5AsiVJF34Fwg==", "cpu": [ "arm64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "darwin" @@ -10870,13 +11426,14 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.7.26.tgz", - "integrity": "sha512-az3cibZdsay2HNKmc4bjf62QVukuiMRh5sfM5kHR/JMTrLyS6vSw7Ihs3UTkZjUxkLTT8ro54LI6sV6sUQUbLQ==", + "version": "1.7.35", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.7.35.tgz", + "integrity": "sha512-44TYdKN/EWtkU88foXR7IGki9JzhEJzaFOoPevfi9Xe7hjAD/x2+AJOWWqQNzDPMz9+QewLdUVLyR6s5okRgtg==", "cpu": [ "x64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "darwin" @@ -10887,13 +11444,14 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.26.tgz", - "integrity": "sha512-VYPFVJDO5zT5U3RpCdHE5v1gz4mmR8BfHecUZTmD2v1JeFY6fv9KArJUpjrHEEsjK/ucXkQFmJ0jaiWXmpOV9Q==", + "version": "1.7.35", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.35.tgz", + "integrity": "sha512-ccfA5h3zxwioD+/z/AmYtkwtKz9m4rWTV7RoHq6Jfsb0cXHrd6tbcvgqRWXra1kASlE+cDWsMtEZygs9dJRtUQ==", "cpu": [ "arm" ], "dev": true, + "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -10904,13 +11462,14 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.26.tgz", - "integrity": "sha512-YKevOV7abpjcAzXrhsl+W48Z9mZvgoVs2eP5nY+uoMAdP2b3GxC0Df1Co0I90o2lkzO4jYBpTMcZlmUXLdXn+Q==", + "version": "1.7.35", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.35.tgz", + "integrity": "sha512-hx65Qz+G4iG/IVtxJKewC5SJdki8PAPFGl6gC/57Jb0+jA4BIoGLD/J3Q3rCPeoHfdqpkCYpahtyUq8CKx41Jg==", "cpu": [ "arm64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "linux" @@ -10921,13 +11480,14 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.26.tgz", - "integrity": "sha512-3w8iZICMkQQON0uIcvz7+Q1MPOW6hJ4O5ETjA0LSP/tuKqx30hIniCGOgPDnv3UTMruLUnQbtBwVCZTBKR3Rkg==", + "version": "1.7.35", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.35.tgz", + "integrity": "sha512-kL6tQL9No7UEoEvDRuPxzPTpxrvbwYteNRbdChSSP74j13/55G2/2hLmult5yFFaWuyoyU/2lvzjRL/i8OLZxg==", "cpu": [ "arm64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "linux" @@ -10938,13 +11498,14 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.26.tgz", - "integrity": "sha512-c+pp9Zkk2lqb06bNGkR2Looxrs7FtGDMA4/aHjZcCqATgp348hOKH5WPvNLBl+yPrISuWjbKDVn3NgAvfvpH4w==", + "version": "1.7.35", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.35.tgz", + "integrity": "sha512-Ke4rcLQSwCQ2LHdJX1FtnqmYNQ3IX6BddKlUtS7mcK13IHkQzZWp0Dcu6MgNA3twzb/dBpKX5GLy07XdGgfmyw==", "cpu": [ "x64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "linux" @@ -10955,13 +11516,14 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.26.tgz", - "integrity": "sha512-PgtyfHBF6xG87dUSSdTJHwZ3/8vWZfNIXQV2GlwEpslrOkGqy+WaiiyE7Of7z9AvDILfBBBcJvJ/r8u980wAfQ==", + "version": "1.7.35", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.35.tgz", + "integrity": "sha512-T30tlLnz0kYyDFyO5RQF5EQ4ENjW9+b56hEGgFUYmfhFhGA4E4V67iEx7KIG4u0whdPG7oy3qjyyIeTb7nElEw==", "cpu": [ "x64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "linux" @@ -10972,13 +11534,14 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.26.tgz", - "integrity": "sha512-9TNXPIJqFynlAOrRD6tUQjMq7KApSklK3R/tXgIxc7Qx+lWu8hlDQ/kVPLpU7PWvMMwC/3hKBW+p5f+Tms1hmA==", + "version": "1.7.35", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.35.tgz", + "integrity": "sha512-CfM/k8mvtuMyX+okRhemfLt784PLS0KF7Q9djA8/Dtavk0L5Ghnq+XsGltO3d8B8+XZ7YOITsB14CrjehzeHsg==", "cpu": [ "arm64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "win32" @@ -10989,13 +11552,14 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.26.tgz", - "integrity": "sha512-9YngxNcG3177GYdsTum4V98Re+TlCeJEP4kEwEg9EagT5s3YejYdKwVAkAsJszzkXuyRDdnHUpYbTrPG6FiXrQ==", + "version": "1.7.35", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.35.tgz", + "integrity": "sha512-ATB3uuH8j/RmS64EXQZJSbo2WXfRNpTnQszHME/sGaexsuxeijrp3DTYSFAA3R2Bu6HbIIX6jempe1Au8I3j+A==", "cpu": [ "ia32" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "win32" @@ -11006,13 +11570,14 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.26.tgz", - "integrity": "sha512-VR+hzg9XqucgLjXxA13MtV5O3C0bK0ywtLIBw/+a+O+Oc6mxFWHtdUeXDbIi5AiPbn0fjgVJMqYnyjGyyX8u0w==", + "version": "1.7.35", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.35.tgz", + "integrity": "sha512-iDGfQO1571NqWUXtLYDhwIELA/wadH42ioGn+J9R336nWx40YICzy9UQyslWRhqzhQ5kT+QXAW/MoCWc058N6Q==", "cpu": [ "x64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "win32" @@ -11029,10 +11594,11 @@ "dev": true }, "node_modules/@swc/types": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.12.tgz", - "integrity": "sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==", + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.13.tgz", + "integrity": "sha512-JL7eeCk6zWCbiYQg2xQSdLXQJl8Qoc9rXmG2cEKvHe3CKwMHwHGpfOb8frzNLmbycOo6I51qxnLnn9ESf4I20Q==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3" } @@ -11682,10 +12248,11 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.16.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.10.tgz", - "integrity": "sha512-vQUKgWTjEIRFCvK6CyriPH3MZYiYlNy0fKiEYHWbcoWLEgs4opurGGKlebrTLqdSMIbXImH6XExNiIyNUv3WpA==", + "version": "20.16.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.11.tgz", + "integrity": "sha512-y+cTCACu92FyA5fgQSAI8A1H429g7aSK2HsO7K4XYUWc4dY5IUz55JSDIYT6/VsOLfGy8vmvQYC2hfb0iF16Uw==", "devOptional": true, + "license": "MIT", "dependencies": { "undici-types": "~6.19.2" } @@ -11756,10 +12323,11 @@ } }, "node_modules/@types/react-dom": { - "version": "18.3.0", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", - "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==", "devOptional": true, + "license": "MIT", "dependencies": { "@types/react": "*" } @@ -12783,12 +13351,12 @@ } }, "node_modules/agentkeepalive": { - "version": "4.2.1", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", "dev": true, "license": "MIT", "dependencies": { - "debug": "^4.1.0", - "depd": "^1.1.2", "humanize-ms": "^1.2.1" }, "engines": { @@ -12797,6 +13365,8 @@ }, "node_modules/aggregate-error": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, "license": "MIT", "dependencies": { @@ -13082,11 +13652,6 @@ "node": ">= 10.0.0" } }, - "node_modules/aproba": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, "node_modules/archiver": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", @@ -13140,31 +13705,6 @@ "node": ">= 6" } }, - "node_modules/are-we-there-yet": { - "version": "3.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/arg": { "version": "4.1.3", "devOptional": true, @@ -13442,9 +13982,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.19", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", - "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", "funding": [ { "type": "opencollective", @@ -13459,12 +13999,13 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001599", + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -14246,6 +14787,8 @@ }, "node_modules/cacache": { "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", "dev": true, "license": "ISC", "dependencies": { @@ -14274,6 +14817,8 @@ }, "node_modules/cacache/node_modules/brace-expansion": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "license": "MIT", "dependencies": { @@ -14282,6 +14827,9 @@ }, "node_modules/cacache/node_modules/glob": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -14299,7 +14847,9 @@ } }, "node_modules/cacache/node_modules/lru-cache": { - "version": "7.14.1", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, "license": "ISC", "engines": { @@ -14308,6 +14858,8 @@ }, "node_modules/cacache/node_modules/minimatch": { "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "license": "ISC", "dependencies": { @@ -14319,6 +14871,8 @@ }, "node_modules/cacache/node_modules/mkdirp": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, "license": "MIT", "bin": { @@ -14330,6 +14884,9 @@ }, "node_modules/cacache/node_modules/rimraf": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -14344,6 +14901,8 @@ }, "node_modules/cacache/node_modules/rimraf/node_modules/brace-expansion": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "license": "MIT", "dependencies": { @@ -14353,6 +14912,9 @@ }, "node_modules/cacache/node_modules/rimraf/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -14372,6 +14934,8 @@ }, "node_modules/cacache/node_modules/rimraf/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { @@ -14714,6 +15278,8 @@ }, "node_modules/clean-stack": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, "license": "MIT", "engines": { @@ -14862,14 +15428,6 @@ "version": "1.1.4", "license": "MIT" }, - "node_modules/color-support": { - "version": "1.1.3", - "dev": true, - "license": "ISC", - "bin": { - "color-support": "bin.js" - } - }, "node_modules/colord": { "version": "2.9.3", "dev": true, @@ -15131,11 +15689,6 @@ "node": ">=0.8" } }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "dev": true, - "license": "ISC" - }, "node_modules/constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", @@ -15189,10 +15742,11 @@ } }, "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -15458,10 +16012,11 @@ } }, "node_modules/css-functions-list": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.2.tgz", - "integrity": "sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", + "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12 || >=16" } @@ -15890,11 +16445,12 @@ "dev": true }, "node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -16107,11 +16663,6 @@ "node": ">=0.4.0" } }, - "node_modules/delegates": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, "node_modules/depd": { "version": "1.1.2", "dev": true, @@ -16928,6 +17479,8 @@ }, "node_modules/encoding": { "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, "license": "MIT", "optional": true, @@ -18330,18 +18883,26 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/express": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", - "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -19299,24 +19860,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gauge": { - "version": "4.0.4", - "dev": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "dev": true, @@ -19723,11 +20266,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "dev": true, - "license": "ISC" - }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -20146,6 +20684,8 @@ }, "node_modules/humanize-ms": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "dev": true, "license": "MIT", "dependencies": { @@ -20345,6 +20885,8 @@ }, "node_modules/infer-owner": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", "dev": true, "license": "ISC" }, @@ -20441,6 +20983,7 @@ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", "dev": true, + "license": "MIT", "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" @@ -20748,6 +21291,8 @@ }, "node_modules/is-lambda": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", "dev": true, "license": "MIT" }, @@ -22144,7 +22689,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jsdoc-type-pratt-parser": { "version": "4.1.0", @@ -23210,11 +23756,12 @@ } }, "node_modules/lucide-react": { - "version": "0.367.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.367.0.tgz", - "integrity": "sha512-3FWiBaJiqMrx5a1sjH3CVdPqWnw/Z/PTVeeTDmOeILSs+8Ah+VhCd4FQMeHo6Z0WxHcm9piIOtilQwvceiCCKQ==", + "version": "0.452.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.452.0.tgz", + "integrity": "sha512-kNefjOUOGm+Mu3KDiryONyPba9r+nhcrz5oJs3N6JDzGboQNEXw5GB3yB8rnV9/FA4bPyggNU6CRSihZm9MvSw==", + "license": "ISC", "peerDependencies": { - "react": "^16.5.1 || ^17.0.0 || ^18.0.0" + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" } }, "node_modules/lunr": { @@ -23272,6 +23819,8 @@ }, "node_modules/make-fetch-happen": { "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", "dev": true, "license": "ISC", "dependencies": { @@ -23297,7 +23846,9 @@ } }, "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.14.1", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, "license": "ISC", "engines": { @@ -23729,6 +24280,8 @@ }, "node_modules/minipass-collect": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "dev": true, "license": "ISC", "dependencies": { @@ -23740,6 +24293,8 @@ }, "node_modules/minipass-fetch": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", "dev": true, "license": "MIT", "dependencies": { @@ -23756,6 +24311,8 @@ }, "node_modules/minipass-flush": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "dev": true, "license": "ISC", "dependencies": { @@ -23767,6 +24324,8 @@ }, "node_modules/minipass-pipeline": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "dev": true, "license": "ISC", "dependencies": { @@ -23778,6 +24337,8 @@ }, "node_modules/minipass-sized": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "dev": true, "license": "ISC", "dependencies": { @@ -23819,7 +24380,9 @@ } }, "node_modules/ms": { - "version": "2.1.2", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/multicast-dns": { @@ -23949,43 +24512,6 @@ "node": ">= 6.13.0" } }, - "node_modules/node-gyp": { - "version": "9.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^12.13 || ^14.13 || >=16" - } - }, - "node_modules/node-gyp/node_modules/rimraf": { - "version": "3.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -24076,6 +24602,8 @@ }, "node_modules/nopt": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", "dev": true, "license": "ISC", "dependencies": { @@ -24158,20 +24686,6 @@ "node": ">=8" } }, - "node_modules/npmlog": { - "version": "6.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -24492,6 +25006,8 @@ }, "node_modules/p-map": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, "license": "MIT", "dependencies": { @@ -25346,6 +25862,65 @@ "node": ">= 14" } }, + "node_modules/postcss-loader": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", + "integrity": "sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cosmiconfig": "^9.0.0", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/postcss-loader/node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/postcss-media-query-parser": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", @@ -25715,9 +26290,9 @@ "dev": true }, "node_modules/postcss-safe-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.0.tgz", - "integrity": "sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", + "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", "dev": true, "funding": [ { @@ -25733,6 +26308,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "engines": { "node": ">=18.0" }, @@ -26491,6 +27067,16 @@ "node": ">=6" } }, + "node_modules/proc-log": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", + "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -26529,6 +27115,8 @@ }, "node_modules/promise-inflight": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", "dev": true, "license": "ISC" }, @@ -27136,11 +27724,12 @@ } }, "node_modules/react-router": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.2.tgz", - "integrity": "sha512-tvN1iuT03kHgOFnLPfLJ8V95eijteveqdOSk+srqfePtQvqCExB8eHOYnlilbOcyJyKnYkr1vJvf7YqotAJu1A==", + "version": "6.27.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.27.0.tgz", + "integrity": "sha512-YA+HGZXz4jaAkVoYBE98VQl+nVzI+cVI2Oj/06F5ZM+0u3TgedN9Y9kmMRo2mnkSK2nCpNQn0DVob4HCsY/WLw==", + "license": "MIT", "dependencies": { - "@remix-run/router": "1.19.2" + "@remix-run/router": "1.20.0" }, "engines": { "node": ">=14.0.0" @@ -27150,12 +27739,13 @@ } }, "node_modules/react-router-dom": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.2.tgz", - "integrity": "sha512-z7YkaEW0Dy35T3/QKPYB1LjMK2R1fxnHO8kWpUMTBdfVzZrWOiY9a7CtN8HqdWtDUWd5FY6Dl8HFsqVwH4uOtQ==", + "version": "6.27.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.27.0.tgz", + "integrity": "sha512-+bvtFWMC0DgAFrfKXKG9Fc+BcXWRUO1aJIihbB79xaeq0v5UzfvnM5houGUm1Y461WVRcgAQ+Clh5rdb1eCx4g==", + "license": "MIT", "dependencies": { - "@remix-run/router": "1.19.2", - "react-router": "6.26.2" + "@remix-run/router": "1.20.0", + "react-router": "6.27.0" }, "engines": { "node": ">=14.0.0" @@ -28025,11 +28615,13 @@ } }, "node_modules/sass": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.4.tgz", - "integrity": "sha512-K0QDSNPXgyqO4GZq2HO5Q70TLxTH6cIT59RdoCHMivrC8rqzaTw5ab9prjz9KUN1El4FLXrBXJhik61JR4HcGg==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.5.tgz", + "integrity": "sha512-W1h5kp6bdhqFh2tk3DsI771MoEJjvrSY/2ihJRJS4pjIyfJCw0nTsxqhnrUzaLMOJjFchj8rOvraI/YUVjtx5g==", "dev": true, + "license": "MIT", "dependencies": { + "@parcel/watcher": "^2.4.1", "chokidar": "^4.0.0", "immutable": "^4.0.0", "source-map-js": ">=0.6.2 <2.0.0" @@ -28276,12 +28868,6 @@ "node": ">=4" } }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, "node_modules/send/node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -28405,11 +28991,6 @@ "node": ">= 0.8" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -28620,6 +29201,7 @@ "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", "dev": true, + "license": "MIT", "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" @@ -28631,6 +29213,8 @@ }, "node_modules/socks-proxy-agent": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", "dev": true, "license": "MIT", "dependencies": { @@ -28751,6 +29335,8 @@ }, "node_modules/ssri": { "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", "dev": true, "license": "ISC", "dependencies": { @@ -29117,9 +29703,9 @@ } }, "node_modules/stylelint": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.9.0.tgz", - "integrity": "sha512-31Nm3WjxGOBGpQqF43o3wO9L5AC36TPIe6030Lnm13H3vDMTcS21DrLh69bMX+DBilKqMMVLian4iG6ybBoNRQ==", + "version": "16.10.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.10.0.tgz", + "integrity": "sha512-z/8X2rZ52dt2c0stVwI9QL2AFJhLhbPkyfpDFcizs200V/g7v+UYY6SNcB9hKOLcDDX/yGLDsY/pX08sLkz9xQ==", "dev": true, "funding": [ { @@ -29131,6 +29717,7 @@ "url": "https://github.com/sponsors/stylelint" } ], + "license": "MIT", "dependencies": { "@csstools/css-parser-algorithms": "^3.0.1", "@csstools/css-tokenizer": "^3.0.1", @@ -29140,17 +29727,17 @@ "balanced-match": "^2.0.0", "colord": "^2.9.3", "cosmiconfig": "^9.0.0", - "css-functions-list": "^3.2.2", - "css-tree": "^2.3.1", - "debug": "^4.3.6", + "css-functions-list": "^3.2.3", + "css-tree": "^3.0.0", + "debug": "^4.3.7", "fast-glob": "^3.3.2", "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^9.0.0", + "file-entry-cache": "^9.1.0", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", "html-tags": "^3.3.1", - "ignore": "^5.3.2", + "ignore": "^6.0.2", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", "known-css-properties": "^0.34.0", @@ -29159,14 +29746,13 @@ "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "picocolors": "^1.0.1", - "postcss": "^8.4.41", + "postcss": "^8.4.47", "postcss-resolve-nested-selector": "^0.1.6", - "postcss-safe-parser": "^7.0.0", + "postcss-safe-parser": "^7.0.1", "postcss-selector-parser": "^6.1.2", "postcss-value-parser": "^4.2.0", "resolve-from": "^5.0.0", "string-width": "^4.2.3", - "strip-ansi": "^7.1.0", "supports-hyperlinks": "^3.1.0", "svg-tags": "^1.0.0", "table": "^6.8.2", @@ -29248,104 +29834,6 @@ "stylelint": "^16.0.2" } }, - "node_modules/stylelint/node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.1" - } - }, - "node_modules/stylelint/node_modules/@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/stylelint/node_modules/@csstools/media-query-list-parser": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-3.0.1.tgz", - "integrity": "sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" - } - }, - "node_modules/stylelint/node_modules/@csstools/selector-specificity": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-4.0.0.tgz", - "integrity": "sha512-189nelqtPd8++phaHNwYovKZI0FOzH1vQEE3QhHHkNIGrg5fSs9CbYP3RvfEH5geztnIA9Jwq91wyOIwAW5JIQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^6.1.0" - } - }, - "node_modules/stylelint/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/stylelint/node_modules/balanced-match": { "version": "2.0.0", "dev": true, @@ -29377,6 +29865,20 @@ } } }, + "node_modules/stylelint/node_modules/css-tree": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.0.0.tgz", + "integrity": "sha512-o88DVQ6GzsABn1+6+zo2ct801dBO5OASVyxbbvA2W20ue2puSh/VOuqUj90eUeMSX/xqGqBmOKiRQN7tJOuBXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.10.0", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, "node_modules/stylelint/node_modules/file-entry-cache": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.1.0.tgz", @@ -29402,6 +29904,16 @@ "node": ">=18" } }, + "node_modules/stylelint/node_modules/ignore": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz", + "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/stylelint/node_modules/is-plain-object": { "version": "5.0.0", "dev": true, @@ -29416,6 +29928,13 @@ "integrity": "sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==", "dev": true }, + "node_modules/stylelint/node_modules/mdn-data": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.10.0.tgz", + "integrity": "sha512-qq7C3EtK3yJXMwz1zAab65pjl+UhohqMOctTgcqjLOWABqmwj+me02LSsCuEUxnst9X1lCBpoE0WArGKgdGDzw==", + "dev": true, + "license": "CC0-1.0" + }, "node_modules/stylelint/node_modules/resolve-from": { "version": "5.0.0", "dev": true, @@ -29424,21 +29943,6 @@ "node": ">=8" } }, - "node_modules/stylelint/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/stylis": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", @@ -29766,9 +30270,10 @@ } }, "node_modules/tailwindcss": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", - "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", + "version": "3.4.13", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.13.tgz", + "integrity": "sha512-KqjHOJKogOUt5Bs752ykCeiwvi0fKVkr5oqsFNt/8px/tA8scFPIlkygsf6jXrfCqGHz7VflA6+yytWuM+XhFw==", + "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -31173,10 +31678,11 @@ } }, "node_modules/typedoc": { - "version": "0.26.7", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.26.7.tgz", - "integrity": "sha512-gUeI/Wk99vjXXMi8kanwzyhmeFEGv1LTdTQsiyIsmSYsBebvFxhbcyAx7Zjo4cMbpLGxM4Uz3jVIjksu/I2v6Q==", + "version": "0.26.9", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.26.9.tgz", + "integrity": "sha512-Rc7QpWL7EtmrT8yxV0GmhOR6xHgFnnhphbD9Suti3fz3um7ZOrou6q/g9d6+zC5PssTLZmjaW4Upmzv8T1rCcQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "lunr": "^2.3.9", "markdown-it": "^14.1.0", @@ -31322,6 +31828,8 @@ }, "node_modules/unique-filename": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", "dev": true, "license": "ISC", "dependencies": { @@ -31333,6 +31841,8 @@ }, "node_modules/unique-slug": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", "dev": true, "license": "ISC", "dependencies": { @@ -32535,14 +33045,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wide-align": { - "version": "1.1.5", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, "node_modules/wildcard": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", @@ -32961,9 +33463,9 @@ } }, "@babel/compat-data": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.7.tgz", - "integrity": "sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.8.tgz", + "integrity": "sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==", "dev": true }, "@babel/core": { @@ -33408,33 +33910,6 @@ "@babel/helper-plugin-utils": "^7.12.13" } }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, "@babel/plugin-syntax-import-assertions": { "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.7.tgz", @@ -33518,15 +33993,6 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, "@babel/plugin-syntax-top-level-await": { "version": "7.14.5", "dev": true, @@ -33563,14 +34029,13 @@ } }, "@babel/plugin-transform-async-generator-functions": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.7.tgz", - "integrity": "sha512-4B6OhTrwYKHYYgcwErvZjbmH9X5TxQBsaBHdzEIB4l71gR5jh/tuHGlb9in47udL2+wVUcOz5XXhhfhVJwEpEg==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.8.tgz", + "integrity": "sha512-9ypqkozyzpG+HxlH4o4gdctalFGIjjdufzo7I2XPda0iBnZ6a+FO0rIEQcdSPXp02CkvGsII1exJhmROPQd5oA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.25.7", "@babel/helper-remap-async-to-generator": "^7.25.7", - "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/traverse": "^7.25.7" } }, @@ -33614,14 +34079,13 @@ } }, "@babel/plugin-transform-class-static-block": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.7.tgz", - "integrity": "sha512-rvUUtoVlkDWtDWxGAiiQj0aNktTPn3eFynBcMC2IhsXweehwgdI9ODe+XjWw515kEmv22sSOTp/rxIRuTiB7zg==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.8.tgz", + "integrity": "sha512-e82gl3TCorath6YLf9xUwFehVvjvfqFhdOo4+0iVIVju+6XOi5XHkqB3P2AXnSwoeTX0HBoXq5gJFtvotJzFnQ==", "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-class-static-block": "^7.14.5" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-classes": { @@ -33687,13 +34151,12 @@ } }, "@babel/plugin-transform-dynamic-import": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.7.tgz", - "integrity": "sha512-UvcLuual4h7/GfylKm2IAA3aph9rwvAM2XBA0uPKU3lca+Maai4jBjjEVUS568ld6kJcgbouuumCBhMd/Yz17w==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.8.tgz", + "integrity": "sha512-gznWY+mr4ZQL/EWPcbBQUP3BXS5FwZp8RUOw06BaRn8tQLzN4XLIxXejpHN9Qo8x8jjBmAAKp6FoS51AgkSA/A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-exponentiation-operator": { @@ -33707,13 +34170,12 @@ } }, "@babel/plugin-transform-export-namespace-from": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.7.tgz", - "integrity": "sha512-h3MDAP5l34NQkkNulsTNyjdaR+OiB0Im67VU//sFupouP8Q6m9Spy7l66DcaAQxtmCqGdanPByLsnwFttxKISQ==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.8.tgz", + "integrity": "sha512-sPtYrduWINTQTW7FtOy99VCTWp4H23UX7vYcut7S4CIMEXU+54zKX9uCoGkLsWXteyaMXzVHgzWbLfQ1w4GZgw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-for-of": { @@ -33738,13 +34200,12 @@ } }, "@babel/plugin-transform-json-strings": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.7.tgz", - "integrity": "sha512-Ot43PrL9TEAiCe8C/2erAjXMeVSnE/BLEx6eyrKLNFCCw5jvhTHKyHxdI1pA0kz5njZRYAnMO2KObGqOCRDYSA==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.8.tgz", + "integrity": "sha512-4OMNv7eHTmJ2YXs3tvxAfa/I43di+VcF+M4Wt66c88EAED1RoGaf1D64cL5FkRpNL+Vx9Hds84lksWvd/wMIdA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-literals": { @@ -33757,13 +34218,12 @@ } }, "@babel/plugin-transform-logical-assignment-operators": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.7.tgz", - "integrity": "sha512-iImzbA55BjiovLyG2bggWS+V+OLkaBorNvc/yJoeeDQGztknRnDdYfp2d/UPmunZYEnZi6Lg8QcTmNMHOB0lGA==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.8.tgz", + "integrity": "sha512-f5W0AhSbbI+yY6VakT04jmxdxz+WsID0neG7+kQZbCOjuyJNdL5Nn4WIBm4hRpKnUcO9lP0eipUhFN12JpoH8g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-member-expression-literals": { @@ -33838,34 +34298,31 @@ } }, "@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.7.tgz", - "integrity": "sha512-FbuJ63/4LEL32mIxrxwYaqjJxpbzxPVQj5a+Ebrc8JICV6YX8nE53jY+K0RZT3um56GoNWgkS2BQ/uLGTjtwfw==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.8.tgz", + "integrity": "sha512-Z7WJJWdQc8yCWgAmjI3hyC+5PXIubH9yRKzkl9ZEG647O9szl9zvmKLzpbItlijBnVhTUf1cpyWBsZ3+2wjWPQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-numeric-separator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.7.tgz", - "integrity": "sha512-8CbutzSSh4hmD+jJHIA8vdTNk15kAzOnFLVVgBSMGr28rt85ouT01/rezMecks9pkU939wDInImwCKv4ahU4IA==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.8.tgz", + "integrity": "sha512-rm9a5iEFPS4iMIy+/A/PiS0QN0UyjPIeVvbU5EMZFKJZHt8vQnasbpo3T3EFcxzCeYO0BHfc4RqooCZc51J86Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-object-rest-spread": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.7.tgz", - "integrity": "sha512-1JdVKPhD7Y5PvgfFy0Mv2brdrolzpzSoUq2pr6xsR+m+3viGGeHEokFKsCgOkbeFOQxfB1Vt2F0cPJLRpFI4Zg==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.8.tgz", + "integrity": "sha512-LkUu0O2hnUKHKE7/zYOIjByMa4VRaV2CD/cdGz0AxU9we+VA3kDDggKEzI0Oz1IroG+6gUP6UmWEHBMWZU316g==", "dev": true, "requires": { "@babel/helper-compilation-targets": "^7.25.7", "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-transform-parameters": "^7.25.7" } }, @@ -33880,24 +34337,22 @@ } }, "@babel/plugin-transform-optional-catch-binding": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.7.tgz", - "integrity": "sha512-m9obYBA39mDPN7lJzD5WkGGb0GO54PPLXsbcnj1Hyeu8mSRz7Gb4b1A6zxNX32ZuUySDK4G6it8SDFWD1nCnqg==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.8.tgz", + "integrity": "sha512-EbQYweoMAHOn7iJ9GgZo14ghhb9tTjgOc88xFgYngifx7Z9u580cENCV159M4xDh3q/irbhSjZVpuhpC2gKBbg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-optional-chaining": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.7.tgz", - "integrity": "sha512-h39agClImgPWg4H8mYVAbD1qP9vClFbEjqoJmt87Zen8pjqK8FTPUwrOXAvqu5soytwxrLMd2fx2KSCp2CHcNg==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.8.tgz", + "integrity": "sha512-q05Bk7gXOxpTHoQ8RSzGSh/LHVB9JEIkKnk3myAWwZHnYiTGYtbdrYkIsS8Xyh4ltKf7GNUSgzs/6P2bJtBAQg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" } }, "@babel/plugin-transform-parameters": { @@ -33920,15 +34375,14 @@ } }, "@babel/plugin-transform-private-property-in-object": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.7.tgz", - "integrity": "sha512-LzA5ESzBy7tqj00Yjey9yWfs3FKy4EmJyKOSWld144OxkTji81WWnUT8nkLUn+imN/zHL8ZQlOu/MTUAhHaX3g==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.8.tgz", + "integrity": "sha512-8Uh966svuB4V8RHHg0QJOB32QK287NBksJOByoKmHMp1TAobNniNalIkI2i5IPj5+S9NYCG4VIjbEuiSN8r+ow==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.25.7", "@babel/helper-create-class-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-property-literals": { @@ -34126,12 +34580,12 @@ } }, "@babel/preset-env": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.7.tgz", - "integrity": "sha512-Gibz4OUdyNqqLj+7OAvBZxOD7CklCtMA5/j0JgUEwOnaRULsPDXmic2iKxL2DX2vQduPR5wH2hjZas/Vr/Oc0g==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.8.tgz", + "integrity": "sha512-58T2yulDHMN8YMUxiLq5YmWUnlDCyY1FsHM+v12VMx+1/FlrUj5tY50iDCpofFQEM8fMYOaY9YRvym2jcjn1Dg==", "dev": true, "requires": { - "@babel/compat-data": "^7.25.7", + "@babel/compat-data": "^7.25.8", "@babel/helper-compilation-targets": "^7.25.7", "@babel/helper-plugin-utils": "^7.25.7", "@babel/helper-validator-option": "^7.25.7", @@ -34141,45 +34595,30 @@ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.7", "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.7", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-import-assertions": "^7.25.7", "@babel/plugin-syntax-import-attributes": "^7.25.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.25.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.8", "@babel/plugin-transform-async-to-generator": "^7.25.7", "@babel/plugin-transform-block-scoped-functions": "^7.25.7", "@babel/plugin-transform-block-scoping": "^7.25.7", "@babel/plugin-transform-class-properties": "^7.25.7", - "@babel/plugin-transform-class-static-block": "^7.25.7", + "@babel/plugin-transform-class-static-block": "^7.25.8", "@babel/plugin-transform-classes": "^7.25.7", "@babel/plugin-transform-computed-properties": "^7.25.7", "@babel/plugin-transform-destructuring": "^7.25.7", "@babel/plugin-transform-dotall-regex": "^7.25.7", "@babel/plugin-transform-duplicate-keys": "^7.25.7", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.7", - "@babel/plugin-transform-dynamic-import": "^7.25.7", + "@babel/plugin-transform-dynamic-import": "^7.25.8", "@babel/plugin-transform-exponentiation-operator": "^7.25.7", - "@babel/plugin-transform-export-namespace-from": "^7.25.7", + "@babel/plugin-transform-export-namespace-from": "^7.25.8", "@babel/plugin-transform-for-of": "^7.25.7", "@babel/plugin-transform-function-name": "^7.25.7", - "@babel/plugin-transform-json-strings": "^7.25.7", + "@babel/plugin-transform-json-strings": "^7.25.8", "@babel/plugin-transform-literals": "^7.25.7", - "@babel/plugin-transform-logical-assignment-operators": "^7.25.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.8", "@babel/plugin-transform-member-expression-literals": "^7.25.7", "@babel/plugin-transform-modules-amd": "^7.25.7", "@babel/plugin-transform-modules-commonjs": "^7.25.7", @@ -34187,15 +34626,15 @@ "@babel/plugin-transform-modules-umd": "^7.25.7", "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.7", "@babel/plugin-transform-new-target": "^7.25.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.7", - "@babel/plugin-transform-numeric-separator": "^7.25.7", - "@babel/plugin-transform-object-rest-spread": "^7.25.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.8", + "@babel/plugin-transform-numeric-separator": "^7.25.8", + "@babel/plugin-transform-object-rest-spread": "^7.25.8", "@babel/plugin-transform-object-super": "^7.25.7", - "@babel/plugin-transform-optional-catch-binding": "^7.25.7", - "@babel/plugin-transform-optional-chaining": "^7.25.7", + "@babel/plugin-transform-optional-catch-binding": "^7.25.8", + "@babel/plugin-transform-optional-chaining": "^7.25.8", "@babel/plugin-transform-parameters": "^7.25.7", "@babel/plugin-transform-private-methods": "^7.25.7", - "@babel/plugin-transform-private-property-in-object": "^7.25.7", + "@babel/plugin-transform-private-property-in-object": "^7.25.8", "@babel/plugin-transform-property-literals": "^7.25.7", "@babel/plugin-transform-regenerator": "^7.25.7", "@babel/plugin-transform-reserved-words": "^7.25.7", @@ -34357,6 +34796,33 @@ } } }, + "@csstools/css-parser-algorithms": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", + "dev": true, + "requires": {} + }, + "@csstools/css-tokenizer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", + "dev": true + }, + "@csstools/media-query-list-parser": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-3.0.1.tgz", + "integrity": "sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==", + "dev": true, + "requires": {} + }, + "@csstools/selector-specificity": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-4.0.0.tgz", + "integrity": "sha512-189nelqtPd8++phaHNwYovKZI0FOzH1vQEE3QhHHkNIGrg5fSs9CbYP3RvfEH5geztnIA9Jwq91wyOIwAW5JIQ==", + "dev": true, + "requires": {} + }, "@develar/schema-utils": { "version": "2.6.5", "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", @@ -34437,6 +34903,57 @@ } } }, + "@electron/node-gyp": { + "version": "git+ssh://git@github.com/electron/node-gyp.git#06b29aafb7708acef8b3669835c8a7857ebc92d2", + "integrity": "sha512-4MSBTT8y07YUDqf69/vSh80Hh791epYqGtWHO3zSKhYFwQg+gx9wi1PqbqP6YqC4WMsNxZ5l9oDmnWdK5pfCKQ==", + "dev": true, + "from": "@electron/node-gyp@git+https://github.com/electron/node-gyp.git#06b29aafb7708acef8b3669835c8a7857ebc92d2", + "requires": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^8.1.0", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.2.1", + "nopt": "^6.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "tar": "^6.2.1", + "which": "^2.0.2" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "@electron/notarize": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.3.2.tgz", @@ -34522,11 +35039,12 @@ } }, "@electron/rebuild": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.6.2.tgz", - "integrity": "sha512-fTSoWdbrPTmQOwvct4VnJH45aJg79WRabuNqt7cAWIno5kTXv1QD6qVmR2e8wmHi/xryaiVINl1gcEhKGjREVw==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.7.0.tgz", + "integrity": "sha512-VW++CNSlZwMYP7MyXEbrKjpzEwhB5kDNbzGtiPEjwYysqyTCF+YbNJ210Dj3AjWsGSV4iEEwNkmJN9yGZmVvmw==", "dev": true, "requires": { + "@electron/node-gyp": "git+https://github.com/electron/node-gyp.git#06b29aafb7708acef8b3669835c8a7857ebc92d2", "@malept/cross-spawn-promise": "^2.0.0", "chalk": "^4.0.0", "debug": "^4.1.1", @@ -34535,7 +35053,6 @@ "got": "^11.7.0", "node-abi": "^3.45.0", "node-api-version": "^0.2.0", - "node-gyp": "^9.0.0", "ora": "^5.1.0", "read-binary-file-arch": "^1.0.6", "semver": "^7.3.5", @@ -35012,6 +35529,8 @@ }, "@gar/promisify": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", "dev": true }, "@humanwhocodes/config-array": { @@ -36003,6 +36522,8 @@ }, "@npmcli/fs": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", "dev": true, "requires": { "@gar/promisify": "^1.1.3", @@ -36011,6 +36532,8 @@ }, "@npmcli/move-file": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", "dev": true, "requires": { "mkdirp": "^1.0.4", @@ -36019,10 +36542,14 @@ "dependencies": { "mkdirp": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true }, "rimraf": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { "glob": "^7.1.3" @@ -36030,6 +36557,128 @@ } } }, + "@parcel/watcher": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.1.tgz", + "integrity": "sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==", + "dev": true, + "requires": { + "@parcel/watcher-android-arm64": "2.4.1", + "@parcel/watcher-darwin-arm64": "2.4.1", + "@parcel/watcher-darwin-x64": "2.4.1", + "@parcel/watcher-freebsd-x64": "2.4.1", + "@parcel/watcher-linux-arm-glibc": "2.4.1", + "@parcel/watcher-linux-arm64-glibc": "2.4.1", + "@parcel/watcher-linux-arm64-musl": "2.4.1", + "@parcel/watcher-linux-x64-glibc": "2.4.1", + "@parcel/watcher-linux-x64-musl": "2.4.1", + "@parcel/watcher-win32-arm64": "2.4.1", + "@parcel/watcher-win32-ia32": "2.4.1", + "@parcel/watcher-win32-x64": "2.4.1", + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "dependencies": { + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true + }, + "node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true + } + } + }, + "@parcel/watcher-android-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz", + "integrity": "sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==", + "dev": true, + "optional": true + }, + "@parcel/watcher-darwin-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz", + "integrity": "sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==", + "dev": true, + "optional": true + }, + "@parcel/watcher-darwin-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz", + "integrity": "sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==", + "dev": true, + "optional": true + }, + "@parcel/watcher-freebsd-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz", + "integrity": "sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-arm-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz", + "integrity": "sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-arm64-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz", + "integrity": "sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-arm64-musl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz", + "integrity": "sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-x64-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz", + "integrity": "sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-x64-musl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz", + "integrity": "sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==", + "dev": true, + "optional": true + }, + "@parcel/watcher-win32-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz", + "integrity": "sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==", + "dev": true, + "optional": true + }, + "@parcel/watcher-win32-ia32": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz", + "integrity": "sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==", + "dev": true, + "optional": true + }, + "@parcel/watcher-win32-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz", + "integrity": "sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==", + "dev": true, + "optional": true + }, "@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -37354,9 +38003,9 @@ } }, "@remix-run/router": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.2.tgz", - "integrity": "sha512-baiMx18+IMuD1yyvOGaHM9QrVUPGGG0jC+z+IPHnRJWUAUvaKuWKyE8gjDj2rzv3sz9zOGoRSPgeBVHRhZnBlA==" + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.20.0.tgz", + "integrity": "sha512-mUnk8rPJBI9loFDZ+YzPGdeniYK+FTmRD1TMCz7ev2SNIozyKKpnGgsxO34u6Z4z/t0ITuu7voi/AshfsGsgFg==" }, "@rollup/rollup-android-arm-eabi": { "version": "4.24.0", @@ -38198,26 +38847,6 @@ "stylelint": "^16.8.2" }, "dependencies": { - "@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", - "dev": true, - "requires": {} - }, - "@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", - "dev": true - }, - "@csstools/media-query-list-parser": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-3.0.1.tgz", - "integrity": "sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==", - "dev": true, - "requires": {} - }, "is-plain-object": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", @@ -38395,101 +39024,101 @@ } }, "@swc/core": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.7.26.tgz", - "integrity": "sha512-f5uYFf+TmMQyYIoxkn/evWhNGuUzC730dFwAKGwBVHHVoPyak1/GvJUm6i1SKl+2Hrj9oN0i3WSoWWZ4pgI8lw==", - "dev": true, - "requires": { - "@swc/core-darwin-arm64": "1.7.26", - "@swc/core-darwin-x64": "1.7.26", - "@swc/core-linux-arm-gnueabihf": "1.7.26", - "@swc/core-linux-arm64-gnu": "1.7.26", - "@swc/core-linux-arm64-musl": "1.7.26", - "@swc/core-linux-x64-gnu": "1.7.26", - "@swc/core-linux-x64-musl": "1.7.26", - "@swc/core-win32-arm64-msvc": "1.7.26", - "@swc/core-win32-ia32-msvc": "1.7.26", - "@swc/core-win32-x64-msvc": "1.7.26", + "version": "1.7.35", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.7.35.tgz", + "integrity": "sha512-3cUteCTbr2r5jqfgx0r091sfq5Mgh6F1SQh8XAOnSvtKzwv2bC31mvBHVAieD1uPa2kHJhLav20DQgXOhpEitw==", + "dev": true, + "requires": { + "@swc/core-darwin-arm64": "1.7.35", + "@swc/core-darwin-x64": "1.7.35", + "@swc/core-linux-arm-gnueabihf": "1.7.35", + "@swc/core-linux-arm64-gnu": "1.7.35", + "@swc/core-linux-arm64-musl": "1.7.35", + "@swc/core-linux-x64-gnu": "1.7.35", + "@swc/core-linux-x64-musl": "1.7.35", + "@swc/core-win32-arm64-msvc": "1.7.35", + "@swc/core-win32-ia32-msvc": "1.7.35", + "@swc/core-win32-x64-msvc": "1.7.35", "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.12" + "@swc/types": "^0.1.13" } }, "@swc/core-darwin-arm64": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.26.tgz", - "integrity": "sha512-FF3CRYTg6a7ZVW4yT9mesxoVVZTrcSWtmZhxKCYJX9brH4CS/7PRPjAKNk6kzWgWuRoglP7hkjQcd6EpMcZEAw==", + "version": "1.7.35", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.35.tgz", + "integrity": "sha512-BQSSozVxjxS+SVQz6e3GC/+OBWGIK3jfe52pWdANmycdjF3ch7lrCKTHTU7eHwyoJ96mofszPf5AsiVJF34Fwg==", "dev": true, "optional": true, "peer": true }, "@swc/core-darwin-x64": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.7.26.tgz", - "integrity": "sha512-az3cibZdsay2HNKmc4bjf62QVukuiMRh5sfM5kHR/JMTrLyS6vSw7Ihs3UTkZjUxkLTT8ro54LI6sV6sUQUbLQ==", + "version": "1.7.35", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.7.35.tgz", + "integrity": "sha512-44TYdKN/EWtkU88foXR7IGki9JzhEJzaFOoPevfi9Xe7hjAD/x2+AJOWWqQNzDPMz9+QewLdUVLyR6s5okRgtg==", "dev": true, "optional": true, "peer": true }, "@swc/core-linux-arm-gnueabihf": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.26.tgz", - "integrity": "sha512-VYPFVJDO5zT5U3RpCdHE5v1gz4mmR8BfHecUZTmD2v1JeFY6fv9KArJUpjrHEEsjK/ucXkQFmJ0jaiWXmpOV9Q==", + "version": "1.7.35", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.35.tgz", + "integrity": "sha512-ccfA5h3zxwioD+/z/AmYtkwtKz9m4rWTV7RoHq6Jfsb0cXHrd6tbcvgqRWXra1kASlE+cDWsMtEZygs9dJRtUQ==", "dev": true, "optional": true, "peer": true }, "@swc/core-linux-arm64-gnu": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.26.tgz", - "integrity": "sha512-YKevOV7abpjcAzXrhsl+W48Z9mZvgoVs2eP5nY+uoMAdP2b3GxC0Df1Co0I90o2lkzO4jYBpTMcZlmUXLdXn+Q==", + "version": "1.7.35", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.35.tgz", + "integrity": "sha512-hx65Qz+G4iG/IVtxJKewC5SJdki8PAPFGl6gC/57Jb0+jA4BIoGLD/J3Q3rCPeoHfdqpkCYpahtyUq8CKx41Jg==", "dev": true, "optional": true, "peer": true }, "@swc/core-linux-arm64-musl": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.26.tgz", - "integrity": "sha512-3w8iZICMkQQON0uIcvz7+Q1MPOW6hJ4O5ETjA0LSP/tuKqx30hIniCGOgPDnv3UTMruLUnQbtBwVCZTBKR3Rkg==", + "version": "1.7.35", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.35.tgz", + "integrity": "sha512-kL6tQL9No7UEoEvDRuPxzPTpxrvbwYteNRbdChSSP74j13/55G2/2hLmult5yFFaWuyoyU/2lvzjRL/i8OLZxg==", "dev": true, "optional": true, "peer": true }, "@swc/core-linux-x64-gnu": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.26.tgz", - "integrity": "sha512-c+pp9Zkk2lqb06bNGkR2Looxrs7FtGDMA4/aHjZcCqATgp348hOKH5WPvNLBl+yPrISuWjbKDVn3NgAvfvpH4w==", + "version": "1.7.35", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.35.tgz", + "integrity": "sha512-Ke4rcLQSwCQ2LHdJX1FtnqmYNQ3IX6BddKlUtS7mcK13IHkQzZWp0Dcu6MgNA3twzb/dBpKX5GLy07XdGgfmyw==", "dev": true, "optional": true, "peer": true }, "@swc/core-linux-x64-musl": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.26.tgz", - "integrity": "sha512-PgtyfHBF6xG87dUSSdTJHwZ3/8vWZfNIXQV2GlwEpslrOkGqy+WaiiyE7Of7z9AvDILfBBBcJvJ/r8u980wAfQ==", + "version": "1.7.35", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.35.tgz", + "integrity": "sha512-T30tlLnz0kYyDFyO5RQF5EQ4ENjW9+b56hEGgFUYmfhFhGA4E4V67iEx7KIG4u0whdPG7oy3qjyyIeTb7nElEw==", "dev": true, "optional": true, "peer": true }, "@swc/core-win32-arm64-msvc": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.26.tgz", - "integrity": "sha512-9TNXPIJqFynlAOrRD6tUQjMq7KApSklK3R/tXgIxc7Qx+lWu8hlDQ/kVPLpU7PWvMMwC/3hKBW+p5f+Tms1hmA==", + "version": "1.7.35", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.35.tgz", + "integrity": "sha512-CfM/k8mvtuMyX+okRhemfLt784PLS0KF7Q9djA8/Dtavk0L5Ghnq+XsGltO3d8B8+XZ7YOITsB14CrjehzeHsg==", "dev": true, "optional": true, "peer": true }, "@swc/core-win32-ia32-msvc": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.26.tgz", - "integrity": "sha512-9YngxNcG3177GYdsTum4V98Re+TlCeJEP4kEwEg9EagT5s3YejYdKwVAkAsJszzkXuyRDdnHUpYbTrPG6FiXrQ==", + "version": "1.7.35", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.35.tgz", + "integrity": "sha512-ATB3uuH8j/RmS64EXQZJSbo2WXfRNpTnQszHME/sGaexsuxeijrp3DTYSFAA3R2Bu6HbIIX6jempe1Au8I3j+A==", "dev": true, "optional": true, "peer": true }, "@swc/core-win32-x64-msvc": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.26.tgz", - "integrity": "sha512-VR+hzg9XqucgLjXxA13MtV5O3C0bK0ywtLIBw/+a+O+Oc6mxFWHtdUeXDbIi5AiPbn0fjgVJMqYnyjGyyX8u0w==", + "version": "1.7.35", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.35.tgz", + "integrity": "sha512-iDGfQO1571NqWUXtLYDhwIELA/wadH42ioGn+J9R336nWx40YICzy9UQyslWRhqzhQ5kT+QXAW/MoCWc058N6Q==", "dev": true, "optional": true, "peer": true @@ -38501,9 +39130,9 @@ "dev": true }, "@swc/types": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.12.tgz", - "integrity": "sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==", + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.13.tgz", + "integrity": "sha512-JL7eeCk6zWCbiYQg2xQSdLXQJl8Qoc9rXmG2cEKvHe3CKwMHwHGpfOb8frzNLmbycOo6I51qxnLnn9ESf4I20Q==", "dev": true, "requires": { "@swc/counter": "^0.1.3" @@ -39034,9 +39663,9 @@ "dev": true }, "@types/node": { - "version": "20.16.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.10.tgz", - "integrity": "sha512-vQUKgWTjEIRFCvK6CyriPH3MZYiYlNy0fKiEYHWbcoWLEgs4opurGGKlebrTLqdSMIbXImH6XExNiIyNUv3WpA==", + "version": "20.16.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.11.tgz", + "integrity": "sha512-y+cTCACu92FyA5fgQSAI8A1H429g7aSK2HsO7K4XYUWc4dY5IUz55JSDIYT6/VsOLfGy8vmvQYC2hfb0iF16Uw==", "devOptional": true, "requires": { "undici-types": "~6.19.2" @@ -39109,9 +39738,9 @@ } }, "@types/react-dom": { - "version": "18.3.0", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", - "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==", "devOptional": true, "requires": { "@types/react": "*" @@ -39876,16 +40505,18 @@ } }, "agentkeepalive": { - "version": "4.2.1", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", "dev": true, "requires": { - "debug": "^4.1.0", - "depd": "^1.1.2", "humanize-ms": "^1.2.1" } }, "aggregate-error": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, "requires": { "clean-stack": "^2.0.0", @@ -40090,10 +40721,6 @@ } } }, - "aproba": { - "version": "2.0.0", - "dev": true - }, "archiver": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", @@ -40140,25 +40767,6 @@ "readable-stream": "^2.0.0" } }, - "are-we-there-yet": { - "version": "3.0.1", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, "arg": { "version": "4.1.3", "devOptional": true @@ -40360,15 +40968,15 @@ "dev": true }, "autoprefixer": { - "version": "10.4.19", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", - "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", "requires": { - "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001599", + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "postcss-value-parser": "^4.2.0" } }, @@ -40915,6 +41523,8 @@ }, "cacache": { "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", "dev": true, "requires": { "@npmcli/fs": "^2.1.0", @@ -40939,6 +41549,8 @@ "dependencies": { "brace-expansion": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "requires": { "balanced-match": "^1.0.0" @@ -40946,6 +41558,8 @@ }, "glob": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -40956,11 +41570,15 @@ } }, "lru-cache": { - "version": "7.14.1", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true }, "minimatch": { "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -40968,10 +41586,14 @@ }, "mkdirp": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true }, "rimraf": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { "glob": "^7.1.3" @@ -40979,6 +41601,8 @@ "dependencies": { "brace-expansion": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -40987,6 +41611,8 @@ }, "glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -40999,6 +41625,8 @@ }, "minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -41231,6 +41859,8 @@ }, "clean-stack": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true }, "cli-cursor": { @@ -41327,10 +41957,6 @@ "color-name": { "version": "1.1.4" }, - "color-support": { - "version": "1.1.3", - "dev": true - }, "colord": { "version": "2.9.3", "dev": true @@ -41523,10 +42149,6 @@ "version": "2.0.0", "dev": true }, - "console-control-strings": { - "version": "1.1.0", - "dev": true - }, "constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", @@ -41559,9 +42181,9 @@ } }, "cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "dev": true }, "cookie-signature": { @@ -41735,9 +42357,9 @@ "requires": {} }, "css-functions-list": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.2.tgz", - "integrity": "sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", + "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", "dev": true }, "css-loader": { @@ -42017,11 +42639,11 @@ "dev": true }, "debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "requires": { - "ms": "2.1.2" + "ms": "^2.1.3" } }, "decimal.js": { @@ -42160,10 +42782,6 @@ "version": "1.0.0", "dev": true }, - "delegates": { - "version": "1.0.0", - "dev": true - }, "depd": { "version": "1.1.2", "dev": true @@ -42785,6 +43403,8 @@ }, "encoding": { "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, "optional": true, "requires": { @@ -43794,10 +44414,16 @@ "jest-util": "^29.7.0" } }, + "exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true + }, "express": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", - "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", "dev": true, "requires": { "accepts": "~1.3.8", @@ -43805,7 +44431,7 @@ "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -44465,20 +45091,6 @@ "version": "1.2.3", "dev": true }, - "gauge": { - "version": "4.0.4", - "dev": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - } - }, "gensync": { "version": "1.0.0-beta.2", "dev": true @@ -44742,10 +45354,6 @@ "has-symbols": "^1.0.3" } }, - "has-unicode": { - "version": "2.0.1", - "dev": true - }, "hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -44819,13 +45427,15 @@ "version": "file:extensions/src/hello-someone", "requires": { "@sillsdev/scripture": "^2.0.2", - "@swc/core": "^1.7.26", - "@types/node": "^20.16.10", + "@swc/core": "^1.7.35", + "@tailwindcss/typography": "^0.5.15", + "@types/node": "^20.16.11", "@types/react": "^18.3.11", - "@types/react-dom": "^18.3.0", + "@types/react-dom": "^18.3.1", "@types/webpack": "^5.28.5", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", + "autoprefixer": "^10.4.20", "concurrently": "^9.0.1", "copy-webpack-plugin": "^12.0.2", "cross-env": "^7.0.3", @@ -44836,7 +45446,7 @@ "eslint-config-erb": "^4.1.0", "eslint-import-resolver-typescript": "^3.6.3", "eslint-plugin-compat": "^4.2.0", - "eslint-plugin-import": "^2.30.0", + "eslint-plugin-import": "^2.31.0", "eslint-plugin-jest": "^27.9.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-no-null": "^1.0.2", @@ -44845,17 +45455,23 @@ "eslint-plugin-react": "^7.37.1", "eslint-plugin-react-hooks": "^4.6.2", "glob": "^10.4.5", + "lucide-react": "^0.452.0", "papi-dts": "file:../../../lib/papi-dts", "platform-bible-react": "file:../../../lib/platform-bible-react", "platform-bible-utils": "file:../../../lib/platform-bible-utils", + "postcss": "^8.4.47", + "postcss-loader": "^8.1.1", "prettier": "^3.3.3", "prettier-plugin-jsdoc": "^1.3.0", - "sass": "^1.78.0", - "sass-loader": "^14.2.1", - "stylelint": "^16.9.0", + "sass": "^1.79.5", + "sass-loader": "^16.0.2", + "stylelint": "^16.10.0", "stylelint-config-recommended": "^14.0.1", "stylelint-config-sass-guidelines": "^12.1.0", + "stylelint-config-tailwindcss": "^0.0.7", "swc-loader": "^0.2.6", + "tailwindcss": "^3.4.13", + "tailwindcss-animate": "^1.0.7", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", "tsconfig-paths-webpack-plugin": "^4.1.0", @@ -44864,19 +45480,32 @@ "webpack-cli": "^5.1.4", "webpack-merge": "^6.0.1", "zip-build": "^1.8.0" + }, + "dependencies": { + "sass-loader": { + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.2.tgz", + "integrity": "sha512-Ll6iXZ1EYwYT19SqW4mSBb76vSSi8JgzElmzIerhEGgzB5hRjDQIWsPmuk1UrAXkR16KJHqVY0eH+5/uw9Tmfw==", + "dev": true, + "requires": { + "neo-async": "^2.6.2" + } + } } }, "hello-world": { "version": "file:extensions/src/hello-world", "requires": { "@sillsdev/scripture": "^2.0.2", - "@swc/core": "^1.7.26", - "@types/node": "^20.16.10", + "@swc/core": "^1.7.35", + "@tailwindcss/typography": "^0.5.15", + "@types/node": "^20.16.11", "@types/react": "^18.3.11", - "@types/react-dom": "^18.3.0", + "@types/react-dom": "^18.3.1", "@types/webpack": "^5.28.5", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", + "autoprefixer": "^10.4.20", "concurrently": "^9.0.1", "copy-webpack-plugin": "^12.0.2", "cross-env": "^7.0.3", @@ -44887,7 +45516,7 @@ "eslint-config-erb": "^4.1.0", "eslint-import-resolver-typescript": "^3.6.3", "eslint-plugin-compat": "^4.2.0", - "eslint-plugin-import": "^2.30.0", + "eslint-plugin-import": "^2.31.0", "eslint-plugin-jest": "^27.9.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-no-null": "^1.0.2", @@ -44896,17 +45525,23 @@ "eslint-plugin-react": "^7.37.1", "eslint-plugin-react-hooks": "^4.6.2", "glob": "^10.4.5", + "lucide-react": "^0.452.0", "papi-dts": "file:../../../lib/papi-dts", "platform-bible-react": "file:../../../lib/platform-bible-react", "platform-bible-utils": "file:../../../lib/platform-bible-utils", + "postcss": "^8.4.47", + "postcss-loader": "^8.1.1", "prettier": "^3.3.3", "prettier-plugin-jsdoc": "^1.3.0", - "sass": "^1.78.0", - "sass-loader": "^14.2.1", - "stylelint": "^16.9.0", + "sass": "^1.79.5", + "sass-loader": "^16.0.2", + "stylelint": "^16.10.0", "stylelint-config-recommended": "^14.0.1", "stylelint-config-sass-guidelines": "^12.1.0", + "stylelint-config-tailwindcss": "^0.0.7", "swc-loader": "^0.2.6", + "tailwindcss": "^3.4.13", + "tailwindcss-animate": "^1.0.7", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", "tsconfig-paths-webpack-plugin": "^4.1.0", @@ -44915,6 +45550,17 @@ "webpack-cli": "^5.1.4", "webpack-merge": "^6.0.1", "zip-build": "^1.8.0" + }, + "dependencies": { + "sass-loader": { + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.2.tgz", + "integrity": "sha512-Ll6iXZ1EYwYT19SqW4mSBb76vSSi8JgzElmzIerhEGgzB5hRjDQIWsPmuk1UrAXkR16KJHqVY0eH+5/uw9Tmfw==", + "dev": true, + "requires": { + "neo-async": "^2.6.2" + } + } } }, "hoist-non-react-statics": { @@ -45127,6 +45773,8 @@ }, "humanize-ms": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "dev": true, "requires": { "ms": "^2.0.0" @@ -45241,6 +45889,8 @@ }, "infer-owner": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", "dev": true }, "inflight": { @@ -45499,6 +46149,8 @@ }, "is-lambda": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", "dev": true }, "is-map": { @@ -46689,13 +47341,15 @@ "version": "file:extensions/src/legacy-comment-manager", "requires": { "@sillsdev/scripture": "^2.0.2", - "@swc/core": "^1.7.26", - "@types/node": "^20.16.10", + "@swc/core": "^1.7.35", + "@tailwindcss/typography": "^0.5.15", + "@types/node": "^20.16.11", "@types/react": "^18.3.11", - "@types/react-dom": "^18.3.0", + "@types/react-dom": "^18.3.1", "@types/webpack": "^5.28.5", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", + "autoprefixer": "^10.4.20", "concurrently": "^9.0.1", "copy-webpack-plugin": "^12.0.2", "cross-env": "^7.0.3", @@ -46706,7 +47360,7 @@ "eslint-config-erb": "^4.1.0", "eslint-import-resolver-typescript": "^3.6.3", "eslint-plugin-compat": "^4.2.0", - "eslint-plugin-import": "^2.30.0", + "eslint-plugin-import": "^2.31.0", "eslint-plugin-jest": "^27.9.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-no-null": "^1.0.2", @@ -46715,17 +47369,23 @@ "eslint-plugin-react": "^7.37.1", "eslint-plugin-react-hooks": "^4.6.2", "glob": "^10.4.5", + "lucide-react": "^0.452.0", "papi-dts": "file:../../../lib/papi-dts", "platform-bible-react": "file:../../../lib/platform-bible-react", "platform-bible-utils": "file:../../../lib/platform-bible-utils", + "postcss": "^8.4.47", + "postcss-loader": "^8.1.1", "prettier": "^3.3.3", "prettier-plugin-jsdoc": "^1.3.0", - "sass": "^1.78.0", - "sass-loader": "^14.2.1", - "stylelint": "^16.9.0", + "sass": "^1.79.5", + "sass-loader": "^16.0.2", + "stylelint": "^16.10.0", "stylelint-config-recommended": "^14.0.1", "stylelint-config-sass-guidelines": "^12.1.0", + "stylelint-config-tailwindcss": "^0.0.7", "swc-loader": "^0.2.6", + "tailwindcss": "^3.4.13", + "tailwindcss-animate": "^1.0.7", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", "tsconfig-paths-webpack-plugin": "^4.1.0", @@ -46734,6 +47394,17 @@ "webpack-cli": "^5.1.4", "webpack-merge": "^6.0.1", "zip-build": "^1.8.0" + }, + "dependencies": { + "sass-loader": { + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.2.tgz", + "integrity": "sha512-Ll6iXZ1EYwYT19SqW4mSBb76vSSi8JgzElmzIerhEGgzB5hRjDQIWsPmuk1UrAXkR16KJHqVY0eH+5/uw9Tmfw==", + "dev": true, + "requires": { + "neo-async": "^2.6.2" + } + } } }, "leven": { @@ -47263,9 +47934,9 @@ } }, "lucide-react": { - "version": "0.367.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.367.0.tgz", - "integrity": "sha512-3FWiBaJiqMrx5a1sjH3CVdPqWnw/Z/PTVeeTDmOeILSs+8Ah+VhCd4FQMeHo6Z0WxHcm9piIOtilQwvceiCCKQ==", + "version": "0.452.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.452.0.tgz", + "integrity": "sha512-kNefjOUOGm+Mu3KDiryONyPba9r+nhcrz5oJs3N6JDzGboQNEXw5GB3yB8rnV9/FA4bPyggNU6CRSihZm9MvSw==", "requires": {} }, "lunr": { @@ -47312,6 +47983,8 @@ }, "make-fetch-happen": { "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", "dev": true, "requires": { "agentkeepalive": "^4.2.1", @@ -47333,7 +48006,9 @@ }, "dependencies": { "lru-cache": { - "version": "7.14.1", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true } } @@ -47606,6 +48281,8 @@ }, "minipass-collect": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "dev": true, "requires": { "minipass": "^3.0.0" @@ -47613,6 +48290,8 @@ }, "minipass-fetch": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", "dev": true, "requires": { "encoding": "^0.1.13", @@ -47623,6 +48302,8 @@ }, "minipass-flush": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "dev": true, "requires": { "minipass": "^3.0.0" @@ -47630,6 +48311,8 @@ }, "minipass-pipeline": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "dev": true, "requires": { "minipass": "^3.0.0" @@ -47637,6 +48320,8 @@ }, "minipass-sized": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "dev": true, "requires": { "minipass": "^3.0.0" @@ -47663,7 +48348,9 @@ "dev": true }, "ms": { - "version": "2.1.2" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "multicast-dns": { "version": "7.2.5", @@ -47761,31 +48448,6 @@ "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "dev": true }, - "node-gyp": { - "version": "9.3.1", - "dev": true, - "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "dependencies": { - "rimraf": { - "version": "3.0.2", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -47847,6 +48509,8 @@ }, "nopt": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", "dev": true, "requires": { "abbrev": "^1.0.0" @@ -47898,16 +48562,6 @@ "path-key": "^3.0.0" } }, - "npmlog": { - "version": "6.0.2", - "dev": true, - "requires": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - } - }, "nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -48118,6 +48772,8 @@ }, "p-map": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, "requires": { "aggregate-error": "^3.0.0" @@ -48161,7 +48817,7 @@ "escape-string-regexp": "^5.0.0", "platform-bible-utils": "file:../platform-bible-utils", "rimraf": "^6.0.1", - "typedoc": "^0.26.7", + "typedoc": "^0.26.9", "typescript": "^5.4.5" }, "dependencies": { @@ -48190,30 +48846,38 @@ "@emotion/styled": "^11.11.0", "@mui/material": "^5.15.10", "@sillsdev/scripture": "^2.0.2", - "@swc/core": "^1.7.26", - "@types/node": "^20.16.10", + "@swc/core": "^1.7.35", + "@tailwindcss/typography": "^0.5.15", + "@types/node": "^20.16.11", "@types/react": "^18.3.11", - "@types/react-dom": "^18.3.0", + "@types/react-dom": "^18.3.1", "@types/webpack": "^5.28.5", "@typescript-eslint/parser": "^6.21.0", + "autoprefixer": "^10.4.20", "concurrently": "^9.0.1", "copy-webpack-plugin": "^12.0.2", "cross-env": "^7.0.3", "css-loader": "^6.11.0", "escape-string-regexp": "^5.0.0", "glob": "^10.4.5", + "lucide-react": "^0.452.0", "papi-dts": "file:../lib/papi-dts", "platform-bible-react": "file:../lib/platform-bible-react", "platform-bible-utils": "file:../lib/platform-bible-utils", + "postcss": "^8.4.47", + "postcss-loader": "^8.1.1", "prettier": "^3.3.3", "prettier-plugin-jsdoc": "^1.3.0", "replace-in-file": "^7.2.0", - "sass": "^1.78.0", - "sass-loader": "^14.2.1", - "stylelint": "^16.9.0", + "sass": "^1.79.5", + "sass-loader": "^16.0.2", + "stylelint": "^16.10.0", "stylelint-config-recommended": "^14.0.1", "stylelint-config-sass-guidelines": "^12.1.0", + "stylelint-config-tailwindcss": "^0.0.7", "swc-loader": "^0.2.6", + "tailwindcss": "^3.4.13", + "tailwindcss-animate": "^1.0.7", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", "tsconfig-paths-webpack-plugin": "^4.1.0", @@ -48279,15 +48943,6 @@ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true }, - "sass-loader": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-14.2.1.tgz", - "integrity": "sha512-G0VcnMYU18a4N7VoNDegg2OuMjYtxnqzQWARVWCIVSZwJeiL9kg8QMsuIZOplsJgTzZLF6jGxI3AClj8I9nRdQ==", - "dev": true, - "requires": { - "neo-async": "^2.6.2" - } - }, "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -48622,7 +49277,7 @@ "platform-bible-react": { "version": "file:lib/platform-bible-react", "requires": { - "@babel/preset-env": "^7.25.7", + "@babel/preset-env": "^7.25.8", "@babel/preset-react": "^7.25.7", "@babel/preset-typescript": "^7.25.7", "@emotion/react": ">=11.11.4", @@ -48653,11 +49308,11 @@ "@testing-library/user-event": "^14.5.2", "@types/jest": "^29.5.13", "@types/react": "^18.3.11", - "@types/react-dom": "^18.3.0", + "@types/react-dom": "^18.3.1", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", "@vitejs/plugin-react": "^4.3.2", - "autoprefixer": "^10.4.19", + "autoprefixer": "^10.4.20", "class-variance-authority": "^0.7.0", "clsx": "^2.1.0", "cmdk": "^1.0.0", @@ -48667,7 +49322,7 @@ "eslint-plugin-prettier": "^5.2.1", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", - "lucide-react": "^0.367.0", + "lucide-react": "^0.452.0", "next-themes": "^0.3.0", "platform-bible-utils": "file:../platform-bible-utils", "prettier": "^3.3.3", @@ -48675,9 +49330,9 @@ "prettier-plugin-tailwindcss": "^0.6.1", "react-data-grid": ">=7.0.0-beta.42", "sonner": "^1.5.0", - "stylelint": "^16.9.0", + "stylelint": "^16.10.0", "stylelint-config-recommended": "^14.0.1", - "stylelint-config-sass-guidelines": "^11.1.0", + "stylelint-config-sass-guidelines": "^12.1.0", "stylelint-config-tailwindcss": "^0.0.7", "tailwind-merge": "^2.2.2", "tailwindcss": "^3.4.3", @@ -48685,7 +49340,7 @@ "tailwindcss-scoped-preflight": "^2.1.0", "ts-jest": "^29.2.5", "tslib": "^2.7.0", - "typedoc": "^0.26.7", + "typedoc": "^0.26.9", "typescript": "^5.4.5", "vite": "^4.5.5", "vite-tsconfig-paths": "^4.3.2" @@ -48856,16 +49511,6 @@ "use-sidecar": "^1.1.2" } }, - "stylelint-config-sass-guidelines": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/stylelint-config-sass-guidelines/-/stylelint-config-sass-guidelines-11.1.0.tgz", - "integrity": "sha512-mVE3UmN8MlshK4Gb3eYk6f8tw9DkQ9yjMF4W9krlmpaNZpSXOdh13AL0sU7l/9l4Pnpt4KMobNNIRI0tJl56Cw==", - "dev": true, - "requires": { - "postcss-scss": "^4.0.9", - "stylelint-scss": "^6.2.1" - } - }, "tailwindcss-scoped-preflight": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tailwindcss-scoped-preflight/-/tailwindcss-scoped-preflight-2.2.0.tgz", @@ -48892,9 +49537,9 @@ "prettier-plugin-jsdoc": "^1.3.0", "stringz": "^2.1.0", "tslib": "^2.7.0", - "typedoc": "^0.26.7", + "typedoc": "^0.26.9", "typescript": "^5.4.5", - "vite": "^5.4.8" + "vite": "^5.4.9" }, "dependencies": { "@esbuild/aix-ppc64": { @@ -49145,9 +49790,9 @@ } }, "vite": { - "version": "5.4.8", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz", - "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==", + "version": "5.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.9.tgz", + "integrity": "sha512-20OVpJHh0PAM0oSOELa5GaZNWeDjcAvQjGXy2Uyr+Tp+/D2/Hdz6NLgpJLsarPTA2QJ6v8mX2P1ZfbsSKvdMkg==", "dev": true, "requires": { "esbuild": "^0.21.3", @@ -49163,13 +49808,15 @@ "requires": { "@biblionexus-foundation/scripture-utilities": "^0.0.4", "@sillsdev/scripture": "^2.0.2", - "@swc/core": "^1.7.26", - "@types/node": "^20.16.10", + "@swc/core": "^1.7.35", + "@tailwindcss/typography": "^0.5.15", + "@types/node": "^20.16.11", "@types/react": "^18.3.11", - "@types/react-dom": "^18.3.0", + "@types/react-dom": "^18.3.1", "@types/webpack": "^5.28.5", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", + "autoprefixer": "^10.4.20", "concurrently": "^9.0.1", "copy-webpack-plugin": "^12.0.2", "cross-env": "^7.0.3", @@ -49180,7 +49827,7 @@ "eslint-config-erb": "^4.1.0", "eslint-import-resolver-typescript": "^3.6.3", "eslint-plugin-compat": "^4.2.0", - "eslint-plugin-import": "^2.30.0", + "eslint-plugin-import": "^2.31.0", "eslint-plugin-jest": "^27.9.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-no-null": "^1.0.2", @@ -49189,17 +49836,23 @@ "eslint-plugin-react": "^7.37.1", "eslint-plugin-react-hooks": "^4.6.2", "glob": "^10.4.5", + "lucide-react": "^0.452.0", "papi-dts": "file:../../../lib/papi-dts", "platform-bible-react": "file:../../../lib/platform-bible-react", "platform-bible-utils": "file:../../../lib/platform-bible-utils", + "postcss": "^8.4.47", + "postcss-loader": "^8.1.1", "prettier": "^3.3.3", "prettier-plugin-jsdoc": "^1.3.0", - "sass": "^1.78.0", - "sass-loader": "^14.2.1", - "stylelint": "^16.9.0", + "sass": "^1.79.5", + "sass-loader": "^16.0.2", + "stylelint": "^16.10.0", "stylelint-config-recommended": "^14.0.1", "stylelint-config-sass-guidelines": "^12.1.0", + "stylelint-config-tailwindcss": "^0.0.7", "swc-loader": "^0.2.6", + "tailwindcss": "^3.4.13", + "tailwindcss-animate": "^1.0.7", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", "tsconfig-paths-webpack-plugin": "^4.1.0", @@ -49208,6 +49861,17 @@ "webpack-cli": "^5.1.4", "webpack-merge": "^6.0.1", "zip-build": "^1.8.0" + }, + "dependencies": { + "sass-loader": { + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.2.tgz", + "integrity": "sha512-Ll6iXZ1EYwYT19SqW4mSBb76vSSi8JgzElmzIerhEGgzB5hRjDQIWsPmuk1UrAXkR16KJHqVY0eH+5/uw9Tmfw==", + "dev": true, + "requires": { + "neo-async": "^2.6.2" + } + } } }, "platform-scripture-editor": { @@ -49216,13 +49880,15 @@ "@biblionexus-foundation/platform-editor": "^0.6.3", "@biblionexus-foundation/scripture-utilities": "^0.0.4", "@sillsdev/scripture": "^2.0.2", - "@swc/core": "^1.7.26", - "@types/node": "^20.16.10", + "@swc/core": "^1.7.35", + "@tailwindcss/typography": "^0.5.15", + "@types/node": "^20.16.11", "@types/react": "^18.3.11", - "@types/react-dom": "^18.3.0", + "@types/react-dom": "^18.3.1", "@types/webpack": "^5.28.5", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", + "autoprefixer": "^10.4.20", "concurrently": "^9.0.1", "copy-webpack-plugin": "^12.0.2", "cross-env": "^7.0.3", @@ -49233,7 +49899,7 @@ "eslint-config-erb": "^4.1.0", "eslint-import-resolver-typescript": "^3.6.3", "eslint-plugin-compat": "^4.2.0", - "eslint-plugin-import": "^2.30.0", + "eslint-plugin-import": "^2.31.0", "eslint-plugin-jest": "^27.9.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-no-null": "^1.0.2", @@ -49242,17 +49908,23 @@ "eslint-plugin-react": "^7.37.1", "eslint-plugin-react-hooks": "^4.6.2", "glob": "^10.4.5", + "lucide-react": "^0.452.0", "papi-dts": "file:../../../lib/papi-dts", "platform-bible-react": "file:../../../lib/platform-bible-react", "platform-bible-utils": "file:../../../lib/platform-bible-utils", + "postcss": "^8.4.47", + "postcss-loader": "^8.1.1", "prettier": "^3.3.3", "prettier-plugin-jsdoc": "^1.3.0", - "sass": "^1.78.0", - "sass-loader": "^14.2.1", - "stylelint": "^16.9.0", + "sass": "^1.79.5", + "sass-loader": "^16.0.2", + "stylelint": "^16.10.0", "stylelint-config-recommended": "^14.0.1", "stylelint-config-sass-guidelines": "^12.1.0", + "stylelint-config-tailwindcss": "^0.0.7", "swc-loader": "^0.2.6", + "tailwindcss": "^3.4.13", + "tailwindcss-animate": "^1.0.7", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", "tsconfig-paths-webpack-plugin": "^4.1.0", @@ -49279,6 +49951,15 @@ "yargs": "^17.7.2" } }, + "sass-loader": { + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.2.tgz", + "integrity": "sha512-Ll6iXZ1EYwYT19SqW4mSBb76vSSi8JgzElmzIerhEGgzB5hRjDQIWsPmuk1UrAXkR16KJHqVY0eH+5/uw9Tmfw==", + "dev": true, + "requires": { + "neo-async": "^2.6.2" + } + }, "stylelint-config-sass-guidelines": { "version": "https://registry.npmjs.org/stylelint-config-sass-guidelines/-/stylelint-config-sass-guidelines-11.1.0.tgz", "integrity": "sha512-mVE3UmN8MlshK4Gb3eYk6f8tw9DkQ9yjMF4W9krlmpaNZpSXOdh13AL0sU7l/9l4Pnpt4KMobNNIRI0tJl56Cw==", @@ -49435,6 +50116,31 @@ } } }, + "postcss-loader": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", + "integrity": "sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==", + "dev": true, + "requires": { + "cosmiconfig": "^9.0.0", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, + "dependencies": { + "cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "requires": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + } + } + } + }, "postcss-media-query-parser": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", @@ -49664,9 +50370,9 @@ "dev": true }, "postcss-safe-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.0.tgz", - "integrity": "sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", + "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", "dev": true, "requires": {} }, @@ -50067,6 +50773,12 @@ "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", "dev": true }, + "proc-log": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", + "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", + "dev": true + }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -50091,6 +50803,8 @@ }, "promise-inflight": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", "dev": true }, "promise-retry": { @@ -50206,13 +50920,15 @@ "version": "file:extensions/src/quick-verse", "requires": { "@sillsdev/scripture": "^2.0.2", - "@swc/core": "^1.7.26", - "@types/node": "^20.16.10", + "@swc/core": "^1.7.35", + "@tailwindcss/typography": "^0.5.15", + "@types/node": "^20.16.11", "@types/react": "^18.3.11", - "@types/react-dom": "^18.3.0", + "@types/react-dom": "^18.3.1", "@types/webpack": "^5.28.5", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", + "autoprefixer": "^10.4.20", "concurrently": "^9.0.1", "copy-webpack-plugin": "^12.0.2", "cross-env": "^7.0.3", @@ -50223,7 +50939,7 @@ "eslint-config-erb": "^4.1.0", "eslint-import-resolver-typescript": "^3.6.3", "eslint-plugin-compat": "^4.2.0", - "eslint-plugin-import": "^2.30.0", + "eslint-plugin-import": "^2.31.0", "eslint-plugin-jest": "^27.9.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-no-null": "^1.0.2", @@ -50232,17 +50948,23 @@ "eslint-plugin-react": "^7.37.1", "eslint-plugin-react-hooks": "^4.6.2", "glob": "^10.4.5", + "lucide-react": "^0.452.0", "papi-dts": "file:../../../lib/papi-dts", "platform-bible-react": "file:../../../lib/platform-bible-react", "platform-bible-utils": "file:../../../lib/platform-bible-utils", + "postcss": "^8.4.47", + "postcss-loader": "^8.1.1", "prettier": "^3.3.3", "prettier-plugin-jsdoc": "^1.3.0", - "sass": "^1.78.0", - "sass-loader": "^14.2.1", - "stylelint": "^16.9.0", + "sass": "^1.79.5", + "sass-loader": "^16.0.2", + "stylelint": "^16.10.0", "stylelint-config-recommended": "^14.0.1", "stylelint-config-sass-guidelines": "^12.1.0", + "stylelint-config-tailwindcss": "^0.0.7", "swc-loader": "^0.2.6", + "tailwindcss": "^3.4.13", + "tailwindcss-animate": "^1.0.7", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", "tsconfig-paths-webpack-plugin": "^4.1.0", @@ -50540,20 +51262,20 @@ } }, "react-router": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.2.tgz", - "integrity": "sha512-tvN1iuT03kHgOFnLPfLJ8V95eijteveqdOSk+srqfePtQvqCExB8eHOYnlilbOcyJyKnYkr1vJvf7YqotAJu1A==", + "version": "6.27.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.27.0.tgz", + "integrity": "sha512-YA+HGZXz4jaAkVoYBE98VQl+nVzI+cVI2Oj/06F5ZM+0u3TgedN9Y9kmMRo2mnkSK2nCpNQn0DVob4HCsY/WLw==", "requires": { - "@remix-run/router": "1.19.2" + "@remix-run/router": "1.20.0" } }, "react-router-dom": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.2.tgz", - "integrity": "sha512-z7YkaEW0Dy35T3/QKPYB1LjMK2R1fxnHO8kWpUMTBdfVzZrWOiY9a7CtN8HqdWtDUWd5FY6Dl8HFsqVwH4uOtQ==", + "version": "6.27.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.27.0.tgz", + "integrity": "sha512-+bvtFWMC0DgAFrfKXKG9Fc+BcXWRUO1aJIihbB79xaeq0v5UzfvnM5houGUm1Y461WVRcgAQ+Clh5rdb1eCx4g==", "requires": { - "@remix-run/router": "1.19.2", - "react-router": "6.26.2" + "@remix-run/router": "1.20.0", + "react-router": "6.27.0" } }, "react-shallow-renderer": { @@ -51174,11 +51896,12 @@ } }, "sass": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.4.tgz", - "integrity": "sha512-K0QDSNPXgyqO4GZq2HO5Q70TLxTH6cIT59RdoCHMivrC8rqzaTw5ab9prjz9KUN1El4FLXrBXJhik61JR4HcGg==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.5.tgz", + "integrity": "sha512-W1h5kp6bdhqFh2tk3DsI771MoEJjvrSY/2ihJRJS4pjIyfJCw0nTsxqhnrUzaLMOJjFchj8rOvraI/YUVjtx5g==", "dev": true, "requires": { + "@parcel/watcher": "^2.4.1", "chokidar": "^4.0.0", "immutable": "^4.0.0", "source-map-js": ">=0.6.2 <2.0.0" @@ -51340,12 +52063,6 @@ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, "statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -51442,10 +52159,6 @@ } } }, - "set-blocking": { - "version": "2.0.0", - "dev": true - }, "set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -51615,6 +52328,8 @@ }, "socks-proxy-agent": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", "dev": true, "requires": { "agent-base": "^6.0.2", @@ -51707,6 +52422,8 @@ }, "ssri": { "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", "dev": true, "requires": { "minipass": "^3.1.1" @@ -51963,9 +52680,9 @@ } }, "stylelint": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.9.0.tgz", - "integrity": "sha512-31Nm3WjxGOBGpQqF43o3wO9L5AC36TPIe6030Lnm13H3vDMTcS21DrLh69bMX+DBilKqMMVLian4iG6ybBoNRQ==", + "version": "16.10.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.10.0.tgz", + "integrity": "sha512-z/8X2rZ52dt2c0stVwI9QL2AFJhLhbPkyfpDFcizs200V/g7v+UYY6SNcB9hKOLcDDX/yGLDsY/pX08sLkz9xQ==", "dev": true, "requires": { "@csstools/css-parser-algorithms": "^3.0.1", @@ -51976,17 +52693,17 @@ "balanced-match": "^2.0.0", "colord": "^2.9.3", "cosmiconfig": "^9.0.0", - "css-functions-list": "^3.2.2", - "css-tree": "^2.3.1", - "debug": "^4.3.6", + "css-functions-list": "^3.2.3", + "css-tree": "^3.0.0", + "debug": "^4.3.7", "fast-glob": "^3.3.2", "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^9.0.0", + "file-entry-cache": "^9.1.0", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", "html-tags": "^3.3.1", - "ignore": "^5.3.2", + "ignore": "^6.0.2", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", "known-css-properties": "^0.34.0", @@ -51995,53 +52712,19 @@ "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "picocolors": "^1.0.1", - "postcss": "^8.4.41", + "postcss": "^8.4.47", "postcss-resolve-nested-selector": "^0.1.6", - "postcss-safe-parser": "^7.0.0", + "postcss-safe-parser": "^7.0.1", "postcss-selector-parser": "^6.1.2", "postcss-value-parser": "^4.2.0", "resolve-from": "^5.0.0", "string-width": "^4.2.3", - "strip-ansi": "^7.1.0", "supports-hyperlinks": "^3.1.0", "svg-tags": "^1.0.0", "table": "^6.8.2", "write-file-atomic": "^5.0.1" }, "dependencies": { - "@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", - "dev": true, - "requires": {} - }, - "@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", - "dev": true - }, - "@csstools/media-query-list-parser": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-3.0.1.tgz", - "integrity": "sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==", - "dev": true, - "requires": {} - }, - "@csstools/selector-specificity": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-4.0.0.tgz", - "integrity": "sha512-189nelqtPd8++phaHNwYovKZI0FOzH1vQEE3QhHHkNIGrg5fSs9CbYP3RvfEH5geztnIA9Jwq91wyOIwAW5JIQ==", - "dev": true, - "requires": {} - }, - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, "balanced-match": { "version": "2.0.0", "dev": true @@ -52058,6 +52741,16 @@ "parse-json": "^5.2.0" } }, + "css-tree": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.0.0.tgz", + "integrity": "sha512-o88DVQ6GzsABn1+6+zo2ct801dBO5OASVyxbbvA2W20ue2puSh/VOuqUj90eUeMSX/xqGqBmOKiRQN7tJOuBXw==", + "dev": true, + "requires": { + "mdn-data": "2.10.0", + "source-map-js": "^1.0.1" + } + }, "file-entry-cache": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.1.0.tgz", @@ -52077,6 +52770,12 @@ "keyv": "^4.5.4" } }, + "ignore": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz", + "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==", + "dev": true + }, "is-plain-object": { "version": "5.0.0", "dev": true @@ -52087,18 +52786,15 @@ "integrity": "sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==", "dev": true }, + "mdn-data": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.10.0.tgz", + "integrity": "sha512-qq7C3EtK3yJXMwz1zAab65pjl+UhohqMOctTgcqjLOWABqmwj+me02LSsCuEUxnst9X1lCBpoE0WArGKgdGDzw==", + "dev": true + }, "resolve-from": { "version": "5.0.0", "dev": true - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } } } }, @@ -52368,9 +53064,9 @@ } }, "tailwindcss": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", - "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", + "version": "3.4.13", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.13.tgz", + "integrity": "sha512-KqjHOJKogOUt5Bs752ykCeiwvi0fKVkr5oqsFNt/8px/tA8scFPIlkygsf6jXrfCqGHz7VflA6+yytWuM+XhFw==", "requires": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -53244,9 +53940,9 @@ } }, "typedoc": { - "version": "0.26.7", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.26.7.tgz", - "integrity": "sha512-gUeI/Wk99vjXXMi8kanwzyhmeFEGv1LTdTQsiyIsmSYsBebvFxhbcyAx7Zjo4cMbpLGxM4Uz3jVIjksu/I2v6Q==", + "version": "0.26.9", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.26.9.tgz", + "integrity": "sha512-Rc7QpWL7EtmrT8yxV0GmhOR6xHgFnnhphbD9Suti3fz3um7ZOrou6q/g9d6+zC5PssTLZmjaW4Upmzv8T1rCcQ==", "dev": true, "requires": { "lunr": "^2.3.9", @@ -53344,6 +54040,8 @@ }, "unique-filename": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", "dev": true, "requires": { "unique-slug": "^3.0.0" @@ -53351,6 +54049,8 @@ }, "unique-slug": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", "dev": true, "requires": { "imurmurhash": "^0.1.4" @@ -54120,13 +54820,6 @@ "has-tostringtag": "^1.0.2" } }, - "wide-align": { - "version": "1.1.5", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, "wildcard": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", diff --git a/package.json b/package.json index 03c26d4cc4..db071bc4d8 100644 --- a/package.json +++ b/package.json @@ -121,15 +121,15 @@ "react": "^18.3.1", "react-data-grid": "^7.0.0-beta.42", "react-dom": "^18.3.1", - "react-router-dom": "^6.26.2", + "react-router-dom": "^6.27.0", "ws": "^8.18.0" }, "devDependencies": { - "@babel/preset-env": "^7.25.7", + "@babel/preset-env": "^7.25.8", "@babel/preset-react": "^7.25.7", "@babel/preset-typescript": "^7.25.7", "@electron/notarize": "^2.3.2", - "@electron/rebuild": "^3.6.2", + "@electron/rebuild": "^3.7.0", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.15", "@storybook/addon-essentials": "^8.3.4", "@storybook/addon-interactions": "^8.3.4", @@ -147,10 +147,10 @@ "@testing-library/react": "^16.0.1", "@types/electron-devtools-installer": "^2.2.5", "@types/jest": "^29.5.13", - "@types/node": "^20.16.10", + "@types/node": "^20.16.11", "@types/node-localstorage": "^1.3.3", "@types/react": "^18.3.11", - "@types/react-dom": "^18.3.0", + "@types/react-dom": "^18.3.1", "@types/react-test-renderer": "^18.3.0", "@types/source-map-support": "^0.5.10", "@types/webpack-bundle-analyzer": "^4.7.0", @@ -174,7 +174,7 @@ "eslint-import-resolver-typescript": "^3.6.3", "eslint-import-resolver-webpack": "^0.13.9", "eslint-plugin-compat": "^4.2.0", - "eslint-plugin-import": "^2.30.0", + "eslint-plugin-import": "^2.31.0", "eslint-plugin-jest": "^27.9.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-no-null": "^1.0.2", @@ -201,11 +201,11 @@ "react-test-renderer": "^18.3.1", "rimraf": "^6.0.1", "run-script-os": "^1.1.6", - "sass": "^1.79.4", + "sass": "^1.79.5", "sass-loader": "^16.0.2", "storybook": "^8.3.4", "style-loader": "^4.0.0", - "stylelint": "^16.9.0", + "stylelint": "^16.10.0", "stylelint-config-recommended": "^14.0.1", "stylelint-config-sass-guidelines": "^12.1.0", "terser-webpack-plugin": "^5.3.10", @@ -216,7 +216,7 @@ "tsconfig-paths": "^4.2.0", "tsconfig-paths-webpack-plugin": "^4.1.0", "tsx": "^4.19.1", - "typedoc": "^0.26.7", + "typedoc": "^0.26.9", "typescript": "^5.4.5", "url-loader": "^4.1.1", "webpack": "^5.95.0",