Discover new documentary episodes from the ZDF Mediathek. Filter by category and genre to find your next watch.
Vue 3 · TypeScript · Vite · Tailwind CSS · Pinia · vue-i18n
npm install
npm run dev| Command | Description |
|---|---|
npm run dev |
Start dev server |
npm run build |
Type-check and build for production |
npm run preview |
Preview production build |
npm run lint |
Lint and fix |
The app is organized around stores as the central state layer. Views and components consume stores directly.
src/
├── components/ # Reusable Vue components
├── views/ # Page-level components
├── stores/ # Pinia state management
│ ├── episodes_store/ # Episode fetching and state
│ └── filterStore/ # Category/genre filter state
├── i18n/ # Internationalization
└── lib/ # Shared utilities
Stores hold reactive state and perform data fetching. Each store typically has:
- State — Typed reactive state (e.g.
EpisodesState,FilterState) - Actions — Mutations and async operations (e.g.
getNewEpisodes,updateSelectedCategories) - Getters — Derived values (e.g.
getSelectedGenres)
Views and components use stores via useEpisodesStore() and useFilterStore(). There are no separate domain, data, or repository layers — stores encapsulate both state and API access.
Episodes are fetched directly from the ZDF Mediathek. This is an unofficial, open-source project and not affiliated with ZDF.
For non-trivial components, add a <script lang="ts"> block before <script setup> with a JSDoc comment describing the component's purpose. Use export default {}; to satisfy Vue's single-root component requirement.
<script lang="ts">
/**
* MyComponent
*
* Brief description of what the component does.
*
* Sections, responsibilities, or notable behavior can be
* listed here as bullet points or paragraphs.
*/
export default {}
</script>
<script setup lang="ts">
// ...
</script>- Imports — external libraries,
@/core/...,@/features/..., then relative imports - i18n —
const { t } = i18n.global - Props and emits —
defineProps,defineEmits - Store instantiation —
const xStore = useXStore() - Reactive state and composables —
ref,computed,reactive,useX() - Functions and event handlers
- Top-level imperative logic — initial data loads,
$subscribecalls - Lifecycle hooks —
onMounted,onUnmounted, etc.