Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F99460407
createStyled.js
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Fri, Jan 24, 18:43
Size
8 KB
Mime Type
text/x-java
Expires
Sun, Jan 26, 18:43 (2 d)
Engine
blob
Format
Raw Data
Handle
23797413
Attached To
rOACCT Open Access Compliance Check Tool (OACCT)
createStyled.js
View Options
import
_objectWithoutPropertiesLoose
from
"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose"
;
import
_extends
from
"@babel/runtime/helpers/esm/extends"
;
const
_excluded
=
[
"name"
,
"slot"
,
"skipVariantsResolver"
,
"skipSx"
,
"overridesResolver"
],
_excluded2
=
[
"theme"
],
_excluded3
=
[
"theme"
];
/* eslint-disable no-underscore-dangle */
import
styledEngineStyled
,
{
internal_processStyles
as
processStyles
}
from
'@mui/styled-engine'
;
import
{
getDisplayName
}
from
'@mui/utils'
;
import
createTheme
from
'./createTheme'
;
import
propsToClassKey
from
'./propsToClassKey'
;
import
styleFunctionSx
from
'./styleFunctionSx'
;
function
isEmpty
(
obj
)
{
return
Object
.
keys
(
obj
).
length
===
0
;
}
// https://github.com/emotion-js/emotion/blob/26ded6109fcd8ca9875cc2ce4564fee678a3f3c5/packages/styled/src/utils.js#L40
function
isStringTag
(
tag
)
{
return
typeof
tag
===
'string'
&&
// 96 is one less than the char code
// for "a" so this is checking that
// it's a lowercase character
tag
.
charCodeAt
(
0
)
>
96
;
}
const
getStyleOverrides
=
(
name
,
theme
)
=>
{
if
(
theme
.
components
&&
theme
.
components
[
name
]
&&
theme
.
components
[
name
].
styleOverrides
)
{
return
theme
.
components
[
name
].
styleOverrides
;
}
return
null
;
};
const
getVariantStyles
=
(
name
,
theme
)
=>
{
let
variants
=
[];
if
(
theme
&&
theme
.
components
&&
theme
.
components
[
name
]
&&
theme
.
components
[
name
].
variants
)
{
variants
=
theme
.
components
[
name
].
variants
;
}
const
variantsStyles
=
{};
variants
.
forEach
(
definition
=>
{
const
key
=
propsToClassKey
(
definition
.
props
);
variantsStyles
[
key
]
=
definition
.
style
;
});
return
variantsStyles
;
};
const
variantsResolver
=
(
props
,
styles
,
theme
,
name
)
=>
{
const
{
ownerState
=
{}
}
=
props
;
const
variantsStyles
=
[];
const
themeVariants
=
theme
?
.
components
?
.[
name
]
?
.
variants
;
if
(
themeVariants
)
{
themeVariants
.
forEach
(
themeVariant
=>
{
let
isMatch
=
true
;
Object
.
keys
(
themeVariant
.
props
).
forEach
(
key
=>
{
if
(
ownerState
[
key
]
!==
themeVariant
.
props
[
key
]
&&
props
[
key
]
!==
themeVariant
.
props
[
key
])
{
isMatch
=
false
;
}
});
if
(
isMatch
)
{
variantsStyles
.
push
(
styles
[
propsToClassKey
(
themeVariant
.
props
)]);
}
});
}
return
variantsStyles
;
};
// Update /system/styled/#api in case if this changes
export
function
shouldForwardProp
(
prop
)
{
return
prop
!==
'ownerState'
&&
prop
!==
'theme'
&&
prop
!==
'sx'
&&
prop
!==
'as'
;
}
export
const
systemDefaultTheme
=
createTheme
();
const
lowercaseFirstLetter
=
string
=>
{
return
string
.
charAt
(
0
).
toLowerCase
()
+
string
.
slice
(
1
);
};
export
default
function
createStyled
(
input
=
{})
{
const
{
defaultTheme
=
systemDefaultTheme
,
rootShouldForwardProp
=
shouldForwardProp
,
slotShouldForwardProp
=
shouldForwardProp
}
=
input
;
const
systemSx
=
props
=>
{
const
theme
=
isEmpty
(
props
.
theme
)
?
defaultTheme
:
props
.
theme
;
return
styleFunctionSx
(
_extends
({},
props
,
{
theme
}));
};
systemSx
.
__mui_systemSx
=
true
;
return
(
tag
,
inputOptions
=
{})
=>
{
// Filter out the `sx` style function from the previous styled component to prevent unnecessary styles generated by the composite components.
processStyles
(
tag
,
styles
=>
styles
.
filter
(
style
=>
!
style
?
.
__mui_systemSx
));
const
{
name
:
componentName
,
slot
:
componentSlot
,
skipVariantsResolver
:
inputSkipVariantsResolver
,
skipSx
:
inputSkipSx
,
overridesResolver
}
=
inputOptions
,
options
=
_objectWithoutPropertiesLoose
(
inputOptions
,
_excluded
);
// if skipVariantsResolver option is defined, take the value, otherwise, true for root and false for other slots.
const
skipVariantsResolver
=
inputSkipVariantsResolver
!==
undefined
?
inputSkipVariantsResolver
:
componentSlot
&&
componentSlot
!==
'Root'
||
false
;
const
skipSx
=
inputSkipSx
||
false
;
let
label
;
if
(
process
.
env
.
NODE_ENV
!==
'production'
)
{
if
(
componentName
)
{
label
=
`
$
{
componentName
}
-
$
{
lowercaseFirstLetter
(
componentSlot
||
'Root'
)}
`
;
}
}
let
shouldForwardPropOption
=
shouldForwardProp
;
if
(
componentSlot
===
'Root'
)
{
shouldForwardPropOption
=
rootShouldForwardProp
;
}
else
if
(
componentSlot
)
{
// any other slot specified
shouldForwardPropOption
=
slotShouldForwardProp
;
}
else
if
(
isStringTag
(
tag
))
{
// for string (html) tag, preserve the behavior in emotion & styled-components.
shouldForwardPropOption
=
undefined
;
}
const
defaultStyledResolver
=
styledEngineStyled
(
tag
,
_extends
({
shouldForwardProp
:
shouldForwardPropOption
,
label
},
options
));
const
muiStyledResolver
=
(
styleArg
,
...
expressions
)
=>
{
const
expressionsWithDefaultTheme
=
expressions
?
expressions
.
map
(
stylesArg
=>
{
// On the server Emotion doesn't use React.forwardRef for creating components, so the created
// component stays as a function. This condition makes sure that we do not interpolate functions
// which are basically components used as a selectors.
return
typeof
stylesArg
===
'function'
&&
stylesArg
.
__emotion_real
!==
stylesArg
?
_ref
=>
{
let
{
theme
:
themeInput
}
=
_ref
,
other
=
_objectWithoutPropertiesLoose
(
_ref
,
_excluded2
);
return
stylesArg
(
_extends
({
theme
:
isEmpty
(
themeInput
)
?
defaultTheme
:
themeInput
},
other
));
}
:
stylesArg
;
})
:
[];
let
transformedStyleArg
=
styleArg
;
if
(
componentName
&&
overridesResolver
)
{
expressionsWithDefaultTheme
.
push
(
props
=>
{
const
theme
=
isEmpty
(
props
.
theme
)
?
defaultTheme
:
props
.
theme
;
const
styleOverrides
=
getStyleOverrides
(
componentName
,
theme
);
if
(
styleOverrides
)
{
const
resolvedStyleOverrides
=
{};
Object
.
entries
(
styleOverrides
).
forEach
(([
slotKey
,
slotStyle
])
=>
{
resolvedStyleOverrides
[
slotKey
]
=
typeof
slotStyle
===
'function'
?
slotStyle
(
_extends
({},
props
,
{
theme
}))
:
slotStyle
;
});
return
overridesResolver
(
props
,
resolvedStyleOverrides
);
}
return
null
;
});
}
if
(
componentName
&&
!
skipVariantsResolver
)
{
expressionsWithDefaultTheme
.
push
(
props
=>
{
const
theme
=
isEmpty
(
props
.
theme
)
?
defaultTheme
:
props
.
theme
;
return
variantsResolver
(
props
,
getVariantStyles
(
componentName
,
theme
),
theme
,
componentName
);
});
}
if
(
!
skipSx
)
{
expressionsWithDefaultTheme
.
push
(
systemSx
);
}
const
numOfCustomFnsApplied
=
expressionsWithDefaultTheme
.
length
-
expressions
.
length
;
if
(
Array
.
isArray
(
styleArg
)
&&
numOfCustomFnsApplied
>
0
)
{
const
placeholders
=
new
Array
(
numOfCustomFnsApplied
).
fill
(
''
);
// If the type is array, than we need to add placeholders in the template for the overrides, variants and the sx styles.
transformedStyleArg
=
[...
styleArg
,
...
placeholders
];
transformedStyleArg
.
raw
=
[...
styleArg
.
raw
,
...
placeholders
];
}
else
if
(
typeof
styleArg
===
'function'
&&
// On the server Emotion doesn't use React.forwardRef for creating components, so the created
// component stays as a function. This condition makes sure that we do not interpolate functions
// which are basically components used as a selectors.
styleArg
.
__emotion_real
!==
styleArg
)
{
// If the type is function, we need to define the default theme.
transformedStyleArg
=
_ref2
=>
{
let
{
theme
:
themeInput
}
=
_ref2
,
other
=
_objectWithoutPropertiesLoose
(
_ref2
,
_excluded3
);
return
styleArg
(
_extends
({
theme
:
isEmpty
(
themeInput
)
?
defaultTheme
:
themeInput
},
other
));
};
}
const
Component
=
defaultStyledResolver
(
transformedStyleArg
,
...
expressionsWithDefaultTheme
);
if
(
process
.
env
.
NODE_ENV
!==
'production'
)
{
let
displayName
;
if
(
componentName
)
{
displayName
=
`
$
{
componentName
}
$
{
componentSlot
||
''
}
`
;
}
if
(
displayName
===
undefined
)
{
displayName
=
`
Styled
(
$
{
getDisplayName
(
tag
)})
`
;
}
Component
.
displayName
=
displayName
;
}
return
Component
;
};
if
(
defaultStyledResolver
.
withConfig
)
{
muiStyledResolver
.
withConfig
=
defaultStyledResolver
.
withConfig
;
}
return
muiStyledResolver
;
};
}
Event Timeline
Log In to Comment