# Shared Packages Roadmap

This document outlines the plan to unify common code across all web apps in the monorepo.

## Current Shared Packages

- [x] `@manacore/shared-icons` - Unified Phosphor Icons for all web apps
- [x] `@manacore/shared-ui` - Unified UI Components (Text, Button, Badge, Toggle, Input, Modal, Card, Navigation, Forms)
- [x] `@manacore/shared-auth` - Unified Auth Logic (Supabase client, token management)
- [x] `@manacore/shared-auth-ui` - Unified Auth UI (LoginPage, RegisterPage, OAuth buttons)
- [x] `@manacore/shared-tailwind` - Unified Tailwind Config (HSL colors, preset, themes.css)
- [x] `@manacore/shared-theme` - Unified Theme Store (Svelte 5, 4 variants, light/dark/system)
- [x] `@manacore/shared-theme-ui` - Theme UI Components (ThemeToggle, ThemeSelector)
- [x] `@manacore/shared-utils` - Unified Utilities (formatting, validation, async, date, keyboard)
- [x] `@manacore/shared-types` - Unified TypeScript Types
- [x] `@manacore/shared-supabase` - Unified Supabase Client Factory
- [x] `@manacore/shared-i18n` - Unified i18n (languages, locale detection, translations)
- [x] `@manacore/shared-config` - Unified Config (env validation)
- [x] `@manacore/shared-branding` - **NEW** Unified App Branding (logos, colors, app config)
- [x] `@manacore/shared-subscription-types` - Subscription Type Definitions
- [x] `@manacore/shared-subscription-ui` - Subscription UI Components

---

## Recently Completed (2025-11-24)

### App Migration to Shared Packages

All web apps now use the shared packages consistently:

**Logo Components** - Migrated to `@manacore/shared-branding`:

- `memoro/apps/web/src/lib/components/MemoroLogo.svelte` → uses `AppLogo`
- `manadeck/apps/web/src/lib/components/ManaDeckLogo.svelte` → uses `AppLogo`
- `manacore/apps/web/src/lib/components/ManaCoreLogo.svelte` → uses `AppLogo`
- `maerchenzauber/apps/web/src/lib/components/StorytellerLogo.svelte` → uses `AppLogo`

**Formatter Functions** - Migrated to `@manacore/shared-utils`:

- `memoro/apps/web/src/lib/components/memo/AdditionalRecordings.svelte` → uses `formatDurationFromMs`, `formatFileSize`
- `memoro/apps/web/src/lib/components/RecordingButton.svelte` → uses `formatDuration`
- `memoro/apps/web/src/lib/components/statistics/OverviewCard.svelte` → uses `formatDurationWithUnits`
- `memoro/apps/web/src/lib/components/statistics/InsightsCard.svelte` → uses `formatDurationWithUnits`
- `memoro/apps/web/src/lib/components/statistics/ProductivityCard.svelte` → uses `formatDurationWithUnits`

---

## Planned Shared Packages

### 1. Shared UI Components (`@manacore/shared-ui`)

**Status**: Done
**Priority**: High
**Estimated LOC Savings**: 500-800 per app

**Components to unify**:

- `Button.svelte` - Primary, secondary, ghost, danger variants
- `Input.svelte` - Text input with label, error states
- `Text.svelte` - Typography component with variants
- `Modal.svelte` - Overlay modal with header, body, footer slots
- `Spinner.svelte` - Loading indicator
- `Toast.svelte` - Notification toasts
- `Badge.svelte` - Status badges
- `Card.svelte` - Content container
- `Dropdown.svelte` - Select/dropdown menus

**Apps using these**:

- ManaCore Web
- Memoro Web
- Maerchenzauber Web
- ManaDeck Web

---

### 2. Shared Auth (`@manacore/shared-auth`)

**Status**: Done
**Priority**: High
**Estimated LOC Savings**: 800-1200 per app

**Modules to unify**:

- `tokenManager.ts` - JWT token storage, refresh, validation
- `authService.ts` - Login, logout, register, password reset
- `supabaseClient.ts` - Authenticated Supabase client factory
- `authStore.ts` - Svelte store for auth state
- `authGuard.ts` - Route protection utilities

**Considerations**:

- Each app may have different Supabase projects
- Token storage strategy (localStorage vs cookies)
- OAuth providers per app

---

### 3. Shared Tailwind Config (`@manacore/shared-tailwind`)

**Status**: Done
**Priority**: High
**Estimated Benefit**: Consistent branding, easier theme updates

**Config unified**:

- Color palette (primary, secondary, accent colors)
- Theme variants (Lume, Nature, Stone, Ocean) with light/dark modes
- Typography scale (font sizes, line heights)
- Border radius tokens
- Shadow tokens
- CSS variable-based theming system

**Structure**:

```
packages/shared-tailwind/
├── package.json
├── src/
│   ├── index.js           # Main exports
│   ├── preset.js          # Tailwind preset with all tokens
│   ├── colors.js          # Color definitions (4 themes)
│   ├── theme-variables.css # CSS variables for themes
│   └── components.css     # Component utilities
```

**Apps using this**:

