mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-14 20:21:09 +02:00
refactor: rename zitare -> quotes (Zitate)
Zitare was opaque Latin/Italian-flavored branding. Renamed to clear English "quotes" (DE: Zitate) matching short-concrete-noun cluster. - Module, routes, API, i18n, standalone landing app, plans dirs - Dexie tables: quotesFavorites, quotesLists, quotesListTags, customQuotes (dropped redundant "quotes" prefix on the last) - Logo QuotesLogo, theme quotes.css, search provider, dashboard widget QuoteWidget - German user-facing label "Zitate" (English brand stays Quotes) Pre-launch, no data migration needed. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
7a1f11c971
commit
851a281e5a
196 changed files with 891 additions and 776 deletions
|
|
@ -41,7 +41,7 @@ export enum CreditOperationType {
|
|||
AI_DECK_GENERATION = 'ai_deck_generation',
|
||||
AI_CARD_GENERATION = 'ai_card_generation',
|
||||
|
||||
// Zitare - AI explanations
|
||||
// Quotes - AI explanations
|
||||
AI_QUOTE_EXPLANATION = 'ai_quote_explanation',
|
||||
|
||||
// Plants - Plant analysis
|
||||
|
|
@ -240,7 +240,7 @@ export const OPERATION_METADATA: Record<CreditOperationType, OperationMetadata>
|
|||
name: 'Explain Quote',
|
||||
description: 'Get an AI explanation of a quote',
|
||||
category: CreditCategory.AI,
|
||||
app: 'zitare',
|
||||
app: 'quotes',
|
||||
},
|
||||
|
||||
// Plants
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@
|
|||
todo: ['Organisiere deinen Alltag', 'Quelloffen & unabhängig', 'Privat by Design'],
|
||||
calendar: ['Dein Kalender, deine Regeln', 'Quelloffen & unabhängig', 'Privat by Design'],
|
||||
clock: ['Zeit im Griff, überall', 'Quelloffen & unabhängig', 'Privat by Design'],
|
||||
zitare: ['Tägliche Inspiration für dich', 'Quelloffen & unabhängig', 'Privat by Design'],
|
||||
quotes: ['Tägliche Inspiration für dich', 'Quelloffen & unabhängig', 'Privat by Design'],
|
||||
picture: ['Kreativität trifft KI', 'Quelloffen & unabhängig', 'Privat by Design'],
|
||||
cards: ['Lernen leicht gemacht', 'Quelloffen & unabhängig', 'Privat by Design'],
|
||||
moodlit: ['Dein Raum, deine Stimmung', 'Quelloffen & unabhängig', 'Privat by Design'],
|
||||
|
|
@ -79,7 +79,7 @@
|
|||
todo: ['Organize your day', 'Open-source & independent', 'Private by design'],
|
||||
calendar: ['Your calendar, your rules', 'Open-source & independent', 'Private by design'],
|
||||
clock: ['Time at your fingertips', 'Open-source & independent', 'Private by design'],
|
||||
zitare: ['Daily inspiration for you', 'Open-source & independent', 'Private by design'],
|
||||
quotes: ['Daily inspiration for you', 'Open-source & independent', 'Private by design'],
|
||||
picture: ['Where creativity meets AI', 'Open-source & independent', 'Private by design'],
|
||||
cards: ['Learning made easy', 'Open-source & independent', 'Private by design'],
|
||||
moodlit: ['Your space, your mood', 'Open-source & independent', 'Private by design'],
|
||||
|
|
|
|||
|
|
@ -27,8 +27,8 @@ const cardsSvg = `<svg width="1024" height="1024" viewBox="0 0 1024 1024" fill="
|
|||
// Picture icon (image/gallery with gradient)
|
||||
const pictureSvg = `<svg width="1024" height="1024" viewBox="0 0 1024 1024" fill="none" xmlns="http://www.w3.org/2000/svg"><rect x="130" y="130" width="764" height="764" rx="382" fill="url(#pictureGrad)"/><rect x="260" y="300" width="504" height="424" rx="24" fill="white"/><circle cx="380" cy="420" r="50" fill="#22c55e" fill-opacity="0.6"/><path d="M260 600L420 480L520 580L620 460L764 600V700C764 713.255 753.255 724 740 724H284C270.745 724 260 713.255 260 700V600Z" fill="#22c55e" fill-opacity="0.4"/><defs><linearGradient id="pictureGrad" x1="130" y1="130" x2="894" y2="894" gradientUnits="userSpaceOnUse"><stop stop-color="#22c55e"/><stop offset="1" stop-color="#16a34a"/></linearGradient></defs></svg>`;
|
||||
|
||||
// Zitare icon (quote/inspiration with gradient)
|
||||
const zitareSvg = `<svg width="1024" height="1024" viewBox="0 0 1024 1024" fill="none" xmlns="http://www.w3.org/2000/svg"><rect x="130" y="130" width="764" height="764" rx="382" fill="url(#quoteGrad)"/><path d="M340 360C340 338.909 356.909 322 378 322H486C507.091 322 524 338.909 524 360V468C524 489.091 507.091 506 486 506H420L360 580V506H378C356.909 506 340 489.091 340 468V360Z" fill="white"/><path d="M500 440C500 418.909 516.909 402 538 402H646C667.091 402 684 418.909 684 440V548C684 569.091 667.091 586 646 586H580L520 660V586H538C516.909 586 500 569.091 500 548V440Z" fill="white" fill-opacity="0.7"/><rect x="300" y="680" width="424" height="16" rx="4" fill="white" fill-opacity="0.6"/><rect x="340" y="712" width="344" height="12" rx="3" fill="white" fill-opacity="0.4"/><defs><linearGradient id="quoteGrad" x1="130" y1="130" x2="894" y2="894" gradientUnits="userSpaceOnUse"><stop stop-color="#f59e0b"/><stop offset="1" stop-color="#d97706"/></linearGradient></defs></svg>`;
|
||||
// Quotes icon (quote/inspiration with gradient)
|
||||
const quotesSvg = `<svg width="1024" height="1024" viewBox="0 0 1024 1024" fill="none" xmlns="http://www.w3.org/2000/svg"><rect x="130" y="130" width="764" height="764" rx="382" fill="url(#quoteGrad)"/><path d="M340 360C340 338.909 356.909 322 378 322H486C507.091 322 524 338.909 524 360V468C524 489.091 507.091 506 486 506H420L360 580V506H378C356.909 506 340 489.091 340 468V360Z" fill="white"/><path d="M500 440C500 418.909 516.909 402 538 402H646C667.091 402 684 418.909 684 440V548C684 569.091 667.091 586 646 586H580L520 660V586H538C516.909 586 500 569.091 500 548V440Z" fill="white" fill-opacity="0.7"/><rect x="300" y="680" width="424" height="16" rx="4" fill="white" fill-opacity="0.6"/><rect x="340" y="712" width="344" height="12" rx="3" fill="white" fill-opacity="0.4"/><defs><linearGradient id="quoteGrad" x1="130" y1="130" x2="894" y2="894" gradientUnits="userSpaceOnUse"><stop stop-color="#f59e0b"/><stop offset="1" stop-color="#d97706"/></linearGradient></defs></svg>`;
|
||||
|
||||
// WiseKeep icon (wisdom/lightbulb with gradient)
|
||||
const wisekeepSvg = `<svg width="1024" height="1024" viewBox="0 0 1024 1024" fill="none" xmlns="http://www.w3.org/2000/svg"><rect x="130" y="130" width="764" height="764" rx="382" fill="url(#wiseGrad)"/><path d="M512 240C408.954 240 324 324.954 324 428C324 495.636 360.727 554.545 416 588.364V652C416 674.091 434.909 692 457 692H567C589.091 692 608 674.091 608 652V588.364C663.273 554.545 700 495.636 700 428C700 324.954 615.046 240 512 240Z" fill="white"/><rect x="432" y="720" width="160" height="24" rx="12" fill="white"/><rect x="456" y="760" width="112" height="20" rx="10" fill="white"/><path d="M512 340V500M432 420H592" stroke="#6366f1" stroke-width="24" stroke-linecap="round"/><defs><linearGradient id="wiseGrad" x1="130" y1="130" x2="894" y2="894" gradientUnits="userSpaceOnUse"><stop stop-color="#6366f1"/><stop offset="1" stop-color="#4f46e5"/></linearGradient></defs></svg>`;
|
||||
|
|
@ -86,7 +86,7 @@ export const APP_ICONS = {
|
|||
presi: svgToDataUrl(presiSvg),
|
||||
cards: svgToDataUrl(cardsSvg),
|
||||
picture: svgToDataUrl(pictureSvg),
|
||||
zitare: svgToDataUrl(zitareSvg),
|
||||
quotes: svgToDataUrl(quotesSvg),
|
||||
wisekeep: svgToDataUrl(wisekeepSvg),
|
||||
moodlit: svgToDataUrl(moodlitSvg),
|
||||
food: svgToDataUrl(foodSvg),
|
||||
|
|
|
|||
|
|
@ -92,9 +92,9 @@ export const APP_BRANDING: Record<AppId, AppBranding> = {
|
|||
logoStroke: true,
|
||||
logoStrokeWidth: 1.5,
|
||||
},
|
||||
zitare: {
|
||||
id: 'zitare',
|
||||
name: 'Zitare',
|
||||
quotes: {
|
||||
id: 'quotes',
|
||||
name: 'Quotes',
|
||||
tagline: 'Daily Inspiration',
|
||||
primaryColor: '#f59e0b',
|
||||
secondaryColor: '#fbbf24',
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ export {
|
|||
ChatLogo,
|
||||
PresiLogo,
|
||||
FoodLogo,
|
||||
ZitareLogo,
|
||||
QuotesLogo,
|
||||
ContactsLogo,
|
||||
CalendarLogo,
|
||||
StorageLogo,
|
||||
|
|
|
|||
|
|
@ -10,4 +10,4 @@
|
|||
let { size = 55, color, class: className = '' }: Props = $props();
|
||||
</script>
|
||||
|
||||
<AppLogo app="zitare" {size} {color} class={className} />
|
||||
<AppLogo app="quotes" {size} {color} class={className} />
|
||||
|
|
@ -9,7 +9,7 @@ export { default as UloadLogo } from './UloadLogo.svelte';
|
|||
export { default as ChatLogo } from './ChatLogo.svelte';
|
||||
export { default as PresiLogo } from './PresiLogo.svelte';
|
||||
export { default as FoodLogo } from './FoodLogo.svelte';
|
||||
export { default as ZitareLogo } from './ZitareLogo.svelte';
|
||||
export { default as QuotesLogo } from './QuotesLogo.svelte';
|
||||
export { default as ContactsLogo } from './ContactsLogo.svelte';
|
||||
export { default as CalendarLogo } from './CalendarLogo.svelte';
|
||||
export { default as StorageLogo } from './StorageLogo.svelte';
|
||||
|
|
|
|||
|
|
@ -188,8 +188,8 @@ export const MANA_APPS: ManaApp[] = [
|
|||
requiredTier: 'guest',
|
||||
},
|
||||
{
|
||||
id: 'zitare',
|
||||
name: 'Zitare',
|
||||
id: 'quotes',
|
||||
name: 'Quotes',
|
||||
description: {
|
||||
de: 'Tägliche Inspiration',
|
||||
en: 'Daily Inspiration',
|
||||
|
|
@ -198,7 +198,7 @@ export const MANA_APPS: ManaApp[] = [
|
|||
de: 'Entdecke inspirierende Zitate und Weisheiten für jeden Tag.',
|
||||
en: 'Discover inspiring quotes and wisdom for every day.',
|
||||
},
|
||||
icon: APP_ICONS.zitare,
|
||||
icon: APP_ICONS.quotes,
|
||||
color: '#f59e0b',
|
||||
comingSoon: false,
|
||||
status: 'beta',
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ export type AppId =
|
|||
| 'chat'
|
||||
| 'presi'
|
||||
| 'food'
|
||||
| 'zitare'
|
||||
| 'quotes'
|
||||
| 'picture'
|
||||
| 'contacts'
|
||||
| 'calendar'
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@
|
|||
"./themes/cards": "./src/themes/cards.css",
|
||||
"./themes/picture": "./src/themes/picture.css",
|
||||
"./themes/chat": "./src/themes/chat.css",
|
||||
"./themes/zitare": "./src/themes/zitare.css",
|
||||
"./themes/quotes": "./src/themes/quotes.css",
|
||||
"./themes/org-classic": "./src/themes/org-classic.css",
|
||||
"./themes/org-warm": "./src/themes/org-warm.css"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* Zitare Theme - Green/Teal
|
||||
* Quotes Theme - Green/Teal
|
||||
* Daily inspiration quotes app
|
||||
*/
|
||||
:root {
|
||||
|
|
@ -54,7 +54,7 @@ const DEEP_LINK_PATTERNS: Record<string, Record<string, string>> = {
|
|||
alarms: '/',
|
||||
timers: '/',
|
||||
},
|
||||
zitare: {
|
||||
quotes: {
|
||||
favorites: '/',
|
||||
},
|
||||
};
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@
|
|||
* 3. NEVER write raw `var(--color-X)` without wrapping with `hsl()`.
|
||||
* The variable holds raw channels, not a valid CSS color. A bare
|
||||
* `color: var(--color-foreground)` is NOT an error — the browser
|
||||
* silently falls back to `inherit`, which is how the early P5 zitare
|
||||
* silently falls back to `inherit`, which is how the early P5 quotes
|
||||
* regression produced white-on-white text in light mode. Always wrap.
|
||||
*
|
||||
* ❌ color: var(--color-foreground);
|
||||
|
|
|
|||
|
|
@ -129,8 +129,8 @@ export const APP_ROUTES: Record<string, AppRouteConfig> = {
|
|||
],
|
||||
},
|
||||
|
||||
zitare: {
|
||||
appId: 'zitare',
|
||||
quotes: {
|
||||
appId: 'quotes',
|
||||
defaultRoute: '/',
|
||||
availableRoutes: [
|
||||
{ path: '/', label: 'Zitate', icon: 'quote', alwaysVisible: true },
|
||||
|
|
|
|||
|
|
@ -161,7 +161,7 @@ const track = {
|
|||
photos: createModuleTracker('photos'),
|
||||
storage: createModuleTracker('storage'),
|
||||
music: createModuleTracker('music'),
|
||||
zitare: createModuleTracker('zitare'),
|
||||
quotes: createModuleTracker('quotes'),
|
||||
presi: createModuleTracker('presi'),
|
||||
subscription: createModuleTracker('subscription'),
|
||||
memoro: createModuleTracker('memoro'),
|
||||
|
|
@ -460,19 +460,19 @@ export const MusicEvents = {
|
|||
};
|
||||
|
||||
/**
|
||||
* Zitare App Events
|
||||
* Quotes App Events
|
||||
*/
|
||||
export const ZitareEvents = {
|
||||
randomQuoteLoaded: () => track.zitare('random_quote_loaded'),
|
||||
quoteShared: (category: string) => track.zitare('quote_shared', { category }),
|
||||
quoteFavorited: (category: string) => track.zitare('quote_favorited', { category }),
|
||||
quoteUnfavorited: () => track.zitare('quote_unfavorited'),
|
||||
categoryViewed: (category: string) => track.zitare('category_viewed', { category }),
|
||||
export const QuotesEvents = {
|
||||
randomQuoteLoaded: () => track.quotes('random_quote_loaded'),
|
||||
quoteShared: (category: string) => track.quotes('quote_shared', { category }),
|
||||
quoteFavorited: (category: string) => track.quotes('quote_favorited', { category }),
|
||||
quoteUnfavorited: () => track.quotes('quote_unfavorited'),
|
||||
categoryViewed: (category: string) => track.quotes('category_viewed', { category }),
|
||||
searchPerformed: (resultsCount: number) =>
|
||||
track.zitare('search_performed', { results: resultsCount }),
|
||||
listCreated: () => track.zitare('list_created'),
|
||||
listDeleted: () => track.zitare('list_deleted'),
|
||||
quoteLanguageChanged: (language: string) => track.zitare('quote_language_changed', { language }),
|
||||
track.quotes('search_performed', { results: resultsCount }),
|
||||
listCreated: () => track.quotes('list_created'),
|
||||
listDeleted: () => track.quotes('list_deleted'),
|
||||
quoteLanguageChanged: (language: string) => track.quotes('quote_language_changed', { language }),
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -131,7 +131,7 @@ export function createContactSchema(): SchemaDefinition {
|
|||
}
|
||||
|
||||
/**
|
||||
* Create a schema for Quote items (Zitare app)
|
||||
* Create a schema for Quote items (Quotes app)
|
||||
*/
|
||||
export function createQuoteSchema(): SchemaDefinition {
|
||||
return {
|
||||
|
|
@ -179,7 +179,7 @@ export const MANA_APP_INDEX: Record<string, number> = {
|
|||
calendar: 1,
|
||||
contacts: 2,
|
||||
chat: 3,
|
||||
zitare: 4,
|
||||
quotes: 4,
|
||||
picture: 5,
|
||||
clock: 6,
|
||||
storage: 7,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue