managarten/apps/mana/apps/web
Till JS 72a5995fa5 feat(articles): M9 workbench homepage — 4-tab shell + QuickAdd + StatsView
Articles ist jetzt als Workbench-App in apps.ts registriert
(icon BookOpen, collection 'articles', paramKey 'articleId') und
landet damit im Scene-App-Picker. HomeView/ListView/HighlightsView/
StatsView teilen sich eine neue ArticlesTabShell, die sowohl als
SvelteKit-Route als auch als Workbench-Karte rendert.

Shell (ArticlesTabShell.svelte):
 - Top-Bar mit QuickAddInput (URL einfügen + Enter = Save + goto
   Reader; kein Preview-Schritt) und Settings-Gear.
 - Tab-Leiste darunter: Leseliste | Highlights | Favoriten | Stats.
   Leseliste ist Default (initialTab='list').
 - Tab-Wechsel läuft intern via $state + Svelte-Context — kritisch
   für die Workbench-Karte, wo goto() den User aus der Karte kicken
   würde. getArticlesTabContext() aus tab-context.ts gibt tief
   verschachtelten Sektionen eine switchTo(tab)-API.
 - Padding 1rem 1.25rem auf der Shell selbst — PageShell.page-body
   hat null padding, sonst klebt QuickAdd am Card-Rand. Im Route-
   Kontext addiert's sich zum (app)-Layout-Padding ohne zu viel.

Tabs:
 - Leseliste (list): bestehende ListView mit optionalem
   initialFilter-Prop. Continue-Reading-Strip (HomeSectionWeiterlesen
   horizontal carousel) erscheint über den Filter-Chips wenn
   status='reading'-Artikel existieren und filter ∈ {all, reading}.
   Filter-Chips sind einzeilig + horizontal scrollbar mit
   scroll-snap-Einrast; inaktive Chips haben jetzt sichtbare
   Background-Füllung + Border via color-mix(currentColor) — adaptiv
   fürs Theme.
 - Highlights (highlights): HighlightsView unverändert (nur der
   eigene Header + Zurück-Button raus, liegt jetzt in der Shell).
 - Favoriten (favorites): ListView mit initialFilter='favorites' —
   Shell-Shortcut auf den Filter.
 - Stats (stats): neue StatsView mit Stats-Strip (savedThisWeek,
   finishedThisWeek, avg reading time), Highlight-Counter, Top-
   Sources und Archiv-Link.

Routes (unter (tabs)-Gruppe):
 - /articles                → initialTab="list"   (Default)
 - /articles/list           → initialTab="list"   (alias)
 - /articles/highlights     → initialTab="highlights"
 - /articles/favorites      → initialTab="favorites"
 - /articles/stats          → initialTab="stats"
 Detail/Add/Settings bleiben bewusst ausserhalb — die haben ihren
 eigenen Reader/Form-Chrome und sollen die Tab-Leiste nicht zeigen.

Neue Files:
 - ArticlesTabShell.svelte   (Tab-Host)
 - tab-context.ts            (Cross-Tab-Switch-Context)
 - components/ArticleCard.svelte (shared Card aus ListView extrahiert,
                                  row + compact Varianten)
 - components/QuickAddInput.svelte (URL-Input aus HomeView extrahiert)
 - components/HomeSectionSources.svelte
 - components/HomeSectionStats.svelte
 - components/HomeSectionWeiterlesen.svelte
 - views/StatsView.svelte
 - routes/(app)/articles/(tabs)/{+page,list,highlights,favorites,stats}

Gelöscht:
 - HomeView.svelte (Overview-Tab wurde rausgenommen auf User-Feedback)
 - HomeSectionFrisch/Highlights/Favorites (durch eigene Tabs ersetzt)

docs/plans/articles-homepage.md dokumentiert den Architektur-Plan,
inklusive der Entscheidung für "eine Card pro Domain, interne Tabs"
statt zwei separater App-Registrierungen.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 17:50:38 +02:00
..
e2e feat: E2E smoke test, lazy widget loading, typed module context 2026-04-10 22:17:57 +02:00
src feat(articles): M9 workbench homepage — 4-tab shell + QuickAdd + StatsView 2026-04-22 17:50:38 +02:00
static feat(profile): voice interview with pre-rendered TTS audio + Orpheus/Zonos backends 2026-04-17 15:22:52 +02:00
.env.example chore: complete ManaCore → Mana rename (docs, go modules, plists, images) 2026-04-07 12:26:10 +02:00
.gitignore chore: ignore vite-plugin-pwa dev-dist output 2026-04-14 19:50:03 +02:00
Dockerfile fix(web-docker): copy packages/shared-ai into build context 2026-04-15 15:07:41 +02:00
eslint.config.js refactor(credits): simplify credit system — remove productivity credits, guild pools, complex gift types 2026-04-10 19:08:42 +02:00
MIDDLEWARE_SECURITY.md feat: rename ManaCore to Mana across entire codebase 2026-04-05 20:00:13 +02:00
package.json chore(web): harden pnpm check with --fail-on-warnings 2026-04-22 17:33:50 +02:00
playwright.config.ts test(events): playwright e2e specs + flake-resistant config 2026-04-07 18:36:45 +02:00
README.md chore: complete ManaCore → Mana rename (docs, go modules, plists, images) 2026-04-07 12:26:10 +02:00
svelte.config.js feat: rename ManaCore to Mana across entire codebase 2026-04-05 20:00:13 +02:00
tsconfig.json fix(types): enable allowImportingTsExtensions, restore .ts on shared-types 2026-04-14 20:54:35 +02:00
vite.config.ts feat(articles): M7 share-target + bookmarklet — save from anywhere 2026-04-21 19:03:33 +02:00
WELCOME_ROUTE_SETUP.md chore: complete ManaCore → Mana rename (docs, go modules, plists, images) 2026-04-07 12:26:10 +02:00

