diff --git a/web/public/favicon-badge.svg b/web/public/favicon-badge.svg
index 039448d..68bda20 100644
--- a/web/public/favicon-badge.svg
+++ b/web/public/favicon-badge.svg
@@ -1,6 +1,6 @@
\ No newline at end of file
diff --git a/web/public/favicon-dev-lightmode.svg b/web/public/favicon-dev-lightmode.svg
new file mode 100644
index 0000000..9825cc5
--- /dev/null
+++ b/web/public/favicon-dev-lightmode.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/web/public/favicon-stage-badge.svg b/web/public/favicon-stage-badge.svg
index e67d915..3d82459 100644
--- a/web/public/favicon-stage-badge.svg
+++ b/web/public/favicon-stage-badge.svg
@@ -1,13 +1,6 @@
\ No newline at end of file
diff --git a/web/public/favicon-stage-lightmode.svg b/web/public/favicon-stage-lightmode.svg
new file mode 100644
index 0000000..8abf112
--- /dev/null
+++ b/web/public/favicon-stage-lightmode.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/web/public/favicon-stage.svg b/web/public/favicon-stage.svg
index 281d5bb..862ef78 100644
--- a/web/public/favicon-stage.svg
+++ b/web/public/favicon-stage.svg
@@ -1,18 +1,7 @@
\ No newline at end of file
diff --git a/web/src/actions/admin/service.ts b/web/src/actions/admin/service.ts
index 73a3011..9cd6956 100644
--- a/web/src/actions/admin/service.ts
+++ b/web/src/actions/admin/service.ts
@@ -307,7 +307,7 @@ export const adminServiceActions = {
input: z.object({
id: z.number().int().positive(),
label: z.string().min(1).max(50).nullable(),
- value: z.string().url(),
+ value: zodContactMethod,
serviceId: z.number().int().positive(),
}),
handler: async (input) => {
diff --git a/web/src/components/BaseHead.astro b/web/src/components/BaseHead.astro
index 989c633..68c926d 100644
--- a/web/src/components/BaseHead.astro
+++ b/web/src/components/BaseHead.astro
@@ -100,7 +100,7 @@ const ogImageUrl = makeOgImageUrl(ogImage, Astro.url)
{pwaAssetsHead.themeColor && }
-{pwaAssetsHead.links.map((link) => )}
+{pwaAssetsHead.links.filter((link) => link.rel !== 'icon').map((link) => )}
{pwaInfo && }
diff --git a/web/src/components/DynamicFavicon.astro b/web/src/components/DynamicFavicon.astro
index 0cce79d..ce83d40 100644
--- a/web/src/components/DynamicFavicon.astro
+++ b/web/src/components/DynamicFavicon.astro
@@ -25,10 +25,11 @@ function addBadgeIfUnread(href: string) {
{
DEPLOYMENT_MODE === 'production' && (
<>
-
+
@@ -37,12 +38,30 @@ function addBadgeIfUnread(href: string) {
}
{
DEPLOYMENT_MODE === 'development' && (
-
+ <>
+
+
+ >
)
}
{
DEPLOYMENT_MODE === 'staging' && (
-
+ <>
+
+
+ >
)
}
diff --git a/web/src/lib/zodUtils.ts b/web/src/lib/zodUtils.ts
index fdf322d..49946a5 100644
--- a/web/src/lib/zodUtils.ts
+++ b/web/src/lib/zodUtils.ts
@@ -21,7 +21,7 @@ const cleanUrl = (input: unknown) => {
export const zodUrlOptionalProtocol = z.preprocess(
cleanUrl,
- z.string().refine((value) => /^(https?):\/\/(?=.*\.[a-z0-9]{2,})[^\s$.?#].[^\s]*$/i.test(value), {
+ z.string().refine((value) => /^(https?:\/\/)?[a-z0-9]+(\.[a-z0-9])*(\.[a-z0-9]{2,}).*$/i.test(value), {
message: 'Invalid URL',
})
)
@@ -42,7 +42,7 @@ export const zodContactMethod = z.preprocess(
.trim()
.refine(
(value) =>
- /^((https?):\/\/(?=.*\.[a-z0-9]{2,})[^\s$.?#].[^\s]|([\d\s+\-_/()[\]*#.,]|ext|x){7,}|[0-9\s+-_\\/()[\]*#.]|[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})*$/i.test(
+ /^((https?:\/\/)?[a-z0-9]+(\.[a-z0-9])*(\.[a-z0-9]{2,}).*|([\d\s+\-_/()[\]*#.,]|ext|x){7,}|[0-9\s+-_\\/()[\]*#.]|[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})*$/i.test(
value
),
{
diff --git a/web/src/pages/admin/services/[slug]/edit.astro b/web/src/pages/admin/services/[slug]/edit.astro
index a29fac2..fabd195 100644
--- a/web/src/pages/admin/services/[slug]/edit.astro
+++ b/web/src/pages/admin/services/[slug]/edit.astro
@@ -1141,8 +1141,21 @@ const apiCalls = await Astro.locals.banners.try(
type.labelPlural).join(', ')}`}
+ name="value"
+ inputProps={{
+ required: true,
+ value: method.value,
+ placeholder: 'contact@example.com',
+ }}
+ error={contactMethodUpdateInputErrors.value}
+ />
+
+
-
-
@@ -1174,8 +1177,6 @@ const apiCalls = await Astro.locals.banners.try(