@@ -25,11 +35,26 @@
-
+
@if (HttpContext.Request.IsCrawlerClient() is false)
{
-
+ @if (AppRenderMode.PwaEnabled)
+ {
+
+
+
+
+ }
+ else
+ {
+
+ }
@*#if (sample == "Admin")*@
diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Boilerplate.Shared/Resources/AppStrings.Designer.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Boilerplate.Shared/Resources/AppStrings.Designer.cs
index d94040a33f..b3e1a4aa32 100644
--- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Boilerplate.Shared/Resources/AppStrings.Designer.cs
+++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Boilerplate.Shared/Resources/AppStrings.Designer.cs
@@ -1276,6 +1276,15 @@ public static string UnknownException {
}
}
+ ///
+ /// Looks up a localized string similar to Update.
+ ///
+ public static string Update {
+ get {
+ return ResourceManager.GetString("Update", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to The record was modified by another user after you got the original data. the operation was canceled..
///
diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Boilerplate.Shared/Resources/AppStrings.fr.resx b/src/Templates/Boilerplate/Bit.Boilerplate/src/Boilerplate.Shared/Resources/AppStrings.fr.resx
index 1d5fb83607..510cf0fee2 100644
--- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Boilerplate.Shared/Resources/AppStrings.fr.resx
+++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Boilerplate.Shared/Resources/AppStrings.fr.resx
@@ -1,6 +1,6 @@
-
-
-
-
-
-
-
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
Le champ {0} est obligatoire.
-
+
« {0} » et « {1} » ne correspondent pas.
-
+
Le champ {0} n'est pas une adresse e-mail valide.
-
+
MaxLengthAttribute doit avoir une valeur de longueur supérieure à zéro.
-
+
Le champ {0} doit être de type chaîne ou tableau avec une longueur minimale de « {1} ».
-
+
Le champ {0} doit être compris entre {1} et {2}.
-
+
L'e-mail « {0} » est déjà pris.
-
+
L'utilisateur est verrouillé. Réessayez dans {0}
-
+
L'utilisateur {0} n'existe pas.
-
+
Requête invalide
-
+
La demande n'a pas pu être traitée en raison d'un conflit dans la demande
-
+
L'accès à la ressource demandée est interdit
-
+
Les données de la demande ne sont pas valides
-
+
Une erreur s'est produite lors de la communication avec le serveur
-
+
Votre demande ne contient pas d'informations d'authentification valides
-
+
Une erreur inconnue s'est produite
-
+
L'enregistrement a été modifié par un autre utilisateur après avoir obtenu les données d'origine.
-
+
Ressource introuvable
-
+
Trop de demandes
-
+
Incapable de se connecter au serveur.
-
+
Actif
-
+
Tous
-
+
Alphabétique
-
+
Complété
-
+
Date
-
+
Editer le profil
-
+
Nom et prénom
-
+
Termes
-
+
Mise à jour du profil réussie.
-
+
Confirmer le nouveau mot de passe
-
+
E-mail
-
+
Mot de passe
-
+
Votre mot de passe a changé avec succès.
-
+
Le lien de confirmation a été renvoyé à votre adresse e-mail.
-
+
Le lien de réinitialisation du mot de passe a été envoyé à votre adresse e-mail.
-
+
L'image de l'utilisateur est introuvable
-
+
L'entité de catégorie est introuvable
-
+
L'entité du produit est introuvable
-
+
Cette catégorie contient certains produits, vous ne pouvez donc pas la supprimer
-
+
Erreur
-
+
Vous avez déjà demandé l'e-mail de réinitialisation du mot de passe.
-
+
Est-ce que j'accepte les conditions ?
-
+
Vous devez accepter nos conditions.
-
+
Genre
-
+
Date de naissance
-
+
Nom
-
+
Catégorie
-
+
Description
-
+
Prix
-
+
Catégories
-
+
Catégorie de produit
-
+
Des produits
-
+
Etes-vous sûr de vouloir supprimer la catégorie {0}
-
+
Êtes-vous sûr de vouloir supprimer le produit {0}
-
+
Supprimer la catégorie
-
+
Supprimer le produit
-
+
Vous devez être connecté pour continuer.
-
+
Nom d'utilisateur ou mot de passe invalide
-
+
Vous avez déjà demandé l'e-mail de confirmation.
-
+
Votre email est déjà confirmé.
-
+
Faire
-
+
Titre
-
+
L'élément à faire est introuvable
-
+
Etes-vous sûr de vouloir supprimer {0}
-
+
Supprimer l'élément à faire
-
+
Maison
-
+
Ajouter
-
+
Vous avez déjà un compte?
-
+
Nous avons envoyé un lien de confirmation à votre adresse e-mail.
-
+
confirmez votre adresse email
-
+
Supprimer le compte
-
+
Êtes-vous sûr de vouloir supprimer votre compte ?
-
+
Vous n'avez pas de compte ?
-
+
Modifier
-
+
Échec de la confirmation par e-mail !
-
+
confirmation de l'émail
-
+
E-mail confirmé avec succès !
-
+
Une erreur s'est produite lors du téléchargement du fichier
-
+
Veuillez saisir l'adresse e-mail avec laquelle vous avez été inscrit afin que nous puissions envoyer un lien de réinitialisation du mot de passe à votre adresse e-mail.
-
+
Mot de passe oublié
-
+
Mâle
-
+
Autre
-
+
Dépôt GitHub
-
+
Allez à aujourd'hui
-
+
Créez facilement votre application Blazor multimode (WASM, serveur, hybride, pré-rendu) dans les plus brefs délais !
-
+
Accueil Boilerplate
-
+
Il semble que le lien de confirmation soit invalide ou ait expiré.
-
+
nouveau mot de passe
-
+
Non
-
+
Vous n'avez pas reçu l'e-mail de confirmation ?
-
+
OU
-
+
Image de profil
-
+
Retirer
-
+
Ré-envoyer l'email
-
+
Réinitialiser le mot de passe
-
+
Sauvegarder
-
+
Se connecter
-
+
se déconnecter
-
+
Êtes-vous certain de vouloir vous déconnecter?
-
+
S'inscrire
-
+
S'inscrire
-
+
Soumettre
-
+
je suis d'accord avec le
-
+
Téléchargez une nouvelle image de profil
-
+
Oui
-
+
Ajouter une tâche
-
+
Rechercher des choses à faire...
-
+
Sélectionnez votre date de naissance
-
+
Choisir une catégorie
-
+
Catégories totales
-
+
Produits totaux
-
+
Modifier la catégorie
-
+
Nouvelle catégorie
-
+
Catégories
-
+
Entrez le nom de la catégorie
-
+
Entrez le nom du produit
-
+
Nombre de catégories des 30 derniers jours
-
+
Ventes de produits
-
+
Ce graphique montre le numéro de vente de chaque produit.
-
+
Rechercher sur le nom
-
+
Tableau du nombre de produits par catégorie
-
+
Ce graphique montre le nombre de produits dans chaque catégorie.
-
+
Des produits
-
+
Pourcentage de produits par catégorie
-
+
Ce graphique montre le pourcentage de produits dans chaque catégorie.
-
+
Se connecter
-
+
Connectez-vous en tant qu'utilisateur différent
-
+
Vous êtes connecté en tant que
-
+
Réinitialiser le mot de passe
-
+
Aucune tâche pour l'instant
-
+
Ajouter un produit
-
+
Action
-
+
Dos
-
+
Annuler
-
+
Vérifiez vos spams/indésirables si vous ne les trouvez pas dans la boîte de réception.
-
+
Couleur
-
+
Couleur personnalisée
-
+
Sélecteur de couleurs par défaut
-
+
Supprimer
-
+
Identifiant
-
+
Mot de passe oublié?
-
+
Nombre de produits des 30 derniers jours
-
+
Femelle
-
+
Modifier le produit
-
+
Tableau de bord
-
+
Souviens-toi de moi?
+
+ Mise à jour
+
\ No newline at end of file
diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Boilerplate.Shared/Resources/AppStrings.resx b/src/Templates/Boilerplate/Bit.Boilerplate/src/Boilerplate.Shared/Resources/AppStrings.resx
index 4e70f389ee..4d903f08e0 100644
--- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Boilerplate.Shared/Resources/AppStrings.resx
+++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Boilerplate.Shared/Resources/AppStrings.resx
@@ -442,6 +442,9 @@ Please confirm your email by clicking on the link.
Remember me?
+
+
+ Update
diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Extensions/IServiceCollectionExtensions.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Extensions/IServiceCollectionExtensions.cs
index 1c52100957..da22f879c9 100644
--- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Extensions/IServiceCollectionExtensions.cs
+++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Extensions/IServiceCollectionExtensions.cs
@@ -13,10 +13,7 @@ public static IServiceCollection AddClientSharedServices(this IServiceCollection
services.AddSharedServices();
- if (RenderModeProvider.PrerenderEnabled && RenderModeProvider.IsHybridRender() is false)
- services.TryAddTransient();
- else
- services.TryAddTransient();
+ services.TryAddTransient();
services.TryAddSessioned();
services.TryAddTransient();
@@ -47,7 +44,7 @@ public static IServiceCollection AddSessioned(this IS
where TImplementation : class, TService
where TService : class
{
- if (RenderModeProvider.IsHybridRender() || OperatingSystem.IsBrowser())
+ if (AppRenderMode.IsHybrid() || OperatingSystem.IsBrowser())
{
return services.AddSingleton();
}
@@ -64,7 +61,7 @@ public static IServiceCollection TryAddSessioned(this
where TImplementation : class, TService
where TService : class
{
- if (RenderModeProvider.IsHybridRender() || OperatingSystem.IsBrowser())
+ if (AppRenderMode.IsHybrid() || OperatingSystem.IsBrowser())
{
services.TryAddSingleton();
}
diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Services/AppRenderMode.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Services/AppRenderMode.cs
new file mode 100644
index 0000000000..da342b20d7
--- /dev/null
+++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Services/AppRenderMode.cs
@@ -0,0 +1,30 @@
+using Microsoft.AspNetCore.Components.Web;
+using OS = System.OperatingSystem;
+
+namespace Boilerplate.Client.Core.Services;
+
+public static class AppRenderMode
+{
+ public const bool PrerenderEnabled = false;
+
+ private static IComponentRenderMode Auto { get; } = new InteractiveAutoRenderMode(PrerenderEnabled);
+ private static IComponentRenderMode BlazorWebAssembly { get; } = new InteractiveWebAssemblyRenderMode(PrerenderEnabled);
+ private static IComponentRenderMode BlazorServer { get; } = new InteractiveServerRenderMode(PrerenderEnabled);
+ public static IComponentRenderMode NoPrerenderBlazorWebAssembly => new InteractiveWebAssemblyRenderMode(prerender: false);
+
+ public static IComponentRenderMode Current =>
+#if DEBUG
+ BlazorServer; // For better development experience.
+#else
+ Auto;
+#endif
+
+ public static bool PwaEnabled { get; } =
+#if PwaEnabled
+ true;
+#else
+ false;
+#endif
+
+ public static bool IsHybrid() => OS.IsAndroid() || OS.IsIOS() || OS.IsMacCatalyst() || OS.IsMacOS() || OS.IsWindows();
+}
diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Services/AuthenticationManager.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Services/AuthenticationManager.cs
index db6306d69a..2655918315 100644
--- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Services/AuthenticationManager.cs
+++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Services/AuthenticationManager.cs
@@ -25,7 +25,7 @@ public async Task SignOut()
{
await storageService.RemoveItem("access_token");
await storageService.RemoveItem("refresh_token");
- if (RenderModeProvider.PrerenderEnabled && RenderModeProvider.IsHybridRender() is false)
+ if (AppRenderMode.PrerenderEnabled && AppRenderMode.IsHybrid() is false)
{
await jsRuntime.RemoveCookie("access_token");
}
@@ -34,7 +34,7 @@ public async Task SignOut()
public async Task RefreshToken()
{
- if (RenderModeProvider.PrerenderEnabled && RenderModeProvider.IsHybridRender() is false)
+ if (AppRenderMode.PrerenderEnabled && AppRenderMode.IsHybrid() is false)
{
await jsRuntime.RemoveCookie("access_token");
}
@@ -90,7 +90,7 @@ private async Task StoreToken(TokenResponseDto tokenResponseDto, bool? rememberM
}
await storageService.SetItem("access_token", tokenResponseDto!.AccessToken, rememberMe is true);
await storageService.SetItem("refresh_token", tokenResponseDto!.RefreshToken, rememberMe is true);
- if (RenderModeProvider.PrerenderEnabled && RenderModeProvider.IsHybridRender() is false)
+ if (AppRenderMode.PrerenderEnabled && AppRenderMode.IsHybrid() is false)
{
await jsRuntime.SetCookie("access_token", tokenResponseDto.AccessToken!, tokenResponseDto.ExpiresIn, rememberMe is true);
}
diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Services/PrerenderStateService.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Services/PrerenderStateService.cs
index 2b6b2f024d..11ba0d98a1 100644
--- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Services/PrerenderStateService.cs
+++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Services/PrerenderStateService.cs
@@ -11,14 +11,20 @@ public class PrerenderStateService : IPrerenderStateService, IAsyncDisposable
private readonly PersistentComponentState applicationState;
private readonly ConcurrentDictionary values = new();
- public PrerenderStateService(PersistentComponentState state)
+ public PrerenderStateService(IServiceProvider serviceProvider)
{
- applicationState = state;
- subscription = applicationState.RegisterOnPersisting(PersistAsJson, RenderModeProvider.Current);
+ if (AppRenderMode.PrerenderEnabled)
+ {
+ applicationState = serviceProvider.GetRequiredService();
+ subscription = applicationState.RegisterOnPersisting(PersistAsJson, AppRenderMode.Current);
+ }
}
public async Task GetValue(string key, Func> factory)
{
+ if (AppRenderMode.PrerenderEnabled is false)
+ return await factory();
+
if (applicationState.TryTakeFromJson(key, out T? value)) return value;
var result = await factory();
@@ -28,6 +34,9 @@ public PrerenderStateService(PersistentComponentState state)
void Persist(string key, T value)
{
+ if (AppRenderMode.PrerenderEnabled is false)
+ return;
+
values.TryRemove(key, out object? _);
values.TryAdd(key, value);
}
@@ -42,14 +51,9 @@ async Task PersistAsJson()
public async ValueTask DisposeAsync()
{
- subscription?.Dispose();
- }
-}
+ if (AppRenderMode.PrerenderEnabled is false)
+ return;
-public class NoPrerenderStateService : IPrerenderStateService
-{
- public Task GetValue(string key, Func> factory)
- {
- return factory();
+ subscription?.Dispose();
}
}
diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Services/RenderModeProvider.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Services/RenderModeProvider.cs
deleted file mode 100644
index c7929e90fc..0000000000
--- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Services/RenderModeProvider.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using Microsoft.AspNetCore.Components.Web;
-using OS = System.OperatingSystem;
-
-namespace Boilerplate.Client.Core.Services;
-public static class RenderModeProvider
-{
- public static bool PrerenderEnabled { get; set; } = false;
- public static IComponentRenderMode Auto { get; } = new InteractiveAutoRenderMode(PrerenderEnabled);
- public static IComponentRenderMode BlazorWasm { get; } = new InteractiveWebAssemblyRenderMode(PrerenderEnabled);
- public static IComponentRenderMode BlazorServer { get; } = new InteractiveServerRenderMode(PrerenderEnabled);
-
- // PrerenderOnly: In order to have prerender only mode, simply remove @rendermode usages from App.razor
-
- public static IComponentRenderMode Current =>
- BuildConfigurationModeDetector.Current.IsDebug() ? BlazorServer /*for better development experience*/ : Auto;
-
- public static bool IsHybridRender() => OS.IsAndroid()
- || OS.IsIOS() || OS.IsMacCatalyst() || OS.IsMacOS() || OS.IsWindows();
-}
diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/Boilerplate.Client.Web.csproj b/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/Boilerplate.Client.Web.csproj
index 53ef094b11..519ff21d9d 100644
--- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/Boilerplate.Client.Web.csproj
+++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/Boilerplate.Client.Web.csproj
@@ -1,4 +1,4 @@
-
+net8.0
@@ -12,16 +12,23 @@
truefalse
+ service-worker-assets.js
+ false
+ true
+ Default
+
+
+
+
- all
diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/Properties/launchSettings.json b/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/Properties/launchSettings.json
deleted file mode 100644
index dfdbeed35c..0000000000
--- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/Properties/launchSettings.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "profiles": {
- "Boilerplate.Client.Web": {
- "commandName": "Project",
- "launchBrowser": true,
- "environmentVariables": {
- "ASPNETCORE_ENVIRONMENT": "Development"
- },
- "applicationUrl": "https://localhost:59614;http://localhost:59615"
- }
- }
-}
\ No newline at end of file
diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/Shared/AppBswupProgressBar.razor b/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/Shared/AppBswupProgressBar.razor
new file mode 100644
index 0000000000..f760e02197
--- /dev/null
+++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/Shared/AppBswupProgressBar.razor
@@ -0,0 +1,73 @@
+@using Bit.Bswup
+@using Bit.BlazorUI
+
+@inherits AppComponentBase
+
+
+
+
+
+
+
+
+ @* *@
+
\ No newline at end of file
diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/wwwroot/manifest.json b/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/wwwroot/manifest.json
new file mode 100644
index 0000000000..eb6745b908
--- /dev/null
+++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/wwwroot/manifest.json
@@ -0,0 +1,57 @@
+{
+ "dir": "ltr",
+ "lang": "en",
+ "scope": "/",
+ "start_url": "/",
+ "orientation": "any",
+ "id": "bitBoilerplate",
+ "display": "standalone",
+ "theme_color": "#2EA3FF",
+ "related_applications": [],
+ "name": "bit Boilerplate",
+ "background_color": "#0D1117",
+ "short_name": "bit Boilerplate",
+ "prefer_related_applications": false,
+ "display_override": [ "window-controls-overlay" ],
+ "description": "bit Boilerplate is a project template that includes all the necessary parts to create a fully-featured web app.",
+ "features": [
+ "Cross Platform",
+ "fast",
+ "simple"
+ ],
+ "categories": [
+ "utilities"
+ ],
+ "icons": [
+ {
+ "sizes": "512x512",
+ "type": "image/png",
+ "src": "images/icons/bit-icon-512.png"
+ }
+ ],
+ "shortcuts": [
+ {
+ "name": "Terms",
+ "url": "/terms"
+ },
+ //#if (sample == "Todo")
+ {
+ "name": "Todo",
+ "url": "/todo"
+ },
+ //#elif (sample == "AdminPanel")
+ {
+ "name": "Categories",
+ "url": "/categories"
+ },
+ {
+ "name": "Products",
+ "url": "/products"
+ },
+ //#endif
+ {
+ "name": "EditProfile",
+ "url": "/edit-profile"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/wwwroot/service-worker.js b/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/wwwroot/service-worker.js
new file mode 100644
index 0000000000..0c4fa6ba58
--- /dev/null
+++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/wwwroot/service-worker.js
@@ -0,0 +1,4 @@
+// In development, always fetch from the network and do not enable offline support.
+// This is because caching would make development more difficult (changes would not
+// be reflected on the first load after each change).
+self.addEventListener('fetch', () => { });
\ No newline at end of file
diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/wwwroot/service-worker.published.js b/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/wwwroot/service-worker.published.js
new file mode 100644
index 0000000000..ee4e860377
--- /dev/null
+++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/wwwroot/service-worker.published.js
@@ -0,0 +1,37 @@
+// bit version: 8.2.0-pre-01
+// https://github.com/bitfoundation/bitplatform/tree/develop/src/Bswup
+
+self.assetsInclude = [];
+self.assetsExclude = [
+ /bit\.blazorui\.fluent\.css$/,
+ /bit\.blazorui\.fluent-dark\.css$/,
+ /bit\.blazorui\.fluent-light\.css$/,
+ /Boilerplate\.Client\.Web\.styles\.css$/
+];
+self.externalAssets = [
+ {
+ "url": "/"
+ },
+ {
+ "url": "_framework\/blazor.web.js"
+ }
+];
+
+self.serverHandledUrls = [
+ /\/api\//,
+ /\/odata\//,
+ /\/jobs\//,
+ /\/core\//,
+ /\/signalr\//,
+ /\/healthchecks-ui/,
+ /\/healthz/,
+ /\/swagger/
+];
+
+self.isPassive = true;
+self.defaultUrl = "/";
+self.caseInsensitiveUrl = true;
+self.noPrerenderQuery = 'no-prerender=true';
+self.disablePassiveFirstBoot = true;
+
+self.importScripts('_content/Bit.Bswup/bit-bswup.sw.js');
\ No newline at end of file
diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Build.props b/src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Build.props
index 08492474ff..842207c836 100644
--- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Build.props
+++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Build.props
@@ -11,6 +11,9 @@
entrue$(DefineConstants);MultilingualEnabled
+
+ false
+ $(DefineConstants);PwaEnabled14.214.0