mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-14 21:41:09 +02:00
Mirror sibling to firsts: das *letzte* Mal, das du etwas getan hast — markiert oder rückwirkend erkannt. Plan: docs/plans/lasts-module.md. M1 Skelett — Dexie v51 lasts-Tabelle, Encryption-Registry, Per-Space- Welcome-Seed, Empty-State ListView. Kategorien aus firsts/types.ts nach \$lib/data/milestones/categories.ts extrahiert (Re-Exports halten firsts-API stabil). M2 CRUD + DetailView — StatusTabs (Vermutet/Bestätigt/Aufgehoben), Quick-Add mit Mode-Toggle, always-editable DetailView mit Lifecycle- Buttons (Bestätigen, Aufheben mit Inline-Note), 44 i18n-Keys × 5 Locales. M3 Inbox + Inferenz — Dexie v52 lastsCooldown (12-Monate-Cooldown, deterministische ID), Source-Registry-Pattern in inference/, places- Source mit Heuristik visitCount>=5 Span>=180d Silence>=365d. InboxView mit Akzeptieren/Verwerfen + manueller Scan. contacts/habits → M3.b sobald jeweilige Frequenz-Felder existieren. M4 AI-Tools — 5 Tools im AI_TOOL_CATALOG (create_last, confirm_last, reclaim_last, list_lasts, suggest_lasts), Webapp-Executor mit Vault- Locked-Handling. Server-Drift-Test 4/4, Schema-Test 6/6. M5 Reminders + Settings — Pivot zu In-App-DueBanner statt OS-Push (kein PWA-Push-System im Repo). Pure date-math (12 Vitest cases), Settings- Store mit 4 Toggles, DueBanner mit max-N rendering, Test-Banner-Knopf. M6 Visibility + Unlisted-Sharing — VisibilityPicker + SharedLinkControls in DetailView, buildLastBlob mit reflective-core whitelist (reclaimed Lasts gehärtet ausgeblockt), SharedLastView public-render, Share- Dispatcher kennt 'lasts'. M7 Meilensteine-Aggregator — Cross-modul firsts vereinigt mit lasts Timeline + Year-Recap. Pure aggregator (mergeMilestones, buildMilestonesRecap), 12 Vitest cases. /milestones und /milestones/recap/[year] Routes, Cross-Link in lasts/ListView. Validation: 0 errors / 0 warnings (svelte-check 7645 files), 24/24 tests, i18n-parity 39x5 aligned (+2 namespaces), i18n-keys baseline- equal, crypto 211 tables. LOCAL TIER PATCH: lasts ist 'guest' für Testing — vor Release auf 'beta' setzen (packages/shared-branding/src/mana-apps.ts). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| src | ||
| package.json | ||
| README.md | ||
| tsconfig.json | ||
@mana/shared-branding
Shared branding components and configuration for the Mana ecosystem.
Features
- AppLogo: SVG logo component for any Mana app
- AppLogoWithName: Logo with app name combination
- ManaIcon: Universal Mana drop icon for credits display
- Branding Config: Centralized colors, names, and taglines
Installation
pnpm add @mana/shared-branding
Usage
AppLogo
Display an app's logo:
<script lang="ts">
import { AppLogo } from '@mana/shared-branding';
</script>
<AppLogo app="memoro" size={32} />
<AppLogo app="mana" size={32} />
<AppLogo app="cards" size={32} />
<AppLogo app="maerchenzauber" size={32} />
AppLogoWithName
Display logo with app name (perfect for headers):
<script lang="ts">
import { AppLogoWithName } from '@mana/shared-branding';
</script>
<AppLogoWithName app="memoro" size={28} />
<AppLogoWithName app="mana" showName={false} />
ManaIcon
Universal Mana drop icon:
<script lang="ts">
import { ManaIcon } from '@mana/shared-branding';
</script>
<ManaIcon size={24} color="#4287f5" />
Branding Configuration
Access branding config programmatically:
import { getAppBranding, APP_BRANDING } from '@mana/shared-branding';
const memoro = getAppBranding('memoro');
console.log(memoro.name); // "Memoro"
console.log(memoro.tagline); // "AI Voice Memos"
console.log(memoro.primaryColor); // "#f8d62b"
App Branding
| App | Name | Primary Color | Tagline |
|---|---|---|---|
memoro |
Memoro | #f8d62b (Gold) | AI Voice Memos |
mana |
Mana | #6366f1 (Indigo) | Central Hub |
cards |
Cards | #8b5cf6 (Purple) | AI Flashcards |
maerchenzauber |
Märchenzauber | #ec4899 (Pink) | AI Story Creator |
Props
AppLogo
| Prop | Type | Default | Description |
|---|---|---|---|
app |
AppId |
required | App identifier |
size |
number |
32 |
Size in pixels |
color |
string |
App primary color | Override color |
class |
string |
'' |
Additional CSS classes |
AppLogoWithName
| Prop | Type | Default | Description |
|---|---|---|---|
app |
AppId |
required | App identifier |
size |
number |
28 |
Logo size in pixels |
color |
string |
App primary color | Override color |
showName |
boolean |
true |
Show app name |
nameFontSize |
string |
'1.25rem' |
Name font size |
gap |
string |
'0.5rem' |
Gap between logo and name |
class |
string |
'' |
Additional CSS classes |
ManaIcon
| Prop | Type | Default | Description |
|---|---|---|---|
size |
number |
24 |
Size in pixels |
color |
string |
'#4287f5' |
Icon color |
class |
string |
'' |
Additional CSS classes |
Types
type AppId = 'memoro' | 'mana' | 'cards' | 'maerchenzauber';
interface AppBranding {
id: AppId;
name: string;
tagline: string;
primaryColor: string;
secondaryColor?: string;
logoPath: string;
logoViewBox?: string;
logoStroke?: boolean;
logoStrokeWidth?: number;
}