├── .babelrc
├── .gitignore
├── README.md
├── custom-component-guide-example.json
├── dist
├── examples
│ ├── growing_button.js
│ ├── growing_button.js.LICENSE.txt
│ ├── horizontal_stepper.js
│ └── horizontal_stepper.js.LICENSE.txt
├── index.js
└── index.js.LICENSE.txt
├── package.json
├── src
├── ExampleComponent.js
├── examples
│ ├── GrowingButton
│ │ ├── Button.js
│ │ ├── index.js
│ │ └── styles.css
│ ├── HorizontalStepper
│ │ ├── HorizontalStepper.js
│ │ ├── index.js
│ │ └── styles.css
│ └── README.md
└── index.js
├── webpack.config.js
├── webpack.examples.config.js
└── yarn.lock
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | [ "@babel/preset-env", {
4 | "modules": false,
5 | "targets": {
6 | "browsers": [
7 | "last 2 Chrome versions",
8 | "last 2 Firefox versions",
9 | "last 2 Safari versions",
10 | "last 2 iOS versions",
11 | "last 1 Android version",
12 | "last 1 ChromeAndroid version",
13 | "ie 11"
14 | ]
15 | }
16 | } ],
17 | "@babel/preset-react"
18 | ],
19 | "plugins": [ "@babel/plugin-proposal-class-properties" ]
20 | }
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | .yarn/
3 | .yarnrc
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Retool + BYO: React Custom Components
2 | If you have a use case that isn't handled by Retool's built-in components, you can build your own custom component to solve that use case. Really anything that can be compiled down to javascript can be used within Retool's custom components. While Retool allows you to write React directly within its iframe code, you may find it limiting in regards to development environment or packages that can be added; this repository breaks down both barriers.
3 |
4 | The purpose of this repository is to give a React developer a baseline development envrionment that includes
5 | - local development of your custom component available within your Retool app
6 | - an example of hot reload within the Retool sandbox'd iframe
7 | - add any npm package to use in the component library
8 | - bring your own component library example
9 | - examples of reading or updating data in your Retool app
10 | - examples of triggering queries
11 | - moving from development to production either inline or through a CDN
12 |
13 | We are accepting bugs and feature requests to this repository through issues.
14 |
15 | # Getting Started
16 |
17 | Getting started with local development happens in two parts, cloning this repository and setting up your Retool application to listen to it:
18 |
19 | 1. Setting up local environment
20 | - Clone repository
21 | - Install dependendencies
22 | 2. Setting up Retool application
23 | - Add a custom component to the application
24 | - Update the component's iFrame Code
25 | - Update the component's Model
26 |
27 | ## Setting up local environment
28 |
29 | ```shell
30 | git clone git@github.com:tryretool/custom-component-guide.git
31 | cd custom-component-guide
32 | yarn install
33 | yarn dev
34 | ```
35 |
36 | After starting the webpack dev server with `yarn dev` and the example dev server servers your built javascript at `http://localhost:8080/main.js`. Once the dev server is running, open up a Retool application, and drag a custom component on to the canvas.
37 |
38 | In the component inspector, replace the default iFrame code with the following:
39 |
40 | ```html
41 |
42 | ```
43 |
44 | In the component inspector, replace the Model value with the following:
45 |
46 | ```
47 | {
48 | "greeting": "Hello, ",
49 | "username": {{ current_user.fullName }},
50 | "message": "Welcome to custom components!",
51 | "yesQuery": "yesQuery",
52 | "noQuery": "noQuery",
53 | "runQuery": "runQuery"
54 | }
55 | ```
56 |
57 |
58 | ## Developing in this repository
59 | You're all setup to start developing locally and having your changes appear in your Retool application; happy coding!
60 | While running `yarn dev` you can easily modify `src/index.js` and `src/ExampleComponent.js`.
61 |
62 |
63 | # BYO Component Library
64 | You may wish to use your own component library in Retool for specific styling or UI elements; however, we encourage you to reach out and file a feature request! If you are bringing your own component, this repository can give you examples of how to extend your library and use it as first class components in Retool. When a custom component is available in an application, it loads into a sandbox'd iframe to give you control over an HTML document javascript. Retool will also provide you with an interface to help communicate with the Retool application; you can read more [here](https://docs.retool.com/docs/custom-react-components#interface)
65 |
66 | ## Retool.createReactComponent()
67 | Retool's sandboxed iframe will provide a wrapper for React components for you to access the interface, which are available in the document at `Retool.createReactComponent()`. If your components are wrapped in this function, `model`, `modelUpdate`, and `triggerQuery` will be available for your component. For example:
68 |
69 | ```javascript
70 | // index.js
71 | import MyComponent from './MyComponent';
72 | const RetoolConnectedComponent = Retool.connectReactComponent(App);
73 | ReactDOM.render(
74 | ,
75 | document.body.appendChild(document.createElement('div'))
76 | );
77 | ```
78 |
79 | Now within MyComponent, you have access to , `model`, `modelUpdate`, and `triggerQuery` through its props. For example:
80 | ```javascript
81 | // MyComponent.js
82 | export default function MyComponent ({model, modelUpdate, triggerQuery, ...props}) {
83 | // ... your component
84 | }
85 | ```
86 |
87 | Alternatively, you can wrap your export with `Retool.createReactComponent()`
88 |
89 | ```javascript
90 | // MyComponent.js
91 | const MyComponent = ({model, modelUpdate, triggerQuery, ...props}) => {
92 | // ... your component
93 | }
94 | export default Retool.connectReactComponent(App);
95 | ```
96 |
97 | ```javascript
98 | // index.js
99 | import MyComponent from './MyComponent';
100 | ReactDOM.render(
101 | ,
102 | document.body.appendChild(document.createElement('div'))
103 | );
104 | ```
105 |
106 | # Examples
107 | Coming Soon!
108 |
109 |
110 |
111 | # Deploying
112 | Coming Soon!
113 |
--------------------------------------------------------------------------------
/custom-component-guide-example.json:
--------------------------------------------------------------------------------
1 | {"uuid":"b1e3e33e-98a3-11ec-b9c0-93891007542a","page":{"id":60296684,"data":{"appState":"[\"~#iR\",[\"^ \",\"n\",\"appTemplate\",\"v\",[\"^ \",\"isFetching\",false,\"plugins\",[\"~#iOM\",[\"container1\",[\"^0\",[\"^ \",\"n\",\"pluginTemplate\",\"v\",[\"^ \",\"id\",\"container1\",\"type\",\"widget\",\"subtype\",\"ContainerWidget2\",\"resourceName\",null,\"resourceDisplayName\",null,\"template\",[\"^3\",[\"_disabledByIndex\",[\"~#iL\",[\"\"]],\"heightType\",\"auto\",\"currentViewKey\",null,\"iconByIndex\",[],\"clickable\",false,\"_iconByIndex\",[\"^9\",[\"\"]],\"hidden\",false,\"showHeader\",true,\"hoistFetching\",true,\"views\",[],\"showInEditor\",false,\"tooltipText\",\"\",\"hiddenByIndex\",[],\"_hiddenByIndex\",[\"^9\",[\"\"]],\"currentViewIndex\",null,\"_hasMigratedNestedItems\",true,\"transition\",\"none\",\"itemMode\",\"static\",\"_tooltipByIndex\",[\"^9\",[\"\"]],\"tooltipByIndex\",[],\"showFooter\",false,\"_viewKeys\",[\"^9\",[\"View 1\"]],\"events\",[\"^3\",[]],\"_ids\",[\"^9\",[\"5798e\"]],\"viewKeys\",[],\"iconPositionByIndex\",[],\"_iconPositionByIndex\",[\"^9\",[\"\"]],\"loading\",false,\"overflowType\",\"scroll\",\"disabled\",false,\"_labels\",[\"^9\",[\"\"]],\"disabledByIndex\",[],\"maintainSpaceWhenHidden\",false,\"showBody\",true,\"labels\",[]]],\"style\",[\"^3\",[]],\"position2\",[\"^0\",[\"^ \",\"n\",\"position2\",\"v\",[\"^ \",\"container\",\"\",\"rowGroup\",\"body\",\"subcontainer\",\"\",\"row\",0,\"col\",0,\"height\",4,\"width\",6,\"tabNum\",0]]],\"mobilePosition2\",null,\"mobileAppPosition\",null,\"tabIndex\",null,\"createdAt\",\"~m1646058948804\",\"updatedAt\",\"~m1646058948804\",\"^<\",\"\",\"folder\",\"\",\"screen\",null]]],\"containerTitle1\",[\"^0\",[\"^ \",\"n\",\"pluginTemplate\",\"v\",[\"^ \",\"id\",\"containerTitle1\",\"^4\",\"widget\",\"^5\",\"TextWidget2\",\"^6\",null,\"^7\",null,\"^8\",[\"^3\",[\"heightType\",\"auto\",\"horizontalAlign\",\"left\",\"hidden\",false,\"imageWidth\",\"fit\",\"showInEditor\",false,\"verticalAlign\",\"center\",\"tooltipText\",\"\",\"value\",\"#### Pre Configured Component\",\"disableMarkdown\",false,\"overflowType\",\"scroll\",\"maintainSpaceWhenHidden\",false]],\"^:\",[\"^3\",[]],\"^;\",[\"^0\",[\"^ \",\"n\",\"position2\",\"v\",[\"^ \",\"^<\",\"container1\",\"^=\",\"header\",\"^>\",\"\",\"row\",0,\"col\",0,\"^?\",0.6,\"^@\",12,\"^A\",0]]],\"^B\",null,\"^C\",null,\"^D\",null,\"^E\",\"~m1646058948958\",\"^F\",\"~m1646058967045\",\"^<\",\"\",\"^G\",\"\",\"^H\",null]]],\"customComponentConfigured\",[\"^0\",[\"^ \",\"n\",\"pluginTemplate\",\"v\",[\"^ \",\"id\",\"customComponentConfigured\",\"^4\",\"widget\",\"^5\",\"CustomComponentWidget\",\"^6\",null,\"^7\",null,\"^8\",[\"^3\",[\"allowTopNavigation\",false,\"model\",\"{\\n\\t\\\"greeting\\\": \\\"Hello, \\\", \\n\\t\\\"username\\\": {{ current_user.fullName }},\\n \\\"message\\\": \\\"Welcome to custom components!\\\",\\n \\\"yesQuery\\\": \\\"yesQuery\\\",\\n \\\"noQuery\\\": \\\"noQuery\\\",\\n \\\"runQuery\\\": \\\"runQuery\\\"\\n}\",\"allowCamera\",false,\"allowModals\",false,\"iframeCode\",\"\",\"allowMicrophone\",false,\"allowSameOrigin\",false,\"allowPopupsToEscapeSandbox\",false,\"allowGeolocation\",false]],\"^:\",[\"^3\",[]],\"^;\",[\"^0\",[\"^ \",\"n\",\"position2\",\"v\",[\"^ \",\"^<\",\"container1\",\"^=\",\"body\",\"^>\",\"5798e\",\"row\",0,\"col\",0,\"^?\",8.2,\"^@\",12,\"^A\",0]]],\"^B\",null,\"^C\",null,\"^D\",null,\"^E\",\"~m1646058979233\",\"^F\",\"~m1646062045740\",\"^<\",\"\",\"^G\",\"\",\"^H\",null]]],\"getUser\",[\"^0\",[\"^ \",\"n\",\"pluginTemplate\",\"v\",[\"^ \",\"id\",\"getUser\",\"^4\",\"datasource\",\"^5\",\"SqlQuery\",\"^6\",\"onboarding_db (readonly)\",\"^7\",\"onboarding_db (readonly)\",\"^8\",[\"^3\",[\"queryRefreshTime\",\"\",\"lastReceivedFromResourceAt\",null,\"databasePasswordOverride\",\"\",\"queryDisabledMessage\",\"\",\"successMessage\",\"\",\"queryDisabled\",\"\",\"playgroundQuerySaveId\",\"latest\",\"resourceNameOverride\",\"\",\"runWhenModelUpdates\",true,\"showFailureToaster\",true,\"query\",\"select first_name from users\\nlimit 100\",\"playgroundQueryUuid\",\"\",\"playgroundQueryId\",null,\"privateParams\",[\"^9\",[]],\"runWhenPageLoadsDelay\",\"\",\"warningCodes\",[\"^9\",[]],\"data\",null,\"importedQueryInputs\",[\"^3\",[]],\"isImported\",false,\"showSuccessToaster\",true,\"dataArray\",[\"^9\",[]],\"cacheKeyTtl\",\"\",\"databaseHostOverride\",\"\",\"metadata\",null,\"changesetObject\",\"\",\"shouldUseLegacySql\",false,\"errorTransformer\",\"// The variable 'data' allows you to reference the request's data in the transformer. \\n// example: return data.find(element => element.isError)\\nreturn data.error\",\"databaseNameOverride\",\"\",\"confirmationMessage\",null,\"isFetching\",false,\"changeset\",\"\",\"rawData\",null,\"queryTriggerDelay\",\"0\",\"watchedParams\",[\"^9\",[]],\"enableErrorTransformer\",false,\"showLatestVersionUpdatedWarning\",false,\"timestamp\",0,\"importedQueryDefaults\",[\"^3\",[]],\"enableTransformer\",false,\"showUpdateSetValueDynamicallyToggle\",true,\"runWhenPageLoads\",false,\"transformer\",\"// type your code here\\n// example: return formatDataAsArray(data).filter(row => row.quantity > 20)\\nreturn data\",\"events\",[\"^9\",[[\"^3\",[\"event\",\"success\",\"type\",\"script\",\"method\",\"run\",\"pluginId\",\"\",\"targetId\",null,\"params\",[\"^3\",[\"src\",\"\"]],\"waitType\",\"debounce\",\"waitMs\",\"0\"]]]],\"queryTimeout\",\"10000\",\"requireConfirmation\",false,\"queryFailureConditions\",\"\",\"changesetIsObject\",false,\"enableCaching\",false,\"allowedGroups\",[\"^9\",[]],\"databaseUsernameOverride\",\"\",\"shouldEnableBatchQuerying\",false,\"queryThrottleTime\",\"750\",\"updateSetValueDynamically\",false,\"notificationDuration\",\"\"]],\"^:\",null,\"^;\",null,\"^B\",null,\"^C\",null,\"^D\",null,\"^E\",\"~m1646062708587\",\"^F\",\"~m1646062977878\",\"^<\",\"\",\"^G\",\"\",\"^H\",null]]],\"runQuery\",[\"^0\",[\"^ \",\"n\",\"pluginTemplate\",\"v\",[\"^ \",\"id\",\"runQuery\",\"^4\",\"datasource\",\"^5\",\"JavascriptQuery\",\"^6\",\"JavascriptQuery\",\"^7\",null,\"^8\",[\"^3\",[\"queryRefreshTime\",\"\",\"lastReceivedFromResourceAt\",null,\"queryDisabledMessage\",\"\",\"successMessage\",\"\",\"queryDisabled\",\"\",\"playgroundQuerySaveId\",\"latest\",\"resourceNameOverride\",\"\",\"runWhenModelUpdates\",false,\"showFailureToaster\",true,\"query\",\"customComponentConfigured.updateModel({\\n username: getUser.data.first_name[[Math.floor(Math.random() * getUser.data.first_name.length)]]\\n})\",\"playgroundQueryUuid\",\"\",\"playgroundQueryId\",null,\"privateParams\",[\"^9\",[]],\"runWhenPageLoadsDelay\",\"\",\"data\",null,\"importedQueryInputs\",[\"^3\",[]],\"isImported\",false,\"showSuccessToaster\",true,\"cacheKeyTtl\",\"\",\"metadata\",null,\"changesetObject\",\"\",\"errorTransformer\",\"// The variable 'data' allows you to reference the request's data in the transformer. \\n// example: return data.find(element => element.isError)\\nreturn data.error\",\"confirmationMessage\",null,\"isFetching\",false,\"changeset\",\"\",\"rawData\",null,\"queryTriggerDelay\",\"0\",\"watchedParams\",[\"^9\",[]],\"enableErrorTransformer\",false,\"showLatestVersionUpdatedWarning\",false,\"timestamp\",0,\"importedQueryDefaults\",[\"^3\",[]],\"enableTransformer\",false,\"showUpdateSetValueDynamicallyToggle\",true,\"runWhenPageLoads\",false,\"transformer\",\"// type your code here\\n// example: return formatDataAsArray(data).filter(row => row.quantity > 20)\\nreturn data\",\"events\",[\"^9\",[]],\"queryTimeout\",\"10000\",\"requireConfirmation\",false,\"queryFailureConditions\",\"\",\"changesetIsObject\",false,\"enableCaching\",false,\"allowedGroups\",[\"^9\",[]],\"queryThrottleTime\",\"750\",\"updateSetValueDynamically\",false,\"notificationDuration\",\"\"]],\"^:\",null,\"^;\",null,\"^B\",null,\"^C\",null,\"^D\",null,\"^E\",\"~m1646062845467\",\"^F\",\"~m1646063439064\",\"^<\",\"\",\"^G\",\"\",\"^H\",null]]]]],\"^E\",null,\"version\",\"2.86.7\",\"appThemeId\",null,\"preloadedAppJavaScript\",null,\"preloadedAppJSLinks\",[],\"appStyles\",\"\",\"testEntities\",[],\"tests\",[],\"responsiveLayoutDisabled\",false,\"loadingIndicatorsDisabled\",false,\"urlFragmentDefinitions\",[\"^9\",[]],\"pageLoadValueOverrides\",[\"^9\",[]],\"isGlobalWidget\",false,\"isMobileApp\",false,\"multiScreenMobileApp\",false,\"instrumentationEnabled\",false,\"customDocumentTitleEnabled\",false,\"customDocumentTitle\",\"\",\"customShortcuts\",[],\"folders\",[\"^9\",[]],\"markdownLinkBehavior\",\"auto\",\"inAppRetoolPillAppearance\",\"NO_OVERRIDE\",\"rootScreen\",null]]]"},"changesRecord":[{"type":"PLUGIN_UPDATE_ID","payload":{"newId":"customComponentConfigured","pluginId":"customComponent1"}},{"type":"WIDGET_TEMPLATE_UPDATE","payload":{"plugin":{"id":"runQuery","type":"datasource","style":null,"folder":"","screen":null,"subtype":"JavascriptQuery","tabIndex":null,"template":{"data":null,"query":"customComponent1.updateModel({\n username: getUser.data.first_name[[Math.floor(Math.random() * getUser.data.first_name.length)]]\n})","events":[],"rawData":null,"metadata":null,"changeset":"","timestamp":0,"isFetching":false,"isImported":false,"cacheKeyTtl":"","transformer":"// type your code here\n// example: return formatDataAsArray(data).filter(row => row.quantity > 20)\nreturn data","queryTimeout":"10000","allowedGroups":[],"enableCaching":false,"privateParams":[],"queryDisabled":"","watchedParams":[],"successMessage":"","changesetObject":"","errorTransformer":"// The variable 'data' allows you to reference the request's data in the transformer. \n// example: return data.find(element => element.isError)\nreturn data.error","queryRefreshTime":"","runWhenPageLoads":false,"changesetIsObject":false,"enableTransformer":false,"playgroundQueryId":null,"queryThrottleTime":"750","queryTriggerDelay":"0","showFailureToaster":true,"showSuccessToaster":true,"confirmationMessage":null,"importedQueryInputs":{},"playgroundQueryUuid":"","requireConfirmation":false,"runWhenModelUpdates":false,"notificationDuration":"","queryDisabledMessage":"","resourceNameOverride":"","importedQueryDefaults":{},"playgroundQuerySaveId":"latest","runWhenPageLoadsDelay":"","enableErrorTransformer":false,"queryFailureConditions":"","updateSetValueDynamically":false,"lastReceivedFromResourceAt":null,"showLatestVersionUpdatedWarning":false,"showUpdateSetValueDynamicallyToggle":true},"container":"","createdAt":"2022-02-28T15:40:45.467Z","namespace":null,"position2":null,"updatedAt":"2022-02-28T15:42:44.626Z","resourceName":"JavascriptQuery","mobilePosition2":null,"mobileAppPosition":null},"update":{"query":"customComponentConfigured.updateModel({\n username: getUser.data.first_name[[Math.floor(Math.random() * getUser.data.first_name.length)]]\n})"},"widgetId":"runQuery"},"isUserTriggered":true}],"gitSha":null,"checksum":null,"createdAt":"2022-02-28T15:50:39.508Z","updatedAt":"2022-02-28T15:50:39.508Z","pageId":937324,"userId":234183,"branchId":null},"modules":{}}
--------------------------------------------------------------------------------
/dist/examples/growing_button.js.LICENSE.txt:
--------------------------------------------------------------------------------
1 | /*
2 | object-assign
3 | (c) Sindre Sorhus
4 | @license MIT
5 | */
6 |
7 | /** @license React v0.20.2
8 | * scheduler.production.min.js
9 | *
10 | * Copyright (c) Facebook, Inc. and its affiliates.
11 | *
12 | * This source code is licensed under the MIT license found in the
13 | * LICENSE file in the root directory of this source tree.
14 | */
15 |
16 | /** @license React v17.0.2
17 | * react-dom.production.min.js
18 | *
19 | * Copyright (c) Facebook, Inc. and its affiliates.
20 | *
21 | * This source code is licensed under the MIT license found in the
22 | * LICENSE file in the root directory of this source tree.
23 | */
24 |
25 | /** @license React v17.0.2
26 | * react.production.min.js
27 | *
28 | * Copyright (c) Facebook, Inc. and its affiliates.
29 | *
30 | * This source code is licensed under the MIT license found in the
31 | * LICENSE file in the root directory of this source tree.
32 | */
33 |
--------------------------------------------------------------------------------
/dist/examples/horizontal_stepper.js.LICENSE.txt:
--------------------------------------------------------------------------------
1 | /*
2 | object-assign
3 | (c) Sindre Sorhus
4 | @license MIT
5 | */
6 |
7 | /** @license React v0.20.2
8 | * scheduler.production.min.js
9 | *
10 | * Copyright (c) Facebook, Inc. and its affiliates.
11 | *
12 | * This source code is licensed under the MIT license found in the
13 | * LICENSE file in the root directory of this source tree.
14 | */
15 |
16 | /** @license React v16.13.1
17 | * react-is.production.min.js
18 | *
19 | * Copyright (c) Facebook, Inc. and its affiliates.
20 | *
21 | * This source code is licensed under the MIT license found in the
22 | * LICENSE file in the root directory of this source tree.
23 | */
24 |
25 | /** @license React v17.0.2
26 | * react-dom.production.min.js
27 | *
28 | * Copyright (c) Facebook, Inc. and its affiliates.
29 | *
30 | * This source code is licensed under the MIT license found in the
31 | * LICENSE file in the root directory of this source tree.
32 | */
33 |
34 | /** @license React v17.0.2
35 | * react.production.min.js
36 | *
37 | * Copyright (c) Facebook, Inc. and its affiliates.
38 | *
39 | * This source code is licensed under the MIT license found in the
40 | * LICENSE file in the root directory of this source tree.
41 | */
42 |
--------------------------------------------------------------------------------
/dist/index.js:
--------------------------------------------------------------------------------
1 | /*! For license information please see index.js.LICENSE.txt */
2 | (()=>{"use strict";var e,t,n,r={347:e=>{var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;function l(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(e){return!1}}()?Object.assign:function(e,a){for(var o,u,i=l(e),c=1;c{var r=n(466),l=n(347),a=n(767);function o(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;nt}return!1}(t,n,l,r)&&(n=null),r||null===l?function(e){return!!p.call(m,e)||!p.call(h,e)&&(d.test(e)?m[e]=!0:(h[e]=!0,!1))}(t)&&(null===n?e.removeAttribute(t):e.setAttribute(t,""+n)):l.mustUseProperty?e[l.propertyName]=null===n?3!==l.type&&"":n:(t=l.attributeName,r=l.attributeNamespace,null===n?e.removeAttribute(t):(n=3===(l=l.type)||4===l&&!0===n?"":""+n,r?e.setAttributeNS(r,t,n):e.setAttribute(t,n))))}"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 xmlns:xlink x-height".split(" ").forEach((function(e){var t=e.replace(y,b);g[t]=new v(t,1,!1,e,null,!1,!1)})),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach((function(e){var t=e.replace(y,b);g[t]=new v(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)})),["xml:base","xml:lang","xml:space"].forEach((function(e){var t=e.replace(y,b);g[t]=new v(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)})),["tabIndex","crossOrigin"].forEach((function(e){g[e]=new v(e,1,!1,e.toLowerCase(),null,!1,!1)})),g.xlinkHref=new v("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach((function(e){g[e]=new v(e,1,!1,e.toLowerCase(),null,!0,!0)}));var k=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,E=60103,S=60106,x=60107,_=60108,C=60114,P=60109,N=60110,T=60112,z=60113,L=60120,O=60115,R=60116,M=60121,D=60128,I=60129,F=60130,U=60131;if("function"==typeof Symbol&&Symbol.for){var A=Symbol.for;E=A("react.element"),S=A("react.portal"),x=A("react.fragment"),_=A("react.strict_mode"),C=A("react.profiler"),P=A("react.provider"),N=A("react.context"),T=A("react.forward_ref"),z=A("react.suspense"),L=A("react.suspense_list"),O=A("react.memo"),R=A("react.lazy"),M=A("react.block"),A("react.scope"),D=A("react.opaque.id"),I=A("react.debug_trace_mode"),F=A("react.offscreen"),U=A("react.legacy_hidden")}var j,V="function"==typeof Symbol&&Symbol.iterator;function B(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=V&&e[V]||e["@@iterator"])?e:null}function W(e){if(void 0===j)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);j=t&&t[1]||""}return"\n"+j+e}var $=!1;function Q(e,t){if(!e||$)return"";$=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),"object"==typeof Reflect&&Reflect.construct){try{Reflect.construct(t,[])}catch(e){var r=e}Reflect.construct(e,[],t)}else{try{t.call()}catch(e){r=e}e.call(t.prototype)}else{try{throw Error()}catch(e){r=e}e()}}catch(e){if(e&&r&&"string"==typeof e.stack){for(var l=e.stack.split("\n"),a=r.stack.split("\n"),o=l.length-1,u=a.length-1;1<=o&&0<=u&&l[o]!==a[u];)u--;for(;1<=o&&0<=u;o--,u--)if(l[o]!==a[u]){if(1!==o||1!==u)do{if(o--,0>--u||l[o]!==a[u])return"\n"+l[o].replace(" at new "," at ")}while(1<=o&&0<=u);break}}}finally{$=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?W(e):""}function H(e){switch(e.tag){case 5:return W(e.type);case 16:return W("Lazy");case 13:return W("Suspense");case 19:return W("SuspenseList");case 0:case 2:case 15:return Q(e.type,!1);case 11:return Q(e.type.render,!1);case 22:return Q(e.type._render,!1);case 1:return Q(e.type,!0);default:return""}}function q(e){if(null==e)return null;if("function"==typeof e)return e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case x:return"Fragment";case S:return"Portal";case C:return"Profiler";case _:return"StrictMode";case z:return"Suspense";case L:return"SuspenseList"}if("object"==typeof e)switch(e.$$typeof){case N:return(e.displayName||"Context")+".Consumer";case P:return(e._context.displayName||"Context")+".Provider";case T:var t=e.render;return t=t.displayName||t.name||"",e.displayName||(""!==t?"ForwardRef("+t+")":"ForwardRef");case O:return q(e.type);case M:return q(e._render);case R:t=e._payload,e=e._init;try{return q(e(t))}catch(e){}}return null}function K(e){switch(typeof e){case"boolean":case"number":case"object":case"string":case"undefined":return e;default:return""}}function Y(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function X(e){e._valueTracker||(e._valueTracker=function(e){var t=Y(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&void 0!==n&&"function"==typeof n.get&&"function"==typeof n.set){var l=n.get,a=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return l.call(this)},set:function(e){r=""+e,a.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(e){r=""+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}(e))}function G(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=Y(e)?e.checked?"true":"false":e.value),(e=r)!==n&&(t.setValue(e),!0)}function Z(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}function J(e,t){var n=t.checked;return l({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=n?n:e._wrapperState.initialChecked})}function ee(e,t){var n=null==t.defaultValue?"":t.defaultValue,r=null!=t.checked?t.checked:t.defaultChecked;n=K(null!=t.value?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:"checkbox"===t.type||"radio"===t.type?null!=t.checked:null!=t.value}}function te(e,t){null!=(t=t.checked)&&w(e,"checked",t,!1)}function ne(e,t){te(e,t);var n=K(t.value),r=t.type;if(null!=n)"number"===r?(0===n&&""===e.value||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if("submit"===r||"reset"===r)return void e.removeAttribute("value");t.hasOwnProperty("value")?le(e,t.type,n):t.hasOwnProperty("defaultValue")&&le(e,t.type,K(t.defaultValue)),null==t.checked&&null!=t.defaultChecked&&(e.defaultChecked=!!t.defaultChecked)}function re(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!("submit"!==r&&"reset"!==r||void 0!==t.value&&null!==t.value))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}""!==(n=e.name)&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,""!==n&&(e.name=n)}function le(e,t,n){"number"===t&&Z(e.ownerDocument)===e||(null==n?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}function ae(e,t){return e=l({children:void 0},t),(t=function(e){var t="";return r.Children.forEach(e,(function(e){null!=e&&(t+=e)})),t}(t.children))&&(e.children=t),e}function oe(e,t,n,r){if(e=e.options,t){t={};for(var l=0;l=n.length))throw Error(o(93));n=n[0]}t=n}null==t&&(t=""),n=t}e._wrapperState={initialValue:K(n)}}function ce(e,t){var n=K(t.value),r=K(t.defaultValue);null!=n&&((n=""+n)!==e.value&&(e.value=n),null==t.defaultValue&&e.defaultValue!==n&&(e.defaultValue=n)),null!=r&&(e.defaultValue=""+r)}function se(e){var t=e.textContent;t===e._wrapperState.initialValue&&""!==t&&null!==t&&(e.value=t)}var fe="http://www.w3.org/1999/xhtml";function de(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 pe(e,t){return null==e||"http://www.w3.org/1999/xhtml"===e?de(t):"http://www.w3.org/2000/svg"===e&&"foreignObject"===t?"http://www.w3.org/1999/xhtml":e}var he,me,ve=(me=function(e,t){if("http://www.w3.org/2000/svg"!==e.namespaceURI||"innerHTML"in e)e.innerHTML=t;else{for((he=he||document.createElement("div")).innerHTML="",t=he.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}},"undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(e,t,n,r){MSApp.execUnsafeLocalFunction((function(){return me(e,t)}))}:me);function ge(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t}var ye={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},be=["Webkit","ms","Moz","O"];function we(e,t,n){return null==t||"boolean"==typeof t||""===t?"":n||"number"!=typeof t||0===t||ye.hasOwnProperty(e)&&ye[e]?(""+t).trim():t+"px"}function ke(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=0===n.indexOf("--"),l=we(n,t[n],r);"float"===n&&(n="cssFloat"),r?e.setProperty(n,l):e[n]=l}}Object.keys(ye).forEach((function(e){be.forEach((function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),ye[t]=ye[e]}))}));var Ee=l({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function Se(e,t){if(t){if(Ee[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML))throw Error(o(137,e));if(null!=t.dangerouslySetInnerHTML){if(null!=t.children)throw Error(o(60));if("object"!=typeof t.dangerouslySetInnerHTML||!("__html"in t.dangerouslySetInnerHTML))throw Error(o(61))}if(null!=t.style&&"object"!=typeof t.style)throw Error(o(62))}}function xe(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 _e(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var Ce=null,Pe=null,Ne=null;function Te(e){if(e=nl(e)){if("function"!=typeof Ce)throw Error(o(280));var t=e.stateNode;t&&(t=ll(t),Ce(e.stateNode,e.type,t))}}function ze(e){Pe?Ne?Ne.push(e):Ne=[e]:Pe=e}function Le(){if(Pe){var e=Pe,t=Ne;if(Ne=Pe=null,Te(e),t)for(e=0;e(r=31-Wt(r))?0:1<n;n++)t.push(e);return t}function Bt(e,t,n){e.pendingLanes|=t;var r=t-1;e.suspendedLanes&=r,e.pingedLanes&=r,(e=e.eventTimes)[t=31-Wt(t)]=n}var Wt=Math.clz32?Math.clz32:function(e){return 0===e?32:31-($t(e)/Qt|0)|0},$t=Math.log,Qt=Math.LN2,Ht=a.unstable_UserBlockingPriority,qt=a.unstable_runWithPriority,Kt=!0;function Yt(e,t,n,r){Ie||Me();var l=Gt,a=Ie;Ie=!0;try{Re(l,e,t,n,r)}finally{(Ie=a)||Ue()}}function Xt(e,t,n,r){qt(Ht,Gt.bind(null,e,t,n,r))}function Gt(e,t,n,r){var l;if(Kt)if((l=0==(4&t))&&0=Fn),jn=String.fromCharCode(32),Vn=!1;function Bn(e,t){switch(e){case"keyup":return-1!==Dn.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Wn(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var $n=!1,Qn={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};function Hn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!Qn[e.type]:"textarea"===t}function qn(e,t,n,r){ze(r),0<(t=Ir(t,"onChange")).length&&(n=new dn("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var Kn=null,Yn=null;function Xn(e){Nr(e,0)}function Gn(e){if(G(rl(e)))return e}function Zn(e,t){if("change"===e)return t}var Jn=!1;if(f){var er;if(f){var tr="oninput"in document;if(!tr){var nr=document.createElement("div");nr.setAttribute("oninput","return;"),tr="function"==typeof nr.oninput}er=tr}else er=!1;Jn=er&&(!document.documentMode||9=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=dr(r)}}function hr(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?hr(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function mr(){for(var e=window,t=Z();t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(e){n=!1}if(!n)break;t=Z((e=t.contentWindow).document)}return t}function vr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}var gr=f&&"documentMode"in document&&11>=document.documentMode,yr=null,br=null,wr=null,kr=!1;function Er(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;kr||null==yr||yr!==Z(r)||(r="selectionStart"in(r=yr)&&vr(r)?{start:r.selectionStart,end:r.selectionEnd}:{anchorNode:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset},wr&&fr(wr,r)||(wr=r,0<(r=Ir(br,"onSelect")).length&&(t=new dn("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=yr)))}Mt("cancel cancel click click close close contextmenu contextMenu copy copy cut cut auxclick auxClick dblclick doubleClick dragend dragEnd dragstart dragStart drop drop focusin focus focusout blur input input invalid invalid keydown keyDown keypress keyPress keyup keyUp mousedown mouseDown mouseup mouseUp paste paste pause pause play play pointercancel pointerCancel pointerdown pointerDown pointerup pointerUp ratechange rateChange reset reset seeked seeked submit submit touchcancel touchCancel touchend touchEnd touchstart touchStart volumechange volumeChange".split(" "),0),Mt("drag drag dragenter dragEnter dragexit dragExit dragleave dragLeave dragover dragOver mousemove mouseMove mouseout mouseOut mouseover mouseOver pointermove pointerMove pointerout pointerOut pointerover pointerOver scroll scroll toggle toggle touchmove touchMove wheel wheel".split(" "),1),Mt(Rt,2);for(var Sr="change selectionchange textInput compositionstart compositionend compositionupdate".split(" "),xr=0;xrul||(e.current=ol[ul],ol[ul]=null,ul--)}function sl(e,t){ul++,ol[ul]=e.current,e.current=t}var fl={},dl=il(fl),pl=il(!1),hl=fl;function ml(e,t){var n=e.type.contextTypes;if(!n)return fl;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var l,a={};for(l in n)a[l]=t[l];return r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=a),a}function vl(e){return null!=e.childContextTypes}function gl(){cl(pl),cl(dl)}function yl(e,t,n){if(dl.current!==fl)throw Error(o(168));sl(dl,t),sl(pl,n)}function bl(e,t,n){var r=e.stateNode;if(e=t.childContextTypes,"function"!=typeof r.getChildContext)return n;for(var a in r=r.getChildContext())if(!(a in e))throw Error(o(108,q(t)||"Unknown",a));return l({},n,r)}function wl(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||fl,hl=dl.current,sl(dl,e),sl(pl,pl.current),!0}function kl(e,t,n){var r=e.stateNode;if(!r)throw Error(o(169));n?(e=bl(e,t,hl),r.__reactInternalMemoizedMergedChildContext=e,cl(pl),cl(dl),sl(dl,e)):cl(pl),sl(pl,n)}var El=null,Sl=null,xl=a.unstable_runWithPriority,_l=a.unstable_scheduleCallback,Cl=a.unstable_cancelCallback,Pl=a.unstable_shouldYield,Nl=a.unstable_requestPaint,Tl=a.unstable_now,zl=a.unstable_getCurrentPriorityLevel,Ll=a.unstable_ImmediatePriority,Ol=a.unstable_UserBlockingPriority,Rl=a.unstable_NormalPriority,Ml=a.unstable_LowPriority,Dl=a.unstable_IdlePriority,Il={},Fl=void 0!==Nl?Nl:function(){},Ul=null,Al=null,jl=!1,Vl=Tl(),Bl=1e4>Vl?Tl:function(){return Tl()-Vl};function Wl(){switch(zl()){case Ll:return 99;case Ol:return 98;case Rl:return 97;case Ml:return 96;case Dl:return 95;default:throw Error(o(332))}}function $l(e){switch(e){case 99:return Ll;case 98:return Ol;case 97:return Rl;case 96:return Ml;case 95:return Dl;default:throw Error(o(332))}}function Ql(e,t){return e=$l(e),xl(e,t)}function Hl(e,t,n){return e=$l(e),_l(e,t,n)}function ql(){if(null!==Al){var e=Al;Al=null,Cl(e)}Kl()}function Kl(){if(!jl&&null!==Ul){jl=!0;var e=0;try{var t=Ul;Ql(99,(function(){for(;em?(v=f,f=null):v=f.sibling;var g=p(l,f,u[m],i);if(null===g){null===f&&(f=v);break}e&&f&&null===g.alternate&&t(l,f),o=a(g,o,m),null===s?c=g:s.sibling=g,s=g,f=v}if(m===u.length)return n(l,f),c;if(null===f){for(;mv?(g=m,m=null):g=m.sibling;var b=p(l,m,y.value,c);if(null===b){null===m&&(m=g);break}e&&m&&null===b.alternate&&t(l,m),u=a(b,u,v),null===f?s=b:f.sibling=b,f=b,m=g}if(y.done)return n(l,m),s;if(null===m){for(;!y.done;v++,y=i.next())null!==(y=d(l,y.value,c))&&(u=a(y,u,v),null===f?s=y:f.sibling=y,f=y);return s}for(m=r(l,m);!y.done;v++,y=i.next())null!==(y=h(m,l,v,y.value,c))&&(e&&null!==y.alternate&&m.delete(null===y.key?v:y.key),u=a(y,u,v),null===f?s=y:f.sibling=y,f=y);return e&&m.forEach((function(e){return t(l,e)})),s}return function(e,r,a,i){var c="object"==typeof a&&null!==a&&a.type===x&&null===a.key;c&&(a=a.props.children);var s="object"==typeof a&&null!==a;if(s)switch(a.$$typeof){case E:e:{for(s=a.key,c=r;null!==c;){if(c.key===s){if(7===c.tag){if(a.type===x){n(e,c.sibling),(r=l(c,a.props.children)).return=e,e=r;break e}}else if(c.elementType===a.type){n(e,c.sibling),(r=l(c,a.props)).ref=Ea(e,c,a),r.return=e,e=r;break e}n(e,c);break}t(e,c),c=c.sibling}a.type===x?((r=Qi(a.props.children,e.mode,i,a.key)).return=e,e=r):((i=$i(a.type,a.key,a.props,null,e.mode,i)).ref=Ea(e,r,a),i.return=e,e=i)}return u(e);case S:e:{for(c=a.key;null!==r;){if(r.key===c){if(4===r.tag&&r.stateNode.containerInfo===a.containerInfo&&r.stateNode.implementation===a.implementation){n(e,r.sibling),(r=l(r,a.children||[])).return=e,e=r;break e}n(e,r);break}t(e,r),r=r.sibling}(r=Ki(a,e.mode,i)).return=e,e=r}return u(e)}if("string"==typeof a||"number"==typeof a)return a=""+a,null!==r&&6===r.tag?(n(e,r.sibling),(r=l(r,a)).return=e,e=r):(n(e,r),(r=qi(a,e.mode,i)).return=e,e=r),u(e);if(ka(a))return m(e,r,a,i);if(B(a))return v(e,r,a,i);if(s&&Sa(e,a),void 0===a&&!c)switch(e.tag){case 1:case 22:case 0:case 11:case 15:throw Error(o(152,q(e.type)||"Component"))}return n(e,r)}}var _a=xa(!0),Ca=xa(!1),Pa={},Na=il(Pa),Ta=il(Pa),za=il(Pa);function La(e){if(e===Pa)throw Error(o(174));return e}function Oa(e,t){switch(sl(za,t),sl(Ta,e),sl(Na,Pa),e=t.nodeType){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:pe(null,"");break;default:t=pe(t=(e=8===e?t.parentNode:t).namespaceURI||null,e=e.tagName)}cl(Na),sl(Na,t)}function Ra(){cl(Na),cl(Ta),cl(za)}function Ma(e){La(za.current);var t=La(Na.current),n=pe(t,e.type);t!==n&&(sl(Ta,e),sl(Na,n))}function Da(e){Ta.current===e&&(cl(Na),cl(Ta))}var Ia=il(0);function Fa(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedState;if(null!==n&&(null===(n=n.dehydrated)||"$?"===n.data||"$!"===n.data))return t}else if(19===t.tag&&void 0!==t.memoizedProps.revealOrder){if(0!=(64&t.flags))return t}else if(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 null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var Ua=null,Aa=null,ja=!1;function Va(e,t){var n=Vi(5,null,null,0);n.elementType="DELETED",n.type="DELETED",n.stateNode=t,n.return=e,n.flags=8,null!==e.lastEffect?(e.lastEffect.nextEffect=n,e.lastEffect=n):e.firstEffect=e.lastEffect=n}function Ba(e,t){switch(e.tag){case 5:var n=e.type;return null!==(t=1!==t.nodeType||n.toLowerCase()!==t.nodeName.toLowerCase()?null:t)&&(e.stateNode=t,!0);case 6:return null!==(t=""===e.pendingProps||3!==t.nodeType?null:t)&&(e.stateNode=t,!0);default:return!1}}function Wa(e){if(ja){var t=Aa;if(t){var n=t;if(!Ba(e,t)){if(!(t=qr(n.nextSibling))||!Ba(e,t))return e.flags=-1025&e.flags|2,ja=!1,void(Ua=e);Va(Ua,n)}Ua=e,Aa=qr(t.firstChild)}else e.flags=-1025&e.flags|2,ja=!1,Ua=e}}function $a(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag;)e=e.return;Ua=e}function Qa(e){if(e!==Ua)return!1;if(!ja)return $a(e),ja=!0,!1;var t=e.type;if(5!==e.tag||"head"!==t&&"body"!==t&&!Wr(t,e.memoizedProps))for(t=Aa;t;)Va(e,t),t=qr(t.nextSibling);if($a(e),13===e.tag){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(o(317));e:{for(e=e.nextSibling,t=0;e;){if(8===e.nodeType){var n=e.data;if("/$"===n){if(0===t){Aa=qr(e.nextSibling);break e}t--}else"$"!==n&&"$!"!==n&&"$?"!==n||t++}e=e.nextSibling}Aa=null}}else Aa=Ua?qr(e.stateNode.nextSibling):null;return!0}function Ha(){Aa=Ua=null,ja=!1}var qa=[];function Ka(){for(var e=0;ea))throw Error(o(301));a+=1,eo=Ja=null,t.updateQueue=null,Ya.current=Mo,e=n(r,l)}while(no)}if(Ya.current=Lo,t=null!==Ja&&null!==Ja.next,Ga=0,eo=Ja=Za=null,to=!1,t)throw Error(o(300));return e}function oo(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===eo?Za.memoizedState=eo=e:eo=eo.next=e,eo}function uo(){if(null===Ja){var e=Za.alternate;e=null!==e?e.memoizedState:null}else e=Ja.next;var t=null===eo?Za.memoizedState:eo.next;if(null!==t)eo=t,Ja=e;else{if(null===e)throw Error(o(310));e={memoizedState:(Ja=e).memoizedState,baseState:Ja.baseState,baseQueue:Ja.baseQueue,queue:Ja.queue,next:null},null===eo?Za.memoizedState=eo=e:eo=eo.next=e}return eo}function io(e,t){return"function"==typeof t?t(e):t}function co(e){var t=uo(),n=t.queue;if(null===n)throw Error(o(311));n.lastRenderedReducer=e;var r=Ja,l=r.baseQueue,a=n.pending;if(null!==a){if(null!==l){var u=l.next;l.next=a.next,a.next=u}r.baseQueue=l=a,n.pending=null}if(null!==l){l=l.next,r=r.baseState;var i=u=a=null,c=l;do{var s=c.lane;if((Ga&s)===s)null!==i&&(i=i.next={lane:0,action:c.action,eagerReducer:c.eagerReducer,eagerState:c.eagerState,next:null}),r=c.eagerReducer===e?c.eagerState:e(r,c.action);else{var f={lane:s,action:c.action,eagerReducer:c.eagerReducer,eagerState:c.eagerState,next:null};null===i?(u=i=f,a=r):i=i.next=f,Za.lanes|=s,Uu|=s}c=c.next}while(null!==c&&c!==l);null===i?a=r:i.next=u,cr(r,t.memoizedState)||(Io=!0),t.memoizedState=r,t.baseState=a,t.baseQueue=i,n.lastRenderedState=r}return[t.memoizedState,n.dispatch]}function so(e){var t=uo(),n=t.queue;if(null===n)throw Error(o(311));n.lastRenderedReducer=e;var r=n.dispatch,l=n.pending,a=t.memoizedState;if(null!==l){n.pending=null;var u=l=l.next;do{a=e(a,u.action),u=u.next}while(u!==l);cr(a,t.memoizedState)||(Io=!0),t.memoizedState=a,null===t.baseQueue&&(t.baseState=a),n.lastRenderedState=a}return[a,r]}function fo(e,t,n){var r=t._getVersion;r=r(t._source);var l=t._workInProgressVersionPrimary;if(null!==l?e=l===r:(e=e.mutableReadLanes,(e=(Ga&e)===e)&&(t._workInProgressVersionPrimary=r,qa.push(t))),e)return n(t._source);throw qa.push(t),Error(o(350))}function po(e,t,n,r){var l=zu;if(null===l)throw Error(o(349));var a=t._getVersion,u=a(t._source),i=Ya.current,c=i.useState((function(){return fo(l,t,n)})),s=c[1],f=c[0];c=eo;var d=e.memoizedState,p=d.refs,h=p.getSnapshot,m=d.source;d=d.subscribe;var v=Za;return e.memoizedState={refs:p,source:t,subscribe:r},i.useEffect((function(){p.getSnapshot=n,p.setSnapshot=s;var e=a(t._source);if(!cr(u,e)){e=n(t._source),cr(f,e)||(s(e),e=si(v),l.mutableReadLanes|=e&l.pendingLanes),e=l.mutableReadLanes,l.entangledLanes|=e;for(var r=l.entanglements,o=e;0n?98:n,(function(){e(!0)})),Ql(97<\/script>",e=e.removeChild(e.firstChild)):"string"==typeof r.is?e=c.createElement(n,{is:r.is}):(e=c.createElement(n),"select"===n&&(c=e,r.multiple?c.multiple=!0:r.size&&(c.size=r.size))):e=c.createElementNS(e,n),e[Gr]=t,e[Zr]=r,qo(e,t),t.stateNode=e,c=xe(n,r),n){case"dialog":Tr("cancel",e),Tr("close",e),a=r;break;case"iframe":case"object":case"embed":Tr("load",e),a=r;break;case"video":case"audio":for(a=0;a<_r.length;a++)Tr(_r[a],e);a=r;break;case"source":Tr("error",e),a=r;break;case"img":case"image":case"link":Tr("error",e),Tr("load",e),a=r;break;case"details":Tr("toggle",e),a=r;break;case"input":ee(e,r),a=J(e,r),Tr("invalid",e);break;case"option":a=ae(e,r);break;case"select":e._wrapperState={wasMultiple:!!r.multiple},a=l({},r,{value:void 0}),Tr("invalid",e);break;case"textarea":ie(e,r),a=ue(e,r),Tr("invalid",e);break;default:a=r}Se(n,a);var s=a;for(u in s)if(s.hasOwnProperty(u)){var f=s[u];"style"===u?ke(e,f):"dangerouslySetInnerHTML"===u?null!=(f=f?f.__html:void 0)&&ve(e,f):"children"===u?"string"==typeof f?("textarea"!==n||""!==f)&&ge(e,f):"number"==typeof f&&ge(e,""+f):"suppressContentEditableWarning"!==u&&"suppressHydrationWarning"!==u&&"autoFocus"!==u&&(i.hasOwnProperty(u)?null!=f&&"onScroll"===u&&Tr("scroll",e):null!=f&&w(e,u,f,c))}switch(n){case"input":X(e),re(e,r,!1);break;case"textarea":X(e),se(e);break;case"option":null!=r.value&&e.setAttribute("value",""+K(r.value));break;case"select":e.multiple=!!r.multiple,null!=(u=r.value)?oe(e,!!r.multiple,u,!1):null!=r.defaultValue&&oe(e,!!r.multiple,r.defaultValue,!0);break;default:"function"==typeof a.onClick&&(e.onclick=Ar)}Br(n,r)&&(t.flags|=4)}null!==t.ref&&(t.flags|=128)}return null;case 6:if(e&&null!=t.stateNode)Yo(0,t,e.memoizedProps,r);else{if("string"!=typeof r&&null===t.stateNode)throw Error(o(166));n=La(za.current),La(Na.current),Qa(t)?(r=t.stateNode,n=t.memoizedProps,r[Gr]=t,r.nodeValue!==n&&(t.flags|=4)):((r=(9===n.nodeType?n:n.ownerDocument).createTextNode(r))[Gr]=t,t.stateNode=r)}return null;case 13:return cl(Ia),r=t.memoizedState,0!=(64&t.flags)?(t.lanes=n,t):(r=null!==r,n=!1,null===e?void 0!==t.memoizedProps.fallback&&Qa(t):n=null!==e.memoizedState,r&&!n&&0!=(2&t.mode)&&(null===e&&!0!==t.memoizedProps.unstable_avoidThisFallback||0!=(1&Ia.current)?0===Du&&(Du=3):(0!==Du&&3!==Du||(Du=4),null===zu||0==(134217727&Uu)&&0==(134217727&Au)||mi(zu,Ou))),(r||n)&&(t.flags|=4),null);case 4:return Ra(),null===e&&Lr(t.stateNode.containerInfo),null;case 10:return na(t),null;case 19:if(cl(Ia),null===(r=t.memoizedState))return null;if(u=0!=(64&t.flags),null===(c=r.rendering))if(u)ru(r,!1);else{if(0!==Du||null!==e&&0!=(64&e.flags))for(e=t.child;null!==e;){if(null!==(c=Fa(e))){for(t.flags|=64,ru(r,!1),null!==(u=c.updateQueue)&&(t.updateQueue=u,t.flags|=4),null===r.lastEffect&&(t.firstEffect=null),t.lastEffect=r.lastEffect,r=n,n=t.child;null!==n;)e=r,(u=n).flags&=2,u.nextEffect=null,u.firstEffect=null,u.lastEffect=null,null===(c=u.alternate)?(u.childLanes=0,u.lanes=e,u.child=null,u.memoizedProps=null,u.memoizedState=null,u.updateQueue=null,u.dependencies=null,u.stateNode=null):(u.childLanes=c.childLanes,u.lanes=c.lanes,u.child=c.child,u.memoizedProps=c.memoizedProps,u.memoizedState=c.memoizedState,u.updateQueue=c.updateQueue,u.type=c.type,e=c.dependencies,u.dependencies=null===e?null:{lanes:e.lanes,firstContext:e.firstContext}),n=n.sibling;return sl(Ia,1&Ia.current|2),t.child}e=e.sibling}null!==r.tail&&Bl()>Wu&&(t.flags|=64,u=!0,ru(r,!1),t.lanes=33554432)}else{if(!u)if(null!==(e=Fa(c))){if(t.flags|=64,u=!0,null!==(n=e.updateQueue)&&(t.updateQueue=n,t.flags|=4),ru(r,!0),null===r.tail&&"hidden"===r.tailMode&&!c.alternate&&!ja)return null!==(t=t.lastEffect=r.lastEffect)&&(t.nextEffect=null),null}else 2*Bl()-r.renderingStartTime>Wu&&1073741824!==n&&(t.flags|=64,u=!0,ru(r,!1),t.lanes=33554432);r.isBackwards?(c.sibling=t.child,t.child=c):(null!==(n=r.last)?n.sibling=c:t.child=c,r.last=c)}return null!==r.tail?(n=r.tail,r.rendering=n,r.tail=n.sibling,r.lastEffect=t.lastEffect,r.renderingStartTime=Bl(),n.sibling=null,t=Ia.current,sl(Ia,u?1&t|2:1&t),n):null;case 23:case 24:return wi(),null!==e&&null!==e.memoizedState!=(null!==t.memoizedState)&&"unstable-defer-without-hiding"!==r.mode&&(t.flags|=4),null}throw Error(o(156,t.tag))}function au(e){switch(e.tag){case 1:vl(e.type)&&gl();var t=e.flags;return 4096&t?(e.flags=-4097&t|64,e):null;case 3:if(Ra(),cl(pl),cl(dl),Ka(),0!=(64&(t=e.flags)))throw Error(o(285));return e.flags=-4097&t|64,e;case 5:return Da(e),null;case 13:return cl(Ia),4096&(t=e.flags)?(e.flags=-4097&t|64,e):null;case 19:return cl(Ia),null;case 4:return Ra(),null;case 10:return na(e),null;case 23:case 24:return wi(),null;default:return null}}function ou(e,t){try{var n="",r=t;do{n+=H(r),r=r.return}while(r);var l=n}catch(e){l="\nError generating stack: "+e.message+"\n"+e.stack}return{value:e,source:t,stack:l}}function uu(e,t){try{console.error(t.value)}catch(e){setTimeout((function(){throw e}))}}qo=function(e,t){for(var n=t.child;null!==n;){if(5===n.tag||6===n.tag)e.appendChild(n.stateNode);else if(4!==n.tag&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===t)break;for(;null===n.sibling;){if(null===n.return||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}},Ko=function(e,t,n,r){var a=e.memoizedProps;if(a!==r){e=t.stateNode,La(Na.current);var o,u=null;switch(n){case"input":a=J(e,a),r=J(e,r),u=[];break;case"option":a=ae(e,a),r=ae(e,r),u=[];break;case"select":a=l({},a,{value:void 0}),r=l({},r,{value:void 0}),u=[];break;case"textarea":a=ue(e,a),r=ue(e,r),u=[];break;default:"function"!=typeof a.onClick&&"function"==typeof r.onClick&&(e.onclick=Ar)}for(f in Se(n,r),n=null,a)if(!r.hasOwnProperty(f)&&a.hasOwnProperty(f)&&null!=a[f])if("style"===f){var c=a[f];for(o in c)c.hasOwnProperty(o)&&(n||(n={}),n[o]="")}else"dangerouslySetInnerHTML"!==f&&"children"!==f&&"suppressContentEditableWarning"!==f&&"suppressHydrationWarning"!==f&&"autoFocus"!==f&&(i.hasOwnProperty(f)?u||(u=[]):(u=u||[]).push(f,null));for(f in r){var s=r[f];if(c=null!=a?a[f]:void 0,r.hasOwnProperty(f)&&s!==c&&(null!=s||null!=c))if("style"===f)if(c){for(o in c)!c.hasOwnProperty(o)||s&&s.hasOwnProperty(o)||(n||(n={}),n[o]="");for(o in s)s.hasOwnProperty(o)&&c[o]!==s[o]&&(n||(n={}),n[o]=s[o])}else n||(u||(u=[]),u.push(f,n)),n=s;else"dangerouslySetInnerHTML"===f?(s=s?s.__html:void 0,c=c?c.__html:void 0,null!=s&&c!==s&&(u=u||[]).push(f,s)):"children"===f?"string"!=typeof s&&"number"!=typeof s||(u=u||[]).push(f,""+s):"suppressContentEditableWarning"!==f&&"suppressHydrationWarning"!==f&&(i.hasOwnProperty(f)?(null!=s&&"onScroll"===f&&Tr("scroll",e),u||c===s||(u=[])):"object"==typeof s&&null!==s&&s.$$typeof===D?s.toString():(u=u||[]).push(f,s))}n&&(u=u||[]).push("style",n);var f=u;(t.updateQueue=f)&&(t.flags|=4)}},Yo=function(e,t,n,r){n!==r&&(t.flags|=4)};var iu="function"==typeof WeakMap?WeakMap:Map;function cu(e,t,n){(n=ca(-1,n)).tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){qu||(qu=!0,Ku=r),uu(0,t)},n}function su(e,t,n){(n=ca(-1,n)).tag=3;var r=e.type.getDerivedStateFromError;if("function"==typeof r){var l=t.value;n.payload=function(){return uu(0,t),r(l)}}var a=e.stateNode;return null!==a&&"function"==typeof a.componentDidCatch&&(n.callback=function(){"function"!=typeof r&&(null===Yu?Yu=new Set([this]):Yu.add(this),uu(0,t));var e=t.stack;this.componentDidCatch(t.value,{componentStack:null!==e?e:""})}),n}var fu="function"==typeof WeakSet?WeakSet:Set;function du(e){var t=e.ref;if(null!==t)if("function"==typeof t)try{t(null)}catch(t){Fi(e,t)}else t.current=null}function pu(e,t){switch(t.tag){case 0:case 11:case 15:case 22:case 5:case 6:case 4:case 17:return;case 1:if(256&t.flags&&null!==e){var n=e.memoizedProps,r=e.memoizedState;t=(e=t.stateNode).getSnapshotBeforeUpdate(t.elementType===t.type?n:Xl(t.type,n),r),e.__reactInternalSnapshotBeforeUpdate=t}return;case 3:return void(256&t.flags&&Hr(t.stateNode.containerInfo))}throw Error(o(163))}function hu(e,t,n){switch(n.tag){case 0:case 11:case 15:case 22:if(null!==(t=null!==(t=n.updateQueue)?t.lastEffect:null)){e=t=t.next;do{if(3==(3&e.tag)){var r=e.create;e.destroy=r()}e=e.next}while(e!==t)}if(null!==(t=null!==(t=n.updateQueue)?t.lastEffect:null)){e=t=t.next;do{var l=e;r=l.next,0!=(4&(l=l.tag))&&0!=(1&l)&&(Mi(n,e),Ri(n,e)),e=r}while(e!==t)}return;case 1:return e=n.stateNode,4&n.flags&&(null===t?e.componentDidMount():(r=n.elementType===n.type?t.memoizedProps:Xl(n.type,t.memoizedProps),e.componentDidUpdate(r,t.memoizedState,e.__reactInternalSnapshotBeforeUpdate))),void(null!==(t=n.updateQueue)&&pa(n,t,e));case 3:if(null!==(t=n.updateQueue)){if(e=null,null!==n.child)switch(n.child.tag){case 5:case 1:e=n.child.stateNode}pa(n,t,e)}return;case 5:return e=n.stateNode,void(null===t&&4&n.flags&&Br(n.type,n.memoizedProps)&&e.focus());case 6:case 4:case 12:case 19:case 17:case 20:case 21:case 23:case 24:return;case 13:return void(null===n.memoizedState&&(n=n.alternate,null!==n&&(n=n.memoizedState,null!==n&&(n=n.dehydrated,null!==n&&kt(n)))))}throw Error(o(163))}function mu(e,t){for(var n=e;;){if(5===n.tag){var r=n.stateNode;if(t)"function"==typeof(r=r.style).setProperty?r.setProperty("display","none","important"):r.display="none";else{r=n.stateNode;var l=n.memoizedProps.style;l=null!=l&&l.hasOwnProperty("display")?l.display:null,r.style.display=we("display",l)}}else if(6===n.tag)n.stateNode.nodeValue=t?"":n.memoizedProps;else if((23!==n.tag&&24!==n.tag||null===n.memoizedState||n===e)&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===e)break;for(;null===n.sibling;){if(null===n.return||n.return===e)return;n=n.return}n.sibling.return=n.return,n=n.sibling}}function vu(e,t){if(Sl&&"function"==typeof Sl.onCommitFiberUnmount)try{Sl.onCommitFiberUnmount(El,t)}catch(e){}switch(t.tag){case 0:case 11:case 14:case 15:case 22:if(null!==(e=t.updateQueue)&&null!==(e=e.lastEffect)){var n=e=e.next;do{var r=n,l=r.destroy;if(r=r.tag,void 0!==l)if(0!=(4&r))Mi(t,n);else{r=t;try{l()}catch(e){Fi(r,e)}}n=n.next}while(n!==e)}break;case 1:if(du(t),"function"==typeof(e=t.stateNode).componentWillUnmount)try{e.props=t.memoizedProps,e.state=t.memoizedState,e.componentWillUnmount()}catch(e){Fi(t,e)}break;case 5:du(t);break;case 4:Eu(e,t)}}function gu(e){e.alternate=null,e.child=null,e.dependencies=null,e.firstEffect=null,e.lastEffect=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.return=null,e.updateQueue=null}function yu(e){return 5===e.tag||3===e.tag||4===e.tag}function bu(e){e:{for(var t=e.return;null!==t;){if(yu(t))break e;t=t.return}throw Error(o(160))}var n=t;switch(t=n.stateNode,n.tag){case 5:var r=!1;break;case 3:case 4:t=t.containerInfo,r=!0;break;default:throw Error(o(161))}16&n.flags&&(ge(t,""),n.flags&=-17);e:t:for(n=e;;){for(;null===n.sibling;){if(null===n.return||yu(n.return)){n=null;break e}n=n.return}for(n.sibling.return=n.return,n=n.sibling;5!==n.tag&&6!==n.tag&&18!==n.tag;){if(2&n.flags)continue t;if(null===n.child||4===n.tag)continue t;n.child.return=n,n=n.child}if(!(2&n.flags)){n=n.stateNode;break e}}r?wu(e,n,t):ku(e,n,t)}function wu(e,t,n){var r=e.tag,l=5===r||6===r;if(l)e=l?e.stateNode:e.stateNode.instance,t?8===n.nodeType?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(8===n.nodeType?(t=n.parentNode).insertBefore(e,n):(t=n).appendChild(e),null!=(n=n._reactRootContainer)||null!==t.onclick||(t.onclick=Ar));else if(4!==r&&null!==(e=e.child))for(wu(e,t,n),e=e.sibling;null!==e;)wu(e,t,n),e=e.sibling}function ku(e,t,n){var r=e.tag,l=5===r||6===r;if(l)e=l?e.stateNode:e.stateNode.instance,t?n.insertBefore(e,t):n.appendChild(e);else if(4!==r&&null!==(e=e.child))for(ku(e,t,n),e=e.sibling;null!==e;)ku(e,t,n),e=e.sibling}function Eu(e,t){for(var n,r,l=t,a=!1;;){if(!a){a=l.return;e:for(;;){if(null===a)throw Error(o(160));switch(n=a.stateNode,a.tag){case 5:r=!1;break e;case 3:case 4:n=n.containerInfo,r=!0;break e}a=a.return}a=!0}if(5===l.tag||6===l.tag){e:for(var u=e,i=l,c=i;;)if(vu(u,c),null!==c.child&&4!==c.tag)c.child.return=c,c=c.child;else{if(c===i)break e;for(;null===c.sibling;){if(null===c.return||c.return===i)break e;c=c.return}c.sibling.return=c.return,c=c.sibling}r?(u=n,i=l.stateNode,8===u.nodeType?u.parentNode.removeChild(i):u.removeChild(i)):n.removeChild(l.stateNode)}else if(4===l.tag){if(null!==l.child){n=l.stateNode.containerInfo,r=!0,l.child.return=l,l=l.child;continue}}else if(vu(e,l),null!==l.child){l.child.return=l,l=l.child;continue}if(l===t)break;for(;null===l.sibling;){if(null===l.return||l.return===t)return;4===(l=l.return).tag&&(a=!1)}l.sibling.return=l.return,l=l.sibling}}function Su(e,t){switch(t.tag){case 0:case 11:case 14:case 15:case 22:var n=t.updateQueue;if(null!==(n=null!==n?n.lastEffect:null)){var r=n=n.next;do{3==(3&r.tag)&&(e=r.destroy,r.destroy=void 0,void 0!==e&&e()),r=r.next}while(r!==n)}return;case 1:case 12:case 17:return;case 5:if(null!=(n=t.stateNode)){r=t.memoizedProps;var l=null!==e?e.memoizedProps:r;e=t.type;var a=t.updateQueue;if(t.updateQueue=null,null!==a){for(n[Zr]=r,"input"===e&&"radio"===r.type&&null!=r.name&&te(n,r),xe(e,l),t=xe(e,r),l=0;ll&&(l=u),n&=~a}if(n=l,10<(n=(120>(n=Bl()-n)?120:480>n?480:1080>n?1080:1920>n?1920:3e3>n?3e3:4320>n?4320:1960*Cu(n/1960))-n)){e.timeoutHandle=$r(Ti.bind(null,e),n);break}Ti(e);break;default:throw Error(o(329))}}return pi(e,Bl()),e.callbackNode===t?hi.bind(null,e):null}function mi(e,t){for(t&=~ju,t&=~Au,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0 component higher in the tree to provide a loading indicator or placeholder to display.")}5!==Du&&(Du=2),i=ou(i,u),d=o;do{switch(d.tag){case 3:a=i,d.flags|=4096,t&=-t,d.lanes|=t,fa(d,cu(0,a,t));break e;case 1:a=i;var k=d.type,E=d.stateNode;if(0==(64&d.flags)&&("function"==typeof k.getDerivedStateFromError||null!==E&&"function"==typeof E.componentDidCatch&&(null===Yu||!Yu.has(E)))){d.flags|=4096,t&=-t,d.lanes|=t,fa(d,su(d,a,t));break e}}d=d.return}while(null!==d)}Ni(n)}catch(e){t=e,Lu===n&&null!==n&&(Lu=n=n.return);continue}break}}function Si(){var e=Pu.current;return Pu.current=Lo,null===e?Lo:e}function xi(e,t){var n=Tu;Tu|=16;var r=Si();for(zu===e&&Ou===t||ki(e,t);;)try{_i();break}catch(t){Ei(e,t)}if(ta(),Tu=n,Pu.current=r,null!==Lu)throw Error(o(261));return zu=null,Ou=0,Du}function _i(){for(;null!==Lu;)Pi(Lu)}function Ci(){for(;null!==Lu&&!Pl();)Pi(Lu)}function Pi(e){var t=Qu(e.alternate,e,Ru);e.memoizedProps=e.pendingProps,null===t?Ni(e):Lu=t,Nu.current=null}function Ni(e){var t=e;do{var n=t.alternate;if(e=t.return,0==(2048&t.flags)){if(null!==(n=lu(n,t,Ru)))return void(Lu=n);if(24!==(n=t).tag&&23!==n.tag||null===n.memoizedState||0!=(1073741824&Ru)||0==(4&n.mode)){for(var r=0,l=n.child;null!==l;)r|=l.lanes|l.childLanes,l=l.sibling;n.childLanes=r}null!==e&&0==(2048&e.flags)&&(null===e.firstEffect&&(e.firstEffect=t.firstEffect),null!==t.lastEffect&&(null!==e.lastEffect&&(e.lastEffect.nextEffect=t.firstEffect),e.lastEffect=t.lastEffect),1u&&(i=u,u=E,E=i),i=pr(b,E),a=pr(b,u),i&&a&&(1!==k.rangeCount||k.anchorNode!==i.node||k.anchorOffset!==i.offset||k.focusNode!==a.node||k.focusOffset!==a.offset)&&((w=w.createRange()).setStart(i.node,i.offset),k.removeAllRanges(),E>u?(k.addRange(w),k.extend(a.node,a.offset)):(w.setEnd(a.node,a.offset),k.addRange(w))))),w=[];for(k=b;k=k.parentNode;)1===k.nodeType&&w.push({element:k,left:k.scrollLeft,top:k.scrollTop});for("function"==typeof b.focus&&b.focus(),b=0;bBl()-Bu?ki(e,0):ju|=n),pi(e,t)}function Ai(e,t){var n=e.stateNode;null!==n&&n.delete(t),0==(t=0)&&(0==(2&(t=e.mode))?t=1:0==(4&t)?t=99===Wl()?1:2:(0===ai&&(ai=Fu),0===(t=jt(62914560&~ai))&&(t=4194304))),n=ci(),null!==(e=di(e,t))&&(Bt(e,t,n),pi(e,n))}function ji(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.flags=0,this.lastEffect=this.firstEffect=this.nextEffect=null,this.childLanes=this.lanes=0,this.alternate=null}function Vi(e,t,n,r){return new ji(e,t,n,r)}function Bi(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Wi(e,t){var n=e.alternate;return null===n?((n=Vi(e.tag,t,e.key,e.mode)).elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.nextEffect=null,n.firstEffect=null,n.lastEffect=null),n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=null===t?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function $i(e,t,n,r,l,a){var u=2;if(r=e,"function"==typeof e)Bi(e)&&(u=1);else if("string"==typeof e)u=5;else e:switch(e){case x:return Qi(n.children,l,a,t);case I:u=8,l|=16;break;case _:u=8,l|=1;break;case C:return(e=Vi(12,n,t,8|l)).elementType=C,e.type=C,e.lanes=a,e;case z:return(e=Vi(13,n,t,l)).type=z,e.elementType=z,e.lanes=a,e;case L:return(e=Vi(19,n,t,l)).elementType=L,e.lanes=a,e;case F:return Hi(n,l,a,t);case U:return(e=Vi(24,n,t,l)).elementType=U,e.lanes=a,e;default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case P:u=10;break e;case N:u=9;break e;case T:u=11;break e;case O:u=14;break e;case R:u=16,r=null;break e;case M:u=22;break e}throw Error(o(130,null==e?e:typeof e,""))}return(t=Vi(u,n,t,l)).elementType=e,t.type=r,t.lanes=a,t}function Qi(e,t,n,r){return(e=Vi(7,e,r,t)).lanes=n,e}function Hi(e,t,n,r){return(e=Vi(23,e,r,t)).elementType=F,e.lanes=n,e}function qi(e,t,n){return(e=Vi(6,e,null,t)).lanes=n,e}function Ki(e,t,n){return(t=Vi(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Yi(e,t,n){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.pendingContext=this.context=null,this.hydrate=n,this.callbackNode=null,this.callbackPriority=0,this.eventTimes=Vt(0),this.expirationTimes=Vt(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Vt(0),this.mutableSourceEagerHydrationData=null}function Xi(e,t,n){var r=3{!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(e){console.error(e)}}(),e.exports=n(748)},751:(e,t,n)=>{var r=n(347),l=60103,a=60106;t.Fragment=60107,t.StrictMode=60108,t.Profiler=60114;var o=60109,u=60110,i=60112;t.Suspense=60113;var c=60115,s=60116;if("function"==typeof Symbol&&Symbol.for){var f=Symbol.for;l=f("react.element"),a=f("react.portal"),t.Fragment=f("react.fragment"),t.StrictMode=f("react.strict_mode"),t.Profiler=f("react.profiler"),o=f("react.provider"),u=f("react.context"),i=f("react.forward_ref"),t.Suspense=f("react.suspense"),c=f("react.memo"),s=f("react.lazy")}var d="function"==typeof Symbol&&Symbol.iterator;function p(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n{e.exports=n(751)},794:(e,t)=>{var n,r,l,a;if("object"==typeof performance&&"function"==typeof performance.now){var o=performance;t.unstable_now=function(){return o.now()}}else{var u=Date,i=u.now();t.unstable_now=function(){return u.now()-i}}if("undefined"==typeof window||"function"!=typeof MessageChannel){var c=null,s=null,f=function(){if(null!==c)try{var e=t.unstable_now();c(!0,e),c=null}catch(e){throw setTimeout(f,0),e}};n=function(e){null!==c?setTimeout(n,0,e):(c=e,setTimeout(f,0))},r=function(e,t){s=setTimeout(e,t)},l=function(){clearTimeout(s)},t.unstable_shouldYield=function(){return!1},a=t.unstable_forceFrameRate=function(){}}else{var d=window.setTimeout,p=window.clearTimeout;if("undefined"!=typeof console){var h=window.cancelAnimationFrame;"function"!=typeof window.requestAnimationFrame&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills"),"function"!=typeof h&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills")}var m=!1,v=null,g=-1,y=5,b=0;t.unstable_shouldYield=function(){return t.unstable_now()>=b},a=function(){},t.unstable_forceFrameRate=function(e){0>e||125>>1,l=e[r];if(!(void 0!==l&&0<_(l,t)))break e;e[r]=t,e[n]=l,n=r}}function S(e){return void 0===(e=e[0])?null:e}function x(e){var t=e[0];if(void 0!==t){var n=e.pop();if(n!==t){e[0]=n;e:for(var r=0,l=e.length;r_(o,n))void 0!==i&&0>_(i,o)?(e[r]=i,e[u]=n,r=u):(e[r]=o,e[a]=n,r=a);else{if(!(void 0!==i&&0>_(i,n)))break e;e[r]=i,e[u]=n,r=u}}}return t}return null}function _(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}var C=[],P=[],N=1,T=null,z=3,L=!1,O=!1,R=!1;function M(e){for(var t=S(P);null!==t;){if(null===t.callback)x(P);else{if(!(t.startTime<=e))break;x(P),t.sortIndex=t.expirationTime,E(C,t)}t=S(P)}}function D(e){if(R=!1,M(e),!O)if(null!==S(C))O=!0,n(I);else{var t=S(P);null!==t&&r(D,t.startTime-e)}}function I(e,n){O=!1,R&&(R=!1,l()),L=!0;var a=z;try{for(M(n),T=S(C);null!==T&&(!(T.expirationTime>n)||e&&!t.unstable_shouldYield());){var o=T.callback;if("function"==typeof o){T.callback=null,z=T.priorityLevel;var u=o(T.expirationTime<=n);n=t.unstable_now(),"function"==typeof u?T.callback=u:T===S(C)&&x(C),M(n)}else x(C);T=S(C)}if(null!==T)var i=!0;else{var c=S(P);null!==c&&r(D,c.startTime-n),i=!1}return i}finally{T=null,z=a,L=!1}}var F=a;t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_continueExecution=function(){O||L||(O=!0,n(I))},t.unstable_getCurrentPriorityLevel=function(){return z},t.unstable_getFirstCallbackNode=function(){return S(C)},t.unstable_next=function(e){switch(z){case 1:case 2:case 3:var t=3;break;default:t=z}var n=z;z=t;try{return e()}finally{z=n}},t.unstable_pauseExecution=function(){},t.unstable_requestPaint=F,t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=z;z=e;try{return t()}finally{z=n}},t.unstable_scheduleCallback=function(e,a,o){var u=t.unstable_now();switch(o="object"==typeof o&&null!==o&&"number"==typeof(o=o.delay)&&0u?(e.sortIndex=o,E(P,e),null===S(C)&&e===S(P)&&(R?l():R=!0,r(D,o-u))):(e.sortIndex=i,E(C,e),O||L||(O=!0,n(I))),e},t.unstable_wrapCallback=function(e){var t=z;return function(){var n=z;z=t;try{return e.apply(this,arguments)}finally{z=n}}}},767:(e,t,n)=>{e.exports=n(794)}},l={};function a(e){var t=l[e];if(void 0!==t)return t.exports;var n=l[e]={exports:{}};return r[e](n,n.exports,a),n.exports}e=a(466),t=a(116),n=Retool.connectReactComponent((function(t){var n,r=t.triggerQuery,l=t.model,a=t.modelUpdate;return e.createElement("div",{style:{width:"100vw",height:"100vh"}},e.createElement("div",null,e.createElement("h4",null,null!==(n=l.headerText)&&void 0!==n?n:""),e.createElement("p",null,"Want to run a query?"),e.createElement("button",{onClick:function(){return r(l.yesQuery)}},"👍"),e.createElement("button",{onClick:function(){return r(l.noQuery)}},"👎")),e.createElement("div",null,e.createElement("button",{onClick:function(){return r(l.runQuery)}},"Get a random user")),e.createElement("div",null,e.createElement("p",null,"Hello Dave Leo?"),e.createElement("input",{onChange:function(e){a({headerText:e.target.value})}})),e.createElement("h2",null,l.displayText))})),document.body.setAttribute("style","margin: 0;"),t.render(e.createElement(n,null),document.body.appendChild(document.createElement("div")))})();
--------------------------------------------------------------------------------
/dist/index.js.LICENSE.txt:
--------------------------------------------------------------------------------
1 | /*
2 | object-assign
3 | (c) Sindre Sorhus
4 | @license MIT
5 | */
6 |
7 | /** @license React v0.20.2
8 | * scheduler.production.min.js
9 | *
10 | * Copyright (c) Facebook, Inc. and its affiliates.
11 | *
12 | * This source code is licensed under the MIT license found in the
13 | * LICENSE file in the root directory of this source tree.
14 | */
15 |
16 | /** @license React v17.0.2
17 | * react-dom.production.min.js
18 | *
19 | * Copyright (c) Facebook, Inc. and its affiliates.
20 | *
21 | * This source code is licensed under the MIT license found in the
22 | * LICENSE file in the root directory of this source tree.
23 | */
24 |
25 | /** @license React v17.0.2
26 | * react.production.min.js
27 | *
28 | * Copyright (c) Facebook, Inc. and its affiliates.
29 | *
30 | * This source code is licensed under the MIT license found in the
31 | * LICENSE file in the root directory of this source tree.
32 | */
33 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "retool_custom_components",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "clean": "rm -rf node_modules && rm -rf dist && rm -rf examples && yarn install",
8 | "dev": "webpack-dev-server --mode=development",
9 | "dev-examples": "webpack-dev-server --mode=development --config webpack.examples.config.js",
10 | "prod": "webpack --mode=production",
11 | "prod-examples": "webpack --mode=production --config webpack.examples.config.js"
12 | },
13 | "author": "bryan-at-retool",
14 | "license": "ISC",
15 | "devDependencies": {
16 | "@babel/core": "^7.15.8",
17 | "@babel/preset-env": "^7.15.8",
18 | "@babel/preset-react": "^7.14.5",
19 | "babel-loader": "^8.2.3",
20 | "css-loader": "^6.4.0",
21 | "file-loader": "^6.2.0",
22 | "style-loader": "^3.3.1",
23 | "webpack": "^5.59.1",
24 | "webpack-cli": "^4.9.1",
25 | "webpack-dev-server": "^4.3.1"
26 | },
27 | "dependencies": {
28 | "@emotion/react": "^11.8.1",
29 | "@emotion/styled": "^11.8.1",
30 | "@mui/material": "^5.4.3",
31 | "react": "^17.0.2",
32 | "react-dom": "^17.0.2",
33 | "react-stepper-horizontal": "^1.0.11",
34 | "styled-components": "^5.3.3"
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/src/ExampleComponent.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | import { Box, Button, Divider, TextField, Typography } from '@mui/material'
4 |
5 | /* Default component model
6 | {
7 | "greeting": "Hello, ",
8 | "username": {{ current_user.fullName }},
9 | "message": "Welcome to custom components!",
10 | "yesQuery": "yesQuery",
11 | "noQuery": "noQuery",
12 | "runQuery": "runQuery"
13 | }
14 | */
15 |
16 | const ExampleComponent = ({ triggerQuery, model, modelUpdate }) => {
17 | const handleChange = (e) => {
18 | modelUpdate({
19 | greeting: e.target.value
20 | })
21 | }
22 | return(
23 | <>
24 |
25 | {model.greeting}{model.username}
26 | {model.message}
27 |
30 |
31 |
32 |
33 | Want to trigger a query?
34 |
39 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 | >
52 | );
53 | }
54 | export default ExampleComponent;
--------------------------------------------------------------------------------
/src/examples/GrowingButton/Button.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | const DEFAULT_URL = 'https://github.com/bryan-at-retool/react-custom-components';
4 | const DEFAULT_TEXT = 'Jump to repository'
5 |
6 |
7 | const HorizontalStepper = ({ triggerQuery, model, modelUpdate }) => {
8 | if (!(typeof model.url === 'string' && model.url.length) ) { model['url'] = DEFAULT_URL; }
9 | if (!(typeof model.text === 'string' && model.text.length) ) { model['text'] = DEFAULT_TEXT; }
10 |
11 | // assumes you have font awesome CDN added
12 | return (
13 |
19 | );
20 | }
21 |
22 | export default Retool.connectReactComponent(HorizontalStepper);
--------------------------------------------------------------------------------
/src/examples/GrowingButton/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import GrowingButton from "./Button";
4 | import './styles.css';
5 |
6 | ReactDOM.render(
7 | ,
8 | document.body.appendChild(document.createElement('div'))
9 | );
--------------------------------------------------------------------------------
/src/examples/GrowingButton/styles.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | padding: 4px;
4 | }
5 |
6 | .textToShow {
7 | display: inline-flex;
8 | gap: 8px;
9 | justify-content: center;
10 | align-items: center;
11 | align-content: center;
12 | width:60px;
13 | height:60px;
14 | background-color:#0C9;
15 | color:#FFF;
16 | border-radius:50px;
17 | text-align:center;
18 | box-shadow: 2px 2px 3px #999;
19 | transition: all .2s ease-in-out;
20 | }
21 | .textToShow:hover {
22 | width: 100%;
23 | }
24 |
25 | .texttoshow > p {
26 | display: none;
27 | }
28 |
29 | .texttoshow:hover > p {
30 | display: block;
31 | }
32 |
--------------------------------------------------------------------------------
/src/examples/HorizontalStepper/HorizontalStepper.js:
--------------------------------------------------------------------------------
1 | import styled from 'styled-components';
2 | import React from 'react';
3 | import Stepper from 'react-stepper-horizontal'
4 |
5 | const DEFAULT_STEPS = ['Bryan','At','Retool'];
6 | const DEFAULT_COLORS = ['#CC0000'];
7 |
8 |
9 | const HorizontalStepper = ({ triggerQuery, model, modelUpdate }) => {
10 | if (!(model.steps && typeof model.steps === 'object' && model.steps.length) ) { model['steps'] = DEFAULT_STEPS; }
11 | if (!(model.colors && typeof model.colors === 'object' && model.colors.length) ) { model['colors'] = DEFAULT_COLORS; }
12 | if (!(typeof model.active_step === 'number' && model.active_step > -1) ) { model['active_step'] = 0; }
13 |
14 | return (
15 |
16 | {return {title: s}}) }
18 | activeStep={ model.active_step }
19 | />
20 |
21 | );
22 | }
23 |
24 | const StepperContainer = styled.div`
25 | width: 100%;
26 | `
27 |
28 | export default Retool.connectReactComponent(HorizontalStepper);
--------------------------------------------------------------------------------
/src/examples/HorizontalStepper/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import HorizontalStepper from "./HorizontalStepper";
4 | import './styles.css';
5 |
6 | ReactDOM.render(
7 | ,
8 | document.body.appendChild(document.createElement('div'))
9 | );
--------------------------------------------------------------------------------
/src/examples/HorizontalStepper/styles.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | }
--------------------------------------------------------------------------------
/src/examples/README.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tryretool/custom-component-guide/947c1c43a6f063c893d9f9c9bc7809036e669ea7/src/examples/README.md
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import ExampleComponent from "./ExampleComponent";
4 |
5 | const RetoolConnectedComponent = Retool.connectReactComponent(ExampleComponent);
6 | document.body.setAttribute('style', 'margin: 0;')
7 | ReactDOM.render(
8 | ,
9 | document.body.appendChild(document.createElement('div'))
10 | );
--------------------------------------------------------------------------------
/webpack.config.js:
--------------------------------------------------------------------------------
1 | const path = require("path");
2 | module.exports = {
3 | context: __dirname,
4 | entry: "./src/index.js",
5 | output: {
6 | path: path.resolve(__dirname, "dist"),
7 | filename: "index.js",
8 | publicPath: "/",
9 | },
10 | devServer: {
11 | historyApiFallback: true,
12 | allowedHosts: 'all',
13 | headers: {
14 | "Access-Control-Allow-Origin": "*",
15 | "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, PATCH, OPTIONS",
16 | "Access-Control-Allow-Headers": "X-Requested-With, content-type, Authorization"
17 | },
18 | client: {
19 | webSocketURL: {
20 | hostname: 'localhost'
21 | },
22 | }
23 | },
24 | module: {
25 | rules: [
26 | {
27 | test: /\.js$/,
28 | use: "babel-loader",
29 | },
30 | {
31 | test: /\.css$/,
32 | use: ["style-loader", "css-loader"],
33 | },
34 | {
35 | test: /\.(png|j?g|svg|gif)?$/,
36 | use: "file-loader",
37 | },
38 | ],
39 | }
40 | };
41 |
--------------------------------------------------------------------------------
/webpack.examples.config.js:
--------------------------------------------------------------------------------
1 | const path = require("path");
2 |
3 | module.exports = {
4 | context: __dirname,
5 | entry: {
6 | horizontal_stepper: './src/examples/HorizontalStepper/index.js',
7 | growing_button: './src/examples/GrowingButton/index.js'
8 | },
9 | output: {
10 | filename: "[name].js",
11 | path: path.join(__dirname, "dist/examples")
12 | },
13 | devServer: {
14 | historyApiFallback: true,
15 | allowedHosts: 'all',
16 | headers: {
17 | "Access-Control-Allow-Origin": "*",
18 | "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, PATCH, OPTIONS",
19 | "Access-Control-Allow-Headers": "X-Requested-With, content-type, Authorization"
20 | },
21 | client: {
22 | webSocketURL: {
23 | hostname: 'localhost'
24 | },
25 | }
26 | },
27 | module: {
28 | rules: [
29 | {
30 | test: /\.js$/,
31 | use: "babel-loader",
32 | },
33 | {
34 | test: /\.css$/,
35 | use: ["style-loader", "css-loader"],
36 | },
37 | {
38 | test: /\.(png|j?g|svg|gif)?$/,
39 | use: "file-loader",
40 | },
41 | ],
42 | },
43 | };
44 |
--------------------------------------------------------------------------------