(v: unknown, theme?: Theme)
| 23 | * Coerce unknown value to TextStyle if object-shaped. |
| 24 | */ |
| 25 | export function asTextStyle(v: unknown, theme?: Theme): TextStyle | undefined { |
| 26 | if (!isObject(v)) return undefined; |
| 27 | const style = v as TextStyle; |
| 28 | if (!theme) return style; |
| 29 | |
| 30 | const resolvedFg = resolveStyleColor(theme, style.fg) as TextStyle["fg"]; |
| 31 | const resolvedBg = resolveStyleColor(theme, style.bg) as TextStyle["bg"]; |
| 32 | const resolvedUnderlineColor = resolveStyleColor(theme, style.underlineColor) as |
| 33 | | TextStyle["underlineColor"] |
| 34 | | undefined; |
| 35 | |
| 36 | if ( |
| 37 | resolvedFg === style.fg && |
| 38 | resolvedBg === style.bg && |
| 39 | resolvedUnderlineColor === style.underlineColor |
| 40 | ) { |
| 41 | return style; |
| 42 | } |
| 43 | |
| 44 | return { |
| 45 | ...style, |
| 46 | ...(resolvedFg === undefined ? {} : { fg: resolvedFg }), |
| 47 | ...(resolvedBg === undefined ? {} : { bg: resolvedBg }), |
| 48 | ...(resolvedUnderlineColor === undefined ? {} : { underlineColor: resolvedUnderlineColor }), |
| 49 | }; |
| 50 | } |
| 51 | |
| 52 | /** Visual state for button/input styling. */ |
| 53 | export type ButtonVisualState = Readonly<{ focused: boolean; disabled: boolean }>; |
no test coverage detected