Types
MFETailwindStyles
Estensione tema Tailwind e classi CSS custom esposte dal MFE. Colori, spacing, fontFamily, fontSize, screens.
Contratto
interface MFETailwindStyles {
/** Classi CSS custom già compilate (string CSS) */
customClasses?: string
/** Configurazione estensione Tailwind theme */
themeExtension?: {
/** Colori custom (es: { primary: { 500: '#1e40af' } }) */
colors?: Record<string, Record<string, string>>
/** Spacing custom */
spacing?: Record<string, string>
/** Font family custom */
fontFamily?: Record<string, string[]>
/** Font size custom */
fontSize?: Record<string, string>
/** Screen breakpoints custom */
screens?: Record<string, string>
}
}
Quando usarlo
Quando un MFE ha bisogno di estendere il tema Tailwind globale della shell o iniettare classi CSS custom. Tipico per:
- palette di brand specifica di un modulo
- spacing/font-size custom per dashboard di settore
- breakpoint aggiuntivi per widget responsive
Campi
customClasses
Stringa CSS compilata (già processata da Tailwind o scritta a mano). Viene iniettata via injectCustomStyles con sanitizzazione preventiva.
const styles: MFETailwindStyles = {
customClasses: `
.crm-card { @apply rounded-lg shadow-md p-4 bg-white dark:bg-slate-800; }
.crm-badge--hot { @apply bg-red-100 text-red-800; }
`,
}
Il CSS viene validato contro pattern pericolosi (
url(), @import, expression(), behavior:, javascript:, -moz-binding). Vedi sanitizeCss.themeExtension.colors
Struttura: Record<colorName, Record<shade, hex>>.
{
themeExtension: {
colors: {
brand: {
50: '#eff6ff',
100: '#dbeafe',
500: '#3b82f6',
900: '#1e3a8a',
},
accent: {
500: '#f59e0b',
},
},
},
}
Risultato in Tailwind: bg-brand-500, text-brand-900, border-accent-500, ecc.
themeExtension.spacing
{
themeExtension: {
spacing: {
'18': '4.5rem',
'sidebar': '280px',
'header': '64px',
},
},
}
Risultato: w-18, h-sidebar, mt-header.
themeExtension.fontFamily
{
themeExtension: {
fontFamily: {
display: ['Inter', 'sans-serif'],
mono: ['Fira Code', 'monospace'],
},
},
}
Risultato: font-display, font-mono.
themeExtension.fontSize
{
themeExtension: {
fontSize: {
'metric-xl': '3.5rem',
'compact': '0.6875rem',
},
},
}
themeExtension.screens
Breakpoint custom per sm:/md:/lg:/...:
{
themeExtension: {
screens: {
'3xl': '1920px',
'tall': { raw: '(min-height: 800px)' },
},
},
}
Merge nella shell
La shell aggrega le estensioni di tutti i MFE con mergeTailwindConfig:
import { mergeTailwindConfig } from '@pzeta/mfe-contracts/helpers'
let tailwindConfig = baseTailwindConfig
for (const manifest of manifests) {
if (manifest.tailwindStyles?.themeExtension) {
tailwindConfig = mergeTailwindConfig(
tailwindConfig,
manifest.tailwindStyles.themeExtension,
)
}
}
Il merge è deep (fino a 4 livelli) per oggetti plain; array e primitivi sovrascrivono.
Estensione dell'interfaccia
Per aggiungere chiavi non tipizzate (es. borderRadius, boxShadow):
import type { MFETailwindStyles } from '@pzeta/mfe-contracts'
interface MyStyles extends MFETailwindStyles {
themeExtension?: MFETailwindStyles['themeExtension'] & {
borderRadius?: Record<string, string>
boxShadow?: Record<string, string>
}
}
Tipi correlati
MFEManifest— contienetailwindStyles?: MFETailwindStylesmergeTailwindConfig— aggrega estensioniinjectCustomStyles— iniettacustomClassessanitizeCss— validazione CSS preventiva