├── .babelrc ├── .eslintrc ├── .gitignore ├── .npmignore ├── LICENSE ├── README.md ├── __tests__ └── index-test.js ├── demo ├── index.html └── react-toggle-buttonDemo.js ├── lib └── index.js ├── package.json ├── src ├── colors.js ├── iconExamples.js ├── index.js ├── react-toggle-button.js ├── react-toggle-buttonDemo.js └── styles.js ├── webpack.config.js └── webpack.demo.config.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | "react", 4 | "es2015", 5 | "stage-0" 6 | ] 7 | } -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "airbnb", 3 | "plugins": [ 4 | "react" 5 | ] 6 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | 2 | src/ 3 | __tests__/ 4 | .eslintrc 5 | .babelrc 6 | webpack.config.js 7 | webpack.demo.config.js 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Gavin Owens 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # react-toggle-button 2 | 3 | ### Getting Started 4 | 5 | #### Step 1 6 | Go here: https://gdowens.github.io/react-toggle-button/ 7 | 8 | #### Step 2 9 | ![Laughing Gandalf GIF](https://media.giphy.com/media/TcdpZwYDPlWXC/giphy.gif) 10 | 11 | ### Credits 12 | Inspired by and loosely based on https://github.com/instructure-react/react-toggle 13 | -------------------------------------------------------------------------------- /__tests__/index-test.js: -------------------------------------------------------------------------------- 1 | jest.unmock('../src/index'); 2 | 3 | import React from 'react'; 4 | import ReactDOM from 'react-dom'; 5 | import TestUtils from 'react-dom/test-utils'; 6 | import index from '../src/index' 7 | 8 | describe('', () => { 9 | it('', () => { 10 | const renderer = TestUtils.createRenderer(); 11 | renderer.render( 12 | 13 | ); 14 | const dom = renderer.getRenderOutput(); 15 | //expect(dom.props.//PROPS_NAME).toEqual('//TEXT'); 16 | }); 17 | }); 18 | -------------------------------------------------------------------------------- /demo/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | React Toggle Button 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /demo/react-toggle-buttonDemo.js: -------------------------------------------------------------------------------- 1 | !function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={exports:{},id:r,loaded:!1};return e[r].call(o.exports,o,o.exports,t),o.loaded=!0,o.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){e.exports=n(17)},function(e,t,n){"use strict";e.exports=n(40)},function(e,t){"use strict";function n(e){return function(){return e}}var r=function(){};r.thatReturns=n,r.thatReturnsFalse=n(!1),r.thatReturnsTrue=n(!0),r.thatReturnsNull=n(null),r.thatReturnsThis=function(){return this},r.thatReturnsArgument=function(e){return e},e.exports=r},function(e,t,n){e.exports=n(28)()},function(e,t){"use strict";function n(e){var t={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]="number"==typeof e[n]?e[n]:e[n].val);return t}t.__esModule=!0,t.default=n,e.exports=t.default},function(e,t,n){(function(t){(function(){var n,r,o;"undefined"!=typeof performance&&null!==performance&&performance.now?e.exports=function(){return performance.now()}:"undefined"!=typeof t&&null!==t&&t.hrtime?(e.exports=function(){return(n()-o)/1e6},r=t.hrtime,n=function(){var e;return e=r(),1e9*e[0]+e[1]},o=n()):Date.now?(e.exports=function(){return Date.now()-o},o=Date.now()):(e.exports=function(){return(new Date).getTime()-o},o=(new Date).getTime())}).call(this)}).call(t,n(12))},function(e,t,n){(function(t){for(var r=n(30),o="undefined"==typeof window?t:window,a=["moz","webkit"],l="AnimationFrame",i=o["request"+l],u=o["cancel"+l]||o["cancelRequest"+l],c=0;!i&&c1)for(var n=1;n {\n self.setState({\n value: !value,\n })\n }} />",description:"// ToggleButton requires only two props...\n\n\n// 'value', the state of the button.\n\n// 'onToggle', called on each click, is given the current state\n// of the button.",example:function(e){return s.default.createElement(d.default,{value:e.state.value,onToggle:function(t){e.setState({value:!t})}})}},{code:"}\n activeLabel={}\n value={self.state.value}\n onToggle={(value) => {\n self.setState({\n value: !value,\n })\n }} />",description:"// Different labels example...\n\n// 'inactiveLabel' - a string or component to display when OFF.\n// 'activeLabel' - a string or component to display when ON.",example:function(e){return s.default.createElement(d.default,{value:e.state.value2,inactiveLabel:s.default.createElement(h.X,null),activeLabel:s.default.createElement(h.Check,null),onToggle:function(t){e.setState({value2:!t})}})}},{code:"}\n value={self.state.value}\n onToggle={(value) => {\n self.setState({\n value: !value,\n })\n }} />",description:"// Material Design example...\n\n// Your button can look very different, if you want.\n",example:function(e){return s.default.createElement(d.default,{value:e.state.value3,inactiveLabel:"",activeLabel:"",colors:{activeThumb:{base:"rgb(250,250,250)"},inactiveThumb:{base:"rgb(62,130,247)"},active:{base:"rgb(207,221,245)",hover:"rgb(177, 191, 215)"},inactive:{base:"rgb(65,66,68)",hover:"rgb(95,96,98)"}},trackStyle:{height:15},thumbStyle:{position:"absolute",width:30,height:30,boxShadow:"0 0 2px rgba(0,0,0,.12),0 2px 4px rgba(0,0,0,.24)"},thumbAnimateRange:[-10,36],thumbIcon:s.default.createElement("div",{style:{position:"absolute",top:5.5,left:8}},s.default.createElement(h.Check,null)),onToggle:function(t){e.setState({value3:!t})}})}},{code:" {\n return {\n boxShadow: `0 0 ${2 + 4*n}px rgba(0,0,0,.16),0 ${2 + 3*n}px ${4 + 8*n}px rgba(0,0,0,.32)`,\n }\n }} />",description:"// Such hover, much wow!\n\n// Hover and toggle animation props use a function\n// that lets you interpolate your own styles.\n",example:function(e){return s.default.createElement(d.default,{value:e.state.value4,inactiveLabel:"",activeLabel:"",colors:{activeThumb:{base:"rgb(250,250,250)"},inactiveThumb:{base:"rgb(62,130,247)"},active:{base:"rgb(207,221,245)",hover:"rgb(177, 191, 215)"},inactive:{base:"rgb(65,66,68)",hover:"rgb(95,96,98)"}},trackStyle:{height:15},thumbStyle:{position:"absolute",width:30,height:30,boxShadow:"0 0 2px rgba(0,0,0,.12),0 2px 4px rgba(0,0,0,.24)",display:"flex",borderRadius:15,alignItems:"center",justifyContent:"center"},thumbStyleHover:{width:32,height:32},thumbAnimateRange:[-10,36],animateThumbStyleHover:function(e){return{boxShadow:"0 0 "+(2+4*e)+"px rgba(0,0,0,.16),0 "+(2+3*e)+"px "+(4+8*e)+"px rgba(0,0,0,.32)"}},thumbIcon:s.default.createElement("div",null,s.default.createElement(h.Check,null)),onToggle:function(t){e.setState({value4:!t})}})}},{code:"const borderRadiusStyle = { borderRadius: 2 }\n\n// ... some lines of code later\n\n {\n self.setState({\n value: !value,\n })\n }} />",description:"// A square toggle, just for funsies...",example:function(e){return s.default.createElement(d.default,{value:e.state.value5,thumbStyle:{borderRadius:2},trackStyle:{borderRadius:2},onToggle:function(t){e.setState({value5:!t})}})}}],v=function(e,t,n){var r=t.code,o=t.example,a=t.description,l=t.title;return s.default.createElement("div",{key:n,style:m.exampleContainer},s.default.createElement("h2",{style:m.subTitleStyle},l),s.default.createElement("div",{style:m.exampleInternal},s.default.createElement("pre",{style:m.descriptionStyle},a),s.default.createElement("div",{style:m.informationBlock},s.default.createElement("div",{style:m.toggleContainer},o(e)),s.default.createElement("pre",{style:m.codeBlock},r))))},g=function(e){function t(e){o(this,t);var n=a(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.state={value:!1,value2:!1,value3:!1,value4:!1,value5:!1},n}return l(t,e),u(t,[{key:"render",value:function(){var e=this;return s.default.createElement("div",{style:m.container},s.default.createElement("pre",{style:i({},m.codeBlock,{width:145,marginBottom:20})},"react-toggle-button"),s.default.createElement("div",{style:{maxWidth:500,lineHeight:1.5,fontSize:16,fontWeight:500,marginBottom:10}},"A highly customizable and portable toggle button for React."),s.default.createElement("pre",{style:i({},m.codeBlock,{width:500,marginBottom:20})},"// Easy to install and works out-of-the-box\n\n// Change a few things, or change everything\n\n// Uses react-motion for animating toggle.\n\n// Animates hover states too!\n\n// Quacks like an checkbox, if that's your thing.\n\n// Sticks to the UI stuff (Redux approved!)\n"),s.default.createElement("h1",{style:m.titleStyle},"Install"),s.default.createElement("pre",{style:i({},m.codeBlock,{marginBottom:20})},"npm install react-toggle-button"),s.default.createElement("pre",{style:i({},m.codeBlock,{marginTop:0,marginBottom:60})},"//ES6\nimport ToggleButton from 'react-toggle-button'\n\n//ES5\nvar ToggleButton = require('react-toggle-button')"),s.default.createElement("h1",{style:m.titleStyle}," Examples "),y.map(function(t,n){return v(e,t,n)}),s.default.createElement("div",{style:{marginBottom:50}}),s.default.createElement("h1",{style:m.subTitleStyle}," React Toggle Button API "),s.default.createElement("pre",{style:i({},m.codeBlock,{marginBottom:20})},"import ToggleButton from 'react-toggle-button'\n\n/**\n * 'react-toggle-button' PropTypes\n */\nToggleButton.propTypes = {\n //\n //\n // REQUIRED PROPS\n //\n //\n\n value: React.PropTypes.bool.isRequired,\n /**\n * Called during onClick\n * 1. triggers 'focus' and 'click' on internal checkbox\n * 2. calls onToggle(this.props.active)\n */\n onToggle: React.PropTypes.func.isRequired,\n\n //\n //\n // OPTIONAL PROPS\n //\n //\n /**\n * Object with four properties { active, inactive, activeThumb, inactiveThumb }\n *\n * each property should have a 'base' key and a 'hover' key\n * ( if hover is undefined, that property will use the base value )\n *\n */\n colors: React.PropTypes.object,\n\n\n /**\n * The label used inside the track, can also take a component\n *\n * activeLabel (defaultValue: 'ON')\n * inactiveLabel (defaultValue: 'OFF')\n */\n activeLabel: React.PropTypes.oneOfType([\n React.PropTypes.string,\n React.PropTypes.object,\n ]),\n inactiveLabel: React.PropTypes.oneOfType([\n React.PropTypes.string,\n React.PropTypes.object,\n ]),\n\n\n /**\n * These props specify style,\n * hover style is used during mouseOver event\n *\n *\n */\n activeLabelStyle: React.PropTypes.object,\n activeLabelStyleHover: React.PropTypes.object,\n activeThumbStyle: React.PropTypes.object,\n activeThumbStyleHover: React.PropTypes.object,\n inactiveLabelStyle: React.PropTypes.object,\n inactiveLabelStyleHover: React.PropTypes.object,\n thumbStyle: React.PropTypes.object,\n thumbStyleHover: React.PropTypes.object,\n trackStyle: React.PropTypes.object,\n trackStyleHover: React.PropTypes.object,\n\n\n /**\n * These props take a function that receives a real number [0, 1] and\n * returns an interpolated style.\n *\n * No Hover -> Hover : 0 -> 1 : No Toggle -> Toggle\n */\n animateThumbStyleHover: React.PropTypes.func,\n animateTrackStyleHover: React.PropTypes.func,\n animateTrackStyleToggle: React.PropTypes.func,\n animateThumbStyleToggle: React.PropTypes.func,\n\n\n /**\n * passes through internal spring settings for react-motion\n * { stiffness, damping }\n */\n internalSpringSetting: React.PropTypes.object,\n internalHoverSpringSetting: React.PropTypes.object,\n\n\n /**\n * Optional if one wants an icon inside the thumb, take a string or component\n */\n thumbIcon: React.PropTypes.oneOfType([\n React.PropTypes.string,\n React.PropTypes.object,\n ]),\n\n /**\n * The range to move the thumb on toggle [starting, ending]\n */\n thumbAnimateRange: React.PropTypes.array,\n\n /**\n * If you want to put some props on the underlying element\n * you can pass them through this prop.\n *\n * Example:\n *\n * passThroughInputProps={{\n * \tonChange: () => console.log('Hello!')\n * }}\n *\n */\n passThroughInputProps: React.PropTypes.object,\n\n}"))}}]),t}(c.Component);(0,f.render)(s.default.createElement(g,null),document.getElementById("root"))},function(e,t){"use strict";function n(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;tthis.eventPool.length&&this.eventPool.push(e)}function z(e){e.eventPool=[],e.getPooled=U,e.release=V}function B(e,t,n,r){return F.call(this,e,t,n,r)}function W(e,t,n,r){return F.call(this,e,t,n,r)}function K(e,t){switch(e){case"topKeyUp":return-1!==pr.indexOf(t.keyCode);case"topKeyDown":return 229!==t.keyCode;case"topKeyPress":case"topMouseDown":case"topBlur":return!0;default:return!1}}function q(e){return e=e.detail,"object"==typeof e&&"data"in e?e.data:null}function $(e,t){switch(e){case"topCompositionEnd":return q(t);case"topKeyPress":return 32!==t.which?null:(Sr=!0,Tr);case"topTextInput":return e=t.data,e===Tr&&Sr?null:e;default:return null}}function Q(e,t){if(wr)return"topCompositionEnd"===e||!dr&&K(e,t)?(e=A(),cr._root=null,cr._startText=null,cr._fallbackText=null,wr=!1,e):null;switch(e){case"topPaste":return null;case"topKeyPress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1Vr.length&&Vr.push(e)}}}function Me(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n["ms"+e]="MS"+t,n["O"+e]="o"+t.toLowerCase(),n}function De(e){if(qr[e])return qr[e];if(!Kr[e])return e;var t,n=Kr[e];for(t in n)if(n.hasOwnProperty(t)&&t in $r)return qr[e]=n[t];return""}function Le(e){return Object.prototype.hasOwnProperty.call(e,Xr)||(e[Xr]=Yr++,Gr[e[Xr]]={}),Gr[e[Xr]]}function je(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function Ae(e,t){var n=je(e);e=0;for(var r;n;){if(3===n.nodeType){if(r=e+n.textContent.length,e<=t&&r>=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=je(n)}}function He(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&"text"===e.type||"textarea"===t||"true"===e.contentEditable)}function Fe(e,t){if(ro||null==eo||eo!==wn())return null;var n=eo;return"selectionStart"in n&&He(n)?n={start:n.selectionStart,end:n.selectionEnd}:window.getSelection?(n=window.getSelection(),n={anchorNode:n.anchorNode,anchorOffset:n.anchorOffset,focusNode:n.focusNode,focusOffset:n.focusOffset}):n=void 0,no&&Cn(no,n)?null:(no=n,e=F.getPooled(Jr.select,to,e,t),e.type="select",e.target=eo,D(e),e)}function Ue(e,t,n,r){return F.call(this,e,t,n,r)}function Ve(e,t,n,r){return F.call(this,e,t,n,r)}function ze(e,t,n,r){return F.call(this,e,t,n,r)}function Be(e){var t=e.keyCode;return"charCode"in e?(e=e.charCode,0===e&&13===t&&(e=13)):e=t,32<=e||13===e?e:0}function We(e,t,n,r){return F.call(this,e,t,n,r)}function Ke(e,t,n,r){return F.call(this,e,t,n,r)}function qe(e,t,n,r){return F.call(this,e,t,n,r)}function $e(e,t,n,r){return F.call(this,e,t,n,r)}function Qe(e,t,n,r){return F.call(this,e,t,n,r)}function Ge(e){0>fo||(e.current=so[fo],so[fo]=null,fo--)}function Ye(e,t){fo++,so[fo]=e.current,e.current=t}function Xe(e){return Je(e)?bo:vo.current}function Ze(e,t){var n=e.type.contextTypes;if(!n)return Pn;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var o,a={};for(o in n)a[o]=t[o];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=a),a}function Je(e){return 2===e.tag&&null!=e.type.childContextTypes}function et(e){Je(e)&&(Ge(go,e),Ge(vo,e))}function tt(e,t,n){null!=vo.cursor?r("168"):void 0,Ye(vo,t,e),Ye(go,n,e)}function nt(e,t){var n=e.stateNode,o=e.type.childContextTypes;if("function"!=typeof n.getChildContext)return t;n=n.getChildContext();for(var a in n)a in o?void 0:r("108",ke(e)||"Unknown",a);return Tn({},t,n)}function rt(e){if(!Je(e))return!1;var t=e.stateNode;return t=t&&t.__reactInternalMemoizedMergedChildContext||Pn,bo=vo.current,Ye(vo,t,e),Ye(go,go.current,e),!0}function ot(e,t){var n=e.stateNode;if(n?void 0:r("169"),t){var o=nt(e,bo);n.__reactInternalMemoizedMergedChildContext=o,Ge(go,e),Ge(vo,e),Ye(vo,o,e)}else Ge(go,e);Ye(go,t,e)}function at(e,t,n){this.tag=e,this.key=t,this.stateNode=this.type=null,this.sibling=this.child=this.return=null,this.index=0,this.memoizedState=this.updateQueue=this.memoizedProps=this.pendingProps=this.ref=null,this.internalContextTag=n,this.effectTag=0,this.lastEffect=this.firstEffect=this.nextEffect=null,this.expirationTime=0,this.alternate=null}function lt(e,t,n){var r=e.alternate;return null===r?(r=new at(e.tag,e.key,e.internalContextTag),r.type=e.type,r.stateNode=e.stateNode,r.alternate=e,e.alternate=r):(r.effectTag=0,r.nextEffect=null,r.firstEffect=null,r.lastEffect=null),r.expirationTime=n,r.pendingProps=t,r.child=e.child,r.memoizedProps=e.memoizedProps,r.memoizedState=e.memoizedState,r.updateQueue=e.updateQueue,r.sibling=e.sibling,r.index=e.index,r.ref=e.ref,r}function it(e,t,n){var o=void 0,a=e.type,l=e.key;return"function"==typeof a?(o=a.prototype&&a.prototype.isReactComponent?new at(2,l,t):new at(0,l,t),o.type=a,o.pendingProps=e.props):"string"==typeof a?(o=new at(5,l,t),o.type=a,o.pendingProps=e.props):"object"==typeof a&&null!==a&&"number"==typeof a.tag?(o=a,o.pendingProps=e.props):r("130",null==a?a:typeof a,""),o.expirationTime=n,o}function ut(e,t,n,r){return t=new at(10,r,t),t.pendingProps=e,t.expirationTime=n,t}function ct(e,t,n){return t=new at(6,null,t),t.pendingProps=e,t.expirationTime=n,t}function st(e,t,n){return t=new at(7,e.key,t),t.type=e.handler,t.pendingProps=e,t.expirationTime=n,t}function ft(e,t,n){return e=new at(9,null,t),e.expirationTime=n,e}function pt(e,t,n){return t=new at(4,e.key,t),t.pendingProps=e.children||[],t.expirationTime=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function dt(e){return function(t){try{return e(t)}catch(e){}}}function ht(e){if("undefined"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__)return!1;var t=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(t.isDisabled||!t.supportsFiber)return!0;try{var n=t.inject(e);To=dt(function(e){return t.onCommitFiberRoot(n,e)}),ko=dt(function(e){return t.onCommitFiberUnmount(n,e)})}catch(e){}return!0}function mt(e){"function"==typeof To&&To(e)}function yt(e){"function"==typeof ko&&ko(e)}function vt(e){return{baseState:e,expirationTime:0,first:null,last:null,callbackList:null,hasForceUpdate:!1,isInitialized:!1}}function gt(e,t){null===e.last?e.first=e.last=t:(e.last.next=t,e.last=t),(0===e.expirationTime||e.expirationTime>t.expirationTime)&&(e.expirationTime=t.expirationTime)}function bt(e,t){var n=e.alternate,r=e.updateQueue;null===r&&(r=e.updateQueue=vt(null)),null!==n?(e=n.updateQueue,null===e&&(e=n.updateQueue=vt(null))):e=null,e=e!==r?e:null,null===e?gt(r,t):null===r.last||null===e.last?(gt(r,t),gt(e,t)):(gt(r,t),e.last=t)}function Tt(e,t,n,r){return e=e.partialState,"function"==typeof e?e.call(t,n,r):e}function kt(e,t,n,r,o,a){null!==e&&e.updateQueue===n&&(n=t.updateQueue={baseState:n.baseState,expirationTime:n.expirationTime,first:n.first,last:n.last,isInitialized:n.isInitialized,callbackList:null,hasForceUpdate:!1}),n.expirationTime=0,n.isInitialized?e=n.baseState:(e=n.baseState=t.memoizedState,n.isInitialized=!0);for(var l=!0,i=n.first,u=!1;null!==i;){var c=i.expirationTime;if(c>a){var s=n.expirationTime;(0===s||s>c)&&(n.expirationTime=c),u||(u=!0,n.baseState=e)}else u||(n.first=i.next,null===n.first&&(n.last=null)),i.isReplace?(e=Tt(i,r,e,o),l=!0):(c=Tt(i,r,e,o))&&(e=l?Tn({},e,c):Tn(e,c),l=!1),i.isForced&&(n.hasForceUpdate=!0),null!==i.callback&&(c=n.callbackList,null===c&&(c=n.callbackList=[]),c.push(i));i=i.next}return null!==n.callbackList?t.effectTag|=32:null!==n.first||n.hasForceUpdate||(t.updateQueue=null),u||(n.baseState=e),e}function St(e,t){var n=e.callbackList;if(null!==n)for(e.callbackList=null,e=0;ep?(d=f,f=null):d=f.sibling;var h=y(e,f,l[p],u);if(null===h){null===f&&(f=d);break}t&&f&&null===h.alternate&&n(e,f),r=i(h,r,p),null===s?c=h:s.sibling=h,s=h,f=d}if(p===l.length)return o(e,f),c;if(null===f){for(;pd?(h=p,p=null):h=p.sibling;var b=y(e,p,g.value,c);if(null===b){p||(p=h);break}t&&p&&null===b.alternate&&n(e,p),l=i(b,l,d),null===f?s=b:f.sibling=b,f=b,p=h}if(g.done)return o(e,p),s;if(null===p){for(;!g.done;d++,g=u.next())g=m(e,g.value,c),null!==g&&(l=i(g,l,d),null===f?s=g:f.sibling=g,f=g);return s}for(p=a(e,p);!g.done;d++,g=u.next())g=v(p,e,d,g.value,c),null!==g&&(t&&null!==g.alternate&&p.delete(null===g.key?d:g.key),l=i(g,l,d),null===f?s=g:f.sibling=g,f=g);return t&&p.forEach(function(t){return n(e,t)}),s}return function(e,t,a,i){var c="object"==typeof a&&null!==a;if(c)switch(a.$$typeof){case po:e:{var s=a.key;for(c=t;null!==c;){if(c.key===s){if(10===c.tag?a.type===yo:c.type===a.type){o(e,c.sibling),t=l(c,a.type===yo?a.props.children:a.props,i),t.ref=Et(c,a),t.return=e,e=t;break e}o(e,c);break}n(e,c),c=c.sibling}a.type===yo?(a=ut(a.props.children,e.internalContextTag,i,a.key),a.return=e,e=a):(i=it(a,e.internalContextTag,i),i.ref=Et(t,a),i.return=e,e=i)}return u(e);case ho:e:{for(c=a.key;null!==t;){if(t.key===c){if(7===t.tag){o(e,t.sibling),a=l(t,a,i),a.return=e,e=a;break e}o(e,t);break}n(e,t),t=t.sibling}a=st(a,e.internalContextTag,i),a.return=e,e=a}return u(e);case mo:e:{if(null!==t){if(9===t.tag){o(e,t.sibling),t=l(t,null,i),t.type=a.value,t.return=e,e=t;break e}o(e,t)}t=ft(a,e.internalContextTag,i),t.type=a.value,t.return=e,e=t}return u(e);case So:e:{for(c=a.key;null!==t;){if(t.key===c){if(4===t.tag&&t.stateNode.containerInfo===a.containerInfo&&t.stateNode.implementation===a.implementation){o(e,t.sibling),a=l(t,a.children||[],i),a.return=e,e=a;break e}o(e,t);break}n(e,t),t=t.sibling}a=pt(a,e.internalContextTag,i),a.return=e,e=a}return u(e)}if("string"==typeof a||"number"==typeof a)return a=""+a,null!==t&&6===t.tag?(o(e,t.sibling),a=l(t,a,i)):(o(e,t),a=ct(a,e.internalContextTag,i)),a.return=e,e=a,u(e);if(wo(a))return g(e,t,a,i);if(xt(a))return b(e,t,a,i);if(c&&Pt(e,a),"undefined"==typeof a)switch(e.tag){case 2:case 1:a=e.type,r("152",a.displayName||a.name||"Component")}return o(e,t)}}function _t(e,t,n,o,a){function l(e,t,n){i(e,t,n,t.expirationTime)}function i(e,t,n,r){t.child=null===e?Po(t,t.child,n,r):e.child===t.child?xo(t,t.child,n,r):Eo(t,t.child,n,r)}function u(e,t){var n=t.ref;null===n||e&&e.ref===n||(t.effectTag|=128)}function c(e,t,n,r){if(u(e,t),!n)return r&&ot(t,!1),f(e,t);n=t.stateNode,Ur.current=t;var o=n.render();return t.effectTag|=1,l(e,t,o),t.memoizedState=n.state,t.memoizedProps=n.props,r&&ot(t,!0),t.child}function s(e){var t=e.stateNode;t.pendingContext?tt(e,t.pendingContext,t.pendingContext!==t.context):t.context&&tt(e,t.context,!1),v(e,t.containerInfo)}function f(e,t){if(null!==e&&t.child!==e.child?r("153"):void 0,null!==t.child){e=t.child;var n=lt(e,e.pendingProps,e.expirationTime);for(t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,n=n.sibling=lt(e,e.pendingProps,e.expirationTime),n.return=t;n.sibling=null}return t.child}function p(e,t){switch(t.tag){case 3:s(t);break;case 2:rt(t);break;case 4:v(t,t.stateNode.containerInfo)}return null}var d=e.shouldSetTextContent,h=e.useSyncScheduling,m=e.shouldDeprioritizeSubtree,y=t.pushHostContext,v=t.pushHostContainer,g=n.enterHydrationState,b=n.resetHydrationState,T=n.tryToClaimNextHydratableInstance;e=wt(o,a,function(e,t){e.memoizedProps=t},function(e,t){e.memoizedState=t});var k=e.adoptClassInstance,S=e.constructClassInstance,w=e.mountClassInstance,C=e.updateClassInstance;return{beginWork:function(e,t,n){if(0===t.expirationTime||t.expirationTime>n)return p(e,t);switch(t.tag){case 0:null!==e?r("155"):void 0;var o=t.type,a=t.pendingProps,i=Xe(t);return i=Ze(t,i),o=o(a,i),t.effectTag|=1,"object"==typeof o&&null!==o&&"function"==typeof o.render?(t.tag=2,a=rt(t),k(t,o),w(t,n),t=c(e,t,!0,a)):(t.tag=1,l(e,t,o),t.memoizedProps=a,t=t.child),t;case 1:e:{if(a=t.type,n=t.pendingProps,o=t.memoizedProps,go.current)null===n&&(n=o);else if(null===n||o===n){t=f(e,t);break e}o=Xe(t),o=Ze(t,o),a=a(n,o),t.effectTag|=1,l(e,t,a),t.memoizedProps=n,t=t.child}return t;case 2:return a=rt(t),o=void 0,null===e?t.stateNode?r("153"):(S(t,t.pendingProps),w(t,n),o=!0):o=C(e,t,n),c(e,t,o,a);case 3:return s(t),a=t.updateQueue,null!==a?(o=t.memoizedState,a=kt(e,t,a,null,null,n),o===a?(b(),t=f(e,t)):(o=a.element,i=t.stateNode,(null===e||null===e.child)&&i.hydrate&&g(t)?(t.effectTag|=2,t.child=Po(t,t.child,o,n)):(b(),l(e,t,o)),t.memoizedState=a,t=t.child)):(b(),t=f(e,t)),t;case 5:y(t),null===e&&T(t),a=t.type;var x=t.memoizedProps;return o=t.pendingProps,null===o&&(o=x,null===o?r("154"):void 0),i=null!==e?e.memoizedProps:null,go.current||null!==o&&x!==o?(x=o.children,d(a,o)?x=null:i&&d(a,i)&&(t.effectTag|=16),u(e,t),2147483647!==n&&!h&&m(a,o)?(t.expirationTime=2147483647,t=null):(l(e,t,x),t.memoizedProps=o,t=t.child)):t=f(e,t),t;case 6:return null===e&&T(t),e=t.pendingProps,null===e&&(e=t.memoizedProps),t.memoizedProps=e,null;case 8:t.tag=7;case 7:return a=t.pendingProps,go.current?null===a&&(a=e&&e.memoizedProps,null===a?r("154"):void 0):null!==a&&t.memoizedProps!==a||(a=t.memoizedProps),o=a.children,t.stateNode=null===e?Po(t,t.stateNode,o,n):e.child===t.child?xo(t,t.stateNode,o,n):Eo(t,t.stateNode,o,n),t.memoizedProps=a,t.stateNode;case 9:return null;case 4:e:{if(v(t,t.stateNode.containerInfo),a=t.pendingProps,go.current)null===a&&(a=e&&e.memoizedProps,null==a?r("154"):void 0);else if(null===a||t.memoizedProps===a){t=f(e,t);break e}null===e?t.child=Eo(t,t.child,a,n):l(e,t,a),t.memoizedProps=a,t=t.child}return t;case 10:e:{if(n=t.pendingProps,go.current)null===n&&(n=t.memoizedProps);else if(null===n||t.memoizedProps===n){t=f(e,t);break e}l(e,t,n),t.memoizedProps=n,t=t.child}return t;default:r("156")}},beginFailedWork:function(e,t,n){switch(t.tag){case 2:rt(t);break;case 3:s(t);break;default:r("157")}return t.effectTag|=64,null===e?t.child=null:t.child!==e.child&&(t.child=e.child),0===t.expirationTime||t.expirationTime>n?p(e,t):(t.firstEffect=null,t.lastEffect=null,i(e,t,null,n),2===t.tag&&(e=t.stateNode,t.memoizedProps=e.props,t.memoizedState=e.state),t.child)}}}function It(e,t,n){function o(e){e.effectTag|=4}var a=e.createInstance,l=e.createTextInstance,i=e.appendInitialChild,u=e.finalizeInitialChildren,c=e.prepareUpdate,s=e.persistence,f=t.getRootHostContainer,p=t.popHostContext,d=t.getHostContext,h=t.popHostContainer,m=n.prepareToHydrateHostInstance,y=n.prepareToHydrateHostTextInstance,v=n.popHydrationState,g=void 0,b=void 0,T=void 0;return e.mutation?(g=function(){},b=function(e,t,n){(t.updateQueue=n)&&o(t)},T=function(e,t,n,r){n!==r&&o(t)}):r(s?"235":"236"),{completeWork:function(e,t,n){var s=t.pendingProps;switch(null===s?s=t.memoizedProps:2147483647===t.expirationTime&&2147483647!==n||(t.pendingProps=null),t.tag){case 1:return null;case 2: 3 | return et(t),null;case 3:return h(t),Ge(go,t),Ge(vo,t),s=t.stateNode,s.pendingContext&&(s.context=s.pendingContext,s.pendingContext=null),null!==e&&null!==e.child||(v(t),t.effectTag&=-3),g(t),null;case 5:p(t),n=f();var k=t.type;if(null!==e&&null!=t.stateNode){var S=e.memoizedProps,w=t.stateNode,C=d();w=c(w,k,S,s,n,C),b(e,t,w,k,S,s,n),e.ref!==t.ref&&(t.effectTag|=128)}else{if(!s)return null===t.stateNode?r("166"):void 0,null;if(e=d(),v(t))m(t,n,e)&&o(t);else{e=a(k,s,n,e,t);e:for(S=t.child;null!==S;){if(5===S.tag||6===S.tag)i(e,S.stateNode);else if(4!==S.tag&&null!==S.child){S.child.return=S,S=S.child;continue}if(S===t)break;for(;null===S.sibling;){if(null===S.return||S.return===t)break e;S=S.return}S.sibling.return=S.return,S=S.sibling}u(e,k,s,n)&&o(t),t.stateNode=e}null!==t.ref&&(t.effectTag|=128)}return null;case 6:if(e&&null!=t.stateNode)T(e,t,e.memoizedProps,s);else{if("string"!=typeof s)return null===t.stateNode?r("166"):void 0,null;e=f(),n=d(),v(t)?y(t)&&o(t):t.stateNode=l(s,e,n,t)}return null;case 7:(s=t.memoizedProps)?void 0:r("165"),t.tag=8,k=[];e:for((S=t.stateNode)&&(S.return=t);null!==S;){if(5===S.tag||6===S.tag||4===S.tag)r("247");else if(9===S.tag)k.push(S.type);else if(null!==S.child){S.child.return=S,S=S.child;continue}for(;null===S.sibling;){if(null===S.return||S.return===t)break e;S=S.return}S.sibling.return=S.return,S=S.sibling}return S=s.handler,s=S(s.props,k),t.child=xo(t,null!==e?e.child:null,s,n),t.child;case 8:return t.tag=7,null;case 9:return null;case 10:return null;case 4:return h(t),g(t),null;case 0:r("167");default:r("156")}}}}function Nt(e,t){function n(e){var n=e.ref;if(null!==n)try{n(null)}catch(n){t(e,n)}}function o(e){switch("function"==typeof yt&&yt(e),e.tag){case 2:n(e);var r=e.stateNode;if("function"==typeof r.componentWillUnmount)try{r.props=e.memoizedProps,r.state=e.memoizedState,r.componentWillUnmount()}catch(n){t(e,n)}break;case 5:n(e);break;case 7:a(e.stateNode);break;case 4:c&&i(e)}}function a(e){for(var t=e;;)if(o(t),null===t.child||c&&4===t.tag){if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return;t=t.return}t.sibling.return=t.return,t=t.sibling}else t.child.return=t,t=t.child}function l(e){return 5===e.tag||3===e.tag||4===e.tag}function i(e){for(var t=e,n=!1,l=void 0,i=void 0;;){if(!n){n=t.return;e:for(;;){switch(null===n?r("160"):void 0,n.tag){case 5:l=n.stateNode,i=!1;break e;case 3:l=n.stateNode.containerInfo,i=!0;break e;case 4:l=n.stateNode.containerInfo,i=!0;break e}n=n.return}n=!0}if(5===t.tag||6===t.tag)a(t),i?b(l,t.stateNode):g(l,t.stateNode);else if(4===t.tag?l=t.stateNode.containerInfo:o(t),null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return;t=t.return,4===t.tag&&(n=!1)}t.sibling.return=t.return,t=t.sibling}}var u=e.getPublicInstance,c=e.mutation;e=e.persistence,c||r(e?"235":"236");var s=c.commitMount,f=c.commitUpdate,p=c.resetTextContent,d=c.commitTextUpdate,h=c.appendChild,m=c.appendChildToContainer,y=c.insertBefore,v=c.insertInContainerBefore,g=c.removeChild,b=c.removeChildFromContainer;return{commitResetTextContent:function(e){p(e.stateNode)},commitPlacement:function(e){e:{for(var t=e.return;null!==t;){if(l(t)){var n=t;break e}t=t.return}r("160"),n=void 0}var o=t=void 0;switch(n.tag){case 5:t=n.stateNode,o=!1;break;case 3:t=n.stateNode.containerInfo,o=!0;break;case 4:t=n.stateNode.containerInfo,o=!0;break;default:r("161")}16&n.effectTag&&(p(t),n.effectTag&=-17);e:t:for(n=e;;){for(;null===n.sibling;){if(null===n.return||l(n.return)){n=null;break e}n=n.return}for(n.sibling.return=n.return,n=n.sibling;5!==n.tag&&6!==n.tag;){if(2&n.effectTag)continue t;if(null===n.child||4===n.tag)continue t;n.child.return=n,n=n.child}if(!(2&n.effectTag)){n=n.stateNode;break e}}for(var a=e;;){if(5===a.tag||6===a.tag)n?o?v(t,a.stateNode,n):y(t,a.stateNode,n):o?m(t,a.stateNode):h(t,a.stateNode);else if(4!==a.tag&&null!==a.child){a.child.return=a,a=a.child;continue}if(a===e)break;for(;null===a.sibling;){if(null===a.return||a.return===e)return;a=a.return}a.sibling.return=a.return,a=a.sibling}},commitDeletion:function(e){i(e),e.return=null,e.child=null,e.alternate&&(e.alternate.child=null,e.alternate.return=null)},commitWork:function(e,t){switch(t.tag){case 2:break;case 5:var n=t.stateNode;if(null!=n){var o=t.memoizedProps;e=null!==e?e.memoizedProps:o;var a=t.type,l=t.updateQueue;t.updateQueue=null,null!==l&&f(n,l,a,e,o,t)}break;case 6:null===t.stateNode?r("162"):void 0,n=t.memoizedProps,d(t.stateNode,null!==e?e.memoizedProps:n,n);break;case 3:break;default:r("163")}},commitLifeCycles:function(e,t){switch(t.tag){case 2:var n=t.stateNode;if(4&t.effectTag)if(null===e)n.props=t.memoizedProps,n.state=t.memoizedState,n.componentDidMount();else{var o=e.memoizedProps;e=e.memoizedState,n.props=t.memoizedProps,n.state=t.memoizedState,n.componentDidUpdate(o,e)}t=t.updateQueue,null!==t&&St(t,n);break;case 3:n=t.updateQueue,null!==n&&St(n,null!==t.child?t.child.stateNode:null);break;case 5:n=t.stateNode,null===e&&4&t.effectTag&&s(n,t.type,t.memoizedProps,t);break;case 6:break;case 4:break;default:r("163")}},commitAttachRef:function(e){var t=e.ref;if(null!==t){var n=e.stateNode;switch(e.tag){case 5:t(u(n));break;default:t(n)}}},commitDetachRef:function(e){e=e.ref,null!==e&&e(null)}}}function Rt(e){function t(e){return e===Oo?r("174"):void 0,e}var n=e.getChildHostContext,o=e.getRootHostContext,a={current:Oo},l={current:Oo},i={current:Oo};return{getHostContext:function(){return t(a.current)},getRootHostContainer:function(){return t(i.current)},popHostContainer:function(e){Ge(a,e),Ge(l,e),Ge(i,e)},popHostContext:function(e){l.current===e&&(Ge(a,e),Ge(l,e))},pushHostContainer:function(e,t){Ye(i,t,e),t=o(t),Ye(l,e,e),Ye(a,t,e)},pushHostContext:function(e){var r=t(i.current),o=t(a.current);r=n(o,e.type,r),o!==r&&(Ye(l,e,e),Ye(a,r,e))},resetHostContainer:function(){a.current=Oo,i.current=Oo}}}function Mt(e){function t(e,t){var n=new at(5,null,0);n.type="DELETED",n.stateNode=t,n.return=e,n.effectTag=8,null!==e.lastEffect?(e.lastEffect.nextEffect=n,e.lastEffect=n):e.firstEffect=e.lastEffect=n}function n(e,t){switch(e.tag){case 5:return t=l(t,e.type,e.pendingProps),null!==t&&(e.stateNode=t,!0);case 6:return t=i(t,e.pendingProps),null!==t&&(e.stateNode=t,!0);default:return!1}}function o(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag;)e=e.return;p=e}var a=e.shouldSetTextContent;if(e=e.hydration,!e)return{enterHydrationState:function(){return!1},resetHydrationState:function(){},tryToClaimNextHydratableInstance:function(){},prepareToHydrateHostInstance:function(){r("175")},prepareToHydrateHostTextInstance:function(){r("176")},popHydrationState:function(){return!1}};var l=e.canHydrateInstance,i=e.canHydrateTextInstance,u=e.getNextHydratableSibling,c=e.getFirstHydratableChild,s=e.hydrateInstance,f=e.hydrateTextInstance,p=null,d=null,h=!1;return{enterHydrationState:function(e){return d=c(e.stateNode.containerInfo),p=e,h=!0},resetHydrationState:function(){d=p=null,h=!1},tryToClaimNextHydratableInstance:function(e){if(h){var r=d;if(r){if(!n(e,r)){if(r=u(r),!r||!n(e,r))return e.effectTag|=2,h=!1,void(p=e);t(p,d)}p=e,d=c(r)}else e.effectTag|=2,h=!1,p=e}},prepareToHydrateHostInstance:function(e,t,n){return t=s(e.stateNode,e.type,e.memoizedProps,t,n,e),e.updateQueue=t,null!==t},prepareToHydrateHostTextInstance:function(e){return f(e.stateNode,e.memoizedProps,e)},popHydrationState:function(e){if(e!==p)return!1;if(!h)return o(e),h=!0,!1;var n=e.type;if(5!==e.tag||"head"!==n&&"body"!==n&&!a(n,e.memoizedProps))for(n=d;n;)t(e,n),n=u(n);return o(e),d=p?u(e.stateNode):null,!0}}}function Dt(e){function t(e){re=$=!0;var t=e.stateNode;if(t.current===e?r("177"):void 0,t.isReadyForCommit=!1,Ur.current=null,1l.expirationTime)&&(a=l.expirationTime),l=l.sibling;o.expirationTime=a}if(null!==t)return t;if(null!==n&&(null===n.firstEffect&&(n.firstEffect=e.firstEffect),null!==e.lastEffect&&(null!==n.lastEffect&&(n.lastEffect.nextEffect=e.firstEffect),n.lastEffect=e.lastEffect),1e))if(Y<=K)for(;null!==Q;)Q=c(Q)?a(Q):o(Q);else for(;null!==Q&&!k();)Q=c(Q)?a(Q):o(Q)}else if(!(0===Y||Y>e))if(Y<=K)for(;null!==Q;)Q=o(Q);else for(;null!==Q&&!k();)Q=o(Q)}function i(e,t){if($?r("243"):void 0,$=!0,e.isReadyForCommit=!1,e!==G||t!==Y||null===Q){for(;-1t)&&(e.expirationTime=t),null!==e.alternate&&(0===e.alternate.expirationTime||e.alternate.expirationTime>t)&&(e.alternate.expirationTime=t),null===e.return){if(3!==e.tag)break;var n=e.stateNode;!$&&n===G&&t<=Y&&(Q=G=null,Y=0);var o=t;if(ge>ve&&r("185"),null===n.nextScheduledRoot)n.remainingExpirationTime=o,null===le?(ae=le=n,n.nextScheduledRoot=n):(le=le.nextScheduledRoot=n,le.nextScheduledRoot=ae);else{var a=n.remainingExpirationTime;(0===a||obe)&&(fe=!0)}function S(e){null===ce?r("246"):void 0,ce.remainingExpirationTime=0,pe||(pe=!0,de=e)}var w=Rt(e),C=Mt(e),x=w.popHostContainer,E=w.popHostContext,P=w.resetHostContainer,O=_t(e,w,C,d,p),_=O.beginWork,I=O.beginFailedWork,N=It(e,w,C).completeWork;w=Nt(e,u);var R=w.commitResetTextContent,M=w.commitPlacement,D=w.commitDeletion,L=w.commitWork,j=w.commitLifeCycles,A=w.commitAttachRef,H=w.commitDetachRef,F=e.now,U=e.scheduleDeferredCallback,V=e.useSyncScheduling,z=e.prepareForCommit,B=e.resetAfterCommit,W=F(),K=2,q=0,$=!1,Q=null,G=null,Y=0,X=null,Z=null,J=null,ee=null,te=null,ne=!1,re=!1,oe=!1,ae=null,le=null,ie=!1,ue=!1,ce=null,se=0,fe=!1,pe=!1,de=null,he=null,me=!1,ye=!1,ve=1e3,ge=0,be=1;return{computeAsyncExpiration:f,computeExpirationForFiber:p,scheduleWork:d,batchedUpdates:function(e,t){var n=me;me=!0;try{return e(t)}finally{(me=n)||ue||b(1,null)}},unbatchedUpdates:function(e){if(me&&!ye){ye=!0;try{return e()}finally{ye=!1}}return e()},flushSync:function(e){var t=me;me=!0;try{e:{var n=q;q=1;try{var o=e();break e}finally{q=n}o=void 0}return o}finally{me=t,ue?r("187"):void 0,b(1,null)}},deferredUpdates:function(e){var t=q;q=f();try{return e()}finally{q=t}}}}function Lt(e){function t(e){return e=Ee(e),null===e?null:e.stateNode}var n=e.getPublicInstance;e=Dt(e);var o=e.computeAsyncExpiration,a=e.computeExpirationForFiber,l=e.scheduleWork;return{createContainer:function(e,t){var n=new at(3,null,0);return e={current:n,containerInfo:e,pendingChildren:null,remainingExpirationTime:0,isReadyForCommit:!1,finishedWork:null,context:null,pendingContext:null,hydrate:t,nextScheduledRoot:null},n.stateNode=e},updateContainer:function(e,t,n,i){var u=t.current;if(n){n=n._reactInternalFiber;var c;e:{for(2===Se(n)&&2===n.tag?void 0:r("170"),c=n;3!==c.tag;){if(Je(c)){c=c.stateNode.__reactInternalMemoizedMergedChildContext;break e}(c=c.return)?void 0:r("171")}c=c.stateNode.context}n=Je(n)?nt(n,c):c}else n=Pn;null===t.context?t.context=n:t.pendingContext=n,t=i,t=void 0===t?null:t,i=null!=e&&null!=e.type&&null!=e.type.prototype&&!0===e.type.prototype.unstable_isAsyncReactComponent?o():a(u),bt(u,{expirationTime:i,partialState:{element:e},callback:t,isReplace:!1,isForced:!1,nextCallback:null,next:null}),l(u,i)},batchedUpdates:e.batchedUpdates,unbatchedUpdates:e.unbatchedUpdates,deferredUpdates:e.deferredUpdates,flushSync:e.flushSync,getPublicRootInstance:function(e){if(e=e.current,!e.child)return null;switch(e.child.tag){case 5:return n(e.child.stateNode);default:return e.child.stateNode}},findHostInstance:t,findHostInstanceWithNoPortals:function(e){return e=Pe(e),null===e?null:e.stateNode},injectIntoDevTools:function(e){var n=e.findFiberByHostInstance;return ht(Tn({},e,{findHostInstanceByFiber:function(e){return t(e)},findFiberByHostInstance:function(e){return n?n(e):null}}))}}}function jt(e){return!!qo.hasOwnProperty(e)||!Ko.hasOwnProperty(e)&&(Wo.test(e)?qo[e]=!0:(Ko[e]=!0,!1))}function At(e,t,n){var r=l(t);if(r&&a(t,n)){var o=r.mutationMethod;o?o(e,n):null==n||r.hasBooleanValue&&!n||r.hasNumericValue&&isNaN(n)||r.hasPositiveNumericValue&&1>n||r.hasOverloadedBooleanValue&&!1===n?Ft(e,t):r.mustUseProperty?e[r.propertyName]=n:(t=r.attributeName,(o=r.attributeNamespace)?e.setAttributeNS(o,t,""+n):r.hasBooleanValue||r.hasOverloadedBooleanValue&&!0===n?e.setAttribute(t,""):e.setAttribute(t,""+n))}else Ht(e,t,a(t,n)?n:null)}function Ht(e,t,n){jt(t)&&(null==n?e.removeAttribute(t):e.setAttribute(t,""+n))}function Ft(e,t){var n=l(t);n?(t=n.mutationMethod)?t(e,void 0):n.mustUseProperty?e[n.propertyName]=!n.hasBooleanValue&&"":e.removeAttribute(n.attributeName):e.removeAttribute(t)}function Ut(e,t){var n=t.value,r=t.checked;return Tn({type:void 0,step:void 0,min:void 0,max:void 0},t,{defaultChecked:void 0,defaultValue:void 0,value:null!=n?n:e._wrapperState.initialValue,checked:null!=r?r:e._wrapperState.initialChecked})}function Vt(e,t){var n=t.defaultValue;e._wrapperState={initialChecked:null!=t.checked?t.checked:t.defaultChecked,initialValue:null!=t.value?t.value:n,controlled:"checkbox"===t.type||"radio"===t.type?null!=t.checked:null!=t.value}}function zt(e,t){var n=t.checked;null!=n&&At(e,"checked",n||!1),n=t.value,null!=n?0===n&&""===e.value?e.value="0":"number"===t.type?(t=parseFloat(e.value)||0,(n!=t||n==t&&e.value!=n)&&(e.value=""+n)):e.value!==""+n&&(e.value=""+n):(null==t.value&&null!=t.defaultValue&&e.defaultValue!==""+t.defaultValue&&(e.defaultValue=""+t.defaultValue),null==t.checked&&null!=t.defaultChecked&&(e.defaultChecked=!!t.defaultChecked))}function Bt(e,t){switch(t.type){case"submit":case"reset":break;case"color":case"date":case"datetime":case"datetime-local":case"month":case"time":case"week":e.value="",e.value=e.defaultValue;break;default:e.value=e.value}t=e.name,""!==t&&(e.name=""),e.defaultChecked=!e.defaultChecked,e.defaultChecked=!e.defaultChecked,""!==t&&(e.name=t)}function Wt(e){var t="";return gn.Children.forEach(e,function(e){null==e||"string"!=typeof e&&"number"!=typeof e||(t+=e)}),t}function Kt(e,t){return e=Tn({children:void 0},t),(t=Wt(t.children))&&(e.children=t),e}function qt(e,t,n,r){if(e=e.options,t){t={};for(var o=0;o=t.length?void 0:r("93"),t=t[0]),n=""+t),null==n&&(n=""),o=n),e._wrapperState={initialValue:""+o}}function Yt(e,t){var n=t.value;null!=n&&(n=""+n,n!==e.value&&(e.value=n),null==t.defaultValue&&(e.defaultValue=n)),null!=t.defaultValue&&(e.defaultValue=t.defaultValue)}function Xt(e){var t=e.textContent;t===e._wrapperState.initialValue&&(e.value=t)}function Zt(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function Jt(e,t){return null==e||"http://www.w3.org/1999/xhtml"===e?Zt(t):"http://www.w3.org/2000/svg"===e&&"foreignObject"===t?"http://www.w3.org/1999/xhtml":e}function en(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t}function tn(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=0===n.indexOf("--"),o=n,a=t[n];o=null==a||"boolean"==typeof a||""===a?"":r||"number"!=typeof a||0===a||Zo.hasOwnProperty(o)&&Zo[o]?(""+a).trim():a+"px","float"===n&&(n="cssFloat"),r?e.setProperty(n,o):e[n]=o}}function nn(e,t,n){t&&(ea[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML?r("137",e,n()):void 0),null!=t.dangerouslySetInnerHTML&&(null!=t.children?r("60"):void 0,"object"==typeof t.dangerouslySetInnerHTML&&"__html"in t.dangerouslySetInnerHTML?void 0:r("61")),null!=t.style&&"object"!=typeof t.style?r("62",n()):void 0)}function rn(e,t){if(-1===e.indexOf("-"))return"string"==typeof t.is;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}function on(e,t){e=9===e.nodeType||11===e.nodeType?e:e.ownerDocument;var n=Le(e);t=Gn[t];for(var r=0;r",e=e.removeChild(e.firstChild)):e="string"==typeof t.is?n.createElement(e,{is:t.is}):n.createElement(e):e=n.createElementNS(r,e),e}function ln(e,t){return(9===t.nodeType?t:t.ownerDocument).createTextNode(e)}function un(e,t,n,r){var o=rn(t,n);switch(t){case"iframe":case"object":Ie("topLoad","load",e);var a=n;break;case"video":case"audio":for(a in ra)ra.hasOwnProperty(a)&&Ie(a,ra[a],e);a=n;break;case"source":Ie("topError","error",e),a=n;break;case"img":case"image":Ie("topError","error",e),Ie("topLoad","load",e),a=n;break;case"form":Ie("topReset","reset",e),Ie("topSubmit","submit",e),a=n;break;case"details":Ie("topToggle","toggle",e),a=n;break;case"input":Vt(e,n),a=Ut(e,n),Ie("topInvalid","invalid",e),on(r,"onChange");break;case"option":a=Kt(e,n);break;case"select":$t(e,n),a=Tn({},n,{value:void 0}),Ie("topInvalid","invalid",e),on(r,"onChange");break;case"textarea":Gt(e,n),a=Qt(e,n),Ie("topInvalid","invalid",e),on(r,"onChange");break;default:a=n}nn(t,a,na);var l,i=a;for(l in i)if(i.hasOwnProperty(l)){var u=i[l];"style"===l?tn(e,u,na):"dangerouslySetInnerHTML"===l?(u=u?u.__html:void 0,null!=u&&Go(e,u)):"children"===l?"string"==typeof u?("textarea"!==t||""!==u)&&Xo(e,u):"number"==typeof u&&Xo(e,""+u):"suppressContentEditableWarning"!==l&&"suppressHydrationWarning"!==l&&"autoFocus"!==l&&(Qn.hasOwnProperty(l)?null!=u&&on(r,l):o?Ht(e,l,u):null!=u&&At(e,l,u))}switch(t){case"input":ae(e),Bt(e,n);break;case"textarea":ae(e),Xt(e,n);break;case"option":null!=n.value&&e.setAttribute("value",n.value);break;case"select":e.multiple=!!n.multiple,t=n.value,null!=t?qt(e,!!n.multiple,t,!1):null!=n.defaultValue&&qt(e,!!n.multiple,n.defaultValue,!0);break;default:"function"==typeof a.onClick&&(e.onclick=kn)}}function cn(e,t,n,r,o){var a=null;switch(t){case"input":n=Ut(e,n),r=Ut(e,r),a=[];break;case"option":n=Kt(e,n),r=Kt(e,r),a=[];break;case"select":n=Tn({},n,{value:void 0}),r=Tn({},r,{value:void 0}),a=[];break;case"textarea":n=Qt(e,n),r=Qt(e,r),a=[];break;default:"function"!=typeof n.onClick&&"function"==typeof r.onClick&&(e.onclick=kn)}nn(t,r,na);var l,i;e=null;for(l in n)if(!r.hasOwnProperty(l)&&n.hasOwnProperty(l)&&null!=n[l])if("style"===l)for(i in t=n[l])t.hasOwnProperty(i)&&(e||(e={}),e[i]="");else"dangerouslySetInnerHTML"!==l&&"children"!==l&&"suppressContentEditableWarning"!==l&&"suppressHydrationWarning"!==l&&"autoFocus"!==l&&(Qn.hasOwnProperty(l)?a||(a=[]):(a=a||[]).push(l,null));for(l in r){var u=r[l];if(t=null!=n?n[l]:void 0,r.hasOwnProperty(l)&&u!==t&&(null!=u||null!=t))if("style"===l)if(t){for(i in t)!t.hasOwnProperty(i)||u&&u.hasOwnProperty(i)||(e||(e={}),e[i]="");for(i in u)u.hasOwnProperty(i)&&t[i]!==u[i]&&(e||(e={}),e[i]=u[i])}else e||(a||(a=[]),a.push(l,e)),e=u;else"dangerouslySetInnerHTML"===l?(u=u?u.__html:void 0,t=t?t.__html:void 0,null!=u&&t!==u&&(a=a||[]).push(l,""+u)):"children"===l?t===u||"string"!=typeof u&&"number"!=typeof u||(a=a||[]).push(l,""+u):"suppressContentEditableWarning"!==l&&"suppressHydrationWarning"!==l&&(Qn.hasOwnProperty(l)?(null!=u&&on(o,l),a||t===u||(a=[])):(a=a||[]).push(l,u))}return e&&(a=a||[]).push("style",e),a}function sn(e,t,n,r,o){rn(n,r),r=rn(n,o);for(var a=0;a=u.hasBooleanValue+u.hasNumericValue+u.hasOverloadedBooleanValue?void 0:r("50",i),l.hasOwnProperty(i)&&(u.attributeName=l[i]),a.hasOwnProperty(i)&&(u.attributeNamespace=a[i]),e.hasOwnProperty(i)&&(u.mutationMethod=e[i]),In[i]=u}}},In={},Nn=_n,Rn=Nn.MUST_USE_PROPERTY,Mn=Nn.HAS_BOOLEAN_VALUE,Dn=Nn.HAS_NUMERIC_VALUE,Ln=Nn.HAS_POSITIVE_NUMERIC_VALUE,jn=Nn.HAS_OVERLOADED_BOOLEAN_VALUE,An=Nn.HAS_STRING_BOOLEAN_VALUE,Hn={Properties:{allowFullScreen:Mn,async:Mn,autoFocus:Mn,autoPlay:Mn,capture:jn,checked:Rn|Mn,cols:Ln,contentEditable:An,controls:Mn,default:Mn,defer:Mn,disabled:Mn,download:jn,draggable:An,formNoValidate:Mn,hidden:Mn,loop:Mn,multiple:Rn|Mn,muted:Rn|Mn,noValidate:Mn,open:Mn,playsInline:Mn,readOnly:Mn,required:Mn,reversed:Mn,rows:Ln,rowSpan:Dn,scoped:Mn,seamless:Mn,selected:Rn|Mn,size:Ln,start:Dn,span:Ln,spellCheck:An,style:0,tabIndex:0,itemScope:Mn,acceptCharset:0,className:0,htmlFor:0,httpEquiv:0,value:An},DOMAttributeNames:{acceptCharset:"accept-charset",className:"class",htmlFor:"for",httpEquiv:"http-equiv"},DOMMutationMethods:{value:function(e,t){return null==t?e.removeAttribute("value"):void("number"!==e.type||!1===e.hasAttribute("value")?e.setAttribute("value",""+t):e.validity&&!e.validity.badInput&&e.ownerDocument.activeElement!==e&&e.setAttribute("value",""+t))}}},Fn=Nn.HAS_STRING_BOOLEAN_VALUE,Un={xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace"},Vn={Properties:{autoReverse:Fn,externalResourcesRequired:Fn,preserveAlpha:Fn},DOMAttributeNames:{autoReverse:"autoReverse",externalResourcesRequired:"externalResourcesRequired",preserveAlpha:"preserveAlpha"},DOMAttributeNamespaces:{xlinkActuate:Un.xlink,xlinkArcrole:Un.xlink,xlinkHref:Un.xlink,xlinkRole:Un.xlink,xlinkShow:Un.xlink,xlinkTitle:Un.xlink,xlinkType:Un.xlink,xmlBase:Un.xml,xmlLang:Un.xml,xmlSpace:Un.xml}},zn=/[\-\:]([a-z])/g;"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode x-height xlink:actuate xlink:arcrole xlink:href xlink:role xlink:show xlink:title xlink:type xml:base xmlns:xlink xml:lang xml:space".split(" ").forEach(function(e){var t=e.replace(zn,i);Vn.Properties[t]=0,Vn.DOMAttributeNames[t]=e}),Nn.injectDOMPropertyConfig(Hn),Nn.injectDOMPropertyConfig(Vn); 4 | var Bn={_caughtError:null,_hasCaughtError:!1,_rethrowError:null,_hasRethrowError:!1,injection:{injectErrorUtils:function(e){"function"!=typeof e.invokeGuardedCallback?r("197"):void 0,u=e.invokeGuardedCallback}},invokeGuardedCallback:function(e,t,n,r,o,a,l,i,c){u.apply(Bn,arguments)},invokeGuardedCallbackAndCatchFirstError:function(e,t,n,r,o,a,l,i,u){if(Bn.invokeGuardedCallback.apply(this,arguments),Bn.hasCaughtError()){var c=Bn.clearCaughtError();Bn._hasRethrowError||(Bn._hasRethrowError=!0,Bn._rethrowError=c)}},rethrowCaughtError:function(){return c.apply(Bn,arguments)},hasCaughtError:function(){return Bn._hasCaughtError},clearCaughtError:function(){if(Bn._hasCaughtError){var e=Bn._caughtError;return Bn._caughtError=null,Bn._hasCaughtError=!1,e}r("198")}},Wn=null,Kn={},qn=[],$n={},Qn={},Gn={},Yn=Object.freeze({plugins:qn,eventNameDispatchConfigs:$n,registrationNameModules:Qn,registrationNameDependencies:Gn,possibleRegistrationNames:null,injectEventPluginOrder:p,injectEventPluginsByName:d}),Xn=null,Zn=null,Jn=null,er=null,tr={injectEventPluginOrder:p,injectEventPluginsByName:d},nr=Object.freeze({injection:tr,getListener:T,extractEvents:k,enqueueEvents:S,processEventQueue:w}),rr=Math.random().toString(36).slice(2),or="__reactInternalInstance$"+rr,ar="__reactEventHandlers$"+rr,lr=Object.freeze({precacheFiberNode:function(e,t){t[or]=e},getClosestInstanceFromNode:C,getInstanceFromNode:function(e){return e=e[or],!e||5!==e.tag&&6!==e.tag?null:e},getNodeFromInstance:x,getFiberCurrentPropsFromNode:E,updateFiberProps:function(e,t){e[ar]=t}}),ir=Object.freeze({accumulateTwoPhaseDispatches:D,accumulateTwoPhaseDispatchesSkipTarget:function(e){y(e,N)},accumulateEnterLeaveDispatches:L,accumulateDirectDispatches:function(e){y(e,M)}}),ur=null,cr={_root:null,_startText:null,_fallbackText:null},sr="dispatchConfig _targetInst nativeEvent isDefaultPrevented isPropagationStopped _dispatchListeners _dispatchInstances".split(" "),fr={type:null,target:null,currentTarget:kn.thatReturnsNull,eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null};Tn(F.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=kn.thatReturnsTrue)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=kn.thatReturnsTrue)},persist:function(){this.isPersistent=kn.thatReturnsTrue},isPersistent:kn.thatReturnsFalse,destructor:function(){var e,t=this.constructor.Interface;for(e in t)this[e]=null;for(t=0;t=parseInt(yr.version(),10))}var vr,gr=mr,br=bn.canUseDOM&&(!dr||hr&&8=hr),Tr=String.fromCharCode(32),kr={beforeInput:{phasedRegistrationNames:{bubbled:"onBeforeInput",captured:"onBeforeInputCapture"},dependencies:["topCompositionEnd","topKeyPress","topTextInput","topPaste"]},compositionEnd:{phasedRegistrationNames:{bubbled:"onCompositionEnd",captured:"onCompositionEndCapture"},dependencies:"topBlur topCompositionEnd topKeyDown topKeyPress topKeyUp topMouseDown".split(" ")},compositionStart:{phasedRegistrationNames:{bubbled:"onCompositionStart",captured:"onCompositionStartCapture"},dependencies:"topBlur topCompositionStart topKeyDown topKeyPress topKeyUp topMouseDown".split(" ")},compositionUpdate:{phasedRegistrationNames:{bubbled:"onCompositionUpdate",captured:"onCompositionUpdateCapture"},dependencies:"topBlur topCompositionUpdate topKeyDown topKeyPress topKeyUp topMouseDown".split(" ")}},Sr=!1,wr=!1,Cr={eventTypes:kr,extractEvents:function(e,t,n,r){var o;if(dr)e:{switch(e){case"topCompositionStart":var a=kr.compositionStart;break e;case"topCompositionEnd":a=kr.compositionEnd;break e;case"topCompositionUpdate":a=kr.compositionUpdate;break e}a=void 0}else wr?K(e,n)&&(a=kr.compositionEnd):"topKeyDown"===e&&229===n.keyCode&&(a=kr.compositionStart);return a?(br&&(wr||a!==kr.compositionStart?a===kr.compositionEnd&&wr&&(o=A()):(cr._root=r,cr._startText=H(),wr=!0)),a=B.getPooled(a,t,n,r),o?a.data=o:(o=q(n),null!==o&&(a.data=o)),D(a),o=a):o=null,(e=gr?$(e,n):Q(e,n))?(t=W.getPooled(kr.beforeInput,t,n,r),t.data=e,D(t)):t=null,[o,t]}},xr=null,Er=null,Pr=null,Or={injectFiberControlledHostComponent:function(e){xr=e}},_r=Object.freeze({injection:Or,enqueueStateRestore:Y,restoreStateIfNeeded:X}),Ir=!1,Nr={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};bn.canUseDOM&&(vr=document.implementation&&document.implementation.hasFeature&&!0!==document.implementation.hasFeature("",""));var Rr={change:{phasedRegistrationNames:{bubbled:"onChange",captured:"onChangeCapture"},dependencies:"topBlur topChange topClick topFocus topInput topKeyDown topKeyUp topSelectionChange".split(" ")}},Mr=null,Dr=null,Lr=!1;bn.canUseDOM&&(Lr=ne("input")&&(!document.documentMode||9=document.documentMode,Jr={select:{phasedRegistrationNames:{bubbled:"onSelect",captured:"onSelectCapture"},dependencies:"topBlur topContextMenu topFocus topKeyDown topKeyUp topMouseDown topMouseUp topSelectionChange".split(" ")}},eo=null,to=null,no=null,ro=!1,oo={eventTypes:Jr,extractEvents:function(e,t,n,r){var o,a=r.window===r?r.document:9===r.nodeType?r:r.ownerDocument;if(!(o=!a)){e:{a=Le(a),o=Gn.onSelect;for(var l=0;lt&&(t=8),Vo=t"+t+"",t=Qo.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}}),Yo=/["'&<>]/;bn.canUseDOM&&("textContent"in document.documentElement||(en=function(e,t){if(3===e.nodeType)e.nodeValue=t;else{if("boolean"==typeof t||"number"==typeof t)t=""+t;else{t=""+t;var n=Yo.exec(t);if(n){var r,o="",a=0;for(r=n.index;rr&&(o=r,r=e,e=o),o=Ae(n,e);var a=Ae(n,r);if(o&&a&&(1!==t.rangeCount||t.anchorNode!==o.node||t.anchorOffset!==o.offset||t.focusNode!==a.node||t.focusOffset!==a.offset)){var l=document.createRange();l.setStart(o.node,o.offset),t.removeAllRanges(),e>r?(t.addRange(l),t.extend(a.node,a.offset)):(l.setEnd(a.node,a.offset),t.addRange(l))}}for(t=[],e=n;e=e.parentNode;)1===e.nodeType&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(En(n),n=0;n10*C&&(r.accumulatedTime=0),0===r.accumulatedTime)return r.animationID=null,void r.startAnimationIfNecessary();var a=(r.accumulatedTime-Math.floor(r.accumulatedTime/C)*C)/C,l=Math.floor(r.accumulatedTime/C),i={},u={},c={},s={};for(var f in t)if(Object.prototype.hasOwnProperty.call(t,f)){var p=t[f];if("number"==typeof p)c[f]=p,s[f]=0,i[f]=p,u[f]=0;else{for(var h=r.state.lastIdealStyle[f],y=r.state.lastIdealVelocity[f],v=0;v10*x&&(r.accumulatedTime=0),0===r.accumulatedTime)return r.animationID=null,void r.startAnimationIfNecessary();for(var a=(r.accumulatedTime-Math.floor(r.accumulatedTime/x)*x)/x,i=Math.floor(r.accumulatedTime/x),u=[],c=[],s=[],f=[],p=0;p10*_&&(r.accumulatedTime=0),0===r.accumulatedTime)return r.animationID=null,void r.startAnimationIfNecessary();for(var c=(r.accumulatedTime-Math.floor(r.accumulatedTime/_)*_)/_,s=Math.floor(r.accumulatedTime/_),f=u(r.props.willEnter,r.props.willLeave,r.props.didLeave,r.state.mergedPropsStyles,n,r.state.currentStyles,r.state.currentVelocities,r.state.lastIdealStyles,r.state.lastIdealVelocities),p=f[0],d=f[1],h=f[2],m=f[3],v=f[4],g=0;gr[s])return-1;if(o>a[s]&&ur[s])return 1;if(l>a[s]&&iR.length&&R.push(e)}function d(e,t,n,o){var a=typeof e;if("undefined"!==a&&"boolean"!==a||(e=null),null===e||"string"===a||"number"===a||"object"===a&&e.$$typeof===_||"object"===a&&e.$$typeof===I)return n(o,e,""===t?"."+h(e,0):t),1;var l=0;if(t=""===t?".":t+":",Array.isArray(e))for(var i=0;i1)for(var n=1;n10*w&&(r.accumulatedTime=0),0===r.accumulatedTime)return r.animationID=null,void r.startAnimationIfNecessary();var o=(r.accumulatedTime-Math.floor(r.accumulatedTime/w)*w)/w,i=Math.floor(r.accumulatedTime/w),l={},u={},s={},c={};for(var f in t)if(Object.prototype.hasOwnProperty.call(t,f)){var p=t[f];if("number"==typeof p)s[f]=p,c[f]=0,l[f]=p,u[f]=0;else{for(var y=r.state.lastIdealStyle[f],m=r.state.lastIdealVelocity[f],v=0;v10*I&&(r.accumulatedTime=0),0===r.accumulatedTime)return r.animationID=null,void r.startAnimationIfNecessary();for(var o=(r.accumulatedTime-Math.floor(r.accumulatedTime/I)*I)/I,l=Math.floor(r.accumulatedTime/I),u=[],s=[],c=[],f=[],p=0;p10*x&&(r.accumulatedTime=0),0===r.accumulatedTime)return r.animationID=null,void r.startAnimationIfNecessary();for(var s=(r.accumulatedTime-Math.floor(r.accumulatedTime/x)*x)/x,c=Math.floor(r.accumulatedTime/x),f=u(r.props.willEnter,r.props.willLeave,r.props.didLeave,r.state.mergedPropsStyles,n,r.state.currentStyles,r.state.currentVelocities,r.state.lastIdealStyles,r.state.lastIdealVelocities),p=f[0],d=f[1],y=f[2],h=f[3],v=f[4],b=0;br[c])return-1;if(a>o[c]&&ur[c])return 1;if(i>o[c]&&l/node_modules/react", 36 | "/node_modules/react-dom" 37 | ] 38 | }, 39 | "devDependencies": { 40 | "babel-cli": "^6.10.1", 41 | "babel-jest": "^13.0.0", 42 | "babel-loader": "^6.2.4", 43 | "babel-polyfill": "^6.9.1", 44 | "babel-preset-es2015": "^6.9.0", 45 | "babel-preset-react": "^6.5.0", 46 | "babel-preset-stage-0": "^6.5.0", 47 | "eslint": "^2.13.1", 48 | "eslint-config-airbnb": "^9.0.1", 49 | "eslint-plugin-import": "^1.9.2", 50 | "eslint-plugin-jsx-a11y": "^1.5.3", 51 | "eslint-plugin-react": "^5.2.2", 52 | "jest-cli": "^13.0.0", 53 | "react": "^16.1.1", 54 | "react-dom": "^16.1.1", 55 | "webpack": "^1.13.1", 56 | "webpack-dev-server": "^1.14.1" 57 | }, 58 | "peerDependencies": { 59 | "react": ">=0.13.2 || ^0.14 || ^15.0.0" 60 | }, 61 | "dependencies": { 62 | "prop-types": "^15.6.0", 63 | "react-motion": "^0.5.2" 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/colors.js: -------------------------------------------------------------------------------- 1 | // copied directly from https://github.com/facebook/rebound-js 2 | // rewritten for babel/.eslintrc 3 | 4 | // BSD License 5 | 6 | // For the rebound-js software 7 | 8 | // Copyright (c) 2014, Facebook, Inc. All rights reserved. 9 | 10 | // Redistribution and use in source and binary forms, with or without modification, 11 | // are permitted provided that the following conditions are met: 12 | 13 | // * Redistributions of source code must retain the above copyright notice, this 14 | // list of conditions and the following disclaimer. 15 | 16 | // * Redistributions in binary form must reproduce the above copyright notice, 17 | // this list of conditions and the following disclaimer in the documentation 18 | // and/or other materials provided with the distribution. 19 | 20 | // * Neither the name Facebook nor the names of its contributors may be used to 21 | // endorse or promote products derived from this software without specific 22 | // prior written permission. 23 | 24 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 25 | // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 26 | // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 27 | // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR 28 | // ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 29 | // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 30 | // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 31 | // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 32 | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 33 | // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 34 | 35 | const colorCache = {}; 36 | // Here are a couple of function to convert colors between hex codes and RGB 37 | // component values. These are handy when performing color 38 | // tweening animations. 39 | 40 | export function hexToRGB(c) { 41 | let color = c; 42 | if (colorCache[color]) { 43 | return colorCache[color]; 44 | } 45 | color = color.replace('#', ''); 46 | if (color.length === 3) { 47 | color = color[0] + color[0] + color[1] + color[1] + color[2] + color[2]; 48 | } 49 | const parts = color.match(/.{2}/g); 50 | 51 | const ret = { 52 | r: parseInt(parts[0], 16), 53 | g: parseInt(parts[1], 16), 54 | b: parseInt(parts[2], 16), 55 | }; 56 | 57 | colorCache[color] = ret; 58 | return ret; 59 | } 60 | 61 | export function rgbToObj(s) { 62 | const rgb = s.indexOf('rgb') != -1 63 | const rgba = s.indexOf('rgba') != -1 64 | const match = s.match(/\d+/g) 65 | if (rgb && !rgba) { 66 | return { 67 | r: parseInt(match[0]), 68 | g: parseInt(match[1]), 69 | b: parseInt(match[2]), 70 | } 71 | } 72 | 73 | if (rgb && rgba) { 74 | const aString = match[3] == '0' ? `0.${match[4]}` : match[3] 75 | return { 76 | r: parseInt(match[0]), 77 | g: parseInt(match[1]), 78 | b: parseInt(match[2]), 79 | a: parseFloat(aString) 80 | } 81 | } 82 | 83 | return null 84 | } 85 | 86 | export function rgbToHex(red, green, blue) { 87 | let r = red.toString(16); 88 | let g = green.toString(16); 89 | let b = blue.toString(16); 90 | r = r.length < 2 ? '0' + r : r; 91 | g = g.length < 2 ? '0' + g : g; 92 | b = b.length < 2 ? '0' + b : b; 93 | return '#' + r + g + b; 94 | } 95 | 96 | // This helper function does a linear interpolation of a value from 97 | // one range to another. This can be very useful for converting the 98 | // motion of a Spring to a range of UI property values. For example a 99 | // spring moving from position 0 to 1 could be interpolated to move a 100 | // view from pixel 300 to 350 and scale it from 0.5 to 1. The current 101 | // position of the `Spring` just needs to be run through this method 102 | // taking its input range in the _from_ parameters with the property 103 | // animation range in the _to_ parameters. 104 | export function mapValueInRange(value, fromLow, fromHigh, toLow, toHigh) { 105 | let fromRangeSize = fromHigh - fromLow; 106 | let toRangeSize = toHigh - toLow; 107 | let valueScale = (value - fromLow) / fromRangeSize; 108 | return toLow + (valueScale * toRangeSize); 109 | } 110 | 111 | 112 | // Interpolate two hex colors in a 0 - 1 range or optionally provide a 113 | // custom range with fromLow,fromHight. The output will be in hex by default 114 | // unless asRGB is true in which case it will be returned as an rgb string. 115 | // if input is rgb then it will also be returned as rgb 116 | export function interpolateColor(val, start, end, low, high, asRGB) { 117 | let fromLow = low === undefined ? 0 : low; 118 | let fromHigh = high === undefined ? 1 : high; 119 | 120 | let startColor = rgbToObj(start); 121 | let endColor = rgbToObj(end); 122 | let r = Math.floor( 123 | mapValueInRange(val, fromLow, fromHigh, startColor.r, endColor.r) 124 | ); 125 | let g = Math.floor( 126 | mapValueInRange(val, fromLow, fromHigh, startColor.g, endColor.g) 127 | ); 128 | let b = Math.floor( 129 | mapValueInRange(val, fromLow, fromHigh, startColor.b, endColor.b) 130 | ); 131 | 132 | let asRGBA = false 133 | let a = null 134 | if (startColor.a && endColor.a) { 135 | asRGBA = true 136 | a = mapValueInRange(val, fromLow, fromHigh, startColor.a, endColor.a) 137 | } 138 | 139 | if (!a) { 140 | return 'rgb(' + r + ',' + g + ',' + b + ')'; 141 | } else { 142 | return 'rgb(' + r + ',' + g + ',' + b + ',' + a + ')'; 143 | } 144 | } 145 | -------------------------------------------------------------------------------- /src/iconExamples.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | The MIT License (MIT) 4 | 5 | Copyright (c) 2015 instructure-react 6 | 7 | Permission is hereby granted, free of charge, to any person obtaining a copy 8 | of this software and associated documentation files (the "Software"), to deal 9 | in the Software without restriction, including without limitation the rights 10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | copies of the Software, and to permit persons to whom the Software is 12 | furnished to do so, subject to the following conditions: 13 | 14 | The above copyright notice and this permission notice shall be included in all 15 | copies or substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23 | SOFTWARE. 24 | 25 | */ 26 | 27 | import React from 'react'; 28 | 29 | export const Check = () => ( 30 | 31 | 32 | switch-check 33 | 34 | 38 | 39 | ); 40 | 41 | export const X = () => ( 42 | 43 | 44 | switch-x 45 | 46 | 50 | 51 | ); 52 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import ToggleButton from './react-toggle-button'; 2 | 3 | module.exports = ToggleButton; 4 | -------------------------------------------------------------------------------- /src/react-toggle-button.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { 3 | Motion, 4 | spring 5 | } from 'react-motion'; 6 | import PropTypes from 'prop-types'; 7 | import { 8 | reactToggle, 9 | reactToggleScreenReaderOnly, 10 | reactToggleTrack, 11 | reactToggleOn, 12 | reactToggleOff, 13 | reactToggleThumb, 14 | reactThumbCenteringContainer, 15 | } from './styles' 16 | 17 | import { 18 | rgbToHex, 19 | hexToRGB, 20 | interpolateColor, 21 | mapValueInRange, 22 | } from './colors' 23 | 24 | const defaultColors = { 25 | active: { 26 | base: `rgb(1,124,66)`, 27 | hover: `rgb(1,124,66)`, 28 | }, 29 | inactive: { 30 | base: `rgb(65,66,68)`, 31 | hover: `rgb(65,66,68)`, 32 | }, 33 | activeThumb: { 34 | base: `rgb(250,250,250)`, 35 | hover: `rgb(250,250,250)`, 36 | }, 37 | inactiveThumb: { 38 | base: `rgb(250,250,250)`, 39 | hover: `rgb(250,250,250)`, 40 | }, 41 | } 42 | 43 | const emptyStyle = {} 44 | 45 | export default class ToggleButton extends Component { 46 | 47 | constructor(props) { 48 | super(props) 49 | this.state = { 50 | isHover: false, 51 | } 52 | } 53 | 54 | static defaultProps = { 55 | value: false, 56 | onToggle: () => {}, 57 | colors: defaultColors, 58 | passThroughInputProps: {}, 59 | activeLabel: 'ON', 60 | containerStyle: emptyStyle, 61 | activeLabelStyle: emptyStyle, 62 | activeLabelStyleHover: emptyStyle, 63 | inactiveLabel: 'OFF', 64 | inactiveLabelStyle: emptyStyle, 65 | inactiveLabelStyleHover: emptyStyle, 66 | thumbStyle: emptyStyle, 67 | thumbStyleHover: emptyStyle, 68 | animateThumbStyleHover: () => { return {} }, 69 | animateThumbStyleToggle: () => { return {} }, 70 | trackStyle: emptyStyle, 71 | trackStyleHover: emptyStyle, 72 | animateTrackStyleHover: () => { return {} }, 73 | animateTrackStyleToggle: () => { return {} }, 74 | thumbAnimateRange: [1, 33], 75 | internalSpringSetting: { 76 | stiffness: 180, 77 | damping: 22, 78 | }, 79 | internalHoverSpringSetting: { 80 | stiffness: 180, 81 | damping: 20, 82 | }, 83 | } 84 | 85 | static displayName = 'Toggle' 86 | 87 | onMouseOver() { 88 | this.setState({ isHover: true }) 89 | } 90 | 91 | onMouseOut() { 92 | this.setState({ isHover: false }) 93 | } 94 | 95 | _convertToRgb(color, defaultColor) { 96 | if (color.indexOf('#') != -1) { 97 | const rgbObj = hexToRGB(color) 98 | return `rgb(${rgbObj.r}, ${rgbObj.g}, ${rgbObj.b})` 99 | } else if (color.indexOf('rgb') == -1) { 100 | return defaultColor //something weird, so it's going to be defaulted 101 | } else { 102 | return color 103 | } 104 | } 105 | 106 | /** 107 | * Goes through all colors in obj and converts them to proper format or default 108 | * @param {[type]} colors [description] 109 | * @return {[type]} [description] 110 | */ 111 | checkAllColors(colors) { 112 | Object.keys(colors).forEach((key) => { 113 | this.checkColors(colors, key) 114 | }) 115 | return colors 116 | } 117 | 118 | /** 119 | * Make sure a color is an rgb or rgba value 120 | * @param {[type]} colors [description] 121 | * @param {[type]} key [description] 122 | * @return {[type]} [description] 123 | */ 124 | checkColors(colors, key) { 125 | if (!colors[key]){ 126 | colors[key] = defaultColors[key] 127 | } else if (!colors[key].hover) { 128 | if (!colors[key].base) { 129 | console.warn('Color prop should have a "base" style and a "hover" style!') 130 | colors[key] = defaultColors[key] 131 | } else { 132 | colors[key].base = this._convertToRgb(colors[key].base, defaultColors[key].base) 133 | colors[key].hover = colors[key].base 134 | } 135 | } else { 136 | colors[key].base = this._convertToRgb(colors[key].base, defaultColors[key].base) 137 | colors[key].hover = this._convertToRgb(colors[key].hover, defaultColors[key].hover) 138 | } 139 | } 140 | 141 | interpolateColorWithHover(colorNumber, activeKey, inactiveKey) { 142 | const colors = this.props.colors 143 | this.checkColors(colors, activeKey) 144 | this.checkColors(colors, inactiveKey) 145 | if (this.state.isHover) { 146 | return { 147 | backgroundColor: interpolateColor( 148 | colorNumber, 149 | colors[activeKey].hover, 150 | colors[inactiveKey].hover, 151 | 0, 400 152 | ) 153 | } 154 | } else { 155 | return { 156 | backgroundColor: interpolateColor( 157 | colorNumber, 158 | colors[activeKey].base, 159 | colors[inactiveKey].base, 160 | 0, 400 161 | ) 162 | } 163 | } 164 | } 165 | 166 | makeStyle(style, focusStyle) { 167 | if (this.state.isHover) { 168 | return { 169 | ...style, 170 | ...focusStyle, 171 | } 172 | } else { 173 | return style 174 | } 175 | } 176 | 177 | handleClick(evt) { 178 | if (evt.target !== this._input) { 179 | evt.preventDefault() 180 | this._input.focus() 181 | this._input.click() 182 | } 183 | } 184 | 185 | render() { 186 | const { 187 | internalSpringSetting, 188 | internalHoverSpringSetting, 189 | value, 190 | thumbAnimateRange, 191 | isHover, 192 | containerStyle, 193 | trackStyle, 194 | animateTrackStyleToggle, 195 | animateTrackStyleHover, 196 | thumbStyleHover, 197 | trackStyleHover, 198 | activeLabelStyle, 199 | activeLabelStyleHover, 200 | activeLabel, 201 | inactiveLabelStyle, 202 | inactiveLabelStyleHover, 203 | inactiveLabel, 204 | thumbStyle, 205 | animateThumbStyleHover, 206 | animateThumbStyleToggle, 207 | thumbIcon, 208 | onClick, 209 | onToggle, 210 | passThroughInputProps 211 | } = this.props; 212 | 213 | const SpringConfig = internalSpringSetting 214 | const HoverSpringConfig = internalHoverSpringSetting 215 | return ( 216 | 226 | {({ opacity, left, colorNumber, hoverNumber, toggleNumber }) => 227 |
236 |
247 |
254 | {activeLabel} 255 |
256 |
263 | {inactiveLabel} 264 |
265 |
266 |
267 |
280 | {thumbIcon} 281 |
282 |
283 | { 285 | this._input = c 286 | }} 287 | type="checkbox" 288 | style={reactToggleScreenReaderOnly} 289 | onClick={(evt) => { 290 | if (onClick) { 291 | onClick(evt) 292 | } 293 | 294 | onToggle(value) 295 | }} 296 | value={value} 297 | {...passThroughInputProps} 298 | /> 299 |
300 | } 301 |
302 | ) 303 | } 304 | } 305 | 306 | ToggleButton.propTypes = { 307 | value: PropTypes.bool.isRequired, 308 | onToggle: PropTypes.func.isRequired, 309 | passThroughInputProps: PropTypes.object, 310 | onClick: PropTypes.func, 311 | colors: PropTypes.object, 312 | activeLabel: PropTypes.oneOfType([ 313 | PropTypes.string, 314 | PropTypes.object, 315 | ]), 316 | containerStyle: PropTypes.object, 317 | activeLabelStyle: PropTypes.object, 318 | activeLabelStyleHover: PropTypes.object, 319 | activeThumbStyle: PropTypes.object, 320 | activeThumbStyleHover: PropTypes.object, 321 | inactiveLabel: PropTypes.oneOfType([ 322 | PropTypes.string, 323 | PropTypes.object, 324 | ]), 325 | inactiveLabelStyle: PropTypes.object, 326 | inactiveLabelStyleHover: PropTypes.object, 327 | thumbStyle: PropTypes.object, 328 | thumbStyleHover: PropTypes.object, 329 | trackStyle: PropTypes.object, 330 | trackStyleHover: PropTypes.object, 331 | animateThumbStyleHover: PropTypes.func, 332 | animateTrackStyleHover: PropTypes.func, 333 | animateTrackStyleToggle: PropTypes.func, 334 | animateThumbStyleToggle: PropTypes.func, 335 | internalSpringSetting: PropTypes.object, 336 | internalHoverSpringSetting: PropTypes.object, 337 | thumbIcon: PropTypes.oneOfType([ 338 | PropTypes.string, 339 | PropTypes.object, 340 | ]), 341 | thumbAnimateRange: PropTypes.array, 342 | }; 343 | -------------------------------------------------------------------------------- /src/react-toggle-buttonDemo.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { render } from 'react-dom'; 3 | import ToggleButton from './react-toggle-button'; 4 | import { X, Check } from './iconExamples' 5 | 6 | const styles = { 7 | container: { 8 | display: 'flex', 9 | flexDirection: 'column', 10 | alignItems: 'center', 11 | flex: 1, 12 | fontFamily: 'Helvetica Neue', 13 | }, 14 | exampleContainer: { 15 | display: 'flex', 16 | alignItems: 'center', 17 | flexDirection: 'column', 18 | }, 19 | titleStyle: { 20 | fontWeight: 500, 21 | }, 22 | subTitleStyle: { 23 | fontWeight: 500, 24 | }, 25 | exampleInternal: { 26 | display: 'flex', 27 | flex: 1, 28 | flexDirection: 'row', 29 | alignItems: 'center', 30 | justifyContent: 'center', 31 | }, 32 | informationBlock: { 33 | display: 'flex', 34 | flex: 1, 35 | flexDirection: 'column', 36 | alignItems: 'center', 37 | justifyContent: 'center', 38 | }, 39 | toggleContainer: { 40 | height: 100, 41 | width: 800, 42 | display: 'flex', 43 | alignItems: 'center', 44 | justifyContent: 'flex-start', 45 | }, 46 | descriptionStyle: { 47 | lineHeight: 1.5, 48 | fontWeight: 500, 49 | fontSize: 14, 50 | marginLeft: 50, 51 | width: 800, 52 | overflow: 'auto', 53 | }, 54 | codeBlock: { 55 | display: 'flex', 56 | flex: 1, 57 | width: 800, 58 | overflow: 'auto', 59 | backgroundColor: '#f5f5f5', 60 | fontSize: 13, 61 | padding: 10, 62 | border: '1px solid #ccc', 63 | borderRadius: 4, 64 | marginBottom: -20, 65 | }, 66 | 67 | } 68 | 69 | const codeExamples = [{ 70 | // EXAMPLE 1 71 | code: ` { 74 | self.setState({ 75 | value: !value, 76 | }) 77 | }} />`, 78 | description: `// ToggleButton requires only two props... 79 | 80 | 81 | // 'value', the state of the button. 82 | 83 | // 'onToggle', called on each click, is given the current state 84 | // of the button.`, 85 | example: (self) => { 86 | return ( 87 | { 90 | self.setState({ 91 | value: !value, 92 | }) 93 | }} /> 94 | ) 95 | } 96 | }, { 97 | // EXAMPLE 2 98 | code: `} 100 | activeLabel={} 101 | value={self.state.value} 102 | onToggle={(value) => { 103 | self.setState({ 104 | value: !value, 105 | }) 106 | }} />`, 107 | description: `// Different labels example... 108 | 109 | // 'inactiveLabel' - a string or component to display when OFF. 110 | // 'activeLabel' - a string or component to display when ON.`, 111 | example: (self) => { 112 | return ( 113 | } 116 | activeLabel={} 117 | onToggle={(value) => { 118 | self.setState({ 119 | value2: !value, 120 | }) 121 | }} /> 122 | ) 123 | } 124 | }, { 125 | // EXAMPLE 3 126 | code: `} 149 | value={self.state.value} 150 | onToggle={(value) => { 151 | self.setState({ 152 | value: !value, 153 | }) 154 | }} />`, 155 | description: `// Material Design example... 156 | 157 | // Your button can look very different, if you want. 158 | `, 159 | example: (self) => { 160 | return ( 161 | 197 | 198 | ) 199 | } 200 | onToggle={(value) => { 201 | self.setState({ 202 | value3: !value, 203 | }) 204 | }} /> 205 | ) 206 | } 207 | }, { 208 | // EXAMPLE 4 209 | code: ` { 214 | return { 215 | boxShadow: \`0 0 \${2 + 4*n}px rgba(0,0,0,.16),0 \${2 + 3*n}px \${4 + 8*n}px rgba(0,0,0,.32)\`, 216 | } 217 | }} />`, 218 | description: `// Such hover, much wow! 219 | 220 | // Hover and toggle animation props use a function 221 | // that lets you interpolate your own styles. 222 | `, 223 | example: (self) => { 224 | return ( 225 | { 264 | return { 265 | boxShadow: `0 0 ${2 + 4*n}px rgba(0,0,0,.16),0 ${2 + 3*n}px ${4 + 8*n}px rgba(0,0,0,.32)`, 266 | } 267 | }} 268 | thumbIcon={( 269 |
270 | 271 |
) 272 | } 273 | onToggle={(value) => { 274 | self.setState({ 275 | value4: !value, 276 | }) 277 | }} /> 278 | ) 279 | } 280 | },{ 281 | // EXAMPLE 5 282 | code: `const borderRadiusStyle = { borderRadius: 2 } 283 | 284 | // ... some lines of code later 285 | 286 | { 291 | self.setState({ 292 | value: !value, 293 | }) 294 | }} />`, 295 | description: `// A square toggle, just for funsies...`, 296 | example: (self) => { 297 | return ( 298 | { 307 | self.setState({ 308 | value5: !value, 309 | }) 310 | }} /> 311 | ) 312 | } 313 | }] 314 | 315 | const makeBlock = (self, _example, i) => { 316 | const { 317 | code, 318 | example, 319 | description, 320 | title, 321 | } = _example 322 | return ( 323 |
324 |

{title}

325 |
326 |
327 |           {description}
328 |         
329 |
330 |
331 | {example(self)} 332 |
333 |
334 |             {code}
335 |           
336 |
337 |
338 |
339 | ) 340 | } 341 | 342 | 343 | class ToggleButtonDemo extends Component { 344 | 345 | constructor(props) { 346 | super(props) 347 | this.state = { 348 | value: false, 349 | value2: false, 350 | value3: false, 351 | value4: false, 352 | value5: false, 353 | } 354 | } 355 | 356 | render() { 357 | return ( 358 |
359 |
360 |           {`react-toggle-button`}
361 |         
362 |
363 | {`A highly customizable and portable toggle button for React.`} 364 |
365 |
366 |           {`//  Easy to install and works out-of-the-box
367 | 
368 | //  Change a few things, or change everything
369 | 
370 | //  Uses react-motion for animating toggle.
371 | 
372 | //  Animates hover states too!
373 | 
374 | //  Quacks like an  checkbox, if that's your thing.
375 | 
376 | //  Sticks to the UI stuff (Redux approved!)
377 | `}
378 |         
379 |

Install

380 |
381 |           {`npm install react-toggle-button`}
382 |         
383 |
384 |           {`//ES6
385 | import ToggleButton from 'react-toggle-button'
386 | 
387 | //ES5
388 | var ToggleButton = require('react-toggle-button')`}
389 |         
390 |

Examples

391 | {codeExamples.map((example, i) => { 392 | return makeBlock(this, example, i) 393 | })} 394 |
395 |

React Toggle Button API

396 |
397 |           {`import ToggleButton from 'react-toggle-button'
398 | 
399 | /**
400 |  * 'react-toggle-button' PropTypes
401 |  */
402 | ToggleButton.propTypes = {
403 |   //
404 |   //
405 |   // REQUIRED PROPS
406 |   //
407 |   //
408 | 
409 |   value: React.PropTypes.bool.isRequired,
410 |   /**
411 |    * Called during onClick
412 |    * 1. triggers 'focus' and 'click' on internal checkbox
413 |    * 2. calls onToggle(this.props.active)
414 |    */
415 |   onToggle: React.PropTypes.func.isRequired,
416 | 
417 |   //
418 |   //
419 |   // OPTIONAL PROPS
420 |   //
421 |   //
422 |   /**
423 |    * Object with four properties { active, inactive, activeThumb, inactiveThumb }
424 |    *
425 |    * each property should have a 'base' key and a 'hover' key
426 |    * ( if hover is undefined, that property will use the base value )
427 |    *
428 |    */
429 |   colors: React.PropTypes.object,
430 | 
431 | 
432 |   /**
433 |    * The label used inside the track, can also take a component
434 |    *
435 |    * activeLabel (defaultValue: 'ON')
436 |    * inactiveLabel (defaultValue: 'OFF')
437 |    */
438 |   activeLabel: React.PropTypes.oneOfType([
439 |     React.PropTypes.string,
440 |     React.PropTypes.object,
441 |   ]),
442 |   inactiveLabel: React.PropTypes.oneOfType([
443 |     React.PropTypes.string,
444 |     React.PropTypes.object,
445 |   ]),
446 | 
447 | 
448 |   /**
449 |    * These props specify style,
450 |    * hover style is used during mouseOver event
451 |    *
452 |    *
453 |    */
454 |   activeLabelStyle: React.PropTypes.object,
455 |   activeLabelStyleHover: React.PropTypes.object,
456 |   activeThumbStyle: React.PropTypes.object,
457 |   activeThumbStyleHover: React.PropTypes.object,
458 |   inactiveLabelStyle: React.PropTypes.object,
459 |   inactiveLabelStyleHover: React.PropTypes.object,
460 |   thumbStyle: React.PropTypes.object,
461 |   thumbStyleHover: React.PropTypes.object,
462 |   trackStyle: React.PropTypes.object,
463 |   trackStyleHover: React.PropTypes.object,
464 | 
465 | 
466 |   /**
467 |    * These props take a function that receives a real number [0, 1] and
468 |    * returns an interpolated style.
469 |    *
470 |    * No Hover -> Hover :  0 -> 1 : No Toggle -> Toggle
471 |    */
472 |   animateThumbStyleHover: React.PropTypes.func,
473 |   animateTrackStyleHover: React.PropTypes.func,
474 |   animateTrackStyleToggle: React.PropTypes.func,
475 |   animateThumbStyleToggle: React.PropTypes.func,
476 | 
477 | 
478 |   /**
479 |    * passes through internal spring settings for react-motion
480 |    * { stiffness, damping }
481 |    */
482 |   internalSpringSetting: React.PropTypes.object,
483 |   internalHoverSpringSetting: React.PropTypes.object,
484 | 
485 | 
486 |   /**
487 |    * Optional if one wants an icon inside the thumb, take a string or component
488 |    */
489 |   thumbIcon: React.PropTypes.oneOfType([
490 |     React.PropTypes.string,
491 |     React.PropTypes.object,
492 |   ]),
493 | 
494 |   /**
495 |    * The range to move the thumb on toggle [starting, ending]
496 |    */
497 |   thumbAnimateRange: React.PropTypes.array,
498 | 
499 |   /**
500 |    * If you want to put some props on the underlying  element
501 |    * you can pass them through this prop.
502 |    *
503 |    * Example:
504 |    *
505 |    *  passThroughInputProps={{
506 |    *   	onChange: () => console.log('Hello!')
507 |    *  }}
508 |    *
509 |    */
510 |    passThroughInputProps: React.PropTypes.object,
511 | 
512 | }`}
513 |         
514 |
515 | ) 516 | } 517 | } 518 | 519 | render(, document.getElementById('root')); 520 | -------------------------------------------------------------------------------- /src/styles.js: -------------------------------------------------------------------------------- 1 | export const reactToggle = { 2 | display: 'flex', 3 | width: 52, 4 | alignItems: 'center', 5 | justifyContent: 'flex-start', 6 | position: 'relative', 7 | cursor: 'pointer', 8 | backgroundColor: 'transparent', 9 | border: 0, 10 | padding: 0, 11 | WebkitTouchCallout: 'none', 12 | WebkitUserSelect: 'none', 13 | KhtmlUserSelect: 'none', 14 | MozUserSelect: 'none', 15 | msUserSelect: 'none', 16 | userSelect: 'none', 17 | WebkitTapHighlightColor: 'rgba(0,0,0,0)', 18 | WebkitTapHighlightColor: 'transparent', 19 | } 20 | 21 | const toggleLabelBase = { 22 | fontSize: 11, 23 | display: 'flex', 24 | alignItems: 'center', 25 | justifyContent: 'center', 26 | fontFamily: "'Helvetica Neue', Helvetica, sans-serif", 27 | } 28 | 29 | export const reactToggleScreenReaderOnly = { 30 | border: 0, 31 | clip: 'rect(0 0 0 0)', 32 | height: 1, 33 | margin: -1, 34 | overflow: 'hidden', 35 | padding: 0, 36 | position: 'absolute', 37 | width: 1, 38 | } 39 | 40 | export const reactToggleTrack = { 41 | width: '52px', 42 | height: '20px', 43 | padding: 0, 44 | borderRadius: '26px', 45 | display: 'flex', 46 | alignItems: 'center', 47 | justifyContent: 'center', 48 | } 49 | 50 | export const reactToggleOn = { 51 | ...toggleLabelBase, 52 | position: 'relative', 53 | color: '#FAFAFA', 54 | marginTop: 'auto', 55 | marginBottom: 'auto', 56 | lineHeight: 0, 57 | opacity: 0, 58 | width: 26, 59 | height: 20, 60 | left: 4, 61 | } 62 | 63 | export const reactToggleOff = { 64 | ...toggleLabelBase, 65 | position: 'relative', 66 | color: 'rgba(255,255,255,0.6)', 67 | bottom: '0px', 68 | marginTop: 'auto', 69 | marginBottom: 'auto', 70 | paddingRight: 5, 71 | lineHeight: 0, 72 | width: 26, 73 | height: 20, 74 | } 75 | 76 | export const reactToggleThumb = { 77 | width: '18px', 78 | height: '18px', 79 | display: 'flex', 80 | alignSelf: 'center', 81 | boxShadow: '0 0 0 1px rgba(0,0,0,0.3)', 82 | borderRadius: '50%', 83 | WebkitBoxSizing: 'border-box', 84 | MozBoxSizing: 'border-box', 85 | boxSizing: 'border-box', 86 | } 87 | 88 | export const reactThumbCenteringContainer = { 89 | position: 'absolute', 90 | height: '100%', 91 | top: 0, 92 | left: 0, 93 | display: 'flex', 94 | flex: 1, 95 | alignSelf: 'stretch', 96 | alignItems: 'center', 97 | justifyContent: 'flex-start', 98 | } 99 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack'); 2 | 3 | const config = { 4 | entry: { 5 | index: ["./src/index.js"] 6 | }, 7 | output: { 8 | path: __dirname + '/lib', 9 | filename: "[name].js", 10 | libraryTarget: "umd", 11 | library: "react-toggle-button", 12 | }, 13 | externals: { 14 | "react": { 15 | root: 'React', 16 | commonjs2: 'react', 17 | commonjs: 'react', 18 | amd: 'react' 19 | }, 20 | "react-dom": { 21 | root: 'ReactDOM', 22 | commonjs: 'react-dom', 23 | commonjs2: 'react-dom', 24 | amd: 'react-dom' 25 | } 26 | }, 27 | module: { 28 | loaders: [{ 29 | test: /.jsx?$/, 30 | exclude: /node_modules/, 31 | loader: "babel", 32 | query: { 33 | presets: ["es2015","react","stage-0"] 34 | } 35 | }] 36 | }, 37 | plugins: [ 38 | new webpack.optimize.OccurenceOrderPlugin(), 39 | new webpack.optimize.UglifyJsPlugin({comments: false}), 40 | new webpack.DefinePlugin({ 41 | 'process.env': {NODE_ENV: JSON.stringify('production')} 42 | }) 43 | ], 44 | }; 45 | 46 | module.exports = config; 47 | -------------------------------------------------------------------------------- /webpack.demo.config.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack'); 2 | 3 | const config = { 4 | devtool: "inline-source-map", 5 | entry: { 6 | 'react-toggle-buttonDemo': ["./src/react-toggle-buttonDemo.js"] 7 | }, 8 | output: { 9 | path: __dirname + '/demo', 10 | filename: "[name].js", 11 | }, 12 | module: { 13 | loaders: [{ 14 | test: /.jsx?$/, 15 | exclude: /node_modules/, 16 | loader: "babel", 17 | query: { 18 | presets: ["es2015","react","stage-0"] 19 | } 20 | }] 21 | }, 22 | devServer: { 23 | contentBase: "./demo", 24 | colors: true, 25 | historyApiFallback: true, 26 | inline: true 27 | }, 28 | 29 | } 30 | 31 | if (process.env.NODE_ENV === 'production') { 32 | config.devtool = false; 33 | config.plugins = [ 34 | new webpack.optimize.OccurenceOrderPlugin(), 35 | new webpack.optimize.UglifyJsPlugin({comments: false}), 36 | new webpack.DefinePlugin({ 37 | 'process.env': {NODE_ENV: JSON.stringify('production')} 38 | }) 39 | ]; 40 | }; 41 | 42 | module.exports = config; 43 | --------------------------------------------------------------------------------