Files
homarr/src/validations/boards.ts
2024-12-07 22:21:40 +01:00

57 lines
1.5 KiB
TypeScript

import { DEFAULT_THEME, MANTINE_COLORS, MantineColor } from '@mantine/core';
import { z } from 'zod';
import {
BackgroundImageAttachment,
BackgroundImageRepeat,
BackgroundImageSize,
} from '~/types/settings';
export const configNameSchema = z
.string()
.regex(/^[a-zA-Z0-9-_\s()]+$/)
.min(1);
export const createBoardSchemaValidation = z.object({
name: configNameSchema,
});
export const boardCustomizationSchema = z.object({
access: z.object({
allowGuests: z.boolean(),
}),
layout: z.object({
leftSidebarEnabled: z.boolean(),
rightSidebarEnabled: z.boolean(),
pingsEnabled: z.boolean(),
}),
gridstack: z.object({
sm: z.number().min(1).max(8),
md: z.number().min(3).max(16),
lg: z.number().min(5).max(20),
}),
pageMetadata: z.object({
pageTitle: z.string(),
metaTitle: z.string(),
logoSrc: z.string(),
faviconSrc: z.string(),
}),
appearance: z.object({
backgroundSrc: z.string(),
backgroundImageAttachment: z.enum(BackgroundImageAttachment),
backgroundImageSize: z.enum(BackgroundImageSize),
backgroundImageRepeat: z.enum(BackgroundImageRepeat),
primaryColor: z.custom<MantineColor>(
(value) => typeof value === 'string' && MANTINE_COLORS.includes(value)
),
secondaryColor: z.custom<MantineColor>(
(value) => typeof value === 'string' && MANTINE_COLORS.includes(value)
),
shade: z
.number()
.min(0)
.max(DEFAULT_THEME.colors['blue'].length - 1),
opacity: z.number().min(10).max(100),
customCss: z.string(),
}),
});