64 lines
2.2 KiB
TypeScript
64 lines
2.2 KiB
TypeScript
import { z } from "zod"
|
|
|
|
const hexColorRegex = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/
|
|
|
|
export const linkSchema = z.object({
|
|
id: z.string().min(1, "Link id is required"),
|
|
name: z.string().min(1, "Link name is required"),
|
|
description: z.string().optional(),
|
|
url: z.string().url("Invalid URL").min(1, "URL is required"),
|
|
icon: z.string().min(1, "Icon name is required"),
|
|
iconUrl: z.string().url("Invalid icon URL").optional(),
|
|
color: z.string().regex(hexColorRegex, "Invalid hex color").optional(),
|
|
openInNewTab: z.boolean().optional().default(true),
|
|
visible_by_user: z.string().optional(),
|
|
visible_by_group: z.string().optional(),
|
|
})
|
|
|
|
export const sectionSchema = z.object({
|
|
id: z.string().min(1, "Section id is required"),
|
|
title: z.string().min(1, "Section title is required"),
|
|
description: z.string().optional(),
|
|
cardLayout: z.enum(["horizontal", "vertical"]).optional().default("horizontal"),
|
|
links: z.array(linkSchema).default([]),
|
|
visible_by_user: z.string().optional(),
|
|
visible_by_group: z.string().optional(),
|
|
})
|
|
|
|
export const themeSchema = z.object({
|
|
mode: z.enum(["dark", "light"]).default("dark"),
|
|
accent: z
|
|
.string()
|
|
.regex(hexColorRegex, "Invalid accent color")
|
|
.default("#8b5cf6"),
|
|
background: z.enum(["gradient", "solid"]).default("gradient"),
|
|
})
|
|
|
|
export const siteSchema = z.object({
|
|
name: z.string().min(1, "Site name is required"),
|
|
title: z.string().min(1, "Site title is required"),
|
|
description: z.string().optional(),
|
|
favicon: z.string().optional(),
|
|
logoUrl: z.string().url("Invalid logo URL").optional(),
|
|
showFooter: z.boolean().optional().default(true),
|
|
})
|
|
|
|
export const authenticationSchema = z.object({
|
|
logout_url: z.string().url("Invalid logout URL").min(1, "Logout URL is required"),
|
|
header_format: z.string().optional().default("Remote-User"),
|
|
username: z.string().optional(),
|
|
header_user: z.string().optional(),
|
|
header_group: z.string().optional(),
|
|
})
|
|
|
|
export const dashboardConfigSchema = z.object({
|
|
site: siteSchema,
|
|
theme: themeSchema.optional().default({
|
|
mode: "dark",
|
|
accent: "#8b5cf6",
|
|
background: "gradient",
|
|
}),
|
|
authentication: authenticationSchema.optional(),
|
|
sections: z.array(sectionSchema).default([]),
|
|
})
|