+-
++
+
+ form:nth-child(1) > div:nth-child(3) {
++ @extend %vw-hide;
++}
++
++/* Hide the `This account is owned by a business` checkbox and label */
++#ownedBusiness,
++label[for^="ownedBusiness"] {
++ @extend %vw-hide;
++}
++
++/* Hide the radio button and label for the `Custom` org user type */
++#userTypeCustom,
++label[for^="userTypeCustom"] {
++ @extend %vw-hide;
++}
++
++/* Hide Business Name */
++app-org-account form div bit-form-field.tw-block:nth-child(3) {
++ @extend %vw-hide;
++}
++
++/* Hide organization plans */
++app-organization-plans > form > h2.mt-5 {
++ @extend %vw-hide;
++}
++
++/* Hide Device Verification form at the Two Step Login screen */
++app-security > app-two-factor-setup > form {
++ @extend %vw-hide;
++}
++
++/* Replace the Bitwarden Shield at the top left with a Vaultwarden icon */
++.bwi-shield:before {
++ content: "" !important;
++ width: 32px !important;
++ height: 40px !important;
++ display: block !important;
++ background-image: url(../images/icon-white.png) !important;
++ background-repeat: no-repeat;
++ background-position-y: bottom;
++}
++/**** END Vaultwarden CHANGES ****/
+diff --git a/apps/web/src/scss/variables.scss b/apps/web/src/scss/variables.scss
+index 9d3d8d6ad4..5bc773c0d8 100644
+--- a/apps/web/src/scss/variables.scss
++++ b/apps/web/src/scss/variables.scss
+@@ -3,7 +3,7 @@ $dark-icon-themes: "theme_dark";
+ $primary: #175ddc;
+ $primary-accent: #1252a3;
+ $secondary: #ced4da;
+-$secondary-alt: #1a3b66;
++$secondary-alt: #212529;
+ $success: #017e45;
+ $info: #555555;
+ $warning: #8b6609;
+diff --git a/apps/web/webpack.config.js b/apps/web/webpack.config.js
+index 815a8aff9e..de7402dd4a 100644
+--- a/apps/web/webpack.config.js
++++ b/apps/web/webpack.config.js
+@@ -139,8 +139,6 @@ const plugins = [
+ { from: "./src/favicon.ico" },
+ { from: "./src/browserconfig.xml" },
+ { from: "./src/app-id.json" },
+- { from: "./src/404.html" },
+- { from: "./src/404", to: "404" },
+ { from: "./src/images", to: "images" },
+ { from: "./src/locales", to: "locales" },
+ { from: "../../node_modules/qrious/dist/qrious.min.js", to: "scripts" },
+diff --git a/libs/angular/src/auth/components/register.component.ts b/libs/angular/src/auth/components/register.component.ts
+index 3cffebe71b..c1229b5c2c 100644
+--- a/libs/angular/src/auth/components/register.component.ts
++++ b/libs/angular/src/auth/components/register.component.ts
+@@ -106,6 +106,14 @@ export class RegisterComponent extends CaptchaProtectedComponent implements OnIn
+ }
+
+ async submit(showToast = true) {
++ if (typeof crypto.subtle === "undefined") {
++ this.platformUtilsService.showToast(
++ "error",
++ "This browser requires HTTPS to use the web vault",
++ "Check the Vaultwarden wiki for details on how to enable it",
++ );
++ return;
++ }
+ let email = this.formGroup.value.email;
+ email = email.trim().toLowerCase();
+ let name = this.formGroup.value.name;
+diff --git a/libs/components/src/tw-theme.css b/libs/components/src/tw-theme.css
+index 0087af28ae..a4c7f94b8e 100644
+--- a/libs/components/src/tw-theme.css
++++ b/libs/components/src/tw-theme.css
+@@ -1,9 +1,9 @@
+ @import "./reset.css";
+
+-/**
+- Note that the value of the *-600 colors is currently equivalent to the value
++/**
++ Note that the value of the *-600 colors is currently equivalent to the value
+ of the *-500 variant of that color. This is a temporary change to make BW-42
+- updates easier.
++ updates easier.
+
+ TODO remove comment when the color palette portion of BW-42 is completed.
+ */
+@@ -14,12 +14,12 @@
+ --color-background: 255 255 255;
+ --color-background-alt: 251 251 251;
+ --color-background-alt2: 23 92 219;
+- --color-background-alt3: 18 82 163;
+- --color-background-alt4: 13 60 119;
++ --color-background-alt3: 33 37 41; /* bg of menu panel */
++ --color-background-alt4: 16 18 21; /* bg of active menu item */
+
+- --color-primary-300: 103 149 232;
+- --color-primary-600: 23 93 220;
+- --color-primary-700: 18 82 163;
++ --color-primary-300: 108 117 125; /* hover of menu items */
++ --color-primary-600: 18 82 163; /* color of links and buttons */
++ --color-primary-700: 13 60 119; /* hover of links and buttons */
+
+ --color-secondary-100: 240 240 240;
+ --color-secondary-300: 206 212 220;
+@@ -171,7 +171,7 @@
+ @import "./popover/popover.component.css";
+ @import "./search/search.component.css";
+
+-/**
++/**
+ * tw-break-words does not work with table cells:
+ * https://github.com/tailwindlabs/tailwindcss/issues/835
+ */
+@@ -179,7 +179,7 @@ td.tw-break-words {
+ overflow-wrap: anywhere;
+ }
+
+-/**
++/**
+ * tw-list-none hides summary arrow in Firefox & Chrome but not Safari:
+ * https://github.com/tailwindlabs/tailwindcss/issues/924#issuecomment-915509785
+ */
+@@ -188,7 +188,7 @@ summary.tw-list-none::-webkit-details-marker {
+ display: none;
+ }
+
+-/**
++/**
+ * Arbitrary values can't be used with `text-align`:
+ * https://github.com/tailwindlabs/tailwindcss/issues/802#issuecomment-849013311
+ */
diff --git a/patches/v2024.4.2.patch b/patches/v2024.4.2.patch
new file mode 100644
index 0000000..0b113e1
--- /dev/null
+++ b/patches/v2024.4.2.patch
@@ -0,0 +1,870 @@
+diff --git a/apps/web/src/app/admin-console/organizations/create/organization-information.component.html b/apps/web/src/app/admin-console/organizations/create/organization-information.component.html
+index e0a8006081..789efd9264 100644
+--- a/apps/web/src/app/admin-console/organizations/create/organization-information.component.html
++++ b/apps/web/src/app/admin-console/organizations/create/organization-information.component.html
+@@ -12,7 +12,7 @@
+
+
+
+- {{ "billingEmail" | i18n }}
++ {{ "email" | i18n }}
+
+
+
+diff --git a/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.ts b/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.ts
+index b1a84c22f3..b52f4c7cb2 100644
+--- a/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.ts
++++ b/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.ts
+@@ -121,6 +121,7 @@ export class OrganizationLayoutComponent implements OnInit, OnDestroy {
+ }
+
+ canShowBillingTab(organization: Organization): boolean {
++ return false; // disable billing tab in Vaultwarden
+ return canAccessBillingTab(organization);
+ }
+
+diff --git a/apps/web/src/app/admin-console/organizations/members/people.component.ts b/apps/web/src/app/admin-console/organizations/members/people.component.ts
+index af04d83c34..2ae49ea968 100644
+--- a/apps/web/src/app/admin-console/organizations/members/people.component.ts
++++ b/apps/web/src/app/admin-console/organizations/members/people.component.ts
+@@ -190,11 +190,7 @@ export class PeopleComponent extends BasePeopleComponent {
+ .find((p) => p.organizationId === this.organization.id);
+ this.orgResetPasswordPolicyEnabled = resetPasswordPolicy?.enabled;
+
+- const billingMetadata = await this.billingApiService.getOrganizationBillingMetadata(
+- this.organization.id,
+- );
+-
+- this.orgIsOnSecretsManagerStandalone = billingMetadata.isOnSecretsManagerStandalone;
++ this.orgIsOnSecretsManagerStandalone = false; // don't get billing metadata
+
+ await this.load();
+
+diff --git a/apps/web/src/app/admin-console/organizations/organization-routing.module.ts b/apps/web/src/app/admin-console/organizations/organization-routing.module.ts
+index 7abee6b0d0..2e3b789b23 100644
+--- a/apps/web/src/app/admin-console/organizations/organization-routing.module.ts
++++ b/apps/web/src/app/admin-console/organizations/organization-routing.module.ts
+@@ -68,13 +68,6 @@ const routes: Routes = [
+ (m) => m.OrganizationReportingModule,
+ ),
+ },
+- {
+- path: "billing",
+- loadChildren: () =>
+- import("../../billing/organizations/organization-billing.module").then(
+- (m) => m.OrganizationBillingModule,
+- ),
+- },
+ ],
+ },
+ ];
+diff --git a/apps/web/src/app/admin-console/organizations/settings/account.component.html b/apps/web/src/app/admin-console/organizations/settings/account.component.html
+index 082fe7eb80..32feab6f4d 100644
+--- a/apps/web/src/app/admin-console/organizations/settings/account.component.html
++++ b/apps/web/src/app/admin-console/organizations/settings/account.component.html
+@@ -17,7 +17,7 @@
+
+
+
+- {{ "billingEmail" | i18n }}
++ {{ "email" | i18n }}
+
+
+
+diff --git a/apps/web/src/app/admin-console/organizations/settings/account.component.ts b/apps/web/src/app/admin-console/organizations/settings/account.component.ts
+index 1ce05f7a30..62116941ce 100644
+--- a/apps/web/src/app/admin-console/organizations/settings/account.component.ts
++++ b/apps/web/src/app/admin-console/organizations/settings/account.component.ts
+@@ -95,7 +95,7 @@ export class AccountComponent {
+ ) {}
+
+ async ngOnInit() {
+- this.selfHosted = this.platformUtilsService.isSelfHost();
++ this.selfHosted = false; // set to false so we can rename organizations
+
+ this.route.params
+ .pipe(
+@@ -197,6 +197,7 @@ export class AccountComponent {
+ }
+
+ submitCollectionManagement = async () => {
++ return; // flexible collections are not supported by Vaultwarden
+ // Early exit if self-hosted
+ if (this.selfHosted) {
+ return;
+diff --git a/apps/web/src/app/app.component.ts b/apps/web/src/app/app.component.ts
+index 1da2d94c15..123f666380 100644
+--- a/apps/web/src/app/app.component.ts
++++ b/apps/web/src/app/app.component.ts
+@@ -2,7 +2,7 @@ import { DOCUMENT } from "@angular/common";
+ import { Component, Inject, NgZone, OnDestroy, OnInit } from "@angular/core";
+ import { NavigationEnd, Router } from "@angular/router";
+ import * as jq from "jquery";
+-import { Subject, switchMap, takeUntil, timer } from "rxjs";
++import { Subject, takeUntil } from "rxjs";
+
+ import { EventUploadService } from "@bitwarden/common/abstractions/event/event-upload.service";
+ import { NotificationsService } from "@bitwarden/common/abstractions/notifications.service";
+@@ -12,7 +12,6 @@ import { InternalOrganizationServiceAbstraction } from "@bitwarden/common/admin-
+ import { InternalPolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction";
+ import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service";
+ import { KeyConnectorService } from "@bitwarden/common/auth/abstractions/key-connector.service";
+-import { PaymentMethodWarningsServiceAbstraction as PaymentMethodWarningService } from "@bitwarden/common/billing/abstractions/payment-method-warnings-service.abstraction";
+ import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service";
+ import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service";
+ import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service";
+@@ -44,7 +43,6 @@ import {
+
+ const BroadcasterSubscriptionId = "AppComponent";
+ const IdleTimeout = 60000 * 10; // 10 minutes
+-const PaymentMethodWarningsRefresh = 60000; // 1 Minute
+
+ @Component({
+ selector: "app-root",
+@@ -55,7 +53,6 @@ export class AppComponent implements OnDestroy, OnInit {
+ private idleTimer: number = null;
+ private isIdle = false;
+ private destroy$ = new Subject