mirror of
https://git.meshkee.com/Meshkee/dashboards.git
synced 2026-08-11 22:30:58 +04:30
Add FA/EN locale, home activity charts, and theme-aware polish.
Ship shared LocaleProvider, business/customer i18n, branding defaultLocale, curated home tiles with dual 30-day charts, and chart/page aura tokens; refresh PROJECT_CONTEXT. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
co-authored by
Cursor
parent
f5b2193ba1
commit
66004a0fba
@@ -11,6 +11,10 @@ const CSS_VAR_DEFAULTS: Record<string, string> = {
|
||||
'--primary-dark': '#2563eb',
|
||||
'--primary-rgb': '59 130 246',
|
||||
'--primary-dark-rgb': '37 99 235',
|
||||
'--chart-accent': '#06b6d4',
|
||||
'--chart-accent-dark': '#0891b2',
|
||||
'--chart-accent-rgb': '6 182 212',
|
||||
'--chart-accent-dark-rgb': '8 145 178',
|
||||
}
|
||||
|
||||
export function applyBusinessPrimaryColor(colorId?: BusinessPrimaryColorId | null) {
|
||||
@@ -23,6 +27,10 @@ export function applyBusinessPrimaryColor(colorId?: BusinessPrimaryColorId | nul
|
||||
root.style.setProperty('--primary-dark', tokens.primaryDark)
|
||||
root.style.setProperty('--primary-rgb', tokens.primaryRgb)
|
||||
root.style.setProperty('--primary-dark-rgb', tokens.primaryDarkRgb)
|
||||
root.style.setProperty('--chart-accent', tokens.chartAccent)
|
||||
root.style.setProperty('--chart-accent-dark', tokens.chartAccentDark)
|
||||
root.style.setProperty('--chart-accent-rgb', tokens.chartAccentRgb)
|
||||
root.style.setProperty('--chart-accent-dark-rgb', tokens.chartAccentDarkRgb)
|
||||
}
|
||||
|
||||
export function resetBusinessPrimaryColor() {
|
||||
|
||||
@@ -20,8 +20,27 @@ export type BusinessPrimaryColorTokens = {
|
||||
primaryGlow: string
|
||||
primaryRgb: string
|
||||
primaryDarkRgb: string
|
||||
/** Second chart series color (red→purple, blue→cyan, …). */
|
||||
chartAccent: string
|
||||
chartAccentDark: string
|
||||
chartAccentRgb: string
|
||||
chartAccentDarkRgb: string
|
||||
}
|
||||
|
||||
const PURPLE_ACCENT = {
|
||||
chartAccent: '#a855f7',
|
||||
chartAccentDark: '#9333ea',
|
||||
chartAccentRgb: '168 85 247',
|
||||
chartAccentDarkRgb: '147 51 234',
|
||||
} as const
|
||||
|
||||
const CYAN_ACCENT = {
|
||||
chartAccent: '#06b6d4',
|
||||
chartAccentDark: '#0891b2',
|
||||
chartAccentRgb: '6 182 212',
|
||||
chartAccentDarkRgb: '8 145 178',
|
||||
} as const
|
||||
|
||||
export const BUSINESS_PRIMARY_COLOR_PALETTE: Record<
|
||||
BusinessPrimaryColorId,
|
||||
BusinessPrimaryColorTokens
|
||||
@@ -34,6 +53,7 @@ export const BUSINESS_PRIMARY_COLOR_PALETTE: Record<
|
||||
primaryGlow: '#ef4444',
|
||||
primaryRgb: '239 68 68',
|
||||
primaryDarkRgb: '220 38 38',
|
||||
...PURPLE_ACCENT,
|
||||
},
|
||||
yellow: {
|
||||
label: 'Yellow',
|
||||
@@ -43,6 +63,7 @@ export const BUSINESS_PRIMARY_COLOR_PALETTE: Record<
|
||||
primaryGlow: '#eab308',
|
||||
primaryRgb: '234 179 8',
|
||||
primaryDarkRgb: '202 138 4',
|
||||
...PURPLE_ACCENT,
|
||||
},
|
||||
black: {
|
||||
label: 'Black',
|
||||
@@ -52,6 +73,7 @@ export const BUSINESS_PRIMARY_COLOR_PALETTE: Record<
|
||||
primaryGlow: '#334155',
|
||||
primaryRgb: '30 41 59',
|
||||
primaryDarkRgb: '15 23 42',
|
||||
...CYAN_ACCENT,
|
||||
},
|
||||
cyan: {
|
||||
label: 'Cyan',
|
||||
@@ -61,6 +83,7 @@ export const BUSINESS_PRIMARY_COLOR_PALETTE: Record<
|
||||
primaryGlow: '#06b6d4',
|
||||
primaryRgb: '6 182 212',
|
||||
primaryDarkRgb: '8 145 178',
|
||||
...PURPLE_ACCENT,
|
||||
},
|
||||
purple: {
|
||||
label: 'Purple',
|
||||
@@ -70,6 +93,7 @@ export const BUSINESS_PRIMARY_COLOR_PALETTE: Record<
|
||||
primaryGlow: '#a855f7',
|
||||
primaryRgb: '168 85 247',
|
||||
primaryDarkRgb: '147 51 234',
|
||||
...CYAN_ACCENT,
|
||||
},
|
||||
'light-blue': {
|
||||
label: 'Light Blue',
|
||||
@@ -79,6 +103,7 @@ export const BUSINESS_PRIMARY_COLOR_PALETTE: Record<
|
||||
primaryGlow: '#38bdf8',
|
||||
primaryRgb: '56 189 248',
|
||||
primaryDarkRgb: '14 165 233',
|
||||
...CYAN_ACCENT,
|
||||
},
|
||||
'dark-blue': {
|
||||
label: 'Dark Blue',
|
||||
@@ -88,6 +113,7 @@ export const BUSINESS_PRIMARY_COLOR_PALETTE: Record<
|
||||
primaryGlow: '#3b82f6',
|
||||
primaryRgb: '59 130 246',
|
||||
primaryDarkRgb: '37 99 235',
|
||||
...CYAN_ACCENT,
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@@ -14,9 +14,13 @@ function toMonthKey(iso: string): string {
|
||||
return `${year}-${month}`
|
||||
}
|
||||
|
||||
function formatMonthLabel(monthKey: string): string {
|
||||
function formatMonthLabel(monthKey: string, locale: string): string {
|
||||
const [year, month] = monthKey.split('-').map(Number)
|
||||
return new Date(year, month - 1, 1).toLocaleString('en-US', { month: 'short' })
|
||||
return new Date(year, month - 1, 1).toLocaleString(locale === 'fa' ? 'fa-IR' : 'en-US', {
|
||||
month: 'short',
|
||||
calendar: 'gregory',
|
||||
numberingSystem: 'latn',
|
||||
})
|
||||
}
|
||||
|
||||
export function buildLast12MonthKeys(): string[] {
|
||||
@@ -33,7 +37,10 @@ export function buildLast12MonthKeys(): string[] {
|
||||
return keys
|
||||
}
|
||||
|
||||
export function aggregateProductActivity(products: ProductApi[]): ProductMonthActivity[] {
|
||||
export function aggregateProductActivity(
|
||||
products: ProductApi[],
|
||||
locale: string = 'en',
|
||||
): ProductMonthActivity[] {
|
||||
const monthKeys = buildLast12MonthKeys()
|
||||
const added = new Map(monthKeys.map((key) => [key, 0]))
|
||||
const updated = new Map(monthKeys.map((key) => [key, 0]))
|
||||
@@ -56,7 +63,7 @@ export function aggregateProductActivity(products: ProductApi[]): ProductMonthAc
|
||||
|
||||
return monthKeys.map((monthKey) => ({
|
||||
monthKey,
|
||||
label: formatMonthLabel(monthKey),
|
||||
label: formatMonthLabel(monthKey, locale),
|
||||
added: added.get(monthKey) ?? 0,
|
||||
updated: updated.get(monthKey) ?? 0,
|
||||
}))
|
||||
|
||||
Reference in New Issue
Block a user