@reusable-ui/modal
Version:
Overlays a dialog to the entire site's page.
116 lines (84 loc) • 4.03 kB
text/typescript
// cssfn:
import {
// cssfn css specific types:
CssKnownProps,
// writes css in javascript:
keyframes,
style,
// reads/writes css variables configuration:
cssConfig,
} from '@cssfn/core' // writes css in javascript
// reusable-ui core:
import {
// animation stuff of UI:
usesAnimation,
// a capability of UI to highlight itself to attract user's attention:
usesExcitable,
} from '@reusable-ui/core' // a set of reusable-ui packages which are responsible for building any component
// configs:
export const [modals, modalValues, cssModalConfig] = cssConfig(() => {
// dependencies:
const {animationRegistry : {filters} } = usesAnimation();
const {excitableVars : {filter: filterExcited}} = usesExcitable();
//#region keyframes
const frameCollapsed = style({
filter : [[
'opacity(0)',
]]
});
const frameExpanded = style({
filter : [[
'opacity(1)',
]]
});
const [keyframesExpandRule , keyframesExpand ] = keyframes({
from : frameCollapsed,
to : frameExpanded,
});
keyframesExpand.value = 'expand'; // the @keyframes name should contain 'expand' in order to be recognized by `useCollapsible`
const [keyframesCollapseRule, keyframesCollapse] = keyframes({
from : frameExpanded,
to : frameCollapsed,
});
keyframesCollapse.value = 'collapse'; // the @keyframes name should contain 'collapse' in order to be recognized by `useCollapsible`
const [modalUiKeyframesExciteRule, modalUiKeyframesExcite] = keyframes({
from : {
filter : [[
...filters.filter((f) => (f !== filterExcited)), // the rest filter(s)
]],
},
to : {
filter : [[
...filters.filter((f) => (f !== filterExcited)), // the rest filter(s)
filterExcited, // the interpolating filter
]],
},
});
modalUiKeyframesExcite.value = 'excite'; // the @keyframes name should contain 'excite' in order to be recognized by `useToggleExcitable`
//#endregion keyframes
return {
// backgrounds:
backg : 'rgba(0,0,0, 0.5)' as CssKnownProps['background'],
// borders:
// modalUiBoxShadow : [[0, 0, '10px', 'rgba(0,0,0,0.5)']] as CssKnownProps['boxShadow' ],
modalUiFilter: [
['drop-shadow(', 0, 0, '10px', 'rgba(0,0,0,0.5)', ')'],
] as CssKnownProps['filter' ], // create a shadow using `drop-shadow`, so that the SHAPE of the shadow follows the SHAPE of the <ModalUi>
// animations:
...keyframesExpandRule,
...keyframesCollapseRule,
animExpand : [
['300ms', 'ease-out', 'both', keyframesExpand ],
] as CssKnownProps['animation' ],
animCollapse : [
['300ms', 'ease-in' , 'both', keyframesCollapse],
] as CssKnownProps['animation' ],
modalUiFilterExcite : [[
'invert(80%)',
]] as CssKnownProps['filter' ],
...modalUiKeyframesExciteRule,
modalUiAnimExcite : [
['150ms', 'ease', 'both', 'alternate-reverse', 5, modalUiKeyframesExcite],
] as CssKnownProps['animation' ],
};
}, { prefix: 'mdl' });