Applied formatting to 1487+ files using pnpm format:write - TypeScript/JavaScript files - Svelte components - Astro pages - JSON configs - Markdown docs 13 files still need manual review (Astro JSX comments)
9.3 KiB
Shared Packages Roadmap
This document outlines the plan to unify common code across all web apps in the monorepo.
Current Shared Packages
@manacore/shared-icons- Unified Phosphor Icons for all web apps@manacore/shared-ui- Unified UI Components (Text, Button, Badge, Toggle, Input, Modal, Card, Navigation, Forms)@manacore/shared-auth- Unified Auth Logic (Supabase client, token management)@manacore/shared-auth-ui- Unified Auth UI (LoginPage, RegisterPage, OAuth buttons)@manacore/shared-tailwind- Unified Tailwind Config (HSL colors, preset, themes.css)@manacore/shared-theme- Unified Theme Store (Svelte 5, 4 variants, light/dark/system)@manacore/shared-theme-ui- Theme UI Components (ThemeToggle, ThemeSelector)@manacore/shared-utils- Unified Utilities (formatting, validation, async, date, keyboard)@manacore/shared-types- Unified TypeScript Types@manacore/shared-supabase- Unified Supabase Client Factory@manacore/shared-i18n- Unified i18n (languages, locale detection, translations)@manacore/shared-config- Unified Config (env validation)@manacore/shared-branding- NEW Unified App Branding (logos, colors, app config)@manacore/shared-subscription-types- Subscription Type Definitions@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→ usesAppLogomanadeck/apps/web/src/lib/components/ManaDeckLogo.svelte→ usesAppLogomanacore/apps/web/src/lib/components/ManaCoreLogo.svelte→ usesAppLogomaerchenzauber/apps/web/src/lib/components/StorytellerLogo.svelte→ usesAppLogo
Formatter Functions - Migrated to @manacore/shared-utils:
memoro/apps/web/src/lib/components/memo/AdditionalRecordings.svelte→ usesformatDurationFromMs,formatFileSizememoro/apps/web/src/lib/components/RecordingButton.svelte→ usesformatDurationmemoro/apps/web/src/lib/components/statistics/OverviewCard.svelte→ usesformatDurationWithUnitsmemoro/apps/web/src/lib/components/statistics/InsightsCard.svelte→ usesformatDurationWithUnitsmemoro/apps/web/src/lib/components/statistics/ProductivityCard.svelte→ usesformatDurationWithUnits
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 variantsInput.svelte- Text input with label, error statesText.svelte- Typography component with variantsModal.svelte- Overlay modal with header, body, footer slotsSpinner.svelte- Loading indicatorToast.svelte- Notification toastsBadge.svelte- Status badgesCard.svelte- Content containerDropdown.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, validationauthService.ts- Login, logout, register, password resetsupabaseClient.ts- Authenticated Supabase client factoryauthStore.ts- Svelte store for auth stateauthGuard.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, toISOStringformat.ts- formatDuration, formatFileSize, formatNumber, formatCurrency, formatPercentvalidation.ts- isValidEmail, isValidUrl, isValidPhone, validatePassword, isValidUuidstring.ts- truncate, capitalize, generateId, slugifyasync.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 typeApiResponse<T>- Standard API response wrapperPaginatedResponse<T>- Pagination typesTheme- Theme configuration typesLocale- 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 initializationdetectLocale.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
-
Phase 1 (Completed)
@manacore/shared-icons@manacore/shared-ui
-
Phase 2 (Completed)
@manacore/shared-auth@manacore/shared-auth-ui@manacore/shared-tailwind
-
Phase 3 (Completed)
@manacore/shared-utils@manacore/shared-types@manacore/shared-supabase
-
Phase 4 (Completed)
@manacore/shared-i18n@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
{
"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
- Keep it minimal - Only share truly common code
- Document props - Use TypeScript interfaces with JSDoc
- Version carefully - Coordinate updates across apps
- Test thoroughly - Changes affect all apps
- 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 logoAppLogoWithName- Logo with app name and taglineManaIcon- Generic Mana icon componentAPP_BRANDING- Configuration object with colors, names, taglinesAppIdtype - Union type of all app IDs
Usage:
<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)- ReturnsMM:SSorHH:MM:SSformatDurationFromMs(ms)- Converts milliseconds firstformatDurationWithUnits(seconds, locale)- Returns2h 30mstyleformatDurationHumanReadable(seconds, locale)- Returns2 Stunden 30 MinutenformatFileSize(bytes)- Returns1.5 MBformatNumber(num, locale)- Locale-aware number formattingformatCurrency(amount, currency, locale)- Currency formattingformatPercent(value, decimals, locale)- Percentage formatting
Notes
- Created: 2025-11-24
- Last Updated: 2025-11-24
- Author: Claude Code