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
@@ -0,0 +1,42 @@
|
||||
import {
|
||||
DEFAULT_BUSINESS_PRIMARY_COLOR_ID,
|
||||
getBusinessPrimaryColorTokens,
|
||||
type BusinessPrimaryColorId,
|
||||
} from './businessPrimaryColors'
|
||||
|
||||
const CSS_VAR_DEFAULTS: Record<string, string> = {
|
||||
'--primary': '#3b82f6',
|
||||
'--primary-glow': '#3b82f6',
|
||||
'--primary-light': '#dbeafe',
|
||||
'--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) {
|
||||
const root = document.documentElement
|
||||
const tokens = getBusinessPrimaryColorTokens(colorId ?? DEFAULT_BUSINESS_PRIMARY_COLOR_ID)
|
||||
|
||||
root.style.setProperty('--primary', tokens.primary)
|
||||
root.style.setProperty('--primary-glow', tokens.primaryGlow)
|
||||
root.style.setProperty('--primary-light', tokens.primaryLight)
|
||||
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() {
|
||||
const root = document.documentElement
|
||||
|
||||
for (const [name, value] of Object.entries(CSS_VAR_DEFAULTS)) {
|
||||
root.style.setProperty(name, value)
|
||||
}
|
||||
}
|
||||
@@ -19,8 +19,28 @@ export type BusinessPrimaryColorTokens = {
|
||||
primaryLight: string
|
||||
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
|
||||
@@ -32,6 +52,8 @@ export const BUSINESS_PRIMARY_COLOR_PALETTE: Record<
|
||||
primaryLight: '#fee2e2',
|
||||
primaryGlow: '#ef4444',
|
||||
primaryRgb: '239 68 68',
|
||||
primaryDarkRgb: '220 38 38',
|
||||
...PURPLE_ACCENT,
|
||||
},
|
||||
yellow: {
|
||||
label: 'Yellow',
|
||||
@@ -40,6 +62,8 @@ export const BUSINESS_PRIMARY_COLOR_PALETTE: Record<
|
||||
primaryLight: '#fef9c3',
|
||||
primaryGlow: '#eab308',
|
||||
primaryRgb: '234 179 8',
|
||||
primaryDarkRgb: '202 138 4',
|
||||
...PURPLE_ACCENT,
|
||||
},
|
||||
black: {
|
||||
label: 'Black',
|
||||
@@ -48,6 +72,8 @@ export const BUSINESS_PRIMARY_COLOR_PALETTE: Record<
|
||||
primaryLight: '#e2e8f0',
|
||||
primaryGlow: '#334155',
|
||||
primaryRgb: '30 41 59',
|
||||
primaryDarkRgb: '15 23 42',
|
||||
...CYAN_ACCENT,
|
||||
},
|
||||
cyan: {
|
||||
label: 'Cyan',
|
||||
@@ -56,6 +82,8 @@ export const BUSINESS_PRIMARY_COLOR_PALETTE: Record<
|
||||
primaryLight: '#cffafe',
|
||||
primaryGlow: '#06b6d4',
|
||||
primaryRgb: '6 182 212',
|
||||
primaryDarkRgb: '8 145 178',
|
||||
...PURPLE_ACCENT,
|
||||
},
|
||||
purple: {
|
||||
label: 'Purple',
|
||||
@@ -64,6 +92,8 @@ export const BUSINESS_PRIMARY_COLOR_PALETTE: Record<
|
||||
primaryLight: '#f3e8ff',
|
||||
primaryGlow: '#a855f7',
|
||||
primaryRgb: '168 85 247',
|
||||
primaryDarkRgb: '147 51 234',
|
||||
...CYAN_ACCENT,
|
||||
},
|
||||
'light-blue': {
|
||||
label: 'Light Blue',
|
||||
@@ -72,6 +102,8 @@ export const BUSINESS_PRIMARY_COLOR_PALETTE: Record<
|
||||
primaryLight: '#e0f2fe',
|
||||
primaryGlow: '#38bdf8',
|
||||
primaryRgb: '56 189 248',
|
||||
primaryDarkRgb: '14 165 233',
|
||||
...CYAN_ACCENT,
|
||||
},
|
||||
'dark-blue': {
|
||||
label: 'Dark Blue',
|
||||
@@ -80,6 +112,8 @@ export const BUSINESS_PRIMARY_COLOR_PALETTE: Record<
|
||||
primaryLight: '#dbeafe',
|
||||
primaryGlow: '#3b82f6',
|
||||
primaryRgb: '59 130 246',
|
||||
primaryDarkRgb: '37 99 235',
|
||||
...CYAN_ACCENT,
|
||||
},
|
||||
}
|
||||
|
||||
@@ -93,3 +127,11 @@ export function normalizeBusinessPrimaryColorId(value: unknown): BusinessPrimary
|
||||
|
||||
return DEFAULT_BUSINESS_PRIMARY_COLOR_ID
|
||||
}
|
||||
|
||||
export function getBusinessPrimaryColorTokens(
|
||||
colorId: BusinessPrimaryColorId | undefined | null,
|
||||
): BusinessPrimaryColorTokens {
|
||||
return BUSINESS_PRIMARY_COLOR_PALETTE[
|
||||
normalizeBusinessPrimaryColorId(colorId ?? DEFAULT_BUSINESS_PRIMARY_COLOR_ID)
|
||||
]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user