TypeScript & Configuration
TypeScript Configuration
The project uses Astro’s strict TypeScript preset (astro/tsconfigs/strict) with React JSX support for MDX components that use React islands.
Path Aliases
Path aliases are configured in tsconfig.json and resolve throughout all .astro, .ts, .tsx, and .mdx files:
| Alias | Resolves To | Usage |
|---|---|---|
@utils/* |
src/utils/* |
Utility functions and queries |
@components/* |
src/components/* |
Any component by full path |
@mdx |
src/components/mdx/index.ts |
Barrel import for all MDX components |
@mdx/* |
src/components/mdx/* |
Individual MDX component |
@layouts/* |
src/layouts/* |
Layout components |
@types |
src/types/index.ts |
Barrel import for all types |
@types/* |
src/types/* |
Individual type files |
@assets/* |
src/assets/* |
Static assets (images, etc.) |
@styles/* |
src/styles/* |
CSS files |
@reusable/* |
src/components/reusable/* |
Reusable components |
@layout/* |
src/components/layout/* |
Layout components (Header, Footer) |
@landing/* |
src/components/landing/* |
Landing page components |
@posts-catalog/* |
src/components/posts-catalog/* |
Post listing components |
@post/* |
src/components/post/* |
Post detail components |
The @mdx barrel alias is especially important — it enables the single-import pattern used in all .mdx content files:
import { Accordion, Button, Callout, Carousel, Center, ImageGrid, Img, Instagram, Marquee, YouTube, SideBySide, Left, Right } from '@mdx';
Type Definitions
Types are defined in src/types/ and re-exported from src/types/index.ts:
Content Types (src/types/content.ts)
type PostType = 'events' | 'projects';
type SponsorTier = 'bronze' | 'silver' | 'gold' | 'platinum' | 'diamond';
// Zod enums — use .options for all valid values
const CategoryEventEnum = z.enum([
'trade-fairs-and-conventions',
'competitions-and-workshops',
'kick-off-events',
'other'
]);
const CategoryProjectEnum = z.enum([
'experimental-rocketry',
'science-and-experiments',
'robotics',
'other'
]);
const CoverImageType = z.enum(["DEFAULT", "CUSTOM"]);
CategoryEventEnum.options and CategoryProjectEnum.options return the array of valid values, used by filter components to render category options.
Component Types (src/types/components.ts)
type SponsorEntry = CollectionEntry<'sponsors'>;
interface ImageWithAlt {
image: ImageMetadata | string;
alt: string;
description?: string;
}
ImageWithAlt is used by ImageGrid, CollapsibleImageGrid, and other image display components. description is optional and surfaces as a gradient overlay at the bottom of the image (and again beneath the enlarged image in the click-to-enlarge modal) when set. Use it for any combination of caption and photographer credit.
Astro Configuration
File: astro.config.mjs
export default defineConfig({
site: 'https://bears-space.de',
vite: {
plugins: [tailwindcss()]
},
integrations: [alpinejs(), mdx(), react(), sitemap({
filter: (page) => !page.includes('/docs/')
})]
});
| Setting | Purpose |
|---|---|
site |
Base URL for canonical links, Open Graph, and sitemap |
tailwindcss() |
Tailwind CSS v4 via Vite plugin (not Astro integration) |
alpinejs() |
Alpine.js for client-side interactivity |
mdx() |
MDX support for content files with component imports |
react() |
React JSX for interactive islands (Carousel) |
sitemap() |
Auto-generated sitemap, excluding /docs/ pages |