Support objects for style
attribute (#3776)
* feat: support style objects * chore: update jsx types * feat: support className for better JSX compat Co-authored-by: Nate Moore <nate@astro.build>
This commit is contained in:
parent
ce2994c9c0
commit
2a5e92facd
2 changed files with 15 additions and 2 deletions
4
packages/astro/astro-jsx.d.ts
vendored
4
packages/astro/astro-jsx.d.ts
vendored
|
@ -507,7 +507,7 @@ declare namespace astroHTML.JSX {
|
|||
lang?: string | undefined | null;
|
||||
slot?: string | undefined | null;
|
||||
spellcheck?: 'true' | 'false' | boolean | undefined | null;
|
||||
style?: string | undefined | null;
|
||||
style?: string | Record<string, any> | undefined | null;
|
||||
tabindex?: number | string | undefined | null;
|
||||
title?: string | undefined | null;
|
||||
translate?: 'yes' | 'no' | undefined | null;
|
||||
|
@ -1017,7 +1017,7 @@ declare namespace astroHTML.JSX {
|
|||
method?: string | undefined | null;
|
||||
min?: number | string | undefined | null;
|
||||
name?: string | undefined | null;
|
||||
style?: string | undefined | null;
|
||||
style?: string | Record<string, any> | undefined | null;
|
||||
target?: string | undefined | null;
|
||||
type?: string | undefined | null;
|
||||
width?: number | string | undefined | null;
|
||||
|
|
|
@ -542,6 +542,9 @@ export function createAstro(
|
|||
const toAttributeString = (value: any, shouldEscape = true) =>
|
||||
shouldEscape ? String(value).replace(/&/g, '&').replace(/"/g, '"') : value;
|
||||
|
||||
const kebab = (k: string) => k.toLowerCase() === k ? k : k.replace(/[A-Z]/g, match => `-${match.toLowerCase()}`);
|
||||
const toStyleString = (obj: Record<string, any>) => Object.entries(obj).map(([k, v]) => `${kebab(k)}:${v}`).join(';')
|
||||
|
||||
const STATIC_DIRECTIVES = new Set(['set:html', 'set:text']);
|
||||
|
||||
// A helper used to turn expressions into attribute key/value
|
||||
|
@ -575,6 +578,16 @@ Make sure to use the static attribute syntax (\`${key}={value}\`) instead of the
|
|||
return markHTMLString(` ${key.slice(0, -5)}="${listValue}"`);
|
||||
}
|
||||
|
||||
// support object styles for better JSX compat
|
||||
if (key === 'style' && typeof value === 'object') {
|
||||
return markHTMLString(` ${key}="${toStyleString(value)}"`);
|
||||
}
|
||||
|
||||
// support `className` for better JSX compat
|
||||
if (key === 'className') {
|
||||
return markHTMLString(` class="${toAttributeString(value, shouldEscape)}"`);
|
||||
}
|
||||
|
||||
// Boolean values only need the key
|
||||
if (value === true && (key.startsWith('data-') || htmlBooleanAttributes.test(key))) {
|
||||
return markHTMLString(` ${key}`);
|
||||
|
|
Loading…
Reference in a new issue