Popups with CSS Transitions (React)

This sample adds and removes custom CSS classes to animate the Popup when it is shown or hidden. There are also fadeIn and fadeOut properties that can be used for simple animations on the Popup control.

Learn about Input Controls | Popup Transitions Documentation | Popup API Reference

This example uses React.

import 'bootstrap.css'; import '@mescius/wijmo.styles/wijmo.css'; import ReactDOM from 'react-dom/client'; import React, { useRef } from 'react'; import useEvent from 'react-use-event-hook'; import * as wijmo from '@mescius/wijmo'; import * as wjInput from '@mescius/wijmo.react.input'; import './app.css'; function App() { const frmLoginPopupRef = useRef(null); const initLoginForm = useEvent((popup) => { frmLoginPopupRef.current = popup; }); const shown = useEvent((popup) => { wijmo.toggleClass(popup.hostElement, 'custom-animation-visible', true); }); const hiding = useEvent((popup) => { wijmo.toggleClass(popup.hostElement, 'custom-animation-visible', false); }); return (<main className="container-fluid"> <button className="btn btn-primary btn-space" onClick={e => frmLoginPopupRef.current.show(true)}> Log In </button> <wjInput.Popup className="custom-animation" fadeIn={false} shown={shown} hiding={hiding} initialized={initLoginForm}> <form> <h4 className="modal-header"> Log in <button type="button" className="close wj-hide">&times;</button> </h4> <div className="modal-body"> <label> Email: <input className="form-control" required type="email"/> </label> <br /> <label> Password: <input className="form-control" type="password" required pattern=".{4,}" title="Please enter 4 characters or more."/> </label> <br /> </div> <div className="modal-footer"> <button className="btn btn-primary" type="submit"> Log in </button> </div> </form> </wjInput.Popup> </main>); } const container = document.getElementById('app'); if (container) { const root = ReactDOM.createRoot(container); root.render(<App />); }
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>MESCIUS Wijmo Popup CSS Transitions</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- SystemJS --> <script src="https://cdn.jsdelivr.net/npm/systemjs@0.19.40/dist/system.src.js" integrity="sha512-G6mEj6h18+m3MvzdviSDfPle/TfH0//cXcB33AKlNR/Rha0yQsKefDZKRTkIZos97HEGq2JMV1RT5ybMoQ3WsQ==" crossorigin="anonymous"></script> <script src="systemjs.config.js"></script> <script> System.import('./src/app'); </script> </head> <body> <div id="app"></div> </body> </html>
.modal-body { min-width: 300px; } input:invalid { border-color: red; } /* CSS animations for fading in and out */ .custom-animation { opacity: 0; transform: rotate3d(1, .5, .5, 180deg) scale(0.1); transition: all ease-in .4s; } .custom-animation-visible { opacity: 1; transform: none; }
(function (global) { window.process = { env: { NODE_ENV: 'production', }, }; System.config({ transpiler: 'plugin-babel', babelOptions: { es2015: true, react: true, }, meta: { '*.css': { loader: 'css' }, }, paths: { // paths serve as alias 'npm:': 'node_modules/', 'cdn:': 'https://cdn.mescius.io/demoapps/packages/wijmojs/5.20261.50-rc/', 'pcdn:': 'https://cdn.jsdelivr.net/npm/' }, // map tells the System loader where to look for things map: { '@mescius/wijmo': 'cdn:@mescius/wijmo/index.js', '@mescius/wijmo.input': 'cdn:@mescius/wijmo.input/index.js', '@mescius/wijmo.styles': 'cdn:@mescius/wijmo.styles', '@mescius/wijmo.cultures': 'cdn:@mescius/wijmo.cultures', '@mescius/wijmo.chart': 'cdn:@mescius/wijmo.chart/index.js', '@mescius/wijmo.chart.analytics': 'cdn:@mescius/wijmo.chart.analytics/index.js', '@mescius/wijmo.chart.animation': 'cdn:@mescius/wijmo.chart.animation/index.js', '@mescius/wijmo.chart.annotation': 'cdn:@mescius/wijmo.chart.annotation/index.js', '@mescius/wijmo.chart.finance': 'cdn:@mescius/wijmo.chart.finance/index.js', '@mescius/wijmo.chart.finance.analytics': 'cdn:@mescius/wijmo.chart.finance.analytics/index.js', '@mescius/wijmo.chart.hierarchical': 'cdn:@mescius/wijmo.chart.hierarchical/index.js', '@mescius/wijmo.chart.interaction': 'cdn:@mescius/wijmo.chart.interaction/index.js', '@mescius/wijmo.chart.radar': 'cdn:@mescius/wijmo.chart.radar/index.js', '@mescius/wijmo.chart.render': 'cdn:@mescius/wijmo.chart.render/index.js', '@mescius/wijmo.chart.webgl': 'cdn:@mescius/wijmo.chart.webgl/index.js', '@mescius/wijmo.chart.map': 'cdn:@mescius/wijmo.chart.map/index.js', '@mescius/wijmo.gauge': 'cdn:@mescius/wijmo.gauge/index.js', '@mescius/wijmo.grid': 'cdn:@mescius/wijmo.grid/index.js', '@mescius/wijmo.grid.detail': 'cdn:@mescius/wijmo.grid.detail/index.js', '@mescius/wijmo.grid.filter': 'cdn:@mescius/wijmo.grid.filter/index.js', '@mescius/wijmo.grid.search': 'cdn:@mescius/wijmo.grid.search/index.js', '@mescius/wijmo.grid.style': 'cdn:@mescius/wijmo.grid.style/index.js', '@mescius/wijmo.grid.grouppanel': 'cdn:@mescius/wijmo.grid.grouppanel/index.js', '@mescius/wijmo.grid.multirow': 'cdn:@mescius/wijmo.grid.multirow/index.js', '@mescius/wijmo.grid.transposed': 'cdn:@mescius/wijmo.grid.transposed/index.js', '@mescius/wijmo.grid.transposedmultirow': 'cdn:@mescius/wijmo.grid.transposedmultirow/index.js', '@mescius/wijmo.grid.pdf': 'cdn:@mescius/wijmo.grid.pdf/index.js', '@mescius/wijmo.grid.sheet': 'cdn:@mescius/wijmo.grid.sheet/index.js', '@mescius/wijmo.grid.xlsx': 'cdn:@mescius/wijmo.grid.xlsx/index.js', '@mescius/wijmo.grid.selector': 'cdn:@mescius/wijmo.grid.selector/index.js', '@mescius/wijmo.grid.cellmaker': 'cdn:@mescius/wijmo.grid.cellmaker/index.js', '@mescius/wijmo.grid.immutable': 'cdn:@mescius/wijmo.grid.immutable/index.js', '@mescius/wijmo.touch': 'cdn:@mescius/wijmo.touch/index.js', '@mescius/wijmo.cloud': 'cdn:@mescius/wijmo.cloud/index.js', '@mescius/wijmo.nav': 'cdn:@mescius/wijmo.nav/index.js', '@mescius/wijmo.odata': 'cdn:@mescius/wijmo.odata/index.js', '@mescius/wijmo.olap': 'cdn:@mescius/wijmo.olap/index.js', '@mescius/wijmo.rest': 'cdn:@mescius/wijmo.rest/index.js', '@mescius/wijmo.pdf': 'cdn:@mescius/wijmo.pdf/index.js', '@mescius/wijmo.pdf.security': 'cdn:@mescius/wijmo.pdf.security/index.js', '@mescius/wijmo.viewer': 'cdn:@mescius/wijmo.viewer/index.js', '@mescius/wijmo.xlsx': 'cdn:@mescius/wijmo.xlsx/index.js', '@mescius/wijmo.undo': 'cdn:@mescius/wijmo.undo/index.js', '@mescius/wijmo.interop.grid': 'cdn:@mescius/wijmo.interop.grid/index.js', '@mescius/wijmo.barcode': 'cdn:@mescius/wijmo.barcode/index.js', '@mescius/wijmo.barcode.common': 'cdn:@mescius/wijmo.barcode.common/index.js', '@mescius/wijmo.barcode.composite': 'cdn:@mescius/wijmo.barcode.composite/index.js', '@mescius/wijmo.barcode.specialized': 'cdn:@mescius/wijmo.barcode.specialized/index.js', '@mescius/wijmo.react.chart.analytics': 'cdn:@mescius/wijmo.react.chart.analytics/index.js', '@mescius/wijmo.react.chart.animation': 'cdn:@mescius/wijmo.react.chart.animation/index.js', '@mescius/wijmo.react.chart.annotation': 'cdn:@mescius/wijmo.react.chart.annotation/index.js', '@mescius/wijmo.react.chart.finance.analytics': 'cdn:@mescius/wijmo.react.chart.finance.analytics/index.js', '@mescius/wijmo.react.chart.finance': 'cdn:@mescius/wijmo.react.chart.finance/index.js', '@mescius/wijmo.react.chart.hierarchical': 'cdn:@mescius/wijmo.react.chart.hierarchical/index.js', '@mescius/wijmo.react.chart.interaction': 'cdn:@mescius/wijmo.react.chart.interaction/index.js', '@mescius/wijmo.react.chart.radar': 'cdn:@mescius/wijmo.react.chart.radar/index.js', '@mescius/wijmo.react.chart': 'cdn:@mescius/wijmo.react.chart/index.js', '@mescius/wijmo.react.core': 'cdn:@mescius/wijmo.react.core/index.js', '@mescius/wijmo.react.chart.map': 'cdn:@mescius/wijmo.react.chart.map/index.js', '@mescius/wijmo.react.gauge': 'cdn:@mescius/wijmo.react.gauge/index.js', '@mescius/wijmo.react.grid.detail': 'cdn:@mescius/wijmo.react.grid.detail/index.js', '@mescius/wijmo.react.grid.filter': 'cdn:@mescius/wijmo.react.grid.filter/index.js', '@mescius/wijmo.react.grid.grouppanel': 'cdn:@mescius/wijmo.react.grid.grouppanel/index.js', '@mescius/wijmo.react.grid.search': 'cdn:@mescius/wijmo.react.grid.search/index.js', '@mescius/wijmo.react.grid.multirow': 'cdn:@mescius/wijmo.react.grid.multirow/index.js', '@mescius/wijmo.react.grid.sheet': 'cdn:@mescius/wijmo.react.grid.sheet/index.js', '@mescius/wijmo.react.grid.transposed': 'cdn:@mescius/wijmo.react.grid.transposed/index.js', '@mescius/wijmo.react.grid.transposedmultirow': 'cdn:@mescius/wijmo.react.grid.transposedmultirow/index.js', '@mescius/wijmo.react.grid.immutable': 'cdn:@mescius/wijmo.react.grid.immutable/index.js', '@mescius/wijmo.react.grid': 'cdn:@mescius/wijmo.react.grid/index.js', '@mescius/wijmo.react.input': 'cdn:@mescius/wijmo.react.input/index.js', '@mescius/wijmo.react.olap': 'cdn:@mescius/wijmo.react.olap/index.js', '@mescius/wijmo.react.viewer': 'cdn:@mescius/wijmo.react.viewer/index.js', '@mescius/wijmo.react.nav': 'cdn:@mescius/wijmo.react.nav/index.js', '@mescius/wijmo.react.base': 'cdn:@mescius/wijmo.react.base/index.js', '@mescius/wijmo.react.barcode.common': 'cdn:@mescius/wijmo.react.barcode.common/index.js', '@mescius/wijmo.react.barcode.composite': 'cdn:@mescius/wijmo.react.barcode.composite/index.js', '@mescius/wijmo.react.barcode.specialized': 'cdn:@mescius/wijmo.react.barcode.specialized/index.js', jszip: 'pcdn:jszip@3.8.0/dist/jszip.js', react: 'pcdn:react@19.0.0/index.js', 'react-dom': 'pcdn:react-dom@19.0.0/index.js', 'react-dom/client': 'pcdn:react-dom@19.0.0/client.js', scheduler: 'pcdn:scheduler@0.25.0/index.js', redux: 'pcdn:redux@5.0.1/dist/redux.legacy-esm.js', 'react-redux': 'pcdn:react-redux@9.2.0/dist/react-redux.legacy-esm.js', 'bootstrap.css': 'pcdn:bootstrap@3.3.7/dist/css/bootstrap.min.css', css: 'pcdn:systemjs-plugin-css@0.1.37/css.js', 'plugin-babel': 'pcdn:systemjs-plugin-babel@0.0.25/plugin-babel.js', 'systemjs-babel-build': 'pcdn:systemjs-plugin-babel@0.0.25/systemjs-babel-browser.js', 'react-use-event-hook': 'pcdn:react-use-event-hook@0.9.6/dist/esm/useEvent.js', }, // packages tells the System loader how to load when no filename and/or no extension packages: { src: { defaultExtension: 'jsx', }, node_modules: { defaultExtension: 'js', }, }, }); })(this);