- Memoro Web (full migration with theme.css + components.css)
- ManaCore Web (preset only, keeps local colors)
- ManaDeck Web (colors import, HSL-based system)
- Maerchenzauber Web (dependency added)

---

### 4. Shared Utilities (`@manacore/shared-utils`)

**Status**: Done
**Priority**: Medium
**Estimated LOC Savings**: 200-400 per app

**Utilities included**:

- `date.ts` - formatDate, formatRelativeTime, toISOString
- `format.ts` - formatDuration, formatFileSize, formatNumber, formatCurrency, formatPercent
- `validation.ts` - isValidEmail, isValidUrl, isValidPhone, validatePassword, isValidUuid
- `string.ts` - truncate, capitalize, generateId, slugify
- `async.ts` - sleep, retry, debounce

---

### 5. Shared Types (`@manacore/shared-types`)

**Status**: Planned
**Priority**: Medium
**Estimated Benefit**: Type safety across packages

**Types to unify**:

- `User` - Common user type
- `ApiResponse<T>` - Standard API response wrapper
- `PaginatedResponse<T>` - Pagination types
- `Theme` - Theme configuration types
- `Locale` - i18n locale types

**Note**: App-specific database types (Supabase generated) should remain in each app.

---

### 6. Shared i18n (`@manacore/shared-i18n`)

**Status**: Done
**Priority**: Medium
**Estimated LOC Savings**: 100-300 per app

**Modules to unify**:

- `i18n.ts` - svelte-i18n setup and initialization
- `detectLocale.ts` - Browser language detection
- Common translations:
  - Error messages
  - UI labels (Save, Cancel, Delete, etc.)
  - Date/time formats
  - Validation messages

**Structure**:

```
packages/shared-i18n/
├── package.json
├── src/
│   ├── index.ts
│   ├── setup.ts
│   ├── detectLocale.ts
│   └── translations/
│       ├── common/
│       │   ├── en.json
│       │   └── de.json
│       └── errors/
│           ├── en.json
│           └── de.json
```

---

### 7. Shared Config (`@manacore/shared-config`)

**Status**: Planned
**Priority**: Low
**Estimated Benefit**: Consistent env handling

**Config to unify**:

- Environment variable validation (Zod schemas)
- API endpoint construction
- Feature flag utilities
- App metadata (version, name, etc.)

---

## Implementation Order

1. **Phase 1** (Completed)
   - [x] `@manacore/shared-icons`
   - [x] `@manacore/shared-ui`

2. **Phase 2** (Completed)
   - [x] `@manacore/shared-auth`
   - [x] `@manacore/shared-auth-ui`
   - [x] `@manacore/shared-tailwind`

3. **Phase 3** (Completed)
   - [x] `@manacore/shared-utils`
   - [x] `@manacore/shared-types`
   - [x] `@manacore/shared-supabase`

4. **Phase 4** (Completed)
   - [x] `@manacore/shared-i18n`
   - [x] `@manacore/shared-config`

---

## Guidelines for Shared Packages

### Package Structure

```
packages/shared-{name}/
├── package.json
├── tsconfig.json
├── src/
│   ├── index.ts        # Public exports
│   └── ...
└── README.md
```

### Package.json Template

```json
{
	"name": "@manacore/shared-{name}",
	"version": "0.1.0",
	"private": true,
	"type": "module",
	"main": "./src/index.ts",
	"types": "./src/index.ts",
	"exports": {
		".": "./src/index.ts"
	},
	"peerDependencies": {
		"svelte": "^5.0.0"
	}
}
```

### Best Practices

1. **Keep it minimal** - Only share truly common code
2. **Document props** - Use TypeScript interfaces with JSDoc
3. **Version carefully** - Coordinate updates across apps
4. **Test thoroughly** - Changes affect all apps
5. **Avoid breaking changes** - Use deprecation warnings

---

## Package Details

### `@manacore/shared-branding`

Centralized branding configuration for all Mana ecosystem apps.

**Exports**:

- `AppLogo` - SVG logo component that renders app-specific logo
- `AppLogoWithName` - Logo with app name and tagline
- `ManaIcon` - Generic Mana icon component
- `APP_BRANDING` - Configuration object with colors, names, taglines
- `AppId` type - Union type of all app IDs

**Usage**:

```svelte
<script>
	import { AppLogo } from '@manacore/shared-branding';
</script>

<AppLogo app="memoro" size={32} />
<AppLogo app="manacore" size={55} color="#fff" />
```

### `@manacore/shared-utils/format`

Duration and formatting utilities.

**Exports**:

- `formatDuration(seconds)` - Returns `MM:SS` or `HH:MM:SS`
- `formatDurationFromMs(ms)` - Converts milliseconds first
- `formatDurationWithUnits(seconds, locale)` - Returns `2h 30m` style
- `formatDurationHumanReadable(seconds, locale)` - Returns `2 Stunden 30 Minuten`
- `formatFileSize(bytes)` - Returns `1.5 MB`
- `formatNumber(num, locale)` - Locale-aware number formatting
- `formatCurrency(amount, currency, locale)` - Currency formatting
- `formatPercent(value, decimals, locale)` - Percentage formatting

---

## Notes

- Created: 2025-11-24
- Last Updated: 2025-11-24
- Author: Claude Code