Mana Web

Modern SvelteKit web application for Mana credit/mana management system.

Features

  • 🔐 Authentication with Supabase
  • 🎨 Tailwind CSS for styling
  • 📱 Responsive design
  • 🔄 Real-time updates
  • 🏢 Organization management
  • 👥 Team management
  • 💰 Credit/Mana transfers
  • 🧪 Comprehensive testing

Tech Stack

  • Framework: SvelteKit 2.x with Svelte 5 (Runes)
  • Language: TypeScript
  • Styling: Tailwind CSS 3.x
  • Backend: Supabase (PostgreSQL + Auth)
  • Middleware: Mana Middleware API
  • Testing: Vitest + Playwright
  • Deployment: Vercel/Netlify ready

Getting Started

Prerequisites

  • Node.js 20+ and pnpm
  • Supabase account and project
  • Access to Mana Middleware

Installation

# Install dependencies
pnpm install

# Copy environment variables
cp .env.example .env

# Update .env with your credentials:
# - PUBLIC_SUPABASE_URL
# - PUBLIC_SUPABASE_ANON_KEY
# - PUBLIC_MIDDLEWARE_URL

Development

# Start dev server
pnpm dev

# Run type checking
pnpm check

# Run tests
pnpm test

# Run E2E tests
pnpm test:e2e

Building

# Build for production
pnpm build

# Preview production build
pnpm preview

Project Structure

src/
├── routes/              # File-based routing
│   ├── (auth)/         # Auth routes (login, register)
│   ├── (app)/          # Protected app routes
│   │   ├── dashboard/
│   │   ├── organizations/
│   │   ├── teams/
│   │   └── settings/
│   └── api/            # API endpoints
├── lib/
│   ├── components/     # Reusable components
│   │   ├── ui/        # UI primitives
│   │   └── features/  # Feature components
│   ├── stores/        # Svelte stores
│   ├── utils/         # Utilities
│   ├── types/         # TypeScript types
│   └── server/        # Server-only code
│       ├── db/        # Database utilities
│       ├── auth/      # Auth helpers
│       └── api/       # API integration
├── hooks.server.ts    # Server hooks
└── app.css            # Global styles

Environment Variables

Public Variables (exposed to client)

  • PUBLIC_SUPABASE_URL - Supabase project URL
  • PUBLIC_SUPABASE_ANON_KEY - Supabase anonymous key
  • PUBLIC_MIDDLEWARE_URL - Mana Middleware URL
  • PUBLIC_APP_NAME - Application name

Private Variables (server-only)

Add any private API keys or secrets here.

Deployment

Netlify (Production Setup)

The app is currently deployed to https://app.mana.how using Netlify.

Prerequisites

# Install Netlify CLI globally
npm install -g netlify-cli

# Login to Netlify
netlify login

Initial Setup (One-time)

The project is already configured with @sveltejs/adapter-netlify. If you need to set it up from scratch:

# Install the Netlify adapter
pnpm add -D @sveltejs/adapter-netlify

Update svelte.config.js:

import adapter from '@sveltejs/adapter-netlify';

Environment Variables

Ensure your .env file exists with the following variables:

PUBLIC_SUPABASE_URL=your_supabase_url
PUBLIC_SUPABASE_ANON_KEY=your_supabase_anon_key
MIDDLEWARE_URL=https://mana-middleware-111768794939.europe-west3.run.app

Important: Set these same environment variables in Netlify Dashboard → Site Settings → Environment Variables for production builds.

Deployment

# 1. Install dependencies (if needed)
pnpm install

# 2. Build for production
pnpm build

# 3. Deploy to production (site: mana)
netlify deploy --prod --site mana --dir build

The build process creates:

  • build/ - Static assets and client code
  • .netlify/ - Serverless functions for SSR

Build Output

After running pnpm build, you should see:

  • Client bundle in build/
  • Server functions in .netlify/
  • Netlify configuration (_headers, _redirects)

Vercel (Alternative)

# Install Vercel adapter instead
pnpm add -D @sveltejs/adapter-vercel

# Deploy
vercel

Docker

# Build image
docker build -t mana-web .

# Run container
docker run -p 3000:3000 mana-web

Contributing

  1. Create a feature branch
  2. Make your changes
  3. Run tests and type checking
  4. Submit a pull request

License

Private - All rights reserved