@keenmate/svelte-docs
Version:
A professional component library for building beautiful documentation and showcase sites with SvelteKit
167 lines (166 loc) • 5.61 kB
JavaScript
// Configuration types for the documentation library
// Default configuration
export const defaultConfig = {
site: {
title: "Documentation",
language: "en",
keywords: ["documentation", "svelte", "sveltekit"],
},
theme: {
colors: {
primary: "#00A7E1",
primaryDark: "#007EA7",
secondary: "#003459",
dark: "#00171F",
light: "#FFFFFF",
success: "#198754",
warning: "#ffc107",
danger: "#dc3545",
info: "#0dcaf0",
},
fonts: {
body: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',
heading: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',
mono: '"Courier New", Monaco, "Cascadia Code", "Roboto Mono", monospace',
},
components: {
navbar: {
height: "56px",
},
sidebar: {
width: "280px",
},
footer: {
height: "60px",
},
tooltip: {
isEnabled: true,
placement: "right",
showOnMobile: false,
showDelay: 0,
hideDelay: 0,
backgroundColor: "rgba(0, 0, 0, 0.9)",
textColor: "white",
fontSize: "0.875rem",
maxWidth: "300px",
zIndex: 1060,
borderRadius: "0.375rem",
padding: "0.5rem 0.75rem",
arrowSize: "8px",
},
},
},
features: {
search: true,
tableOfContents: true,
breadcrumbs: true,
copyCode: true,
darkMode: false,
editOnGitHub: false,
lastModified: false,
nextPrevious: true,
},
};
// Configuration validation helpers
export function validateConfig(config) {
const errors = [];
// Required fields
if (!config.site.title) {
errors.push("site.title is required");
}
if (!config.company.name) {
errors.push("company.name is required");
}
if (!config.navigation.main || config.navigation.main.length === 0) {
errors.push("navigation.main must contain at least one item");
}
// Validate navigation items
const validateNavItems = (items, path = "navigation.main") => {
items.forEach((item, index) => {
if (!item.label) {
errors.push(`${path}[${index}].label is required`);
}
if (!item.href) {
errors.push(`${path}[${index}].href is required`);
}
if (item.children) {
validateNavItems(item.children, `${path}[${index}].children`);
}
});
};
validateNavItems(config.navigation.main);
if (config.navigation.footer) {
validateNavItems(config.navigation.footer, "navigation.footer");
}
// Validate URLs
if (config.site.url && !isValidUrl(config.site.url)) {
errors.push("site.url must be a valid URL");
}
if (config.company.website && !isValidUrl(config.company.website)) {
errors.push("company.website must be a valid URL");
}
// Validate social links
if (config.company.social) {
Object.entries(config.company.social).forEach(([platform, url]) => {
if (url && !isValidUrl(url)) {
errors.push(`company.social.${platform} must be a valid URL`);
}
});
}
return errors;
}
// Helper function to validate URLs
function isValidUrl(string) {
try {
new URL(string);
return true;
}
catch {
return false;
}
}
// Configuration merging utility
export function mergeConfig(baseConfig, userConfig) {
return {
site: { ...baseConfig.site, ...userConfig.site },
company: {
...baseConfig.company,
...userConfig.company,
social: { ...baseConfig.company?.social, ...userConfig.company.social },
},
navigation: {
...baseConfig.navigation,
...userConfig.navigation,
main: userConfig.navigation.main,
footer: userConfig.navigation.footer || baseConfig.navigation?.footer,
social: userConfig.navigation.social || baseConfig.navigation?.social,
},
theme: {
...baseConfig.theme,
...userConfig.theme,
colors: { ...baseConfig.theme?.colors, ...userConfig.theme?.colors },
fonts: { ...baseConfig.theme?.fonts, ...userConfig.theme?.fonts },
components: {
...baseConfig.theme?.components,
...userConfig.theme?.components,
navbar: {
...baseConfig.theme?.components?.navbar,
...userConfig.theme?.components?.navbar,
},
sidebar: {
...baseConfig.theme?.components?.sidebar,
...userConfig.theme?.components?.sidebar,
},
footer: {
...baseConfig.theme?.components?.footer,
...userConfig.theme?.components?.footer,
},
tooltip: {
...baseConfig.theme?.components?.tooltip,
...userConfig.theme?.components?.tooltip,
},
},
},
features: { ...baseConfig.features, ...userConfig.features },
};
}