From 08ca5ec8a4d46782b5fdb98745ba53640235b8eb Mon Sep 17 00:00:00 2001
From: Erik Rasmussen
Date: Sat, 25 Sep 2021 11:50:25 +0200
Subject: [PATCH 1/8] Upgraded deps
---
.eslintrc | 3 +-
package.json | 86 ++++++++++++++++++++++++++--------------------------
2 files changed, 45 insertions(+), 44 deletions(-)
diff --git a/.eslintrc b/.eslintrc
index b76c7847..7939e29a 100755
--- a/.eslintrc
+++ b/.eslintrc
@@ -4,6 +4,7 @@
"rules": {
"jsx-a11y/href-no-hash": 0,
"react-hooks/rules-of-hooks": "error",
- "react-hooks/exhaustive-deps": "warn"
+ "react-hooks/exhaustive-deps": "warn",
+ "import/no-anonymous-default-export": 0
}
}
diff --git a/package.json b/package.json
index c4e1abf1..873f60e6 100644
--- a/package.json
+++ b/package.json
@@ -29,67 +29,67 @@
},
"homepage": "https://github.com/final-form/react-final-form#readme",
"devDependencies": {
- "@babel/core": "^7.12.3",
- "@babel/plugin-proposal-class-properties": "^7.12.1",
- "@babel/plugin-proposal-decorators": "^7.12.1",
- "@babel/plugin-proposal-export-namespace-from": "^7.12.1",
- "@babel/plugin-proposal-function-sent": "^7.12.1",
- "@babel/plugin-proposal-json-strings": "^7.12.1",
- "@babel/plugin-proposal-numeric-separator": "^7.12.1",
- "@babel/plugin-proposal-throw-expressions": "^7.12.1",
+ "@babel/core": "^7.15.5",
+ "@babel/plugin-proposal-class-properties": "^7.14.5",
+ "@babel/plugin-proposal-decorators": "^7.15.4",
+ "@babel/plugin-proposal-export-namespace-from": "^7.14.5",
+ "@babel/plugin-proposal-function-sent": "^7.14.5",
+ "@babel/plugin-proposal-json-strings": "^7.14.5",
+ "@babel/plugin-proposal-numeric-separator": "^7.14.5",
+ "@babel/plugin-proposal-throw-expressions": "^7.14.5",
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/plugin-syntax-import-meta": "^7.10.4",
- "@babel/plugin-transform-flow-strip-types": "^7.12.1",
- "@babel/plugin-transform-react-jsx-source": "^7.12.13",
- "@babel/plugin-transform-runtime": "^7.12.1",
- "@babel/preset-env": "^7.12.1",
- "@babel/preset-flow": "^7.12.1",
- "@babel/preset-react": "^7.12.1",
- "@testing-library/jest-dom": "^5.11.4",
- "@testing-library/react": "^11.1.0",
- "@types/react": "^16.9.53",
- "@typescript-eslint/eslint-plugin": "^4.5.0",
- "@typescript-eslint/parser": "^4.5.0",
+ "@babel/plugin-transform-flow-strip-types": "^7.14.5",
+ "@babel/plugin-transform-react-jsx-source": "^7.14.5",
+ "@babel/plugin-transform-runtime": "^7.15.0",
+ "@babel/preset-env": "^7.15.6",
+ "@babel/preset-flow": "^7.14.5",
+ "@babel/preset-react": "^7.14.5",
+ "@testing-library/jest-dom": "^5.14.1",
+ "@testing-library/react": "^12.1.0",
+ "@types/react": "^17.0.24",
+ "@typescript-eslint/eslint-plugin": "^4.31.2",
+ "@typescript-eslint/parser": "^4.31.2",
"babel-core": "^7.0.0-bridge.0",
"babel-eslint": "^10.1.0",
- "babel-jest": "^26.6.0",
- "bundlesize": "^0.18.0",
- "doctoc": "^1.4.0",
- "dtslint": "^4.0.4",
- "eslint": "^7.11.0",
- "eslint-config-react-app": "^5.2.1",
+ "babel-jest": "^27.2.1",
+ "bundlesize": "^0.18.1",
+ "doctoc": "^2.0.1",
+ "dtslint": "^4.1.6",
+ "eslint": "^7.32.0",
+ "eslint-config-react-app": "^6.0.0",
"eslint-plugin-babel": "^5.3.1",
- "eslint-plugin-flowtype": "^5.2.0",
- "eslint-plugin-import": "^2.22.1",
- "eslint-plugin-jsx-a11y": "^6.3.1",
- "eslint-plugin-react": "^7.21.5",
+ "eslint-plugin-flowtype": "^6.1.0",
+ "eslint-plugin-import": "^2.24.2",
+ "eslint-plugin-jsx-a11y": "^6.4.1",
+ "eslint-plugin-react": "^7.26.0",
"eslint-plugin-react-hooks": "^4.2.0",
"fast-deep-equal": "^3.1.3",
- "final-form": "^4.20.1",
- "flow-bin": "^0.136.0",
+ "final-form": "^4.20.2",
+ "flow-bin": "^0.160.2",
"glow": "^1.2.2",
"husky": "^4.3.0",
- "jest": "^26.6.0",
- "jest-mock-console": "^1.0.1",
- "lint-staged": "^10.4.2",
+ "jest": "^27.2.1",
+ "jest-mock-console": "^1.1.0",
+ "lint-staged": "^11.1.2",
"nps": "^5.10.0",
"nps-utils": "^1.7.0",
"opencollective": "^1.0.3",
- "prettier": "^2.1.2",
- "prettier-eslint-cli": "^5.0.0",
- "react": "^17.0.0",
- "react-dom": "^17.0.0",
- "rollup": "^2.32.1",
+ "prettier": "^2.4.1",
+ "prettier-eslint-cli": "^5.0.1",
+ "react": "^17.0.2",
+ "react-dom": "^17.0.2",
+ "rollup": "^2.57.0",
"rollup-plugin-babel": "^4.4.0",
"rollup-plugin-commonjs": "^10.1.0",
"rollup-plugin-json": "^4.0.0",
"rollup-plugin-node-resolve": "^5.2.0",
"rollup-plugin-replace": "^2.2.0",
"rollup-plugin-uglify": "^6.0.4",
- "tar": "^6.0.5",
- "ts-essentials": "^7.0.1",
+ "tar": "^6.1.11",
+ "ts-essentials": "^8.1.0",
"tslint": "^6.1.3",
- "typescript": "^4.0.3"
+ "typescript": "^4.4.3"
},
"peerDependencies": {
"final-form": "^4.20.0",
@@ -130,6 +130,6 @@
"url": "https://opencollective.com/final-form"
},
"dependencies": {
- "@babel/runtime": "^7.12.1"
+ "@babel/runtime": "^7.15.4"
}
}
From c2f5a182cf1fb5dc71e5fa92b8537a3efa434ea1 Mon Sep 17 00:00:00 2001
From: Erik Rasmussen
Date: Sat, 25 Sep 2021 11:52:54 +0200
Subject: [PATCH 2/8] Upgraded react in examples
---
examples/async-field-level-validation/package.json | 6 +++---
examples/async-redux-submission/package.json | 6 +++---
examples/async-typeahead-redux/package.json | 6 +++---
examples/auto-save-field-blur/package.json | 6 +++---
examples/auto-save-selective-debounce/package.json | 6 +++---
examples/auto-save-with-debounce/package.json | 6 +++---
examples/calculated-fields/package.json | 6 +++---
examples/chakra/package.json | 4 ++--
examples/conditional-fields/package.json | 6 +++---
examples/credit-card/package.json | 6 +++---
examples/custom-validation-engine/package.json | 6 +++---
examples/debounced-record-level-validation/package.json | 6 +++---
examples/declarative-form-rules/package.json | 6 +++---
examples/downshift-typeahead/package.json | 6 +++---
examples/external-submit/package.json | 6 +++---
examples/field-arrays/package.json | 6 +++---
examples/field-warnings/package.json | 6 +++---
examples/focus-first-error/package.json | 6 +++---
examples/format-on-blur/package.json | 6 +++---
examples/format-string-by-pattern/package.json | 6 +++---
.../hybrid-sync-async-record-level-validation/package.json | 6 +++---
.../independent-error-component-render-props/package.json | 6 +++---
.../independent-error-component-with-hooks/package.json | 6 +++---
examples/listening-for-external-changes/package.json | 6 +++---
examples/loading-initializing-values/package.json | 6 +++---
examples/loading-saving-reinitializing/package.json | 6 +++---
examples/parse-format/package.json | 6 +++---
examples/redux/package.json | 6 +++---
examples/reusable-field-groups/package.json | 6 +++---
examples/styling-with-smooth-ui/package.json | 6 +++---
examples/third-party-components/package.json | 6 +++---
31 files changed, 92 insertions(+), 92 deletions(-)
diff --git a/examples/async-field-level-validation/package.json b/examples/async-field-level-validation/package.json
index d42c59c5..33349807 100644
--- a/examples/async-field-level-validation/package.json
+++ b/examples/async-field-level-validation/package.json
@@ -12,9 +12,9 @@
"main": "index.js",
"dependencies": {
"final-form": "4.16.1",
- "react": "16.8.6",
- "react-dom": "16.8.6",
+ "react": "17.0.2",
+ "react-dom": "17.0.2",
"react-final-form": "6.3.0",
"styled-components": "4.2.0"
}
-}
\ No newline at end of file
+}
diff --git a/examples/async-redux-submission/package.json b/examples/async-redux-submission/package.json
index 3791a97a..f816abdd 100644
--- a/examples/async-redux-submission/package.json
+++ b/examples/async-redux-submission/package.json
@@ -13,8 +13,8 @@
"main": "src/index.js",
"dependencies": {
"final-form": "4.12.0",
- "react": "16.8.6",
- "react-dom": "16.8.6",
+ "react": "17.0.2",
+ "react-dom": "17.0.2",
"react-final-form": "5.0.1",
"react-redux": "7.0.3",
"react-redux-promise-listener": "1.0.0",
@@ -30,4 +30,4 @@
"test": "react-scripts test --env=jsdom",
"eject": "react-scripts eject"
}
-}
\ No newline at end of file
+}
diff --git a/examples/async-typeahead-redux/package.json b/examples/async-typeahead-redux/package.json
index af0755c6..b2fc1d48 100644
--- a/examples/async-typeahead-redux/package.json
+++ b/examples/async-typeahead-redux/package.json
@@ -9,13 +9,13 @@
"final-form": "4.18.5",
"final-form-set-field-data": "1.0.2",
"ramda": "0.25.0",
- "react": "16.9.0",
+ "react": "17.0.2",
"react-bootstrap-typeahead": "3.1.4",
- "react-dom": "16.9.0",
+ "react-dom": "17.0.2",
"react-final-form": "6.3.0",
"react-redux": "7.1.0",
"redux": "4.0.4",
"redux-thunk": "2.3.0",
"styled-components": "2.4.0"
}
-}
\ No newline at end of file
+}
diff --git a/examples/auto-save-field-blur/package.json b/examples/auto-save-field-blur/package.json
index 391f4668..4ae3471b 100644
--- a/examples/auto-save-field-blur/package.json
+++ b/examples/auto-save-field-blur/package.json
@@ -8,9 +8,9 @@
"final-form": "4.12.0",
"final-form-set-field-data": "1.0.2",
"object-diff": "0.0.4",
- "react": "16.8.6",
- "react-dom": "16.8.6",
+ "react": "17.0.2",
+ "react-dom": "17.0.2",
"react-final-form": "5.0.1",
"styled-components": "4.2.0"
}
-}
\ No newline at end of file
+}
diff --git a/examples/auto-save-selective-debounce/package.json b/examples/auto-save-selective-debounce/package.json
index cb32429b..416810e5 100644
--- a/examples/auto-save-selective-debounce/package.json
+++ b/examples/auto-save-selective-debounce/package.json
@@ -7,9 +7,9 @@
"dependencies": {
"final-form": "4.12.0",
"object-diff": "0.0.4",
- "react": "16.8.6",
- "react-dom": "16.8.6",
+ "react": "17.0.2",
+ "react-dom": "17.0.2",
"react-final-form": "5.0.1",
"styled-components": "4.2.0"
}
-}
\ No newline at end of file
+}
diff --git a/examples/auto-save-with-debounce/package.json b/examples/auto-save-with-debounce/package.json
index ff6b38a2..3358038e 100644
--- a/examples/auto-save-with-debounce/package.json
+++ b/examples/auto-save-with-debounce/package.json
@@ -13,9 +13,9 @@
"dependencies": {
"final-form": "4.12.0",
"object-diff": "0.0.4",
- "react": "16.8.6",
- "react-dom": "16.8.6",
+ "react": "17.0.2",
+ "react-dom": "17.0.2",
"react-final-form": "5.0.1",
"styled-components": "4.2.0"
}
-}
\ No newline at end of file
+}
diff --git a/examples/calculated-fields/package.json b/examples/calculated-fields/package.json
index 81196f07..6bfd7caa 100644
--- a/examples/calculated-fields/package.json
+++ b/examples/calculated-fields/package.json
@@ -8,9 +8,9 @@
"dependencies": {
"final-form": "4.12.0",
"final-form-calculate": "1.3.1",
- "react": "16.8.6",
- "react-dom": "16.8.6",
+ "react": "17.0.2",
+ "react-dom": "17.0.2",
"react-final-form": "5.0.1",
"styled-components": "4.2.0"
}
-}
\ No newline at end of file
+}
diff --git a/examples/chakra/package.json b/examples/chakra/package.json
index 57156329..09b0d19a 100644
--- a/examples/chakra/package.json
+++ b/examples/chakra/package.json
@@ -16,8 +16,8 @@
"@emotion/styled": "^10.0.17",
"emotion-theming": "^10.0.17",
"final-form": "4.18.6",
- "react": "16.12.0",
- "react-dom": "16.12.0",
+ "react": "17.0.2",
+ "react-dom": "17.0.2",
"react-final-form": "latest",
"react-scripts": "3.2.0"
},
diff --git a/examples/conditional-fields/package.json b/examples/conditional-fields/package.json
index 406f44ab..d13b371a 100644
--- a/examples/conditional-fields/package.json
+++ b/examples/conditional-fields/package.json
@@ -7,8 +7,8 @@
"main": "src/index.js",
"dependencies": {
"final-form": "4.12.0",
- "react": "16.8.6",
- "react-dom": "16.8.6",
+ "react": "17.0.2",
+ "react-dom": "17.0.2",
"react-final-form": "5.0.1",
"react-scripts": "3.0.1",
"styled-components": "4.2.0"
@@ -20,4 +20,4 @@
"test": "react-scripts test --env=jsdom",
"eject": "react-scripts eject"
}
-}
\ No newline at end of file
+}
diff --git a/examples/credit-card/package.json b/examples/credit-card/package.json
index 441024b4..5e611713 100644
--- a/examples/credit-card/package.json
+++ b/examples/credit-card/package.json
@@ -13,9 +13,9 @@
"main": "src/index.js",
"dependencies": {
"final-form": "4.12.0",
- "react": "16.8.6",
+ "react": "17.0.2",
"react-credit-cards": "0.7.0",
- "react-dom": "16.8.6",
+ "react-dom": "17.0.2",
"react-final-form": "5.0.1",
"react-scripts": "3.0.1",
"styled-components": "4.2.0"
@@ -27,4 +27,4 @@
"test": "react-scripts test --env=jsdom",
"eject": "react-scripts eject"
}
-}
\ No newline at end of file
+}
diff --git a/examples/custom-validation-engine/package.json b/examples/custom-validation-engine/package.json
index ae3b6898..f4c04b4a 100644
--- a/examples/custom-validation-engine/package.json
+++ b/examples/custom-validation-engine/package.json
@@ -7,10 +7,10 @@
"dependencies": {
"final-form": "4.12.0",
"final-form-set-field-data": "1.0.2",
- "react": "16.8.6",
- "react-dom": "16.8.6",
+ "react": "17.0.2",
+ "react-dom": "17.0.2",
"react-final-form": "5.0.1",
"react-fontawesome": "1.6.1",
"styled-components": "4.2.0"
}
-}
\ No newline at end of file
+}
diff --git a/examples/debounced-record-level-validation/package.json b/examples/debounced-record-level-validation/package.json
index ace6b53d..4603f089 100644
--- a/examples/debounced-record-level-validation/package.json
+++ b/examples/debounced-record-level-validation/package.json
@@ -6,8 +6,8 @@
"main": "src/index.js",
"dependencies": {
"final-form": "4.12.0",
- "react": "16.8.6",
- "react-dom": "16.8.6",
+ "react": "17.0.2",
+ "react-dom": "17.0.2",
"react-final-form": "5.0.1",
"react-scripts": "2.0.3",
"styled-components": "4.2.0"
@@ -25,4 +25,4 @@
"not ie <= 11",
"not op_mini all"
]
-}
\ No newline at end of file
+}
diff --git a/examples/declarative-form-rules/package.json b/examples/declarative-form-rules/package.json
index 120ec310..60a9b17b 100644
--- a/examples/declarative-form-rules/package.json
+++ b/examples/declarative-form-rules/package.json
@@ -13,8 +13,8 @@
"main": "src/index.js",
"dependencies": {
"final-form": "4.12.0",
- "react": "16.8.6",
- "react-dom": "16.8.6",
+ "react": "17.0.2",
+ "react-dom": "17.0.2",
"react-final-form": "5.0.1",
"react-final-form-listeners": "1.0.2",
"react-scripts": "3.0.1",
@@ -27,4 +27,4 @@
"test": "react-scripts test --env=jsdom",
"eject": "react-scripts eject"
}
-}
\ No newline at end of file
+}
diff --git a/examples/downshift-typeahead/package.json b/examples/downshift-typeahead/package.json
index b0596c5a..7fc70bfc 100644
--- a/examples/downshift-typeahead/package.json
+++ b/examples/downshift-typeahead/package.json
@@ -15,8 +15,8 @@
"downshift": "1.28.0",
"final-form": "4.12.0",
"match-sorter": "3.0.0",
- "react": "16.8.6",
- "react-dom": "16.8.6",
+ "react": "17.0.2",
+ "react-dom": "17.0.2",
"react-final-form": "5.0.1",
"react-scripts": "3.0.1",
"styled-components": "4.2.0"
@@ -28,4 +28,4 @@
"test": "react-scripts test --env=jsdom",
"eject": "react-scripts eject"
}
-}
\ No newline at end of file
+}
diff --git a/examples/external-submit/package.json b/examples/external-submit/package.json
index 2efa334b..463c7f66 100644
--- a/examples/external-submit/package.json
+++ b/examples/external-submit/package.json
@@ -12,9 +12,9 @@
"main": "index.js",
"dependencies": {
"final-form": "4.12.0",
- "react": "16.8.6",
- "react-dom": "16.8.6",
+ "react": "17.0.2",
+ "react-dom": "17.0.2",
"react-final-form": "5.0.1",
"styled-components": "4.2.0"
}
-}
\ No newline at end of file
+}
diff --git a/examples/field-arrays/package.json b/examples/field-arrays/package.json
index f714e770..f3114c6a 100644
--- a/examples/field-arrays/package.json
+++ b/examples/field-arrays/package.json
@@ -7,10 +7,10 @@
"dependencies": {
"final-form": "4.12.0",
"final-form-arrays": "1.1.2",
- "react": "16.8.6",
- "react-dom": "16.8.6",
+ "react": "17.0.2",
+ "react-dom": "17.0.2",
"react-final-form": "4.1.0",
"react-final-form-arrays": "2.0.3",
"styled-components": "4.2.0"
}
-}
\ No newline at end of file
+}
diff --git a/examples/field-warnings/package.json b/examples/field-warnings/package.json
index 6967fd01..b15673fd 100644
--- a/examples/field-warnings/package.json
+++ b/examples/field-warnings/package.json
@@ -8,9 +8,9 @@
"dependencies": {
"styled-components": "2.2.4",
"react-final-form": "1.2.0",
- "react-dom": "16.0.0",
- "react": "16.0.0",
+ "react-dom": "17.0.2",
+ "react": "17.0.2",
"final-form-set-field-data": "1.0.0",
"final-form": "1.3.1"
}
-}
\ No newline at end of file
+}
diff --git a/examples/focus-first-error/package.json b/examples/focus-first-error/package.json
index 3187a4fa..06748335 100644
--- a/examples/focus-first-error/package.json
+++ b/examples/focus-first-error/package.json
@@ -8,8 +8,8 @@
"dependencies": {
"final-form": "4.12.0",
"final-form-focus": "1.1.2",
- "react": "16.8.6",
- "react-dom": "16.8.6",
+ "react": "17.0.2",
+ "react-dom": "17.0.2",
"react-final-form": "5.0.1",
"react-scripts": "3.0.1",
"styled-components": "4.2.0"
@@ -21,4 +21,4 @@
"test": "react-scripts test --env=jsdom",
"eject": "react-scripts eject"
}
-}
\ No newline at end of file
+}
diff --git a/examples/format-on-blur/package.json b/examples/format-on-blur/package.json
index 19875403..6c4ec408 100644
--- a/examples/format-on-blur/package.json
+++ b/examples/format-on-blur/package.json
@@ -13,8 +13,8 @@
"dependencies": {
"final-form": "4.12.0",
"numeral": "2.0.6",
- "react": "16.8.6",
- "react-dom": "16.8.6",
+ "react": "17.0.2",
+ "react-dom": "17.0.2",
"react-final-form": "5.0.1",
"react-scripts": "3.0.1",
"styled-components": "4.2.0"
@@ -26,4 +26,4 @@
"test": "react-scripts test --env=jsdom",
"eject": "react-scripts eject"
}
-}
\ No newline at end of file
+}
diff --git a/examples/format-string-by-pattern/package.json b/examples/format-string-by-pattern/package.json
index f3bf437e..edf88836 100644
--- a/examples/format-string-by-pattern/package.json
+++ b/examples/format-string-by-pattern/package.json
@@ -7,9 +7,9 @@
"dependencies": {
"final-form": "latest",
"format-string-by-pattern": "1.1.1",
- "react": "16.8.6",
- "react-dom": "16.8.6",
+ "react": "17.0.2",
+ "react-dom": "17.0.2",
"react-final-form": "latest",
"styled-components": "latest"
}
-}
\ No newline at end of file
+}
diff --git a/examples/hybrid-sync-async-record-level-validation/package.json b/examples/hybrid-sync-async-record-level-validation/package.json
index ecbc8105..d4e4d61d 100644
--- a/examples/hybrid-sync-async-record-level-validation/package.json
+++ b/examples/hybrid-sync-async-record-level-validation/package.json
@@ -12,9 +12,9 @@
"main": "index.js",
"dependencies": {
"final-form": "latest",
- "react": "16.8.6",
- "react-dom": "16.8.6",
+ "react": "17.0.2",
+ "react-dom": "17.0.2",
"react-final-form": "latest",
"styled-components": "4.2.0"
}
-}
\ No newline at end of file
+}
diff --git a/examples/independent-error-component-render-props/package.json b/examples/independent-error-component-render-props/package.json
index 581e7556..1767a6b5 100644
--- a/examples/independent-error-component-render-props/package.json
+++ b/examples/independent-error-component-render-props/package.json
@@ -6,9 +6,9 @@
"main": "index.js",
"dependencies": {
"final-form": "4.13.1",
- "react": "16.8.6",
- "react-dom": "16.8.6",
+ "react": "17.0.2",
+ "react-dom": "17.0.2",
"react-final-form": "6.0.1",
"styled-components": "4.2.1"
}
-}
\ No newline at end of file
+}
diff --git a/examples/independent-error-component-with-hooks/package.json b/examples/independent-error-component-with-hooks/package.json
index b6ac2eb1..d9e8b4da 100644
--- a/examples/independent-error-component-with-hooks/package.json
+++ b/examples/independent-error-component-with-hooks/package.json
@@ -6,9 +6,9 @@
"main": "index.js",
"dependencies": {
"final-form": "4.13.1",
- "react": "16.8.6",
- "react-dom": "16.8.6",
+ "react": "17.0.2",
+ "react-dom": "17.0.2",
"react-final-form": "6.0.1",
"styled-components": "4.2.1"
}
-}
\ No newline at end of file
+}
diff --git a/examples/listening-for-external-changes/package.json b/examples/listening-for-external-changes/package.json
index ccd8e3a7..1dc75a88 100644
--- a/examples/listening-for-external-changes/package.json
+++ b/examples/listening-for-external-changes/package.json
@@ -14,8 +14,8 @@
"dependencies": {
"final-form": "4.12.0",
"final-form-calculate": "1.3.1",
- "react": "16.8.6",
- "react-dom": "16.8.6",
+ "react": "17.0.2",
+ "react-dom": "17.0.2",
"react-final-form": "5.0.1",
"react-scripts": "3.0.1",
"styled-components": "4.2.0"
@@ -27,4 +27,4 @@
"test": "react-scripts test --env=jsdom",
"eject": "react-scripts eject"
}
-}
\ No newline at end of file
+}
diff --git a/examples/loading-initializing-values/package.json b/examples/loading-initializing-values/package.json
index 901a11d7..98c563ed 100644
--- a/examples/loading-initializing-values/package.json
+++ b/examples/loading-initializing-values/package.json
@@ -6,9 +6,9 @@
"main": "index.js",
"dependencies": {
"final-form": "4.12.0",
- "react": "16.8.6",
- "react-dom": "16.8.6",
+ "react": "17.0.2",
+ "react-dom": "17.0.2",
"react-final-form": "5.0.1",
"styled-components": "4.2.0"
}
-}
\ No newline at end of file
+}
diff --git a/examples/loading-saving-reinitializing/package.json b/examples/loading-saving-reinitializing/package.json
index 4ff65ddf..65ec1320 100644
--- a/examples/loading-saving-reinitializing/package.json
+++ b/examples/loading-saving-reinitializing/package.json
@@ -12,10 +12,10 @@
"main": "index.js",
"dependencies": {
"final-form": "4.12.0",
- "react": "16.8.6",
- "react-dom": "16.8.6",
+ "react": "17.0.2",
+ "react-dom": "17.0.2",
"react-final-form": "5.0.1",
"react-fontawesome": "1.6.1",
"styled-components": "4.2.0"
}
-}
\ No newline at end of file
+}
diff --git a/examples/parse-format/package.json b/examples/parse-format/package.json
index 685f0410..e340241d 100644
--- a/examples/parse-format/package.json
+++ b/examples/parse-format/package.json
@@ -12,9 +12,9 @@
"main": "index.js",
"dependencies": {
"final-form": "latest",
- "react": "16.8.6",
- "react-dom": "16.8.6",
+ "react": "17.0.2",
+ "react-dom": "17.0.2",
"react-final-form": "latest",
"styled-components": "latest"
}
-}
\ No newline at end of file
+}
diff --git a/examples/redux/package.json b/examples/redux/package.json
index e711b406..a914eafa 100644
--- a/examples/redux/package.json
+++ b/examples/redux/package.json
@@ -13,8 +13,8 @@
"main": "src/index.js",
"dependencies": {
"final-form": "4.12.0",
- "react": "16.8.6",
- "react-dom": "16.8.6",
+ "react": "17.0.2",
+ "react-dom": "17.0.2",
"react-final-form": "5.0.1",
"react-redux": "7.0.3",
"react-scripts": "3.0.1",
@@ -28,4 +28,4 @@
"test": "react-scripts test --env=jsdom",
"eject": "react-scripts eject"
}
-}
\ No newline at end of file
+}
diff --git a/examples/reusable-field-groups/package.json b/examples/reusable-field-groups/package.json
index d747c85b..1236cdf1 100644
--- a/examples/reusable-field-groups/package.json
+++ b/examples/reusable-field-groups/package.json
@@ -6,9 +6,9 @@
"main": "index.js",
"dependencies": {
"final-form": "4.12.0",
- "react": "16.8.6",
- "react-dom": "16.8.6",
+ "react": "17.0.2",
+ "react-dom": "17.0.2",
"react-final-form": "5.0.1",
"styled-components": "4.2.0"
}
-}
\ No newline at end of file
+}
diff --git a/examples/styling-with-smooth-ui/package.json b/examples/styling-with-smooth-ui/package.json
index d0702baa..1d2bb3a6 100644
--- a/examples/styling-with-smooth-ui/package.json
+++ b/examples/styling-with-smooth-ui/package.json
@@ -12,8 +12,8 @@
"main": "src/index.js",
"dependencies": {
"final-form": "4.12.0",
- "react": "16.8.6",
- "react-dom": "16.8.6",
+ "react": "17.0.2",
+ "react-dom": "17.0.2",
"react-final-form": "5.0.1",
"react-scripts": "3.0.1",
"smooth-ui": "4.3.2",
@@ -26,4 +26,4 @@
"test": "react-scripts test --env=jsdom",
"eject": "react-scripts eject"
}
-}
\ No newline at end of file
+}
diff --git a/examples/third-party-components/package.json b/examples/third-party-components/package.json
index 6d1fc879..19339d91 100644
--- a/examples/third-party-components/package.json
+++ b/examples/third-party-components/package.json
@@ -13,11 +13,11 @@
"dependencies": {
"final-form": "4.12.0",
"material-ui": "0.20.2",
- "react": "16.8.6",
+ "react": "17.0.2",
"react-addons-shallow-compare": "15.6.2",
- "react-dom": "16.8.6",
+ "react-dom": "17.0.2",
"react-final-form": "5.0.1",
"react-select": "2.4.3",
"styled-components": "4.2.0"
}
-}
\ No newline at end of file
+}
From 36d053c131a097c942defcfd2acd4c25306b2a4e Mon Sep 17 00:00:00 2001
From: Erik Rasmussen
Date: Sat, 25 Sep 2021 11:55:35 +0200
Subject: [PATCH 3/8] Upgraded FF and RFF in examples
---
examples/async-field-level-validation/package.json | 4 ++--
examples/async-redux-submission/package.json | 4 ++--
examples/async-typeahead-redux/package.json | 4 ++--
examples/auto-save-field-blur/package.json | 4 ++--
examples/auto-save-selective-debounce/package.json | 4 ++--
examples/auto-save-with-debounce/package.json | 4 ++--
examples/calculated-fields/package.json | 4 ++--
examples/chakra/package.json | 4 ++--
examples/conditional-fields/package.json | 4 ++--
examples/credit-card/package.json | 4 ++--
examples/custom-validation-engine/package.json | 4 ++--
.../debounced-record-level-validation/package.json | 4 ++--
examples/declarative-form-rules/package.json | 4 ++--
examples/downshift-typeahead/package.json | 4 ++--
examples/external-submit/package.json | 4 ++--
examples/field-arrays/package.json | 4 ++--
examples/field-level-validation/package.json | 4 ++--
examples/field-warnings/package.json | 4 ++--
examples/fields-component/package.json | 4 ++--
examples/focus-first-error/package.json | 4 ++--
examples/format-on-blur/package.json | 4 ++--
examples/format-string-by-pattern/package.json | 4 ++--
.../package.json | 4 ++--
.../package.json | 4 ++--
.../package.json | 4 ++--
examples/listening-for-external-changes/package.json | 4 ++--
examples/loading-initializing-values/package.json | 4 ++--
examples/loading-saving-reinitializing/package.json | 4 ++--
examples/material-ui/package.json | 8 +++++---
examples/parse-format/package.json | 4 ++--
examples/prefixed-fields/package.json | 6 +++---
examples/record-level-validation/package.json | 4 ++--
examples/redux/package.json | 4 ++--
examples/reusable-field-groups/package.json | 4 ++--
examples/simple/package.json | 4 ++--
examples/styling-with-smooth-ui/package.json | 4 ++--
examples/submission-errors/package.json | 4 ++--
examples/subscriptions/package.json | 4 ++--
examples/third-party-components/package.json | 4 ++--
examples/wizard/package.json | 11 ++++++++---
package.json | 4 ++--
41 files changed, 92 insertions(+), 85 deletions(-)
diff --git a/examples/async-field-level-validation/package.json b/examples/async-field-level-validation/package.json
index 33349807..80517548 100644
--- a/examples/async-field-level-validation/package.json
+++ b/examples/async-field-level-validation/package.json
@@ -11,10 +11,10 @@
],
"main": "index.js",
"dependencies": {
- "final-form": "4.16.1",
+ "final-form": "4.20.2",
"react": "17.0.2",
"react-dom": "17.0.2",
- "react-final-form": "6.3.0",
+ "react-final-form": "6.5.3",
"styled-components": "4.2.0"
}
}
diff --git a/examples/async-redux-submission/package.json b/examples/async-redux-submission/package.json
index f816abdd..7d9aac2d 100644
--- a/examples/async-redux-submission/package.json
+++ b/examples/async-redux-submission/package.json
@@ -12,10 +12,10 @@
"homepage": "https://codesandbox.io/s/new",
"main": "src/index.js",
"dependencies": {
- "final-form": "4.12.0",
+ "final-form": "4.20.2",
"react": "17.0.2",
"react-dom": "17.0.2",
- "react-final-form": "5.0.1",
+ "react-final-form": "6.5.3",
"react-redux": "7.0.3",
"react-redux-promise-listener": "1.0.0",
"react-scripts": "3.0.1",
diff --git a/examples/async-typeahead-redux/package.json b/examples/async-typeahead-redux/package.json
index b2fc1d48..63ba49ae 100644
--- a/examples/async-typeahead-redux/package.json
+++ b/examples/async-typeahead-redux/package.json
@@ -6,13 +6,13 @@
"main": "index.js",
"dependencies": {
"arrify": "2.0.1",
- "final-form": "4.18.5",
+ "final-form": "4.20.2",
"final-form-set-field-data": "1.0.2",
"ramda": "0.25.0",
"react": "17.0.2",
"react-bootstrap-typeahead": "3.1.4",
"react-dom": "17.0.2",
- "react-final-form": "6.3.0",
+ "react-final-form": "6.5.3",
"react-redux": "7.1.0",
"redux": "4.0.4",
"redux-thunk": "2.3.0",
diff --git a/examples/auto-save-field-blur/package.json b/examples/auto-save-field-blur/package.json
index 4ae3471b..3b15de72 100644
--- a/examples/auto-save-field-blur/package.json
+++ b/examples/auto-save-field-blur/package.json
@@ -5,12 +5,12 @@
"keywords": [],
"main": "index.js",
"dependencies": {
- "final-form": "4.12.0",
+ "final-form": "4.20.2",
"final-form-set-field-data": "1.0.2",
"object-diff": "0.0.4",
"react": "17.0.2",
"react-dom": "17.0.2",
- "react-final-form": "5.0.1",
+ "react-final-form": "6.5.3",
"styled-components": "4.2.0"
}
}
diff --git a/examples/auto-save-selective-debounce/package.json b/examples/auto-save-selective-debounce/package.json
index 416810e5..5fdf0364 100644
--- a/examples/auto-save-selective-debounce/package.json
+++ b/examples/auto-save-selective-debounce/package.json
@@ -5,11 +5,11 @@
"keywords": [],
"main": "index.js",
"dependencies": {
- "final-form": "4.12.0",
+ "final-form": "4.20.2",
"object-diff": "0.0.4",
"react": "17.0.2",
"react-dom": "17.0.2",
- "react-final-form": "5.0.1",
+ "react-final-form": "6.5.3",
"styled-components": "4.2.0"
}
}
diff --git a/examples/auto-save-with-debounce/package.json b/examples/auto-save-with-debounce/package.json
index 3358038e..6b2b96dc 100644
--- a/examples/auto-save-with-debounce/package.json
+++ b/examples/auto-save-with-debounce/package.json
@@ -11,11 +11,11 @@
],
"main": "index.js",
"dependencies": {
- "final-form": "4.12.0",
+ "final-form": "4.20.2",
"object-diff": "0.0.4",
"react": "17.0.2",
"react-dom": "17.0.2",
- "react-final-form": "5.0.1",
+ "react-final-form": "6.5.3",
"styled-components": "4.2.0"
}
}
diff --git a/examples/calculated-fields/package.json b/examples/calculated-fields/package.json
index 6bfd7caa..3137f693 100644
--- a/examples/calculated-fields/package.json
+++ b/examples/calculated-fields/package.json
@@ -6,11 +6,11 @@
"homepage": "https://codesandbox.io/s/oq52p6v96y",
"main": "index.js",
"dependencies": {
- "final-form": "4.12.0",
+ "final-form": "4.20.2",
"final-form-calculate": "1.3.1",
"react": "17.0.2",
"react-dom": "17.0.2",
- "react-final-form": "5.0.1",
+ "react-final-form": "6.5.3",
"styled-components": "4.2.0"
}
}
diff --git a/examples/chakra/package.json b/examples/chakra/package.json
index 09b0d19a..e2b9708c 100644
--- a/examples/chakra/package.json
+++ b/examples/chakra/package.json
@@ -15,10 +15,10 @@
"@emotion/core": "^10.0.17",
"@emotion/styled": "^10.0.17",
"emotion-theming": "^10.0.17",
- "final-form": "4.18.6",
+ "final-form": "4.20.2",
"react": "17.0.2",
"react-dom": "17.0.2",
- "react-final-form": "latest",
+ "react-final-form": "6.5.3",
"react-scripts": "3.2.0"
},
"scripts": {
diff --git a/examples/conditional-fields/package.json b/examples/conditional-fields/package.json
index d13b371a..0e5c6895 100644
--- a/examples/conditional-fields/package.json
+++ b/examples/conditional-fields/package.json
@@ -6,10 +6,10 @@
"homepage": "https://codesandbox.io/s/new",
"main": "src/index.js",
"dependencies": {
- "final-form": "4.12.0",
+ "final-form": "4.20.2",
"react": "17.0.2",
"react-dom": "17.0.2",
- "react-final-form": "5.0.1",
+ "react-final-form": "6.5.3",
"react-scripts": "3.0.1",
"styled-components": "4.2.0"
},
diff --git a/examples/credit-card/package.json b/examples/credit-card/package.json
index 5e611713..d12ddd33 100644
--- a/examples/credit-card/package.json
+++ b/examples/credit-card/package.json
@@ -12,11 +12,11 @@
"homepage": "https://codesandbox.io/s/new",
"main": "src/index.js",
"dependencies": {
- "final-form": "4.12.0",
+ "final-form": "4.20.2",
"react": "17.0.2",
"react-credit-cards": "0.7.0",
"react-dom": "17.0.2",
- "react-final-form": "5.0.1",
+ "react-final-form": "6.5.3",
"react-scripts": "3.0.1",
"styled-components": "4.2.0"
},
diff --git a/examples/custom-validation-engine/package.json b/examples/custom-validation-engine/package.json
index f4c04b4a..49480589 100644
--- a/examples/custom-validation-engine/package.json
+++ b/examples/custom-validation-engine/package.json
@@ -5,11 +5,11 @@
"keywords": [],
"main": "index.js",
"dependencies": {
- "final-form": "4.12.0",
+ "final-form": "4.20.2",
"final-form-set-field-data": "1.0.2",
"react": "17.0.2",
"react-dom": "17.0.2",
- "react-final-form": "5.0.1",
+ "react-final-form": "6.5.3",
"react-fontawesome": "1.6.1",
"styled-components": "4.2.0"
}
diff --git a/examples/debounced-record-level-validation/package.json b/examples/debounced-record-level-validation/package.json
index 4603f089..5f8186ba 100644
--- a/examples/debounced-record-level-validation/package.json
+++ b/examples/debounced-record-level-validation/package.json
@@ -5,10 +5,10 @@
"keywords": [],
"main": "src/index.js",
"dependencies": {
- "final-form": "4.12.0",
+ "final-form": "4.20.2",
"react": "17.0.2",
"react-dom": "17.0.2",
- "react-final-form": "5.0.1",
+ "react-final-form": "6.5.3",
"react-scripts": "2.0.3",
"styled-components": "4.2.0"
},
diff --git a/examples/declarative-form-rules/package.json b/examples/declarative-form-rules/package.json
index 60a9b17b..0affb2b3 100644
--- a/examples/declarative-form-rules/package.json
+++ b/examples/declarative-form-rules/package.json
@@ -12,10 +12,10 @@
"homepage": "https://codesandbox.io/s/new",
"main": "src/index.js",
"dependencies": {
- "final-form": "4.12.0",
+ "final-form": "4.20.2",
"react": "17.0.2",
"react-dom": "17.0.2",
- "react-final-form": "5.0.1",
+ "react-final-form": "6.5.3",
"react-final-form-listeners": "1.0.2",
"react-scripts": "3.0.1",
"styled-components": "4.2.0"
diff --git a/examples/downshift-typeahead/package.json b/examples/downshift-typeahead/package.json
index 7fc70bfc..ce89fc5f 100644
--- a/examples/downshift-typeahead/package.json
+++ b/examples/downshift-typeahead/package.json
@@ -13,11 +13,11 @@
"main": "src/index.js",
"dependencies": {
"downshift": "1.28.0",
- "final-form": "4.12.0",
+ "final-form": "4.20.2",
"match-sorter": "3.0.0",
"react": "17.0.2",
"react-dom": "17.0.2",
- "react-final-form": "5.0.1",
+ "react-final-form": "6.5.3",
"react-scripts": "3.0.1",
"styled-components": "4.2.0"
},
diff --git a/examples/external-submit/package.json b/examples/external-submit/package.json
index 463c7f66..f31c35ad 100644
--- a/examples/external-submit/package.json
+++ b/examples/external-submit/package.json
@@ -11,10 +11,10 @@
],
"main": "index.js",
"dependencies": {
- "final-form": "4.12.0",
+ "final-form": "4.20.2",
"react": "17.0.2",
"react-dom": "17.0.2",
- "react-final-form": "5.0.1",
+ "react-final-form": "6.5.3",
"styled-components": "4.2.0"
}
}
diff --git a/examples/field-arrays/package.json b/examples/field-arrays/package.json
index f3114c6a..8c0de9c9 100644
--- a/examples/field-arrays/package.json
+++ b/examples/field-arrays/package.json
@@ -5,11 +5,11 @@
"keywords": [],
"main": "index.js",
"dependencies": {
- "final-form": "4.12.0",
+ "final-form": "4.20.2",
"final-form-arrays": "1.1.2",
"react": "17.0.2",
"react-dom": "17.0.2",
- "react-final-form": "4.1.0",
+ "react-final-form": "6.5.3",
"react-final-form-arrays": "2.0.3",
"styled-components": "4.2.0"
}
diff --git a/examples/field-level-validation/package.json b/examples/field-level-validation/package.json
index 5c7ed26b..13c27b58 100644
--- a/examples/field-level-validation/package.json
+++ b/examples/field-level-validation/package.json
@@ -12,9 +12,9 @@
"main": "index.js",
"dependencies": {
"styled-components": "latest",
- "react-final-form": "latest",
+ "react-final-form": "6.5.3",
"react": "latest",
"react-dom": "latest",
- "final-form": "latest"
+ "final-form": "4.20.2"
}
}
diff --git a/examples/field-warnings/package.json b/examples/field-warnings/package.json
index b15673fd..286204df 100644
--- a/examples/field-warnings/package.json
+++ b/examples/field-warnings/package.json
@@ -7,10 +7,10 @@
"main": "index.js",
"dependencies": {
"styled-components": "2.2.4",
- "react-final-form": "1.2.0",
+ "react-final-form": "6.5.3",
"react-dom": "17.0.2",
"react": "17.0.2",
"final-form-set-field-data": "1.0.0",
- "final-form": "1.3.1"
+ "final-form": "4.20.2"
}
}
diff --git a/examples/fields-component/package.json b/examples/fields-component/package.json
index 9cb2fd3e..9b3e8589 100644
--- a/examples/fields-component/package.json
+++ b/examples/fields-component/package.json
@@ -8,9 +8,9 @@
"dependencies": {
"styled-components": "latest",
"react-fontawesome": "latest",
- "react-final-form": "latest",
+ "react-final-form": "6.5.3",
"react-dom": "latest",
"react": "latest",
- "final-form": "latest"
+ "final-form": "4.20.2"
}
}
diff --git a/examples/focus-first-error/package.json b/examples/focus-first-error/package.json
index 06748335..53bb9072 100644
--- a/examples/focus-first-error/package.json
+++ b/examples/focus-first-error/package.json
@@ -6,11 +6,11 @@
"homepage": "https://codesandbox.io/s/new",
"main": "src/index.js",
"dependencies": {
- "final-form": "4.12.0",
+ "final-form": "4.20.2",
"final-form-focus": "1.1.2",
"react": "17.0.2",
"react-dom": "17.0.2",
- "react-final-form": "5.0.1",
+ "react-final-form": "6.5.3",
"react-scripts": "3.0.1",
"styled-components": "4.2.0"
},
diff --git a/examples/format-on-blur/package.json b/examples/format-on-blur/package.json
index 6c4ec408..dc3e17ad 100644
--- a/examples/format-on-blur/package.json
+++ b/examples/format-on-blur/package.json
@@ -11,11 +11,11 @@
],
"main": "src/index.js",
"dependencies": {
- "final-form": "4.12.0",
+ "final-form": "4.20.2",
"numeral": "2.0.6",
"react": "17.0.2",
"react-dom": "17.0.2",
- "react-final-form": "5.0.1",
+ "react-final-form": "6.5.3",
"react-scripts": "3.0.1",
"styled-components": "4.2.0"
},
diff --git a/examples/format-string-by-pattern/package.json b/examples/format-string-by-pattern/package.json
index edf88836..dbf36dd4 100644
--- a/examples/format-string-by-pattern/package.json
+++ b/examples/format-string-by-pattern/package.json
@@ -5,11 +5,11 @@
"keywords": [],
"main": "index.js",
"dependencies": {
- "final-form": "latest",
+ "final-form": "4.20.2",
"format-string-by-pattern": "1.1.1",
"react": "17.0.2",
"react-dom": "17.0.2",
- "react-final-form": "latest",
+ "react-final-form": "6.5.3",
"styled-components": "latest"
}
}
diff --git a/examples/hybrid-sync-async-record-level-validation/package.json b/examples/hybrid-sync-async-record-level-validation/package.json
index d4e4d61d..439c31d5 100644
--- a/examples/hybrid-sync-async-record-level-validation/package.json
+++ b/examples/hybrid-sync-async-record-level-validation/package.json
@@ -11,10 +11,10 @@
],
"main": "index.js",
"dependencies": {
- "final-form": "latest",
+ "final-form": "4.20.2",
"react": "17.0.2",
"react-dom": "17.0.2",
- "react-final-form": "latest",
+ "react-final-form": "6.5.3",
"styled-components": "4.2.0"
}
}
diff --git a/examples/independent-error-component-render-props/package.json b/examples/independent-error-component-render-props/package.json
index 1767a6b5..4dc2c0db 100644
--- a/examples/independent-error-component-render-props/package.json
+++ b/examples/independent-error-component-render-props/package.json
@@ -5,10 +5,10 @@
"keywords": [],
"main": "index.js",
"dependencies": {
- "final-form": "4.13.1",
+ "final-form": "4.20.2",
"react": "17.0.2",
"react-dom": "17.0.2",
- "react-final-form": "6.0.1",
+ "react-final-form": "6.5.3",
"styled-components": "4.2.1"
}
}
diff --git a/examples/independent-error-component-with-hooks/package.json b/examples/independent-error-component-with-hooks/package.json
index d9e8b4da..3989d545 100644
--- a/examples/independent-error-component-with-hooks/package.json
+++ b/examples/independent-error-component-with-hooks/package.json
@@ -5,10 +5,10 @@
"keywords": [],
"main": "index.js",
"dependencies": {
- "final-form": "4.13.1",
+ "final-form": "4.20.2",
"react": "17.0.2",
"react-dom": "17.0.2",
- "react-final-form": "6.0.1",
+ "react-final-form": "6.5.3",
"styled-components": "4.2.1"
}
}
diff --git a/examples/listening-for-external-changes/package.json b/examples/listening-for-external-changes/package.json
index 1dc75a88..efad68ad 100644
--- a/examples/listening-for-external-changes/package.json
+++ b/examples/listening-for-external-changes/package.json
@@ -12,11 +12,11 @@
"homepage": "https://codesandbox.io/s/new",
"main": "src/index.js",
"dependencies": {
- "final-form": "4.12.0",
+ "final-form": "4.20.2",
"final-form-calculate": "1.3.1",
"react": "17.0.2",
"react-dom": "17.0.2",
- "react-final-form": "5.0.1",
+ "react-final-form": "6.5.3",
"react-scripts": "3.0.1",
"styled-components": "4.2.0"
},
diff --git a/examples/loading-initializing-values/package.json b/examples/loading-initializing-values/package.json
index 98c563ed..7c35737f 100644
--- a/examples/loading-initializing-values/package.json
+++ b/examples/loading-initializing-values/package.json
@@ -5,10 +5,10 @@
"keywords": [],
"main": "index.js",
"dependencies": {
- "final-form": "4.12.0",
+ "final-form": "4.20.2",
"react": "17.0.2",
"react-dom": "17.0.2",
- "react-final-form": "5.0.1",
+ "react-final-form": "6.5.3",
"styled-components": "4.2.0"
}
}
diff --git a/examples/loading-saving-reinitializing/package.json b/examples/loading-saving-reinitializing/package.json
index 65ec1320..3deeb6fb 100644
--- a/examples/loading-saving-reinitializing/package.json
+++ b/examples/loading-saving-reinitializing/package.json
@@ -11,10 +11,10 @@
],
"main": "index.js",
"dependencies": {
- "final-form": "4.12.0",
+ "final-form": "4.20.2",
"react": "17.0.2",
"react-dom": "17.0.2",
- "react-final-form": "5.0.1",
+ "react-final-form": "6.5.3",
"react-fontawesome": "1.6.1",
"styled-components": "4.2.0"
}
diff --git a/examples/material-ui/package.json b/examples/material-ui/package.json
index b47a8d12..9851ef2f 100644
--- a/examples/material-ui/package.json
+++ b/examples/material-ui/package.json
@@ -2,7 +2,9 @@
"name": "react-final-form-material-ui-example",
"version": "1.0.0",
"description": "Demonstrates how to use Material-UI form controls.",
- "keywords": ["material-ui"],
+ "keywords": [
+ "material-ui"
+ ],
"homepage": "https://codesandbox.io/s/new",
"main": "src/index.js",
"dependencies": {
@@ -11,11 +13,11 @@
"@material-ui/lab": "latest",
"@material-ui/pickers": "latest",
"date-fns": "next",
- "final-form": "latest",
+ "final-form": "4.20.2",
"mui-rff": "latest",
"react": "latest",
"react-dom": "latest",
- "react-final-form": "latest",
+ "react-final-form": "6.5.3",
"react-scripts": "latest",
"tslib": "latest"
},
diff --git a/examples/parse-format/package.json b/examples/parse-format/package.json
index e340241d..21d68520 100644
--- a/examples/parse-format/package.json
+++ b/examples/parse-format/package.json
@@ -11,10 +11,10 @@
],
"main": "index.js",
"dependencies": {
- "final-form": "latest",
+ "final-form": "4.20.2",
"react": "17.0.2",
"react-dom": "17.0.2",
- "react-final-form": "latest",
+ "react-final-form": "6.5.3",
"styled-components": "latest"
}
}
diff --git a/examples/prefixed-fields/package.json b/examples/prefixed-fields/package.json
index 6e135eab..663b9715 100644
--- a/examples/prefixed-fields/package.json
+++ b/examples/prefixed-fields/package.json
@@ -8,9 +8,9 @@
"dependencies": {
"styled-components": "latest",
"react-fontawesome": "latest",
- "react-final-form": "latest",
+ "react-final-form": "6.5.3",
"react-dom": "latest",
"react": "latest",
- "final-form": "latest"
+ "final-form": "4.20.2"
}
-}
\ No newline at end of file
+}
diff --git a/examples/record-level-validation/package.json b/examples/record-level-validation/package.json
index a12b89de..54fab590 100644
--- a/examples/record-level-validation/package.json
+++ b/examples/record-level-validation/package.json
@@ -12,9 +12,9 @@
"main": "index.js",
"dependencies": {
"styled-components": "latest",
- "react-final-form": "latest",
+ "react-final-form": "6.5.3",
"react": "latest",
"react-dom": "latest",
- "final-form": "latest"
+ "final-form": "4.20.2"
}
}
diff --git a/examples/redux/package.json b/examples/redux/package.json
index a914eafa..047a16e9 100644
--- a/examples/redux/package.json
+++ b/examples/redux/package.json
@@ -12,10 +12,10 @@
"homepage": "https://codesandbox.io/s/new",
"main": "src/index.js",
"dependencies": {
- "final-form": "4.12.0",
+ "final-form": "4.20.2",
"react": "17.0.2",
"react-dom": "17.0.2",
- "react-final-form": "5.0.1",
+ "react-final-form": "6.5.3",
"react-redux": "7.0.3",
"react-scripts": "3.0.1",
"redux": "4.0.1",
diff --git a/examples/reusable-field-groups/package.json b/examples/reusable-field-groups/package.json
index 1236cdf1..b88b7e18 100644
--- a/examples/reusable-field-groups/package.json
+++ b/examples/reusable-field-groups/package.json
@@ -5,10 +5,10 @@
"keywords": [],
"main": "index.js",
"dependencies": {
- "final-form": "4.12.0",
+ "final-form": "4.20.2",
"react": "17.0.2",
"react-dom": "17.0.2",
- "react-final-form": "5.0.1",
+ "react-final-form": "6.5.3",
"styled-components": "4.2.0"
}
}
diff --git a/examples/simple/package.json b/examples/simple/package.json
index e3c0b3e9..4d9699b3 100644
--- a/examples/simple/package.json
+++ b/examples/simple/package.json
@@ -12,10 +12,10 @@
"main": "index.js",
"dependencies": {
"styled-components": "latest",
- "react-final-form": "latest",
+ "react-final-form": "6.5.3",
"react": "latest",
"react-dom": "latest",
- "final-form": "latest",
+ "final-form": "4.20.2",
"prop-types": "latest"
}
}
diff --git a/examples/styling-with-smooth-ui/package.json b/examples/styling-with-smooth-ui/package.json
index 1d2bb3a6..6bb3042d 100644
--- a/examples/styling-with-smooth-ui/package.json
+++ b/examples/styling-with-smooth-ui/package.json
@@ -11,10 +11,10 @@
],
"main": "src/index.js",
"dependencies": {
- "final-form": "4.12.0",
+ "final-form": "4.20.2",
"react": "17.0.2",
"react-dom": "17.0.2",
- "react-final-form": "5.0.1",
+ "react-final-form": "6.5.3",
"react-scripts": "3.0.1",
"smooth-ui": "4.3.2",
"styled-components": "3.4.10"
diff --git a/examples/submission-errors/package.json b/examples/submission-errors/package.json
index 78423610..bea07a74 100644
--- a/examples/submission-errors/package.json
+++ b/examples/submission-errors/package.json
@@ -12,9 +12,9 @@
"main": "index.js",
"dependencies": {
"styled-components": "latest",
- "react-final-form": "latest",
+ "react-final-form": "6.5.3",
"react": "latest",
"react-dom": "latest",
- "final-form": "latest"
+ "final-form": "4.20.2"
}
}
diff --git a/examples/subscriptions/package.json b/examples/subscriptions/package.json
index 8173001e..bec54dd8 100644
--- a/examples/subscriptions/package.json
+++ b/examples/subscriptions/package.json
@@ -12,9 +12,9 @@
"main": "index.js",
"dependencies": {
"styled-components": "latest",
- "react-final-form": "latest",
+ "react-final-form": "6.5.3",
"react": "latest",
"react-dom": "latest",
- "final-form": "latest"
+ "final-form": "4.20.2"
}
}
diff --git a/examples/third-party-components/package.json b/examples/third-party-components/package.json
index 19339d91..85829306 100644
--- a/examples/third-party-components/package.json
+++ b/examples/third-party-components/package.json
@@ -11,12 +11,12 @@
],
"main": "index.js",
"dependencies": {
- "final-form": "4.12.0",
+ "final-form": "4.20.2",
"material-ui": "0.20.2",
"react": "17.0.2",
"react-addons-shallow-compare": "15.6.2",
"react-dom": "17.0.2",
- "react-final-form": "5.0.1",
+ "react-final-form": "6.5.3",
"react-select": "2.4.3",
"styled-components": "4.2.0"
}
diff --git a/examples/wizard/package.json b/examples/wizard/package.json
index 9e68a5dc..ae7f52f6 100644
--- a/examples/wizard/package.json
+++ b/examples/wizard/package.json
@@ -13,16 +13,21 @@
"dependencies": {
"prop-types": "latest",
"styled-components": "latest",
- "react-final-form": "latest",
+ "react-final-form": "6.5.3",
"react": "latest",
"react-dom": "latest",
"react-scripts": "3.0.1",
- "final-form": "latest",
+ "final-form": "4.20.2",
"prop-types": "latest"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build"
},
- "browserslist": [">0.2%", "not dead", "not ie <= 11", "not op_mini all"]
+ "browserslist": [
+ ">0.2%",
+ "not dead",
+ "not ie <= 11",
+ "not op_mini all"
+ ]
}
diff --git a/package.json b/package.json
index 873f60e6..fd2db392 100644
--- a/package.json
+++ b/package.json
@@ -65,7 +65,7 @@
"eslint-plugin-react": "^7.26.0",
"eslint-plugin-react-hooks": "^4.2.0",
"fast-deep-equal": "^3.1.3",
- "final-form": "^4.20.2",
+ "final-form": "4.20.2",
"flow-bin": "^0.160.2",
"glow": "^1.2.2",
"husky": "^4.3.0",
@@ -92,7 +92,7 @@
"typescript": "^4.4.3"
},
"peerDependencies": {
- "final-form": "^4.20.0",
+ "final-form": "4.20.2",
"react": "^16.8.0 || ^17.0.0"
},
"lint-staged": {
From 809e8c9a9aeb5959b79242d738e8428f7532d6c4 Mon Sep 17 00:00:00 2001
From: Erik Rasmussen
Date: Sat, 25 Sep 2021 12:30:19 +0200
Subject: [PATCH 4/8] Prettier
---
.babelrc.js | 46 +-
.github/ci.yml | 49 +
.prettierignore | 3 +
.prettierrc | 17 +-
.../async-field-level-validation/Styles.js | 4 +-
.../async-field-level-validation/index.js | 73 +-
examples/async-redux-submission/Styles.js | 20 +-
.../asyncSubmissionMiddleware.js | 49 +-
examples/async-redux-submission/index.js | 48 +-
.../registrationDuck.js | 20 +-
examples/async-redux-submission/store.js | 41 +-
.../GithubUserTypeahead.jsx | 10 +-
examples/async-typeahead-redux/Styles.js | 22 +-
examples/async-typeahead-redux/actions.js | 10 +-
examples/async-typeahead-redux/index.js | 36 +-
examples/async-typeahead-redux/store.js | 8 +-
examples/async-typeahead-redux/useKeyword.js | 6 +-
examples/auto-save-field-blur/AutoSave.js | 42 +-
examples/auto-save-field-blur/Styles.js | 22 +-
examples/auto-save-field-blur/index.js | 62 +-
.../auto-save-selective-debounce/AutoSave.js | 20 +-
.../auto-save-selective-debounce/Styles.js | 22 +-
.../auto-save-selective-debounce/index.js | 58 +-
examples/auto-save-with-debounce/AutoSave.js | 38 +-
examples/auto-save-with-debounce/Styles.js | 22 +-
examples/auto-save-with-debounce/index.js | 54 +-
examples/calculated-fields/Styles.js | 22 +-
examples/calculated-fields/index.js | 48 +-
examples/chakra/index.js | 92 +-
examples/chakra/validate.js | 28 +-
examples/conditional-fields/Styles.js | 20 +-
examples/conditional-fields/index.js | 62 +-
examples/credit-card/Card.js | 40 +-
examples/credit-card/Styles.js | 20 +-
examples/credit-card/cardUtils.js | 54 +-
examples/credit-card/index.js | 46 +-
examples/credit-card/sandbox.config.json | 2 +-
.../OnBlurValidation.js | 56 +-
examples/custom-validation-engine/Styles.js | 22 +-
examples/custom-validation-engine/index.js | 56 +-
.../ErrorWithDelay.js | 39 +-
.../Styles.js | 18 +-
.../index.js | 56 +-
examples/declarative-form-rules/Styles.js | 20 +-
examples/declarative-form-rules/index.js | 44 +-
.../downshift-typeahead/DownshiftInput.js | 91 +-
examples/downshift-typeahead/Styles.js | 20 +-
examples/downshift-typeahead/fruit.js | 24 +-
examples/downshift-typeahead/index.js | 50 +-
examples/external-submit/Styles.js | 22 +-
examples/external-submit/index.js | 54 +-
examples/field-arrays/Styles.js | 20 +-
examples/field-arrays/index.js | 42 +-
examples/field-level-validation/Styles.js | 18 +-
examples/field-level-validation/index.js | 39 +-
examples/field-warnings/Styles.js | 22 +-
examples/field-warnings/index.js | 38 +-
examples/field-warnings/warning-engine.js | 4 +-
examples/fields-component/index.js | 40 +-
examples/focus-first-error/Styles.js | 20 +-
examples/focus-first-error/index.js | 46 +-
examples/focus-first-error/validate.js | 18 +-
examples/format-on-blur/Styles.js | 20 +-
examples/format-on-blur/index.js | 36 +-
examples/format-string-by-pattern/Styles.js | 22 +-
examples/format-string-by-pattern/index.js | 42 +-
.../Styles.js | 4 +-
.../index.js | 54 +-
.../Styles.js | 22 +-
.../index.js | 42 +-
.../Styles.js | 22 +-
.../index.js | 48 +-
.../BooleanDecay.js | 36 +-
.../ExternalModificationDetector.js | 33 +-
.../listening-for-external-changes/Styles.js | 20 +-
.../listening-for-external-changes/index.js | 44 +-
.../loading-initializing-values/Styles.js | 22 +-
examples/loading-initializing-values/index.js | 44 +-
.../LoadSaveReinitializeForm.js | 60 +-
.../loading-saving-reinitializing/Styles.js | 20 +-
.../loading-saving-reinitializing/index.js | 94 +-
examples/material-ui/index.js | 6 +-
examples/parse-format/Styles.js | 22 +-
examples/parse-format/index.js | 44 +-
examples/prefixed-fields/index.js | 36 +-
examples/record-level-validation/Styles.js | 18 +-
examples/record-level-validation/index.js | 36 +-
examples/redux/FormStateFromRedux.js | 12 +-
examples/redux/FormStateToRedux.js | 14 +-
examples/redux/Styles.js | 20 +-
examples/redux/finalFormDuck.js | 15 +-
examples/redux/index.js | 78 +-
examples/redux/store.js | 18 +-
examples/reusable-field-groups/Styles.js | 22 +-
examples/reusable-field-groups/index.js | 26 +-
examples/simple/Styles.js | 18 +-
examples/simple/index.js | 38 +-
.../components/CheckboxInput.tsx | 2 +-
.../components/MultiCheckboxInput.tsx | 2 +-
.../index.tsx | 48 +-
examples/styling-with-smooth-ui/index.js | 95 +-
examples/submission-errors/Styles.js | 18 +-
examples/submission-errors/index.js | 46 +-
examples/subscriptions/RenderCount.js | 12 +-
examples/subscriptions/Styles.js | 18 +-
examples/subscriptions/index.js | 35 +-
examples/third-party-components/Styles.js | 16 +-
examples/third-party-components/index.js | 50 +-
examples/third-party-components/states.js | 126 +-
examples/wizard/Styles.js | 22 +-
examples/wizard/Wizard.js | 64 +-
examples/wizard/index.js | 66 +-
package-scripts.js | 110 +-
rollup.config.js | 90 +-
src/Field.js | 34 +-
src/Field.test.js | 1108 ++++++++---------
src/FormSpy.js | 41 +-
src/FormSpy.test.js | 480 +++----
src/ReactFinalForm.js | 178 +--
src/ReactFinalForm.test.js | 1008 +++++++--------
src/context.js | 6 +-
src/getValue.js | 48 +-
src/getValue.test.js | 442 +++----
src/getters.js | 102 +-
src/index.js | 18 +-
src/index.js.flow | 36 +-
src/isReactNative.js | 6 +-
src/isSyntheticEvent.js | 4 +-
src/renderComponent.js | 26 +-
src/renderComponent.test.js | 104 +-
src/shallowEqual.js | 24 +-
src/shallowEqual.test.js | 88 +-
src/testUtils.js | 20 +-
src/types.js.flow | 77 +-
src/useConstant.js | 8 +-
src/useConstantCallback.js | 10 +-
src/useConstantCallback.test.js | 172 +--
src/useField.js | 180 +--
src/useField.test.js | 588 ++++-----
src/useForm.js | 18 +-
src/useForm.test.js | 100 +-
src/useFormState.js | 58 +-
src/useFormState.test.js | 58 +-
src/useLatest.js | 10 +-
src/useWhenValueChanges.js | 12 +-
typescript/Field.test.tsx | 4 +-
typescript/FormSpy.test.tsx | 4 +-
typescript/ReactFinalForm.test.tsx | 22 +-
typescript/index.d.ts | 94 +-
typescript/useFormState.test.tsx | 4 +-
150 files changed, 4667 insertions(+), 4568 deletions(-)
create mode 100644 .github/ci.yml
create mode 100644 .prettierignore
diff --git a/.babelrc.js b/.babelrc.js
index 9a36788b..688a14dd 100644
--- a/.babelrc.js
+++ b/.babelrc.js
@@ -1,35 +1,35 @@
-const { NODE_ENV } = process.env
-const test = NODE_ENV === 'test'
-const loose = true
+const { NODE_ENV } = process.env;
+const test = NODE_ENV === "test";
+const loose = true;
module.exports = {
presets: [
[
- '@babel/preset-env',
+ "@babel/preset-env",
{
loose,
- ...(test ? { targets: { node: '8' } } : {})
- }
+ ...(test ? { targets: { node: "8" } } : {}),
+ },
],
- '@babel/preset-react',
- '@babel/preset-flow'
+ "@babel/preset-react",
+ "@babel/preset-flow",
],
plugins: [
- '@babel/plugin-transform-flow-strip-types',
- '@babel/plugin-syntax-dynamic-import',
- '@babel/plugin-syntax-import-meta',
- ['@babel/plugin-proposal-class-properties', { loose }],
- '@babel/plugin-proposal-json-strings',
+ "@babel/plugin-transform-flow-strip-types",
+ "@babel/plugin-syntax-dynamic-import",
+ "@babel/plugin-syntax-import-meta",
+ ["@babel/plugin-proposal-class-properties", { loose }],
+ "@babel/plugin-proposal-json-strings",
[
- '@babel/plugin-proposal-decorators',
+ "@babel/plugin-proposal-decorators",
{
- legacy: true
- }
+ legacy: true,
+ },
],
- '@babel/plugin-proposal-function-sent',
- '@babel/plugin-proposal-export-namespace-from',
- '@babel/plugin-proposal-numeric-separator',
- '@babel/plugin-proposal-throw-expressions',
- test && '@babel/plugin-transform-react-jsx-source'
- ].filter(Boolean)
-}
+ "@babel/plugin-proposal-function-sent",
+ "@babel/plugin-proposal-export-namespace-from",
+ "@babel/plugin-proposal-numeric-separator",
+ "@babel/plugin-proposal-throw-expressions",
+ test && "@babel/plugin-transform-react-jsx-source",
+ ].filter(Boolean),
+};
diff --git a/.github/ci.yml b/.github/ci.yml
new file mode 100644
index 00000000..d93f882f
--- /dev/null
+++ b/.github/ci.yml
@@ -0,0 +1,49 @@
+name: CI
+
+on: [push]
+
+jobs:
+ lint:
+ name: Prettier Check
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v2
+ - name: Use Node.js ${{ matrix.node_version }}
+ uses: actions/setup-node@v2
+ with:
+ node-version: "14"
+ - name: Prepare env
+ run: yarn install --ignore-scripts --frozen-lockfile
+ - name: Run linter
+ run: yarn start lint
+
+ prettier:
+ name: Prettier Check
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v2
+ - name: Use Node.js ${{ matrix.node_version }}
+ uses: actions/setup-node@v2
+ with:
+ node-version: "14"
+ - name: Prepare env
+ run: yarn install --ignore-scripts --frozen-lockfile
+ - name: Run prettier
+ run: yarn start prettier
+
+ test:
+ name: Unit Tests
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v2
+ - name: Use Node.js ${{ matrix.node_version }}
+ uses: actions/setup-node@v2
+ with:
+ node-version: "14"
+ - name: Prepare env
+ run: yarn install --ignore-scripts --frozen-lockfile
+ - name: Run unit tests
+ run: yarn start test
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 00000000..5de02b14
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1,3 @@
+coverage
+dist
+node_modules
\ No newline at end of file
diff --git a/.prettierrc b/.prettierrc
index 4bc38160..bf357fbb 100644
--- a/.prettierrc
+++ b/.prettierrc
@@ -1,18 +1,3 @@
{
- "semi": false,
- "singleQuote": true,
- "trailingComma": "none",
- "arrowParens": "avoid",
- "overrides": [
- {
- "files": [".prettierrc"],
- "options": { "parser": "json" }
- },
- {
- "files": ["*.ts*"],
- "options": {
- "semi": true
- }
- }
- ]
+ "trailingComma": "all"
}
diff --git a/examples/async-field-level-validation/Styles.js b/examples/async-field-level-validation/Styles.js
index a4edc9af..b8accf84 100644
--- a/examples/async-field-level-validation/Styles.js
+++ b/examples/async-field-level-validation/Styles.js
@@ -27,7 +27,9 @@ const btn = (light, dark) => css`
}
`;
-const btnDefault = css`${btn("#ffffff", "#d5d5d5")} color: #555;`;
+const btnDefault = css`
+ ${btn("#ffffff", "#d5d5d5")} color: #555;
+`;
const btnPrimary = btn("#4f93ce", "#285f8f");
diff --git a/examples/async-field-level-validation/index.js b/examples/async-field-level-validation/index.js
index d9940823..fda6a04a 100644
--- a/examples/async-field-level-validation/index.js
+++ b/examples/async-field-level-validation/index.js
@@ -1,53 +1,58 @@
-import React from 'react'
-import { render } from 'react-dom'
-import Styles from './Styles'
-import Spinner from './Spinner'
-import { Form, Field } from 'react-final-form'
+import React from "react";
+import { render } from "react-dom";
+import Styles from "./Styles";
+import Spinner from "./Spinner";
+import { Form, Field } from "react-final-form";
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
-const onSubmit = async values => {
- await sleep(300)
- window.alert(JSON.stringify(values, undefined, 2))
-}
+const onSubmit = async (values) => {
+ await sleep(300);
+ window.alert(JSON.stringify(values, undefined, 2));
+};
-const required = value => (value ? undefined : 'Required')
-const mustBeNumber = value => (isNaN(value) ? 'Must be a number' : undefined)
-const minValue = min => value =>
- isNaN(value) || value >= min ? undefined : `Should be greater than ${min}`
-const composeValidators = (...validators) => value =>
- validators.reduce((error, validator) => error || validator(value), undefined)
+const required = (value) => (value ? undefined : "Required");
+const mustBeNumber = (value) => (isNaN(value) ? "Must be a number" : undefined);
+const minValue = (min) => (value) =>
+ isNaN(value) || value >= min ? undefined : `Should be greater than ${min}`;
+const composeValidators =
+ (...validators) =>
+ (value) =>
+ validators.reduce(
+ (error, validator) => error || validator(value),
+ undefined,
+ );
-const simpleMemoize = fn => {
- let lastArg
- let lastResult
- return arg => {
+const simpleMemoize = (fn) => {
+ let lastArg;
+ let lastResult;
+ return (arg) => {
if (arg !== lastArg) {
- lastArg = arg
- lastResult = fn(arg)
+ lastArg = arg;
+ lastResult = fn(arg);
}
- return lastResult
- }
-}
+ return lastResult;
+ };
+};
-const usernameAvailable = simpleMemoize(async value => {
+const usernameAvailable = simpleMemoize(async (value) => {
if (!value) {
- return 'Required'
+ return "Required";
}
- await sleep(400)
+ await sleep(400);
if (
- ~['john', 'paul', 'george', 'ringo'].indexOf(value && value.toLowerCase())
+ ~["john", "paul", "george", "ringo"].indexOf(value && value.toLowerCase())
) {
- return 'Username taken!'
+ return "Username taken!";
}
-})
+});
const App = () => (
🏁
- {' '}
+ {" "}
React Final Form Example
Asynchronous Field-Level Validation
@@ -107,6 +112,6 @@ const App = () => (
)}
/>
-)
+);
-render( , document.getElementById('root'))
+render( , document.getElementById("root"));
diff --git a/examples/async-redux-submission/Styles.js b/examples/async-redux-submission/Styles.js
index 12d16329..75deb222 100644
--- a/examples/async-redux-submission/Styles.js
+++ b/examples/async-redux-submission/Styles.js
@@ -1,4 +1,4 @@
-import styled, { css } from 'styled-components'
+import styled, { css } from "styled-components";
const btn = (light, dark) => css`
white-space: nowrap;
@@ -25,14 +25,14 @@ const btn = (light, dark) => css`
opacity: 0.6;
cursor: not-allowed;
}
-`
+`;
const btnDefault = css`
- ${btn('#ffffff', '#d5d5d5')} color: #555;
-`
+ ${btn("#ffffff", "#d5d5d5")} color: #555;
+`;
-const btnPrimary = btn('#4f93ce', '#285f8f')
-const btnDanger = btn('#e27c79', '#c9302c')
+const btnPrimary = btn("#4f93ce", "#285f8f");
+const btnDanger = btn("#e27c79", "#c9302c");
export default styled.div`
font-family: sans-serif;
@@ -116,7 +116,7 @@ export default styled.div`
background: #eee;
}
}
- & > input[type='checkbox'] {
+ & > input[type="checkbox"] {
margin-top: 7px;
}
& > div {
@@ -196,10 +196,10 @@ export default styled.div`
}
button {
margin: 0 10px;
- &[type='submit'] {
+ &[type="submit"] {
${btnPrimary};
}
- &[type='button'] {
+ &[type="button"] {
${btnDefault};
}
}
@@ -210,4 +210,4 @@ export default styled.div`
padding: 3px 5px;
}
}
-`
+`;
diff --git a/examples/async-redux-submission/asyncSubmissionMiddleware.js b/examples/async-redux-submission/asyncSubmissionMiddleware.js
index b1d54d15..f1158550 100644
--- a/examples/async-redux-submission/asyncSubmissionMiddleware.js
+++ b/examples/async-redux-submission/asyncSubmissionMiddleware.js
@@ -1,30 +1,31 @@
-import { REGISTER, REGISTER_SUCCESS } from './registrationDuck'
+import { REGISTER, REGISTER_SUCCESS } from "./registrationDuck";
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
-const submit = async values => {
- await sleep(200)
- if (values.firstName === 'John') {
- throw Error({ firstName: "No John's Allowed!" })
+const submit = async (values) => {
+ await sleep(200);
+ if (values.firstName === "John") {
+ throw Error({ firstName: "No John's Allowed!" });
}
- window.alert(JSON.stringify(values, 0, 2))
-}
+ window.alert(JSON.stringify(values, 0, 2));
+};
/** This is to mimic the behavior of one of the various Redux async middlewares */
-const asyncSubmissionMiddleware = store => (next: Next) => (
- action: Action
-): State => {
- if (action && action.type === REGISTER) {
- submit(action.payload).then(
- () => store.dispatch({ type: REGISTER_SUCCESS }),
- errors => {
- // NOTE!! We are passing REGISTER_SUCCESS here because 🏁 Final Form expects
- // submit errors to come back in a *resolved* promise.
- store.dispatch({ type: REGISTER_SUCCESS, payload: errors })
- }
- )
- }
- return next(action)
-}
+const asyncSubmissionMiddleware =
+ (store) =>
+ (next: Next) =>
+ (action: Action): State => {
+ if (action && action.type === REGISTER) {
+ submit(action.payload).then(
+ () => store.dispatch({ type: REGISTER_SUCCESS }),
+ (errors) => {
+ // NOTE!! We are passing REGISTER_SUCCESS here because 🏁 Final Form expects
+ // submit errors to come back in a *resolved* promise.
+ store.dispatch({ type: REGISTER_SUCCESS, payload: errors });
+ },
+ );
+ }
+ return next(action);
+ };
-export default asyncSubmissionMiddleware
+export default asyncSubmissionMiddleware;
diff --git a/examples/async-redux-submission/index.js b/examples/async-redux-submission/index.js
index e08ee288..afd2f57f 100644
--- a/examples/async-redux-submission/index.js
+++ b/examples/async-redux-submission/index.js
@@ -1,15 +1,15 @@
-import React from 'react'
-import { render } from 'react-dom'
-import { Provider } from 'react-redux'
-import Styles from './Styles'
-import { Form, Field } from 'react-final-form'
-import store, { promiseListener } from './store'
+import React from "react";
+import { render } from "react-dom";
+import { Provider } from "react-redux";
+import Styles from "./Styles";
+import { Form, Field } from "react-final-form";
+import store, { promiseListener } from "./store";
import {
REGISTER,
REGISTER_SUCCESS,
- REGISTER_FAILURE
-} from './registrationDuck'
-import MakeAsyncFunction from 'react-redux-promise-listener'
+ REGISTER_FAILURE,
+} from "./registrationDuck";
+import MakeAsyncFunction from "react-redux-promise-listener";
const SubmitError = ({ name }) => (
(
submitError && !dirtySinceLastSubmit ? {submitError} : null
}
-)
+);
const App = () => (
@@ -28,7 +28,7 @@ const App = () => (
🏁
- {' '}
+ {" "}
React Final Form
Async Redux Submission
@@ -36,27 +36,27 @@ const App = () => (
Read Docs
- Demonstrates how to use an async Redux side-effects library, like{' '}
- redux-saga to manage form submissions using{' '}
+ Demonstrates how to use an async Redux side-effects library, like{" "}
+ redux-saga to manage form submissions using{" "}
🏁
- {' '}
- React Final Form. Uses{' '}
+ {" "}
+ React Final Form. Uses{" "}
redux-promise-listener
- {' '}
- and{' '}
+ {" "}
+ and{" "}
react-redux-promise-listener
- {' '}
+ {" "}
libraries.
Dispatched Redux actions can be found in the console.
@@ -69,7 +69,7 @@ const App = () => (
resolve={REGISTER_SUCCESS}
reject={REGISTER_FAILURE}
>
- {onSubmit => (
+ {(onSubmit) => (
-)
+);
-render( , document.getElementById('root'))
+render( , document.getElementById("root"));
diff --git a/examples/async-redux-submission/registrationDuck.js b/examples/async-redux-submission/registrationDuck.js
index 3c96a7b7..261169bb 100644
--- a/examples/async-redux-submission/registrationDuck.js
+++ b/examples/async-redux-submission/registrationDuck.js
@@ -1,11 +1,11 @@
// QUACK! This is a duck. https://github.com/erikras/ducks-modular-redux
// Actions
-export const REGISTER = 'final-form-examples/registration/REGISTER'
+export const REGISTER = "final-form-examples/registration/REGISTER";
export const REGISTER_SUCCESS =
- 'final-form-examples/registration/REGISTER_SUCCESS'
+ "final-form-examples/registration/REGISTER_SUCCESS";
export const REGISTER_FAILURE =
- 'final-form-examples/registration/REGISTER_FAILURE'
+ "final-form-examples/registration/REGISTER_FAILURE";
// Reducer
export default function reducer(state = {}, action = {}) {
@@ -13,20 +13,20 @@ export default function reducer(state = {}, action = {}) {
case REGISTER:
return {
...state,
- registering: true
- }
+ registering: true,
+ };
case REGISTER_SUCCESS:
return {
...state,
- registering: false
- }
+ registering: false,
+ };
case REGISTER_FAILURE:
return {
...state,
- registering: false
- }
+ registering: false,
+ };
default:
- return state
+ return state;
}
}
diff --git a/examples/async-redux-submission/store.js b/examples/async-redux-submission/store.js
index 13422689..738cfde6 100644
--- a/examples/async-redux-submission/store.js
+++ b/examples/async-redux-submission/store.js
@@ -1,23 +1,26 @@
-import { createStore, combineReducers, applyMiddleware, compose } from 'redux'
-import createReduxPromiseListener from 'redux-promise-listener'
-import registration from './registrationDuck'
-import asyncSubmissionMiddleware from './asyncSubmissionMiddleware'
+import { createStore, combineReducers, applyMiddleware, compose } from "redux";
+import createReduxPromiseListener from "redux-promise-listener";
+import registration from "./registrationDuck";
+import asyncSubmissionMiddleware from "./asyncSubmissionMiddleware";
-const reduxPromiseListener = createReduxPromiseListener()
+const reduxPromiseListener = createReduxPromiseListener();
-const logger = store => (next: Next) => (action: Action): State => {
- console.log(action)
- return next(action)
-}
+const logger =
+ (store) =>
+ (next: Next) =>
+ (action: Action): State => {
+ console.log(action);
+ return next(action);
+ };
const reducer = combineReducers({
- registration
-})
+ registration,
+});
const composeEnhancers =
- (typeof window !== 'undefined' &&
+ (typeof window !== "undefined" &&
window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__) ||
- compose
+ compose;
const store = createStore(
reducer,
@@ -26,11 +29,11 @@ const store = createStore(
applyMiddleware(
reduxPromiseListener.middleware,
asyncSubmissionMiddleware,
- logger
- )
- )
-)
+ logger,
+ ),
+ ),
+);
-export const promiseListener = reduxPromiseListener // <---------- IMPORTANT
+export const promiseListener = reduxPromiseListener; // <---------- IMPORTANT
-export default store
+export default store;
diff --git a/examples/async-typeahead-redux/GithubUserTypeahead.jsx b/examples/async-typeahead-redux/GithubUserTypeahead.jsx
index 33105149..e9e4be59 100644
--- a/examples/async-typeahead-redux/GithubUserTypeahead.jsx
+++ b/examples/async-typeahead-redux/GithubUserTypeahead.jsx
@@ -18,13 +18,9 @@ const GithubUserTypeahead = ({ name, ...props }) => {
const dispatch = useDispatch();
const getOptions = useCallback(pathOr([], [keyword, "value"]), [keyword]);
const isLoading = useCallback(pathOr(false, [keyword, "loading"]), [keyword]);
- const handleOnSearch = useCallback(
- compose(
- dispatch,
- searchGithubUsers
- ),
- [dispatch]
- );
+ const handleOnSearch = useCallback(compose(dispatch, searchGithubUsers), [
+ dispatch,
+ ]);
const options = useSelector(getOptions);
const loading = useSelector(isLoading);
diff --git a/examples/async-typeahead-redux/Styles.js b/examples/async-typeahead-redux/Styles.js
index 127e3598..833d8dd0 100644
--- a/examples/async-typeahead-redux/Styles.js
+++ b/examples/async-typeahead-redux/Styles.js
@@ -1,4 +1,4 @@
-import styled, { css } from 'styled-components'
+import styled, { css } from "styled-components";
const btn = (light, dark) => css`
white-space: nowrap;
@@ -25,14 +25,14 @@ const btn = (light, dark) => css`
opacity: 0.6;
cursor: not-allowed;
}
-`
+`;
const btnDefault = css`
- ${btn('#ffffff', '#d5d5d5')} color: #555;
-`
+ ${btn("#ffffff", "#d5d5d5")} color: #555;
+`;
-const btnPrimary = btn('#4f93ce', '#285f8f')
-const btnDanger = btn('#e27c79', '#c9302c')
+const btnPrimary = btn("#4f93ce", "#285f8f");
+const btnDanger = btn("#e27c79", "#c9302c");
export default styled.div`
font-family: sans-serif;
@@ -81,7 +81,7 @@ export default styled.div`
text-align: center;
display: block;
position: absolute;
- background: url('https://media.giphy.com/media/130AxGoOaR6t0I/giphy.gif')
+ background: url("https://media.giphy.com/media/130AxGoOaR6t0I/giphy.gif")
center center;
background-size: fill;
font-size: 2em;
@@ -116,7 +116,7 @@ export default styled.div`
border: 1px solid #ccc;
border-radius: 3px;
}
- & > input[type='checkbox'] {
+ & > input[type="checkbox"] {
margin-top: 7px;
}
& > div {
@@ -182,11 +182,11 @@ export default styled.div`
}
button {
margin: 0 10px;
- &[type='submit'] {
+ &[type="submit"] {
${btnPrimary};
}
- &[type='button'] {
+ &[type="button"] {
${btnDefault};
}
}
-`
+`;
diff --git a/examples/async-typeahead-redux/actions.js b/examples/async-typeahead-redux/actions.js
index 78f389e4..bd14b1cf 100644
--- a/examples/async-typeahead-redux/actions.js
+++ b/examples/async-typeahead-redux/actions.js
@@ -1,18 +1,18 @@
-export const requestGithubUsers = query => ({
+export const requestGithubUsers = (query) => ({
type: "GITHUB_USERS_REQUEST",
- query
+ query,
});
export const storeGithubUsers = (query, users) => ({
type: "GITHUB_USERS_RESPONSE",
query,
- users
+ users,
});
-export const searchGithubUsers = query => dispatch => {
+export const searchGithubUsers = (query) => (dispatch) => {
dispatch(requestGithubUsers(query));
fetch(`https://api.github.com/search/users?q=${query}`)
- .then(res => res.json())
+ .then((res) => res.json())
.then(({ items: users }) => dispatch(storeGithubUsers(query, users)));
};
diff --git a/examples/async-typeahead-redux/index.js b/examples/async-typeahead-redux/index.js
index 91f67580..787a53b0 100644
--- a/examples/async-typeahead-redux/index.js
+++ b/examples/async-typeahead-redux/index.js
@@ -1,28 +1,28 @@
-import React from 'react'
-import { render } from 'react-dom'
-import { Provider } from 'react-redux'
-import Styles from './Styles'
-import { Form } from 'react-final-form'
-import setFieldData from 'final-form-set-field-data'
+import React from "react";
+import { render } from "react-dom";
+import { Provider } from "react-redux";
+import Styles from "./Styles";
+import { Form } from "react-final-form";
+import setFieldData from "final-form-set-field-data";
-import configureStore from './store'
-import GithubUserTypeahead from './GithubUserTypeahead'
+import configureStore from "./store";
+import GithubUserTypeahead from "./GithubUserTypeahead";
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
-const onSubmit = async values => {
- await sleep(300)
- window.alert(JSON.stringify(values, 0, 2))
-}
+const onSubmit = async (values) => {
+ await sleep(300);
+ window.alert(JSON.stringify(values, 0, 2));
+};
-const store = configureStore()
+const store = configureStore();
const App = () => (
🏁
- {' '}
+ {" "}
React Final Form
@@ -52,11 +52,11 @@ const App = () => (
)}
/>
-)
+);
render(
,
- document.getElementById('root')
-)
+ document.getElementById("root"),
+);
diff --git a/examples/async-typeahead-redux/store.js b/examples/async-typeahead-redux/store.js
index 76f0a68c..58fcc8a8 100644
--- a/examples/async-typeahead-redux/store.js
+++ b/examples/async-typeahead-redux/store.js
@@ -9,16 +9,16 @@ const reducer = (state = initialState, action) => {
...state,
[action.query]: {
...state[action.query],
- loading: true
- }
+ loading: true,
+ },
};
case "GITHUB_USERS_RESPONSE":
return {
...state,
[action.query]: {
value: action.users,
- loading: false
- }
+ loading: false,
+ },
};
default:
return state;
diff --git a/examples/async-typeahead-redux/useKeyword.js b/examples/async-typeahead-redux/useKeyword.js
index 5d5c3c27..8cb01a5a 100644
--- a/examples/async-typeahead-redux/useKeyword.js
+++ b/examples/async-typeahead-redux/useKeyword.js
@@ -1,15 +1,15 @@
import { useForm, useField } from "react-final-form";
import { propOr } from "ramda";
-const useKeyword = name => {
+const useKeyword = (name) => {
const {
- mutators: { setFieldData }
+ mutators: { setFieldData },
} = useForm();
const { meta } = useField(name, { subscription: { data: true } });
return {
keyword: propOr(null, "keyword", meta.data),
- updateKeyword: keyword => setFieldData(name, { keyword })
+ updateKeyword: (keyword) => setFieldData(name, { keyword }),
};
};
diff --git a/examples/auto-save-field-blur/AutoSave.js b/examples/auto-save-field-blur/AutoSave.js
index b036e076..2d517ac3 100644
--- a/examples/auto-save-field-blur/AutoSave.js
+++ b/examples/auto-save-field-blur/AutoSave.js
@@ -1,44 +1,44 @@
-import React from 'react'
-import { FormSpy } from 'react-final-form'
-import diff from 'object-diff'
+import React from "react";
+import { FormSpy } from "react-final-form";
+import diff from "object-diff";
class AutoSave extends React.Component {
constructor(props) {
- super(props)
- this.state = { values: props.values, submitting: false }
+ super(props);
+ this.state = { values: props.values, submitting: false };
}
componentWillReceiveProps(nextProps) {
if (this.props.active && this.props.active !== nextProps.active) {
// blur occurred
- this.save(this.props.active)
+ this.save(this.props.active);
}
}
- save = async blurredField => {
+ save = async (blurredField) => {
if (this.promise) {
- await this.promise
+ await this.promise;
}
- const { values, setFieldData, save } = this.props
+ const { values, setFieldData, save } = this.props;
// This diff step is totally optional
- const difference = diff(this.state.values, values)
+ const difference = diff(this.state.values, values);
if (Object.keys(difference).length) {
// values have changed
- this.setState({ submitting: true, values })
- setFieldData(blurredField, { saving: true })
- this.promise = save(difference)
- await this.promise
- delete this.promise
- this.setState({ submitting: false })
- setFieldData(blurredField, { saving: false })
+ this.setState({ submitting: true, values });
+ setFieldData(blurredField, { saving: true });
+ this.promise = save(difference);
+ await this.promise;
+ delete this.promise;
+ this.setState({ submitting: false });
+ setFieldData(blurredField, { saving: false });
}
- }
+ };
render() {
// This component doesn't have to render anything, but it can render
// submitting state.
- return null
+ return null;
}
}
@@ -48,10 +48,10 @@ class AutoSave extends React.Component {
// - Maintain state of when we are submitting
// - Render a message when submitting
// - Pass in save prop nicely
-export default props => (
+export default (props) => (
-)
+);
diff --git a/examples/auto-save-field-blur/Styles.js b/examples/auto-save-field-blur/Styles.js
index 1aa7b27e..a686b959 100644
--- a/examples/auto-save-field-blur/Styles.js
+++ b/examples/auto-save-field-blur/Styles.js
@@ -1,4 +1,4 @@
-import styled, { css } from 'styled-components'
+import styled, { css } from "styled-components";
const btn = (light, dark) => css`
white-space: nowrap;
@@ -25,14 +25,14 @@ const btn = (light, dark) => css`
opacity: 0.6;
cursor: not-allowed;
}
-`
+`;
const btnDefault = css`
- ${btn('#ffffff', '#d5d5d5')} color: #555;
-`
+ ${btn("#ffffff", "#d5d5d5")} color: #555;
+`;
-const btnPrimary = btn('#4f93ce', '#285f8f')
-const btnDanger = btn('#e27c79', '#c9302c')
+const btnPrimary = btn("#4f93ce", "#285f8f");
+const btnDanger = btn("#e27c79", "#c9302c");
export default styled.div`
font-family: sans-serif;
@@ -81,7 +81,7 @@ export default styled.div`
text-align: center;
display: block;
position: absolute;
- background: url('https://media.giphy.com/media/130AxGoOaR6t0I/giphy.gif')
+ background: url("https://media.giphy.com/media/130AxGoOaR6t0I/giphy.gif")
center center;
background-size: fill;
font-size: 2em;
@@ -116,7 +116,7 @@ export default styled.div`
border: 1px solid #ccc;
border-radius: 3px;
}
- & > input[type='checkbox'] {
+ & > input[type="checkbox"] {
margin-top: 7px;
}
& > div {
@@ -182,11 +182,11 @@ export default styled.div`
}
button {
margin: 0 10px;
- &[type='submit'] {
+ &[type="submit"] {
${btnPrimary};
}
- &[type='button'] {
+ &[type="button"] {
${btnDefault};
}
}
-`
+`;
diff --git a/examples/auto-save-field-blur/index.js b/examples/auto-save-field-blur/index.js
index 4dc1a874..0044ba8d 100644
--- a/examples/auto-save-field-blur/index.js
+++ b/examples/auto-save-field-blur/index.js
@@ -1,16 +1,16 @@
-import React from 'react'
-import { render } from 'react-dom'
-import Styles from './Styles'
-import { Form, Field } from 'react-final-form'
-import setFieldData from 'final-form-set-field-data'
-import AutoSave from './AutoSave'
+import React from "react";
+import { render } from "react-dom";
+import Styles from "./Styles";
+import { Form, Field } from "react-final-form";
+import setFieldData from "final-form-set-field-data";
+import AutoSave from "./AutoSave";
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
-const save = async values => {
- console.log('Saving', values)
- await sleep(1000)
-}
+const save = async (values) => {
+ console.log("Saving", values);
+ await sleep(1000);
+};
const SavingIndicator = ({ name }) => (
(
subscription={{ data: true }}
render={({
meta: {
- data: { saving }
- }
+ data: { saving },
+ },
}) => (saving ? Saving
: null)}
/>
-)
+);
const App = () => (
🏁
- {' '}
+ {" "}
React Final Form
Auto-Save on Field Blur
@@ -37,21 +37,21 @@ const App = () => (
Read Docs
- The AutoSave component uses{' '}
+ The AutoSave component uses{" "}
FormSpy
- {' '}
+ {" "}
to listen to changes to values and which field is currently active and
auto-saves changes when a field is blurred. Look in the console for the
save events.
@@ -129,31 +129,31 @@ const App = () => (
🐷
- {' '}
+ {" "}
Ham
🍄
- {' '}
+ {" "}
Mushrooms
🧀
- {' '}
+ {" "}
Cheese
🐓
- {' '}
+ {" "}
Chicken
🍍
- {' '}
+ {" "}
Pinapple
@@ -168,7 +168,7 @@ const App = () => (
component="input"
type="radio"
value="larry"
- />{' '}
+ />{" "}
Larry
@@ -177,7 +177,7 @@ const App = () => (
component="input"
type="radio"
value="moe"
- />{' '}
+ />{" "}
Moe
@@ -186,7 +186,7 @@ const App = () => (
component="input"
type="radio"
value="curly"
- />{' '}
+ />{" "}
Curly
@@ -201,6 +201,6 @@ const App = () => (
)}
-)
+);
-render( , document.getElementById('root'))
+render( , document.getElementById("root"));
diff --git a/examples/auto-save-selective-debounce/AutoSave.js b/examples/auto-save-selective-debounce/AutoSave.js
index 594ba79b..fde3ed32 100644
--- a/examples/auto-save-selective-debounce/AutoSave.js
+++ b/examples/auto-save-selective-debounce/AutoSave.js
@@ -7,14 +7,14 @@ const areObjectsIdentical = (a, b) =>
class AutoSave extends React.Component {
static defaultProps = {
- debounced: []
+ debounced: [],
};
constructor(props) {
super(props);
this.state = {
submitting: false,
- ...this.splitValues(props.values)
+ ...this.splitValues(props.values),
};
}
@@ -36,13 +36,13 @@ class AutoSave extends React.Component {
}
}
- splitValues = values => {
+ splitValues = (values) => {
const { debounced } = this.props;
const debouncedValues = {};
const immediateValues = {};
- Object.keys(values).forEach(key => {
+ Object.keys(values).forEach((key) => {
if (debounced.includes(key)) {
debouncedValues[key] = values[key];
} else {
@@ -52,7 +52,7 @@ class AutoSave extends React.Component {
return {
debouncedValues,
- immediateValues
+ immediateValues,
};
};
@@ -65,22 +65,22 @@ class AutoSave extends React.Component {
const { debouncedValues, immediateValues } = this.splitValues(values);
this.setState(
- state => ({
+ (state) => ({
submitting: true,
immediateValues: { ...immediateValues },
- debouncedValues: { ...debouncedValues }
+ debouncedValues: { ...debouncedValues },
}),
async () => {
this.promise = save({
...this.state.immediateValues,
- ...this.state.debouncedValues
+ ...this.state.debouncedValues,
});
await this.promise;
delete this.promise;
this.setState({ submitting: false });
- }
+ },
);
};
@@ -99,6 +99,6 @@ class AutoSave extends React.Component {
// - Maintain state of when we are submitting
// - Render a message when submitting
// - Pass in debounce and save props nicely
-export default props => (
+export default (props) => (
);
diff --git a/examples/auto-save-selective-debounce/Styles.js b/examples/auto-save-selective-debounce/Styles.js
index d46ad21e..b7fb0008 100644
--- a/examples/auto-save-selective-debounce/Styles.js
+++ b/examples/auto-save-selective-debounce/Styles.js
@@ -1,4 +1,4 @@
-import styled, { css } from 'styled-components'
+import styled, { css } from "styled-components";
const btn = (light, dark) => css`
white-space: nowrap;
@@ -25,14 +25,14 @@ const btn = (light, dark) => css`
opacity: 0.6;
cursor: not-allowed;
}
-`
+`;
const btnDefault = css`
- ${btn('#ffffff', '#d5d5d5')} color: #555;
-`
+ ${btn("#ffffff", "#d5d5d5")} color: #555;
+`;
-const btnPrimary = btn('#4f93ce', '#285f8f')
-const btnDanger = btn('#e27c79', '#c9302c')
+const btnPrimary = btn("#4f93ce", "#285f8f");
+const btnDanger = btn("#e27c79", "#c9302c");
export default styled.div`
font-family: sans-serif;
@@ -81,7 +81,7 @@ export default styled.div`
text-align: center;
display: block;
position: absolute;
- background: url('https://media.giphy.com/media/130AxGoOaR6t0I/giphy.gif')
+ background: url("https://media.giphy.com/media/130AxGoOaR6t0I/giphy.gif")
center center;
background-size: fill;
font-size: 2em;
@@ -116,7 +116,7 @@ export default styled.div`
border: 1px solid #ccc;
border-radius: 3px;
}
- & > input[type='checkbox'] {
+ & > input[type="checkbox"] {
margin-top: 7px;
}
& > div {
@@ -176,11 +176,11 @@ export default styled.div`
}
button {
margin: 0 10px;
- &[type='submit'] {
+ &[type="submit"] {
${btnPrimary};
}
- &[type='button'] {
+ &[type="button"] {
${btnDefault};
}
}
-`
+`;
diff --git a/examples/auto-save-selective-debounce/index.js b/examples/auto-save-selective-debounce/index.js
index 22b1c481..91d22e47 100644
--- a/examples/auto-save-selective-debounce/index.js
+++ b/examples/auto-save-selective-debounce/index.js
@@ -1,22 +1,22 @@
-import React from 'react'
-import { render } from 'react-dom'
-import Styles from './Styles'
-import { Form, Field } from 'react-final-form'
-import AutoSave from './AutoSave'
+import React from "react";
+import { render } from "react-dom";
+import Styles from "./Styles";
+import { Form, Field } from "react-final-form";
+import AutoSave from "./AutoSave";
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
-const save = async values => {
- console.log('Saving', values)
- await sleep(2000)
-}
+const save = async (values) => {
+ console.log("Saving", values);
+ await sleep(2000);
+};
const App = () => (
🏁
- {' '}
+ {" "}
React Final Form
@@ -26,22 +26,22 @@ const App = () => (
Read Docs
- The AutoSave component uses{' '}
+ The AutoSave component uses{" "}
FormSpy
- {' '}
+ {" "}
to listen to changes to values and auto-save changes. But it only
- debounces changes to a specific list of fields given to the{' '}
+ debounces changes to a specific list of fields given to the{" "}
AutoSave component, in this case, all the text inputs. Look
in the console for the save events.
-)
+);
-render( , document.getElementById('root'))
+render( , document.getElementById("root"));
diff --git a/examples/auto-save-with-debounce/AutoSave.js b/examples/auto-save-with-debounce/AutoSave.js
index ed1bc5b2..7763ef63 100644
--- a/examples/auto-save-with-debounce/AutoSave.js
+++ b/examples/auto-save-with-debounce/AutoSave.js
@@ -1,44 +1,44 @@
-import React from 'react'
-import { FormSpy } from 'react-final-form'
-import diff from 'object-diff'
+import React from "react";
+import { FormSpy } from "react-final-form";
+import diff from "object-diff";
class AutoSave extends React.Component {
constructor(props) {
- super(props)
- this.state = { values: props.values, submitting: false }
+ super(props);
+ this.state = { values: props.values, submitting: false };
}
componentWillReceiveProps(nextProps) {
if (this.timeout) {
- clearTimeout(this.timeout)
+ clearTimeout(this.timeout);
}
- this.timeout = setTimeout(this.save, this.props.debounce)
+ this.timeout = setTimeout(this.save, this.props.debounce);
}
save = async () => {
if (this.promise) {
- await this.promise
+ await this.promise;
}
- const { values, save } = this.props
+ const { values, save } = this.props;
// This diff step is totally optional
- const difference = diff(this.state.values, values)
+ const difference = diff(this.state.values, values);
if (Object.keys(difference).length) {
// values have changed
- this.setState({ submitting: true, values })
- this.promise = save(difference)
- await this.promise
- delete this.promise
- this.setState({ submitting: false })
+ this.setState({ submitting: true, values });
+ this.promise = save(difference);
+ await this.promise;
+ delete this.promise;
+ this.setState({ submitting: false });
}
- }
+ };
render() {
// This component doesn't have to render anything, but it can render
// submitting state.
return (
this.state.submitting && Submitting...
- )
+ );
}
}
@@ -48,6 +48,6 @@ class AutoSave extends React.Component {
// - Maintain state of when we are submitting
// - Render a message when submitting
// - Pass in debounce and save props nicely
-export default props => (
+export default (props) => (
-)
+);
diff --git a/examples/auto-save-with-debounce/Styles.js b/examples/auto-save-with-debounce/Styles.js
index d46ad21e..b7fb0008 100644
--- a/examples/auto-save-with-debounce/Styles.js
+++ b/examples/auto-save-with-debounce/Styles.js
@@ -1,4 +1,4 @@
-import styled, { css } from 'styled-components'
+import styled, { css } from "styled-components";
const btn = (light, dark) => css`
white-space: nowrap;
@@ -25,14 +25,14 @@ const btn = (light, dark) => css`
opacity: 0.6;
cursor: not-allowed;
}
-`
+`;
const btnDefault = css`
- ${btn('#ffffff', '#d5d5d5')} color: #555;
-`
+ ${btn("#ffffff", "#d5d5d5")} color: #555;
+`;
-const btnPrimary = btn('#4f93ce', '#285f8f')
-const btnDanger = btn('#e27c79', '#c9302c')
+const btnPrimary = btn("#4f93ce", "#285f8f");
+const btnDanger = btn("#e27c79", "#c9302c");
export default styled.div`
font-family: sans-serif;
@@ -81,7 +81,7 @@ export default styled.div`
text-align: center;
display: block;
position: absolute;
- background: url('https://media.giphy.com/media/130AxGoOaR6t0I/giphy.gif')
+ background: url("https://media.giphy.com/media/130AxGoOaR6t0I/giphy.gif")
center center;
background-size: fill;
font-size: 2em;
@@ -116,7 +116,7 @@ export default styled.div`
border: 1px solid #ccc;
border-radius: 3px;
}
- & > input[type='checkbox'] {
+ & > input[type="checkbox"] {
margin-top: 7px;
}
& > div {
@@ -176,11 +176,11 @@ export default styled.div`
}
button {
margin: 0 10px;
- &[type='submit'] {
+ &[type="submit"] {
${btnPrimary};
}
- &[type='button'] {
+ &[type="button"] {
${btnDefault};
}
}
-`
+`;
diff --git a/examples/auto-save-with-debounce/index.js b/examples/auto-save-with-debounce/index.js
index fc6e9332..7c80d1aa 100644
--- a/examples/auto-save-with-debounce/index.js
+++ b/examples/auto-save-with-debounce/index.js
@@ -1,22 +1,22 @@
-import React from 'react'
-import { render } from 'react-dom'
-import Styles from './Styles'
-import { Form, Field } from 'react-final-form'
-import AutoSave from './AutoSave'
+import React from "react";
+import { render } from "react-dom";
+import Styles from "./Styles";
+import { Form, Field } from "react-final-form";
+import AutoSave from "./AutoSave";
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
-const save = async values => {
- console.log('Saving', values)
- await sleep(2000)
-}
+const save = async (values) => {
+ console.log("Saving", values);
+ await sleep(2000);
+};
const App = () => (
🏁
- {' '}
+ {" "}
React Final Form
Auto-Save with Debounce
@@ -24,20 +24,20 @@ const App = () => (
Read Docs
- The AutoSave component uses{' '}
+ The AutoSave component uses{" "}
FormSpy
- {' '}
+ {" "}
to listen to changes to values and auto-save changes. Look in the console
for the save events.
-)
+);
-render( , document.getElementById('root'))
+render( , document.getElementById("root"));
diff --git a/examples/calculated-fields/Styles.js b/examples/calculated-fields/Styles.js
index 2a2bfadd..3f54fa69 100644
--- a/examples/calculated-fields/Styles.js
+++ b/examples/calculated-fields/Styles.js
@@ -1,4 +1,4 @@
-import styled, { css } from 'styled-components'
+import styled, { css } from "styled-components";
const btn = (light, dark) => css`
white-space: nowrap;
@@ -25,14 +25,14 @@ const btn = (light, dark) => css`
opacity: 0.6;
cursor: not-allowed;
}
-`
+`;
const btnDefault = css`
- ${btn('#ffffff', '#d5d5d5')} color: #555;
-`
+ ${btn("#ffffff", "#d5d5d5")} color: #555;
+`;
-const btnPrimary = btn('#4f93ce', '#285f8f')
-const btnDanger = btn('#e27c79', '#c9302c')
+const btnPrimary = btn("#4f93ce", "#285f8f");
+const btnDanger = btn("#e27c79", "#c9302c");
export default styled.div`
font-family: sans-serif;
@@ -79,7 +79,7 @@ export default styled.div`
text-align: center;
display: block;
position: absolute;
- background: url('https://media.giphy.com/media/130AxGoOaR6t0I/giphy.gif')
+ background: url("https://media.giphy.com/media/130AxGoOaR6t0I/giphy.gif")
center center;
background-size: fill;
font-size: 2em;
@@ -114,7 +114,7 @@ export default styled.div`
border: 1px solid #ccc;
border-radius: 3px;
}
- & > input[type='checkbox'] {
+ & > input[type="checkbox"] {
margin-top: 7px;
}
& > div {
@@ -144,10 +144,10 @@ export default styled.div`
}
button {
margin: 0 10px;
- &[type='submit'] {
+ &[type="submit"] {
${btnPrimary};
}
- &[type='button'] {
+ &[type="button"] {
${btnDefault};
}
}
@@ -166,4 +166,4 @@ export default styled.div`
padding: 20px;
}
}
-`
+`;
diff --git a/examples/calculated-fields/index.js b/examples/calculated-fields/index.js
index 4e920e66..a7cb1af2 100644
--- a/examples/calculated-fields/index.js
+++ b/examples/calculated-fields/index.js
@@ -1,32 +1,32 @@
-import React from 'react'
-import { render } from 'react-dom'
-import Styles from './Styles'
-import { Form, Field } from 'react-final-form'
-import createDecorator from 'final-form-calculate'
+import React from "react";
+import { render } from "react-dom";
+import Styles from "./Styles";
+import { Form, Field } from "react-final-form";
+import createDecorator from "final-form-calculate";
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
-const onSubmit = async values => {
- await sleep(300)
- window.alert(JSON.stringify(values, 0, 2))
-}
+const onSubmit = async (values) => {
+ await sleep(300);
+ window.alert(JSON.stringify(values, 0, 2));
+};
const calculator = createDecorator(
{
- field: 'minimum', // when minimum changes...
+ field: "minimum", // when minimum changes...
updates: {
// ...update maximum to the result of this function
maximum: (minimumValue, allValues) =>
- Math.max(minimumValue || 0, allValues.maximum || 0)
- }
+ Math.max(minimumValue || 0, allValues.maximum || 0),
+ },
},
{
- field: 'maximum', // when maximum changes...
+ field: "maximum", // when maximum changes...
updates: {
// update minimum to the result of this function
minimum: (maximumValue, allValues) =>
- Math.min(maximumValue || 0, allValues.minimum || 0)
- }
+ Math.min(maximumValue || 0, allValues.minimum || 0),
+ },
},
{
field: /day\[\d\]/, // when a field matching this pattern changes...
@@ -35,18 +35,18 @@ const calculator = createDecorator(
total: (ignoredValue, allValues) =>
(allValues.day || []).reduce(
(sum, value) => sum + Number(value || 0),
- 0
- )
- }
- }
-)
+ 0,
+ ),
+ },
+ },
+);
const App = () => (
🏁
- {' '}
+ {" "}
React Final Form Example
Calculated Fields
@@ -159,6 +159,6 @@ const App = () => (
)}
/>
-)
+);
-render( , document.getElementById('root'))
+render( , document.getElementById("root"));
diff --git a/examples/chakra/index.js b/examples/chakra/index.js
index 12601ae9..0f9da298 100644
--- a/examples/chakra/index.js
+++ b/examples/chakra/index.js
@@ -1,6 +1,6 @@
/* eslint-disable jsx-a11y/accessible-emoji */
-import React from 'react'
-import { render } from 'react-dom'
+import React from "react";
+import { render } from "react-dom";
import {
Box,
Button,
@@ -20,17 +20,17 @@ import {
Radio,
RadioGroup,
Stack,
- Textarea
-} from '@chakra-ui/core'
-import { Form, Field, useField, useForm } from 'react-final-form'
-import validate from './validate'
+ Textarea,
+} from "@chakra-ui/core";
+import { Form, Field, useField, useForm } from "react-final-form";
+import validate from "./validate";
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
-const onSubmit = async values => {
- await sleep(300)
- window.alert(JSON.stringify(values, 0, 2))
-}
+const onSubmit = async (values) => {
+ await sleep(300);
+ window.alert(JSON.stringify(values, 0, 2));
+};
const App = () => (
@@ -43,7 +43,7 @@ const App = () => (
Chakra Example
- Example using React Final Form and{' '}
+ Example using React Final Form and{" "}
Chakra
@@ -63,7 +63,7 @@ const App = () => (
errors,
submitting,
pristine,
- values
+ values,
}) => (
(
/>
-)
+);
const AdaptedTextarea = ({ input, meta, ...rest }) => (
-)
+);
const CheckboxControl = ({ name, value, children }) => {
const {
input: { checked, ...input },
- meta: { error, touched, invalid }
+ meta: { error, touched, invalid },
} = useField(name, {
- type: 'checkbox' // important for RFF to manage the checked prop
- })
+ type: "checkbox", // important for RFF to manage the checked prop
+ });
return (
@@ -168,23 +168,23 @@ const CheckboxControl = ({ name, value, children }) => {
{error}
- )
-}
+ );
+};
const CheckboxArrayControl = ({ name, value, children }) => {
const {
input: { checked, ...input },
- meta: { error, touched }
+ meta: { error, touched },
} = useField(name, {
- type: 'checkbox', // important for RFF to manage the checked prop
- value // important for RFF to manage list of strings
- })
+ type: "checkbox", // important for RFF to manage the checked prop
+ value, // important for RFF to manage list of strings
+ });
return (
{children}
- )
-}
+ );
+};
const AdaptedRadioGroup = ({ input, meta, label, children }) => (
@@ -192,24 +192,24 @@ const AdaptedRadioGroup = ({ input, meta, label, children }) => (
{children}
{meta.error}
-)
+);
const Control = ({ name, ...rest }) => {
const {
- meta: { error, touched }
- } = useField(name, { subscription: { touched: true, error: true } })
- return
-}
+ meta: { error, touched },
+ } = useField(name, { subscription: { touched: true, error: true } });
+ return ;
+};
const Error = ({ name }) => {
const {
- meta: { error }
- } = useField(name, { subscription: { error: true } })
- return {error}
-}
+ meta: { error },
+ } = useField(name, { subscription: { error: true } });
+ return {error} ;
+};
const InputControl = ({ name, label }) => {
- const { input, meta } = useField(name)
+ const { input, meta } = useField(name);
return (
{label}
@@ -221,8 +221,8 @@ const InputControl = ({ name, label }) => {
/>
- )
-}
+ );
+};
const TextareaControl = ({ name, label }) => (
@@ -235,18 +235,18 @@ const TextareaControl = ({ name, label }) => (
/>
-)
+);
-const PercentComplete = props => {
- const form = useForm()
- const numFields = form.getRegisteredFields().length
- const numErrors = Object.keys(form.getState().errors).length
+const PercentComplete = (props) => {
+ const form = useForm();
+ const numFields = form.getRegisteredFields().length;
+ const numErrors = Object.keys(form.getState().errors).length;
return (
- )
-}
+ );
+};
-render( , document.getElementById('root'))
+render( , document.getElementById("root"));
diff --git a/examples/chakra/validate.js b/examples/chakra/validate.js
index d49b6ed3..19d9e21c 100644
--- a/examples/chakra/validate.js
+++ b/examples/chakra/validate.js
@@ -1,27 +1,27 @@
-const validate = values => {
- const errors = {}
+const validate = (values) => {
+ const errors = {};
if (!values.firstName) {
- errors.firstName = 'Required'
+ errors.firstName = "Required";
}
if (!values.lastName) {
- errors.lastName = 'Required'
+ errors.lastName = "Required";
}
if (values.employed) {
- errors.employed = "We're only accepted unemployed applicants at the moment"
+ errors.employed = "We're only accepted unemployed applicants at the moment";
}
if (!values.favoriteColor) {
- errors.favoriteColor = 'Required'
- } else if (values.favoriteColor === '#00ff00') {
- errors.favoriteColor = 'Not green! Gross!'
+ errors.favoriteColor = "Required";
+ } else if (values.favoriteColor === "#00ff00") {
+ errors.favoriteColor = "Not green! Gross!";
}
if (!values.toppings || values.toppings.length < 2) {
- errors.toppings = 'You need at least two toppings'
+ errors.toppings = "You need at least two toppings";
} else if (values.toppings && values.toppings.length > 3) {
- errors.toppings = 'No more than three toppings'
+ errors.toppings = "No more than three toppings";
}
if (!values.notes) {
- errors.notes = 'Required'
+ errors.notes = "Required";
}
- return errors
-}
-export default validate
+ return errors;
+};
+export default validate;
diff --git a/examples/conditional-fields/Styles.js b/examples/conditional-fields/Styles.js
index dd091033..698c8005 100644
--- a/examples/conditional-fields/Styles.js
+++ b/examples/conditional-fields/Styles.js
@@ -1,4 +1,4 @@
-import styled, { css } from 'styled-components'
+import styled, { css } from "styled-components";
const btn = (light, dark) => css`
white-space: nowrap;
@@ -25,14 +25,14 @@ const btn = (light, dark) => css`
opacity: 0.6;
cursor: not-allowed;
}
-`
+`;
const btnDefault = css`
- ${btn('#ffffff', '#d5d5d5')} color: #555;
-`
+ ${btn("#ffffff", "#d5d5d5")} color: #555;
+`;
-const btnPrimary = btn('#4f93ce', '#285f8f')
-const btnDanger = btn('#e27c79', '#c9302c')
+const btnPrimary = btn("#4f93ce", "#285f8f");
+const btnDanger = btn("#e27c79", "#c9302c");
export default styled.div`
font-family: sans-serif;
@@ -108,7 +108,7 @@ export default styled.div`
border: 1px solid #ccc;
border-radius: 3px;
}
- & > input[type='checkbox'] {
+ & > input[type="checkbox"] {
margin-top: 7px;
}
& > div {
@@ -188,10 +188,10 @@ export default styled.div`
}
button {
margin: 0 10px;
- &[type='submit'] {
+ &[type="submit"] {
${btnPrimary};
}
- &[type='button'] {
+ &[type="button"] {
${btnDefault};
}
}
@@ -202,4 +202,4 @@ export default styled.div`
padding: 3px 5px;
}
}
-`
+`;
diff --git a/examples/conditional-fields/index.js b/examples/conditional-fields/index.js
index 666873d7..7ed0afd6 100644
--- a/examples/conditional-fields/index.js
+++ b/examples/conditional-fields/index.js
@@ -1,15 +1,15 @@
-import React from 'react'
-import { render } from 'react-dom'
-import Styles from './Styles'
-import { Form, Field } from 'react-final-form'
-import pickupTimes from './pickupTimes'
+import React from "react";
+import { render } from "react-dom";
+import Styles from "./Styles";
+import { Form, Field } from "react-final-form";
+import pickupTimes from "./pickupTimes";
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
-const onSubmit = async values => {
- await sleep(300)
- window.alert(JSON.stringify(values, 0, 2))
-}
+const onSubmit = async (values) => {
+ await sleep(300);
+ window.alert(JSON.stringify(values, 0, 2));
+};
const Error = ({ name }) => (
@@ -17,20 +17,20 @@ const Error = ({ name }) => (
error && touched ? {error} : null
}
-)
+);
const Condition = ({ when, is, children }) => (
{({ input: { value } }) => (value === is ? children : null)}
-)
+);
const App = () => (
🏁
- {' '}
+ {" "}
React Final Form
Conditional Fields
@@ -40,34 +40,34 @@ const App = () => (
Sometimes you might want to conditionally show or hide some parts of your
form depending on values the user has already provided for other form
- inputs.{' '}
+ inputs.{" "}
🏁
- {' '}
- React Final Form makes that very easy to do by creating a{' '}
+ {" "}
+ React Final Form makes that very easy to do by creating a{" "}
Condition component out of a Field component.
-)
+);
-render( , document.getElementById('root'))
+render( , document.getElementById("root"));
diff --git a/examples/credit-card/Card.js b/examples/credit-card/Card.js
index 62964fcf..ab6ef7b0 100644
--- a/examples/credit-card/Card.js
+++ b/examples/credit-card/Card.js
@@ -1,6 +1,6 @@
-import React from 'react'
-import styled from 'styled-components'
-import Cards from 'react-credit-cards'
+import React from "react";
+import styled from "styled-components";
+import Cards from "react-credit-cards";
const Container = styled.div`
.rccs {
@@ -91,7 +91,7 @@ const Container = styled.div`
background: linear-gradient(25deg, #308c67, #a3f2cf);
}
.rccs__card--amex .rccs__issuer {
- background-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPjxkZWZzPjxyYWRpYWxHcmFkaWVudCBjeD0iMTcuNTQxJSIgY3k9IjE3LjQ2NiUiIGZ4PSIxNy41NDElIiBmeT0iMTcuNDY2JSIgcj0iOTEuMjM3JSIgaWQ9ImEiPjxzdG9wIHN0b3AtY29sb3I9IiM2NUJDRjEiIG9mZnNldD0iMCUiLz48c3RvcCBzdG9wLWNvbG9yPSIjMjNBREUzIiBvZmZzZXQ9IjQ1LjQ2JSIvPjxzdG9wIHN0b3AtY29sb3I9IiMwREE2RTAiIG9mZnNldD0iNTAlIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzA1NTFDMyIgb2Zmc2V0PSIxMDAlIi8+PC9yYWRpYWxHcmFkaWVudD48L2RlZnM+PHBhdGggZmlsbD0idXJsKCNhKSIgZD0iTTAgMGg1MTJ2NTEyaC01MTJ6Ii8+PHBhdGggZD0iTTQ1Ljc5MSAyMjAuOTM1bC05Ljc3My0yMy44MTMtOS43MTcgMjMuODEzaDE5LjQ4OXptMjE1LjI4OS05LjQ4M2MtMS45NjIgMS4xOTEtNC4yODMgMS4yMzEtNy4wNjMgMS4yMzFoLTE3LjM0NXYtMTMuMjY4aDE3LjU4MWMyLjQ4OCAwIDUuMDg0LjExMiA2Ljc3MSAxLjA3NyAxLjg1Mi44NyAyLjk5OCAyLjcyMiAyLjk5OCA1LjI4MSAwIDIuNjExLTEuMDkgNC43MTItMi45NDIgNS42Nzl6bTEyMy43MzkgOS40ODNsLTkuODgxLTIzLjgxMy05LjgyNyAyMy44MTNoMTkuNzA3em0tMjMwLjY1OCAyNS43NzZoLTE0LjYzN2wtLjA1NC00Ni43ODQtMjAuNzA0IDQ2Ljc4NGgtMTIuNTM2bC0yMC43NTgtNDYuODI1djQ2LjgyNWgtMjkuMDRsLTUuNDg2LTEzLjMyNGgtMjkuNzI5bC01LjU0MiAxMy4zMjRoLTE1LjUwN2wyNS41NjgtNTkuNzM1aDIxLjIxNGwyNC4yODQgNTYuNTU2di01Ni41NTZoMjMuMzA0bDE4LjY4NiA0MC41MjMgMTcuMTY1LTQwLjUyM2gyMy43NzJ2NTkuNzM1aC4wMDJ6bTU4LjMzOCAwaC00Ny42OTd2LTU5LjczNWg0Ny42OTd2MTIuNDM5aC0zMy40MTl2MTAuNzY3aDMyLjYxN3YxMi4yNDVoLTMyLjYxN3YxMS45MjloMzMuNDE5djEyLjM1NHptNjcuMjUxLTQzLjY0N2MwIDkuNTI0LTYuMzU3IDE0LjQ0NC0xMC4wNjEgMTUuOTIyIDMuMTI0IDEuMTg5IDUuNzkzIDMuMjkgNy4wNjMgNS4wMyAyLjAxNiAyLjk3MSAyLjM2NCA1LjYyNSAyLjM2NCAxMC45NnYxMS43MzVoLTE0LjQwMWwtLjA1NC03LjUzM2MwLTMuNTk0LjM0NC04Ljc2NC0yLjI1NC0xMS42MzctMi4wODYtMi4xMDEtNS4yNjYtMi41NTctMTAuNDA3LTIuNTU3aC0xNS4zMjd2MjEuNzI3aC0xNC4yNzd2LTU5LjczNWgzMi44NGM3LjI5NyAwIDEyLjY3My4xOTMgMTcuMjg5IDIuODYxIDQuNTE3IDIuNjY4IDcuMjI1IDYuNTY0IDcuMjI1IDEzLjIyN3ptMjIuODUgNDMuNjQ3aC0xNC41Njl2LTU5LjczNWgxNC41Njl2NTkuNzM1em0xNjkuMDE3IDBoLTIwLjIzM2wtMjcuMDY0LTQ0LjgzNHY0NC44MzRoLTI5LjA3OGwtNS41NTctMTMuMzI0aC0yOS42NmwtNS4zOTEgMTMuMzI0aC0xNi43MDdjLTYuOTQgMC0xNS43MjctMS41MzUtMjAuNzA0LTYuNjA3LTUuMDE4LTUuMDcyLTcuNjI5LTExLjk0Mi03LjYyOS0yMi44MDUgMC04Ljg1OSAxLjU2LTE2Ljk1OCA3LjY5Ny0yMy4zNTggNC42MTYtNC43NjcgMTEuODQ1LTYuOTY1IDIxLjY4NC02Ljk2NWgxMy44MjN2MTIuNzk5aC0xMy41MzNjLTUuMjExIDAtOC4xNTMuNzc1LTEwLjk4NyAzLjUzOS0yLjQzNCAyLjUxNS00LjEwNCA3LjI3LTQuMTA0IDEzLjUzMSAwIDYuNCAxLjI3MiAxMS4wMTQgMy45MjYgMTQuMDI4IDIuMTk4IDIuMzY0IDYuMTkzIDMuMDgxIDkuOTUxIDMuMDgxaDYuNDEybDIwLjEyNC00Ni45NzdoMjEuMzk0bDI0LjE3NCA1Ni41di01Ni41aDIxLjc0bDI1LjA5OCA0MS42MDJ2LTQxLjYwMmgxNC42MjV2NTkuNzMzem0tNDcxLjYxNiAxMS43MzNoMjQuMzk1bDUuNTAxLTEzLjI2OGgxMi4zMTVsNS40ODYgMTMuMjY4aDQ4di0xMC4xNDRsNC4yODUgMTAuMTg3aDI0LjkxOGw0LjI4NS0xMC4zMzh2MTAuMjk1aDExOS4yODlsLS4wNTYtMjEuNzc5aDIuMzA4YzEuNjE2LjA1NiAyLjA4OC4yMDUgMi4wODggMi44NzR2MTguOTA2aDYxLjY5N3YtNS4wN2M0Ljk3NiAyLjY2NyAxMi43MTcgNS4wNyAyMi45MDIgNS4wN2gyNS45NTZsNS41NTUtMTMuMjY4aDEyLjMxNWw1LjQzMiAxMy4yNjhoNTAuMDE4di0xMi42MDNsNy41NzQgMTIuNjAzaDQwLjA4MXYtODMuMzEyaC0zOS42Njd2OS44MzlsLTUuNTU1LTkuODM5aC00MC43MDN2OS44MzlsLTUuMTAxLTkuODM5aC01NC45OGMtOS4yMDMgMC0xNy4yOTMgMS4yODUtMjMuODI4IDQuODY1di00Ljg2NWgtMzcuOTQxdjQuODY1Yy00LjE1OC0zLjY5LTkuODI1LTQuODY1LTE2LjEyNS00Ljg2NWgtMTM4LjYxM2wtOS4zMDEgMjEuNTE4LTkuNTUxLTIxLjUxOGgtNDMuNjZ2OS44MzlsLTQuNzk2LTkuODM5aC0zNy4yMzVsLTE3LjI5MSAzOS42MTF2NDMuNzAxaC4wMDJ6TTUxMiAzMDIuMDE0aC0yNi4wMzljLTIuNiAwLTQuMzI3LjA5Ny01Ljc4MiAxLjA4LTEuNTA3Ljk2OC0yLjA4OCAyLjQwNS0yLjA4OCA0LjMwMiAwIDIuMjU1IDEuMjczIDMuNzkgMy4xMjQgNC40NTMgMS41MDcuNTI1IDMuMTI2LjY3OCA1LjUwNi42NzhsNy43NDMuMjA3YzcuODE0LjE5MyAxMy4wMjkgMS41MzYgMTYuMjA5IDQuODEyLjU3OS40NTYuOTI3Ljk2OCAxLjMyNSAxLjQ4di0xNy4wMTJ6bTAgMzkuNDE2Yy0zLjQ3IDUuMDc1LTEwLjIzMyA3LjY0OC0xOS4zODggNy42NDhoLTI3LjU5MXYtMTIuODJoMjcuNDc5YzIuNzI2IDAgNC42MzMtLjM1OSA1Ljc4Mi0xLjQ4Ljk5NS0uOTI1IDEuNjg5LTIuMjY4IDEuNjg5LTMuOSAwLTEuNzQyLS42OTQtMy4xMjQtMS43NDUtMy45NTQtMS4wMzctLjkxMi0yLjU0Ni0xLjMyNy01LjAzNC0xLjMyNy0xMy40MTUtLjQ1Ni0zMC4xNTEuNDE1LTMwLjE1MS0xOC41MDQgMC04LjY3MiA1LjUwNi0xNy44IDIwLjQ5OC0xNy44aDI4LjQ1OHYtMTEuODk1aC0yNi40NDFjLTcuOTc5IDAtMTMuNzc2IDEuOTExLTE3Ljg4MSA0Ljg4MnYtNC44ODJoLTM5LjEwOWMtNi4yNTQgMC0xMy41OTUgMS41NS0xNy4wNjggNC44ODJ2LTQuODgyaC02OS44Mzl2NC44ODJjLTUuNTU4LTQuMDEtMTQuOTM3LTQuODgyLTE5LjI2NS00Ljg4MmgtNDYuMDY2djQuODgyYy00LjM5Ny00LjI1OC0xNC4xNzYtNC44ODItMjAuMTM2LTQuODgyaC01MS41NTZsLTExLjc5OCAxMi43NjgtMTEuMDUtMTIuNzY4aC03Ny4wMTR2ODMuNDIxaDc1LjU2NWwxMi4xNTctMTIuOTcgMTEuNDUyIDEyLjk3IDQ2LjU3OC4wNDF2LTE5LjYyNGg0LjU3OWM2LjE4LjA5NiAxMy40NjktLjE1MyAxOS45LTIuOTMzdjIyLjUxNGgzOC40MTl2LTIxLjc0MmgxLjg1M2MyLjM2NSAwIDIuNTk4LjA5NyAyLjU5OCAyLjQ2MXYxOS4yOGgxMTYuNzA5YzcuNDEgMCAxNS4xNTUtMS44OTcgMTkuNDQ0LTUuMzM4djUuMzM4aDM3LjAyYzcuNzA0IDAgMTUuMjI3LTEuMDggMjAuOTUxLTMuODQ1di0xNS41NDF6bS01Ni45OS0yMy44ODRjMi43ODIgMi44NzkgNC4yNzMgNi41MTQgNC4yNzMgMTIuNjY3IDAgMTIuODYyLTguMDM1IDE4Ljg2NS0yMi40NDQgMTguODY1aC0yNy44Mjd2LTEyLjgyaDI3LjcxNWMyLjcxIDAgNC42MzItLjM1OSA1LjgzNi0xLjQ4Ljk4My0uOTI1IDEuNjg3LTIuMjY4IDEuNjg3LTMuOSAwLTEuNzQyLS43NjMtMy4xMjQtMS43NDMtMy45NTQtMS4wOTMtLjkxMi0yLjYtMS4zMjctNS4wODgtMS4zMjctMTMuMzYxLS40NTYtMzAuMDkzLjQxNS0zMC4wOTMtMTguNTA0IDAtOC42NzIgNS40NDgtMTcuOCAyMC40MjYtMTcuOGgyOC42NDJ2MTIuNzI1aC0yNi4yMDhjLTIuNTk4IDAtNC4yODcuMDk3LTUuNzI0IDEuMDgtMS41NjUuOTY4LTIuMTQ1IDIuNDA1LTIuMTQ1IDQuMzAyIDAgMi4yNTUgMS4zMjkgMy43OSAzLjEyNiA0LjQ1MyAxLjUwNy41MjUgMy4xMjYuNjc4IDUuNTYuNjc4bDcuNjkxLjIwN2M3Ljc1Ni4xODkgMTMuMDggMS41MzEgMTYuMzE2IDQuODA4em0tMTI4LjkxOC0zLjY5MmMtMS45MTEgMS4xMzQtNC4yNzUgMS4yMzEtNy4wNTUgMS4yMzFoLTE3LjM1NnYtMTMuNDI4aDE3LjU5MmMyLjU0NCAwIDUuMDg5LjA1NCA2LjgxOCAxLjA4IDEuODUyLjk2OCAyLjk1OCAyLjgyIDIuOTU4IDUuMzc4IDAgMi41NTgtMS4xMDcgNC42MTktMi45NTggNS43Mzh6bTguNjI4IDcuNDRjMy4xOCAxLjE3NCA1Ljc4IDMuMjc4IDYuOTk5IDUuMDE5IDIuMDE3IDIuOTE5IDIuMzA5IDUuNjQzIDIuMzY3IDEwLjkxM3YxMS44NTJoLTE0LjM0M3YtNy40OGMwLTMuNTk3LjM0Ni04LjkyMi0yLjMwOS0xMS43MDItMi4wODgtMi4xNDItNS4yNy0yLjY1NC0xMC40ODItMi42NTRoLTE1LjI2OHYyMS44MzZoLTE0LjM1NnYtNTkuNzg2aDMyLjk4NWM3LjIzMyAwIDEyLjUwMS4zMTkgMTcuMTkgMi44MjEgNC41MDkgMi43MjQgNy4zNDUgNi40NTYgNy4zNDUgMTMuMjc2LS4wMDIgOS41NDItNi4zNjYgMTQuNDEyLTEwLjEyNyAxNS45MDV6bTE4LjA0OC0zMi4wMDJoNDcuNjg0djEyLjM2NGgtMzMuNDU1djEwLjg2OWgzMi42Mzl2MTIuMTk4aC0zMi42Mzl2MTEuODk1bDMzLjQ1NS4wNTR2MTIuNDA1aC00Ny42ODR2LTU5Ljc4NnptLTk2LjM5MyAyNy41OTFoLTE4LjQ2M3YtMTUuMjI1aDE4LjYyOWM1LjE1OCAwIDguNzM4IDIuMTAyIDguNzM4IDcuMzMgMCA1LjE3MS0zLjQxNSA3Ljg5NS04LjkwNCA3Ljg5NXptLTMyLjY5MyAyNi43NThsLTIxLjkzNS0yNC4zNTMgMjEuOTM1LTIzLjU3OXY0Ny45MzJ6bS01Ni42NDctNy4wMjJoLTM1LjEyN3YtMTEuODk1aDMxLjM2NnYtMTIuMTk4aC0zMS4zNjZ2LTEwLjg2OWgzNS44MTlsMTUuNjI3IDE3LjQyMy0xNi4zMTkgMTcuNTR6bTExMy41ODMtMjcuNjNjMCAxNi42MDgtMTIuMzkxIDIwLjAzNy0yNC44NzkgMjAuMDM3aC0xNy44Mjd2MjAuMDUzaC0yNy43NjlsLTE3LjU5Mi0xOS43OTItMTguMjgzIDE5Ljc5MmgtNTYuNTkxdi01OS43ODZoNTcuNDYybDE3LjU3OCAxOS41OTcgMTguMTczLTE5LjU5N2g0NS42NTJjMTEuMzM4IDAgMjQuMDc3IDMuMTM5IDI0LjA3NyAxOS42OTZ6IiBmaWxsPSIjZmZmIi8+PC9zdmc+');
+ background-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPjxkZWZzPjxyYWRpYWxHcmFkaWVudCBjeD0iMTcuNTQxJSIgY3k9IjE3LjQ2NiUiIGZ4PSIxNy41NDElIiBmeT0iMTcuNDY2JSIgcj0iOTEuMjM3JSIgaWQ9ImEiPjxzdG9wIHN0b3AtY29sb3I9IiM2NUJDRjEiIG9mZnNldD0iMCUiLz48c3RvcCBzdG9wLWNvbG9yPSIjMjNBREUzIiBvZmZzZXQ9IjQ1LjQ2JSIvPjxzdG9wIHN0b3AtY29sb3I9IiMwREE2RTAiIG9mZnNldD0iNTAlIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzA1NTFDMyIgb2Zmc2V0PSIxMDAlIi8+PC9yYWRpYWxHcmFkaWVudD48L2RlZnM+PHBhdGggZmlsbD0idXJsKCNhKSIgZD0iTTAgMGg1MTJ2NTEyaC01MTJ6Ii8+PHBhdGggZD0iTTQ1Ljc5MSAyMjAuOTM1bC05Ljc3My0yMy44MTMtOS43MTcgMjMuODEzaDE5LjQ4OXptMjE1LjI4OS05LjQ4M2MtMS45NjIgMS4xOTEtNC4yODMgMS4yMzEtNy4wNjMgMS4yMzFoLTE3LjM0NXYtMTMuMjY4aDE3LjU4MWMyLjQ4OCAwIDUuMDg0LjExMiA2Ljc3MSAxLjA3NyAxLjg1Mi44NyAyLjk5OCAyLjcyMiAyLjk5OCA1LjI4MSAwIDIuNjExLTEuMDkgNC43MTItMi45NDIgNS42Nzl6bTEyMy43MzkgOS40ODNsLTkuODgxLTIzLjgxMy05LjgyNyAyMy44MTNoMTkuNzA3em0tMjMwLjY1OCAyNS43NzZoLTE0LjYzN2wtLjA1NC00Ni43ODQtMjAuNzA0IDQ2Ljc4NGgtMTIuNTM2bC0yMC43NTgtNDYuODI1djQ2LjgyNWgtMjkuMDRsLTUuNDg2LTEzLjMyNGgtMjkuNzI5bC01LjU0MiAxMy4zMjRoLTE1LjUwN2wyNS41NjgtNTkuNzM1aDIxLjIxNGwyNC4yODQgNTYuNTU2di01Ni41NTZoMjMuMzA0bDE4LjY4NiA0MC41MjMgMTcuMTY1LTQwLjUyM2gyMy43NzJ2NTkuNzM1aC4wMDJ6bTU4LjMzOCAwaC00Ny42OTd2LTU5LjczNWg0Ny42OTd2MTIuNDM5aC0zMy40MTl2MTAuNzY3aDMyLjYxN3YxMi4yNDVoLTMyLjYxN3YxMS45MjloMzMuNDE5djEyLjM1NHptNjcuMjUxLTQzLjY0N2MwIDkuNTI0LTYuMzU3IDE0LjQ0NC0xMC4wNjEgMTUuOTIyIDMuMTI0IDEuMTg5IDUuNzkzIDMuMjkgNy4wNjMgNS4wMyAyLjAxNiAyLjk3MSAyLjM2NCA1LjYyNSAyLjM2NCAxMC45NnYxMS43MzVoLTE0LjQwMWwtLjA1NC03LjUzM2MwLTMuNTk0LjM0NC04Ljc2NC0yLjI1NC0xMS42MzctMi4wODYtMi4xMDEtNS4yNjYtMi41NTctMTAuNDA3LTIuNTU3aC0xNS4zMjd2MjEuNzI3aC0xNC4yNzd2LTU5LjczNWgzMi44NGM3LjI5NyAwIDEyLjY3My4xOTMgMTcuMjg5IDIuODYxIDQuNTE3IDIuNjY4IDcuMjI1IDYuNTY0IDcuMjI1IDEzLjIyN3ptMjIuODUgNDMuNjQ3aC0xNC41Njl2LTU5LjczNWgxNC41Njl2NTkuNzM1em0xNjkuMDE3IDBoLTIwLjIzM2wtMjcuMDY0LTQ0LjgzNHY0NC44MzRoLTI5LjA3OGwtNS41NTctMTMuMzI0aC0yOS42NmwtNS4zOTEgMTMuMzI0aC0xNi43MDdjLTYuOTQgMC0xNS43MjctMS41MzUtMjAuNzA0LTYuNjA3LTUuMDE4LTUuMDcyLTcuNjI5LTExLjk0Mi03LjYyOS0yMi44MDUgMC04Ljg1OSAxLjU2LTE2Ljk1OCA3LjY5Ny0yMy4zNTggNC42MTYtNC43NjcgMTEuODQ1LTYuOTY1IDIxLjY4NC02Ljk2NWgxMy44MjN2MTIuNzk5aC0xMy41MzNjLTUuMjExIDAtOC4xNTMuNzc1LTEwLjk4NyAzLjUzOS0yLjQzNCAyLjUxNS00LjEwNCA3LjI3LTQuMTA0IDEzLjUzMSAwIDYuNCAxLjI3MiAxMS4wMTQgMy45MjYgMTQuMDI4IDIuMTk4IDIuMzY0IDYuMTkzIDMuMDgxIDkuOTUxIDMuMDgxaDYuNDEybDIwLjEyNC00Ni45NzdoMjEuMzk0bDI0LjE3NCA1Ni41di01Ni41aDIxLjc0bDI1LjA5OCA0MS42MDJ2LTQxLjYwMmgxNC42MjV2NTkuNzMzem0tNDcxLjYxNiAxMS43MzNoMjQuMzk1bDUuNTAxLTEzLjI2OGgxMi4zMTVsNS40ODYgMTMuMjY4aDQ4di0xMC4xNDRsNC4yODUgMTAuMTg3aDI0LjkxOGw0LjI4NS0xMC4zMzh2MTAuMjk1aDExOS4yODlsLS4wNTYtMjEuNzc5aDIuMzA4YzEuNjE2LjA1NiAyLjA4OC4yMDUgMi4wODggMi44NzR2MTguOTA2aDYxLjY5N3YtNS4wN2M0Ljk3NiAyLjY2NyAxMi43MTcgNS4wNyAyMi45MDIgNS4wN2gyNS45NTZsNS41NTUtMTMuMjY4aDEyLjMxNWw1LjQzMiAxMy4yNjhoNTAuMDE4di0xMi42MDNsNy41NzQgMTIuNjAzaDQwLjA4MXYtODMuMzEyaC0zOS42Njd2OS44MzlsLTUuNTU1LTkuODM5aC00MC43MDN2OS44MzlsLTUuMTAxLTkuODM5aC01NC45OGMtOS4yMDMgMC0xNy4yOTMgMS4yODUtMjMuODI4IDQuODY1di00Ljg2NWgtMzcuOTQxdjQuODY1Yy00LjE1OC0zLjY5LTkuODI1LTQuODY1LTE2LjEyNS00Ljg2NWgtMTM4LjYxM2wtOS4zMDEgMjEuNTE4LTkuNTUxLTIxLjUxOGgtNDMuNjZ2OS44MzlsLTQuNzk2LTkuODM5aC0zNy4yMzVsLTE3LjI5MSAzOS42MTF2NDMuNzAxaC4wMDJ6TTUxMiAzMDIuMDE0aC0yNi4wMzljLTIuNiAwLTQuMzI3LjA5Ny01Ljc4MiAxLjA4LTEuNTA3Ljk2OC0yLjA4OCAyLjQwNS0yLjA4OCA0LjMwMiAwIDIuMjU1IDEuMjczIDMuNzkgMy4xMjQgNC40NTMgMS41MDcuNTI1IDMuMTI2LjY3OCA1LjUwNi42NzhsNy43NDMuMjA3YzcuODE0LjE5MyAxMy4wMjkgMS41MzYgMTYuMjA5IDQuODEyLjU3OS40NTYuOTI3Ljk2OCAxLjMyNSAxLjQ4di0xNy4wMTJ6bTAgMzkuNDE2Yy0zLjQ3IDUuMDc1LTEwLjIzMyA3LjY0OC0xOS4zODggNy42NDhoLTI3LjU5MXYtMTIuODJoMjcuNDc5YzIuNzI2IDAgNC42MzMtLjM1OSA1Ljc4Mi0xLjQ4Ljk5NS0uOTI1IDEuNjg5LTIuMjY4IDEuNjg5LTMuOSAwLTEuNzQyLS42OTQtMy4xMjQtMS43NDUtMy45NTQtMS4wMzctLjkxMi0yLjU0Ni0xLjMyNy01LjAzNC0xLjMyNy0xMy40MTUtLjQ1Ni0zMC4xNTEuNDE1LTMwLjE1MS0xOC41MDQgMC04LjY3MiA1LjUwNi0xNy44IDIwLjQ5OC0xNy44aDI4LjQ1OHYtMTEuODk1aC0yNi40NDFjLTcuOTc5IDAtMTMuNzc2IDEuOTExLTE3Ljg4MSA0Ljg4MnYtNC44ODJoLTM5LjEwOWMtNi4yNTQgMC0xMy41OTUgMS41NS0xNy4wNjggNC44ODJ2LTQuODgyaC02OS44Mzl2NC44ODJjLTUuNTU4LTQuMDEtMTQuOTM3LTQuODgyLTE5LjI2NS00Ljg4MmgtNDYuMDY2djQuODgyYy00LjM5Ny00LjI1OC0xNC4xNzYtNC44ODItMjAuMTM2LTQuODgyaC01MS41NTZsLTExLjc5OCAxMi43NjgtMTEuMDUtMTIuNzY4aC03Ny4wMTR2ODMuNDIxaDc1LjU2NWwxMi4xNTctMTIuOTcgMTEuNDUyIDEyLjk3IDQ2LjU3OC4wNDF2LTE5LjYyNGg0LjU3OWM2LjE4LjA5NiAxMy40NjktLjE1MyAxOS45LTIuOTMzdjIyLjUxNGgzOC40MTl2LTIxLjc0MmgxLjg1M2MyLjM2NSAwIDIuNTk4LjA5NyAyLjU5OCAyLjQ2MXYxOS4yOGgxMTYuNzA5YzcuNDEgMCAxNS4xNTUtMS44OTcgMTkuNDQ0LTUuMzM4djUuMzM4aDM3LjAyYzcuNzA0IDAgMTUuMjI3LTEuMDggMjAuOTUxLTMuODQ1di0xNS41NDF6bS01Ni45OS0yMy44ODRjMi43ODIgMi44NzkgNC4yNzMgNi41MTQgNC4yNzMgMTIuNjY3IDAgMTIuODYyLTguMDM1IDE4Ljg2NS0yMi40NDQgMTguODY1aC0yNy44Mjd2LTEyLjgyaDI3LjcxNWMyLjcxIDAgNC42MzItLjM1OSA1LjgzNi0xLjQ4Ljk4My0uOTI1IDEuNjg3LTIuMjY4IDEuNjg3LTMuOSAwLTEuNzQyLS43NjMtMy4xMjQtMS43NDMtMy45NTQtMS4wOTMtLjkxMi0yLjYtMS4zMjctNS4wODgtMS4zMjctMTMuMzYxLS40NTYtMzAuMDkzLjQxNS0zMC4wOTMtMTguNTA0IDAtOC42NzIgNS40NDgtMTcuOCAyMC40MjYtMTcuOGgyOC42NDJ2MTIuNzI1aC0yNi4yMDhjLTIuNTk4IDAtNC4yODcuMDk3LTUuNzI0IDEuMDgtMS41NjUuOTY4LTIuMTQ1IDIuNDA1LTIuMTQ1IDQuMzAyIDAgMi4yNTUgMS4zMjkgMy43OSAzLjEyNiA0LjQ1MyAxLjUwNy41MjUgMy4xMjYuNjc4IDUuNTYuNjc4bDcuNjkxLjIwN2M3Ljc1Ni4xODkgMTMuMDggMS41MzEgMTYuMzE2IDQuODA4em0tMTI4LjkxOC0zLjY5MmMtMS45MTEgMS4xMzQtNC4yNzUgMS4yMzEtNy4wNTUgMS4yMzFoLTE3LjM1NnYtMTMuNDI4aDE3LjU5MmMyLjU0NCAwIDUuMDg5LjA1NCA2LjgxOCAxLjA4IDEuODUyLjk2OCAyLjk1OCAyLjgyIDIuOTU4IDUuMzc4IDAgMi41NTgtMS4xMDcgNC42MTktMi45NTggNS43Mzh6bTguNjI4IDcuNDRjMy4xOCAxLjE3NCA1Ljc4IDMuMjc4IDYuOTk5IDUuMDE5IDIuMDE3IDIuOTE5IDIuMzA5IDUuNjQzIDIuMzY3IDEwLjkxM3YxMS44NTJoLTE0LjM0M3YtNy40OGMwLTMuNTk3LjM0Ni04LjkyMi0yLjMwOS0xMS43MDItMi4wODgtMi4xNDItNS4yNy0yLjY1NC0xMC40ODItMi42NTRoLTE1LjI2OHYyMS44MzZoLTE0LjM1NnYtNTkuNzg2aDMyLjk4NWM3LjIzMyAwIDEyLjUwMS4zMTkgMTcuMTkgMi44MjEgNC41MDkgMi43MjQgNy4zNDUgNi40NTYgNy4zNDUgMTMuMjc2LS4wMDIgOS41NDItNi4zNjYgMTQuNDEyLTEwLjEyNyAxNS45MDV6bTE4LjA0OC0zMi4wMDJoNDcuNjg0djEyLjM2NGgtMzMuNDU1djEwLjg2OWgzMi42Mzl2MTIuMTk4aC0zMi42Mzl2MTEuODk1bDMzLjQ1NS4wNTR2MTIuNDA1aC00Ny42ODR2LTU5Ljc4NnptLTk2LjM5MyAyNy41OTFoLTE4LjQ2M3YtMTUuMjI1aDE4LjYyOWM1LjE1OCAwIDguNzM4IDIuMTAyIDguNzM4IDcuMzMgMCA1LjE3MS0zLjQxNSA3Ljg5NS04LjkwNCA3Ljg5NXptLTMyLjY5MyAyNi43NThsLTIxLjkzNS0yNC4zNTMgMjEuOTM1LTIzLjU3OXY0Ny45MzJ6bS01Ni42NDctNy4wMjJoLTM1LjEyN3YtMTEuODk1aDMxLjM2NnYtMTIuMTk4aC0zMS4zNjZ2LTEwLjg2OWgzNS44MTlsMTUuNjI3IDE3LjQyMy0xNi4zMTkgMTcuNTR6bTExMy41ODMtMjcuNjNjMCAxNi42MDgtMTIuMzkxIDIwLjAzNy0yNC44NzkgMjAuMDM3aC0xNy44Mjd2MjAuMDUzaC0yNy43NjlsLTE3LjU5Mi0xOS43OTItMTguMjgzIDE5Ljc5MmgtNTYuNTkxdi01OS43ODZoNTcuNDYybDE3LjU3OCAxOS41OTcgMTguMTczLTE5LjU5N2g0NS42NTJjMTEuMzM4IDAgMjQuMDc3IDMuMTM5IDI0LjA3NyAxOS42OTZ6IiBmaWxsPSIjZmZmIi8+PC9zdmc+");
}
.rccs__card--amex .rccs__cvc__front {
opacity: 0.5;
@@ -101,7 +101,7 @@ const Container = styled.div`
background: linear-gradient(25deg, #ccc, #999);
}
.rccs__card--dankort .rccs__issuer {
- background-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjMwOCIgdmlld0JveD0iMCAwIDUxMiAzMDgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPjxkZWZzPjxsaW5lYXJHcmFkaWVudCB4MT0iNTAlIiB5MT0iMCUiIHgyPSI1MCUiIHkyPSIxMDAlIiBpZD0iYSI+PHN0b3Agc3RvcC1jb2xvcj0iI0Y1MDkxQSIgb2Zmc2V0PSIwJSIvPjxzdG9wIHN0b3AtY29sb3I9IiM5RTBDMTciIG9mZnNldD0iMTAwJSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxwYXRoIGQ9Ik0zNTguNDA3IDBoLTIwNC43OTVjLTg0Ljg0MiAwLTE1My42MTIgNjguNzcxLTE1My42MTIgMTUzLjU5MyAwIDg0Ljg1MSA2OC43NyAxNTMuNjA2IDE1My42MTIgMTUzLjYwNmgyMDQuNzk1Yzg0LjgyMiAwIDE1My41OTMtNjguNzU1IDE1My41OTMtMTUzLjYwNiAwLTg0LjgyMS02OC43Ny0xNTMuNTkzLTE1My41OTMtMTUzLjU5MyIgZmlsbD0iI0ZFRkVGRSIvPjxwYXRoIGQ9Ik0zOTUuNTkxIDE0NC40ODZsNjguMzI4IDgxLjI2MWMxNC4xNTEtMjAuNDUxIDIyLjQ2Mi00NS4yNDIgMjIuNDYyLTcxLjk0NSAwLTI4LjE4My05LjI1OS01NC4yNDgtMjQuODg0LTc1LjMxNWwtNjUuOTA2IDY1Ljk5OXptLTI0MS4zOTctMTE3LjM4NmMtMzguNTQ3IDAtNzMuMTIxIDE3LjI5My05Ni4zODMgNDQuNTI4aDE0NC4xNTljNTEuMDI3IDAgODkuNDc0IDEyLjk4MyA5My40MzEgNTUuOTc0bDUzLjcwMi01NS45ODFoMTA2LjkzMWMtMjMuMjYzLTI3LjIyNy01Ny44MzEtNDQuNTItOTYuMzYxLTQ0LjUyaC0yMDUuNDc5em0yOS4yMzYgMjA1LjQ3OWgtMTI4LjQyOWMyMy4yMzMgMjkuMTkzIDU5LjA2MiA0Ny45NDYgOTkuMTk0IDQ3Ljk0NmgyMDUuNDc5YzQwLjExNyAwIDc1LjkzNy0xOC43NDUgOTkuMTcxLTQ3LjkzOWgtMTA5LjI5NWwtNTYuNzk2LTcxLjc3NmMtMTAuNTA2IDQ4LjkzOS00NC44ODEgNzEuNzY5LTEwOS4zMjMgNzEuNzY5ek0xMTguNDQgMTI1Ljk5N2wtMTguMjIyIDUwLjFoNzMuNTE3YzIxLjczMyAwIDI4LjMxLTguOTk4IDMzLjE3My0yNi4zMTkgNC44MTUtMTcuMTMxLTcuMjc3LTIzLjc4LTIyLjEyOS0yMy43OGgtNjYuMzM5eiIgZmlsbD0idXJsKCNhKSIvPjwvc3ZnPg==');
+ background-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjMwOCIgdmlld0JveD0iMCAwIDUxMiAzMDgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPjxkZWZzPjxsaW5lYXJHcmFkaWVudCB4MT0iNTAlIiB5MT0iMCUiIHgyPSI1MCUiIHkyPSIxMDAlIiBpZD0iYSI+PHN0b3Agc3RvcC1jb2xvcj0iI0Y1MDkxQSIgb2Zmc2V0PSIwJSIvPjxzdG9wIHN0b3AtY29sb3I9IiM5RTBDMTciIG9mZnNldD0iMTAwJSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxwYXRoIGQ9Ik0zNTguNDA3IDBoLTIwNC43OTVjLTg0Ljg0MiAwLTE1My42MTIgNjguNzcxLTE1My42MTIgMTUzLjU5MyAwIDg0Ljg1MSA2OC43NyAxNTMuNjA2IDE1My42MTIgMTUzLjYwNmgyMDQuNzk1Yzg0LjgyMiAwIDE1My41OTMtNjguNzU1IDE1My41OTMtMTUzLjYwNiAwLTg0LjgyMS02OC43Ny0xNTMuNTkzLTE1My41OTMtMTUzLjU5MyIgZmlsbD0iI0ZFRkVGRSIvPjxwYXRoIGQ9Ik0zOTUuNTkxIDE0NC40ODZsNjguMzI4IDgxLjI2MWMxNC4xNTEtMjAuNDUxIDIyLjQ2Mi00NS4yNDIgMjIuNDYyLTcxLjk0NSAwLTI4LjE4My05LjI1OS01NC4yNDgtMjQuODg0LTc1LjMxNWwtNjUuOTA2IDY1Ljk5OXptLTI0MS4zOTctMTE3LjM4NmMtMzguNTQ3IDAtNzMuMTIxIDE3LjI5My05Ni4zODMgNDQuNTI4aDE0NC4xNTljNTEuMDI3IDAgODkuNDc0IDEyLjk4MyA5My40MzEgNTUuOTc0bDUzLjcwMi01NS45ODFoMTA2LjkzMWMtMjMuMjYzLTI3LjIyNy01Ny44MzEtNDQuNTItOTYuMzYxLTQ0LjUyaC0yMDUuNDc5em0yOS4yMzYgMjA1LjQ3OWgtMTI4LjQyOWMyMy4yMzMgMjkuMTkzIDU5LjA2MiA0Ny45NDYgOTkuMTk0IDQ3Ljk0NmgyMDUuNDc5YzQwLjExNyAwIDc1LjkzNy0xOC43NDUgOTkuMTcxLTQ3LjkzOWgtMTA5LjI5NWwtNTYuNzk2LTcxLjc3NmMtMTAuNTA2IDQ4LjkzOS00NC44ODEgNzEuNzY5LTEwOS4zMjMgNzEuNzY5ek0xMTguNDQgMTI1Ljk5N2wtMTguMjIyIDUwLjFoNzMuNTE3YzIxLjczMyAwIDI4LjMxLTguOTk4IDMzLjE3My0yNi4zMTkgNC44MTUtMTcuMTMxLTcuMjc3LTIzLjc4LTIyLjEyOS0yMy43OGgtNjYuMzM5eiIgZmlsbD0idXJsKCNhKSIvPjwvc3ZnPg==");
}
.rccs__card--dinersclub > div {
color: #555;
@@ -110,7 +110,7 @@ const Container = styled.div`
background: linear-gradient(25deg, #fff, #eee);
}
.rccs__card--dinersclub .rccs__issuer {
- background-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjEzNCIgdmlld0JveD0iMCAwIDUxMiAxMzQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPjxwYXRoIGQ9Ik05OS4yODUgMTMzLjg2YzM2LjQ0Ni4xNzcgNjkuNzE1LTI5LjY1OSA2OS43MTUtNjUuOTU1IDAtMzkuNjg5LTMzLjI2OS02Ny4xMjItNjkuNzE1LTY3LjExMWgtMzEuMzY1Yy0zNi44ODItLjAxMS02Ny4yNDEgMjcuNDI5LTY3LjI0MSA2Ny4xMTEgMCAzNi4zMDUgMzAuMzU4IDY2LjEzMyA2Ny4yNDEgNjUuOTU1aDMxLjM2NSIgZmlsbD0iIzAwNjA5NSIvPjxwYXRoIGQ9Ik04MS45MDkgMTAzLjI0N3YtNzIuMDcyYzE0LjUxNyA1LjU1NyAyNC44MjMgMTkuNTgzIDI0Ljg0NyAzNi4wMzMtLjAyNCAxNi40NTQtMTAuMzMgMzAuNDcxLTI0Ljg0NyAzNi4wMzhtLTUyLjUyMi0zNi4wMzhjLjAzMy0xNi40NDEgMTAuMzIyLTMwLjQ1OCAyNC44MzEtMzYuMDMydjcyLjA1NWMtMTQuNTA5LTUuNTY5LTI0Ljc5OC0xOS41NzgtMjQuODMxLTM2LjAyNG0zOC42NzktNjAuOTE1Yy0zMy43MDIuMDExLTYxLjAxMSAyNy4yNzMtNjEuMDIgNjAuOTE1LjAwOCAzMy42MzkgMjcuMzE4IDYwLjg5NSA2MS4wMiA2MC45MDUgMzMuNzEzLS4wMSA2MS4wMjgtMjcuMjY2IDYxLjAzMy02MC45MDUtLjAwNS0zMy42NDItMjcuMzE5LTYwLjkwNC02MS4wMzMtNjAuOTE1IiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTE5MC4zNzMgMjkuNDIxYzAtNi4yOTQtMy4yOTEtNS44ODEtNi40NDQtNS45NDd2LTEuODE5YzIuNzMzLjEzMyA1LjUzNi4xMzMgOC4yNzUuMTMzIDIuOTQzIDAgNi45NDEtLjEzMyAxMi4xMzMtLjEzMyAxOC4xNTcgMCAyOC4wNDIgMTIuMTAzIDI4LjA0MiAyNC40OTYgMCA2LjkyOS00LjA2MyAyNC4zNTMtMjguODg4IDI0LjM1My0zLjU3MyAwLTYuODc0LS4xMzgtMTAuMTY3LS4xMzgtMy4xNTMgMC02LjI0Mi4wNjctOS4zOTUuMTM4di0xLjgyYzQuMjAzLS40MjEgNi4yNDItLjU2MSA2LjQ0NC01LjMydi0zMy45NDN6bTYuODczIDMyLjgyNWMwIDUuMzg4IDMuODYxIDYuMDE3IDcuMjk0IDYuMDE3IDE1LjE0OSAwIDIwLjEyNC0xMS40MDcgMjAuMTI0LTIxLjgzNiAwLTEzLjA4My04LjQxNS0yMi41My0yMS45NDctMjIuNTMtMi44NzkgMC00LjIwMy4yMDUtNS40NzIuMjh2MzguMDY4em0zNy41OTIgNi40NGgxLjMzMWMxLjk2MSAwIDMuMzY1IDAgMy4zNjUtMi4zMTV2LTE4Ljk2MmMwLTMuMDc3LTEuMDUtMy41MDQtMy42NDgtNC44OTZ2LTEuMTIyYzMuMjk2LS45ODUgNy4yMjYtMi4zMDggNy41MDMtMi41MTguNDkzLS4yOC45MTItLjM1NCAxLjI2NC0uMzU0LjM0NyAwIC40OTIuNDIxLjQ5Mi45ODV2MjYuODY2YzAgMi4zMTUgMS41NDIgMi4zMTUgMy41MDggMi4zMTVoMS4xODl2MS44MmMtMi4zODYgMC00Ljg0Mi0uMTQtNy4zNi0uMTQtMi41MjYgMC01LjA1Mi4wNjgtNy42NDMuMTR2LTEuODJ6bTcuNTAzLTQwLjk0Yy0xLjgyNyAwLTMuNDM2LTEuNjc5LTMuNDM2LTMuNDk5IDAtMS43NTIgMS42ODYtMy4zNjYgMy40MzYtMy4zNjYgMS44MTcgMCAzLjQzNSAxLjQ3NiAzLjQzNSAzLjM2NiAwIDEuODkyLTEuNTQ2IDMuNDk5LTMuNDM1IDMuNDk5em0xNC4xNjIgMjAuMDgyYzAtMi41ODgtLjc3NS0zLjI4NS00LjA2My00LjYxNXYtMS4zM2MzLjAxMS0uOTc4IDUuODg0LTEuODkyIDkuMjU0LTMuMzYzLjIwOCAwIC40MTQuMTQzLjQxNC42OTl2NC41NTFjNC4wMDMtMi44NjYgNy40NDEtNS4yNSAxMi4xNDQtNS4yNSA1Ljk1NiAwIDguMDU4IDQuMzQgOC4wNTggOS44djE4LjA1MmMwIDIuMzE1IDEuNTQxIDIuMzE1IDMuNTA2IDIuMzE1aDEuMjYydjEuODJjLTIuNDU5IDAtNC45MTMtLjE0LTcuNDMxLS4xNC0yLjUyOCAwLTUuMDUzLjA2OC03LjU3Ni4xNHYtMS44MmgxLjI2MWMxLjk2NyAwIDMuMzYzIDAgMy4zNjMtMi4zMTV2LTE4LjEyYzAtMy45OTQtMi40NDMtNS45NDktNi40NDYtNS45NDktMi4yNDMgMC01LjgxOSAxLjgxNy04LjE0MSAzLjM1OHYyMC43MTFjMCAyLjMxNSAxLjU1MiAyLjMxNSAzLjUxNiAyLjMxNWgxLjI2MXYxLjgyYy0yLjQ1NCAwLTQuOTEyLS4xNC03LjQzNi0uMTQtMi41MjEgMC01LjA1LjA2OC03LjU3MS4xNHYtMS44MmgxLjI2NWMxLjk2MiAwIDMuMzYxIDAgMy4zNjEtMi4zMTV2LTE4LjU0NHptMzUuOTA3IDMuMzY1Yy0uMTQ1LjYzMS0uMTQ1IDEuNjc3IDAgNC4wNTkuNDEyIDYuNjQ2IDQuNzAyIDEyLjEwMyAxMC4zMDIgMTIuMTAzIDMuODYzIDAgNi44ODItMi4xIDkuNDctNC42ODZsLjk4Ljk4Yy0zLjIyNiA0LjI3LTcuMjI0IDcuOTA4LTEyLjk2OCA3LjkwOC0xMS4xNTQgMC0xMy4zOTUtMTAuNzgtMTMuMzk1LTE1LjI1NiAwLTEzLjcxOCA5LjI1Mi0xNy43NzkgMTQuMTU3LTE3Ljc3OSA1LjY4NSAwIDExLjc5MSAzLjU2OCAxMS44NTMgMTAuOTg2IDAgLjQyNiAwIC44NC0uMDYyIDEuMjY1bC0uNjM3LjQyMWgtMTkuNzAxem0xMi40MTMtMi4yNDFjMS43NTIgMCAxLjk1Ni0uOTEyIDEuOTU2LTEuNzUxIDAtMy41NjgtMi4xNzEtNi40MzctNi4xMDEtNi40MzctNC4yNzUgMC03LjIxOSAzLjE0Mi04LjA2IDguMTg3aDEyLjIwNXptOS42MDQgMTkuNzM2aDEuODk0YzEuOTU2IDAgMy4zNiAwIDMuMzYtMi4zMTV2LTE5LjY2MWMwLTIuMTY4LTIuNTkxLTIuNTkxLTMuNjQ1LTMuMTV2LTEuMDQ3YzUuMTE5LTIuMTcyIDcuOTI1LTMuOTk0IDguNTY1LTMuOTk0LjQxMiAwIC42Mi4yMS42Mi45MTN2Ni4yOTdoLjE1YzEuNzQ2LTIuNzI5IDQuNjk3LTcuMjEgOC45NzItNy4yMSAxLjc1NCAwIDMuOTk1IDEuMTg4IDMuOTk1IDMuNzA5IDAgMS44OS0xLjMyOSAzLjU3NC0zLjI5MSAzLjU3NC0yLjE4MiAwLTIuMTgyLTEuNjg0LTQuNjMzLTEuNjg0LTEuMTk0IDAtNS4xMTkgMS42MTEtNS4xMTkgNS44MTJ2MTYuNDM5YzAgMi4zMTUgMS4zOTkgMi4zMTUgMy4zNjUgMi4zMTVoMy45MjV2MS44MmMtMy44NTgtLjA3Mi02Ljc5My0uMTQtOS44MTItLjE0LTIuODc0IDAtNS44MjEuMDY4LTguMzQ1LjE0di0xLjgyem0yNi45OTUtNy45MTFjLjkxNCA0LjYxOCAzLjcxNiA4LjU0IDguODM4IDguNTQgNC4xMyAwIDUuNjcyLTIuNTE5IDUuNjcyLTQuOTY3IDAtOC4yNi0xNS4yODEtNS42MDMtMTUuMjgxLTE2Ljg2NyAwLTMuOTIyIDMuMTU5LTguOTYxIDEwLjg2OS04Ljk2MSAyLjI0MSAwIDUuMjU1LjYzMiA3Ljk4OCAyLjAzM2wuNDk1IDcuMTMyaC0xLjYxNGMtLjctNC40MDUtMy4xNTMtNi45MjQtNy42NDMtNi45MjQtMi44MDggMC01LjQ2OSAxLjYwOS01LjQ2OSA0LjYxOCAwIDguMTk0IDE2LjI2OCA1LjY2OSAxNi4yNjggMTYuNjU1IDAgNC42MTgtMy43MTYgOS41MjItMTIuMDYzIDkuNTIyLTIuODA0IDAtNi4xMDEtLjk4Mi04LjU1Mi0yLjM4bC0uNzc0LTguMDQ5IDEuMjY0LS4zNTN6bTgzLjQ0Mi0yNi40NTVoLTEuNzQ5Yy0xLjMzNS04LjE4Mi03LjE1Ni0xMS40NzUtMTUuMDA2LTExLjQ3NS04LjA2OCAwLTE5Ljc4MSA1LjM4Ny0xOS43ODEgMjIuMTgyIDAgMTQuMTQ0IDEwLjEwNSAyNC4yODggMjAuOSAyNC4yODggNi45MzkgMCAxMi42OTUtNC43NTggMTQuMDk5LTEyLjEwOWwxLjYwOS40MTktMS42MDkgMTAuMjE3Yy0yLjk0NiAxLjgyNS0xMC44NzEgMy43MTItMTUuNTAyIDMuNzEyLTE2LjQwMyAwLTI2Ljc3OS0xMC41NjgtMjYuNzc5LTI2LjMxNSAwLTE0LjM0NyAxMi44MjgtMjQuNjM4IDI2LjU3Mi0yNC42MzggNS42NzcgMCAxMS4xNDkgMS44MjUgMTYuNTQ2IDMuNzE2bC43IDEwLjAwM3ptMi41MjkgMzQuMzY2aDEuMzI2YzEuOTY5IDAgMy4zNzMgMCAzLjM3My0yLjMxNXYtMzguOTc0YzAtNC41NTMtMS4wNTItNC42OTMtMy43MTYtNS40NjF2LTEuMTJjMi44MDMtLjkwOSA1Ljc0OS0yLjE2OCA3LjIyMS0zLjAxMi43NjUtLjQxNiAxLjMzMS0uNzcyIDEuNTM3LS43NzIuNDI3IDAgLjU2OC40MjQuNTY4Ljk4NXY0OC4zNTRjMCAyLjMxNSAxLjU0MSAyLjMxNSAzLjUwNiAyLjMxNWgxLjE4NHYxLjgyYy0yLjM3NiAwLTQuODMyLS4xNC03LjM1Ni0uMTQtMi41MjMgMC01LjA0Ny4wNjgtNy42NDMuMTR2LTEuODJ6bTQ1LjAyMi0yLjAzM2MwIDEuMjY1Ljc2OSAxLjMzMSAxLjk1OSAxLjMzMWwyLjgwNi0uMDY3djEuNDczYy0zLjAxOS4yNzgtOC43NjcgMS43NDctMTAuMSAyLjE2N2wtLjM1My0uMjExdi01LjY2NmMtNC4yIDMuNDI4LTcuNDMxIDUuODc3LTEyLjQxNSA1Ljg3Ny0zLjc4MyAwLTcuNzEtMi40NDktNy43MS04LjMyNXYtMTcuOTJjMC0xLjgyLS4yNzgtMy41NzEtNC4yMDItMy45MTl2LTEuMzMxYzIuNTI4LS4wNjggOC4xMjgtLjQ4OCA5LjA0My0uNDg4Ljc3NyAwIC43NzcuNDg4Ljc3NyAyLjAyOHYxOC4wNTJjMCAyLjEwMyAwIDguMTIgNi4wOTYgOC4xMiAyLjM4NCAwIDUuNTM5LTEuODE5IDguNDgtNC4yNjN2LTE4LjgzM2MwLTEuMzk2LTMuMzYzLTIuMTYzLTUuODgyLTIuODY0di0xLjI2YzYuMzA0LS40MjMgMTAuMjM3LS45OCAxMC45MzQtLjk4LjU2NyAwIC41NjcuNDg4LjU2NyAxLjI2MXYyNS44MTh6bTEzLjk1Mi0yMy4wOTJjMi44MDEtMi4zOCA2LjU4OS01LjA0IDEwLjQ0OS01LjA0IDguMTM1IDAgMTMuMDM3IDcuMDc0IDEzLjAzNyAxNC42OTggMCA5LjE2Ny02LjcyOCAxOC4zMzgtMTYuNzYxIDE4LjMzOC01LjE4NCAwLTcuOTE4LTEuNjgyLTkuNzQ0LTIuNDQ5bC0yLjEwMSAxLjYwNi0xLjQ2Ny0uNzY3Yy42Mi00LjEyOS45NzktOC4xODkuOTc5LTEyLjQ1N3YtMzAuMDkxYzAtNC41NTMtMS4wNTctNC42OTMtMy43Mi01LjQ2MXYtMS4xMmMyLjgxMS0uOTA5IDUuNzQ5LTIuMTY4IDcuMjI0LTMuMDEyLjc3LS40MTYgMS4zMjctLjc3MiAxLjU0Ni0uNzcyLjQyIDAgLjU1OS40MjQuNTU5Ljk4NXYyNS41NDN6bTAgMTkuMDMzYzAgMi42NTkgMi41MjMgNy4xNDQgNy4yMjEgNy4xNDQgNy41MDQgMCAxMC42NTctNy4zNTIgMTAuNjU3LTEzLjU4MyAwLTcuNTU2LTUuNzQ0LTEzLjg1Mi0xMS4yMTYtMTMuODUyLTIuNjAxIDAtNC43NyAxLjY4MS02LjY2MyAzLjI5MXYxN3ptLTMwMi41MTggNDguNjAxaC41MzdjMS4zNzEgMCAyLjgyMS0uMTg1IDIuODIxLTIuMTY4di0xOS45NDhjMC0xLjk4Ni0xLjQ0OS0yLjE3NS0yLjgyMS0yLjE3NWgtLjUzN3YtMS4xNDNjMS40ODkgMCAzLjc3OC4xNSA1LjY1My4xNSAxLjkwNSAwIDQuMTkyLS4xNSA1Ljk4NS0uMTV2MS4xNDNoLS41MzZjLTEuMzY4IDAtMi44MjEuMTg5LTIuODIxIDIuMTc1djE5Ljk0OGMwIDEuOTgzIDEuNDUzIDIuMTY4IDIuODIxIDIuMTY4aC41MzZ2MS4xNDhjLTEuODMxIDAtNC4xMjUtLjE1LTYuMDI2LS4xNS0xLjg3MSAwLTQuMTI0LjE1LTUuNjEyLjE1di0xLjE0OHptMzcuODUxLTYuMzU5bC4wNzctLjA3NXYtMTQuMjc3YzAtMy4xMjQtMi4xNzctMy41ODEtMy4zMjEtMy41ODFoLS44NHYtMS4xNDNsNS4zNDIuMTUxIDQuNjk0LS4xNTF2MS4xNDNoLS41NjhjLTEuNjA3IDAtMy40LjMwNi0zLjQgNC44MzZ2MTcuMzNjMCAxLjMzMS4wMzkgMi42NjIuMjI2IDMuODQyaC0xLjQ0OWwtMTkuNjQ3LTIxLjg2djE1LjY5MmMwIDMuMzEzLjY0MyA0LjQ1MiAzLjU4NSA0LjQ1MmguNjQ3djEuMTQ4bC00LjkyLS4xNS01LjE4Ny4xNXYtMS4xNDhoLjUzNGMyLjYzMiAwIDMuNDMxLTEuNzg2IDMuNDMxLTQuODI5di0xNi4wMzljMC0yLjEyOS0xLjc1OS0zLjQyMy0zLjQ2OS0zLjQyM2gtLjQ5N3YtMS4xNDNsNC4zODMuMTUxIDMuMzk5LS4xNTEgMTYuOTgzIDE5LjA3NnptMTEuNjY2LTE3LjE3MmMtMi44NjYgMC0yLjk3NC42ODYtMy41NDcgMy40NjJoLTEuMTQzYy4xNDgtMS4wNjUuMzQyLTIuMTI5LjQ1OC0zLjIzNi4xNTUtMS4wNjguMjI4LTIuMTI5LjIyOC0zLjIzM2guOTE1Yy4zMDggMS4xNDQgMS4yNjEgMS4xMDQgMi4yOTYgMS4xMDRoMTkuNjgxYzEuMDMzIDAgMS45ODQtLjAzNyAyLjA2My0xLjE4MmwuOTEuMTUzYy0uMTQ4IDEuMDI5LS4zMDMgMi4wNTUtLjQxOSAzLjA4NS0uMDcgMS4wMjktLjA3IDIuMDU4LS4wNyAzLjA4M2wtMS4xNDcuNDIzYy0uMDc4LTEuNDA4LS4yNy0zLjY1OS0yLjgyNC0zLjY1OWgtNi4yNTd2MjAuMjU5YzAgMi45MzcgMS4zMzcgMy4yNzIgMy4xNjQgMy4yNzJoLjcyNXYxLjE0OGMtMS40ODcgMC00LjE1OS0uMTUtNi4yMTYtLjE1LTIuMjkgMC00Ljk2Mi4xNS02LjQ1Mi4xNXYtMS4xNDhoLjcyNWMyLjEwNiAwIDMuMTY4LS4xODcgMy4xNjgtMy4xOTJ2LTIwLjMzOWgtNi4yNTl6bTIzLjA4MiAyMy41MzFoLjUzNmMxLjM3MyAwIDIuODI0LS4xODUgMi44MjQtMi4xNjh2LTE5Ljk0OGMwLTEuOTg2LTEuNDUxLTIuMTc1LTIuODI0LTIuMTc1aC0uNTM2di0xLjE0M2MyLjMyMiAwIDYuMjk5LjE1IDkuNDk4LjE1IDMuMjEgMCA3LjE3Mi0uMTUgOS43NjUtLjE1LS4wNjUgMS42MzUtLjAyOCA0LjE1My4wODMgNS44MjdsLTEuMTUuMzA2Yy0uMTg0LTIuNDc0LS42NC00LjQ1NC00LjY1LTQuNDU0aC01LjI5OHY5Ljk3M2g0LjUzNGMyLjI4OCAwIDIuNzg4LTEuMjkxIDMuMDE0LTMuMzUyaDEuMTQyYy0uMDc1IDEuNDg5LS4xMTQgMi45NzMtLjExNCA0LjQ1NSAwIDEuNDUxLjAzOSAyLjg5Ni4xMTQgNC4zNDNsLTEuMTQyLjIyNmMtLjIyNi0yLjI4Mi0uMzQyLTMuNzY4LTIuOTc5LTMuNzY4aC00LjU3djguODcxYzAgMi40NzUgMi4yMDMgMi40NzUgNC42NDYgMi40NzUgNC41ODEgMCA2LjYwMS0uMzA3IDcuNzQ3LTQuNjQybDEuMDY3LjI2MmMtLjQ5OCAyLjAyNC0uOTU0IDQuMDM2LTEuMjkzIDYuMDU4LTIuNDQ2IDAtNi44MzQtLjE1LTEwLjI2My0uMTUtMy40MzggMC03Ljk3OC4xNS0xMC4xNTMuMTV2LTEuMTQ4em0yNi44NTktMjEuNGMwLTIuNzc4LTEuNTI2LTIuODkyLTIuNzEyLTIuODkyaC0uNjg3di0xLjE0NGMxLjIyMSAwIDMuNTg2LjE1MyA1LjkxNS4xNTMgMi4yODcgMCA0LjEyLS4xNTMgNi4xNDEtLjE1MyA0LjgwNCAwIDkuMDgzIDEuMjk0IDkuMDgzIDYuNzA2IDAgMy40MjEtMi4yODggNS41MTctNS4zMDMgNi43MDNsNi41MjIgOS43NDFjMS4wNyAxLjYxMSAxLjgyOSAyLjA2MyAzLjcwMiAyLjI4NHYxLjE0OWwtMy43MzktLjE1LTMuNTg0LjE1Yy0yLjkzOC0zLjg0Ni01LjQ2Mi03Ljk1OC03LjkzOS0xMi4zNDNoLTIuNTEzdjguMTUzYzAgMi45MzUgMS4zNyAzLjA0MSAzLjEyMiAzLjA0MWguNjg5djEuMTQ5bC02LjU2Mi0uMTVjLTEuODM0IDAtMy42MjcuMTUtNS41MzQuMTV2LTEuMTQ5aC42ODdjMS40MTcgMCAyLjcxMi0uNjM5IDIuNzEyLTIuMDV2LTE5LjM0OXptNC44ODYgOC44MzJoMS44NjNjMy44MTkgMCA1Ljg3NC0xLjQ0MyA1Ljg3NC01LjkzOSAwLTMuMzg0LTIuMTczLTUuNTU2LTUuNTcxLTUuNTU2LTEuMTQ3IDAtMS42MzUuMTE3LTIuMTY2LjE1MXYxMS4zNDR6bTQzLjY4IDYuMjA5bC4wNjgtLjA3NXYtMTQuMjc3YzAtMy4xMjQtMi4xNzEtMy41ODEtMy4zMTQtMy41ODFoLS44Mzd2LTEuMTQzbDUuMzQuMTUxIDQuNy0uMTUxdjEuMTQzaC0uNTc3Yy0xLjYwMSAwLTMuMzk2LjMwNi0zLjM5NiA0LjgzNnYxNy4zM2MwIDEuMzMxLjAzNiAyLjY2Mi4yMjUgMy44NDJoLTEuNDQ2bC0xOS42NDktMjEuODZ2MTUuNjkyYzAgMy4zMTMuNjQ3IDQuNDUyIDMuNTg0IDQuNDUyaC42NDh2MS4xNDhsLTQuOTE4LS4xNS01LjE5Mi4xNXYtMS4xNDhoLjUyOWMyLjYzNyAwIDMuNDM4LTEuNzg2IDMuNDM4LTQuODI5di0xNi4wMzljMC0yLjEyOS0xLjc1Ni0zLjQyMy0zLjQ3LTMuNDIzaC0uNDk3di0xLjE0M2w0LjM4OS4xNTEgMy4zOTQtLjE1MSAxNi45OCAxOS4wNzZ6bTEyLjA5MiAyLjA2MWMtLjM4OCAxLjI5Mi0uODQ3IDIuMjg5LS44NDcgMi45NjggMCAxLjE0NCAxLjYwNCAxLjMzIDIuODYgMS4zM2guNDI3djEuMTQ4Yy0xLjUyOS0uMDgzLTMuMDg4LS4xNDgtNC42MjUtLjE0OC0xLjM3MSAwLTIuNzM2LjA2NS00LjExNS4xNDh2LTEuMTQ4aC4yMzFjMS40ODcgMCAyLjc0OS0uODc0IDMuMzEzLTIuNDc3bDYuMTEyLTE3LjQ3MWMuNDktMS40MDkgMS4xODQtMy4zMTQgMS40MTQtNC43MjggMS4yMTUtLjQxMyAyLjc0NC0xLjE3NCAzLjQ2OS0xLjYzMi4xMTctLjA0MS4xODQtLjA4LjMwNS0uMDguMTE0IDAgLjE4NCAwIC4yNy4xMTcuMTE0LjMwNC4yMjEuNjQ3LjM0NS45NTFsNy4wMTkgMTkuOTE4Yy40NTYgMS4zMzEuOTEgMi43MzkgMS40MDQgMy44ODYuNDYzIDEuMDY2IDEuMjY0IDEuNTE2IDIuNTI0IDEuNTE2aC4yMjh2MS4xNDhjLTEuNzE3LS4wODMtMy40MzYtLjE0OC01LjI2NC0uMTQ4LTEuODY4IDAtMy43ODIuMDY1LTUuNzI4LjE0OHYtMS4xNDhoLjQyM2MuODczIDAgMi4zNjYtLjE0OCAyLjM2Ni0xLjEwMiAwLS40OTItLjM0NC0xLjUyLS43Ny0yLjc0MmwtMS40ODQtNC40MTZoLTguNjYxbC0xLjIxNyAzLjk2M3ptNS41NjgtMTYuODcyaC0uMDc4bC0zLjU0OSAxMC43NzhoNy4xM2wtMy41MDMtMTAuNzc4em0xNi40NDQtMi4zNjJjLTIuODYzIDAtMi45NzcuNjg2LTMuNTUgMy40NjJoLTEuMTQ3Yy4xNS0xLjA2NS4zNDQtMi4xMjkuNDYzLTMuMjM2LjE1MS0xLjA2OC4yMjMtMi4xMjkuMjIzLTMuMjMzaC45MmMuMzAzIDEuMTQ0IDEuMjYxIDEuMTA0IDIuMjg3IDEuMTA0aDE5LjY5MWMxLjAyNiAwIDEuOTc5LS4wMzcgMi4wNTctMS4xODJsLjkxNC4xNTNjLS4xNDcgMS4wMjktLjMgMi4wNTUtLjQxNCAzLjA4NS0uMDg1IDEuMDI5LS4wODUgMi4wNTgtLjA4NSAzLjA4M2wtMS4xNDIuNDIzYy0uMDctMS40MDgtLjI2Mi0zLjY1OS0yLjgxOS0zLjY1OWgtNi4yNTl2MjAuMjU5YzAgMi45MzcgMS4zMzkgMy4yNzIgMy4xNjYgMy4yNzJoLjcyNnYxLjE0OGMtMS40ODkgMC00LjE1OC0uMTUtNi4yMi0uMTUtMi4yODUgMC00Ljk2Mi4xNS02LjQ0OS4xNXYtMS4xNDhoLjcyNWMyLjEwMiAwIDMuMTY5LS4xODcgMy4xNjktMy4xOTJ2LTIwLjMzOWgtNi4yNTd6bTIzLjI2NCAyMy41MzFoLjUzNGMxLjM3OCAwIDIuODIxLS4xODUgMi44MjEtMi4xNjh2LTE5Ljk0OGMwLTEuOTg2LTEuNDQzLTIuMTc1LTIuODIxLTIuMTc1aC0uNTM0di0xLjE0M2MxLjQ5MiAwIDMuNzc3LjE1IDUuNjQzLjE1IDEuOTE0IDAgNC4yMDItLjE1IDUuOTk4LS4xNXYxLjE0M2gtLjUzNGMtMS4zNzYgMC0yLjgyOS4xODktMi44MjkgMi4xNzV2MTkuOTQ4YzAgMS45ODMgMS40NTMgMi4xNjggMi44MjkgMi4xNjhoLjUzNHYxLjE0OGMtMS44MzQgMC00LjEyNC0uMTUtNi4wMjktLjE1LTEuODczIDAtNC4xMi4xNS01LjYxMi4xNXYtMS4xNDh6bTI2Ljg1Ny0yNi4wMDNjOC4xMzUgMCAxNC42MTYgNS4wMjkgMTQuNjE2IDEzLjE0IDAgOC43NTktNi4yOTYgMTQuNTgxLTE0LjQxOSAxNC41ODEtOC4wOTYgMC0xNC4yNzMtNS40ODItMTQuMjczLTEzLjY3IDAtNy45MTkgNi4xNDEtMTQuMDUyIDE0LjA3Ni0xNC4wNTJ6bS41NzcgMjYuMDQ1YzcuNDA0IDAgOC42OTItNi41MTYgOC42OTItMTIuMDY3IDAtNS41NjktMy4wMDUtMTIuMzA2LTkuMzQyLTEyLjMwNi02LjY3OSAwLTguNjYxIDUuOTQyLTguNjYxIDExLjA0IDAgNi44MTcgMy4xMjggMTMuMzMzIDkuMzExIDEzLjMzM3ptMzkuNzUtNi40MDFsLjA3OC0uMDc1di0xNC4yNzdjMC0zLjEyNC0yLjE4MS0zLjU4MS0zLjMyNi0zLjU4MWgtLjgyN3YtMS4xNDNsNS4zMy4xNTEgNC43MDItLjE1MXYxLjE0M2gtLjU3N2MtMS41OTkgMC0zLjM5Ni4zMDYtMy4zOTYgNC44MzZ2MTcuMzNjMCAxLjMzMS4wMzYgMi42NjIuMjMgMy44NDJoLTEuNDQ4bC0xOS42NTQtMjEuODZ2MTUuNjkyYzAgMy4zMTMuNjUgNC40NTIgMy41ODQgNC40NTJoLjY1MXYxLjE0OGwtNC45Mi0uMTUtNS4xOTUuMTV2LTEuMTQ4aC41MzljMi42MzcgMCAzLjQzLTEuNzg2IDMuNDMtNC44Mjl2LTE2LjAzOWMwLTIuMTI5LTEuNzQ2LTMuNDIzLTMuNDctMy40MjNoLS40OTh2LTEuMTQzbDQuMzg5LjE1MSAzLjM5Ni0uMTUxIDE2Ljk4MSAxOS4wNzZ6bTEyLjA4NyAyLjA2MWMtLjM3NSAxLjI5Mi0uODM3IDIuMjg5LS44MzcgMi45NjggMCAxLjE0NCAxLjYwNyAxLjMzIDIuODU4IDEuMzNoLjQyN3YxLjE0OGMtMS41MjgtLjA4My0zLjA5NC0uMTQ4LTQuNjItLjE0OC0xLjM3OCAwLTIuNzQ2LjA2NS00LjExNC4xNDh2LTEuMTQ4aC4yMTdjMS40OTMgMCAyLjc1Ny0uODc0IDMuMzIxLTIuNDc3bDYuMTE0LTE3LjQ3MWMuNDkzLTEuNDA5IDEuMTg0LTMuMzE0IDEuNDA1LTQuNzI4IDEuMjIzLS40MTMgMi43NDctMS4xNzQgMy40NzktMS42MzIuMTA5LS4wNDEuMTg2LS4wOC4zMDEtLjA4LjExNCAwIC4xODcgMCAuMjY0LjExN2wuMzQ5Ljk1MSA3LjAxNiAxOS45MThjLjQ1OCAxLjMzMS45MTQgMi43MzkgMS40MTUgMy44ODYuNDU4IDEuMDY2IDEuMjYyIDEuNTE2IDIuNTE4IDEuNTE2aC4yMzN2MS4xNDhjLTEuNzItLjA4My0zLjQzOC0uMTQ4LTUuMjcyLS4xNDgtMS44NjUgMC0zLjc3Ny4wNjUtNS43MjMuMTQ4di0xLjE0OGguNDIyYy44NzEgMCAyLjM3LS4xNDggMi4zNy0xLjEwMiAwLS40OTItLjM0Ny0xLjUyLS43NzItMi43NDJsLTEuNDgyLTQuNDE2aC04LjY2MmwtMS4yMjUgMy45NjN6bTUuNTc2LTE2Ljg3MmgtLjA3N2wtMy41NTQgMTAuNzc4aDcuMTQxbC0zLjUxMS0xMC43Nzh6bTI0LjM4MSAxOC41ODNjMCAxLjUyNiAxLjA2IDEuOTggMi4yODIgMi4xMzYgMS41NjUuMTE1IDMuMjgyLjExNSA1LjA0Mi0uMDc4IDEuNTk5LS4xOTIgMi45NzItMS4xMDQgMy42NTgtMi4wNTguNjA5LS44MzkuOTUxLTEuOTAzIDEuMTg0LTIuNzQyaDEuMTA2Yy0uNDE5IDIuMTctLjk1NCA0LjMwNy0xLjQxNSA2LjQ3NmwtMTAuMDY2LS4xNDgtMTAuMDc0LjE0OHYtMS4xNDhoLjUyNmMxLjM3OSAwIDIuODcxLS4xODUgMi44NzEtMi41NDl2LTE5LjU3YzAtMS45ODUtMS40OTItMi4xNzMtMi44NzEtMi4xNzNoLS41MjZ2LTEuMTQzbDYuMDI0LjE1MSA1LjgwNC0uMTUxdjEuMTQzaC0uOTU5Yy0xLjQ0NiAwLTIuNTg1LjA0Mi0yLjU4NSAyLjA1NnYxOS42NDl6IiBmaWxsPSIjMUExOTE4Ii8+PC9zdmc+');
+ background-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjEzNCIgdmlld0JveD0iMCAwIDUxMiAxMzQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPjxwYXRoIGQ9Ik05OS4yODUgMTMzLjg2YzM2LjQ0Ni4xNzcgNjkuNzE1LTI5LjY1OSA2OS43MTUtNjUuOTU1IDAtMzkuNjg5LTMzLjI2OS02Ny4xMjItNjkuNzE1LTY3LjExMWgtMzEuMzY1Yy0zNi44ODItLjAxMS02Ny4yNDEgMjcuNDI5LTY3LjI0MSA2Ny4xMTEgMCAzNi4zMDUgMzAuMzU4IDY2LjEzMyA2Ny4yNDEgNjUuOTU1aDMxLjM2NSIgZmlsbD0iIzAwNjA5NSIvPjxwYXRoIGQ9Ik04MS45MDkgMTAzLjI0N3YtNzIuMDcyYzE0LjUxNyA1LjU1NyAyNC44MjMgMTkuNTgzIDI0Ljg0NyAzNi4wMzMtLjAyNCAxNi40NTQtMTAuMzMgMzAuNDcxLTI0Ljg0NyAzNi4wMzhtLTUyLjUyMi0zNi4wMzhjLjAzMy0xNi40NDEgMTAuMzIyLTMwLjQ1OCAyNC44MzEtMzYuMDMydjcyLjA1NWMtMTQuNTA5LTUuNTY5LTI0Ljc5OC0xOS41NzgtMjQuODMxLTM2LjAyNG0zOC42NzktNjAuOTE1Yy0zMy43MDIuMDExLTYxLjAxMSAyNy4yNzMtNjEuMDIgNjAuOTE1LjAwOCAzMy42MzkgMjcuMzE4IDYwLjg5NSA2MS4wMiA2MC45MDUgMzMuNzEzLS4wMSA2MS4wMjgtMjcuMjY2IDYxLjAzMy02MC45MDUtLjAwNS0zMy42NDItMjcuMzE5LTYwLjkwNC02MS4wMzMtNjAuOTE1IiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTE5MC4zNzMgMjkuNDIxYzAtNi4yOTQtMy4yOTEtNS44ODEtNi40NDQtNS45NDd2LTEuODE5YzIuNzMzLjEzMyA1LjUzNi4xMzMgOC4yNzUuMTMzIDIuOTQzIDAgNi45NDEtLjEzMyAxMi4xMzMtLjEzMyAxOC4xNTcgMCAyOC4wNDIgMTIuMTAzIDI4LjA0MiAyNC40OTYgMCA2LjkyOS00LjA2MyAyNC4zNTMtMjguODg4IDI0LjM1My0zLjU3MyAwLTYuODc0LS4xMzgtMTAuMTY3LS4xMzgtMy4xNTMgMC02LjI0Mi4wNjctOS4zOTUuMTM4di0xLjgyYzQuMjAzLS40MjEgNi4yNDItLjU2MSA2LjQ0NC01LjMydi0zMy45NDN6bTYuODczIDMyLjgyNWMwIDUuMzg4IDMuODYxIDYuMDE3IDcuMjk0IDYuMDE3IDE1LjE0OSAwIDIwLjEyNC0xMS40MDcgMjAuMTI0LTIxLjgzNiAwLTEzLjA4My04LjQxNS0yMi41My0yMS45NDctMjIuNTMtMi44NzkgMC00LjIwMy4yMDUtNS40NzIuMjh2MzguMDY4em0zNy41OTIgNi40NGgxLjMzMWMxLjk2MSAwIDMuMzY1IDAgMy4zNjUtMi4zMTV2LTE4Ljk2MmMwLTMuMDc3LTEuMDUtMy41MDQtMy42NDgtNC44OTZ2LTEuMTIyYzMuMjk2LS45ODUgNy4yMjYtMi4zMDggNy41MDMtMi41MTguNDkzLS4yOC45MTItLjM1NCAxLjI2NC0uMzU0LjM0NyAwIC40OTIuNDIxLjQ5Mi45ODV2MjYuODY2YzAgMi4zMTUgMS41NDIgMi4zMTUgMy41MDggMi4zMTVoMS4xODl2MS44MmMtMi4zODYgMC00Ljg0Mi0uMTQtNy4zNi0uMTQtMi41MjYgMC01LjA1Mi4wNjgtNy42NDMuMTR2LTEuODJ6bTcuNTAzLTQwLjk0Yy0xLjgyNyAwLTMuNDM2LTEuNjc5LTMuNDM2LTMuNDk5IDAtMS43NTIgMS42ODYtMy4zNjYgMy40MzYtMy4zNjYgMS44MTcgMCAzLjQzNSAxLjQ3NiAzLjQzNSAzLjM2NiAwIDEuODkyLTEuNTQ2IDMuNDk5LTMuNDM1IDMuNDk5em0xNC4xNjIgMjAuMDgyYzAtMi41ODgtLjc3NS0zLjI4NS00LjA2My00LjYxNXYtMS4zM2MzLjAxMS0uOTc4IDUuODg0LTEuODkyIDkuMjU0LTMuMzYzLjIwOCAwIC40MTQuMTQzLjQxNC42OTl2NC41NTFjNC4wMDMtMi44NjYgNy40NDEtNS4yNSAxMi4xNDQtNS4yNSA1Ljk1NiAwIDguMDU4IDQuMzQgOC4wNTggOS44djE4LjA1MmMwIDIuMzE1IDEuNTQxIDIuMzE1IDMuNTA2IDIuMzE1aDEuMjYydjEuODJjLTIuNDU5IDAtNC45MTMtLjE0LTcuNDMxLS4xNC0yLjUyOCAwLTUuMDUzLjA2OC03LjU3Ni4xNHYtMS44MmgxLjI2MWMxLjk2NyAwIDMuMzYzIDAgMy4zNjMtMi4zMTV2LTE4LjEyYzAtMy45OTQtMi40NDMtNS45NDktNi40NDYtNS45NDktMi4yNDMgMC01LjgxOSAxLjgxNy04LjE0MSAzLjM1OHYyMC43MTFjMCAyLjMxNSAxLjU1MiAyLjMxNSAzLjUxNiAyLjMxNWgxLjI2MXYxLjgyYy0yLjQ1NCAwLTQuOTEyLS4xNC03LjQzNi0uMTQtMi41MjEgMC01LjA1LjA2OC03LjU3MS4xNHYtMS44MmgxLjI2NWMxLjk2MiAwIDMuMzYxIDAgMy4zNjEtMi4zMTV2LTE4LjU0NHptMzUuOTA3IDMuMzY1Yy0uMTQ1LjYzMS0uMTQ1IDEuNjc3IDAgNC4wNTkuNDEyIDYuNjQ2IDQuNzAyIDEyLjEwMyAxMC4zMDIgMTIuMTAzIDMuODYzIDAgNi44ODItMi4xIDkuNDctNC42ODZsLjk4Ljk4Yy0zLjIyNiA0LjI3LTcuMjI0IDcuOTA4LTEyLjk2OCA3LjkwOC0xMS4xNTQgMC0xMy4zOTUtMTAuNzgtMTMuMzk1LTE1LjI1NiAwLTEzLjcxOCA5LjI1Mi0xNy43NzkgMTQuMTU3LTE3Ljc3OSA1LjY4NSAwIDExLjc5MSAzLjU2OCAxMS44NTMgMTAuOTg2IDAgLjQyNiAwIC44NC0uMDYyIDEuMjY1bC0uNjM3LjQyMWgtMTkuNzAxem0xMi40MTMtMi4yNDFjMS43NTIgMCAxLjk1Ni0uOTEyIDEuOTU2LTEuNzUxIDAtMy41NjgtMi4xNzEtNi40MzctNi4xMDEtNi40MzctNC4yNzUgMC03LjIxOSAzLjE0Mi04LjA2IDguMTg3aDEyLjIwNXptOS42MDQgMTkuNzM2aDEuODk0YzEuOTU2IDAgMy4zNiAwIDMuMzYtMi4zMTV2LTE5LjY2MWMwLTIuMTY4LTIuNTkxLTIuNTkxLTMuNjQ1LTMuMTV2LTEuMDQ3YzUuMTE5LTIuMTcyIDcuOTI1LTMuOTk0IDguNTY1LTMuOTk0LjQxMiAwIC42Mi4yMS42Mi45MTN2Ni4yOTdoLjE1YzEuNzQ2LTIuNzI5IDQuNjk3LTcuMjEgOC45NzItNy4yMSAxLjc1NCAwIDMuOTk1IDEuMTg4IDMuOTk1IDMuNzA5IDAgMS44OS0xLjMyOSAzLjU3NC0zLjI5MSAzLjU3NC0yLjE4MiAwLTIuMTgyLTEuNjg0LTQuNjMzLTEuNjg0LTEuMTk0IDAtNS4xMTkgMS42MTEtNS4xMTkgNS44MTJ2MTYuNDM5YzAgMi4zMTUgMS4zOTkgMi4zMTUgMy4zNjUgMi4zMTVoMy45MjV2MS44MmMtMy44NTgtLjA3Mi02Ljc5My0uMTQtOS44MTItLjE0LTIuODc0IDAtNS44MjEuMDY4LTguMzQ1LjE0di0xLjgyem0yNi45OTUtNy45MTFjLjkxNCA0LjYxOCAzLjcxNiA4LjU0IDguODM4IDguNTQgNC4xMyAwIDUuNjcyLTIuNTE5IDUuNjcyLTQuOTY3IDAtOC4yNi0xNS4yODEtNS42MDMtMTUuMjgxLTE2Ljg2NyAwLTMuOTIyIDMuMTU5LTguOTYxIDEwLjg2OS04Ljk2MSAyLjI0MSAwIDUuMjU1LjYzMiA3Ljk4OCAyLjAzM2wuNDk1IDcuMTMyaC0xLjYxNGMtLjctNC40MDUtMy4xNTMtNi45MjQtNy42NDMtNi45MjQtMi44MDggMC01LjQ2OSAxLjYwOS01LjQ2OSA0LjYxOCAwIDguMTk0IDE2LjI2OCA1LjY2OSAxNi4yNjggMTYuNjU1IDAgNC42MTgtMy43MTYgOS41MjItMTIuMDYzIDkuNTIyLTIuODA0IDAtNi4xMDEtLjk4Mi04LjU1Mi0yLjM4bC0uNzc0LTguMDQ5IDEuMjY0LS4zNTN6bTgzLjQ0Mi0yNi40NTVoLTEuNzQ5Yy0xLjMzNS04LjE4Mi03LjE1Ni0xMS40NzUtMTUuMDA2LTExLjQ3NS04LjA2OCAwLTE5Ljc4MSA1LjM4Ny0xOS43ODEgMjIuMTgyIDAgMTQuMTQ0IDEwLjEwNSAyNC4yODggMjAuOSAyNC4yODggNi45MzkgMCAxMi42OTUtNC43NTggMTQuMDk5LTEyLjEwOWwxLjYwOS40MTktMS42MDkgMTAuMjE3Yy0yLjk0NiAxLjgyNS0xMC44NzEgMy43MTItMTUuNTAyIDMuNzEyLTE2LjQwMyAwLTI2Ljc3OS0xMC41NjgtMjYuNzc5LTI2LjMxNSAwLTE0LjM0NyAxMi44MjgtMjQuNjM4IDI2LjU3Mi0yNC42MzggNS42NzcgMCAxMS4xNDkgMS44MjUgMTYuNTQ2IDMuNzE2bC43IDEwLjAwM3ptMi41MjkgMzQuMzY2aDEuMzI2YzEuOTY5IDAgMy4zNzMgMCAzLjM3My0yLjMxNXYtMzguOTc0YzAtNC41NTMtMS4wNTItNC42OTMtMy43MTYtNS40NjF2LTEuMTJjMi44MDMtLjkwOSA1Ljc0OS0yLjE2OCA3LjIyMS0zLjAxMi43NjUtLjQxNiAxLjMzMS0uNzcyIDEuNTM3LS43NzIuNDI3IDAgLjU2OC40MjQuNTY4Ljk4NXY0OC4zNTRjMCAyLjMxNSAxLjU0MSAyLjMxNSAzLjUwNiAyLjMxNWgxLjE4NHYxLjgyYy0yLjM3NiAwLTQuODMyLS4xNC03LjM1Ni0uMTQtMi41MjMgMC01LjA0Ny4wNjgtNy42NDMuMTR2LTEuODJ6bTQ1LjAyMi0yLjAzM2MwIDEuMjY1Ljc2OSAxLjMzMSAxLjk1OSAxLjMzMWwyLjgwNi0uMDY3djEuNDczYy0zLjAxOS4yNzgtOC43NjcgMS43NDctMTAuMSAyLjE2N2wtLjM1My0uMjExdi01LjY2NmMtNC4yIDMuNDI4LTcuNDMxIDUuODc3LTEyLjQxNSA1Ljg3Ny0zLjc4MyAwLTcuNzEtMi40NDktNy43MS04LjMyNXYtMTcuOTJjMC0xLjgyLS4yNzgtMy41NzEtNC4yMDItMy45MTl2LTEuMzMxYzIuNTI4LS4wNjggOC4xMjgtLjQ4OCA5LjA0My0uNDg4Ljc3NyAwIC43NzcuNDg4Ljc3NyAyLjAyOHYxOC4wNTJjMCAyLjEwMyAwIDguMTIgNi4wOTYgOC4xMiAyLjM4NCAwIDUuNTM5LTEuODE5IDguNDgtNC4yNjN2LTE4LjgzM2MwLTEuMzk2LTMuMzYzLTIuMTYzLTUuODgyLTIuODY0di0xLjI2YzYuMzA0LS40MjMgMTAuMjM3LS45OCAxMC45MzQtLjk4LjU2NyAwIC41NjcuNDg4LjU2NyAxLjI2MXYyNS44MTh6bTEzLjk1Mi0yMy4wOTJjMi44MDEtMi4zOCA2LjU4OS01LjA0IDEwLjQ0OS01LjA0IDguMTM1IDAgMTMuMDM3IDcuMDc0IDEzLjAzNyAxNC42OTggMCA5LjE2Ny02LjcyOCAxOC4zMzgtMTYuNzYxIDE4LjMzOC01LjE4NCAwLTcuOTE4LTEuNjgyLTkuNzQ0LTIuNDQ5bC0yLjEwMSAxLjYwNi0xLjQ2Ny0uNzY3Yy42Mi00LjEyOS45NzktOC4xODkuOTc5LTEyLjQ1N3YtMzAuMDkxYzAtNC41NTMtMS4wNTctNC42OTMtMy43Mi01LjQ2MXYtMS4xMmMyLjgxMS0uOTA5IDUuNzQ5LTIuMTY4IDcuMjI0LTMuMDEyLjc3LS40MTYgMS4zMjctLjc3MiAxLjU0Ni0uNzcyLjQyIDAgLjU1OS40MjQuNTU5Ljk4NXYyNS41NDN6bTAgMTkuMDMzYzAgMi42NTkgMi41MjMgNy4xNDQgNy4yMjEgNy4xNDQgNy41MDQgMCAxMC42NTctNy4zNTIgMTAuNjU3LTEzLjU4MyAwLTcuNTU2LTUuNzQ0LTEzLjg1Mi0xMS4yMTYtMTMuODUyLTIuNjAxIDAtNC43NyAxLjY4MS02LjY2MyAzLjI5MXYxN3ptLTMwMi41MTggNDguNjAxaC41MzdjMS4zNzEgMCAyLjgyMS0uMTg1IDIuODIxLTIuMTY4di0xOS45NDhjMC0xLjk4Ni0xLjQ0OS0yLjE3NS0yLjgyMS0yLjE3NWgtLjUzN3YtMS4xNDNjMS40ODkgMCAzLjc3OC4xNSA1LjY1My4xNSAxLjkwNSAwIDQuMTkyLS4xNSA1Ljk4NS0uMTV2MS4xNDNoLS41MzZjLTEuMzY4IDAtMi44MjEuMTg5LTIuODIxIDIuMTc1djE5Ljk0OGMwIDEuOTgzIDEuNDUzIDIuMTY4IDIuODIxIDIuMTY4aC41MzZ2MS4xNDhjLTEuODMxIDAtNC4xMjUtLjE1LTYuMDI2LS4xNS0xLjg3MSAwLTQuMTI0LjE1LTUuNjEyLjE1di0xLjE0OHptMzcuODUxLTYuMzU5bC4wNzctLjA3NXYtMTQuMjc3YzAtMy4xMjQtMi4xNzctMy41ODEtMy4zMjEtMy41ODFoLS44NHYtMS4xNDNsNS4zNDIuMTUxIDQuNjk0LS4xNTF2MS4xNDNoLS41NjhjLTEuNjA3IDAtMy40LjMwNi0zLjQgNC44MzZ2MTcuMzNjMCAxLjMzMS4wMzkgMi42NjIuMjI2IDMuODQyaC0xLjQ0OWwtMTkuNjQ3LTIxLjg2djE1LjY5MmMwIDMuMzEzLjY0MyA0LjQ1MiAzLjU4NSA0LjQ1MmguNjQ3djEuMTQ4bC00LjkyLS4xNS01LjE4Ny4xNXYtMS4xNDhoLjUzNGMyLjYzMiAwIDMuNDMxLTEuNzg2IDMuNDMxLTQuODI5di0xNi4wMzljMC0yLjEyOS0xLjc1OS0zLjQyMy0zLjQ2OS0zLjQyM2gtLjQ5N3YtMS4xNDNsNC4zODMuMTUxIDMuMzk5LS4xNTEgMTYuOTgzIDE5LjA3NnptMTEuNjY2LTE3LjE3MmMtMi44NjYgMC0yLjk3NC42ODYtMy41NDcgMy40NjJoLTEuMTQzYy4xNDgtMS4wNjUuMzQyLTIuMTI5LjQ1OC0zLjIzNi4xNTUtMS4wNjguMjI4LTIuMTI5LjIyOC0zLjIzM2guOTE1Yy4zMDggMS4xNDQgMS4yNjEgMS4xMDQgMi4yOTYgMS4xMDRoMTkuNjgxYzEuMDMzIDAgMS45ODQtLjAzNyAyLjA2My0xLjE4MmwuOTEuMTUzYy0uMTQ4IDEuMDI5LS4zMDMgMi4wNTUtLjQxOSAzLjA4NS0uMDcgMS4wMjktLjA3IDIuMDU4LS4wNyAzLjA4M2wtMS4xNDcuNDIzYy0uMDc4LTEuNDA4LS4yNy0zLjY1OS0yLjgyNC0zLjY1OWgtNi4yNTd2MjAuMjU5YzAgMi45MzcgMS4zMzcgMy4yNzIgMy4xNjQgMy4yNzJoLjcyNXYxLjE0OGMtMS40ODcgMC00LjE1OS0uMTUtNi4yMTYtLjE1LTIuMjkgMC00Ljk2Mi4xNS02LjQ1Mi4xNXYtMS4xNDhoLjcyNWMyLjEwNiAwIDMuMTY4LS4xODcgMy4xNjgtMy4xOTJ2LTIwLjMzOWgtNi4yNTl6bTIzLjA4MiAyMy41MzFoLjUzNmMxLjM3MyAwIDIuODI0LS4xODUgMi44MjQtMi4xNjh2LTE5Ljk0OGMwLTEuOTg2LTEuNDUxLTIuMTc1LTIuODI0LTIuMTc1aC0uNTM2di0xLjE0M2MyLjMyMiAwIDYuMjk5LjE1IDkuNDk4LjE1IDMuMjEgMCA3LjE3Mi0uMTUgOS43NjUtLjE1LS4wNjUgMS42MzUtLjAyOCA0LjE1My4wODMgNS44MjdsLTEuMTUuMzA2Yy0uMTg0LTIuNDc0LS42NC00LjQ1NC00LjY1LTQuNDU0aC01LjI5OHY5Ljk3M2g0LjUzNGMyLjI4OCAwIDIuNzg4LTEuMjkxIDMuMDE0LTMuMzUyaDEuMTQyYy0uMDc1IDEuNDg5LS4xMTQgMi45NzMtLjExNCA0LjQ1NSAwIDEuNDUxLjAzOSAyLjg5Ni4xMTQgNC4zNDNsLTEuMTQyLjIyNmMtLjIyNi0yLjI4Mi0uMzQyLTMuNzY4LTIuOTc5LTMuNzY4aC00LjU3djguODcxYzAgMi40NzUgMi4yMDMgMi40NzUgNC42NDYgMi40NzUgNC41ODEgMCA2LjYwMS0uMzA3IDcuNzQ3LTQuNjQybDEuMDY3LjI2MmMtLjQ5OCAyLjAyNC0uOTU0IDQuMDM2LTEuMjkzIDYuMDU4LTIuNDQ2IDAtNi44MzQtLjE1LTEwLjI2My0uMTUtMy40MzggMC03Ljk3OC4xNS0xMC4xNTMuMTV2LTEuMTQ4em0yNi44NTktMjEuNGMwLTIuNzc4LTEuNTI2LTIuODkyLTIuNzEyLTIuODkyaC0uNjg3di0xLjE0NGMxLjIyMSAwIDMuNTg2LjE1MyA1LjkxNS4xNTMgMi4yODcgMCA0LjEyLS4xNTMgNi4xNDEtLjE1MyA0LjgwNCAwIDkuMDgzIDEuMjk0IDkuMDgzIDYuNzA2IDAgMy40MjEtMi4yODggNS41MTctNS4zMDMgNi43MDNsNi41MjIgOS43NDFjMS4wNyAxLjYxMSAxLjgyOSAyLjA2MyAzLjcwMiAyLjI4NHYxLjE0OWwtMy43MzktLjE1LTMuNTg0LjE1Yy0yLjkzOC0zLjg0Ni01LjQ2Mi03Ljk1OC03LjkzOS0xMi4zNDNoLTIuNTEzdjguMTUzYzAgMi45MzUgMS4zNyAzLjA0MSAzLjEyMiAzLjA0MWguNjg5djEuMTQ5bC02LjU2Mi0uMTVjLTEuODM0IDAtMy42MjcuMTUtNS41MzQuMTV2LTEuMTQ5aC42ODdjMS40MTcgMCAyLjcxMi0uNjM5IDIuNzEyLTIuMDV2LTE5LjM0OXptNC44ODYgOC44MzJoMS44NjNjMy44MTkgMCA1Ljg3NC0xLjQ0MyA1Ljg3NC01LjkzOSAwLTMuMzg0LTIuMTczLTUuNTU2LTUuNTcxLTUuNTU2LTEuMTQ3IDAtMS42MzUuMTE3LTIuMTY2LjE1MXYxMS4zNDR6bTQzLjY4IDYuMjA5bC4wNjgtLjA3NXYtMTQuMjc3YzAtMy4xMjQtMi4xNzEtMy41ODEtMy4zMTQtMy41ODFoLS44Mzd2LTEuMTQzbDUuMzQuMTUxIDQuNy0uMTUxdjEuMTQzaC0uNTc3Yy0xLjYwMSAwLTMuMzk2LjMwNi0zLjM5NiA0LjgzNnYxNy4zM2MwIDEuMzMxLjAzNiAyLjY2Mi4yMjUgMy44NDJoLTEuNDQ2bC0xOS42NDktMjEuODZ2MTUuNjkyYzAgMy4zMTMuNjQ3IDQuNDUyIDMuNTg0IDQuNDUyaC42NDh2MS4xNDhsLTQuOTE4LS4xNS01LjE5Mi4xNXYtMS4xNDhoLjUyOWMyLjYzNyAwIDMuNDM4LTEuNzg2IDMuNDM4LTQuODI5di0xNi4wMzljMC0yLjEyOS0xLjc1Ni0zLjQyMy0zLjQ3LTMuNDIzaC0uNDk3di0xLjE0M2w0LjM4OS4xNTEgMy4zOTQtLjE1MSAxNi45OCAxOS4wNzZ6bTEyLjA5MiAyLjA2MWMtLjM4OCAxLjI5Mi0uODQ3IDIuMjg5LS44NDcgMi45NjggMCAxLjE0NCAxLjYwNCAxLjMzIDIuODYgMS4zM2guNDI3djEuMTQ4Yy0xLjUyOS0uMDgzLTMuMDg4LS4xNDgtNC42MjUtLjE0OC0xLjM3MSAwLTIuNzM2LjA2NS00LjExNS4xNDh2LTEuMTQ4aC4yMzFjMS40ODcgMCAyLjc0OS0uODc0IDMuMzEzLTIuNDc3bDYuMTEyLTE3LjQ3MWMuNDktMS40MDkgMS4xODQtMy4zMTQgMS40MTQtNC43MjggMS4yMTUtLjQxMyAyLjc0NC0xLjE3NCAzLjQ2OS0xLjYzMi4xMTctLjA0MS4xODQtLjA4LjMwNS0uMDguMTE0IDAgLjE4NCAwIC4yNy4xMTcuMTE0LjMwNC4yMjEuNjQ3LjM0NS45NTFsNy4wMTkgMTkuOTE4Yy40NTYgMS4zMzEuOTEgMi43MzkgMS40MDQgMy44ODYuNDYzIDEuMDY2IDEuMjY0IDEuNTE2IDIuNTI0IDEuNTE2aC4yMjh2MS4xNDhjLTEuNzE3LS4wODMtMy40MzYtLjE0OC01LjI2NC0uMTQ4LTEuODY4IDAtMy43ODIuMDY1LTUuNzI4LjE0OHYtMS4xNDhoLjQyM2MuODczIDAgMi4zNjYtLjE0OCAyLjM2Ni0xLjEwMiAwLS40OTItLjM0NC0xLjUyLS43Ny0yLjc0MmwtMS40ODQtNC40MTZoLTguNjYxbC0xLjIxNyAzLjk2M3ptNS41NjgtMTYuODcyaC0uMDc4bC0zLjU0OSAxMC43NzhoNy4xM2wtMy41MDMtMTAuNzc4em0xNi40NDQtMi4zNjJjLTIuODYzIDAtMi45NzcuNjg2LTMuNTUgMy40NjJoLTEuMTQ3Yy4xNS0xLjA2NS4zNDQtMi4xMjkuNDYzLTMuMjM2LjE1MS0xLjA2OC4yMjMtMi4xMjkuMjIzLTMuMjMzaC45MmMuMzAzIDEuMTQ0IDEuMjYxIDEuMTA0IDIuMjg3IDEuMTA0aDE5LjY5MWMxLjAyNiAwIDEuOTc5LS4wMzcgMi4wNTctMS4xODJsLjkxNC4xNTNjLS4xNDcgMS4wMjktLjMgMi4wNTUtLjQxNCAzLjA4NS0uMDg1IDEuMDI5LS4wODUgMi4wNTgtLjA4NSAzLjA4M2wtMS4xNDIuNDIzYy0uMDctMS40MDgtLjI2Mi0zLjY1OS0yLjgxOS0zLjY1OWgtNi4yNTl2MjAuMjU5YzAgMi45MzcgMS4zMzkgMy4yNzIgMy4xNjYgMy4yNzJoLjcyNnYxLjE0OGMtMS40ODkgMC00LjE1OC0uMTUtNi4yMi0uMTUtMi4yODUgMC00Ljk2Mi4xNS02LjQ0OS4xNXYtMS4xNDhoLjcyNWMyLjEwMiAwIDMuMTY5LS4xODcgMy4xNjktMy4xOTJ2LTIwLjMzOWgtNi4yNTd6bTIzLjI2NCAyMy41MzFoLjUzNGMxLjM3OCAwIDIuODIxLS4xODUgMi44MjEtMi4xNjh2LTE5Ljk0OGMwLTEuOTg2LTEuNDQzLTIuMTc1LTIuODIxLTIuMTc1aC0uNTM0di0xLjE0M2MxLjQ5MiAwIDMuNzc3LjE1IDUuNjQzLjE1IDEuOTE0IDAgNC4yMDItLjE1IDUuOTk4LS4xNXYxLjE0M2gtLjUzNGMtMS4zNzYgMC0yLjgyOS4xODktMi44MjkgMi4xNzV2MTkuOTQ4YzAgMS45ODMgMS40NTMgMi4xNjggMi44MjkgMi4xNjhoLjUzNHYxLjE0OGMtMS44MzQgMC00LjEyNC0uMTUtNi4wMjktLjE1LTEuODczIDAtNC4xMi4xNS01LjYxMi4xNXYtMS4xNDh6bTI2Ljg1Ny0yNi4wMDNjOC4xMzUgMCAxNC42MTYgNS4wMjkgMTQuNjE2IDEzLjE0IDAgOC43NTktNi4yOTYgMTQuNTgxLTE0LjQxOSAxNC41ODEtOC4wOTYgMC0xNC4yNzMtNS40ODItMTQuMjczLTEzLjY3IDAtNy45MTkgNi4xNDEtMTQuMDUyIDE0LjA3Ni0xNC4wNTJ6bS41NzcgMjYuMDQ1YzcuNDA0IDAgOC42OTItNi41MTYgOC42OTItMTIuMDY3IDAtNS41NjktMy4wMDUtMTIuMzA2LTkuMzQyLTEyLjMwNi02LjY3OSAwLTguNjYxIDUuOTQyLTguNjYxIDExLjA0IDAgNi44MTcgMy4xMjggMTMuMzMzIDkuMzExIDEzLjMzM3ptMzkuNzUtNi40MDFsLjA3OC0uMDc1di0xNC4yNzdjMC0zLjEyNC0yLjE4MS0zLjU4MS0zLjMyNi0zLjU4MWgtLjgyN3YtMS4xNDNsNS4zMy4xNTEgNC43MDItLjE1MXYxLjE0M2gtLjU3N2MtMS41OTkgMC0zLjM5Ni4zMDYtMy4zOTYgNC44MzZ2MTcuMzNjMCAxLjMzMS4wMzYgMi42NjIuMjMgMy44NDJoLTEuNDQ4bC0xOS42NTQtMjEuODZ2MTUuNjkyYzAgMy4zMTMuNjUgNC40NTIgMy41ODQgNC40NTJoLjY1MXYxLjE0OGwtNC45Mi0uMTUtNS4xOTUuMTV2LTEuMTQ4aC41MzljMi42MzcgMCAzLjQzLTEuNzg2IDMuNDMtNC44Mjl2LTE2LjAzOWMwLTIuMTI5LTEuNzQ2LTMuNDIzLTMuNDctMy40MjNoLS40OTh2LTEuMTQzbDQuMzg5LjE1MSAzLjM5Ni0uMTUxIDE2Ljk4MSAxOS4wNzZ6bTEyLjA4NyAyLjA2MWMtLjM3NSAxLjI5Mi0uODM3IDIuMjg5LS44MzcgMi45NjggMCAxLjE0NCAxLjYwNyAxLjMzIDIuODU4IDEuMzNoLjQyN3YxLjE0OGMtMS41MjgtLjA4My0zLjA5NC0uMTQ4LTQuNjItLjE0OC0xLjM3OCAwLTIuNzQ2LjA2NS00LjExNC4xNDh2LTEuMTQ4aC4yMTdjMS40OTMgMCAyLjc1Ny0uODc0IDMuMzIxLTIuNDc3bDYuMTE0LTE3LjQ3MWMuNDkzLTEuNDA5IDEuMTg0LTMuMzE0IDEuNDA1LTQuNzI4IDEuMjIzLS40MTMgMi43NDctMS4xNzQgMy40NzktMS42MzIuMTA5LS4wNDEuMTg2LS4wOC4zMDEtLjA4LjExNCAwIC4xODcgMCAuMjY0LjExN2wuMzQ5Ljk1MSA3LjAxNiAxOS45MThjLjQ1OCAxLjMzMS45MTQgMi43MzkgMS40MTUgMy44ODYuNDU4IDEuMDY2IDEuMjYyIDEuNTE2IDIuNTE4IDEuNTE2aC4yMzN2MS4xNDhjLTEuNzItLjA4My0zLjQzOC0uMTQ4LTUuMjcyLS4xNDgtMS44NjUgMC0zLjc3Ny4wNjUtNS43MjMuMTQ4di0xLjE0OGguNDIyYy44NzEgMCAyLjM3LS4xNDggMi4zNy0xLjEwMiAwLS40OTItLjM0Ny0xLjUyLS43NzItMi43NDJsLTEuNDgyLTQuNDE2aC04LjY2MmwtMS4yMjUgMy45NjN6bTUuNTc2LTE2Ljg3MmgtLjA3N2wtMy41NTQgMTAuNzc4aDcuMTQxbC0zLjUxMS0xMC43Nzh6bTI0LjM4MSAxOC41ODNjMCAxLjUyNiAxLjA2IDEuOTggMi4yODIgMi4xMzYgMS41NjUuMTE1IDMuMjgyLjExNSA1LjA0Mi0uMDc4IDEuNTk5LS4xOTIgMi45NzItMS4xMDQgMy42NTgtMi4wNTguNjA5LS44MzkuOTUxLTEuOTAzIDEuMTg0LTIuNzQyaDEuMTA2Yy0uNDE5IDIuMTctLjk1NCA0LjMwNy0xLjQxNSA2LjQ3NmwtMTAuMDY2LS4xNDgtMTAuMDc0LjE0OHYtMS4xNDhoLjUyNmMxLjM3OSAwIDIuODcxLS4xODUgMi44NzEtMi41NDl2LTE5LjU3YzAtMS45ODUtMS40OTItMi4xNzMtMi44NzEtMi4xNzNoLS41MjZ2LTEuMTQzbDYuMDI0LjE1MSA1LjgwNC0uMTUxdjEuMTQzaC0uOTU5Yy0xLjQ0NiAwLTIuNTg1LjA0Mi0yLjU4NSAyLjA1NnYxOS42NDl6IiBmaWxsPSIjMUExOTE4Ii8+PC9zdmc+");
}
.rccs__card--discover > div {
color: #555;
@@ -119,38 +119,38 @@ const Container = styled.div`
background: linear-gradient(25deg, #fff, #eee);
}
.rccs__card--discover .rccs__issuer {
- background-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9Ijg2IiB2aWV3Qm94PSIwIDAgNTEyIDg2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCI+PGRlZnM+PGxpbmVhckdyYWRpZW50IHgxPSIyMC40NDIlIiB5MT0iMTAuNTk5JSIgeDI9Ijg5LjI0NSUiIHkyPSI4My41MyUiIGlkPSJhIj48c3RvcCBzdG9wLWNvbG9yPSIjRTI1NDI5IiBvZmZzZXQ9IjAlIi8+PHN0b3Agc3RvcC1jb2xvcj0iI0Y5OUQzRSIgb2Zmc2V0PSIxMDAlIi8+PC9saW5lYXJHcmFkaWVudD48cGF0aCBkPSJNMjcwLjM1Ni4zNjVjLTIzLjk4MiAwLTQzLjQ0IDE4LjczNS00My40NCA0MS44NTggMCAyNC41ODMgMTguNjEyIDQyLjk2IDQzLjQ0IDQyLjk2IDI0LjIwOCAwIDQzLjMyMS0xOC42MiA0My4zMjEtNDIuNDc4IDAtMjMuNzE2LTE4Ljk4Ni00Mi4zNC00My4zMjEtNDIuMzR6IiBpZD0iYiIvPjxmaWx0ZXIgeD0iLTUwJSIgeT0iLTUwJSIgd2lkdGg9IjIwMCUiIGhlaWdodD0iMjAwJSIgZmlsdGVyVW5pdHM9Im9iamVjdEJvdW5kaW5nQm94IiBpZD0iYyI+PGZlTW9ycGhvbG9neSByYWRpdXM9IjIiIGluPSJTb3VyY2VBbHBoYSIgcmVzdWx0PSJzaGFkb3dTcHJlYWRJbm5lcjEiLz48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIyLjUiIGluPSJzaGFkb3dTcHJlYWRJbm5lcjEiIHJlc3VsdD0ic2hhZG93Qmx1cklubmVyMSIvPjxmZU9mZnNldCBkeD0iMiIgZHk9IjIiIGluPSJzaGFkb3dCbHVySW5uZXIxIiByZXN1bHQ9InNoYWRvd09mZnNldElubmVyMSIvPjxmZUNvbXBvc2l0ZSBpbj0ic2hhZG93T2Zmc2V0SW5uZXIxIiBpbjI9IlNvdXJjZUFscGhhIiBvcGVyYXRvcj0iYXJpdGhtZXRpYyIgazI9Ii0xIiBrMz0iMSIgcmVzdWx0PSJzaGFkb3dJbm5lcklubmVyMSIvPjxmZUNvbG9yTWF0cml4IHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMC4zMDE2NTg3NDEgMCIgaW49InNoYWRvd0lubmVySW5uZXIxIi8+PC9maWx0ZXI+PC9kZWZzPjx1c2UgZmlsbD0idXJsKCNhKSIgZmlsbC1ydWxlPSJldmVub2RkIiB4bGluazpocmVmPSIjYiIvPjx1c2UgZmlsdGVyPSJ1cmwoI2MpIiB4bGluazpocmVmPSIjYiIvPjxwYXRoIGQ9Ik0yMy43NDYgMS44OTFoLTIzLjM1M3Y4MS40NTRoMjMuMjMyYzEyLjMyNSAwIDIxLjI0LTIuOTIxIDI5LjA1OS05LjM5OCA5LjI3OC03LjY5NSAxNC43ODEtMTkuMjk4IDE0Ljc4MS0zMS4yODkgMC0yNC4wNDgtMTcuOTY1LTQwLjc2Ni00My43MTktNDAuNzY2em0xOC41NzMgNjEuMTc2Yy01LjAyMiA0LjUzMS0xMS40ODYgNi40ODgtMjEuNzYgNi40ODhoLTQuMjY4di01My44NzNoNC4yNjhjMTAuMjc0IDAgMTYuNDkxIDEuODM0IDIxLjc2IDYuNTkzIDUuNDk1IDQuODg2IDguNzcyIDEyLjQ1MiA4Ljc3MiAyMC4yNjUgMCA3LjgyOS0zLjI3NyAxNS42Ni04Ljc3MiAyMC41Mjd6bTMyLjQ4IDIwLjI3OGgxNS44NzF2LTgxLjQ1NGgtMTUuODcxdjgxLjQ1NHptNTQuNzI3LTUwLjIwOWMtOS41MzktMy41MzQtMTIuMzQ2LTUuODY1LTEyLjM0Ni0xMC4yNDcgMC01LjEzNCA0Ljk5OC05LjAzOSAxMS44NDktOS4wMzkgNC43NjMgMCA4LjY3MSAxLjk1MyAxMi44MzYgNi41OGw4LjI5NC0xMC44NTJjLTYuODM5LTUuOTk4LTE1LjAyMS05LjA0Ny0yMy45NDYtOS4wNDctMTQuMzk4IDAtMjUuMzk5IDEwLjAyLTI1LjM5OSAyMy4zMiAwIDExLjI0NyA1LjEyNiAxNi45ODEgMjAuMDMxIDIyLjM2OSA2LjIzMyAyLjE4OCA5LjQwMSAzLjY0NiAxMC45OTMgNC42NDMgMy4xNzUgMi4wNzcgNC43NjkgNC45OTggNC43NjkgOC40MTYgMCA2LjYwNS01LjI1NyAxMS40ODMtMTIuMzUxIDExLjQ4My03LjU3NCAwLTEzLjY3NC0zLjc4Mi0xNy4zNDEtMTAuODY1bC0xMC4yNDcgOS45MDVjNy4zMTMgMTAuNzMzIDE2LjEwOSAxNS41MTEgMjguMjE0IDE1LjUxMSAxNi40ODggMCAyOC4wODQtMTEuMDA3IDI4LjA4NC0yNi43NTggMC0xMi45NDgtNS4zNjEtMTguODE1LTIzLjQ0My0yNS40MTl6bTI4LjQ0OSA5LjUyMWMwIDIzLjk2NSAxOC44MTUgNDIuNTI1IDQzLjAwNiA0Mi41MjUgNi44MzkgMCAxMi43MDEtMS4zNTIgMTkuOTE1LTQuNzU4di0xOC42OTdjLTYuMzYxIDYuMzU4LTExLjk4IDguOTE2LTE5LjE4OSA4LjkxNi0xNS45OTcgMC0yNy4zNjQtMTEuNjA2LTI3LjM2NC0yOC4xMDIgMC0xNS42MjYgMTEuNzIxLTI3Ljk2NSAyNi42MzgtMjcuOTY1IDcuNTYxIDAgMTMuMzExIDIuNjg2IDE5LjkxNSA5LjE1OXYtMTguNjk2Yy02Ljk2Mi0zLjUzMS0xMi43MTItNC45ODUtMTkuNTUyLTQuOTg1LTI0LjA2NyAwLTQzLjM2OSAxOC45MzUtNDMuMzY5IDQyLjYwNHptMTkxLjY1MSAxMy45NDhsLTIxLjc0My01NC43MTVoLTE3LjM0NmwzNC41NzkgODMuNTM0aDguNTQzbDM1LjE4My04My41MzRoLTE3LjIxOGwtMjIgNTQuNzE1em00Ni40MzkgMjYuNzM5aDQ1LjA2NnYtMTMuNzg5aC0yOS4xODh2LTIyLjAwMWgyOC4wNzJ2LTEzLjc5MmgtMjguMDcydi0xOC4wNzloMjkuMTg4di0xMy43OTJoLTQ1LjA2NnY4MS40NTR6bTEwNy45NTUtNTcuNDE1YzAtMTUuMjU5LTEwLjQ5LTI0LjAzOS0yOC44MjMtMjQuMDM5aC0yMy41Nzd2ODEuNDU0aDE1Ljg5NXYtMzIuNzM3aDIuMDhsMjEuOTc1IDMyLjczN2gxOS41NDRsLTI1LjY2Ny0zNC4zMTFjMTEuOTg4LTIuNDUxIDE4LjU3My0xMC42MzggMTguNTczLTIzLjEwNHptLTMxLjg4MiAxMy40NTJoLTQuNjIzdi0yNC42ODNoNC44NzdjOS45MTYgMCAxNS4yODcgNC4xNjUgMTUuMjg3IDEyLjA5MiAwIDguMTc4LTUuMzcyIDEyLjU5LTE1LjU0MSAxMi41OXoiIGZpbGw9IiMwQjEwMTUiLz48L3N2Zz4=');
+ background-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9Ijg2IiB2aWV3Qm94PSIwIDAgNTEyIDg2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCI+PGRlZnM+PGxpbmVhckdyYWRpZW50IHgxPSIyMC40NDIlIiB5MT0iMTAuNTk5JSIgeDI9Ijg5LjI0NSUiIHkyPSI4My41MyUiIGlkPSJhIj48c3RvcCBzdG9wLWNvbG9yPSIjRTI1NDI5IiBvZmZzZXQ9IjAlIi8+PHN0b3Agc3RvcC1jb2xvcj0iI0Y5OUQzRSIgb2Zmc2V0PSIxMDAlIi8+PC9saW5lYXJHcmFkaWVudD48cGF0aCBkPSJNMjcwLjM1Ni4zNjVjLTIzLjk4MiAwLTQzLjQ0IDE4LjczNS00My40NCA0MS44NTggMCAyNC41ODMgMTguNjEyIDQyLjk2IDQzLjQ0IDQyLjk2IDI0LjIwOCAwIDQzLjMyMS0xOC42MiA0My4zMjEtNDIuNDc4IDAtMjMuNzE2LTE4Ljk4Ni00Mi4zNC00My4zMjEtNDIuMzR6IiBpZD0iYiIvPjxmaWx0ZXIgeD0iLTUwJSIgeT0iLTUwJSIgd2lkdGg9IjIwMCUiIGhlaWdodD0iMjAwJSIgZmlsdGVyVW5pdHM9Im9iamVjdEJvdW5kaW5nQm94IiBpZD0iYyI+PGZlTW9ycGhvbG9neSByYWRpdXM9IjIiIGluPSJTb3VyY2VBbHBoYSIgcmVzdWx0PSJzaGFkb3dTcHJlYWRJbm5lcjEiLz48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIyLjUiIGluPSJzaGFkb3dTcHJlYWRJbm5lcjEiIHJlc3VsdD0ic2hhZG93Qmx1cklubmVyMSIvPjxmZU9mZnNldCBkeD0iMiIgZHk9IjIiIGluPSJzaGFkb3dCbHVySW5uZXIxIiByZXN1bHQ9InNoYWRvd09mZnNldElubmVyMSIvPjxmZUNvbXBvc2l0ZSBpbj0ic2hhZG93T2Zmc2V0SW5uZXIxIiBpbjI9IlNvdXJjZUFscGhhIiBvcGVyYXRvcj0iYXJpdGhtZXRpYyIgazI9Ii0xIiBrMz0iMSIgcmVzdWx0PSJzaGFkb3dJbm5lcklubmVyMSIvPjxmZUNvbG9yTWF0cml4IHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMC4zMDE2NTg3NDEgMCIgaW49InNoYWRvd0lubmVySW5uZXIxIi8+PC9maWx0ZXI+PC9kZWZzPjx1c2UgZmlsbD0idXJsKCNhKSIgZmlsbC1ydWxlPSJldmVub2RkIiB4bGluazpocmVmPSIjYiIvPjx1c2UgZmlsdGVyPSJ1cmwoI2MpIiB4bGluazpocmVmPSIjYiIvPjxwYXRoIGQ9Ik0yMy43NDYgMS44OTFoLTIzLjM1M3Y4MS40NTRoMjMuMjMyYzEyLjMyNSAwIDIxLjI0LTIuOTIxIDI5LjA1OS05LjM5OCA5LjI3OC03LjY5NSAxNC43ODEtMTkuMjk4IDE0Ljc4MS0zMS4yODkgMC0yNC4wNDgtMTcuOTY1LTQwLjc2Ni00My43MTktNDAuNzY2em0xOC41NzMgNjEuMTc2Yy01LjAyMiA0LjUzMS0xMS40ODYgNi40ODgtMjEuNzYgNi40ODhoLTQuMjY4di01My44NzNoNC4yNjhjMTAuMjc0IDAgMTYuNDkxIDEuODM0IDIxLjc2IDYuNTkzIDUuNDk1IDQuODg2IDguNzcyIDEyLjQ1MiA4Ljc3MiAyMC4yNjUgMCA3LjgyOS0zLjI3NyAxNS42Ni04Ljc3MiAyMC41Mjd6bTMyLjQ4IDIwLjI3OGgxNS44NzF2LTgxLjQ1NGgtMTUuODcxdjgxLjQ1NHptNTQuNzI3LTUwLjIwOWMtOS41MzktMy41MzQtMTIuMzQ2LTUuODY1LTEyLjM0Ni0xMC4yNDcgMC01LjEzNCA0Ljk5OC05LjAzOSAxMS44NDktOS4wMzkgNC43NjMgMCA4LjY3MSAxLjk1MyAxMi44MzYgNi41OGw4LjI5NC0xMC44NTJjLTYuODM5LTUuOTk4LTE1LjAyMS05LjA0Ny0yMy45NDYtOS4wNDctMTQuMzk4IDAtMjUuMzk5IDEwLjAyLTI1LjM5OSAyMy4zMiAwIDExLjI0NyA1LjEyNiAxNi45ODEgMjAuMDMxIDIyLjM2OSA2LjIzMyAyLjE4OCA5LjQwMSAzLjY0NiAxMC45OTMgNC42NDMgMy4xNzUgMi4wNzcgNC43NjkgNC45OTggNC43NjkgOC40MTYgMCA2LjYwNS01LjI1NyAxMS40ODMtMTIuMzUxIDExLjQ4My03LjU3NCAwLTEzLjY3NC0zLjc4Mi0xNy4zNDEtMTAuODY1bC0xMC4yNDcgOS45MDVjNy4zMTMgMTAuNzMzIDE2LjEwOSAxNS41MTEgMjguMjE0IDE1LjUxMSAxNi40ODggMCAyOC4wODQtMTEuMDA3IDI4LjA4NC0yNi43NTggMC0xMi45NDgtNS4zNjEtMTguODE1LTIzLjQ0My0yNS40MTl6bTI4LjQ0OSA5LjUyMWMwIDIzLjk2NSAxOC44MTUgNDIuNTI1IDQzLjAwNiA0Mi41MjUgNi44MzkgMCAxMi43MDEtMS4zNTIgMTkuOTE1LTQuNzU4di0xOC42OTdjLTYuMzYxIDYuMzU4LTExLjk4IDguOTE2LTE5LjE4OSA4LjkxNi0xNS45OTcgMC0yNy4zNjQtMTEuNjA2LTI3LjM2NC0yOC4xMDIgMC0xNS42MjYgMTEuNzIxLTI3Ljk2NSAyNi42MzgtMjcuOTY1IDcuNTYxIDAgMTMuMzExIDIuNjg2IDE5LjkxNSA5LjE1OXYtMTguNjk2Yy02Ljk2Mi0zLjUzMS0xMi43MTItNC45ODUtMTkuNTUyLTQuOTg1LTI0LjA2NyAwLTQzLjM2OSAxOC45MzUtNDMuMzY5IDQyLjYwNHptMTkxLjY1MSAxMy45NDhsLTIxLjc0My01NC43MTVoLTE3LjM0NmwzNC41NzkgODMuNTM0aDguNTQzbDM1LjE4My04My41MzRoLTE3LjIxOGwtMjIgNTQuNzE1em00Ni40MzkgMjYuNzM5aDQ1LjA2NnYtMTMuNzg5aC0yOS4xODh2LTIyLjAwMWgyOC4wNzJ2LTEzLjc5MmgtMjguMDcydi0xOC4wNzloMjkuMTg4di0xMy43OTJoLTQ1LjA2NnY4MS40NTR6bTEwNy45NTUtNTcuNDE1YzAtMTUuMjU5LTEwLjQ5LTI0LjAzOS0yOC44MjMtMjQuMDM5aC0yMy41Nzd2ODEuNDU0aDE1Ljg5NXYtMzIuNzM3aDIuMDhsMjEuOTc1IDMyLjczN2gxOS41NDRsLTI1LjY2Ny0zNC4zMTFjMTEuOTg4LTIuNDUxIDE4LjU3My0xMC42MzggMTguNTczLTIzLjEwNHptLTMxLjg4MiAxMy40NTJoLTQuNjIzdi0yNC42ODNoNC44NzdjOS45MTYgMCAxNS4yODcgNC4xNjUgMTUuMjg3IDEyLjA5MiAwIDguMTc4LTUuMzcyIDEyLjU5LTE1LjU0MSAxMi41OXoiIGZpbGw9IiMwQjEwMTUiLz48L3N2Zz4=");
}
.rccs__card--elo .rccs__card__background {
background: linear-gradient(25deg, #211c18, #aaa7a2);
}
.rccs__card--elo .rccs__issuer {
- background-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBkPSJNMjU2IDBjMTQxLjM4NSAwIDI1NiAxMTQuNjE1IDI1NiAyNTYgMCAxNDEuMzg2LTExNC42MTUgMjU2LTI1NiAyNTZzLTI1Ni0xMTQuNjE0LTI1Ni0yNTZjMC0xNDEuMzg1IDExNC42MTUtMjU2IDI1Ni0yNTYiIGZpbGw9IiMwRTBFMTEiLz48cGF0aCBkPSJNMTgwLjA0MiAyMzcuNTgzbC03OC41MjQgMzMuODM3Yy0uMTIyLTEuMzUzLS4xODktMi43MjEtLjE4OS00LjEwNiAwLTI0LjgzOSAyMC4xMzUtNDQuOTc0IDQ0Ljk3NC00NC45NzQgMTMuNDM4IDAgMjUuNDk5IDUuODk4IDMzLjczOSAxNS4yNDN6bS0zMy43MzktNDguODc2YzM3LjA1MyAwIDY4LjExMiAyNS42MzggNzYuNDIgNjAuMTQzbC0zMS42ODIgMTMuODUzLS4wMDctLjA2Ni0zMi40MTMgMTQuMjQxLTc3Ljc1NSAzMy45OTdjLTguMzE4LTEyLjQ3LTEzLjE3LTI3LjQ0OC0xMy4xNy00My41NjEgMC00My40MTQgMzUuMTkzLTc4LjYwNyA3OC42MDctNzguNjA3em01NC45MjggMTM0LjgzOGMtMjguMTQ1IDI2LjcxMy02NS4zNzkgMjkuMzM1LTk4LjA5NiA5LjQ3M2wxOC40ODUtMjguMTA0YzE4LjYxNyAxMS4xMjggMzcuMzE5IDkuMzIzIDU2LjEwNy01LjQyOGwyMy41MDQgMjQuMDZ6bTMyLjAwNy0xOS40NTdsLS4xOTgtMTQ4LjY1MmgyOC4xNjN2MTQ0LjYzOGMwIDEuMzg4LjE3MiAyLjYxIDEuOTkyIDMuMzE3bDI0LjUgOS41MjgtMTEuMDM4IDI4LjctMjguNy0xMi4xNDNjLTEwLjg4My00LjYwNS0xNC43LTExLjI3Ny0xNC43MTktMjUuMzg5eiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0zMzkuMjggMzAxLjU4N2MtMTAuNTU3LTguMjA4LTE3LjM1NC0yMS4wMTgtMTcuMzU0LTM1LjQyNiAwLTEyLjgwOSA1LjM3Ny0yNC4zNTQgMTMuOTg1LTMyLjUyOWwtMTguMTktMjkuNDhjLTE4LjI4NSAxNC40ODctMzAuMDI4IDM2Ljg3LTMwLjAyOCA2Mi4wMDkgMCAyNy4wOTYgMTMuNjMyIDUxLjAwMiAzNC40MDcgNjUuMjU0bDE3LjE3OS0yOS44MjgiIGZpbGw9IiMyMDkxQzMiLz48cGF0aCBkPSJNMzUxLjYxIDIyMy45MzhjNC43NC0xLjcwNSA5Ljg1LTIuNjM5IDE1LjE3OC0yLjYzOSAxOS4yMDggMCAzNS41ODggMTIuMDc3IDQxLjk4NSAyOS4wNDhsMzQuODU2LTIuOTEyYy04LjQxNC0zNC42NC0zOS42MTMtNjAuMzY2LTc2Ljg0MS02MC4zNjYtMTAuNTE5IDAtMjAuNTQ5IDIuMDcxLTI5LjczIDUuNzk5bDE0LjU1MiAzMS4wNzEiIGZpbGw9IiNGQUVDMzIiLz48cGF0aCBkPSJNNDExLjU5NSAyNjguMzM1Yy0xLjEzNSAyMy43NjYtMjAuNzYgNDIuNjg4LTQ0LjgwNyA0Mi42ODgtMy43NyAwLTcuNDI4LS40NzItMTAuOTI1LTEuMzQ3bC0xMy42NzMgMzEuNjU3YzcuNzQ1IDIuNTMxIDE2LjAwNyAzLjkyIDI0LjU5OCAzLjkyIDQyLjU5MSAwIDc3LjMwMi0zMy42NyA3OS4wMDktNzUuODQybC0zNC4yMDMtMS4wNzciIGZpbGw9IiNEMDM1MkEiLz48L2c+PC9zdmc+');
+ background-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBkPSJNMjU2IDBjMTQxLjM4NSAwIDI1NiAxMTQuNjE1IDI1NiAyNTYgMCAxNDEuMzg2LTExNC42MTUgMjU2LTI1NiAyNTZzLTI1Ni0xMTQuNjE0LTI1Ni0yNTZjMC0xNDEuMzg1IDExNC42MTUtMjU2IDI1Ni0yNTYiIGZpbGw9IiMwRTBFMTEiLz48cGF0aCBkPSJNMTgwLjA0MiAyMzcuNTgzbC03OC41MjQgMzMuODM3Yy0uMTIyLTEuMzUzLS4xODktMi43MjEtLjE4OS00LjEwNiAwLTI0LjgzOSAyMC4xMzUtNDQuOTc0IDQ0Ljk3NC00NC45NzQgMTMuNDM4IDAgMjUuNDk5IDUuODk4IDMzLjczOSAxNS4yNDN6bS0zMy43MzktNDguODc2YzM3LjA1MyAwIDY4LjExMiAyNS42MzggNzYuNDIgNjAuMTQzbC0zMS42ODIgMTMuODUzLS4wMDctLjA2Ni0zMi40MTMgMTQuMjQxLTc3Ljc1NSAzMy45OTdjLTguMzE4LTEyLjQ3LTEzLjE3LTI3LjQ0OC0xMy4xNy00My41NjEgMC00My40MTQgMzUuMTkzLTc4LjYwNyA3OC42MDctNzguNjA3em01NC45MjggMTM0LjgzOGMtMjguMTQ1IDI2LjcxMy02NS4zNzkgMjkuMzM1LTk4LjA5NiA5LjQ3M2wxOC40ODUtMjguMTA0YzE4LjYxNyAxMS4xMjggMzcuMzE5IDkuMzIzIDU2LjEwNy01LjQyOGwyMy41MDQgMjQuMDZ6bTMyLjAwNy0xOS40NTdsLS4xOTgtMTQ4LjY1MmgyOC4xNjN2MTQ0LjYzOGMwIDEuMzg4LjE3MiAyLjYxIDEuOTkyIDMuMzE3bDI0LjUgOS41MjgtMTEuMDM4IDI4LjctMjguNy0xMi4xNDNjLTEwLjg4My00LjYwNS0xNC43LTExLjI3Ny0xNC43MTktMjUuMzg5eiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0zMzkuMjggMzAxLjU4N2MtMTAuNTU3LTguMjA4LTE3LjM1NC0yMS4wMTgtMTcuMzU0LTM1LjQyNiAwLTEyLjgwOSA1LjM3Ny0yNC4zNTQgMTMuOTg1LTMyLjUyOWwtMTguMTktMjkuNDhjLTE4LjI4NSAxNC40ODctMzAuMDI4IDM2Ljg3LTMwLjAyOCA2Mi4wMDkgMCAyNy4wOTYgMTMuNjMyIDUxLjAwMiAzNC40MDcgNjUuMjU0bDE3LjE3OS0yOS44MjgiIGZpbGw9IiMyMDkxQzMiLz48cGF0aCBkPSJNMzUxLjYxIDIyMy45MzhjNC43NC0xLjcwNSA5Ljg1LTIuNjM5IDE1LjE3OC0yLjYzOSAxOS4yMDggMCAzNS41ODggMTIuMDc3IDQxLjk4NSAyOS4wNDhsMzQuODU2LTIuOTEyYy04LjQxNC0zNC42NC0zOS42MTMtNjAuMzY2LTc2Ljg0MS02MC4zNjYtMTAuNTE5IDAtMjAuNTQ5IDIuMDcxLTI5LjczIDUuNzk5bDE0LjU1MiAzMS4wNzEiIGZpbGw9IiNGQUVDMzIiLz48cGF0aCBkPSJNNDExLjU5NSAyNjguMzM1Yy0xLjEzNSAyMy43NjYtMjAuNzYgNDIuNjg4LTQ0LjgwNyA0Mi42ODgtMy43NyAwLTcuNDI4LS40NzItMTAuOTI1LTEuMzQ3bC0xMy42NzMgMzEuNjU3YzcuNzQ1IDIuNTMxIDE2LjAwNyAzLjkyIDI0LjU5OCAzLjkyIDQyLjU5MSAwIDc3LjMwMi0zMy42NyA3OS4wMDktNzUuODQybC0zNC4yMDMtMS4wNzciIGZpbGw9IiNEMDM1MkEiLz48L2c+PC9zdmc+");
}
.rccs__card--hipercard .rccs__card__background {
background: linear-gradient(25deg, #8b181b, #de1f27);
}
.rccs__card--hipercard .rccs__issuer {
- background-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjEyMyIgdmlld0JveD0iMCAwIDUxMiAxMjMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPjxwYXRoIGQ9Ik0zNzQuMTE4IDgwLjg0MmMtNi45NDMgNi43OTctMjYuNDM0IDguNzI4LTI0LjQ0LTcuNTIgMS42NTYtMTMuNDk1IDE2LjM0OC0xNi4zNjMgMzIuMjczLTE0LjQxNC0xLjE4NCA3LjM4MS0yLjU0MiAxNi43NTUtNy44MzMgMjEuOTM0em0tMjEuOTM0LTUyLjY0MWMtLjY2MyAzLjcyMy0xLjY4MSA3LjA5Mi0yLjUwNiAxMC42NTMgNy45NTEtMS45OTMgMzIuNzA5LTguMTA1IDM1LjA5NSAyLjUwNi43OTIgMy41MjYtLjU3NCA3LjI3Mi0xLjU2NyAxMC4wMjgtMjIuMzg5LTIuMTIxLTQwLjYzNiAxLjU5OS00NS40MzUgMTcuNTQ3LTMuMjE0IDEwLjY4Mi4zNiAyMS4xOTQgNy4yMDcgMjQuMTI5IDEzLjE4NyA1LjY0OSAyOS4yMjgtLjgyMiAzNC43ODEtOS43MTQtLjU3NyAzLjA3OC0xLjEyMyA2LjE4Ny0uOTQgMTAuMDI2aDExLjU5NGMuMTIzLTExLjEwMyAxLjczOS0yMC4wOTEgMy40NDctMzAuMDgyIDEuNDU2LTguNTA4IDQuMTk1LTE2LjkzMSAzLjc1OS0yNC40NC0uOTk1LTE3LjE5Ny0yOS40ODYtMTEuMTE0LTQ1LjQzNC0xMC42NTN6bTExNi4yNDkgNTcuOTY4Yy05LjA3LjE5NS0xMy41OC01LjQxOS0xMy43ODctMTQuNzI2LS4zNjEtMTYuMzAxIDYuNzg5LTM0LjQxMSAyMS4zMDctMzYuMDM1IDYuNzYtLjc1NiAxMS42NTQuODE2IDE2LjYwNyAyLjUwOC00LjU0NyAxOC4zMS0yLjkwNSA0Ny43OTktMjQuMTI4IDQ4LjI1NHptMzAuMDgxLTg2LjE2OWMtMS4xNTUgMTAuMTI1LTIuNjk5IDE5Ljg2Mi00LjY5OSAyOS4xNC0zMy4wNTEtMTAuNDYxLTUzLjMyIDEzLjg1NS01Mi45NTYgNDMuODY4LjA3MiA1LjgwNSAxLjA3MSAxMS41NjEgNC43MDEgMTUuNjY3IDYuMjU2IDcuMDc2IDI0LjE3IDguNzY4IDMzLjIxNCAyLjgyMSAxLjc1Mi0xLjE1MSAzLjU0LTMuMjQ2IDQuNzAxLTQuNy44NzEtMS4wOTUgMi4yNTYtMy45NTkgMi41MDUtMy4xMzUtLjQ3NCAzLjE4Mi0xLjE4NSA2LjEyNy0xLjI1MiA5LjcxNWgxMi4yMmMyLjM1NC0zMy43ODQgOS42MzctNjIuNjQxIDE1LjA0LTkzLjM3NmgtMTMuNDc1em0tMzQ0Ljk4OSA4MS4xNTZjLTcuMjA5IDcuNjM1LTI0LjkzMSA3LjUxOC0yNi4zMi01LjMyOC0uNjA2LTUuNTg5IDEuNDc3LTExLjQ1IDIuNTA2LTE3LjIzMyAxLjA0MS01Ljg1MyAxLjc5MS0xMS40NjkgMi44MTktMTYuNjA5IDcuMS04LjY3IDI3Ljk2NS05LjcxNiAzMC4wODIgNC43MDEgMS44MzcgMTIuNTE3LTMuMTE3IDI4LjE0NS05LjA4NyAzNC40Njh6bTEwLjY1NC01Mi45NTVjLTExLjQwNC00LjI4NC0yNS4zMDMuODMtMzEuMzI4IDUuNjk0LjAyMS4yMTQtLjE0NC4yNDMtLjMyMS4yNTlsLjMyMS0uMjU5LS4wMDctLjA1NC45NC01LjY0aC0xMS41OTRjLTQuODMxIDMyLjE0My0xMC41NjEgNjMuMzg3LTE2LjYwNyA5NC4zMTZoMTMuNDczYzEuOTUtMTIuMDQ2IDMuMjM5LTI0Ljc1MyA1Ljk1NC0zNi4wMzQgMy4wNzcgMTEuODY1IDIzLjE2OSA5LjU5NyAzMS42NDcgNS4wMTQgMTcuNDk0LTkuNDYgMzAuOTg3LTU0LjQ4MSA3LjUyMS02My4yOTZ6bTYzLjkyMSAyMi41NjFoLTMxLjY0N2MxLjAwMS03LjI3NiA3LjU0Ny0xNS4yNzMgMTcuODU5LTE1LjY2NyA5LjcwNy0uMzcxIDE2LjY1NiAzLjU2NCAxMy43ODcgMTUuNjY3em0tMTIuODQ3LTIzLjgxNGMtOS43MzYuNzQ5LTE3Ljk2NSAzLjU1MS0yMy44MTQgOS43MTMtNy4xNzMgNy41NTgtMTIuOTgzIDI0LjI2Ni0xMS4yODEgMzkuNDgyIDIuNDI4IDIxLjcwOCAyOS40NTcgMjAuOTI5IDUxLjA3NSAxNS42NjcuMzY3LTMuODA5IDEuMjktNy4wNjYgMS44OC0xMC42NTMtOC45MDYgMy4zMzItMjQuMzY4IDcuOTg0LTMzLjUyOCAyLjE5NC02LjkxNS00LjM3My02Ljk1Ni0xNS40NDYtNC43LTI1LjA2OCAxNC41MjktLjQ2MiAyOS42MzEtLjM3NCA0NC4xODEgMCAuOTIzLTYuODIxIDMuNTY1LTE0LjI1NyAxLjI1My0yMC45OTMtMy4wNDktOC44OTQtMTMuOTYxLTExLjE5Ni0yNS4wNjctMTAuMzR6bS0xMTguNDQzIDEuMjUzYy0uMzY1LjA1Mi0uMzQxLjQ5NS0uMzE0LjkzOS0yLjk2OSAyMi4yMDMtNi45ODYgNDMuMzU4LTExLjI4IDY0LjIzNmgxMy40NzNjMy4yMzgtMjIuMzUyIDYuOTQ2LTQ0LjIzMyAxMS41OTQtNjUuMTc1aC0xMy40NzN6bTM1MS41Ny4zMTNjLTExLjkwOS01Ljk1My0yMS44MjIgNC4wMzctMjUuNjkzIDEwLjAyNyAxLjEwMi0zLjA3MyAxLjE2Ni03LjE4OCAyLjE5Mi0xMC4zMzloLTExLjkwN2MtMy4yMSAyMi4zNzktNy4wODEgNDQuMDk4LTExLjU5NCA2NS4xNzVoMTMuNzg3Yy4wODgtOC42MzggMS43ODQtMTUuMDI4IDMuMTMzLTIzLjUwMSAyLjg4Mi0xOC4wODggNy4xMTEtMzcuOTI2IDI4LjIwMi0zMS45Ni43LTMuMDYuOTktNi41MyAxLjg4LTkuNDAxem0tMTUxLjM0NSA0OS41MDhjLTEuMjQxLTMuMjA4LTEuNTYzLTguNTA3LTEuMjUzLTEyLjUzNC42OTctOS4wNTQgMy45OTYtMjAuMDc3IDkuMDg3LTI1LjA2NyA3LjAyNi02Ljg4OCAyMC44OTctNS43NDggMzEuOTYtMS44ODEuMzQzLTMuNzI5IDEuMDkzLTcuMDU0IDEuNTY3LTEwLjY1Mi0xOC4xNDUtMi45NjQtMzUuMzY1LTEuMTIxLTQ0LjQ5NCA4LjQ1OS04LjkzNiA5LjM3OC0xNC43OTYgMzAuOTMyLTEwLjY1NCA0NC40OTQgNC44NDggMTUuODcgMjYuNTgzIDE2LjczMyA0NC4xODMgMTAuNjU0Ljc3Ny0zLjE5IDEuMTktNi43NDYgMS44OC0xMC4wMjgtOS42MTYgNC45OTctMjguMDAxIDcuNTkzLTMyLjI3Ni0zLjQ0N3ptLTcuNTE5LTQ5LjgyMWMtMTEuOTQ4LTQuODI1LTIxLjMzOSAzLjMyOS0yNS42OTMgMTAuOTY3Ljk4Ny0zLjM5OCAxLjM5NC03LjM3OCAyLjE5Mi0xMC45NjdoLTExLjkwN2MtMi45MSAyMi41NzUtNy4yMDEgNDMuNzY5LTExLjI4IDY1LjE3NWgxMy40NzVjMS44ODgtMTIuNzA3IDIuNzAzLTI5LjgzNCA2Ljg5Mi00MS45ODggMy4zNDgtOS43MTMgMTIuMTExLTE3Ljk4NyAyNC43NTQtMTMuNDczLjE3OC0zLjU4MyAxLjIwMy02LjMxOCAxLjU2Ny05LjcxNHptLTIxNy4xNDYtMjYuMzIxYy0xLjkyNSAxMi40ODktNC4wOTMgMjQuNzM1LTYuMjY3IDM2Ljk3NC0xMy45NTkuMTQ3LTI4LjIxMS42OS00MS42NzQtLjMxNCAyLjU0My0xMS45NzMgNC4zNjctMjQuNjY4IDYuODkyLTM2LjY2aC0xNS4wMzljLTUuMzg1IDMwLjU0Ny0xMC4yODIgNjEuNTc5LTE2LjI5NCA5MS40OTdoMTUuMzUzYzIuNDA5LTE1LjM0OCA0LjY2MS0zMC44NTIgNy44MzMtNDUuNDM1IDEzLjA5MS0uMzIyIDI4Ljc4MS0uODg1IDQxLjM2Mi4zMTQtMi41OTQgMTUuMTYyLTUuNzI4IDI5Ljc4My04LjE0NyA0NS4xMjFoMTUuMzU0YzQuOTMyLTMwLjk5NyAxMC4xMzEtNjEuNzI4IDE2LjI5NC05MS40OTdoLTE1LjY2N3ptMzguMjI3IDEzLjc4N2MyLjY4Ni0xLjg0OSA2LjE0NS0xMC4yNzggMi4xOTQtMTMuNzg3LTEuMjUyLTEuMTExLTMuMzQ3LTEuNDMzLTYuMjY3LS45MzktMi43MS40NTctNC4yNjggMS4zNzctNS4zMjcgMi44MTktMS43MDMgMi4zMTktMy4yNjMgOS4zMS0uNjI4IDExLjkwNyAyLjU2NyAyLjUyOSA4LjMxOCAxLjE3NyAxMC4wMjggMHoiIGZpbGw9IiNmZmYiLz48L3N2Zz4=');
+ background-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjEyMyIgdmlld0JveD0iMCAwIDUxMiAxMjMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPjxwYXRoIGQ9Ik0zNzQuMTE4IDgwLjg0MmMtNi45NDMgNi43OTctMjYuNDM0IDguNzI4LTI0LjQ0LTcuNTIgMS42NTYtMTMuNDk1IDE2LjM0OC0xNi4zNjMgMzIuMjczLTE0LjQxNC0xLjE4NCA3LjM4MS0yLjU0MiAxNi43NTUtNy44MzMgMjEuOTM0em0tMjEuOTM0LTUyLjY0MWMtLjY2MyAzLjcyMy0xLjY4MSA3LjA5Mi0yLjUwNiAxMC42NTMgNy45NTEtMS45OTMgMzIuNzA5LTguMTA1IDM1LjA5NSAyLjUwNi43OTIgMy41MjYtLjU3NCA3LjI3Mi0xLjU2NyAxMC4wMjgtMjIuMzg5LTIuMTIxLTQwLjYzNiAxLjU5OS00NS40MzUgMTcuNTQ3LTMuMjE0IDEwLjY4Mi4zNiAyMS4xOTQgNy4yMDcgMjQuMTI5IDEzLjE4NyA1LjY0OSAyOS4yMjgtLjgyMiAzNC43ODEtOS43MTQtLjU3NyAzLjA3OC0xLjEyMyA2LjE4Ny0uOTQgMTAuMDI2aDExLjU5NGMuMTIzLTExLjEwMyAxLjczOS0yMC4wOTEgMy40NDctMzAuMDgyIDEuNDU2LTguNTA4IDQuMTk1LTE2LjkzMSAzLjc1OS0yNC40NC0uOTk1LTE3LjE5Ny0yOS40ODYtMTEuMTE0LTQ1LjQzNC0xMC42NTN6bTExNi4yNDkgNTcuOTY4Yy05LjA3LjE5NS0xMy41OC01LjQxOS0xMy43ODctMTQuNzI2LS4zNjEtMTYuMzAxIDYuNzg5LTM0LjQxMSAyMS4zMDctMzYuMDM1IDYuNzYtLjc1NiAxMS42NTQuODE2IDE2LjYwNyAyLjUwOC00LjU0NyAxOC4zMS0yLjkwNSA0Ny43OTktMjQuMTI4IDQ4LjI1NHptMzAuMDgxLTg2LjE2OWMtMS4xNTUgMTAuMTI1LTIuNjk5IDE5Ljg2Mi00LjY5OSAyOS4xNC0zMy4wNTEtMTAuNDYxLTUzLjMyIDEzLjg1NS01Mi45NTYgNDMuODY4LjA3MiA1LjgwNSAxLjA3MSAxMS41NjEgNC43MDEgMTUuNjY3IDYuMjU2IDcuMDc2IDI0LjE3IDguNzY4IDMzLjIxNCAyLjgyMSAxLjc1Mi0xLjE1MSAzLjU0LTMuMjQ2IDQuNzAxLTQuNy44NzEtMS4wOTUgMi4yNTYtMy45NTkgMi41MDUtMy4xMzUtLjQ3NCAzLjE4Mi0xLjE4NSA2LjEyNy0xLjI1MiA5LjcxNWgxMi4yMmMyLjM1NC0zMy43ODQgOS42MzctNjIuNjQxIDE1LjA0LTkzLjM3NmgtMTMuNDc1em0tMzQ0Ljk4OSA4MS4xNTZjLTcuMjA5IDcuNjM1LTI0LjkzMSA3LjUxOC0yNi4zMi01LjMyOC0uNjA2LTUuNTg5IDEuNDc3LTExLjQ1IDIuNTA2LTE3LjIzMyAxLjA0MS01Ljg1MyAxLjc5MS0xMS40NjkgMi44MTktMTYuNjA5IDcuMS04LjY3IDI3Ljk2NS05LjcxNiAzMC4wODIgNC43MDEgMS44MzcgMTIuNTE3LTMuMTE3IDI4LjE0NS05LjA4NyAzNC40Njh6bTEwLjY1NC01Mi45NTVjLTExLjQwNC00LjI4NC0yNS4zMDMuODMtMzEuMzI4IDUuNjk0LjAyMS4yMTQtLjE0NC4yNDMtLjMyMS4yNTlsLjMyMS0uMjU5LS4wMDctLjA1NC45NC01LjY0aC0xMS41OTRjLTQuODMxIDMyLjE0My0xMC41NjEgNjMuMzg3LTE2LjYwNyA5NC4zMTZoMTMuNDczYzEuOTUtMTIuMDQ2IDMuMjM5LTI0Ljc1MyA1Ljk1NC0zNi4wMzQgMy4wNzcgMTEuODY1IDIzLjE2OSA5LjU5NyAzMS42NDcgNS4wMTQgMTcuNDk0LTkuNDYgMzAuOTg3LTU0LjQ4MSA3LjUyMS02My4yOTZ6bTYzLjkyMSAyMi41NjFoLTMxLjY0N2MxLjAwMS03LjI3NiA3LjU0Ny0xNS4yNzMgMTcuODU5LTE1LjY2NyA5LjcwNy0uMzcxIDE2LjY1NiAzLjU2NCAxMy43ODcgMTUuNjY3em0tMTIuODQ3LTIzLjgxNGMtOS43MzYuNzQ5LTE3Ljk2NSAzLjU1MS0yMy44MTQgOS43MTMtNy4xNzMgNy41NTgtMTIuOTgzIDI0LjI2Ni0xMS4yODEgMzkuNDgyIDIuNDI4IDIxLjcwOCAyOS40NTcgMjAuOTI5IDUxLjA3NSAxNS42NjcuMzY3LTMuODA5IDEuMjktNy4wNjYgMS44OC0xMC42NTMtOC45MDYgMy4zMzItMjQuMzY4IDcuOTg0LTMzLjUyOCAyLjE5NC02LjkxNS00LjM3My02Ljk1Ni0xNS40NDYtNC43LTI1LjA2OCAxNC41MjktLjQ2MiAyOS42MzEtLjM3NCA0NC4xODEgMCAuOTIzLTYuODIxIDMuNTY1LTE0LjI1NyAxLjI1My0yMC45OTMtMy4wNDktOC44OTQtMTMuOTYxLTExLjE5Ni0yNS4wNjctMTAuMzR6bS0xMTguNDQzIDEuMjUzYy0uMzY1LjA1Mi0uMzQxLjQ5NS0uMzE0LjkzOS0yLjk2OSAyMi4yMDMtNi45ODYgNDMuMzU4LTExLjI4IDY0LjIzNmgxMy40NzNjMy4yMzgtMjIuMzUyIDYuOTQ2LTQ0LjIzMyAxMS41OTQtNjUuMTc1aC0xMy40NzN6bTM1MS41Ny4zMTNjLTExLjkwOS01Ljk1My0yMS44MjIgNC4wMzctMjUuNjkzIDEwLjAyNyAxLjEwMi0zLjA3MyAxLjE2Ni03LjE4OCAyLjE5Mi0xMC4zMzloLTExLjkwN2MtMy4yMSAyMi4zNzktNy4wODEgNDQuMDk4LTExLjU5NCA2NS4xNzVoMTMuNzg3Yy4wODgtOC42MzggMS43ODQtMTUuMDI4IDMuMTMzLTIzLjUwMSAyLjg4Mi0xOC4wODggNy4xMTEtMzcuOTI2IDI4LjIwMi0zMS45Ni43LTMuMDYuOTktNi41MyAxLjg4LTkuNDAxem0tMTUxLjM0NSA0OS41MDhjLTEuMjQxLTMuMjA4LTEuNTYzLTguNTA3LTEuMjUzLTEyLjUzNC42OTctOS4wNTQgMy45OTYtMjAuMDc3IDkuMDg3LTI1LjA2NyA3LjAyNi02Ljg4OCAyMC44OTctNS43NDggMzEuOTYtMS44ODEuMzQzLTMuNzI5IDEuMDkzLTcuMDU0IDEuNTY3LTEwLjY1Mi0xOC4xNDUtMi45NjQtMzUuMzY1LTEuMTIxLTQ0LjQ5NCA4LjQ1OS04LjkzNiA5LjM3OC0xNC43OTYgMzAuOTMyLTEwLjY1NCA0NC40OTQgNC44NDggMTUuODcgMjYuNTgzIDE2LjczMyA0NC4xODMgMTAuNjU0Ljc3Ny0zLjE5IDEuMTktNi43NDYgMS44OC0xMC4wMjgtOS42MTYgNC45OTctMjguMDAxIDcuNTkzLTMyLjI3Ni0zLjQ0N3ptLTcuNTE5LTQ5LjgyMWMtMTEuOTQ4LTQuODI1LTIxLjMzOSAzLjMyOS0yNS42OTMgMTAuOTY3Ljk4Ny0zLjM5OCAxLjM5NC03LjM3OCAyLjE5Mi0xMC45NjdoLTExLjkwN2MtMi45MSAyMi41NzUtNy4yMDEgNDMuNzY5LTExLjI4IDY1LjE3NWgxMy40NzVjMS44ODgtMTIuNzA3IDIuNzAzLTI5LjgzNCA2Ljg5Mi00MS45ODggMy4zNDgtOS43MTMgMTIuMTExLTE3Ljk4NyAyNC43NTQtMTMuNDczLjE3OC0zLjU4MyAxLjIwMy02LjMxOCAxLjU2Ny05LjcxNHptLTIxNy4xNDYtMjYuMzIxYy0xLjkyNSAxMi40ODktNC4wOTMgMjQuNzM1LTYuMjY3IDM2Ljk3NC0xMy45NTkuMTQ3LTI4LjIxMS42OS00MS42NzQtLjMxNCAyLjU0My0xMS45NzMgNC4zNjctMjQuNjY4IDYuODkyLTM2LjY2aC0xNS4wMzljLTUuMzg1IDMwLjU0Ny0xMC4yODIgNjEuNTc5LTE2LjI5NCA5MS40OTdoMTUuMzUzYzIuNDA5LTE1LjM0OCA0LjY2MS0zMC44NTIgNy44MzMtNDUuNDM1IDEzLjA5MS0uMzIyIDI4Ljc4MS0uODg1IDQxLjM2Mi4zMTQtMi41OTQgMTUuMTYyLTUuNzI4IDI5Ljc4My04LjE0NyA0NS4xMjFoMTUuMzU0YzQuOTMyLTMwLjk5NyAxMC4xMzEtNjEuNzI4IDE2LjI5NC05MS40OTdoLTE1LjY2N3ptMzguMjI3IDEzLjc4N2MyLjY4Ni0xLjg0OSA2LjE0NS0xMC4yNzggMi4xOTQtMTMuNzg3LTEuMjUyLTEuMTExLTMuMzQ3LTEuNDMzLTYuMjY3LS45MzktMi43MS40NTctNC4yNjggMS4zNzctNS4zMjcgMi44MTktMS43MDMgMi4zMTktMy4yNjMgOS4zMS0uNjI4IDExLjkwNyAyLjU2NyAyLjUyOSA4LjMxOCAxLjE3NyAxMC4wMjggMHoiIGZpbGw9IiNmZmYiLz48L3N2Zz4=");
}
.rccs__card--jcb .rccs__issuer {
- background-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjM5NSIgdmlld0JveD0iMCAwIDUxMiAzOTUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPjxkZWZzPjxsaW5lYXJHcmFkaWVudCB4MT0iLTU3LjUyNyUiIHkxPSI1MC4xMjQlIiB4Mj0iMjMyLjM5MSUiIHkyPSI1MC4xMjQlIiBpZD0iYSI+PHN0b3Agc3RvcC1jb2xvcj0iIzAwNzk0MCIgb2Zmc2V0PSIwJSIvPjxzdG9wIHN0b3AtY29sb3I9IiMwMDg3M0YiIG9mZnNldD0iMjIuODUlIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzQwQTczNyIgb2Zmc2V0PSI3NC4zMyUiLz48c3RvcCBzdG9wLWNvbG9yPSIjNUNCNTMxIiBvZmZzZXQ9IjEwMCUiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCB4MT0iLjE4MyUiIHkxPSI0OS45NiUiIHgyPSIxMDAuMjczJSIgeTI9IjQ5Ljk2JSIgaWQ9ImIiPjxzdG9wIHN0b3AtY29sb3I9IiMwMDc5NDAiIG9mZnNldD0iMCUiLz48c3RvcCBzdG9wLWNvbG9yPSIjMDA4NzNGIiBvZmZzZXQ9IjIyLjg1JSIvPjxzdG9wIHN0b3AtY29sb3I9IiM0MEE3MzciIG9mZnNldD0iNzQuMzMlIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzVDQjUzMSIgb2Zmc2V0PSIxMDAlIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgeDE9Ii02Mi44MDIlIiB5MT0iNDkuODU4JSIgeDI9IjI1My42NzElIiB5Mj0iNDkuODU4JSIgaWQ9ImMiPjxzdG9wIHN0b3AtY29sb3I9IiMwMDc5NDAiIG9mZnNldD0iMCUiLz48c3RvcCBzdG9wLWNvbG9yPSIjMDA4NzNGIiBvZmZzZXQ9IjIyLjg1JSIvPjxzdG9wIHN0b3AtY29sb3I9IiM0MEE3MzciIG9mZnNldD0iNzQuMzMlIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzVDQjUzMSIgb2Zmc2V0PSIxMDAlIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgeDE9Ii4xNzYlIiB5MT0iNTAuMDA2JSIgeDI9IjEwMS44MDglIiB5Mj0iNTAuMDA2JSIgaWQ9ImQiPjxzdG9wIHN0b3AtY29sb3I9IiMxRjI4NkYiIG9mZnNldD0iMCUiLz48c3RvcCBzdG9wLWNvbG9yPSIjMDA0RTk0IiBvZmZzZXQ9IjQ3LjUxJSIvPjxzdG9wIHN0b3AtY29sb3I9IiMwMDY2QjEiIG9mZnNldD0iODIuNjElIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzAwNkZCQyIgb2Zmc2V0PSIxMDAlIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgeDE9Ii0uNTc2JSIgeTE9IjQ5LjkxNCUiIHgyPSI5OC4xMzMlIiB5Mj0iNDkuOTE0JSIgaWQ9ImUiPjxzdG9wIHN0b3AtY29sb3I9IiM2QzJDMkYiIG9mZnNldD0iMCUiLz48c3RvcCBzdG9wLWNvbG9yPSIjODgyNzMwIiBvZmZzZXQ9IjE3LjM1JSIvPjxzdG9wIHN0b3AtY29sb3I9IiNCRTE4MzMiIG9mZnNldD0iNTcuMzElIi8+PHN0b3Agc3RvcC1jb2xvcj0iI0RDMDQzNiIgb2Zmc2V0PSI4NS44NSUiLz48c3RvcCBzdG9wLWNvbG9yPSIjRTYwMDM5IiBvZmZzZXQ9IjEwMCUiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48cGF0aCBkPSJNNTEyIDMxNC44MzZjMCA0My44MTQtMzUuNjc3IDc5LjQ5MS03OS40OTEgNzkuNDkxaC00MzIuNTA5di0zMTQuODM2YzAtNDMuODE0IDM1LjY3Ny03OS40OTEgNzkuNDkxLTc5LjQ5MWg0MzIuNTA5djMxNC44MzZ6IiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTM3MS4xNjkgMjM0LjA5M2gzMi44NjFsNC4wNjgtLjMxM2M2LjI1OS0xLjI1MiAxMS41NzktNi44ODUgMTEuNTc5LTE0LjcwOSAwLTcuNTExLTUuMzItMTMuMTQ0LTExLjU3OS0xNC43MDktLjkzOS0uMzEzLTIuODE3LS4zMTMtNC4wNjgtLjMxM2gtMzIuODYxdjMwLjA0NHoiIGZpbGw9InVybCgjYSkiLz48cGF0aCBkPSJNNDAwLjI3NCAyNi42MDFjLTMxLjI5NiAwLTU2Ljk1OCAyNS4zNS01Ni45NTggNTYuOTU4djU5LjE0OWg4MC40M2MxLjg3OCAwIDQuMDY4IDAgNS42MzMuMzEzIDE4LjE1Mi45MzkgMzEuNjA5IDEwLjMyOCAzMS42MDkgMjYuNjAxIDAgMTIuODMxLTkuMDc2IDIzLjc4NS0yNS45NzYgMjUuOTc2di42MjZjMTguNDY1IDEuMjUyIDMyLjU0OCAxMS41NzkgMzIuNTQ4IDI3LjU0IDAgMTcuMjEzLTE1LjY0OCAyOC40NzktMzYuMzAzIDI4LjQ3OWgtODguMjU0djExNS43OTVoODMuNTZjMzEuMjk2IDAgNTYuOTU4LTI1LjM1IDU2Ljk1OC01Ni45NTh2LTI4NC40NzloLTgzLjI0N3oiIGZpbGw9InVybCgjYikiLz48cGF0aCBkPSJNNDE1LjYwOSAxNzMuMzc5YzAtNy41MTEtNS4zMi0xMi41MTgtMTEuNTc5LTEzLjQ1Ny0uNjI2IDAtMi4xOTEtLjMxMy0zLjEzLS4zMTNoLTI5LjczMXYyNy41NGgyOS43MzFjLjkzOSAwIDIuODE3IDAgMy4xMy0uMzEzIDYuMjU5LS45MzkgMTEuNTc5LTUuOTQ2IDExLjU3OS0xMy40NTd6IiBmaWxsPSJ1cmwoI2MpIi8+PHBhdGggZD0iTTg1LjQzOCAyNi42MDFjLTMxLjI5NiAwLTU2Ljk1OCAyNS4zNS01Ni45NTggNTYuOTU4djE0MC41MThjMTUuOTYxIDcuODI0IDMyLjU0OCAxMi44MzEgNDkuMTM0IDEyLjgzMSAxOS43MTYgMCAzMC4zNTctMTEuODkyIDMwLjM1Ny0yOC4xNjZ2LTY2LjM0N2g0OC44MjJ2NjYuMDM0YzAgMjUuNjYzLTE1Ljk2MSA0Ni42MzEtNzAuMTAzIDQ2LjYzMS0zMi44NjEgMC01OC41MjMtNy4xOTgtNTguNTIzLTcuMTk4djExOS44NjNoODMuNTZjMzEuMjk2IDAgNTYuOTU4LTI1LjM1IDU2Ljk1OC01Ni45NTh2LTI4NC4xNjZoLTgzLjI0N3oiIGZpbGw9InVybCgjZCkiLz48cGF0aCBkPSJNMjQyLjg1NiAyNi42MDFjLTMxLjI5NiAwLTU2Ljk1OCAyNS4zNS01Ni45NTggNTYuOTU4djc0LjQ4NGMxNC4zOTYtMTIuMjA1IDM5LjQzMy0yMC4wMjkgNzkuODA0LTE4LjE1MiAyMS41OTQuOTM5IDQ0Ljc1MyA2Ljg4NSA0NC43NTMgNi44ODV2MjQuMDk4Yy0xMS41NzktNS45NDYtMjUuMzUtMTEuMjY3LTQzLjE4OC0xMi41MTgtMzAuNjctMi4xOTEtNDkuMTM0IDEyLjgzMS00OS4xMzQgMzkuMTIgMCAyNi42MDEgMTguNDY1IDQxLjYyMyA0OS4xMzQgMzkuMTIgMTcuODM5LTEuMjUyIDMxLjYwOS02Ljg4NSA0My4xODgtMTIuNTE4djI0LjA5OHMtMjIuODQ2IDUuOTQ2LTQ0Ljc1MyA2Ljg4NWMtNDAuMzcyIDEuODc4LTY1LjQwOC01Ljk0Ni03OS44MDQtMTguMTUydjEzMS40NDNoODMuNTZjMzEuMjk2IDAgNTYuOTU4LTI1LjM1IDU2Ljk1OC01Ni45NTh2LTI4NC43OTJoLTgzLjU2eiIgZmlsbD0idXJsKCNlKSIvPjwvc3ZnPg==');
+ background-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjM5NSIgdmlld0JveD0iMCAwIDUxMiAzOTUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPjxkZWZzPjxsaW5lYXJHcmFkaWVudCB4MT0iLTU3LjUyNyUiIHkxPSI1MC4xMjQlIiB4Mj0iMjMyLjM5MSUiIHkyPSI1MC4xMjQlIiBpZD0iYSI+PHN0b3Agc3RvcC1jb2xvcj0iIzAwNzk0MCIgb2Zmc2V0PSIwJSIvPjxzdG9wIHN0b3AtY29sb3I9IiMwMDg3M0YiIG9mZnNldD0iMjIuODUlIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzQwQTczNyIgb2Zmc2V0PSI3NC4zMyUiLz48c3RvcCBzdG9wLWNvbG9yPSIjNUNCNTMxIiBvZmZzZXQ9IjEwMCUiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCB4MT0iLjE4MyUiIHkxPSI0OS45NiUiIHgyPSIxMDAuMjczJSIgeTI9IjQ5Ljk2JSIgaWQ9ImIiPjxzdG9wIHN0b3AtY29sb3I9IiMwMDc5NDAiIG9mZnNldD0iMCUiLz48c3RvcCBzdG9wLWNvbG9yPSIjMDA4NzNGIiBvZmZzZXQ9IjIyLjg1JSIvPjxzdG9wIHN0b3AtY29sb3I9IiM0MEE3MzciIG9mZnNldD0iNzQuMzMlIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzVDQjUzMSIgb2Zmc2V0PSIxMDAlIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgeDE9Ii02Mi44MDIlIiB5MT0iNDkuODU4JSIgeDI9IjI1My42NzElIiB5Mj0iNDkuODU4JSIgaWQ9ImMiPjxzdG9wIHN0b3AtY29sb3I9IiMwMDc5NDAiIG9mZnNldD0iMCUiLz48c3RvcCBzdG9wLWNvbG9yPSIjMDA4NzNGIiBvZmZzZXQ9IjIyLjg1JSIvPjxzdG9wIHN0b3AtY29sb3I9IiM0MEE3MzciIG9mZnNldD0iNzQuMzMlIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzVDQjUzMSIgb2Zmc2V0PSIxMDAlIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgeDE9Ii4xNzYlIiB5MT0iNTAuMDA2JSIgeDI9IjEwMS44MDglIiB5Mj0iNTAuMDA2JSIgaWQ9ImQiPjxzdG9wIHN0b3AtY29sb3I9IiMxRjI4NkYiIG9mZnNldD0iMCUiLz48c3RvcCBzdG9wLWNvbG9yPSIjMDA0RTk0IiBvZmZzZXQ9IjQ3LjUxJSIvPjxzdG9wIHN0b3AtY29sb3I9IiMwMDY2QjEiIG9mZnNldD0iODIuNjElIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzAwNkZCQyIgb2Zmc2V0PSIxMDAlIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgeDE9Ii0uNTc2JSIgeTE9IjQ5LjkxNCUiIHgyPSI5OC4xMzMlIiB5Mj0iNDkuOTE0JSIgaWQ9ImUiPjxzdG9wIHN0b3AtY29sb3I9IiM2QzJDMkYiIG9mZnNldD0iMCUiLz48c3RvcCBzdG9wLWNvbG9yPSIjODgyNzMwIiBvZmZzZXQ9IjE3LjM1JSIvPjxzdG9wIHN0b3AtY29sb3I9IiNCRTE4MzMiIG9mZnNldD0iNTcuMzElIi8+PHN0b3Agc3RvcC1jb2xvcj0iI0RDMDQzNiIgb2Zmc2V0PSI4NS44NSUiLz48c3RvcCBzdG9wLWNvbG9yPSIjRTYwMDM5IiBvZmZzZXQ9IjEwMCUiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48cGF0aCBkPSJNNTEyIDMxNC44MzZjMCA0My44MTQtMzUuNjc3IDc5LjQ5MS03OS40OTEgNzkuNDkxaC00MzIuNTA5di0zMTQuODM2YzAtNDMuODE0IDM1LjY3Ny03OS40OTEgNzkuNDkxLTc5LjQ5MWg0MzIuNTA5djMxNC44MzZ6IiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTM3MS4xNjkgMjM0LjA5M2gzMi44NjFsNC4wNjgtLjMxM2M2LjI1OS0xLjI1MiAxMS41NzktNi44ODUgMTEuNTc5LTE0LjcwOSAwLTcuNTExLTUuMzItMTMuMTQ0LTExLjU3OS0xNC43MDktLjkzOS0uMzEzLTIuODE3LS4zMTMtNC4wNjgtLjMxM2gtMzIuODYxdjMwLjA0NHoiIGZpbGw9InVybCgjYSkiLz48cGF0aCBkPSJNNDAwLjI3NCAyNi42MDFjLTMxLjI5NiAwLTU2Ljk1OCAyNS4zNS01Ni45NTggNTYuOTU4djU5LjE0OWg4MC40M2MxLjg3OCAwIDQuMDY4IDAgNS42MzMuMzEzIDE4LjE1Mi45MzkgMzEuNjA5IDEwLjMyOCAzMS42MDkgMjYuNjAxIDAgMTIuODMxLTkuMDc2IDIzLjc4NS0yNS45NzYgMjUuOTc2di42MjZjMTguNDY1IDEuMjUyIDMyLjU0OCAxMS41NzkgMzIuNTQ4IDI3LjU0IDAgMTcuMjEzLTE1LjY0OCAyOC40NzktMzYuMzAzIDI4LjQ3OWgtODguMjU0djExNS43OTVoODMuNTZjMzEuMjk2IDAgNTYuOTU4LTI1LjM1IDU2Ljk1OC01Ni45NTh2LTI4NC40NzloLTgzLjI0N3oiIGZpbGw9InVybCgjYikiLz48cGF0aCBkPSJNNDE1LjYwOSAxNzMuMzc5YzAtNy41MTEtNS4zMi0xMi41MTgtMTEuNTc5LTEzLjQ1Ny0uNjI2IDAtMi4xOTEtLjMxMy0zLjEzLS4zMTNoLTI5LjczMXYyNy41NGgyOS43MzFjLjkzOSAwIDIuODE3IDAgMy4xMy0uMzEzIDYuMjU5LS45MzkgMTEuNTc5LTUuOTQ2IDExLjU3OS0xMy40NTd6IiBmaWxsPSJ1cmwoI2MpIi8+PHBhdGggZD0iTTg1LjQzOCAyNi42MDFjLTMxLjI5NiAwLTU2Ljk1OCAyNS4zNS01Ni45NTggNTYuOTU4djE0MC41MThjMTUuOTYxIDcuODI0IDMyLjU0OCAxMi44MzEgNDkuMTM0IDEyLjgzMSAxOS43MTYgMCAzMC4zNTctMTEuODkyIDMwLjM1Ny0yOC4xNjZ2LTY2LjM0N2g0OC44MjJ2NjYuMDM0YzAgMjUuNjYzLTE1Ljk2MSA0Ni42MzEtNzAuMTAzIDQ2LjYzMS0zMi44NjEgMC01OC41MjMtNy4xOTgtNTguNTIzLTcuMTk4djExOS44NjNoODMuNTZjMzEuMjk2IDAgNTYuOTU4LTI1LjM1IDU2Ljk1OC01Ni45NTh2LTI4NC4xNjZoLTgzLjI0N3oiIGZpbGw9InVybCgjZCkiLz48cGF0aCBkPSJNMjQyLjg1NiAyNi42MDFjLTMxLjI5NiAwLTU2Ljk1OCAyNS4zNS01Ni45NTggNTYuOTU4djc0LjQ4NGMxNC4zOTYtMTIuMjA1IDM5LjQzMy0yMC4wMjkgNzkuODA0LTE4LjE1MiAyMS41OTQuOTM5IDQ0Ljc1MyA2Ljg4NSA0NC43NTMgNi44ODV2MjQuMDk4Yy0xMS41NzktNS45NDYtMjUuMzUtMTEuMjY3LTQzLjE4OC0xMi41MTgtMzAuNjctMi4xOTEtNDkuMTM0IDEyLjgzMS00OS4xMzQgMzkuMTIgMCAyNi42MDEgMTguNDY1IDQxLjYyMyA0OS4xMzQgMzkuMTIgMTcuODM5LTEuMjUyIDMxLjYwOS02Ljg4NSA0My4xODgtMTIuNTE4djI0LjA5OHMtMjIuODQ2IDUuOTQ2LTQ0Ljc1MyA2Ljg4NWMtNDAuMzcyIDEuODc4LTY1LjQwOC01Ljk0Ni03OS44MDQtMTguMTUydjEzMS40NDNoODMuNTZjMzEuMjk2IDAgNTYuOTU4LTI1LjM1IDU2Ljk1OC01Ni45NTh2LTI4NC43OTJoLTgzLjU2eiIgZmlsbD0idXJsKCNlKSIvPjwvc3ZnPg==");
}
.rccs__card--laser .rccs__issuer {
- background-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjM2OCIgdmlld0JveD0iMCAwIDUxMiAzNjgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPjxwYXRoIGZpbGw9IiMyODM0N0QiIGQ9Ik0wIDM2Ny4yMTJoNTEydi0zNjcuMjExaC01MTJ6Ii8+PHBhdGggZD0iTTI1My45MSAyOTEuMDQzaC0yNTMuOTF2Mi4wOTZoMjUyLjY5bC4xMTYgNy42MjIgNC43NjQtNy42MjJoMjU0LjQzdi0yLjA5NmgtMjUzLjI3MWwzLjY2My02LjExMi04LjQ4MiA2LjExMnptMi41NTYtMjAuMDg0aC0yNTYuNDY2djIuMDk2aDI1NS40Mmw5LjE0NyA4LjM5OCA1LjExMi04LjM5OGgyNDIuMzIxdi0yLjA5NmgtMjQxLjA0NWw0LjY3Ny03LjY4NC0xOS4xNjYgNy42ODR6bTIuMTUtMjAuMDgzaC0yNTguNjE2djIuMDk2aDI1NS45OTlsMjAuODgyIDguMjUyIDUuMDIyLTguMjUyaDIzMC4wOTd2LTIuMDk2aC0yMjguODJsNC4xMS02Ljc1Mi0yOC42NzQgNi43NTJ6bS02Ljk3Mi0yMC4wODNoLTI1MS42NDR2Mi4wOTZoMjUwLjAxN2wzOS4zNDIgNy44MzYgNC43Ny03LjgzNmgyMTcuODcxdi0yLjA5NmgtMjE2LjU5NGw0LjEzNC03LjI1Mi00Ny44OTYgNy4yNTJ6bS0yMi43NzUtMTcuMDU3aC0yMjguODY4djIuMDk2aDIzNy43bDYzLjEgNS45OTYgMy43MTEtNS45OTZoMjA3LjQ4OXYtMi4wOTZoLTIwNi4yMTRsNS4xMy04LjMyNC04Mi4wNDggOC4zMjR6bS0zLjMxLTIwLjA4M2gtMjI1LjU1OHYyLjA5NmgyMjYuMDgxbDg2Ljg4OSA2LjExMiAzLjc2Ni02LjExMmgxOTUuMjY0di0yLjA5NmgtMTkzLjk4OGw0LjUzNS03LjQ1MS05Ni45ODkgNy40NTF6bS0zLjEzOC0yMC4wODNoLTIyMi40MnYyLjA5NmgyMjEuOTU1bDEwMy4xMjEgNi4zNDQgMy44ODYtNi4zNDRoMTgzLjAzOHYtMi4wOTZoLTE4MS43NjNsNC40MzQtNy4yMTgtMTEyLjI1MSA3LjIxOHptLTguNzcyLTIwLjA4M2gtMjEzLjY0N3YyLjA5NWgyMTMuMjk4bDEyMy40ODIgNy42NjcgNC42MDUtNy42NjdoMTcwLjYxNXYtMi4wOTVoLTE2OS4zNTZsNC4wNzgtNi43ODgtMTMzLjA3NSA2Ljc4OHptLTE5LjA1Ny0xNy4yODloLTE5NC41OTF2Mi4wOTZoMTk0LjQxNmwxNTMuNjY3IDYuMTM4IDMuNjg5LTYuMTM4aDE2MC4yMjh2LTIuMDk2aC0xNTguOTdsNC42MzEtNy43MDktMTYzLjA3IDcuNzA5em00Ljc2NS0yMC4wODRoLTE5OS4zNTV2Mi4wOTZoMTk4LjMwOGwxNjEuNDQzIDYuODEgNC4wODQtNi44MWgxNDguMTY1di0yLjA5NmgtMTQ2LjkwNmw0LjAxNS02LjY4NC0xNjkuNzU0IDYuNjg0em0tMTEuMzMtMjAuMDgzaC0xODguMDI1djIuMDk2aDE4Ni45NzlsMTg0LjY3NiA3LjEwMiA0LjI0NC03LjEwMmgxMzYuMTAxdi0yLjA5NmgtMTM0Ljg0MmwzLjY3Ny02LjE3MS0xOTIuODEgNi4xNzF6bS04Ljg4OS0yMC4wODNoLTE3OS4xMzZ2Mi4wOTZoMTY0Ljg0NGwyMTkuMDg2IDYuNzEzIDQuMDMzLTYuNzEzaDEyNC4wMzd2LTIuMDk2aC0xMjIuNzc4bDMuNjc4LTYuMTIxLTIxMy43NjQgNi4xMjF6bS0xLjIyLTIwLjA4M2gtMTc3LjkxNnYyLjA5NmgxNzUuNjVsMjE5Ljc0OCA3LjcwNiA0LjYzLTcuNzA2aDExMS45NzJ2LTIuMDk2aC0xMTAuNzE0bDMuOTIyLTYuNTItMjI3LjI5MiA2LjUyem0tMTIuMzc1LTIwLjA4M2gtMTY1LjU0MXYyLjA5NWgxMzIuNTQybDI3NS4yOTkgNy4wNzggNC4yNTEtNy4wNzhoOTkuOTA4di0yLjA5NWgtOTguNjQ5bDMuODE3LTYuMzU2LTI1MS42MjcgNi4zNTZ6bS04Mi4yMjctMTYuNjQ5aC04My4zMTR2Mi4wOTZoMjAwLjA1MmwyMTkuNTU0IDQuMTM4IDIuNDg3LTQuMTM4aDg5LjkwN3YtMi4wOTZoLTg4LjY0OGw1LjU4OC05LjMwMy0zNDUuNjI1IDkuMzAzeiIgZmlsbD0iI0VCMEQ3RiIvPjxwYXRoIGQ9Ik0xMzQuNzEgMzQ5LjE0MXYtMzcuNjE4aDcuNjQzdjMxLjIyN2gxOS4wMDV2Ni4zOTFoLTI2LjY0OHptODMuMTU1IDBoLTguMzE0bC0zLjMwNi04LjYxNWgtMTUuMTMybC0zLjEyNCA4LjYxNWgtOC4xMDhsMTQuNzQ0LTM3LjkyOWg4LjA4MmwxNS4xNTcgMzcuOTI5em0tMTQuMDczLTE1LjAwNmwtNS4yMTYtMTQuMDc1LTUuMTEzIDE0LjA3NWgxMC4zMjl6bTMzLjExMiAyLjY2NWw3LjQzNi0uNzI1Yy40NDcgMi41MDIgMS4zNTYgNC4zMzkgMi43MjUgNS41MTEgMS4zNjggMS4xNzQgMy4yMTUgMS43NTkgNS41MzkgMS43NTkgMi40NiAwIDQuMzE3LS41MjEgNS41NjQtMS41NjYgMS4yNDgtMS4wNDIgMS44NzItMi4yNjMgMS44NzItMy42NiAwLS44OTYtLjI2My0xLjY2LS43ODctMi4yOS0uNTI1LS42MjktMS40NDQtMS4xNzYtMi43NTItMS42NDItLjg5NC0uMzExLTIuOTM1LS44NjItNi4xMTktMS42NTYtNC4wOTctMS4wMTctNi45NzEtMi4yNjctOC42MjQtMy43NTItMi4zMjMtMi4wODYtMy40ODUtNC42MzEtMy40ODUtNy42MzIgMC0xLjkzMS41NDYtMy43MzkgMS42MzktNS40MTkgMS4wOTMtMS42ODMgMi42NjgtMi45NjQgNC43MjYtMy44NDMgMi4wNTctLjg4IDQuNTM5LTEuMzE5IDcuNDUtMS4zMTkgNC43NTEgMCA4LjMyOCAxLjA0NCAxMC43MjggMy4xMyAyLjQwMyAyLjA4NyAzLjY2MSA0Ljg3NCAzLjc4NCA4LjM1NmwtNy42NDMuMzM3Yy0uMzI5LTEuOTQ4LTEuMDMxLTMuMzUtMi4xMDQtNC4yMDUtMS4wNzctLjg1Mi0yLjY5MS0xLjI4LTQuODQ0LTEuMjgtMi4yMjEgMC0zLjk1OS40NTgtNS4yMTYgMS4zNzEtLjgwOS41ODctMS4yMTQgMS4zNzItMS4yMTQgMi4zNTUgMCAuODk3LjM3OCAxLjY2NSAxLjEzNyAyLjMwMi45NjMuODEyIDMuMzA1IDEuNjU2IDcuMDI0IDIuNTM2IDMuNzE4Ljg3OSA2LjQ2OCAxLjc4OSA4LjI0OSAyLjczIDEuNzgzLjkzOSAzLjE3OCAyLjIyNSA0LjE4MyAzLjg1MyAxLjAwOCAxLjYzMiAxLjUxMSAzLjY0NiAxLjUxMSA2LjA0MiAwIDIuMTc0LS42MDMgNC4yMDktMS44MDcgNi4xMDYtMS4yMDcgMS44OTgtMi45MSAzLjMwOC01LjExMiA0LjIzMS0yLjIwNS45MjItNC45NSAxLjM4NC04LjIzOSAxLjM4NC00Ljc4NiAwLTguNDYtMS4xMDktMTEuMDI1LTMuMzI2LTIuNTY1LTIuMjE1LTQuMDk3LTUuNDQ1LTQuNTk2LTkuNjg4em01NC4xMzIgMTIuMzQxdi0zNy45MjloMjguMDY5djYuNDE3aC0yMC40MjZ2OC40MDhoMTkuMDA1djYuMzkxaC0xOS4wMDV2MTAuMzIyaDIxLjE0OXY2LjM5MWgtMjguNzkyem01Mi4yMiAwdi0zNy45MjloMTYuMDg3YzQuMDQ1IDAgNi45ODQuMzQgOC44MTkgMS4wMjEgMS44MzIuNjgzIDMuMzAxIDEuODk1IDQuNDAyIDMuNjM2IDEuMTAxIDEuNzQzIDEuNjUzIDMuNzM1IDEuNjUzIDUuOTc3IDAgMi44NDUtLjgzNiA1LjE5Ni0yLjUwNSA3LjA0OS0xLjY3IDEuODU1LTQuMTY3IDMuMDI1LTcuNDg4IDMuNTA2IDEuNjUzLjk2NyAzLjAxNyAyLjAyOCA0LjA5NCAzLjE4MyAxLjA3NSAxLjE1NiAyLjUyNCAzLjIwOCA0LjM1MSA2LjE1N2w0LjYyMSA3LjRoLTkuMTRsLTUuNTI2LTguMjU0Yy0xLjk2Mi0yLjk0OS0zLjMwNS00LjgwOC00LjAyOC01LjU3Ni0uNzIzLS43NjYtMS40ODktMS4yOTMtMi4yOTktMS41NzctLjgwOS0uMjg2LTIuMDkxLS40MjctMy44NDYtLjQyN2gtMS41NXYxNS44MzRoLTcuNjQzem03LjY0My0yMS44ODhoNS42NTVjMy42NjcgMCA1Ljk1NS0uMTU1IDYuODY5LS40NjYuOTEyLS4zMSAxLjYyNy0uODQ0IDIuMTQ0LTEuNjA0LjUxNi0uNzU5Ljc3NC0xLjcwNy43NzQtMi44NDYgMC0xLjI3Ni0uMzQtMi4zMDctMS4wMTktMy4wOTEtLjY4Mi0uNzg1LTEuNjQxLTEuMjgxLTIuODgtMS40ODgtLjYyLS4wODYtMi40NzgtLjEzLTUuNTc3LS4xM2gtNS45NjV2OS42MjV6IiBmaWxsPSIjZmZmIi8+PC9zdmc+');
+ background-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjM2OCIgdmlld0JveD0iMCAwIDUxMiAzNjgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPjxwYXRoIGZpbGw9IiMyODM0N0QiIGQ9Ik0wIDM2Ny4yMTJoNTEydi0zNjcuMjExaC01MTJ6Ii8+PHBhdGggZD0iTTI1My45MSAyOTEuMDQzaC0yNTMuOTF2Mi4wOTZoMjUyLjY5bC4xMTYgNy42MjIgNC43NjQtNy42MjJoMjU0LjQzdi0yLjA5NmgtMjUzLjI3MWwzLjY2My02LjExMi04LjQ4MiA2LjExMnptMi41NTYtMjAuMDg0aC0yNTYuNDY2djIuMDk2aDI1NS40Mmw5LjE0NyA4LjM5OCA1LjExMi04LjM5OGgyNDIuMzIxdi0yLjA5NmgtMjQxLjA0NWw0LjY3Ny03LjY4NC0xOS4xNjYgNy42ODR6bTIuMTUtMjAuMDgzaC0yNTguNjE2djIuMDk2aDI1NS45OTlsMjAuODgyIDguMjUyIDUuMDIyLTguMjUyaDIzMC4wOTd2LTIuMDk2aC0yMjguODJsNC4xMS02Ljc1Mi0yOC42NzQgNi43NTJ6bS02Ljk3Mi0yMC4wODNoLTI1MS42NDR2Mi4wOTZoMjUwLjAxN2wzOS4zNDIgNy44MzYgNC43Ny03LjgzNmgyMTcuODcxdi0yLjA5NmgtMjE2LjU5NGw0LjEzNC03LjI1Mi00Ny44OTYgNy4yNTJ6bS0yMi43NzUtMTcuMDU3aC0yMjguODY4djIuMDk2aDIzNy43bDYzLjEgNS45OTYgMy43MTEtNS45OTZoMjA3LjQ4OXYtMi4wOTZoLTIwNi4yMTRsNS4xMy04LjMyNC04Mi4wNDggOC4zMjR6bS0zLjMxLTIwLjA4M2gtMjI1LjU1OHYyLjA5NmgyMjYuMDgxbDg2Ljg4OSA2LjExMiAzLjc2Ni02LjExMmgxOTUuMjY0di0yLjA5NmgtMTkzLjk4OGw0LjUzNS03LjQ1MS05Ni45ODkgNy40NTF6bS0zLjEzOC0yMC4wODNoLTIyMi40MnYyLjA5NmgyMjEuOTU1bDEwMy4xMjEgNi4zNDQgMy44ODYtNi4zNDRoMTgzLjAzOHYtMi4wOTZoLTE4MS43NjNsNC40MzQtNy4yMTgtMTEyLjI1MSA3LjIxOHptLTguNzcyLTIwLjA4M2gtMjEzLjY0N3YyLjA5NWgyMTMuMjk4bDEyMy40ODIgNy42NjcgNC42MDUtNy42NjdoMTcwLjYxNXYtMi4wOTVoLTE2OS4zNTZsNC4wNzgtNi43ODgtMTMzLjA3NSA2Ljc4OHptLTE5LjA1Ny0xNy4yODloLTE5NC41OTF2Mi4wOTZoMTk0LjQxNmwxNTMuNjY3IDYuMTM4IDMuNjg5LTYuMTM4aDE2MC4yMjh2LTIuMDk2aC0xNTguOTdsNC42MzEtNy43MDktMTYzLjA3IDcuNzA5em00Ljc2NS0yMC4wODRoLTE5OS4zNTV2Mi4wOTZoMTk4LjMwOGwxNjEuNDQzIDYuODEgNC4wODQtNi44MWgxNDguMTY1di0yLjA5NmgtMTQ2LjkwNmw0LjAxNS02LjY4NC0xNjkuNzU0IDYuNjg0em0tMTEuMzMtMjAuMDgzaC0xODguMDI1djIuMDk2aDE4Ni45NzlsMTg0LjY3NiA3LjEwMiA0LjI0NC03LjEwMmgxMzYuMTAxdi0yLjA5NmgtMTM0Ljg0MmwzLjY3Ny02LjE3MS0xOTIuODEgNi4xNzF6bS04Ljg4OS0yMC4wODNoLTE3OS4xMzZ2Mi4wOTZoMTY0Ljg0NGwyMTkuMDg2IDYuNzEzIDQuMDMzLTYuNzEzaDEyNC4wMzd2LTIuMDk2aC0xMjIuNzc4bDMuNjc4LTYuMTIxLTIxMy43NjQgNi4xMjF6bS0xLjIyLTIwLjA4M2gtMTc3LjkxNnYyLjA5NmgxNzUuNjVsMjE5Ljc0OCA3LjcwNiA0LjYzLTcuNzA2aDExMS45NzJ2LTIuMDk2aC0xMTAuNzE0bDMuOTIyLTYuNTItMjI3LjI5MiA2LjUyem0tMTIuMzc1LTIwLjA4M2gtMTY1LjU0MXYyLjA5NWgxMzIuNTQybDI3NS4yOTkgNy4wNzggNC4yNTEtNy4wNzhoOTkuOTA4di0yLjA5NWgtOTguNjQ5bDMuODE3LTYuMzU2LTI1MS42MjcgNi4zNTZ6bS04Mi4yMjctMTYuNjQ5aC04My4zMTR2Mi4wOTZoMjAwLjA1MmwyMTkuNTU0IDQuMTM4IDIuNDg3LTQuMTM4aDg5LjkwN3YtMi4wOTZoLTg4LjY0OGw1LjU4OC05LjMwMy0zNDUuNjI1IDkuMzAzeiIgZmlsbD0iI0VCMEQ3RiIvPjxwYXRoIGQ9Ik0xMzQuNzEgMzQ5LjE0MXYtMzcuNjE4aDcuNjQzdjMxLjIyN2gxOS4wMDV2Ni4zOTFoLTI2LjY0OHptODMuMTU1IDBoLTguMzE0bC0zLjMwNi04LjYxNWgtMTUuMTMybC0zLjEyNCA4LjYxNWgtOC4xMDhsMTQuNzQ0LTM3LjkyOWg4LjA4MmwxNS4xNTcgMzcuOTI5em0tMTQuMDczLTE1LjAwNmwtNS4yMTYtMTQuMDc1LTUuMTEzIDE0LjA3NWgxMC4zMjl6bTMzLjExMiAyLjY2NWw3LjQzNi0uNzI1Yy40NDcgMi41MDIgMS4zNTYgNC4zMzkgMi43MjUgNS41MTEgMS4zNjggMS4xNzQgMy4yMTUgMS43NTkgNS41MzkgMS43NTkgMi40NiAwIDQuMzE3LS41MjEgNS41NjQtMS41NjYgMS4yNDgtMS4wNDIgMS44NzItMi4yNjMgMS44NzItMy42NiAwLS44OTYtLjI2My0xLjY2LS43ODctMi4yOS0uNTI1LS42MjktMS40NDQtMS4xNzYtMi43NTItMS42NDItLjg5NC0uMzExLTIuOTM1LS44NjItNi4xMTktMS42NTYtNC4wOTctMS4wMTctNi45NzEtMi4yNjctOC42MjQtMy43NTItMi4zMjMtMi4wODYtMy40ODUtNC42MzEtMy40ODUtNy42MzIgMC0xLjkzMS41NDYtMy43MzkgMS42MzktNS40MTkgMS4wOTMtMS42ODMgMi42NjgtMi45NjQgNC43MjYtMy44NDMgMi4wNTctLjg4IDQuNTM5LTEuMzE5IDcuNDUtMS4zMTkgNC43NTEgMCA4LjMyOCAxLjA0NCAxMC43MjggMy4xMyAyLjQwMyAyLjA4NyAzLjY2MSA0Ljg3NCAzLjc4NCA4LjM1NmwtNy42NDMuMzM3Yy0uMzI5LTEuOTQ4LTEuMDMxLTMuMzUtMi4xMDQtNC4yMDUtMS4wNzctLjg1Mi0yLjY5MS0xLjI4LTQuODQ0LTEuMjgtMi4yMjEgMC0zLjk1OS40NTgtNS4yMTYgMS4zNzEtLjgwOS41ODctMS4yMTQgMS4zNzItMS4yMTQgMi4zNTUgMCAuODk3LjM3OCAxLjY2NSAxLjEzNyAyLjMwMi45NjMuODEyIDMuMzA1IDEuNjU2IDcuMDI0IDIuNTM2IDMuNzE4Ljg3OSA2LjQ2OCAxLjc4OSA4LjI0OSAyLjczIDEuNzgzLjkzOSAzLjE3OCAyLjIyNSA0LjE4MyAzLjg1MyAxLjAwOCAxLjYzMiAxLjUxMSAzLjY0NiAxLjUxMSA2LjA0MiAwIDIuMTc0LS42MDMgNC4yMDktMS44MDcgNi4xMDYtMS4yMDcgMS44OTgtMi45MSAzLjMwOC01LjExMiA0LjIzMS0yLjIwNS45MjItNC45NSAxLjM4NC04LjIzOSAxLjM4NC00Ljc4NiAwLTguNDYtMS4xMDktMTEuMDI1LTMuMzI2LTIuNTY1LTIuMjE1LTQuMDk3LTUuNDQ1LTQuNTk2LTkuNjg4em01NC4xMzIgMTIuMzQxdi0zNy45MjloMjguMDY5djYuNDE3aC0yMC40MjZ2OC40MDhoMTkuMDA1djYuMzkxaC0xOS4wMDV2MTAuMzIyaDIxLjE0OXY2LjM5MWgtMjguNzkyem01Mi4yMiAwdi0zNy45MjloMTYuMDg3YzQuMDQ1IDAgNi45ODQuMzQgOC44MTkgMS4wMjEgMS44MzIuNjgzIDMuMzAxIDEuODk1IDQuNDAyIDMuNjM2IDEuMTAxIDEuNzQzIDEuNjUzIDMuNzM1IDEuNjUzIDUuOTc3IDAgMi44NDUtLjgzNiA1LjE5Ni0yLjUwNSA3LjA0OS0xLjY3IDEuODU1LTQuMTY3IDMuMDI1LTcuNDg4IDMuNTA2IDEuNjUzLjk2NyAzLjAxNyAyLjAyOCA0LjA5NCAzLjE4MyAxLjA3NSAxLjE1NiAyLjUyNCAzLjIwOCA0LjM1MSA2LjE1N2w0LjYyMSA3LjRoLTkuMTRsLTUuNTI2LTguMjU0Yy0xLjk2Mi0yLjk0OS0zLjMwNS00LjgwOC00LjAyOC01LjU3Ni0uNzIzLS43NjYtMS40ODktMS4yOTMtMi4yOTktMS41NzctLjgwOS0uMjg2LTIuMDkxLS40MjctMy44NDYtLjQyN2gtMS41NXYxNS44MzRoLTcuNjQzem03LjY0My0yMS44ODhoNS42NTVjMy42NjcgMCA1Ljk1NS0uMTU1IDYuODY5LS40NjYuOTEyLS4zMSAxLjYyNy0uODQ0IDIuMTQ0LTEuNjA0LjUxNi0uNzU5Ljc3NC0xLjcwNy43NzQtMi44NDYgMC0xLjI3Ni0uMzQtMi4zMDctMS4wMTktMy4wOTEtLjY4Mi0uNzg1LTEuNjQxLTEuMjgxLTIuODgtMS40ODgtLjYyLS4wODYtMi40NzgtLjEzLTUuNTc3LS4xM2gtNS45NjV2OS42MjV6IiBmaWxsPSIjZmZmIi8+PC9zdmc+");
}
.rccs__card--maestro .rccs__card__background,
.rccs__card--mastercard .rccs__card__background {
background: linear-gradient(25deg, #f37b26, #fdb731);
}
.rccs__card--maestro .rccs__issuer {
- background-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjM5OCIgdmlld0JveD0iMCAwIDUxMiAzOTgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPjxwYXRoIGZpbGw9IiM2QzZCQkQiIGQ9Ik0zMjUuMjIzIDI4Mi42MjloLTEzOC40NDV2LTI0OC44MDNoMTM4LjQ0NXoiLz48cGF0aCBkPSJNMTk1LjU2NSAxNTguMjMzYzAtNTAuNDcxIDIzLjYzMS05NS40MjkgNjAuNDMtMTI0LjQwMS0yNi45MS0yMS4xODYtNjAuODczLTMzLjgzMi05Ny43ODMtMzMuODMyLTg3LjM4MSAwLTE1OC4yMTMgNzAuODQyLTE1OC4yMTMgMTU4LjIzM3M3MC44MzIgMTU4LjIzMyAxNTguMjEzIDE1OC4yMzNjMzYuOTEgMCA3MC44NzItMTIuNjQ1IDk3Ljc4My0zMy44MzItMzYuNzk5LTI4Ljk3My02MC40My03My45MzEtNjAuNDMtMTI0LjQwMSIgZmlsbD0iI0QzMjAxMSIvPjxwYXRoIGQ9Ik01MTIgMTU4LjIzM2MwIDg3LjM5MS03MC44MzIgMTU4LjIzMy0xNTguMjEzIDE1OC4yMzMtMzYuOTEgMC03MC44NzItMTIuNjQ1LTk3Ljc5My0zMy44MzIgMzYuODA5LTI4Ljk3MyA2MC40NC03My45MzEgNjAuNDQtMTI0LjQwMSAwLTUwLjQ3MS0yMy42MzEtOTUuNDI5LTYwLjQ0LTEyNC40MDEgMjYuOTItMjEuMTg2IDYwLjg4My0zMy44MzIgOTcuNzkzLTMzLjgzMiA4Ny4zODEgMCAxNTguMjEzIDcwLjg0MiAxNTguMjEzIDE1OC4yMzMiIGZpbGw9IiMwMDk5REYiLz48cGF0aCBkPSJNMzcyLjA2NSAzNTIuOTM0YzEuODQxIDAgNC40ODcuMzUyIDYuNTA5IDEuMTQ3bC0yLjgxNyA4LjYxMWMtMS45MzItLjc5NS0zLjg2My0xLjA1Ni01LjcxNC0xLjA1Ni01Ljk3NiAwLTguOTYzIDMuODYzLTguOTYzIDEwLjgwNHYyMy41NmgtOS4xNDR2LTQyLjAxaDkuMDU0djUuMWMyLjM3NC0zLjY5MiA1LjgwNS02LjE1NyAxMS4wNzYtNi4xNTd6bS0zMy43ODEgOS40MDZoLTE0LjkzOXYxOC45ODNjMCA0LjIxNSAxLjQ4OSA3LjAzMiA2LjA2NiA3LjAzMiAyLjM3NCAwIDUuMzYyLS43OTUgOC4wNzgtMi4zNzRsMi42MzYgNy44MTdjLTIuODk3IDIuMDIyLTcuNDY0IDMuMjU5LTExLjQxOCAzLjI1OS0xMC44MTQgMC0xNC41ODctNS44MDUtMTQuNTg3LTE1LjU2M3YtMTkuMTU0aC04LjUzMXYtOC4zNWg4LjUzMXYtMTIuNzQ2aDkuMjI1djEyLjc0NmgxNC45Mzl2OC4zNXptLTExNi45ODcgOC45NjNjLjk3Ni02LjA2NiA0LjY1OC0xMC4yMDEgMTEuMTY3LTEwLjIwMSA1Ljg4NSAwIDkuNjY4IDMuNjkyIDEwLjYzMyAxMC4yMDFoLTIxLjh6bTMxLjI5NyAzLjY5MmMtLjA5MS0xMy4wOTgtOC4xNzktMjIuMDYxLTE5Ljk1OS0yMi4wNjEtMTIuMzAzIDAtMjAuOTE1IDguOTYzLTIwLjkxNSAyMi4wNjEgMCAxMy4zNSA4Ljk2MyAyMi4wNTEgMjEuNTM4IDIyLjA1MSA2LjMyOCAwIDEyLjEyMi0xLjU3OSAxNy4yMjMtNS44ODVsLTQuNDg3LTYuNzdjLTMuNTExIDIuODE3LTcuOTk4IDQuMzk2LTEyLjIxMyA0LjM5Ni01Ljg4NSAwLTExLjI0Ny0yLjcyNi0xMi41NjUtMTAuMjgxaDMxLjE5NmMuMDkxLTEuMTQ3LjE4MS0yLjI4NC4xODEtMy41MTF6bTQwLjE1OS0xMC4yODFjLTIuNTQ1LTEuNTg5LTcuNzI2LTMuNjEyLTEzLjA4OC0zLjYxMi01LjAxIDAtNy45OTggMS44NTEtNy45OTggNC45MjkgMCAyLjgwNyAzLjE1OSAzLjYwMSA3LjExMiA0LjEyNWw0LjMwNi42MTRjOS4xNDQgMS4zMjggMTQuNjc3IDUuMTkxIDE0LjY3NyAxMi41NzUgMCA3Ljk5OC03LjAzMiAxMy43MTItMTkuMTU0IDEzLjcxMi02Ljg2MSAwLTEzLjE4OS0xLjc2LTE4LjE5OC01LjQ1Mmw0LjMwNi03LjEyMmMzLjA3OCAyLjM3NCA3LjY1NiA0LjM5NiAxMy45ODMgNC4zOTYgNi4yMzcgMCA5LjU3Ny0xLjg0MSA5LjU3Ny01LjEgMC0yLjM2NC0yLjM3NC0zLjY5Mi03LjM4NC00LjM4NmwtNC4zMDYtLjYxNGMtOS40MDYtMS4zMjgtMTQuNTA2LTUuNTQzLTE0LjUwNi0xMi4zOTQgMC04LjM1IDYuODYxLTEzLjQ1IDE3LjQ5NC0xMy40NSA2LjY4IDAgMTIuNzQ2IDEuNDk5IDE3LjEzMiA0LjM5NmwtMy45NTQgNy4zODR6bTExMi43MjItMy4wOThjLTEuODgxIDAtMy42MjIuMzMyLTUuMjQxLjk4Ni0xLjYxLjY2NC0zLjAwOCAxLjU4OS00LjE4NSAyLjc3Ny0xLjE3NyAxLjE4Ny0yLjEwMyAyLjYxNi0yLjc3NyA0LjI3NS0uNjc0IDEuNjYtMS4wMDYgMy40OTEtMS4wMDYgNS40ODMgMCAyLjAwMi4zMzIgMy44MjMgMS4wMDYgNS40ODMuNjc0IDEuNjYgMS42IDMuMDg4IDIuNzc3IDQuMjc1IDEuMTc3IDEuMTg3IDIuNTc1IDIuMTEzIDQuMTg1IDIuNzc3IDEuNjIuNjY0IDMuMzYuOTg2IDUuMjQxLjk4NiAxLjg4MSAwIDMuNjMyLS4zMjIgNS4yNDEtLjk4NiAxLjYyLS42NjQgMy4wMjgtMS41ODkgNC4yMDUtMi43NzcgMS4xOTctMS4xODcgMi4xMjMtMi42MTYgMi44MDctNC4yNzUuNjc0LTEuNjYgMS4wMDYtMy40ODEgMS4wMDYtNS40ODMgMC0xLjk5Mi0uMzMyLTMuODIzLTEuMDA2LTUuNDgzLS42ODQtMS42Ni0xLjYxLTMuMDg4LTIuODA3LTQuMjc1LTEuMTc3LTEuMTg3LTIuNTg1LTIuMTEzLTQuMjA1LTIuNzc3LTEuNjEtLjY1NC0zLjM2LS45ODYtNS4yNDEtLjk4NnptMC04LjY4MmMzLjI1OSAwIDYuMjc3LjU2MyA5LjA1NCAxLjcgMi43NzcgMS4xMjcgNS4xODEgMi42ODYgNy4yMDMgNC42NjggMi4wMzIgMS45ODIgMy42MTIgNC4zMjYgNC43NTggNy4wMjIgMS4xNDcgMi43MDYgMS43MiA1LjY0NCAxLjcyIDguODEzIDAgMy4xNjktLjU3MyA2LjEwNi0xLjcyIDguODEzLTEuMTQ3IDIuNjk2LTIuNzI2IDUuMDUtNC43NTggNy4wMzItMi4wMjIgMS45ODItNC40MjYgMy41MzEtNy4yMDMgNC42NjgtMi43NzcgMS4xMjctNS43OTUgMS42OS05LjA1NCAxLjY5LTMuMjU5IDAtNi4yNzctLjU2My05LjA1NC0xLjY5LTIuNzc3LTEuMTM3LTUuMTYxLTIuNjg2LTcuMTczLTQuNjY4LTIuMDEyLTEuOTgyLTMuNTkxLTQuMzM2LTQuNzM4LTcuMDMyLTEuMTQ3LTIuNzA2LTEuNzItNS42NDQtMS43Mi04LjgxMyAwLTMuMTY5LjU3My02LjEwNiAxLjcyLTguODEzIDEuMTQ3LTIuNjk2IDIuNzI2LTUuMDQgNC43MzgtNy4wMjIgMi4wMTItMS45ODIgNC4zOTYtMy41NDEgNy4xNzMtNC42NjggMi43NzctMS4xMzcgNS43OTUtMS43IDkuMDU0LTEuN3ptLTIzNy41NzYgMjIuMDYxYzAtNy4zODQgNC44MzktMTMuNDUgMTIuNzQ2LTEzLjQ1IDcuNTU1IDAgMTIuNjU1IDUuODA1IDEyLjY1NSAxMy40NSAwIDcuNjQ2LTUuMSAxMy40NC0xMi42NTUgMTMuNDQtNy45MDcgMC0xMi43NDYtNi4wNTYtMTIuNzQ2LTEzLjQ0em0zNC4wMTMgMHYtMjEuMDA1aC05LjEzNHY1LjFjLTIuOTA3LTMuNzgzLTcuMjkzLTYuMTU3LTEzLjI2OS02LjE1Ny0xMS43OCAwLTIxLjAwNSA5LjIyNS0yMS4wMDUgMjIuMDYxIDAgMTIuODI2IDkuMjI1IDIyLjA2MSAyMS4wMDUgMjIuMDYxIDUuOTc2IDAgMTAuMzYyLTIuMzc0IDEzLjI2OS02LjE1N3Y1LjFoOS4xMzR2LTIxLjAwNXptLTUxLjQ5NyAyMS4wMDV2LTI2LjM2N2MwLTkuOTI5LTYuMzI4LTE2LjYwOS0xNi41MTgtMTYuNy01LjM2Mi0uMDkxLTEwLjkwNSAxLjU3OS0xNC43NjggNy40NzUtMi44OTctNC42NTgtNy40NzUtNy40NzUtMTMuODkzLTcuNDc1LTQuNDc3IDAtOC44NzMgMS4zMTgtMTIuMzAzIDYuMjM3di01LjE4MWgtOS4xMzR2NDIuMDFoOS4yMjV2LTIzLjI4OWMwLTcuMjkzIDQuMDQ0LTExLjE2NyAxMC4yODEtMTEuMTY3IDYuMDY2IDAgOS4xNDQgMy45NTQgOS4xNDQgMTEuMDc2djIzLjM3OWg5LjIyNXYtMjMuMjg5YzAtNy4yOTMgNC4yMjUtMTEuMTY3IDEwLjI4MS0xMS4xNjcgNi4yNDcgMCA5LjIzNSAzLjk1NCA5LjIzNSAxMS4wNzZ2MjMuMzc5aDkuMjI1eiIgZmlsbD0iIzExMEYwRCIvPjwvc3ZnPg==');
+ background-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjM5OCIgdmlld0JveD0iMCAwIDUxMiAzOTgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPjxwYXRoIGZpbGw9IiM2QzZCQkQiIGQ9Ik0zMjUuMjIzIDI4Mi42MjloLTEzOC40NDV2LTI0OC44MDNoMTM4LjQ0NXoiLz48cGF0aCBkPSJNMTk1LjU2NSAxNTguMjMzYzAtNTAuNDcxIDIzLjYzMS05NS40MjkgNjAuNDMtMTI0LjQwMS0yNi45MS0yMS4xODYtNjAuODczLTMzLjgzMi05Ny43ODMtMzMuODMyLTg3LjM4MSAwLTE1OC4yMTMgNzAuODQyLTE1OC4yMTMgMTU4LjIzM3M3MC44MzIgMTU4LjIzMyAxNTguMjEzIDE1OC4yMzNjMzYuOTEgMCA3MC44NzItMTIuNjQ1IDk3Ljc4My0zMy44MzItMzYuNzk5LTI4Ljk3My02MC40My03My45MzEtNjAuNDMtMTI0LjQwMSIgZmlsbD0iI0QzMjAxMSIvPjxwYXRoIGQ9Ik01MTIgMTU4LjIzM2MwIDg3LjM5MS03MC44MzIgMTU4LjIzMy0xNTguMjEzIDE1OC4yMzMtMzYuOTEgMC03MC44NzItMTIuNjQ1LTk3Ljc5My0zMy44MzIgMzYuODA5LTI4Ljk3MyA2MC40NC03My45MzEgNjAuNDQtMTI0LjQwMSAwLTUwLjQ3MS0yMy42MzEtOTUuNDI5LTYwLjQ0LTEyNC40MDEgMjYuOTItMjEuMTg2IDYwLjg4My0zMy44MzIgOTcuNzkzLTMzLjgzMiA4Ny4zODEgMCAxNTguMjEzIDcwLjg0MiAxNTguMjEzIDE1OC4yMzMiIGZpbGw9IiMwMDk5REYiLz48cGF0aCBkPSJNMzcyLjA2NSAzNTIuOTM0YzEuODQxIDAgNC40ODcuMzUyIDYuNTA5IDEuMTQ3bC0yLjgxNyA4LjYxMWMtMS45MzItLjc5NS0zLjg2My0xLjA1Ni01LjcxNC0xLjA1Ni01Ljk3NiAwLTguOTYzIDMuODYzLTguOTYzIDEwLjgwNHYyMy41NmgtOS4xNDR2LTQyLjAxaDkuMDU0djUuMWMyLjM3NC0zLjY5MiA1LjgwNS02LjE1NyAxMS4wNzYtNi4xNTd6bS0zMy43ODEgOS40MDZoLTE0LjkzOXYxOC45ODNjMCA0LjIxNSAxLjQ4OSA3LjAzMiA2LjA2NiA3LjAzMiAyLjM3NCAwIDUuMzYyLS43OTUgOC4wNzgtMi4zNzRsMi42MzYgNy44MTdjLTIuODk3IDIuMDIyLTcuNDY0IDMuMjU5LTExLjQxOCAzLjI1OS0xMC44MTQgMC0xNC41ODctNS44MDUtMTQuNTg3LTE1LjU2M3YtMTkuMTU0aC04LjUzMXYtOC4zNWg4LjUzMXYtMTIuNzQ2aDkuMjI1djEyLjc0NmgxNC45Mzl2OC4zNXptLTExNi45ODcgOC45NjNjLjk3Ni02LjA2NiA0LjY1OC0xMC4yMDEgMTEuMTY3LTEwLjIwMSA1Ljg4NSAwIDkuNjY4IDMuNjkyIDEwLjYzMyAxMC4yMDFoLTIxLjh6bTMxLjI5NyAzLjY5MmMtLjA5MS0xMy4wOTgtOC4xNzktMjIuMDYxLTE5Ljk1OS0yMi4wNjEtMTIuMzAzIDAtMjAuOTE1IDguOTYzLTIwLjkxNSAyMi4wNjEgMCAxMy4zNSA4Ljk2MyAyMi4wNTEgMjEuNTM4IDIyLjA1MSA2LjMyOCAwIDEyLjEyMi0xLjU3OSAxNy4yMjMtNS44ODVsLTQuNDg3LTYuNzdjLTMuNTExIDIuODE3LTcuOTk4IDQuMzk2LTEyLjIxMyA0LjM5Ni01Ljg4NSAwLTExLjI0Ny0yLjcyNi0xMi41NjUtMTAuMjgxaDMxLjE5NmMuMDkxLTEuMTQ3LjE4MS0yLjI4NC4xODEtMy41MTF6bTQwLjE1OS0xMC4yODFjLTIuNTQ1LTEuNTg5LTcuNzI2LTMuNjEyLTEzLjA4OC0zLjYxMi01LjAxIDAtNy45OTggMS44NTEtNy45OTggNC45MjkgMCAyLjgwNyAzLjE1OSAzLjYwMSA3LjExMiA0LjEyNWw0LjMwNi42MTRjOS4xNDQgMS4zMjggMTQuNjc3IDUuMTkxIDE0LjY3NyAxMi41NzUgMCA3Ljk5OC03LjAzMiAxMy43MTItMTkuMTU0IDEzLjcxMi02Ljg2MSAwLTEzLjE4OS0xLjc2LTE4LjE5OC01LjQ1Mmw0LjMwNi03LjEyMmMzLjA3OCAyLjM3NCA3LjY1NiA0LjM5NiAxMy45ODMgNC4zOTYgNi4yMzcgMCA5LjU3Ny0xLjg0MSA5LjU3Ny01LjEgMC0yLjM2NC0yLjM3NC0zLjY5Mi03LjM4NC00LjM4NmwtNC4zMDYtLjYxNGMtOS40MDYtMS4zMjgtMTQuNTA2LTUuNTQzLTE0LjUwNi0xMi4zOTQgMC04LjM1IDYuODYxLTEzLjQ1IDE3LjQ5NC0xMy40NSA2LjY4IDAgMTIuNzQ2IDEuNDk5IDE3LjEzMiA0LjM5NmwtMy45NTQgNy4zODR6bTExMi43MjItMy4wOThjLTEuODgxIDAtMy42MjIuMzMyLTUuMjQxLjk4Ni0xLjYxLjY2NC0zLjAwOCAxLjU4OS00LjE4NSAyLjc3Ny0xLjE3NyAxLjE4Ny0yLjEwMyAyLjYxNi0yLjc3NyA0LjI3NS0uNjc0IDEuNjYtMS4wMDYgMy40OTEtMS4wMDYgNS40ODMgMCAyLjAwMi4zMzIgMy44MjMgMS4wMDYgNS40ODMuNjc0IDEuNjYgMS42IDMuMDg4IDIuNzc3IDQuMjc1IDEuMTc3IDEuMTg3IDIuNTc1IDIuMTEzIDQuMTg1IDIuNzc3IDEuNjIuNjY0IDMuMzYuOTg2IDUuMjQxLjk4NiAxLjg4MSAwIDMuNjMyLS4zMjIgNS4yNDEtLjk4NiAxLjYyLS42NjQgMy4wMjgtMS41ODkgNC4yMDUtMi43NzcgMS4xOTctMS4xODcgMi4xMjMtMi42MTYgMi44MDctNC4yNzUuNjc0LTEuNjYgMS4wMDYtMy40ODEgMS4wMDYtNS40ODMgMC0xLjk5Mi0uMzMyLTMuODIzLTEuMDA2LTUuNDgzLS42ODQtMS42Ni0xLjYxLTMuMDg4LTIuODA3LTQuMjc1LTEuMTc3LTEuMTg3LTIuNTg1LTIuMTEzLTQuMjA1LTIuNzc3LTEuNjEtLjY1NC0zLjM2LS45ODYtNS4yNDEtLjk4NnptMC04LjY4MmMzLjI1OSAwIDYuMjc3LjU2MyA5LjA1NCAxLjcgMi43NzcgMS4xMjcgNS4xODEgMi42ODYgNy4yMDMgNC42NjggMi4wMzIgMS45ODIgMy42MTIgNC4zMjYgNC43NTggNy4wMjIgMS4xNDcgMi43MDYgMS43MiA1LjY0NCAxLjcyIDguODEzIDAgMy4xNjktLjU3MyA2LjEwNi0xLjcyIDguODEzLTEuMTQ3IDIuNjk2LTIuNzI2IDUuMDUtNC43NTggNy4wMzItMi4wMjIgMS45ODItNC40MjYgMy41MzEtNy4yMDMgNC42NjgtMi43NzcgMS4xMjctNS43OTUgMS42OS05LjA1NCAxLjY5LTMuMjU5IDAtNi4yNzctLjU2My05LjA1NC0xLjY5LTIuNzc3LTEuMTM3LTUuMTYxLTIuNjg2LTcuMTczLTQuNjY4LTIuMDEyLTEuOTgyLTMuNTkxLTQuMzM2LTQuNzM4LTcuMDMyLTEuMTQ3LTIuNzA2LTEuNzItNS42NDQtMS43Mi04LjgxMyAwLTMuMTY5LjU3My02LjEwNiAxLjcyLTguODEzIDEuMTQ3LTIuNjk2IDIuNzI2LTUuMDQgNC43MzgtNy4wMjIgMi4wMTItMS45ODIgNC4zOTYtMy41NDEgNy4xNzMtNC42NjggMi43NzctMS4xMzcgNS43OTUtMS43IDkuMDU0LTEuN3ptLTIzNy41NzYgMjIuMDYxYzAtNy4zODQgNC44MzktMTMuNDUgMTIuNzQ2LTEzLjQ1IDcuNTU1IDAgMTIuNjU1IDUuODA1IDEyLjY1NSAxMy40NSAwIDcuNjQ2LTUuMSAxMy40NC0xMi42NTUgMTMuNDQtNy45MDcgMC0xMi43NDYtNi4wNTYtMTIuNzQ2LTEzLjQ0em0zNC4wMTMgMHYtMjEuMDA1aC05LjEzNHY1LjFjLTIuOTA3LTMuNzgzLTcuMjkzLTYuMTU3LTEzLjI2OS02LjE1Ny0xMS43OCAwLTIxLjAwNSA5LjIyNS0yMS4wMDUgMjIuMDYxIDAgMTIuODI2IDkuMjI1IDIyLjA2MSAyMS4wMDUgMjIuMDYxIDUuOTc2IDAgMTAuMzYyLTIuMzc0IDEzLjI2OS02LjE1N3Y1LjFoOS4xMzR2LTIxLjAwNXptLTUxLjQ5NyAyMS4wMDV2LTI2LjM2N2MwLTkuOTI5LTYuMzI4LTE2LjYwOS0xNi41MTgtMTYuNy01LjM2Mi0uMDkxLTEwLjkwNSAxLjU3OS0xNC43NjggNy40NzUtMi44OTctNC42NTgtNy40NzUtNy40NzUtMTMuODkzLTcuNDc1LTQuNDc3IDAtOC44NzMgMS4zMTgtMTIuMzAzIDYuMjM3di01LjE4MWgtOS4xMzR2NDIuMDFoOS4yMjV2LTIzLjI4OWMwLTcuMjkzIDQuMDQ0LTExLjE2NyAxMC4yODEtMTEuMTY3IDYuMDY2IDAgOS4xNDQgMy45NTQgOS4xNDQgMTEuMDc2djIzLjM3OWg5LjIyNXYtMjMuMjg5YzAtNy4yOTMgNC4yMjUtMTEuMTY3IDEwLjI4MS0xMS4xNjcgNi4yNDcgMCA5LjIzNSAzLjk1NCA5LjIzNSAxMS4wNzZ2MjMuMzc5aDkuMjI1eiIgZmlsbD0iIzExMEYwRCIvPjwvc3ZnPg==");
}
.rccs__card--mastercard .rccs__issuer {
- background-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjM5NyIgdmlld0JveD0iMCAwIDUxMiAzOTciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPjxwYXRoIGQ9Ik05My4wNzkgMzk2LjAyM3YtMjYuMzQzYzAtMTAuMDk4LTYuMTQ3LTE2LjY4NC0xNi42ODQtMTYuNjg0LTUuMjY5IDAtMTAuOTc2IDEuNzU2LTE0LjkyOCA3LjQ2NC0zLjA3My00LjgzLTcuNDY0LTcuNDY0LTE0LjA1LTcuNDY0LTQuMzkgMC04Ljc4MSAxLjMxNy0xMi4yOTMgNi4xNDd2LTUuMjY5aC05LjIydjQyLjE0OWg5LjIydi0yMy4yN2MwLTcuNDY0IDMuOTUxLTEwLjk3NiAxMC4wOTgtMTAuOTc2czkuMjIgMy45NTEgOS4yMiAxMC45NzZ2MjMuMjdoOS4yMnYtMjMuMjdjMC03LjQ2NCA0LjM5LTEwLjk3NiAxMC4wOTgtMTAuOTc2IDYuMTQ3IDAgOS4yMiAzLjk1MSA5LjIyIDEwLjk3NnYyMy4yN2gxMC4wOTh6bTEzNi41NDQtNDIuMTQ5aC0xNC45Mjh2LTEyLjczMmgtOS4yMnYxMi43MzJoLTguMzQydjguMzQyaDguMzQydjE5LjMxOGMwIDkuNjU5IDMuOTUxIDE1LjM2NyAxNC40ODkgMTUuMzY3IDMuOTUxIDAgOC4zNDItMS4zMTcgMTEuNDE1LTMuMDczbC0yLjYzNC03LjkwM2MtMi42MzQgMS43NTYtNS43MDggMi4xOTUtNy45MDMgMi4xOTUtNC4zOSAwLTYuMTQ3LTIuNjM0LTYuMTQ3LTcuMDI1di0xOC44NzloMTQuOTI4di04LjM0MnptNzguMTUxLS44NzhjLTUuMjY5IDAtOC43ODEgMi42MzQtMTAuOTc2IDYuMTQ3di01LjI2OWgtOS4yMnY0Mi4xNDloOS4yMnYtMjMuNzA5YzAtNy4wMjUgMy4wNzMtMTAuOTc2IDguNzgxLTEwLjk3NiAxLjc1NiAwIDMuOTUxLjQzOSA1LjcwOC44NzhsMi42MzQtOC43ODFjLTEuNzU2LS40MzktNC4zOS0uNDM5LTYuMTQ3LS40Mzl6bS0xMTguMTA0IDQuMzljLTQuMzktMy4wNzMtMTAuNTM3LTQuMzktMTcuMTIzLTQuMzktMTAuNTM3IDAtMTcuNTYyIDUuMjY5LTE3LjU2MiAxMy42MTEgMCA3LjAyNSA1LjI2OSAxMC45NzYgMTQuNDg5IDEyLjI5M2w0LjM5LjQzOWM0LjgzLjg3OCA3LjQ2NCAyLjE5NSA3LjQ2NCA0LjM5IDAgMy4wNzMtMy41MTIgNS4yNjktOS42NTkgNS4yNjlzLTEwLjk3Ni0yLjE5NS0xNC4wNS00LjM5bC00LjM5IDcuMDI1YzQuODMgMy41MTIgMTEuNDE1IDUuMjY5IDE4LjAwMSA1LjI2OSAxMi4yOTMgMCAxOS4zMTgtNS43MDggMTkuMzE4LTEzLjYxMSAwLTcuNDY0LTUuNzA4LTExLjQxNS0xNC40ODktMTIuNzMybC00LjM5LS40MzljLTMuOTUxLS40MzktNy4wMjUtMS4zMTctNy4wMjUtMy45NTEgMC0zLjA3MyAzLjA3My00LjgzIDcuOTAzLTQuODMgNS4yNjkgMCAxMC41MzcgMi4xOTUgMTMuMTcxIDMuNTEybDMuOTUxLTcuNDY0em0yNDQuOTktNC4zOWMtNS4yNjkgMC04Ljc4MSAyLjYzNC0xMC45NzYgNi4xNDd2LTUuMjY5aC05LjIydjQyLjE0OWg5LjIydi0yMy43MDljMC03LjAyNSAzLjA3My0xMC45NzYgOC43ODEtMTAuOTc2IDEuNzU2IDAgMy45NTEuNDM5IDUuNzA4Ljg3OGwyLjYzNC04Ljc4MWMtMS43NTYtLjQzOS00LjM5LS40MzktNi4xNDctLjQzOXptLTExNy42NjUgMjEuOTUyYzAgMTIuNzMyIDguNzgxIDIxLjk1MiAyMi4zOTIgMjEuOTUyIDYuMTQ3IDAgMTAuNTM3LTEuMzE3IDE0LjkyOC00LjgzbC00LjM5LTcuNDY0Yy0zLjUxMiAyLjYzNC03LjAyNSAzLjk1MS0xMC45NzYgMy45NTEtNy40NjQgMC0xMi43MzItNS4yNjktMTIuNzMyLTEzLjYxMSAwLTcuOTAzIDUuMjY5LTEzLjE3MSAxMi43MzItMTMuNjExIDMuOTUxIDAgNy40NjQgMS4zMTcgMTAuOTc2IDMuOTUxbDQuMzktNy40NjRjLTQuMzktMy41MTItOC43ODEtNC44My0xNC45MjgtNC44My0xMy42MTEgMC0yMi4zOTIgOS4yMi0yMi4zOTIgMjEuOTUyem04NS4xNzYgMHYtMjEuMDc0aC05LjIydjUuMjY5Yy0zLjA3My0zLjk1MS03LjQ2NC02LjE0Ny0xMy4xNzEtNi4xNDctMTEuODU0IDAtMjEuMDc0IDkuMjItMjEuMDc0IDIxLjk1MiAwIDEyLjczMiA5LjIyIDIxLjk1MiAyMS4wNzQgMjEuOTUyIDYuMTQ3IDAgMTAuNTM3LTIuMTk1IDEzLjE3MS02LjE0N3Y1LjI2OWg5LjIydi0yMS4wNzR6bS0zMy44MDcgMGMwLTcuNDY0IDQuODMtMTMuNjExIDEyLjczMi0xMy42MTEgNy40NjQgMCAxMi43MzIgNS43MDggMTIuNzMyIDEzLjYxMSAwIDcuNDY0LTUuMjY5IDEzLjYxMS0xMi43MzIgMTMuNjExLTcuOTAzLS40MzktMTIuNzMyLTYuMTQ3LTEyLjczMi0xMy42MTF6bS0xMTAuMjAxLTIxLjk1MmMtMTIuMjkzIDAtMjEuMDc0IDguNzgxLTIxLjA3NCAyMS45NTIgMCAxMy4xNzEgOC43ODEgMjEuOTUyIDIxLjUxMyAyMS45NTIgNi4xNDcgMCAxMi4yOTMtMS43NTYgMTcuMTIzLTUuNzA4bC00LjM5LTYuNTg2Yy0zLjUxMiAyLjYzNC03LjkwMyA0LjM5LTEyLjI5MyA0LjM5LTUuNzA4IDAtMTEuNDE1LTIuNjM0LTEyLjczMi0xMC4wOThoMzEuMTczdi0zLjUxMmMuNDM5LTEzLjYxMS03LjQ2NC0yMi4zOTItMTkuMzE4LTIyLjM5MnptMCA3LjkwM2M1LjcwOCAwIDkuNjU5IDMuNTEyIDEwLjUzNyAxMC4wOThoLTIxLjk1MmMuODc4LTUuNzA4IDQuODMtMTAuMDk4IDExLjQxNS0xMC4wOTh6bTIyOC43NDUgMTQuMDV2LTM3Ljc1OGgtOS4yMnYyMS45NTJjLTMuMDczLTMuOTUxLTcuNDY0LTYuMTQ3LTEzLjE3MS02LjE0Ny0xMS44NTQgMC0yMS4wNzQgOS4yMi0yMS4wNzQgMjEuOTUyIDAgMTIuNzMyIDkuMjIgMjEuOTUyIDIxLjA3NCAyMS45NTIgNi4xNDcgMCAxMC41MzctMi4xOTUgMTMuMTcxLTYuMTQ3djUuMjY5aDkuMjJ2LTIxLjA3NHptLTMzLjgwNyAwYzAtNy40NjQgNC44My0xMy42MTEgMTIuNzMyLTEzLjYxMSA3LjQ2NCAwIDEyLjczMiA1LjcwOCAxMi43MzIgMTMuNjExIDAgNy40NjQtNS4yNjkgMTMuNjExLTEyLjczMiAxMy42MTEtNy45MDMtLjQzOS0xMi43MzItNi4xNDctMTIuNzMyLTEzLjYxMXptLTMwOC4yMTMgMHYtMjEuMDc0aC05LjIydjUuMjY5Yy0zLjA3My0zLjk1MS03LjQ2NC02LjE0Ny0xMy4xNzEtNi4xNDctMTEuODU0IDAtMjEuMDc0IDkuMjItMjEuMDc0IDIxLjk1MiAwIDEyLjczMiA5LjIyIDIxLjk1MiAyMS4wNzQgMjEuOTUyIDYuMTQ3IDAgMTAuNTM3LTIuMTk1IDEzLjE3MS02LjE0N3Y1LjI2OWg5LjIydi0yMS4wNzR6bS0zNC4yNDYgMGMwLTcuNDY0IDQuODMtMTMuNjExIDEyLjczMi0xMy42MTEgNy40NjQgMCAxMi43MzIgNS43MDggMTIuNzMyIDEzLjYxMSAwIDcuNDY0LTUuMjY5IDEzLjYxMS0xMi43MzIgMTMuNjExLTcuOTAzLS40MzktMTIuNzMyLTYuMTQ3LTEyLjczMi0xMy42MTF6Ii8+PHBhdGggZmlsbD0iI0ZGNUYwMCIgZD0iTTE4Ni41OTYgMzMuODA3aDEzOC4zMDF2MjQ4LjUwMmgtMTM4LjMwMXoiLz48cGF0aCBkPSJNMTk1LjM3NyAxNTguMDU4YzAtNTAuNDkxIDIzLjcwOS05NS4yNzQgNjAuMTUtMTI0LjI1MS0yNi43ODItMjEuMDc0LTYwLjU4OS0zMy44MDctOTcuNDY5LTMzLjgwNy04Ny4zNzEgMC0xNTguMDU4IDcwLjY4Ny0xNTguMDU4IDE1OC4wNThzNzAuNjg3IDE1OC4wNTggMTU4LjA1OCAxNTguMDU4YzM2Ljg4IDAgNzAuNjg3LTEyLjczMiA5Ny40NjktMzMuODA3LTM2LjQ0MS0yOC41MzgtNjAuMTUtNzMuNzYtNjAuMTUtMTI0LjI1MXoiIGZpbGw9IiNFQjAwMUIiLz48cGF0aCBkPSJNNTExLjQ5MyAxNTguMDU4YzAgODcuMzcxLTcwLjY4NyAxNTguMDU4LTE1OC4wNTggMTU4LjA1OC0zNi44OCAwLTcwLjY4Ny0xMi43MzItOTcuNDY5LTMzLjgwNyAzNi44OC0yOC45NzcgNjAuMTUtNzMuNzYgNjAuMTUtMTI0LjI1MXMtMjMuNzA5LTk1LjI3NC02MC4xNS0xMjQuMjUxYzI2Ljc4Mi0yMS4wNzQgNjAuNTg5LTMzLjgwNyA5Ny40NjktMzMuODA3IDg3LjM3MSAwIDE1OC4wNTggNzEuMTI2IDE1OC4wNTggMTU4LjA1OHoiIGZpbGw9IiNGNzlFMUIiLz48L3N2Zz4=');
+ background-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjM5NyIgdmlld0JveD0iMCAwIDUxMiAzOTciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPjxwYXRoIGQ9Ik05My4wNzkgMzk2LjAyM3YtMjYuMzQzYzAtMTAuMDk4LTYuMTQ3LTE2LjY4NC0xNi42ODQtMTYuNjg0LTUuMjY5IDAtMTAuOTc2IDEuNzU2LTE0LjkyOCA3LjQ2NC0zLjA3My00LjgzLTcuNDY0LTcuNDY0LTE0LjA1LTcuNDY0LTQuMzkgMC04Ljc4MSAxLjMxNy0xMi4yOTMgNi4xNDd2LTUuMjY5aC05LjIydjQyLjE0OWg5LjIydi0yMy4yN2MwLTcuNDY0IDMuOTUxLTEwLjk3NiAxMC4wOTgtMTAuOTc2czkuMjIgMy45NTEgOS4yMiAxMC45NzZ2MjMuMjdoOS4yMnYtMjMuMjdjMC03LjQ2NCA0LjM5LTEwLjk3NiAxMC4wOTgtMTAuOTc2IDYuMTQ3IDAgOS4yMiAzLjk1MSA5LjIyIDEwLjk3NnYyMy4yN2gxMC4wOTh6bTEzNi41NDQtNDIuMTQ5aC0xNC45Mjh2LTEyLjczMmgtOS4yMnYxMi43MzJoLTguMzQydjguMzQyaDguMzQydjE5LjMxOGMwIDkuNjU5IDMuOTUxIDE1LjM2NyAxNC40ODkgMTUuMzY3IDMuOTUxIDAgOC4zNDItMS4zMTcgMTEuNDE1LTMuMDczbC0yLjYzNC03LjkwM2MtMi42MzQgMS43NTYtNS43MDggMi4xOTUtNy45MDMgMi4xOTUtNC4zOSAwLTYuMTQ3LTIuNjM0LTYuMTQ3LTcuMDI1di0xOC44NzloMTQuOTI4di04LjM0MnptNzguMTUxLS44NzhjLTUuMjY5IDAtOC43ODEgMi42MzQtMTAuOTc2IDYuMTQ3di01LjI2OWgtOS4yMnY0Mi4xNDloOS4yMnYtMjMuNzA5YzAtNy4wMjUgMy4wNzMtMTAuOTc2IDguNzgxLTEwLjk3NiAxLjc1NiAwIDMuOTUxLjQzOSA1LjcwOC44NzhsMi42MzQtOC43ODFjLTEuNzU2LS40MzktNC4zOS0uNDM5LTYuMTQ3LS40Mzl6bS0xMTguMTA0IDQuMzljLTQuMzktMy4wNzMtMTAuNTM3LTQuMzktMTcuMTIzLTQuMzktMTAuNTM3IDAtMTcuNTYyIDUuMjY5LTE3LjU2MiAxMy42MTEgMCA3LjAyNSA1LjI2OSAxMC45NzYgMTQuNDg5IDEyLjI5M2w0LjM5LjQzOWM0LjgzLjg3OCA3LjQ2NCAyLjE5NSA3LjQ2NCA0LjM5IDAgMy4wNzMtMy41MTIgNS4yNjktOS42NTkgNS4yNjlzLTEwLjk3Ni0yLjE5NS0xNC4wNS00LjM5bC00LjM5IDcuMDI1YzQuODMgMy41MTIgMTEuNDE1IDUuMjY5IDE4LjAwMSA1LjI2OSAxMi4yOTMgMCAxOS4zMTgtNS43MDggMTkuMzE4LTEzLjYxMSAwLTcuNDY0LTUuNzA4LTExLjQxNS0xNC40ODktMTIuNzMybC00LjM5LS40MzljLTMuOTUxLS40MzktNy4wMjUtMS4zMTctNy4wMjUtMy45NTEgMC0zLjA3MyAzLjA3My00LjgzIDcuOTAzLTQuODMgNS4yNjkgMCAxMC41MzcgMi4xOTUgMTMuMTcxIDMuNTEybDMuOTUxLTcuNDY0em0yNDQuOTktNC4zOWMtNS4yNjkgMC04Ljc4MSAyLjYzNC0xMC45NzYgNi4xNDd2LTUuMjY5aC05LjIydjQyLjE0OWg5LjIydi0yMy43MDljMC03LjAyNSAzLjA3My0xMC45NzYgOC43ODEtMTAuOTc2IDEuNzU2IDAgMy45NTEuNDM5IDUuNzA4Ljg3OGwyLjYzNC04Ljc4MWMtMS43NTYtLjQzOS00LjM5LS40MzktNi4xNDctLjQzOXptLTExNy42NjUgMjEuOTUyYzAgMTIuNzMyIDguNzgxIDIxLjk1MiAyMi4zOTIgMjEuOTUyIDYuMTQ3IDAgMTAuNTM3LTEuMzE3IDE0LjkyOC00LjgzbC00LjM5LTcuNDY0Yy0zLjUxMiAyLjYzNC03LjAyNSAzLjk1MS0xMC45NzYgMy45NTEtNy40NjQgMC0xMi43MzItNS4yNjktMTIuNzMyLTEzLjYxMSAwLTcuOTAzIDUuMjY5LTEzLjE3MSAxMi43MzItMTMuNjExIDMuOTUxIDAgNy40NjQgMS4zMTcgMTAuOTc2IDMuOTUxbDQuMzktNy40NjRjLTQuMzktMy41MTItOC43ODEtNC44My0xNC45MjgtNC44My0xMy42MTEgMC0yMi4zOTIgOS4yMi0yMi4zOTIgMjEuOTUyem04NS4xNzYgMHYtMjEuMDc0aC05LjIydjUuMjY5Yy0zLjA3My0zLjk1MS03LjQ2NC02LjE0Ny0xMy4xNzEtNi4xNDctMTEuODU0IDAtMjEuMDc0IDkuMjItMjEuMDc0IDIxLjk1MiAwIDEyLjczMiA5LjIyIDIxLjk1MiAyMS4wNzQgMjEuOTUyIDYuMTQ3IDAgMTAuNTM3LTIuMTk1IDEzLjE3MS02LjE0N3Y1LjI2OWg5LjIydi0yMS4wNzR6bS0zMy44MDcgMGMwLTcuNDY0IDQuODMtMTMuNjExIDEyLjczMi0xMy42MTEgNy40NjQgMCAxMi43MzIgNS43MDggMTIuNzMyIDEzLjYxMSAwIDcuNDY0LTUuMjY5IDEzLjYxMS0xMi43MzIgMTMuNjExLTcuOTAzLS40MzktMTIuNzMyLTYuMTQ3LTEyLjczMi0xMy42MTF6bS0xMTAuMjAxLTIxLjk1MmMtMTIuMjkzIDAtMjEuMDc0IDguNzgxLTIxLjA3NCAyMS45NTIgMCAxMy4xNzEgOC43ODEgMjEuOTUyIDIxLjUxMyAyMS45NTIgNi4xNDcgMCAxMi4yOTMtMS43NTYgMTcuMTIzLTUuNzA4bC00LjM5LTYuNTg2Yy0zLjUxMiAyLjYzNC03LjkwMyA0LjM5LTEyLjI5MyA0LjM5LTUuNzA4IDAtMTEuNDE1LTIuNjM0LTEyLjczMi0xMC4wOThoMzEuMTczdi0zLjUxMmMuNDM5LTEzLjYxMS03LjQ2NC0yMi4zOTItMTkuMzE4LTIyLjM5MnptMCA3LjkwM2M1LjcwOCAwIDkuNjU5IDMuNTEyIDEwLjUzNyAxMC4wOThoLTIxLjk1MmMuODc4LTUuNzA4IDQuODMtMTAuMDk4IDExLjQxNS0xMC4wOTh6bTIyOC43NDUgMTQuMDV2LTM3Ljc1OGgtOS4yMnYyMS45NTJjLTMuMDczLTMuOTUxLTcuNDY0LTYuMTQ3LTEzLjE3MS02LjE0Ny0xMS44NTQgMC0yMS4wNzQgOS4yMi0yMS4wNzQgMjEuOTUyIDAgMTIuNzMyIDkuMjIgMjEuOTUyIDIxLjA3NCAyMS45NTIgNi4xNDcgMCAxMC41MzctMi4xOTUgMTMuMTcxLTYuMTQ3djUuMjY5aDkuMjJ2LTIxLjA3NHptLTMzLjgwNyAwYzAtNy40NjQgNC44My0xMy42MTEgMTIuNzMyLTEzLjYxMSA3LjQ2NCAwIDEyLjczMiA1LjcwOCAxMi43MzIgMTMuNjExIDAgNy40NjQtNS4yNjkgMTMuNjExLTEyLjczMiAxMy42MTEtNy45MDMtLjQzOS0xMi43MzItNi4xNDctMTIuNzMyLTEzLjYxMXptLTMwOC4yMTMgMHYtMjEuMDc0aC05LjIydjUuMjY5Yy0zLjA3My0zLjk1MS03LjQ2NC02LjE0Ny0xMy4xNzEtNi4xNDctMTEuODU0IDAtMjEuMDc0IDkuMjItMjEuMDc0IDIxLjk1MiAwIDEyLjczMiA5LjIyIDIxLjk1MiAyMS4wNzQgMjEuOTUyIDYuMTQ3IDAgMTAuNTM3LTIuMTk1IDEzLjE3MS02LjE0N3Y1LjI2OWg5LjIydi0yMS4wNzR6bS0zNC4yNDYgMGMwLTcuNDY0IDQuODMtMTMuNjExIDEyLjczMi0xMy42MTEgNy40NjQgMCAxMi43MzIgNS43MDggMTIuNzMyIDEzLjYxMSAwIDcuNDY0LTUuMjY5IDEzLjYxMS0xMi43MzIgMTMuNjExLTcuOTAzLS40MzktMTIuNzMyLTYuMTQ3LTEyLjczMi0xMy42MTF6Ii8+PHBhdGggZmlsbD0iI0ZGNUYwMCIgZD0iTTE4Ni41OTYgMzMuODA3aDEzOC4zMDF2MjQ4LjUwMmgtMTM4LjMwMXoiLz48cGF0aCBkPSJNMTk1LjM3NyAxNTguMDU4YzAtNTAuNDkxIDIzLjcwOS05NS4yNzQgNjAuMTUtMTI0LjI1MS0yNi43ODItMjEuMDc0LTYwLjU4OS0zMy44MDctOTcuNDY5LTMzLjgwNy04Ny4zNzEgMC0xNTguMDU4IDcwLjY4Ny0xNTguMDU4IDE1OC4wNThzNzAuNjg3IDE1OC4wNTggMTU4LjA1OCAxNTguMDU4YzM2Ljg4IDAgNzAuNjg3LTEyLjczMiA5Ny40NjktMzMuODA3LTM2LjQ0MS0yOC41MzgtNjAuMTUtNzMuNzYtNjAuMTUtMTI0LjI1MXoiIGZpbGw9IiNFQjAwMUIiLz48cGF0aCBkPSJNNTExLjQ5MyAxNTguMDU4YzAgODcuMzcxLTcwLjY4NyAxNTguMDU4LTE1OC4wNTggMTU4LjA1OC0zNi44OCAwLTcwLjY4Ny0xMi43MzItOTcuNDY5LTMzLjgwNyAzNi44OC0yOC45NzcgNjAuMTUtNzMuNzYgNjAuMTUtMTI0LjI1MXMtMjMuNzA5LTk1LjI3NC02MC4xNS0xMjQuMjUxYzI2Ljc4Mi0yMS4wNzQgNjAuNTg5LTMzLjgwNyA5Ny40NjktMzMuODA3IDg3LjM3MSAwIDE1OC4wNTggNzEuMTI2IDE1OC4wNTggMTU4LjA1OHoiIGZpbGw9IiNGNzlFMUIiLz48L3N2Zz4=");
}
.rccs__card--unionpay .rccs__issuer {
- background-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjMyMCIgdmlld0JveD0iMCAwIDUxMiAzMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPjxwYXRoIGQ9Ik0xMDAuMDgzLjAwMWgxMjcuNTU3YzE3LjgwNiAwIDI4Ljg4IDE0LjUxMyAyNC43MjcgMzIuMzc4bC01OS4zODcgMjU0Ljk3MWMtNC4xOTEgMTcuODAzLTIyLjAxOSAzMi4zMjgtMzkuODM3IDMyLjMyOGgtMTI3LjU0NWMtMTcuNzgxIDAtMjguODgtMTQuNTI2LTI0LjcyNy0zMi4zMjhsNTkuNDEyLTI1NC45NzFjNC4xNTQtMTcuODY1IDIxLjk3Mi0zMi4zNzggMzkuOC0zMi4zNzgiIGZpbGw9IiNFMjE4MzYiLz48cGF0aCBkPSJNMjE3LjAyNy4wMDFoMTQ2LjY4N2MxNy44MDMgMCA5Ljc3NSAxNC41MTMgNS41ODcgMzIuMzc4bC01OS4zNzggMjU0Ljk3MWMtNC4xNjYgMTcuODAzLTIuODY3IDMyLjMyOC0yMC43MDcgMzIuMzI4aC0xNDYuNjg3Yy0xNy44NCAwLTI4Ljg4LTE0LjUyNi0yNC42ODktMzIuMzI4bDU5LjM3NS0yNTQuOTcxYzQuMjE2LTE3Ljg2NSAyMS45OTctMzIuMzc4IDM5LjgxMi0zMi4zNzgiIGZpbGw9IiMwMDQ0N0MiLz48cGF0aCBkPSJNMzU3Ljg5Ni4wMDFoMTI3LjU1N2MxNy44MzEgMCAyOC45MDUgMTQuNTEzIDI0LjcxNyAzMi4zNzhsLTU5LjM3OCAyNTQuOTcxYy00LjE5MSAxNy44MDMtMjIuMDMxIDMyLjMyOC0zOS44NTkgMzIuMzI4aC0xMjcuNDk4Yy0xNy44NCAwLTI4LjkwNS0xNC41MjYtMjQuNzI3LTMyLjMyOGw1OS4zODctMjU0Ljk3MWM0LjE1NC0xNy44NjUgMjEuOTYtMzIuMzc4IDM5LjgtMzIuMzc4IiBmaWxsPSIjMDA3Qjg0Ii8+PHBhdGggZD0iTTEzMy4zOTcgODEuNzEyYy0xMy4xMTcuMTM0LTE2Ljk5MSAwLTE4LjIyOS0uMjkyLS40NzYgMi4yNi05LjMyNyA0My4wOTItOS4zNTIgNDMuMTI2LTEuOTA2IDguMjYxLTMuMjkzIDE0LjE1LTguMDAzIDE3Ljk1Mi0yLjY3NCAyLjIxMS01Ljc5NSAzLjI3Ny05LjQxNCAzLjI3Ny01LjgxNyAwLTkuMjA2LTIuODg4LTkuNzc1LTguMzY3bC0uMTA5LTEuODgxczEuNzcyLTExLjA2NSAxLjc3Mi0xMS4xMjdjMCAwIDkuMjktMzcuMjEgMTAuOTUzLTQyLjEyOC4wODctLjI4LjExMi0uNDI2LjEzNC0uNTYtMTguMDgzLjE1OS0yMS4yODggMC0yMS41MDktLjI5Mi0uMTIxLjQwMS0uNTY5IDIuNzA4LS41NjkgMi43MDhsLTkuNDg2IDQxLjkzOS0uODE1IDMuNTU3LTEuNTc2IDExLjYzNGMwIDMuNDUxLjY3OCA2LjI2OCAyLjAyNyA4LjY1IDQuMzIyIDcuNTUyIDE2LjY0OSA4LjY4NCAyMy42MjMgOC42ODQgOC45ODUgMCAxNy40MTQtMS45MDkgMjMuMTEtNS4zOTQgOS44ODctNS44NDIgMTIuNDc0LTE0Ljk3MyAxNC43ODEtMjMuMDg4bDEuMDctNC4xNjNzOS41Ny0zOC42NDYgMTEuMTk2LTQzLjY3NGMuMDYyLS4yOC4wODctLjQyNi4xNzEtLjU2em0zMi41NjEgMzEuMTc2Yy0yLjMwNyAwLTYuNTIzLjU2LTEwLjMxIDIuNDE2LTEuMzc0LjcwNi0yLjY3NCAxLjUyLTQuMDQ1IDIuMzMybDEuMjM3LTQuNDY4LS42NzgtLjc1MmMtOC4wMzEgMS42MjYtOS44MjggMS44NDQtMTcuMjQ2IDIuODg4bC0uNjIyLjQxNGMtLjg2MSA3LjE0Mi0xLjYyNiAxMi41MTEtNC44MTkgMjYuNTQ5LTEuMjE2IDUuMTc0LTIuNDc4IDEwLjM5Ny0zLjc0MyAxNS41NThsLjM0Mi42NTZjNy42MDItLjQwMSA5LjkwOS0uNDAxIDE2LjUxNi0uMjkybC41MzUtLjU4MWMuODM5LTQuMy45NDgtNS4zMDcgMi44MDgtMTQuMDE2Ljg3NC00LjEyOSAyLjY5Ni0xMy4yMDEgMy41OTQtMTYuNDMyIDEuNjUxLS43NjUgMy4yOC0xLjUxNyA0LjgzNS0xLjUxNyAzLjcwMyAwIDMuMjUyIDMuMjMgMy4xMDkgNC41MTgtLjE1OSAyLjE2MS0xLjUwOCA5LjIxOC0yLjg5MSAxNS4yNzhsLS45MjMgMy45MTFjLS42NDQgMi44ODgtMS4zNDkgNS42OTYtMS45OTMgOC41NTlsLjI4LjU3MmM3LjQ5My0uNDAxIDkuNzc4LS40MDEgMTYuMTc3LS4yOTJsLjc1Mi0uNTgxYzEuMTU3LTYuNzE2IDEuNDk1LTguNTEzIDMuNTQ3LTE4LjI5MWwxLjAzMi00LjQ5M2MyLjAwNS04Ljc5MyAzLjAxMy0xMy4yNTEgMS40OTUtMTYuODgyLTEuNjA0LTQuMDctNS40NTMtNS4wNTItOC45ODgtNS4wNTJ6bTM2LjM3NCA5LjIwNmMtMy45ODMuNzY1LTYuNTIzIDEuMjc1LTkuMDQ3IDEuNjA0LTIuNTAzLjQwMS00Ljk0My43NjUtOC43OTMgMS4zbC0uMzA1LjI3Ny0uMjguMjIxYy0uNDAxIDIuODY3LS42ODEgNS4zNDUtMS4yMTMgOC4yNTgtLjQ1MSAzLjAxMy0xLjE0NCA2LjQzNi0yLjI3MyAxMS4zNTQtLjg3NCAzLjc2NS0xLjMyNCA1LjA3Ny0xLjgyMiA2LjQwMi0uNDg1IDEuMzI0LTEuMDIgMi42MTItMi4wMDIgNi4zMTVsLjIzLjM0Mi4xOTMuMzE0YzMuNTk3LS4xNzEgNS45NTEtLjI5MiA4LjM3LS4zMTQgMi40MTYtLjA4NyA0LjkxOSAwIDguNzkzLjAyMmwuMzM5LS4yNzcuMzY0LS4zMDVjLjU2LTMuMzM5LjY0NC00LjIzOC45ODYtNS44NjcuMzM5LTEuNzQ3LjkyMy00LjE2NiAyLjM1Ny0xMC42MjcuNjc4LTMuMDM0IDEuNDMzLTYuMDYgMi4xMzYtOS4xNTYuNzMxLTMuMDg0IDEuNDk1LTYuMTIyIDIuMjIzLTkuMTU2bC0uMTA5LS4zNjctLjE0Ni0uMzM5em0uMDg1LTEyLjQxMmMtMy42MTktMi4xMzYtOS45NzEtMS40NTgtMTQuMjQ2IDEuNDkyLTQuMjYzIDIuODkxLTQuNzQ4IDYuOTk1LTEuMTQxIDkuMTU5IDMuNTU3IDIuMDc3IDkuOTM0IDEuNDU4IDE0LjE3MS0xLjUxNyA0LjI1My0yLjk1NCA0Ljc4NS03LjAyIDEuMjE2LTkuMTM1em0yMS44ODcgNDkuNDY3YzcuMzIyIDAgMTQuODI3LTIuMDE4IDIwLjQ3Ny04LjAwNiA0LjM0Ny00Ljg1NiA2LjMzOS0xMi4wODIgNy4wMy0xNS4wNTcgMi4yNDgtOS44NjIuNDk3LTE0LjQ2Ny0xLjcwMS0xNy4yNzEtMy4zMzktNC4yNzUtOS4yNC01LjY0Ni0xNS4zNjItNS42NDYtMy42ODEgMC0xMi40NDkuMzY0LTE5LjI5OCA2LjY3OC00LjkxOSA0LjU1NS03LjE5MSAxMC43MzYtOC41NjIgMTYuNjYyLTEuMzg0IDYuMDM4LTIuOTc1IDE2LjkwNyA3LjAyIDIwLjk1MiAzLjA4NCAxLjMyNCA3LjUzIDEuNjg4IDEwLjM5NyAxLjY4OHptLS41NzItMjIuMTljMS42ODgtNy40NjggMy42ODEtMTMuNzM2IDguNzY4LTEzLjczNiAzLjk4NiAwIDQuMjc1IDQuNjY0IDIuNTAzIDEyLjE1Ny0uMzE3IDEuNjYzLTEuNzcyIDcuODQ3LTMuNzQgMTAuNDgxLTEuMzc0IDEuOTQzLTMgMy4xMjItNC43OTcgMy4xMjItLjUzNSAwLTMuNzE1IDAtMy43NjUtNC43MjMtLjAyNS0yLjMzMi40NTEtNC43MTMgMS4wMzItNy4zem00Ni4zODIgMjEuMjI5bC41NzItLjU4MWMuODExLTQuMy45NDUtNS4zMSAyLjc0Mi0xNC4wMTYuODk5LTQuMTI5IDIuNzU4LTEzLjIwMSAzLjYzMS0xNi40MzIgMS42NTQtLjc2OCAzLjI1NS0xLjUyIDQuODYtMS41MiAzLjY3OCAwIDMuMjMgMy4yMyAzLjA4NCA0LjUxOC0uMTM0IDIuMTY0LTEuNDgzIDkuMjE4LTIuODkxIDE1LjI3OGwtLjg3NCAzLjkxMWMtLjY2OCAyLjg5MS0xLjM5NiA1LjY5Ni0yLjA0IDguNTYybC4yOC41NzJjNy41MTgtLjQwMSA5LjcxNi0uNDAxIDE2LjE1Mi0uMjkybC43NzctLjU4MWMxLjEyOS02LjcxOSAxLjQzMy04LjUxNiAzLjU0Ny0xOC4yOTFsMS4wMDctNC40OTZjMi4wMTUtOC43OTMgMy4wMzQtMTMuMjQ4IDEuNTQyLTE2Ljg3OS0xLjY1MS00LjA3LTUuNTI1LTUuMDUyLTkuMDEtNS4wNTItMi4zMSAwLTYuNTQ4LjU1Ny0xMC4zMTMgMi40MTYtMS4zNDYuNzA2LTIuNjk2IDEuNTE3LTQuMDIgMi4zMzJsMS4xNTMtNC40NjgtLjYxOS0uNzU2Yy04LjAyOCAxLjYyOS05Ljg2MiAxLjg0Ny0xNy4yNzEgMi44OTFsLS41NjkuNDE0Yy0uODk5IDcuMTQyLTEuNjI5IDEyLjUwOC00LjgyMiAyNi41NDktMS4yMTYgNS4xNzQtMi40NzggMTAuMzk3LTMuNzQgMTUuNTU4bC4zMzkuNjU2YzcuNjE0LS40MDEgOS44ODctLjQwMSAxNi40ODEtLjI5MnptNTUuMjM1LjI5MWMuNDczLTIuMzA3IDMuMjgtMTUuOTgxIDMuMzA1LTE1Ljk4MSAwIDAgMi4zOTEtMTAuMDMzIDIuNTM3LTEwLjM5NyAwIDAgLjc1Mi0xLjA0NSAxLjUwNS0xLjQ1OGgxLjEwN2MxMC40NDMgMCAyMi4yMzYgMCAzMS40OC02LjggNi4yOS00LjY2NCAxMC41OS0xMS41NSAxMi41MDgtMTkuOTIuNDk3LTIuMDUyLjg2NC00LjQ5My44NjQtNi45MzMgMC0zLjIwNS0uNjQ0LTYuMzc3LTIuNTAzLTguODU1LTQuNzEzLTYuNTk0LTE0LjEtNi43MTYtMjQuOTM1LTYuNzY1bC01LjM0MS4wNWMtMTMuODcuMTcxLTE5LjQzMi4xMjEtMjEuNzE3LS4xNTktLjE5MyAxLjAxLS41NTcgMi44MDgtLjU1NyAyLjgwOHMtNC45NjggMjMuMDI2LTQuOTY4IDIzLjA2M2MwIDAtMTEuODg5IDQ4Ljk1Ni0xMi40NDkgNTEuMjYzIDEyLjExLS4xNDYgMTcuMDc1LS4xNDYgMTkuMTY1LjA4NHptOS4yMDYtNDAuOTAzczUuMjgyLTIyLjk3OSA1LjI1Ny0yMi44OTJsLjE3MS0xLjE3OC4wNzUtLjg5OSAyLjExMS4yMThzMTAuODk0LjkzNiAxMS4xNDkuOTYxYzQuMyAxLjY2MyA2LjA3MiA1Ljk1MSA0LjgzNSAxMS41NDctMS4xMjkgNS4xMTQtNC40NDYgOS40MTQtOC43MDkgMTEuNDkxLTMuNTEgMS43Ni03LjgxIDEuOTA2LTEyLjI0MSAxLjkwNmgtMi44NjdsLjIxOC0xLjE1M3ptMzIuODg5IDE5LjgwOWMtMS4zOTYgNS45NTEtMyAxNi44MiA2Ljk0NiAyMC42OTQgMy4xNzEgMS4zNDkgNi4wMTMgMS43NSA4LjkwMSAxLjYwNCAzLjA1LS4xNjUgNS44NzYtMS42OTQgOC40OTQtMy44OTZsLS43MDkgMi43MTcuNDUxLjU4MWM3LjE1NC0uMzAyIDkuMzc0LS4zMDIgMTcuMTI1LS4yNDNsLjcwMy0uNTM1YzEuMTMyLTYuNjUzIDIuMTk4LTEzLjExNCA1LjEzOS0yNS44NDMgMS40MzMtNi4wOTcgMi44NjMtMTIuMTM1IDQuMzM0LTE4LjIwN2wtLjIzLS42NjhjLTguMDAzIDEuNDgzLTEwLjE0MiAxLjgtMTcuODQgMi44OTFsLS41ODUuNDc2LS4yMzMgMS44MDZjLTEuMTk3LTEuOTM0LTIuOTMyLTMuNTg1LTUuNjA5LTQuNjE0LTMuNDIzLTEuMzQ2LTExLjQ2My4zODktMTguMzc1IDYuNjgxLTQuODU2IDQuNDkzLTcuMTg4IDEwLjY0OS04LjUxMyAxNi41NTN6bTE2LjgwOC4zNjRjMS43MTMtNy4zMzQgMy42ODEtMTMuNTQgOC43OC0xMy41NCAzLjIyNCAwIDQuOTIyIDIuOTc1IDQuNTc3IDguMDQ5LS4yNzQgMS4yNjUtLjU2OSAyLjU5OS0uOTIgNC4xMDctLjUxIDIuMTc5LTEuMDYzIDQuMzQtMS42MDEgNi41MDQtLjU0NyAxLjQ4LTEuMTg1IDIuODc2LTEuODg0IDMuODA2LTEuMzEyIDEuODU5LTQuNDM0IDMuMDEzLTYuMjMxIDMuMDEzLS41MSAwLTMuNjU2IDAtMy43NjUtNC42MzktLjAyNS0yLjMxLjQ1MS00LjY4OSAxLjA0NS03LjN6bTg3Ljc3Mi0yNC4yMTdsLS42MTktLjcwNmMtNy45MTkgMS42MDQtOS4zNTIgMS44NTktMTYuNjI3IDIuODQybC0uNTM1LjUzNS0uMDg0LjM0Mi0uMDI1LS4xMjFjLTUuNDE2IDEyLjQ5NS01LjI1NyA5LjgtOS42NjYgMTkuNjM3bC0uMDUtMS4yMDMtMS4xMDQtMjEuMzI1LS42OTMtLjcwNmMtOC4yOTUgMS42MDQtOC40OTEgMS44NTktMTYuMTUyIDIuODQybC0uNTk3LjUzNWMtLjA4NC4yNTUtLjA4NC41MzUtLjEzNC44MzlsLjA1LjEwOWMuOTU4IDQuODk0LjcyOCAzLjgwMiAxLjY4OCAxMS41MjUuNDQ4IDMuNzkgMS4wNDUgNy42MDIgMS40OTIgMTEuMzQ1Ljc1NiA2LjI2NSAxLjE3OCA5LjM0OSAyLjEwMiAxOC45MS01LjE3NCA4LjUzOC02LjM5OSAxMS43NjgtMTEuMzc5IDE5LjI2MWwuMDM0LjA3NS0zLjUwNyA1LjU0N2MtLjQwMS41ODUtLjc2NS45ODYtMS4yNzUgMS4xNTctLjU2LjI3Ny0xLjI4Ny4zMjYtMi4yOTguMzI2aC0xLjk0M2wtMi44ODggOS42MDcgOS45MDkuMTcxYzUuODE3LS4wMjUgOS40NzMtMi43NDUgMTEuNDQxLTYuNDAybDYuMjMxLTEwLjY3N2gtLjA5OWwuNjU2LS43NTJjNC4xOTEtOS4wMjMgMzYuMDcyLTYzLjcxMiAzNi4wNzItNjMuNzEyem0tMTA0LjU4IDEyNi4xNzVoLTQuMjA0bDE1LjU1OC01MS40NTloNS4xNjFsMS42MzgtNS4zMDEuMTU5IDUuODk1Yy0uMTkzIDMuNjQ0IDIuNjc0IDYuODc0IDEwLjIwNCA2LjMzOWg4LjcwOWwyLjk5Ny05LjkwOWgtMy4yNzdjLTEuODg0IDAtMi43NTgtLjQ3Ni0yLjY0OS0xLjQ5NWwtLjE1OS01Ljk5N2gtMTYuMTI3di4wMzFjLTUuMjE0LjEwOS0yMC43ODQuNTAxLTIzLjkzNyAxLjM0LTMuODE1Ljk4Mi03LjgzNSAzLjg3NC03LjgzNSAzLjg3NGwxLjU3OS01LjMwN2gtMTUuMDg1bC0zLjE0MyAxMC41MzEtMTUuNzY2IDUyLjI0NWgtMy4wNTlsLTMgOS44MzdoMzAuMDQ2bC0xLjAwNyAzLjI4aDE0LjgwNmwuOTgyLTMuMjhoNC4xNTRsMy4yNTUtMTAuNjI0em0tMTIuMzI4LTQxLjAwM2MtMi40MTYuNjY4LTYuOTEyIDIuNjk2LTYuOTEyIDIuNjk2bDMuOTk4LTEzLjE1MmgxMS45ODZsLTIuODkxIDkuNTgycy0zLjcwMy4yMTgtNi4xODEuODc0em0uMjMgMTguNzg4cy0zLjc2NS40NzMtNi4yNDMgMS4wMzJjLTIuNDQxLjc0LTcuMDE3IDMuMDcyLTcuMDE3IDMuMDcybDQuMTI5LTEzLjY4NmgxMi4wNDhsLTIuOTE2IDkuNTgyem0tNi43MTYgMjIuMzM2aC0xMi4wMjNsMy40ODUtMTEuNTVoMTEuOTg2bC0zLjQ0OCAxMS41NXptMjguOTU0LTMxLjkxOGgxNy4zM2wtMi40OSA4LjA2NWgtMTcuNTZsLTIuNjM3IDguODE3aDE1LjM2NWwtMTEuNjM0IDE2LjM4MmMtLjgxNSAxLjIwMy0xLjU0NSAxLjYyOS0yLjM1NyAxLjk2OC0uODE1LjQxNC0xLjg4NC44OTktMy4xMjIuODk5aC00LjI2M2wtMi45MjkgOS42NTdoMTEuMTQ5YzUuNzk1IDAgOS4yMTgtMi42MzcgMTEuNzQ2LTYuMDk3bDcuOTc4LTEwLjkxOSAxLjcxMyAxMS4wODdjLjM2NCAyLjA3NyAxLjg1NiAzLjI5MyAyLjg2NyAzLjc2NSAxLjExNi41NiAyLjI3IDEuNTIgMy44OTkgMS42NjMgMS43NDcuMDc1IDMuMDEuMTM0IDMuODQ5LjEzNGg1LjQ3OGwzLjI4OS0xMC44MDdoLTIuMTYxYy0xLjI0MSAwLTMuMzc2LS4yMDgtMy43NC0uNTk3LS4zNjQtLjQ3My0uMzY0LTEuMi0uNTYtMi4zMDdsLTEuNzM4LTExLjExMmgtNy4xMTdsMy4xMjItMy43MTVoMTcuNTI2bDIuNjk2LTguODE3aC0xNi4yMjZsMi41MjgtOC4wNjVoMTYuMTc3bDMtOS45NDZoLTQ4LjIyOGwtMi45NTEgOS45NDZ6bS0xNDYuMzcxIDM0LjE2NGw0LjA0NS0xMy40NTZoMTYuNjI0bDMuMDM4LTEwLjAwOGgtMTYuNjRsMi41NC04LjI4M2gxNi4yNjFsMy4wMTMtOS42OTFoLTQwLjY4NmwtMi45NTEgOS42OTFoOS4yNDNsLTIuNDY2IDguMjgzaC05LjI2OGwtMy4wNzIgMTAuMTc5aDkuMjRsLTUuMzkxIDE3LjgwM2MtLjcyOCAyLjM1Ny4zNDIgMy4yNTUgMS4wMiA0LjM1LjY5MyAxLjA2NiAxLjM5NiAxLjc3MiAyLjk3NSAyLjE3MyAxLjYyOS4zNjQgMi43NDUuNTgxIDQuMjYzLjU4MWgxOC43NDJsMy4zMzktMTEuMDg3LTguMzA4IDEuMTQxYy0xLjYwNCAwLTYuMDQ3LS4xOTMtNS41NjItMS42NzZ6bTEuOTA3LTY0LjQxN2wtNC4yMTMgNy42MTRjLS45MDIgMS42NjMtMS43MTMgMi42OTYtMi40NDQgMy4xNzEtLjY0NC40MDEtMS45MTguNTY5LTMuNzY1LjU2OWgtMi4xOThsLTIuOTM4IDkuNzQxaDcuM2MzLjUxIDAgNi4yMDYtMS4yODcgNy40OTMtMS45MzEgMS4zODQtLjc0IDEuNzQ3LS4zMTcgMi44MTctMS4zNDlsMi40NjYtMi4xMzZoMjIuNzk2bDMuMDI1LTEwLjE0MmgtMTYuNjg3bDIuOTEzLTUuNTM3aC0xNi41NjV6bTMzLjY1NCA2NC42MTJjLS4zODktLjU2LS4xMDktMS41NDUuNDg1LTMuNTk3bDYuMjMxLTIwLjYyM2gyMi4xNjVjMy4yMy0uMDQ3IDUuNTYyLS4wODQgNy4wNzktLjE5MyAxLjYyOS0uMTcxIDMuNDAxLS43NTIgNS4zMzItMS43OTcgMS45OTMtMS4wOTQgMy4wMTMtMi4yNDggMy44NzQtMy41NzIuOTYxLTEuMzIxIDIuNTAzLTQuMjEzIDMuODI3LTguNjcxbDcuODMyLTI2LjA5OC0yMy4wMDEuMTM0cy03LjA4MyAxLjA0NS0xMC4yMDEgMi4xOThjLTMuMTQ2IDEuMjg3LTcuNjQyIDQuODgxLTcuNjQyIDQuODgxbDIuMDc3LTcuMTU0aC0xNC4yMDlsLTE5Ljg5MiA2NS45NzJjLS43MDYgMi41NjItMS4xNzggNC40MjEtMS4yODcgNS41MzctLjAzNyAxLjIwMyAxLjUxNyAyLjM5NCAyLjUyNSAzLjI5MyAxLjE5MS44OTkgMi45NTEuNzUyIDQuNjM5Ljg5OSAxLjc3NS4xMzQgNC4zLjIxOCA3Ljc4NS4yMThoMTAuOTE5bDMuMzUyLTExLjMxNy05Ljc3NS45MjNjLTEuMDQ1IDAtMS44LS41Ni0yLjExNC0xLjAzMnptMTAuNzM2LTM4LjE0OWgyMy4yODFsLTEuNDggNC42MzljLS4yMDguMTA5LS43MDYtLjIzLTMuMDc1LjA1aC0yMC4xNTlsMS40MzMtNC42ODl6bTQuNjY0LTE1LjU1OGgyMy40NzdsLTEuNjg4IDUuNTg3cy0xMS4wNjUtLjEwOS0xMi44MzcuMjE4Yy03Ljc5OCAxLjM0OS0xMi4zNTIgNS41MTYtMTIuMzUyIDUuNTE2bDMuNDAxLTExLjMyem0xNy42NTggMzUuNzMxYy0uMTkzLjY5My0uNDk3IDEuMTE2LS45MjMgMS40MzMtLjQ3My4zMDUtMS4yMzcuNDE0LTIuMzc4LjQxNGgtMy4zMTdsLjE5Ni01LjY0OWgtMTMuNzk4bC0uNTYgMjcuNjE4Yy0uMDIyIDEuOTkzLjE3MSAzLjE0NiAxLjYyOSA0LjA3IDEuNDU4IDEuMTUzIDUuOTUxIDEuMyAxMS45OTggMS4zaDguNjQ2bDMuMTIyLTEwLjMzOC03LjUyNy40MTQtMi41MDMuMTQ2Yy0uMzQyLS4xNDYtLjY2OC0uMjgtMS4wMzItLjY0NC0uMzE3LS4zMTQtLjg1Mi0uMTIxLS43NjUtMi4xMTRsLjA1OS03LjA3OSA3Ljg5NC0uMzI2YzQuMjYzIDAgNi4wODUtMS4zODcgNy42MzktMi43MDggMS40ODMtMS4yNjUgMS45NjgtMi43MiAyLjUyOC00LjY4OWwxLjMyNC02LjI2OGgtMTAuODQ4bC0xLjM4NCA0LjQyMXoiIGZpbGw9IiNGRUZFRkUiLz48L3N2Zz4=');
+ background-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjMyMCIgdmlld0JveD0iMCAwIDUxMiAzMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPjxwYXRoIGQ9Ik0xMDAuMDgzLjAwMWgxMjcuNTU3YzE3LjgwNiAwIDI4Ljg4IDE0LjUxMyAyNC43MjcgMzIuMzc4bC01OS4zODcgMjU0Ljk3MWMtNC4xOTEgMTcuODAzLTIyLjAxOSAzMi4zMjgtMzkuODM3IDMyLjMyOGgtMTI3LjU0NWMtMTcuNzgxIDAtMjguODgtMTQuNTI2LTI0LjcyNy0zMi4zMjhsNTkuNDEyLTI1NC45NzFjNC4xNTQtMTcuODY1IDIxLjk3Mi0zMi4zNzggMzkuOC0zMi4zNzgiIGZpbGw9IiNFMjE4MzYiLz48cGF0aCBkPSJNMjE3LjAyNy4wMDFoMTQ2LjY4N2MxNy44MDMgMCA5Ljc3NSAxNC41MTMgNS41ODcgMzIuMzc4bC01OS4zNzggMjU0Ljk3MWMtNC4xNjYgMTcuODAzLTIuODY3IDMyLjMyOC0yMC43MDcgMzIuMzI4aC0xNDYuNjg3Yy0xNy44NCAwLTI4Ljg4LTE0LjUyNi0yNC42ODktMzIuMzI4bDU5LjM3NS0yNTQuOTcxYzQuMjE2LTE3Ljg2NSAyMS45OTctMzIuMzc4IDM5LjgxMi0zMi4zNzgiIGZpbGw9IiMwMDQ0N0MiLz48cGF0aCBkPSJNMzU3Ljg5Ni4wMDFoMTI3LjU1N2MxNy44MzEgMCAyOC45MDUgMTQuNTEzIDI0LjcxNyAzMi4zNzhsLTU5LjM3OCAyNTQuOTcxYy00LjE5MSAxNy44MDMtMjIuMDMxIDMyLjMyOC0zOS44NTkgMzIuMzI4aC0xMjcuNDk4Yy0xNy44NCAwLTI4LjkwNS0xNC41MjYtMjQuNzI3LTMyLjMyOGw1OS4zODctMjU0Ljk3MWM0LjE1NC0xNy44NjUgMjEuOTYtMzIuMzc4IDM5LjgtMzIuMzc4IiBmaWxsPSIjMDA3Qjg0Ii8+PHBhdGggZD0iTTEzMy4zOTcgODEuNzEyYy0xMy4xMTcuMTM0LTE2Ljk5MSAwLTE4LjIyOS0uMjkyLS40NzYgMi4yNi05LjMyNyA0My4wOTItOS4zNTIgNDMuMTI2LTEuOTA2IDguMjYxLTMuMjkzIDE0LjE1LTguMDAzIDE3Ljk1Mi0yLjY3NCAyLjIxMS01Ljc5NSAzLjI3Ny05LjQxNCAzLjI3Ny01LjgxNyAwLTkuMjA2LTIuODg4LTkuNzc1LTguMzY3bC0uMTA5LTEuODgxczEuNzcyLTExLjA2NSAxLjc3Mi0xMS4xMjdjMCAwIDkuMjktMzcuMjEgMTAuOTUzLTQyLjEyOC4wODctLjI4LjExMi0uNDI2LjEzNC0uNTYtMTguMDgzLjE1OS0yMS4yODggMC0yMS41MDktLjI5Mi0uMTIxLjQwMS0uNTY5IDIuNzA4LS41NjkgMi43MDhsLTkuNDg2IDQxLjkzOS0uODE1IDMuNTU3LTEuNTc2IDExLjYzNGMwIDMuNDUxLjY3OCA2LjI2OCAyLjAyNyA4LjY1IDQuMzIyIDcuNTUyIDE2LjY0OSA4LjY4NCAyMy42MjMgOC42ODQgOC45ODUgMCAxNy40MTQtMS45MDkgMjMuMTEtNS4zOTQgOS44ODctNS44NDIgMTIuNDc0LTE0Ljk3MyAxNC43ODEtMjMuMDg4bDEuMDctNC4xNjNzOS41Ny0zOC42NDYgMTEuMTk2LTQzLjY3NGMuMDYyLS4yOC4wODctLjQyNi4xNzEtLjU2em0zMi41NjEgMzEuMTc2Yy0yLjMwNyAwLTYuNTIzLjU2LTEwLjMxIDIuNDE2LTEuMzc0LjcwNi0yLjY3NCAxLjUyLTQuMDQ1IDIuMzMybDEuMjM3LTQuNDY4LS42NzgtLjc1MmMtOC4wMzEgMS42MjYtOS44MjggMS44NDQtMTcuMjQ2IDIuODg4bC0uNjIyLjQxNGMtLjg2MSA3LjE0Mi0xLjYyNiAxMi41MTEtNC44MTkgMjYuNTQ5LTEuMjE2IDUuMTc0LTIuNDc4IDEwLjM5Ny0zLjc0MyAxNS41NThsLjM0Mi42NTZjNy42MDItLjQwMSA5LjkwOS0uNDAxIDE2LjUxNi0uMjkybC41MzUtLjU4MWMuODM5LTQuMy45NDgtNS4zMDcgMi44MDgtMTQuMDE2Ljg3NC00LjEyOSAyLjY5Ni0xMy4yMDEgMy41OTQtMTYuNDMyIDEuNjUxLS43NjUgMy4yOC0xLjUxNyA0LjgzNS0xLjUxNyAzLjcwMyAwIDMuMjUyIDMuMjMgMy4xMDkgNC41MTgtLjE1OSAyLjE2MS0xLjUwOCA5LjIxOC0yLjg5MSAxNS4yNzhsLS45MjMgMy45MTFjLS42NDQgMi44ODgtMS4zNDkgNS42OTYtMS45OTMgOC41NTlsLjI4LjU3MmM3LjQ5My0uNDAxIDkuNzc4LS40MDEgMTYuMTc3LS4yOTJsLjc1Mi0uNTgxYzEuMTU3LTYuNzE2IDEuNDk1LTguNTEzIDMuNTQ3LTE4LjI5MWwxLjAzMi00LjQ5M2MyLjAwNS04Ljc5MyAzLjAxMy0xMy4yNTEgMS40OTUtMTYuODgyLTEuNjA0LTQuMDctNS40NTMtNS4wNTItOC45ODgtNS4wNTJ6bTM2LjM3NCA5LjIwNmMtMy45ODMuNzY1LTYuNTIzIDEuMjc1LTkuMDQ3IDEuNjA0LTIuNTAzLjQwMS00Ljk0My43NjUtOC43OTMgMS4zbC0uMzA1LjI3Ny0uMjguMjIxYy0uNDAxIDIuODY3LS42ODEgNS4zNDUtMS4yMTMgOC4yNTgtLjQ1MSAzLjAxMy0xLjE0NCA2LjQzNi0yLjI3MyAxMS4zNTQtLjg3NCAzLjc2NS0xLjMyNCA1LjA3Ny0xLjgyMiA2LjQwMi0uNDg1IDEuMzI0LTEuMDIgMi42MTItMi4wMDIgNi4zMTVsLjIzLjM0Mi4xOTMuMzE0YzMuNTk3LS4xNzEgNS45NTEtLjI5MiA4LjM3LS4zMTQgMi40MTYtLjA4NyA0LjkxOSAwIDguNzkzLjAyMmwuMzM5LS4yNzcuMzY0LS4zMDVjLjU2LTMuMzM5LjY0NC00LjIzOC45ODYtNS44NjcuMzM5LTEuNzQ3LjkyMy00LjE2NiAyLjM1Ny0xMC42MjcuNjc4LTMuMDM0IDEuNDMzLTYuMDYgMi4xMzYtOS4xNTYuNzMxLTMuMDg0IDEuNDk1LTYuMTIyIDIuMjIzLTkuMTU2bC0uMTA5LS4zNjctLjE0Ni0uMzM5em0uMDg1LTEyLjQxMmMtMy42MTktMi4xMzYtOS45NzEtMS40NTgtMTQuMjQ2IDEuNDkyLTQuMjYzIDIuODkxLTQuNzQ4IDYuOTk1LTEuMTQxIDkuMTU5IDMuNTU3IDIuMDc3IDkuOTM0IDEuNDU4IDE0LjE3MS0xLjUxNyA0LjI1My0yLjk1NCA0Ljc4NS03LjAyIDEuMjE2LTkuMTM1em0yMS44ODcgNDkuNDY3YzcuMzIyIDAgMTQuODI3LTIuMDE4IDIwLjQ3Ny04LjAwNiA0LjM0Ny00Ljg1NiA2LjMzOS0xMi4wODIgNy4wMy0xNS4wNTcgMi4yNDgtOS44NjIuNDk3LTE0LjQ2Ny0xLjcwMS0xNy4yNzEtMy4zMzktNC4yNzUtOS4yNC01LjY0Ni0xNS4zNjItNS42NDYtMy42ODEgMC0xMi40NDkuMzY0LTE5LjI5OCA2LjY3OC00LjkxOSA0LjU1NS03LjE5MSAxMC43MzYtOC41NjIgMTYuNjYyLTEuMzg0IDYuMDM4LTIuOTc1IDE2LjkwNyA3LjAyIDIwLjk1MiAzLjA4NCAxLjMyNCA3LjUzIDEuNjg4IDEwLjM5NyAxLjY4OHptLS41NzItMjIuMTljMS42ODgtNy40NjggMy42ODEtMTMuNzM2IDguNzY4LTEzLjczNiAzLjk4NiAwIDQuMjc1IDQuNjY0IDIuNTAzIDEyLjE1Ny0uMzE3IDEuNjYzLTEuNzcyIDcuODQ3LTMuNzQgMTAuNDgxLTEuMzc0IDEuOTQzLTMgMy4xMjItNC43OTcgMy4xMjItLjUzNSAwLTMuNzE1IDAtMy43NjUtNC43MjMtLjAyNS0yLjMzMi40NTEtNC43MTMgMS4wMzItNy4zem00Ni4zODIgMjEuMjI5bC41NzItLjU4MWMuODExLTQuMy45NDUtNS4zMSAyLjc0Mi0xNC4wMTYuODk5LTQuMTI5IDIuNzU4LTEzLjIwMSAzLjYzMS0xNi40MzIgMS42NTQtLjc2OCAzLjI1NS0xLjUyIDQuODYtMS41MiAzLjY3OCAwIDMuMjMgMy4yMyAzLjA4NCA0LjUxOC0uMTM0IDIuMTY0LTEuNDgzIDkuMjE4LTIuODkxIDE1LjI3OGwtLjg3NCAzLjkxMWMtLjY2OCAyLjg5MS0xLjM5NiA1LjY5Ni0yLjA0IDguNTYybC4yOC41NzJjNy41MTgtLjQwMSA5LjcxNi0uNDAxIDE2LjE1Mi0uMjkybC43NzctLjU4MWMxLjEyOS02LjcxOSAxLjQzMy04LjUxNiAzLjU0Ny0xOC4yOTFsMS4wMDctNC40OTZjMi4wMTUtOC43OTMgMy4wMzQtMTMuMjQ4IDEuNTQyLTE2Ljg3OS0xLjY1MS00LjA3LTUuNTI1LTUuMDUyLTkuMDEtNS4wNTItMi4zMSAwLTYuNTQ4LjU1Ny0xMC4zMTMgMi40MTYtMS4zNDYuNzA2LTIuNjk2IDEuNTE3LTQuMDIgMi4zMzJsMS4xNTMtNC40NjgtLjYxOS0uNzU2Yy04LjAyOCAxLjYyOS05Ljg2MiAxLjg0Ny0xNy4yNzEgMi44OTFsLS41NjkuNDE0Yy0uODk5IDcuMTQyLTEuNjI5IDEyLjUwOC00LjgyMiAyNi41NDktMS4yMTYgNS4xNzQtMi40NzggMTAuMzk3LTMuNzQgMTUuNTU4bC4zMzkuNjU2YzcuNjE0LS40MDEgOS44ODctLjQwMSAxNi40ODEtLjI5MnptNTUuMjM1LjI5MWMuNDczLTIuMzA3IDMuMjgtMTUuOTgxIDMuMzA1LTE1Ljk4MSAwIDAgMi4zOTEtMTAuMDMzIDIuNTM3LTEwLjM5NyAwIDAgLjc1Mi0xLjA0NSAxLjUwNS0xLjQ1OGgxLjEwN2MxMC40NDMgMCAyMi4yMzYgMCAzMS40OC02LjggNi4yOS00LjY2NCAxMC41OS0xMS41NSAxMi41MDgtMTkuOTIuNDk3LTIuMDUyLjg2NC00LjQ5My44NjQtNi45MzMgMC0zLjIwNS0uNjQ0LTYuMzc3LTIuNTAzLTguODU1LTQuNzEzLTYuNTk0LTE0LjEtNi43MTYtMjQuOTM1LTYuNzY1bC01LjM0MS4wNWMtMTMuODcuMTcxLTE5LjQzMi4xMjEtMjEuNzE3LS4xNTktLjE5MyAxLjAxLS41NTcgMi44MDgtLjU1NyAyLjgwOHMtNC45NjggMjMuMDI2LTQuOTY4IDIzLjA2M2MwIDAtMTEuODg5IDQ4Ljk1Ni0xMi40NDkgNTEuMjYzIDEyLjExLS4xNDYgMTcuMDc1LS4xNDYgMTkuMTY1LjA4NHptOS4yMDYtNDAuOTAzczUuMjgyLTIyLjk3OSA1LjI1Ny0yMi44OTJsLjE3MS0xLjE3OC4wNzUtLjg5OSAyLjExMS4yMThzMTAuODk0LjkzNiAxMS4xNDkuOTYxYzQuMyAxLjY2MyA2LjA3MiA1Ljk1MSA0LjgzNSAxMS41NDctMS4xMjkgNS4xMTQtNC40NDYgOS40MTQtOC43MDkgMTEuNDkxLTMuNTEgMS43Ni03LjgxIDEuOTA2LTEyLjI0MSAxLjkwNmgtMi44NjdsLjIxOC0xLjE1M3ptMzIuODg5IDE5LjgwOWMtMS4zOTYgNS45NTEtMyAxNi44MiA2Ljk0NiAyMC42OTQgMy4xNzEgMS4zNDkgNi4wMTMgMS43NSA4LjkwMSAxLjYwNCAzLjA1LS4xNjUgNS44NzYtMS42OTQgOC40OTQtMy44OTZsLS43MDkgMi43MTcuNDUxLjU4MWM3LjE1NC0uMzAyIDkuMzc0LS4zMDIgMTcuMTI1LS4yNDNsLjcwMy0uNTM1YzEuMTMyLTYuNjUzIDIuMTk4LTEzLjExNCA1LjEzOS0yNS44NDMgMS40MzMtNi4wOTcgMi44NjMtMTIuMTM1IDQuMzM0LTE4LjIwN2wtLjIzLS42NjhjLTguMDAzIDEuNDgzLTEwLjE0MiAxLjgtMTcuODQgMi44OTFsLS41ODUuNDc2LS4yMzMgMS44MDZjLTEuMTk3LTEuOTM0LTIuOTMyLTMuNTg1LTUuNjA5LTQuNjE0LTMuNDIzLTEuMzQ2LTExLjQ2My4zODktMTguMzc1IDYuNjgxLTQuODU2IDQuNDkzLTcuMTg4IDEwLjY0OS04LjUxMyAxNi41NTN6bTE2LjgwOC4zNjRjMS43MTMtNy4zMzQgMy42ODEtMTMuNTQgOC43OC0xMy41NCAzLjIyNCAwIDQuOTIyIDIuOTc1IDQuNTc3IDguMDQ5LS4yNzQgMS4yNjUtLjU2OSAyLjU5OS0uOTIgNC4xMDctLjUxIDIuMTc5LTEuMDYzIDQuMzQtMS42MDEgNi41MDQtLjU0NyAxLjQ4LTEuMTg1IDIuODc2LTEuODg0IDMuODA2LTEuMzEyIDEuODU5LTQuNDM0IDMuMDEzLTYuMjMxIDMuMDEzLS41MSAwLTMuNjU2IDAtMy43NjUtNC42MzktLjAyNS0yLjMxLjQ1MS00LjY4OSAxLjA0NS03LjN6bTg3Ljc3Mi0yNC4yMTdsLS42MTktLjcwNmMtNy45MTkgMS42MDQtOS4zNTIgMS44NTktMTYuNjI3IDIuODQybC0uNTM1LjUzNS0uMDg0LjM0Mi0uMDI1LS4xMjFjLTUuNDE2IDEyLjQ5NS01LjI1NyA5LjgtOS42NjYgMTkuNjM3bC0uMDUtMS4yMDMtMS4xMDQtMjEuMzI1LS42OTMtLjcwNmMtOC4yOTUgMS42MDQtOC40OTEgMS44NTktMTYuMTUyIDIuODQybC0uNTk3LjUzNWMtLjA4NC4yNTUtLjA4NC41MzUtLjEzNC44MzlsLjA1LjEwOWMuOTU4IDQuODk0LjcyOCAzLjgwMiAxLjY4OCAxMS41MjUuNDQ4IDMuNzkgMS4wNDUgNy42MDIgMS40OTIgMTEuMzQ1Ljc1NiA2LjI2NSAxLjE3OCA5LjM0OSAyLjEwMiAxOC45MS01LjE3NCA4LjUzOC02LjM5OSAxMS43NjgtMTEuMzc5IDE5LjI2MWwuMDM0LjA3NS0zLjUwNyA1LjU0N2MtLjQwMS41ODUtLjc2NS45ODYtMS4yNzUgMS4xNTctLjU2LjI3Ny0xLjI4Ny4zMjYtMi4yOTguMzI2aC0xLjk0M2wtMi44ODggOS42MDcgOS45MDkuMTcxYzUuODE3LS4wMjUgOS40NzMtMi43NDUgMTEuNDQxLTYuNDAybDYuMjMxLTEwLjY3N2gtLjA5OWwuNjU2LS43NTJjNC4xOTEtOS4wMjMgMzYuMDcyLTYzLjcxMiAzNi4wNzItNjMuNzEyem0tMTA0LjU4IDEyNi4xNzVoLTQuMjA0bDE1LjU1OC01MS40NTloNS4xNjFsMS42MzgtNS4zMDEuMTU5IDUuODk1Yy0uMTkzIDMuNjQ0IDIuNjc0IDYuODc0IDEwLjIwNCA2LjMzOWg4LjcwOWwyLjk5Ny05LjkwOWgtMy4yNzdjLTEuODg0IDAtMi43NTgtLjQ3Ni0yLjY0OS0xLjQ5NWwtLjE1OS01Ljk5N2gtMTYuMTI3di4wMzFjLTUuMjE0LjEwOS0yMC43ODQuNTAxLTIzLjkzNyAxLjM0LTMuODE1Ljk4Mi03LjgzNSAzLjg3NC03LjgzNSAzLjg3NGwxLjU3OS01LjMwN2gtMTUuMDg1bC0zLjE0MyAxMC41MzEtMTUuNzY2IDUyLjI0NWgtMy4wNTlsLTMgOS44MzdoMzAuMDQ2bC0xLjAwNyAzLjI4aDE0LjgwNmwuOTgyLTMuMjhoNC4xNTRsMy4yNTUtMTAuNjI0em0tMTIuMzI4LTQxLjAwM2MtMi40MTYuNjY4LTYuOTEyIDIuNjk2LTYuOTEyIDIuNjk2bDMuOTk4LTEzLjE1MmgxMS45ODZsLTIuODkxIDkuNTgycy0zLjcwMy4yMTgtNi4xODEuODc0em0uMjMgMTguNzg4cy0zLjc2NS40NzMtNi4yNDMgMS4wMzJjLTIuNDQxLjc0LTcuMDE3IDMuMDcyLTcuMDE3IDMuMDcybDQuMTI5LTEzLjY4NmgxMi4wNDhsLTIuOTE2IDkuNTgyem0tNi43MTYgMjIuMzM2aC0xMi4wMjNsMy40ODUtMTEuNTVoMTEuOTg2bC0zLjQ0OCAxMS41NXptMjguOTU0LTMxLjkxOGgxNy4zM2wtMi40OSA4LjA2NWgtMTcuNTZsLTIuNjM3IDguODE3aDE1LjM2NWwtMTEuNjM0IDE2LjM4MmMtLjgxNSAxLjIwMy0xLjU0NSAxLjYyOS0yLjM1NyAxLjk2OC0uODE1LjQxNC0xLjg4NC44OTktMy4xMjIuODk5aC00LjI2M2wtMi45MjkgOS42NTdoMTEuMTQ5YzUuNzk1IDAgOS4yMTgtMi42MzcgMTEuNzQ2LTYuMDk3bDcuOTc4LTEwLjkxOSAxLjcxMyAxMS4wODdjLjM2NCAyLjA3NyAxLjg1NiAzLjI5MyAyLjg2NyAzLjc2NSAxLjExNi41NiAyLjI3IDEuNTIgMy44OTkgMS42NjMgMS43NDcuMDc1IDMuMDEuMTM0IDMuODQ5LjEzNGg1LjQ3OGwzLjI4OS0xMC44MDdoLTIuMTYxYy0xLjI0MSAwLTMuMzc2LS4yMDgtMy43NC0uNTk3LS4zNjQtLjQ3My0uMzY0LTEuMi0uNTYtMi4zMDdsLTEuNzM4LTExLjExMmgtNy4xMTdsMy4xMjItMy43MTVoMTcuNTI2bDIuNjk2LTguODE3aC0xNi4yMjZsMi41MjgtOC4wNjVoMTYuMTc3bDMtOS45NDZoLTQ4LjIyOGwtMi45NTEgOS45NDZ6bS0xNDYuMzcxIDM0LjE2NGw0LjA0NS0xMy40NTZoMTYuNjI0bDMuMDM4LTEwLjAwOGgtMTYuNjRsMi41NC04LjI4M2gxNi4yNjFsMy4wMTMtOS42OTFoLTQwLjY4NmwtMi45NTEgOS42OTFoOS4yNDNsLTIuNDY2IDguMjgzaC05LjI2OGwtMy4wNzIgMTAuMTc5aDkuMjRsLTUuMzkxIDE3LjgwM2MtLjcyOCAyLjM1Ny4zNDIgMy4yNTUgMS4wMiA0LjM1LjY5MyAxLjA2NiAxLjM5NiAxLjc3MiAyLjk3NSAyLjE3MyAxLjYyOS4zNjQgMi43NDUuNTgxIDQuMjYzLjU4MWgxOC43NDJsMy4zMzktMTEuMDg3LTguMzA4IDEuMTQxYy0xLjYwNCAwLTYuMDQ3LS4xOTMtNS41NjItMS42NzZ6bTEuOTA3LTY0LjQxN2wtNC4yMTMgNy42MTRjLS45MDIgMS42NjMtMS43MTMgMi42OTYtMi40NDQgMy4xNzEtLjY0NC40MDEtMS45MTguNTY5LTMuNzY1LjU2OWgtMi4xOThsLTIuOTM4IDkuNzQxaDcuM2MzLjUxIDAgNi4yMDYtMS4yODcgNy40OTMtMS45MzEgMS4zODQtLjc0IDEuNzQ3LS4zMTcgMi44MTctMS4zNDlsMi40NjYtMi4xMzZoMjIuNzk2bDMuMDI1LTEwLjE0MmgtMTYuNjg3bDIuOTEzLTUuNTM3aC0xNi41NjV6bTMzLjY1NCA2NC42MTJjLS4zODktLjU2LS4xMDktMS41NDUuNDg1LTMuNTk3bDYuMjMxLTIwLjYyM2gyMi4xNjVjMy4yMy0uMDQ3IDUuNTYyLS4wODQgNy4wNzktLjE5MyAxLjYyOS0uMTcxIDMuNDAxLS43NTIgNS4zMzItMS43OTcgMS45OTMtMS4wOTQgMy4wMTMtMi4yNDggMy44NzQtMy41NzIuOTYxLTEuMzIxIDIuNTAzLTQuMjEzIDMuODI3LTguNjcxbDcuODMyLTI2LjA5OC0yMy4wMDEuMTM0cy03LjA4MyAxLjA0NS0xMC4yMDEgMi4xOThjLTMuMTQ2IDEuMjg3LTcuNjQyIDQuODgxLTcuNjQyIDQuODgxbDIuMDc3LTcuMTU0aC0xNC4yMDlsLTE5Ljg5MiA2NS45NzJjLS43MDYgMi41NjItMS4xNzggNC40MjEtMS4yODcgNS41MzctLjAzNyAxLjIwMyAxLjUxNyAyLjM5NCAyLjUyNSAzLjI5MyAxLjE5MS44OTkgMi45NTEuNzUyIDQuNjM5Ljg5OSAxLjc3NS4xMzQgNC4zLjIxOCA3Ljc4NS4yMThoMTAuOTE5bDMuMzUyLTExLjMxNy05Ljc3NS45MjNjLTEuMDQ1IDAtMS44LS41Ni0yLjExNC0xLjAzMnptMTAuNzM2LTM4LjE0OWgyMy4yODFsLTEuNDggNC42MzljLS4yMDguMTA5LS43MDYtLjIzLTMuMDc1LjA1aC0yMC4xNTlsMS40MzMtNC42ODl6bTQuNjY0LTE1LjU1OGgyMy40NzdsLTEuNjg4IDUuNTg3cy0xMS4wNjUtLjEwOS0xMi44MzcuMjE4Yy03Ljc5OCAxLjM0OS0xMi4zNTIgNS41MTYtMTIuMzUyIDUuNTE2bDMuNDAxLTExLjMyem0xNy42NTggMzUuNzMxYy0uMTkzLjY5My0uNDk3IDEuMTE2LS45MjMgMS40MzMtLjQ3My4zMDUtMS4yMzcuNDE0LTIuMzc4LjQxNGgtMy4zMTdsLjE5Ni01LjY0OWgtMTMuNzk4bC0uNTYgMjcuNjE4Yy0uMDIyIDEuOTkzLjE3MSAzLjE0NiAxLjYyOSA0LjA3IDEuNDU4IDEuMTUzIDUuOTUxIDEuMyAxMS45OTggMS4zaDguNjQ2bDMuMTIyLTEwLjMzOC03LjUyNy40MTQtMi41MDMuMTQ2Yy0uMzQyLS4xNDYtLjY2OC0uMjgtMS4wMzItLjY0NC0uMzE3LS4zMTQtLjg1Mi0uMTIxLS43NjUtMi4xMTRsLjA1OS03LjA3OSA3Ljg5NC0uMzI2YzQuMjYzIDAgNi4wODUtMS4zODcgNy42MzktMi43MDggMS40ODMtMS4yNjUgMS45NjgtMi43MiAyLjUyOC00LjY4OWwxLjMyNC02LjI2OGgtMTAuODQ4bC0xLjM4NCA0LjQyMXoiIGZpbGw9IiNGRUZFRkUiLz48L3N2Zz4=");
}
.rccs__card--visa .rccs__card__background,
.rccs__card--visaelectron .rccs__card__background {
@@ -161,10 +161,10 @@ const Container = styled.div`
background-size: 75%;
}
.rccs__card--visa .rccs__issuer {
- background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSI1MTJweCIgaGVpZ2h0PSIxNjZweCIgdmlld0JveD0iMCAwIDUxMiAxNjYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPiAgICA8Zz4gICAgICAgIDxwYXRoIGQ9Ik0yNjQuNzk0MTg3LDExMi40Nzk0OTEgQzI2NC41MDIwNzIsODkuNDQ4NTYxNiAyODUuMzE5MDgsNzYuNTk1NTE5OCAzMDEuMDAxMDIxLDY4Ljk1NDQxNzIgQzMxNy4xMTM0NDcsNjEuMTEzNDQ2NiAzMjIuNTI1MjU0LDU2LjA4NjAwMDggMzIyLjQ2Mzc1Niw0OS4wNzUyNTA3IEMzMjIuMzQwNzYsMzguMzQzODgzMyAzMDkuNjEwNzE0LDMzLjYwODU1MiAyOTcuNjk1NTE0LDMzLjQyNDA1ODYgQzI3Ni45MDkyNTUsMzMuMTAxMTk1MSAyNjQuODI0OTM1LDM5LjAzNTczMzYgMjU1LjIxNTkwMyw0My41MjUwNzM2IEwyNDcuNzI4NTQ1LDguNDg2Njk3NSBDMjU3LjM2ODMyNiw0LjA0MzQ4MDg3IDI3NS4yMTgwNjUsMC4xNjkxMTg5NzIgMjkzLjcyODkwNSwtMS40MjEwODU0N2UtMTQgQzMzNy4xNzcxMDYsLTEuNDIxMDg1NDdlLTE0IDM2NS42MDQ0NjgsMjEuNDQ3MzYwNSAzNjUuNzU4MjEzLDU0LjcwMjMwMDIgQzM2NS45MjczMzIsOTYuOTA1MTcwOSAzMDcuMzgxNDE5LDk5LjI0MjA4NzYgMzA3Ljc4MTE1NCwxMTguMTA2NTQgQzMwNy45MTk1MjQsMTIzLjgyNTgzNiAzMTMuMzc3NDU1LDEyOS45Mjk0OTQgMzI1LjMzODc3OCwxMzEuNDgyMzEzIEMzMzEuMjU3OTQyLDEzMi4yNjY0MSAzNDcuNjAwOTg1LDEzMi44NjYwMTQgMzY2LjEyNzIsMTI0LjMzMzE5MyBMMzczLjM5OTMxNSwxNTguMjMzODYgQzM2My40MzY2NywxNjEuODYyMjMgMzUwLjYyOTc1MiwxNjUuMzM2ODU3IDMzNC42ODY0NDUsMTY1LjMzNjg1NyBDMjkzLjc5MDQwMywxNjUuMzM2ODU3IDI2NS4wMjQ4MDMsMTQzLjU5NzM4MiAyNjQuNzk0MTg3LDExMi40Nzk0OTEgTTQ0My4yNzYyLDE2Mi40MTU3MTEgQzQzNS4zNDI5ODIsMTYyLjQxNTcxMSA0MjguNjU1MDk2LDE1Ny43ODgwMDEgNDI1LjY3MjQ1MiwxNTAuNjg1MDA0IEwzNjMuNjA1Nzg5LDIuNDkwNjYxMjIgTDQwNy4wMjMyNDIsMi40OTA2NjEyMiBMNDE1LjY2MzY4NCwyNi4zNjcxODUyIEw0NjguNzIwOTE4LDI2LjM2NzE4NTIgTDQ3My43MzI5ODksMi40OTA2NjEyMiBMNTEyLDIuNDkwNjYxMjIgTDQ3OC42MDY2OSwxNjIuNDE1NzExIEw0NDMuMjc2MiwxNjIuNDE1NzExIE00NDkuMzQ5MTA4LDExOS4yMTM1MDEgTDQ2MS44NzkyODcsNTkuMTYwODkxMiBMNDI3LjU2MzUxLDU5LjE2MDg5MTIgTDQ0OS4zNDkxMDgsMTE5LjIxMzUwMSBNMjEyLjE1MjA2MywxNjIuNDE1NzExIEwxNzcuOTI4NTMzLDIuNDkwNjYxMjIgTDIxOS4zMDExODMsMi40OTA2NjEyMiBMMjUzLjUwOTMzOSwxNjIuNDE1NzExIEwyMTIuMTUyMDYzLDE2Mi40MTU3MTEgTTE1MC45NDYzNywxNjIuNDE1NzExIEwxMDcuODgyNTMsNTMuNTY0NTkwNyBMOTAuNDYzMjc1NSwxNDYuMTE4NzkyIEM4OC40MTg0NzM0LDE1Ni40NTA0MjMgODAuMzQ2ODg2MSwxNjIuNDE1NzExIDcxLjM4MzU4MDYsMTYyLjQxNTcxMSBMMC45ODM5NjQ5MjcsMTYyLjQxNTcxMSBMMCwxNTcuNzcyNjI2IEMxNC40NTE5ODQ5LDE1NC42MzYyMzggMzAuODcxODk5NiwxNDkuNTc4MDQzIDQwLjgxOTE3LDE0NC4xNjYyMzYgQzQ2LjkwNzQ1MywxNDAuODYwNzI5IDQ4LjY0NDc2NjEsMTM3Ljk3MDMzMiA1MC42NDM0NDQ4LDEzMC4xMTM5ODcgTDgzLjYzNzAxODgsMi40OTA2NjEyMiBMMTI3LjM2MTk2LDIuNDkwNjYxMjIgTDE5NC4zOTQ1NzEsMTYyLjQxNTcxMSBMMTUwLjk0NjM3LDE2Mi40MTU3MTEiIGZpbGw9IiNGRkZGRkYiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI1Ni4wMDAwMDAsIDgyLjY2ODQyOCkgc2NhbGUoMSwgLTEpIHRyYW5zbGF0ZSgtMjU2LjAwMDAwMCwgLTgyLjY2ODQyOCkgIj48L3BhdGg+ICAgIDwvZz48L3N2Zz4=');
+ background-image: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSI1MTJweCIgaGVpZ2h0PSIxNjZweCIgdmlld0JveD0iMCAwIDUxMiAxNjYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPiAgICA8Zz4gICAgICAgIDxwYXRoIGQ9Ik0yNjQuNzk0MTg3LDExMi40Nzk0OTEgQzI2NC41MDIwNzIsODkuNDQ4NTYxNiAyODUuMzE5MDgsNzYuNTk1NTE5OCAzMDEuMDAxMDIxLDY4Ljk1NDQxNzIgQzMxNy4xMTM0NDcsNjEuMTEzNDQ2NiAzMjIuNTI1MjU0LDU2LjA4NjAwMDggMzIyLjQ2Mzc1Niw0OS4wNzUyNTA3IEMzMjIuMzQwNzYsMzguMzQzODgzMyAzMDkuNjEwNzE0LDMzLjYwODU1MiAyOTcuNjk1NTE0LDMzLjQyNDA1ODYgQzI3Ni45MDkyNTUsMzMuMTAxMTk1MSAyNjQuODI0OTM1LDM5LjAzNTczMzYgMjU1LjIxNTkwMyw0My41MjUwNzM2IEwyNDcuNzI4NTQ1LDguNDg2Njk3NSBDMjU3LjM2ODMyNiw0LjA0MzQ4MDg3IDI3NS4yMTgwNjUsMC4xNjkxMTg5NzIgMjkzLjcyODkwNSwtMS40MjEwODU0N2UtMTQgQzMzNy4xNzcxMDYsLTEuNDIxMDg1NDdlLTE0IDM2NS42MDQ0NjgsMjEuNDQ3MzYwNSAzNjUuNzU4MjEzLDU0LjcwMjMwMDIgQzM2NS45MjczMzIsOTYuOTA1MTcwOSAzMDcuMzgxNDE5LDk5LjI0MjA4NzYgMzA3Ljc4MTE1NCwxMTguMTA2NTQgQzMwNy45MTk1MjQsMTIzLjgyNTgzNiAzMTMuMzc3NDU1LDEyOS45Mjk0OTQgMzI1LjMzODc3OCwxMzEuNDgyMzEzIEMzMzEuMjU3OTQyLDEzMi4yNjY0MSAzNDcuNjAwOTg1LDEzMi44NjYwMTQgMzY2LjEyNzIsMTI0LjMzMzE5MyBMMzczLjM5OTMxNSwxNTguMjMzODYgQzM2My40MzY2NywxNjEuODYyMjMgMzUwLjYyOTc1MiwxNjUuMzM2ODU3IDMzNC42ODY0NDUsMTY1LjMzNjg1NyBDMjkzLjc5MDQwMywxNjUuMzM2ODU3IDI2NS4wMjQ4MDMsMTQzLjU5NzM4MiAyNjQuNzk0MTg3LDExMi40Nzk0OTEgTTQ0My4yNzYyLDE2Mi40MTU3MTEgQzQzNS4zNDI5ODIsMTYyLjQxNTcxMSA0MjguNjU1MDk2LDE1Ny43ODgwMDEgNDI1LjY3MjQ1MiwxNTAuNjg1MDA0IEwzNjMuNjA1Nzg5LDIuNDkwNjYxMjIgTDQwNy4wMjMyNDIsMi40OTA2NjEyMiBMNDE1LjY2MzY4NCwyNi4zNjcxODUyIEw0NjguNzIwOTE4LDI2LjM2NzE4NTIgTDQ3My43MzI5ODksMi40OTA2NjEyMiBMNTEyLDIuNDkwNjYxMjIgTDQ3OC42MDY2OSwxNjIuNDE1NzExIEw0NDMuMjc2MiwxNjIuNDE1NzExIE00NDkuMzQ5MTA4LDExOS4yMTM1MDEgTDQ2MS44NzkyODcsNTkuMTYwODkxMiBMNDI3LjU2MzUxLDU5LjE2MDg5MTIgTDQ0OS4zNDkxMDgsMTE5LjIxMzUwMSBNMjEyLjE1MjA2MywxNjIuNDE1NzExIEwxNzcuOTI4NTMzLDIuNDkwNjYxMjIgTDIxOS4zMDExODMsMi40OTA2NjEyMiBMMjUzLjUwOTMzOSwxNjIuNDE1NzExIEwyMTIuMTUyMDYzLDE2Mi40MTU3MTEgTTE1MC45NDYzNywxNjIuNDE1NzExIEwxMDcuODgyNTMsNTMuNTY0NTkwNyBMOTAuNDYzMjc1NSwxNDYuMTE4NzkyIEM4OC40MTg0NzM0LDE1Ni40NTA0MjMgODAuMzQ2ODg2MSwxNjIuNDE1NzExIDcxLjM4MzU4MDYsMTYyLjQxNTcxMSBMMC45ODM5NjQ5MjcsMTYyLjQxNTcxMSBMMCwxNTcuNzcyNjI2IEMxNC40NTE5ODQ5LDE1NC42MzYyMzggMzAuODcxODk5NiwxNDkuNTc4MDQzIDQwLjgxOTE3LDE0NC4xNjYyMzYgQzQ2LjkwNzQ1MywxNDAuODYwNzI5IDQ4LjY0NDc2NjEsMTM3Ljk3MDMzMiA1MC42NDM0NDQ4LDEzMC4xMTM5ODcgTDgzLjYzNzAxODgsMi40OTA2NjEyMiBMMTI3LjM2MTk2LDIuNDkwNjYxMjIgTDE5NC4zOTQ1NzEsMTYyLjQxNTcxMSBMMTUwLjk0NjM3LDE2Mi40MTU3MTEiIGZpbGw9IiNGRkZGRkYiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI1Ni4wMDAwMDAsIDgyLjY2ODQyOCkgc2NhbGUoMSwgLTEpIHRyYW5zbGF0ZSgtMjU2LjAwMDAwMCwgLTgyLjY2ODQyOCkgIj48L3BhdGg+ICAgIDwvZz48L3N2Zz4=");
}
.rccs__card--visaelectron .rccs__issuer {
- background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSI1MTJweCIgaGVpZ2h0PSIyMjhweCIgdmlld0JveD0iMCAwIDUxMiAyMjgiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPiAgICA8Zz4gICAgICAgIDxwYXRoIGQ9Ik0xOTQuMzkzMDEyLDIuOTE5MzQ0MTMgTDEyNy4zNjI1MTcsMTYyLjgzNTk4MSBMODMuNjI3OTMwNywxNjIuODM1OTgxIEw1MC42MzkwMTUyLDM1LjIwODY2MzIgQzQ4LjY0MTU2OTIsMjcuMzY1OTkwNyA0Ni45MDIzODU1LDI0LjQ3OTMzOCA0MC44MTUyNDI0LDIxLjE2NDQyNzYgQzMwLjg2NzI0MjIsMTUuNzYwNTM1MyAxNC40Mzk4MDE4LDEwLjcwNjQ0MTIgMCw3LjU2MTUyNjI4IEwwLjk3NDIwNDQyNCwyLjkxOTM0NDEzIEw3MS4zODE3MjM1LDIuOTE5MzQ0MTMgQzgwLjM0MjQ0MjcsMi45MTkzNDQxMyA4OC40MTA2ODYsOC44ODU1Mjg5NCA5MC40NjA0MzgzLDE5LjIxNjAxODggTDEwNy44OTE1MDUsMTExLjc2MjE3IEwxNTAuOTIzMjI2LDIuOTE5MzQ0MTMgTDE5NC4zOTMwMTIsMi45MTkzNDQxMyBaIE0yNTMuNTE1NDUyLDIuOTE5MzQ0MTMgTDIxOS4zMDcxNDYsMTYyLjgzNTk4MSBMMTc3LjkzMjg4LDE2Mi44MzU5ODEgTDIxMi4xNDExODYsMi45MTkzNDQxMyBMMjUzLjUxNTQ1MiwyLjkxOTM0NDEzIFogTTMwNy43Nzk5NDYsNDcuMjI5Mjk5NyBDMzA3LjkyMDUxOSw0MS40OTg0OTMxIDMxMy4zNzk5ODcsMzUuMzk1MDA0MyAzMjUuMzMxOTcxLDMzLjgzNTYyMzQgQzMzMS4yNTIzODgsMzMuMDcwNjQ0MSAzNDcuNjA3OTA3LDMyLjQ1OTMxNDUgMzY2LjEzNDEzNyw0MC45OTUwNDUyIEwzNzMuMzgxODI2LDcuMDY0NjE2NjQgQzM2My40MjcyODcsMy40NjUyOTA5IDM1MC42MTg3ODcsMCAzMzQuNjg0OTg3LDAgQzI5My43ODQ3NDcsMCAyNjUuMDEzMDI1LDIxLjcyMzQ1MSAyNjQuNzg0MTg2LDUyLjg1NTQ5MzcgQzI2NC41MTYxMTYsNzUuODgzMzMyNSAyODUuMzM0MDE0LDg4LjcxNzk4NTQgMzAwLjk4OTkzNyw5Ni4zODczOTM0IEMzMTcuMTE2NjE2LDEwNC4yMjAyNTggMzIyLjUyMzc3OCwxMDkuMjU0NzM4IDMyMi40NDg1ODgsMTE2LjI1Mzk3MSBDMzIyLjMzNDE2OCwxMjYuOTgzMjk3IDMwOS41NzE0MzYsMTMxLjczMzM2MSAyOTcuNzA0NDQ5LDEzMS45MDk4OTQgQzI3Ni44OTYzNTgsMTMyLjI0MDA3OCAyNjQuODMzMjIzLDEyNi4yODY5NjkgMjU1LjIxMjEzNywxMjEuODA0OTc1IEwyNDcuNzAyOTE3LDE1Ni44NTk5ODkgQzI1Ny4zODI4NDcsMTYxLjI5NjIxNSAyNzUuMjIyNTU3LDE2NS4xNTA1MzQgMjkzLjY5OTc1LDE2NS4zNDY2ODIgQzMzNy4xNzkzNDMsMTY1LjM0NjY4MiAzNjUuNjE3NjEzLDE0My44NzE2ODYgMzY1Ljc0NTEwOSwxMTAuNjI0NTA4IEMzNjUuOTE4Mzc0LDY4LjQyNjQxODggMzA3LjM5NzQ1Niw2Ni4wODU3MTI4IDMwNy43Nzk5NDYsNDcuMjI5Mjk5NyBaIE00NzMuNzQ3NzY1LDE2Mi44MzU5ODEgTDUxMiwxNjIuODM1OTgxIEw0NzguNTc5NTU4LDIuOTE5MzQ0MTMgTDQ0My4yODU4OTcsMi45MTkzNDQxMyBDNDM1LjMyNTUzNSwyLjkxOTM0NDEzIDQyOC42MzY4Nyw3LjUzODY0MjI4IDQyNS42Njg0ODksMTQuNjQyNDg4NiBMMzYzLjU4NzQ3NSwxNjIuODM1OTgxIEw0MDcuMDM0Mzc3LDE2Mi44MzU5ODEgTDQxNS42NTE4MzYsMTM4Ljk0ODM1OCBMNDY4LjczMjkwMSwxMzguOTQ4MzU4IEw0NzMuNzQ3NzY1LDE2Mi44MzU5ODEgWiBNNDI3LjU2NDU5MSwxMDYuMTc4NDc1IEw0NDkuMzUwMTU2LDQ2LjEyNDMyOTYgTDQ2MS44NjQ0MzMsMTA2LjE3ODQ3NSBMNDI3LjU2NDU5MSwxMDYuMTc4NDc1IFogTTMwNi40NjQ3NywyMDYuODU0MzI5IEwyODkuNjU0ODQsMjA2Ljg1NDMyOSBMMjg5LjY1NDg0LDIyMi41MDA0NDQgTDMwOC40NTg5NDcsMjIyLjUwMDQ0NCBMMzA4LjQ1ODk0NywyMjcuMjA0NzQgTDI4My45ODk0MTYsMjI3LjIwNDc0IEwyODMuOTg5NDE2LDE4My43OTcwNjggTDMwNy40OTQ1NSwxODMuNzk3MDY4IEwzMDcuNDk0NTUsMTg4LjUwMTM2NCBMMjg5LjY1NDg0LDE4OC41MDEzNjQgTDI4OS42NTQ4NCwyMDIuMjE1NDE2IEwzMDYuNDY0NzcsMjAyLjIxNTQxNiBMMzA2LjQ2NDc3LDIwNi44NTQzMjkgWiBNMzE3LjE0MzQyMywxODEuNDgxMjA4IEwzMjIuODA4ODQ3LDE4MS40ODEyMDggTDMyMi44MDg4NDcsMjI3LjIwMzQzMyBMMzE3LjE0MzQyMywyMjcuMjAzNDMzIEwzMTcuMTQzNDIzLDE4MS40ODEyMDggWiBNMzQ3Ljc4NzM4MywyMjMuNDY5MDkxIEMzNTEuODQ3NjU4LDIyMy40NjkwOTEgMzU0LjM1ODM1OSwyMjIuNzU5Njg3IDM1Ni40MjExODgsMjIxLjg2MDY3MyBMMzU3LjQ1MDk2OCwyMjUuOTE3Njc5IEMzNTUuNDUzNTIyLDIyNi44MTY2OTMgMzUxLjk3ODQyNCwyMjcuOTExODU2IDM0Ny4wMTU4NjYsMjI3LjkxMTg1NiBDMzM3LjQyNDIwMiwyMjcuOTExODU2IDMzMS42OTMzOTUsMjIxLjUzNzAyOCAzMzEuNjkzMzk1LDIxMi4xMzQ5NzUgQzMzMS42OTMzOTUsMjAyLjczMjkyMSAzMzcuMjI4MDUzLDE5NS4zOTA0MjggMzQ2LjMwOTczMSwxOTUuMzkwNDI4IEMzNTYuNTQ4Njg1LDE5NS4zOTA0MjggMzU5LjE5MDE1MiwyMDQuMjc5MjI2IDM1OS4xOTAxNTIsMjEwLjAxMDAzMiBDMzU5LjE5MDE1MiwyMTEuMTY3MzA5IDM1OS4xMjQ3NjksMjEyLjAwNDIwOSAzNTguOTk0MDAzLDIxMi42NDgyMyBMMzM3LjEwMDU1NywyMTIuNjQ4MjMgQzMzNy4yMjgwNTMsMjIwLjMxNDM2OSAzNDIuMDU5ODQ2LDIyMy40NjkwOTEgMzQ3Ljc4NzM4MywyMjMuNDY5MDkxIFogTTM1My43MTQzMzgsMjA4LjU5MTIyNCBDMzUzLjc3OTcyMSwyMDUuMDUwNzQzIDM1Mi4yMzM0MTcsMTk5LjQ0NzQzMyAzNDUuODU4NTg5LDE5OS40NDc0MzMgQzM0MC4wNjI0LDE5OS40NDc0MzMgMzM3LjYxMzgxMiwyMDQuNjY0OTg0IDMzNy4xNjI2NywyMDguNTkxMjI0IEwzNTMuNzE0MzM4LDIwOC41OTEyMjQgWiBNMzkwLjAyMjc0MSwyMjYuMTA4NTk3IEMzODguNTQxODE5LDIyNi44MTgwMDEgMzg1LjI1NjMzMSwyMjcuOTEzMTYzIDM4MS4wNzE4MjksMjI3LjkxMzE2MyBDMzcxLjY2OTc3NiwyMjcuOTEzMTYzIDM2NS41NTMyMSwyMjEuNTM4MzM2IDM2NS41NTMyMSwyMTIuMDA1NTE3IEMzNjUuNTUzMjEsMjAyLjQxMDU4NCAzNzIuMTE3NjQ4LDE5NS4zOTE3MzUgMzgyLjI5NDQ4OCwxOTUuMzkxNzM1IEMzODUuNjQyMDksMTk1LjM5MTczNSAzODguNjAzOTMzLDE5Ni4yMjUzNjcgMzkwLjE1MDIzOCwxOTcuMDY1NTM2IEwzODguODY1NDY1LDIwMS4zODA4MDQgQzM4Ny41MDg3NywyMDAuNjcxNCAzODUuMzgzODI4LDE5OS44OTY2MTMgMzgyLjI5NDQ4OCwxOTkuODk2NjEzIEMzNzUuMTQ0ODc0LDE5OS44OTY2MTMgMzcxLjI4NDAxNywyMDUuMjQxNjYxIDM3MS4yODQwMTcsMjExLjY4NTE0MSBDMzcxLjI4NDAxNywyMTguODk2ODY5IDM3NS45MTk2NjEsMjIzLjMzOTYzMyAzODIuMTAxNjA5LDIyMy4zMzk2MzMgQzM4NS4zMjE3MTQsMjIzLjMzOTYzMyAzODcuNDQ2NjU3LDIyMi41NjgxMTYgMzg5LjA1NTA3NSwyMjEuODU4NzEyIEwzOTAuMDIyNzQxLDIyNi4xMDg1OTcgWiBNNDA1LjkxODI5MiwxODguNTY0NDU4IEw0MDUuOTE4MjkyLDE5Ni4wMzQ0NDkgTDQxNC4wMjkwMzQsMTk2LjAzNDQ0OSBMNDE0LjAyOTAzNCwyMDAuMzQ2NDQ3IEw0MDUuOTE4MjkyLDIwMC4zNDY0NDcgTDQwNS45MTgyOTIsMjE3LjE1NjM3NyBDNDA1LjkxODI5MiwyMjEuMDIzNzczIDQwNy4wMTM0NTUsMjIzLjIxMDgyOSA0MTAuMTY4MTc3LDIyMy4yMTA4MjkgQzQxMS43MTEyMTIsMjIzLjIxMDgyOSA0MTIuNjE2NzY1LDIyMy4wODMzMzIgNDEzLjQ1MzY2NSwyMjIuODIxODAxIEw0MTMuNzExOTI3LDIyNy4xNDAzMzggQzQxMi42MTY3NjUsMjI3LjUyNjA5NyA0MTAuODc3NTgxLDIyNy45MTE4NTYgNDA4LjY4NzI1NSwyMjcuOTExODU2IEM0MDYuMDQ1Nzg4LDIyNy45MTE4NTYgNDAzLjkyMDg0NiwyMjcuMDA5NTcyIDQwMi41NzA2OSwyMjUuNTMxOTIgQzQwMS4wMjQzODYsMjIzLjc4OTQ2NyA0MDAuMzgwMzY1LDIyMS4wMjM3NzMgNDAwLjM4MDM2NSwyMTcuMzUyNTI2IEw0MDAuMzgwMzY1LDIwMC4zNDY0NDcgTDM5NS41NDg1NzIsMjAwLjM0NjQ0NyBMMzk1LjU0ODU3MiwxOTYuMDM0NDQ5IEw0MDAuMzgwMzY1LDE5Ni4wMzQ0NDkgTDQwMC4zODAzNjUsMTkwLjIzODI1OSBMNDA1LjkxODI5MiwxODguNTY0NDU4IFogTTQyMS45NDQ5MzUsMjA1Ljc1OTQ5MyBDNDIxLjk0NDkzNSwyMDIuMDg4MjQ2IDQyMS44NzYyODMsMTk4LjkzMzUyNCA0MjEuNjg2NjczLDE5Ni4wMzM3OTUgTDQyNi42NDU5NjIsMTk2LjAzMzc5NSBMNDI2LjkwNDIyNCwyMDIuMjE1NzQzIEw0MjcuMDkzODM1LDIwMi4yMTU3NDMgQzQyOC41MTI2NDIsMTk4LjAzMTI0MSA0MzEuOTg3NzQxLDE5NS4zODk3NzQgNDM1Ljc4NjQ4NCwxOTUuMzg5Nzc0IEM0MzYuMzY4MzkxLDE5NS4zODk3NzQgNDM2LjgxOTUzMywxOTUuNDU1MTU3IDQzNy4zMzYwNTgsMTk1LjUxNzI3IEw0MzcuMzM2MDU4LDIwMC44NjU1ODcgQzQzNi43NTQxNSwyMDAuNzM0ODIxIDQzNi4xNzg3ODEsMjAwLjczNDgyMSA0MzUuNDAwNzI1LDIwMC43MzQ4MjEgQzQzMS40MTIzNzIsMjAwLjczNDgyMSA0MjguNTc0NzU2LDIwMy42OTY2NjQgNDI3LjgwMzIzOCwyMDcuOTQ5ODE5IEM0MjcuNjc1NzQyLDIwOC43MjEzMzYgNDI3LjYxMDM1OSwyMDkuNjg1NzMzIDQyNy42MTAzNTksMjEwLjU5MTI4NiBMNDI3LjYxMDM1OSwyMjcuMjA1MDY3IEw0MjEuOTQ0OTM1LDIyNy4yMDUwNjcgTDQyMS45NDQ5MzUsMjA1Ljc1OTQ5MyBaIE00NzIuMTY2NDgxLDIxMS4zNjExNjkgQzQ3Mi4xNjY0ODEsMjIyLjg4ODE2NSA0NjQuMTE0NTgzLDIyNy45MTI4MzYgNDU2LjY0NDU5MywyMjcuOTEyODM2IEM0NDguMjcyMzIsMjI3LjkxMjgzNiA0NDEuNzA3ODgyLDIyMS43Mjc2MTkgNDQxLjcwNzg4MiwyMTEuODc3NjkzIEM0NDEuNzA3ODgyLDIwMS41MDc5NzQgNDQ4LjU5NTk2NSwxOTUuMzkxNDA4IDQ1Ny4xNjExMTgsMTk1LjM5MTQwOCBDNDY2LjExMjAyOSwxOTUuMzkxNDA4IDQ3Mi4xNjY0ODEsMjAxLjg5MzczMiA0NzIuMTY2NDgxLDIxMS4zNjExNjkgWiBNNDQ3LjUwMDgwMiwyMTEuNjg0ODE0IEM0NDcuNTAwODAyLDIxOC41MTA3ODMgNDUxLjM2NDkyOCwyMjMuNjYyOTUxIDQ1Ni45MDI4NTUsMjIzLjY2Mjk1MSBDNDYyLjMxMzI4NiwyMjMuNjYyOTUxIDQ2Ni4zNjcwMjMsMjE4LjU3Mjg5NyA0NjYuMzY3MDIzLDIxMS41NTQwNDggQzQ2Ni4zNjcwMjMsMjA2LjI3NDM4MyA0NjMuNzI4ODI1LDE5OS42MzgwMjQgNDU3LjAzMDM1MiwxOTkuNjM4MDI0IEM0NTAuNDAwNTMxLDE5OS42MzgwMjQgNDQ3LjUwMDgwMiwyMDUuODIzMjQyIDQ0Ny41MDA4MDIsMjExLjY4NDgxNCBaIE00ODAuODQ5OTc3LDIwNC40Njk0OSBDNDgwLjg0OTk3NywyMDEuMTg3MjcxIDQ4MC43ODEzMjUsMTk4LjYxMTE4NyA0ODAuNTkxNzE1LDE5Ni4wMzUxMDIgTDQ4NS42MTMxMTcsMTk2LjAzNTEwMiBMNDg1LjkzNjc2MywyMDEuMTg3MjcxIEw0ODYuMDY0MjU5LDIwMS4xODcyNzEgQzQ4Ny42MTA1NjMsMTk4LjI4NzU0MiA0OTEuMjE2NDI3LDE5NS4zOTEwODEgNDk2LjM2ODU5NiwxOTUuMzkxMDgxIEM1MDAuNjgwNTk1LDE5NS4zOTEwODEgNTA3LjM3OTA2NywxOTcuOTY3MTY2IDUwNy4zNzkwNjcsMjA4LjY1Mzk5MiBMNTA3LjM3OTA2NywyMjcuMjAzMTA2IEw1MDEuNzEzNjQ0LDIyNy4yMDMxMDYgTDUwMS43MTM2NDQsMjA5LjIzNTg5OSBDNTAxLjcxMzY0NCwyMDQuMjE0NDk3IDQ5OS44NDY5NjMsMjAwLjAyNjcyNSA0OTQuNTAxOTE2LDIwMC4wMjY3MjUgQzQ5MC44MzA2NjksMjAwLjAyNjcyNSA0ODcuOTMwOTM5LDIwMi42NjgxOTIgNDg2LjkwNDQyOSwyMDUuODIyOTE1IEM0ODYuNjQyODk3LDIwNi41MzIzMTkgNDg2LjUxNTQwMSwyMDcuNDk2NzE2IDQ4Ni41MTU0MDEsMjA4LjQ2NDM4MiBMNDg2LjUxNTQwMSwyMjcuMjAzMTA2IEw0ODAuODQ5OTc3LDIyNy4yMDMxMDYgTDQ4MC44NDk5NzcsMjA0LjQ2OTQ5IFoiIGZpbGw9IiNGRkZGRkYiPjwvcGF0aD4gICAgPC9nPjwvc3ZnPg==');
+ background-image: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSI1MTJweCIgaGVpZ2h0PSIyMjhweCIgdmlld0JveD0iMCAwIDUxMiAyMjgiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPiAgICA8Zz4gICAgICAgIDxwYXRoIGQ9Ik0xOTQuMzkzMDEyLDIuOTE5MzQ0MTMgTDEyNy4zNjI1MTcsMTYyLjgzNTk4MSBMODMuNjI3OTMwNywxNjIuODM1OTgxIEw1MC42MzkwMTUyLDM1LjIwODY2MzIgQzQ4LjY0MTU2OTIsMjcuMzY1OTkwNyA0Ni45MDIzODU1LDI0LjQ3OTMzOCA0MC44MTUyNDI0LDIxLjE2NDQyNzYgQzMwLjg2NzI0MjIsMTUuNzYwNTM1MyAxNC40Mzk4MDE4LDEwLjcwNjQ0MTIgMCw3LjU2MTUyNjI4IEwwLjk3NDIwNDQyNCwyLjkxOTM0NDEzIEw3MS4zODE3MjM1LDIuOTE5MzQ0MTMgQzgwLjM0MjQ0MjcsMi45MTkzNDQxMyA4OC40MTA2ODYsOC44ODU1Mjg5NCA5MC40NjA0MzgzLDE5LjIxNjAxODggTDEwNy44OTE1MDUsMTExLjc2MjE3IEwxNTAuOTIzMjI2LDIuOTE5MzQ0MTMgTDE5NC4zOTMwMTIsMi45MTkzNDQxMyBaIE0yNTMuNTE1NDUyLDIuOTE5MzQ0MTMgTDIxOS4zMDcxNDYsMTYyLjgzNTk4MSBMMTc3LjkzMjg4LDE2Mi44MzU5ODEgTDIxMi4xNDExODYsMi45MTkzNDQxMyBMMjUzLjUxNTQ1MiwyLjkxOTM0NDEzIFogTTMwNy43Nzk5NDYsNDcuMjI5Mjk5NyBDMzA3LjkyMDUxOSw0MS40OTg0OTMxIDMxMy4zNzk5ODcsMzUuMzk1MDA0MyAzMjUuMzMxOTcxLDMzLjgzNTYyMzQgQzMzMS4yNTIzODgsMzMuMDcwNjQ0MSAzNDcuNjA3OTA3LDMyLjQ1OTMxNDUgMzY2LjEzNDEzNyw0MC45OTUwNDUyIEwzNzMuMzgxODI2LDcuMDY0NjE2NjQgQzM2My40MjcyODcsMy40NjUyOTA5IDM1MC42MTg3ODcsMCAzMzQuNjg0OTg3LDAgQzI5My43ODQ3NDcsMCAyNjUuMDEzMDI1LDIxLjcyMzQ1MSAyNjQuNzg0MTg2LDUyLjg1NTQ5MzcgQzI2NC41MTYxMTYsNzUuODgzMzMyNSAyODUuMzM0MDE0LDg4LjcxNzk4NTQgMzAwLjk4OTkzNyw5Ni4zODczOTM0IEMzMTcuMTE2NjE2LDEwNC4yMjAyNTggMzIyLjUyMzc3OCwxMDkuMjU0NzM4IDMyMi40NDg1ODgsMTE2LjI1Mzk3MSBDMzIyLjMzNDE2OCwxMjYuOTgzMjk3IDMwOS41NzE0MzYsMTMxLjczMzM2MSAyOTcuNzA0NDQ5LDEzMS45MDk4OTQgQzI3Ni44OTYzNTgsMTMyLjI0MDA3OCAyNjQuODMzMjIzLDEyNi4yODY5NjkgMjU1LjIxMjEzNywxMjEuODA0OTc1IEwyNDcuNzAyOTE3LDE1Ni44NTk5ODkgQzI1Ny4zODI4NDcsMTYxLjI5NjIxNSAyNzUuMjIyNTU3LDE2NS4xNTA1MzQgMjkzLjY5OTc1LDE2NS4zNDY2ODIgQzMzNy4xNzkzNDMsMTY1LjM0NjY4MiAzNjUuNjE3NjEzLDE0My44NzE2ODYgMzY1Ljc0NTEwOSwxMTAuNjI0NTA4IEMzNjUuOTE4Mzc0LDY4LjQyNjQxODggMzA3LjM5NzQ1Niw2Ni4wODU3MTI4IDMwNy43Nzk5NDYsNDcuMjI5Mjk5NyBaIE00NzMuNzQ3NzY1LDE2Mi44MzU5ODEgTDUxMiwxNjIuODM1OTgxIEw0NzguNTc5NTU4LDIuOTE5MzQ0MTMgTDQ0My4yODU4OTcsMi45MTkzNDQxMyBDNDM1LjMyNTUzNSwyLjkxOTM0NDEzIDQyOC42MzY4Nyw3LjUzODY0MjI4IDQyNS42Njg0ODksMTQuNjQyNDg4NiBMMzYzLjU4NzQ3NSwxNjIuODM1OTgxIEw0MDcuMDM0Mzc3LDE2Mi44MzU5ODEgTDQxNS42NTE4MzYsMTM4Ljk0ODM1OCBMNDY4LjczMjkwMSwxMzguOTQ4MzU4IEw0NzMuNzQ3NzY1LDE2Mi44MzU5ODEgWiBNNDI3LjU2NDU5MSwxMDYuMTc4NDc1IEw0NDkuMzUwMTU2LDQ2LjEyNDMyOTYgTDQ2MS44NjQ0MzMsMTA2LjE3ODQ3NSBMNDI3LjU2NDU5MSwxMDYuMTc4NDc1IFogTTMwNi40NjQ3NywyMDYuODU0MzI5IEwyODkuNjU0ODQsMjA2Ljg1NDMyOSBMMjg5LjY1NDg0LDIyMi41MDA0NDQgTDMwOC40NTg5NDcsMjIyLjUwMDQ0NCBMMzA4LjQ1ODk0NywyMjcuMjA0NzQgTDI4My45ODk0MTYsMjI3LjIwNDc0IEwyODMuOTg5NDE2LDE4My43OTcwNjggTDMwNy40OTQ1NSwxODMuNzk3MDY4IEwzMDcuNDk0NTUsMTg4LjUwMTM2NCBMMjg5LjY1NDg0LDE4OC41MDEzNjQgTDI4OS42NTQ4NCwyMDIuMjE1NDE2IEwzMDYuNDY0NzcsMjAyLjIxNTQxNiBMMzA2LjQ2NDc3LDIwNi44NTQzMjkgWiBNMzE3LjE0MzQyMywxODEuNDgxMjA4IEwzMjIuODA4ODQ3LDE4MS40ODEyMDggTDMyMi44MDg4NDcsMjI3LjIwMzQzMyBMMzE3LjE0MzQyMywyMjcuMjAzNDMzIEwzMTcuMTQzNDIzLDE4MS40ODEyMDggWiBNMzQ3Ljc4NzM4MywyMjMuNDY5MDkxIEMzNTEuODQ3NjU4LDIyMy40NjkwOTEgMzU0LjM1ODM1OSwyMjIuNzU5Njg3IDM1Ni40MjExODgsMjIxLjg2MDY3MyBMMzU3LjQ1MDk2OCwyMjUuOTE3Njc5IEMzNTUuNDUzNTIyLDIyNi44MTY2OTMgMzUxLjk3ODQyNCwyMjcuOTExODU2IDM0Ny4wMTU4NjYsMjI3LjkxMTg1NiBDMzM3LjQyNDIwMiwyMjcuOTExODU2IDMzMS42OTMzOTUsMjIxLjUzNzAyOCAzMzEuNjkzMzk1LDIxMi4xMzQ5NzUgQzMzMS42OTMzOTUsMjAyLjczMjkyMSAzMzcuMjI4MDUzLDE5NS4zOTA0MjggMzQ2LjMwOTczMSwxOTUuMzkwNDI4IEMzNTYuNTQ4Njg1LDE5NS4zOTA0MjggMzU5LjE5MDE1MiwyMDQuMjc5MjI2IDM1OS4xOTAxNTIsMjEwLjAxMDAzMiBDMzU5LjE5MDE1MiwyMTEuMTY3MzA5IDM1OS4xMjQ3NjksMjEyLjAwNDIwOSAzNTguOTk0MDAzLDIxMi42NDgyMyBMMzM3LjEwMDU1NywyMTIuNjQ4MjMgQzMzNy4yMjgwNTMsMjIwLjMxNDM2OSAzNDIuMDU5ODQ2LDIyMy40NjkwOTEgMzQ3Ljc4NzM4MywyMjMuNDY5MDkxIFogTTM1My43MTQzMzgsMjA4LjU5MTIyNCBDMzUzLjc3OTcyMSwyMDUuMDUwNzQzIDM1Mi4yMzM0MTcsMTk5LjQ0NzQzMyAzNDUuODU4NTg5LDE5OS40NDc0MzMgQzM0MC4wNjI0LDE5OS40NDc0MzMgMzM3LjYxMzgxMiwyMDQuNjY0OTg0IDMzNy4xNjI2NywyMDguNTkxMjI0IEwzNTMuNzE0MzM4LDIwOC41OTEyMjQgWiBNMzkwLjAyMjc0MSwyMjYuMTA4NTk3IEMzODguNTQxODE5LDIyNi44MTgwMDEgMzg1LjI1NjMzMSwyMjcuOTEzMTYzIDM4MS4wNzE4MjksMjI3LjkxMzE2MyBDMzcxLjY2OTc3NiwyMjcuOTEzMTYzIDM2NS41NTMyMSwyMjEuNTM4MzM2IDM2NS41NTMyMSwyMTIuMDA1NTE3IEMzNjUuNTUzMjEsMjAyLjQxMDU4NCAzNzIuMTE3NjQ4LDE5NS4zOTE3MzUgMzgyLjI5NDQ4OCwxOTUuMzkxNzM1IEMzODUuNjQyMDksMTk1LjM5MTczNSAzODguNjAzOTMzLDE5Ni4yMjUzNjcgMzkwLjE1MDIzOCwxOTcuMDY1NTM2IEwzODguODY1NDY1LDIwMS4zODA4MDQgQzM4Ny41MDg3NywyMDAuNjcxNCAzODUuMzgzODI4LDE5OS44OTY2MTMgMzgyLjI5NDQ4OCwxOTkuODk2NjEzIEMzNzUuMTQ0ODc0LDE5OS44OTY2MTMgMzcxLjI4NDAxNywyMDUuMjQxNjYxIDM3MS4yODQwMTcsMjExLjY4NTE0MSBDMzcxLjI4NDAxNywyMTguODk2ODY5IDM3NS45MTk2NjEsMjIzLjMzOTYzMyAzODIuMTAxNjA5LDIyMy4zMzk2MzMgQzM4NS4zMjE3MTQsMjIzLjMzOTYzMyAzODcuNDQ2NjU3LDIyMi41NjgxMTYgMzg5LjA1NTA3NSwyMjEuODU4NzEyIEwzOTAuMDIyNzQxLDIyNi4xMDg1OTcgWiBNNDA1LjkxODI5MiwxODguNTY0NDU4IEw0MDUuOTE4MjkyLDE5Ni4wMzQ0NDkgTDQxNC4wMjkwMzQsMTk2LjAzNDQ0OSBMNDE0LjAyOTAzNCwyMDAuMzQ2NDQ3IEw0MDUuOTE4MjkyLDIwMC4zNDY0NDcgTDQwNS45MTgyOTIsMjE3LjE1NjM3NyBDNDA1LjkxODI5MiwyMjEuMDIzNzczIDQwNy4wMTM0NTUsMjIzLjIxMDgyOSA0MTAuMTY4MTc3LDIyMy4yMTA4MjkgQzQxMS43MTEyMTIsMjIzLjIxMDgyOSA0MTIuNjE2NzY1LDIyMy4wODMzMzIgNDEzLjQ1MzY2NSwyMjIuODIxODAxIEw0MTMuNzExOTI3LDIyNy4xNDAzMzggQzQxMi42MTY3NjUsMjI3LjUyNjA5NyA0MTAuODc3NTgxLDIyNy45MTE4NTYgNDA4LjY4NzI1NSwyMjcuOTExODU2IEM0MDYuMDQ1Nzg4LDIyNy45MTE4NTYgNDAzLjkyMDg0NiwyMjcuMDA5NTcyIDQwMi41NzA2OSwyMjUuNTMxOTIgQzQwMS4wMjQzODYsMjIzLjc4OTQ2NyA0MDAuMzgwMzY1LDIyMS4wMjM3NzMgNDAwLjM4MDM2NSwyMTcuMzUyNTI2IEw0MDAuMzgwMzY1LDIwMC4zNDY0NDcgTDM5NS41NDg1NzIsMjAwLjM0NjQ0NyBMMzk1LjU0ODU3MiwxOTYuMDM0NDQ5IEw0MDAuMzgwMzY1LDE5Ni4wMzQ0NDkgTDQwMC4zODAzNjUsMTkwLjIzODI1OSBMNDA1LjkxODI5MiwxODguNTY0NDU4IFogTTQyMS45NDQ5MzUsMjA1Ljc1OTQ5MyBDNDIxLjk0NDkzNSwyMDIuMDg4MjQ2IDQyMS44NzYyODMsMTk4LjkzMzUyNCA0MjEuNjg2NjczLDE5Ni4wMzM3OTUgTDQyNi42NDU5NjIsMTk2LjAzMzc5NSBMNDI2LjkwNDIyNCwyMDIuMjE1NzQzIEw0MjcuMDkzODM1LDIwMi4yMTU3NDMgQzQyOC41MTI2NDIsMTk4LjAzMTI0MSA0MzEuOTg3NzQxLDE5NS4zODk3NzQgNDM1Ljc4NjQ4NCwxOTUuMzg5Nzc0IEM0MzYuMzY4MzkxLDE5NS4zODk3NzQgNDM2LjgxOTUzMywxOTUuNDU1MTU3IDQzNy4zMzYwNTgsMTk1LjUxNzI3IEw0MzcuMzM2MDU4LDIwMC44NjU1ODcgQzQzNi43NTQxNSwyMDAuNzM0ODIxIDQzNi4xNzg3ODEsMjAwLjczNDgyMSA0MzUuNDAwNzI1LDIwMC43MzQ4MjEgQzQzMS40MTIzNzIsMjAwLjczNDgyMSA0MjguNTc0NzU2LDIwMy42OTY2NjQgNDI3LjgwMzIzOCwyMDcuOTQ5ODE5IEM0MjcuNjc1NzQyLDIwOC43MjEzMzYgNDI3LjYxMDM1OSwyMDkuNjg1NzMzIDQyNy42MTAzNTksMjEwLjU5MTI4NiBMNDI3LjYxMDM1OSwyMjcuMjA1MDY3IEw0MjEuOTQ0OTM1LDIyNy4yMDUwNjcgTDQyMS45NDQ5MzUsMjA1Ljc1OTQ5MyBaIE00NzIuMTY2NDgxLDIxMS4zNjExNjkgQzQ3Mi4xNjY0ODEsMjIyLjg4ODE2NSA0NjQuMTE0NTgzLDIyNy45MTI4MzYgNDU2LjY0NDU5MywyMjcuOTEyODM2IEM0NDguMjcyMzIsMjI3LjkxMjgzNiA0NDEuNzA3ODgyLDIyMS43Mjc2MTkgNDQxLjcwNzg4MiwyMTEuODc3NjkzIEM0NDEuNzA3ODgyLDIwMS41MDc5NzQgNDQ4LjU5NTk2NSwxOTUuMzkxNDA4IDQ1Ny4xNjExMTgsMTk1LjM5MTQwOCBDNDY2LjExMjAyOSwxOTUuMzkxNDA4IDQ3Mi4xNjY0ODEsMjAxLjg5MzczMiA0NzIuMTY2NDgxLDIxMS4zNjExNjkgWiBNNDQ3LjUwMDgwMiwyMTEuNjg0ODE0IEM0NDcuNTAwODAyLDIxOC41MTA3ODMgNDUxLjM2NDkyOCwyMjMuNjYyOTUxIDQ1Ni45MDI4NTUsMjIzLjY2Mjk1MSBDNDYyLjMxMzI4NiwyMjMuNjYyOTUxIDQ2Ni4zNjcwMjMsMjE4LjU3Mjg5NyA0NjYuMzY3MDIzLDIxMS41NTQwNDggQzQ2Ni4zNjcwMjMsMjA2LjI3NDM4MyA0NjMuNzI4ODI1LDE5OS42MzgwMjQgNDU3LjAzMDM1MiwxOTkuNjM4MDI0IEM0NTAuNDAwNTMxLDE5OS42MzgwMjQgNDQ3LjUwMDgwMiwyMDUuODIzMjQyIDQ0Ny41MDA4MDIsMjExLjY4NDgxNCBaIE00ODAuODQ5OTc3LDIwNC40Njk0OSBDNDgwLjg0OTk3NywyMDEuMTg3MjcxIDQ4MC43ODEzMjUsMTk4LjYxMTE4NyA0ODAuNTkxNzE1LDE5Ni4wMzUxMDIgTDQ4NS42MTMxMTcsMTk2LjAzNTEwMiBMNDg1LjkzNjc2MywyMDEuMTg3MjcxIEw0ODYuMDY0MjU5LDIwMS4xODcyNzEgQzQ4Ny42MTA1NjMsMTk4LjI4NzU0MiA0OTEuMjE2NDI3LDE5NS4zOTEwODEgNDk2LjM2ODU5NiwxOTUuMzkxMDgxIEM1MDAuNjgwNTk1LDE5NS4zOTEwODEgNTA3LjM3OTA2NywxOTcuOTY3MTY2IDUwNy4zNzkwNjcsMjA4LjY1Mzk5MiBMNTA3LjM3OTA2NywyMjcuMjAzMTA2IEw1MDEuNzEzNjQ0LDIyNy4yMDMxMDYgTDUwMS43MTM2NDQsMjA5LjIzNTg5OSBDNTAxLjcxMzY0NCwyMDQuMjE0NDk3IDQ5OS44NDY5NjMsMjAwLjAyNjcyNSA0OTQuNTAxOTE2LDIwMC4wMjY3MjUgQzQ5MC44MzA2NjksMjAwLjAyNjcyNSA0ODcuOTMwOTM5LDIwMi42NjgxOTIgNDg2LjkwNDQyOSwyMDUuODIyOTE1IEM0ODYuNjQyODk3LDIwNi41MzIzMTkgNDg2LjUxNTQwMSwyMDcuNDk2NzE2IDQ4Ni41MTU0MDEsMjA4LjQ2NDM4MiBMNDg2LjUxNTQwMSwyMjcuMjAzMTA2IEw0ODAuODQ5OTc3LDIyNy4yMDMxMDYgTDQ4MC44NDk5NzcsMjA0LjQ2OTQ5IFoiIGZpbGw9IiNGRkZGRkYiPjwvcGF0aD4gICAgPC9nPjwvc3ZnPg==");
}
.rccs__number {
clear: both;
@@ -217,7 +217,7 @@ const Container = styled.div`
transition: opacity 0.3s;
}
.rccs__chip {
- background-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwIiBoZWlnaHQ9Ijc2IiB2aWV3Qm94PSIwIDAgMTAwIDc2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIj48ZGVmcz48bGluZWFyR3JhZGllbnQgeDE9IjEwMCUiIHkxPSIwJSIgeDI9IjAlIiB5Mj0iMTAwJSIgaWQ9ImEiPjxzdG9wIHN0b3AtY29sb3I9IiNGM0QwOEYiIG9mZnNldD0iMCUiLz48c3RvcCBzdG9wLWNvbG9yPSIjRkFENzY2IiBvZmZzZXQ9IjEwMCUiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48cGF0aCBkPSJNOTIuNzI3IDc1LjQ1NWgtODUuNDU1Yy00IDAtNy4yNzMtMy4yNzMtNy4yNzMtNy4yNzN2LTYwLjkwOWMwLTQgMy4yNzMtNy4yNzMgNy4yNzMtNy4yNzNoODUuNDU1YzQgMCA3LjI3MyAzLjI3MyA3LjI3MyA3LjI3M3Y2MC45MDljMCA0LTMuMjczIDcuMjczLTcuMjczIDcuMjczIiBmaWxsPSJ1cmwoI2EpIi8+PHBhdGggZD0iTTcyLjEyMyAyOC40ODVoMjcuODc4di0xLjgxOGgtMjkuNjQ4Yy0uOTY1IDAtMS44MzIuNjAxLTIuMTcyIDEuNTA0LTIuMjg3IDYuMDcyLTIuNDMzIDEyLjU5NC0uNDM4IDE5Ljg0Mi40NTUgMS42NTQuNDM1IDMuNC0uMSA1LjAzLTIuMDM2IDYuMTk1LTcuNzc5IDE5Ljk4OC0xOC41NTEgMTkuOTg4LTExLjAwOCAwLTE2LjA5Ni0xNS42OTktMTcuMzM0LTIxLjk1Mi0uMTU1LS43ODQtLjEyMi0xLjU5Mi4xMDctMi4zNTcgMS42OTUtNS42NDggMi4wOTQtMTAuNjQtLjAxNi0xOS41OS0uMjA1LS44Ny0uMTgyLTEuNzgzLjA0OC0yLjY0NiA0LjQ4LTE2Ljc1NSAxMi44ODItMjAuMTQ3IDEyLjk2NS0yMC4xNzkuMzU2LS4xMzIuNTkzLS40NzIuNTkzLS44NTJ2LTUuNDU1aC0xLjgxOHYzLjc3NmMwIC42NS0uMzMyIDEuMjUyLS44ODQgMS41OTYtMi44MDMgMS43NDItOC45MDQgNi45MzYtMTIuNTU3IDIwLjQ1Ni0uMTguNjY4LS43ODEgMS4xMzYtMS40NzMgMS4xMzNsLTI4LjcyMi0uMTM5djEuODE4bDI3LjQxNi4xMzNjMS40NjguMDA3IDIuNzM1IDEuMDQxIDMuMDM3IDIuNDc4IDEuNDE2IDYuNzQxIDEuMjE5IDExLjAzOS4wODIgMTUuNDU4LS4zMTYgMS4yMy0xLjQyIDIuMDk2LTIuNjkgMi4xMDlsLTI3Ljg0NC4yN3YxLjgxOWwyOC42MDUtLjI3OGMuNjkzLS4wMDcgMS4yOTYuNDczIDEuNDM1IDEuMTUyIDEuNDQyIDcuMDQxIDYuODg3IDIzLjA3IDE5LjA1IDIzLjA3IDYuMzY4IDAgMTIuMDYyLTQuMjUgMTYuNDY3LTEyLjI5IDIuNjQ0LTQuODI4IDQuMDY3LTkuNTkxIDQuNTQxLTExLjM0NmgyOS45MDF2LTEuODE4aC0yOC4wMTZjLTEuMTU4IDAtMi4xODMtLjc3Mi0yLjQ4OS0xLjg4OS0xLjY5Mi02LjE2NC0xLjc2MS0xMS43NTUtLjItMTYuOTU5LjM3MS0xLjIzNSAxLjUzOC0yLjA2MSAyLjgyNy0yLjA2MXptLTE3LjE1LTIxLjkxNGMuMDQ1LjAyMiA0LjUxOSAyLjMyMiA5LjI1MyAxMC4wNDEuMTcyLjI4LjQ3LjQzNC43NzYuNDM0LjE5OCAwIC4zOTktLjA2NC41NzEtLjIwMi4zNjUtLjI5Mi40MTYtLjgzNy4xNzItMS4yMzUtMy41Ny01LjgwNS03LjAyNC04LjcxLTguNzc1LTkuOTMxLS40My0uMjk5LS42OC0uNzkyLS42OC0xLjMxNXYtNC4zNjNoLTEuODE4djUuNzU4YzAgLjM0NS4xOTUuNjU5LjUwMi44MTN6IiBmaWxsPSIjMEMwMjAwIi8+PC9zdmc+');
+ background-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwIiBoZWlnaHQ9Ijc2IiB2aWV3Qm94PSIwIDAgMTAwIDc2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIj48ZGVmcz48bGluZWFyR3JhZGllbnQgeDE9IjEwMCUiIHkxPSIwJSIgeDI9IjAlIiB5Mj0iMTAwJSIgaWQ9ImEiPjxzdG9wIHN0b3AtY29sb3I9IiNGM0QwOEYiIG9mZnNldD0iMCUiLz48c3RvcCBzdG9wLWNvbG9yPSIjRkFENzY2IiBvZmZzZXQ9IjEwMCUiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48cGF0aCBkPSJNOTIuNzI3IDc1LjQ1NWgtODUuNDU1Yy00IDAtNy4yNzMtMy4yNzMtNy4yNzMtNy4yNzN2LTYwLjkwOWMwLTQgMy4yNzMtNy4yNzMgNy4yNzMtNy4yNzNoODUuNDU1YzQgMCA3LjI3MyAzLjI3MyA3LjI3MyA3LjI3M3Y2MC45MDljMCA0LTMuMjczIDcuMjczLTcuMjczIDcuMjczIiBmaWxsPSJ1cmwoI2EpIi8+PHBhdGggZD0iTTcyLjEyMyAyOC40ODVoMjcuODc4di0xLjgxOGgtMjkuNjQ4Yy0uOTY1IDAtMS44MzIuNjAxLTIuMTcyIDEuNTA0LTIuMjg3IDYuMDcyLTIuNDMzIDEyLjU5NC0uNDM4IDE5Ljg0Mi40NTUgMS42NTQuNDM1IDMuNC0uMSA1LjAzLTIuMDM2IDYuMTk1LTcuNzc5IDE5Ljk4OC0xOC41NTEgMTkuOTg4LTExLjAwOCAwLTE2LjA5Ni0xNS42OTktMTcuMzM0LTIxLjk1Mi0uMTU1LS43ODQtLjEyMi0xLjU5Mi4xMDctMi4zNTcgMS42OTUtNS42NDggMi4wOTQtMTAuNjQtLjAxNi0xOS41OS0uMjA1LS44Ny0uMTgyLTEuNzgzLjA0OC0yLjY0NiA0LjQ4LTE2Ljc1NSAxMi44ODItMjAuMTQ3IDEyLjk2NS0yMC4xNzkuMzU2LS4xMzIuNTkzLS40NzIuNTkzLS44NTJ2LTUuNDU1aC0xLjgxOHYzLjc3NmMwIC42NS0uMzMyIDEuMjUyLS44ODQgMS41OTYtMi44MDMgMS43NDItOC45MDQgNi45MzYtMTIuNTU3IDIwLjQ1Ni0uMTguNjY4LS43ODEgMS4xMzYtMS40NzMgMS4xMzNsLTI4LjcyMi0uMTM5djEuODE4bDI3LjQxNi4xMzNjMS40NjguMDA3IDIuNzM1IDEuMDQxIDMuMDM3IDIuNDc4IDEuNDE2IDYuNzQxIDEuMjE5IDExLjAzOS4wODIgMTUuNDU4LS4zMTYgMS4yMy0xLjQyIDIuMDk2LTIuNjkgMi4xMDlsLTI3Ljg0NC4yN3YxLjgxOWwyOC42MDUtLjI3OGMuNjkzLS4wMDcgMS4yOTYuNDczIDEuNDM1IDEuMTUyIDEuNDQyIDcuMDQxIDYuODg3IDIzLjA3IDE5LjA1IDIzLjA3IDYuMzY4IDAgMTIuMDYyLTQuMjUgMTYuNDY3LTEyLjI5IDIuNjQ0LTQuODI4IDQuMDY3LTkuNTkxIDQuNTQxLTExLjM0NmgyOS45MDF2LTEuODE4aC0yOC4wMTZjLTEuMTU4IDAtMi4xODMtLjc3Mi0yLjQ4OS0xLjg4OS0xLjY5Mi02LjE2NC0xLjc2MS0xMS43NTUtLjItMTYuOTU5LjM3MS0xLjIzNSAxLjUzOC0yLjA2MSAyLjgyNy0yLjA2MXptLTE3LjE1LTIxLjkxNGMuMDQ1LjAyMiA0LjUxOSAyLjMyMiA5LjI1MyAxMC4wNDEuMTcyLjI4LjQ3LjQzNC43NzYuNDM0LjE5OCAwIC4zOTktLjA2NC41NzEtLjIwMi4zNjUtLjI5Mi40MTYtLjgzNy4xNzItMS4yMzUtMy41Ny01LjgwNS03LjAyNC04LjcxLTguNzc1LTkuOTMxLS40My0uMjk5LS42OC0uNzkyLS42OC0xLjMxNXYtNC4zNjNoLTEuODE4djUuNzU4YzAgLjM0NS4xOTUuNjU5LjUwMi44MTN6IiBmaWxsPSIjMEMwMjAwIi8+PC9zdmc+");
background-repeat: no-repeat;
background-size: contain;
height: 26.36364px;
@@ -284,10 +284,10 @@ const Container = styled.div`
font-weight: 700;
opacity: 1 !important;
}
-`
+`;
-export default props => (
+export default (props) => (
-)
+);
diff --git a/examples/credit-card/Styles.js b/examples/credit-card/Styles.js
index 12d16329..75deb222 100644
--- a/examples/credit-card/Styles.js
+++ b/examples/credit-card/Styles.js
@@ -1,4 +1,4 @@
-import styled, { css } from 'styled-components'
+import styled, { css } from "styled-components";
const btn = (light, dark) => css`
white-space: nowrap;
@@ -25,14 +25,14 @@ const btn = (light, dark) => css`
opacity: 0.6;
cursor: not-allowed;
}
-`
+`;
const btnDefault = css`
- ${btn('#ffffff', '#d5d5d5')} color: #555;
-`
+ ${btn("#ffffff", "#d5d5d5")} color: #555;
+`;
-const btnPrimary = btn('#4f93ce', '#285f8f')
-const btnDanger = btn('#e27c79', '#c9302c')
+const btnPrimary = btn("#4f93ce", "#285f8f");
+const btnDanger = btn("#e27c79", "#c9302c");
export default styled.div`
font-family: sans-serif;
@@ -116,7 +116,7 @@ export default styled.div`
background: #eee;
}
}
- & > input[type='checkbox'] {
+ & > input[type="checkbox"] {
margin-top: 7px;
}
& > div {
@@ -196,10 +196,10 @@ export default styled.div`
}
button {
margin: 0 10px;
- &[type='submit'] {
+ &[type="submit"] {
${btnPrimary};
}
- &[type='button'] {
+ &[type="button"] {
${btnDefault};
}
}
@@ -210,4 +210,4 @@ export default styled.div`
padding: 3px 5px;
}
}
-`
+`;
diff --git a/examples/credit-card/cardUtils.js b/examples/credit-card/cardUtils.js
index a005004f..bcc860c6 100644
--- a/examples/credit-card/cardUtils.js
+++ b/examples/credit-card/cardUtils.js
@@ -1,60 +1,60 @@
-import Payment from 'payment'
+import Payment from "payment";
-function clearNumber(value = '') {
- return value.replace(/\D+/g, '')
+function clearNumber(value = "") {
+ return value.replace(/\D+/g, "");
}
export function formatCreditCardNumber(value) {
if (!value) {
- return value
+ return value;
}
- const issuer = Payment.fns.cardType(value)
- const clearValue = clearNumber(value)
- let nextValue
+ const issuer = Payment.fns.cardType(value);
+ const clearValue = clearNumber(value);
+ let nextValue;
switch (issuer) {
- case 'amex':
+ case "amex":
nextValue = `${clearValue.slice(0, 4)} ${clearValue.slice(
4,
- 10
- )} ${clearValue.slice(10, 15)}`
- break
- case 'dinersclub':
+ 10,
+ )} ${clearValue.slice(10, 15)}`;
+ break;
+ case "dinersclub":
nextValue = `${clearValue.slice(0, 4)} ${clearValue.slice(
4,
- 10
- )} ${clearValue.slice(10, 14)}`
- break
+ 10,
+ )} ${clearValue.slice(10, 14)}`;
+ break;
default:
nextValue = `${clearValue.slice(0, 4)} ${clearValue.slice(
4,
- 8
- )} ${clearValue.slice(8, 12)} ${clearValue.slice(12, 19)}`
- break
+ 8,
+ )} ${clearValue.slice(8, 12)} ${clearValue.slice(12, 19)}`;
+ break;
}
- return nextValue.trim()
+ return nextValue.trim();
}
export function formatCVC(value, prevValue, allValues = {}) {
- const clearValue = clearNumber(value)
- let maxLength = 4
+ const clearValue = clearNumber(value);
+ let maxLength = 4;
if (allValues.number) {
- const issuer = Payment.fns.cardType(allValues.number)
- maxLength = issuer === 'amex' ? 4 : 3
+ const issuer = Payment.fns.cardType(allValues.number);
+ maxLength = issuer === "amex" ? 4 : 3;
}
- return clearValue.slice(0, maxLength)
+ return clearValue.slice(0, maxLength);
}
export function formatExpirationDate(value) {
- const clearValue = clearNumber(value)
+ const clearValue = clearNumber(value);
if (clearValue.length >= 3) {
- return `${clearValue.slice(0, 2)}/${clearValue.slice(2, 4)}`
+ return `${clearValue.slice(0, 2)}/${clearValue.slice(2, 4)}`;
}
- return clearValue
+ return clearValue;
}
diff --git a/examples/credit-card/index.js b/examples/credit-card/index.js
index eb8032aa..a1b9e31b 100644
--- a/examples/credit-card/index.js
+++ b/examples/credit-card/index.js
@@ -1,27 +1,27 @@
-import React from 'react'
-import { render } from 'react-dom'
-import Styles from './Styles'
-import { Form, Field } from 'react-final-form'
-import Card from './Card'
+import React from "react";
+import { render } from "react-dom";
+import Styles from "./Styles";
+import { Form, Field } from "react-final-form";
+import Card from "./Card";
import {
formatCreditCardNumber,
formatCVC,
- formatExpirationDate
-} from './cardUtils'
+ formatExpirationDate,
+} from "./cardUtils";
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
-const onSubmit = async values => {
- await sleep(300)
- window.alert(JSON.stringify(values, 0, 2))
-}
+const onSubmit = async (values) => {
+ await sleep(300);
+ window.alert(JSON.stringify(values, 0, 2));
+};
const App = () => (
🏁
- {' '}
+ {" "}
React Final Form
Credit Card Example
@@ -29,14 +29,14 @@ const App = () => (
Read Docs
- This example demonstrates how to use the amazing{' '}
+ This example demonstrates how to use the amazing{" "}
React Credit Cards
- {' '}
+ {" "}
library with your form.
-)
+);
-render( , document.getElementById('root'))
+render( , document.getElementById("root"));
diff --git a/examples/declarative-form-rules/Styles.js b/examples/declarative-form-rules/Styles.js
index 9d887124..7dfd0c60 100644
--- a/examples/declarative-form-rules/Styles.js
+++ b/examples/declarative-form-rules/Styles.js
@@ -1,4 +1,4 @@
-import styled, { css } from 'styled-components'
+import styled, { css } from "styled-components";
const btn = (light, dark) => css`
white-space: nowrap;
@@ -25,14 +25,14 @@ const btn = (light, dark) => css`
opacity: 0.6;
cursor: not-allowed;
}
-`
+`;
const btnDefault = css`
- ${btn('#ffffff', '#d5d5d5')} color: #555;
-`
+ ${btn("#ffffff", "#d5d5d5")} color: #555;
+`;
-const btnPrimary = btn('#4f93ce', '#285f8f')
-const btnDanger = btn('#e27c79', '#c9302c')
+const btnPrimary = btn("#4f93ce", "#285f8f");
+const btnDanger = btn("#e27c79", "#c9302c");
export default styled.div`
font-family: sans-serif;
@@ -116,7 +116,7 @@ export default styled.div`
background: #eee;
}
}
- & > input[type='checkbox'] {
+ & > input[type="checkbox"] {
margin-top: 7px;
}
& > div {
@@ -196,10 +196,10 @@ export default styled.div`
}
button {
margin: 0 10px;
- &[type='submit'] {
+ &[type="submit"] {
${btnPrimary};
}
- &[type='button'] {
+ &[type="button"] {
${btnDefault};
}
}
@@ -210,4 +210,4 @@ export default styled.div`
padding: 3px 5px;
}
}
-`
+`;
diff --git a/examples/declarative-form-rules/index.js b/examples/declarative-form-rules/index.js
index 6ddb9e64..e1061231 100644
--- a/examples/declarative-form-rules/index.js
+++ b/examples/declarative-form-rules/index.js
@@ -1,39 +1,39 @@
-import React from 'react'
-import { render } from 'react-dom'
-import Styles from './Styles'
-import { Form, Field } from 'react-final-form'
-import { OnChange } from 'react-final-form-listeners'
+import React from "react";
+import { render } from "react-dom";
+import Styles from "./Styles";
+import { Form, Field } from "react-final-form";
+import { OnChange } from "react-final-form-listeners";
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
-const onSubmit = async values => {
- await sleep(300)
- window.alert(JSON.stringify(values, 0, 2))
-}
+const onSubmit = async (values) => {
+ await sleep(300);
+ window.alert(JSON.stringify(values, 0, 2));
+};
const WhenFieldChanges = ({ field, becomes, set, to }) => (
{(
// No subscription. We only use Field to get to the change function
- { input: { onChange } }
+ { input: { onChange } },
) => (
- {value => {
+ {(value) => {
if (value === becomes) {
- onChange(to)
+ onChange(to);
}
}}
)}
-)
+);
const App = () => (
🏁
- {' '}
+ {" "}
React Final Form
Declarative Form Rules
@@ -41,7 +41,7 @@ const App = () => (
Read Docs
- This example demonstrates how to use{' '}
+ This example demonstrates how to use{" "}
(
>
🏁
- {' '}
+ {" "}
React Final Form Listeners
- {' '}
+ {" "}
to listen to the change of one field to then update the value of other
fields.
@@ -68,7 +68,7 @@ const App = () => (
submitting,
pristine,
values,
- errors
+ errors,
}) => {
return (
@@ -121,9 +121,9 @@ const App = () => (
Data
{JSON.stringify(values, 0, 2)}
- )
+ );
}}
/>
-)
-render( , document.getElementById('root'))
+);
+render( , document.getElementById("root"));
diff --git a/examples/downshift-typeahead/DownshiftInput.js b/examples/downshift-typeahead/DownshiftInput.js
index c35659ae..7a7c1cd1 100644
--- a/examples/downshift-typeahead/DownshiftInput.js
+++ b/examples/downshift-typeahead/DownshiftInput.js
@@ -1,14 +1,14 @@
-import React from 'react'
-import Downshift from 'downshift'
-import matchSorter from 'match-sorter'
+import React from "react";
+import Downshift from "downshift";
+import matchSorter from "match-sorter";
-const itemToString = item => (item ? item : '')
+const itemToString = (item) => (item ? item : "");
const DownshiftInput = ({ input, meta, placeholder, items, ...rest }) => (
{
- input.onChange(inputValue)
+ onInputValueChange={(inputValue) => {
+ input.onChange(inputValue);
}}
itemToString={itemToString}
selectedItem={input.value}
@@ -20,55 +20,54 @@ const DownshiftInput = ({ input, meta, placeholder, items, ...rest }) => (
isOpen,
inputValue,
highlightedIndex,
- selectedItem
+ selectedItem,
}) => {
const filteredItems = matchSorter(items, inputValue, {
- keys: ['label'],
- maxRanking: matchSorter.rankings.STARTS_WITH
- })
+ keys: ["label"],
+ maxRanking: matchSorter.rankings.STARTS_WITH,
+ });
return (
-
+
- {isOpen &&
- !!filteredItems.length && (
-
- {filteredItems.map(({ value, label }, index) => (
-
- {label}
-
- ))}
-
- )}
+ {isOpen && !!filteredItems.length && (
+
+ {filteredItems.map(({ value, label }, index) => (
+
+ {label}
+
+ ))}
+
+ )}
- )
+ );
}}
-)
+);
-export default DownshiftInput
+export default DownshiftInput;
diff --git a/examples/downshift-typeahead/Styles.js b/examples/downshift-typeahead/Styles.js
index dd091033..698c8005 100644
--- a/examples/downshift-typeahead/Styles.js
+++ b/examples/downshift-typeahead/Styles.js
@@ -1,4 +1,4 @@
-import styled, { css } from 'styled-components'
+import styled, { css } from "styled-components";
const btn = (light, dark) => css`
white-space: nowrap;
@@ -25,14 +25,14 @@ const btn = (light, dark) => css`
opacity: 0.6;
cursor: not-allowed;
}
-`
+`;
const btnDefault = css`
- ${btn('#ffffff', '#d5d5d5')} color: #555;
-`
+ ${btn("#ffffff", "#d5d5d5")} color: #555;
+`;
-const btnPrimary = btn('#4f93ce', '#285f8f')
-const btnDanger = btn('#e27c79', '#c9302c')
+const btnPrimary = btn("#4f93ce", "#285f8f");
+const btnDanger = btn("#e27c79", "#c9302c");
export default styled.div`
font-family: sans-serif;
@@ -108,7 +108,7 @@ export default styled.div`
border: 1px solid #ccc;
border-radius: 3px;
}
- & > input[type='checkbox'] {
+ & > input[type="checkbox"] {
margin-top: 7px;
}
& > div {
@@ -188,10 +188,10 @@ export default styled.div`
}
button {
margin: 0 10px;
- &[type='submit'] {
+ &[type="submit"] {
${btnPrimary};
}
- &[type='button'] {
+ &[type="button"] {
${btnDefault};
}
}
@@ -202,4 +202,4 @@ export default styled.div`
padding: 3px 5px;
}
}
-`
+`;
diff --git a/examples/downshift-typeahead/fruit.js b/examples/downshift-typeahead/fruit.js
index c324128e..926cbeca 100644
--- a/examples/downshift-typeahead/fruit.js
+++ b/examples/downshift-typeahead/fruit.js
@@ -1,13 +1,13 @@
export default [
- { value: 'Apple', label: '🍎 Apple' },
- { value: 'Banana', label: '🍌 Banana' },
- { value: 'Cherry', label: '🍒 Cherry' },
- { value: 'Grape', label: '🍇 Grape' },
- { value: 'Kiwi', label: '🥝 Kiwi' },
- { value: 'Orange', label: '🍊 Orange' },
- { value: 'Peach', label: '🍑 Peach' },
- { value: 'Pear', label: '🍐 Pear' },
- { value: 'Pineapple', label: '🍍 Pineapple' },
- { value: 'Strawberry', label: '🍓 Strawberry' },
- { value: 'Watermelon', label: '🍉 Watermelon' }
-]
+ { value: "Apple", label: "🍎 Apple" },
+ { value: "Banana", label: "🍌 Banana" },
+ { value: "Cherry", label: "🍒 Cherry" },
+ { value: "Grape", label: "🍇 Grape" },
+ { value: "Kiwi", label: "🥝 Kiwi" },
+ { value: "Orange", label: "🍊 Orange" },
+ { value: "Peach", label: "🍑 Peach" },
+ { value: "Pear", label: "🍐 Pear" },
+ { value: "Pineapple", label: "🍍 Pineapple" },
+ { value: "Strawberry", label: "🍓 Strawberry" },
+ { value: "Watermelon", label: "🍉 Watermelon" },
+];
diff --git a/examples/downshift-typeahead/index.js b/examples/downshift-typeahead/index.js
index cf2019e9..6865ca85 100644
--- a/examples/downshift-typeahead/index.js
+++ b/examples/downshift-typeahead/index.js
@@ -1,26 +1,26 @@
-import React from 'react'
-import { render } from 'react-dom'
-import Styles from './Styles'
-import { Form, Field } from 'react-final-form'
-import DownshiftInput from './DownshiftInput'
-import fruit from './fruit'
+import React from "react";
+import { render } from "react-dom";
+import Styles from "./Styles";
+import { Form, Field } from "react-final-form";
+import DownshiftInput from "./DownshiftInput";
+import fruit from "./fruit";
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
-const onSubmit = async values => {
- await sleep(300)
- window.alert(JSON.stringify(values, 0, 2))
-}
-const validate = values => {
- const errors = {}
+const onSubmit = async (values) => {
+ await sleep(300);
+ window.alert(JSON.stringify(values, 0, 2));
+};
+const validate = (values) => {
+ const errors = {};
if (!values.firstName) {
- errors.firstName = 'Required'
+ errors.firstName = "Required";
}
if (!values.fruit) {
- errors.fruit = 'Required'
+ errors.fruit = "Required";
}
- return errors
-}
+ return errors;
+};
const Error = ({ name }) => (
(
touched && error ? {error} : null
}
/>
-)
+);
const App = () => (
🏁
- {' '}
+ {" "}
React Final Form
🏎️
- {' '}
+ {" "}
Downshift Example
Read Docs
- This example demonstrates using a{' '}
+ This example demonstrates using a{" "}
🏎️
- {' '}
+ {" "}
Downshift
- {' '}
+ {" "}
type-ahead component.
(
)}
/>
-)
+);
-render( , document.getElementById('root'))
+render( , document.getElementById("root"));
diff --git a/examples/external-submit/Styles.js b/examples/external-submit/Styles.js
index 06a77f51..0b4ad747 100644
--- a/examples/external-submit/Styles.js
+++ b/examples/external-submit/Styles.js
@@ -1,4 +1,4 @@
-import styled, { css } from 'styled-components'
+import styled, { css } from "styled-components";
const btn = (light, dark) => css`
white-space: nowrap;
@@ -25,14 +25,14 @@ const btn = (light, dark) => css`
opacity: 0.6;
cursor: not-allowed;
}
-`
+`;
const btnDefault = css`
- ${btn('#ffffff', '#d5d5d5')} color: #555;
-`
+ ${btn("#ffffff", "#d5d5d5")} color: #555;
+`;
-const btnPrimary = btn('#4f93ce', '#285f8f')
-const btnDanger = btn('#e27c79', '#c9302c')
+const btnPrimary = btn("#4f93ce", "#285f8f");
+const btnDanger = btn("#e27c79", "#c9302c");
export default styled.div`
font-family: sans-serif;
@@ -79,7 +79,7 @@ export default styled.div`
text-align: center;
display: block;
position: absolute;
- background: url('https://media.giphy.com/media/130AxGoOaR6t0I/giphy.gif')
+ background: url("https://media.giphy.com/media/130AxGoOaR6t0I/giphy.gif")
center center;
background-size: fill;
font-size: 2em;
@@ -114,7 +114,7 @@ export default styled.div`
border: 1px solid #ccc;
border-radius: 3px;
}
- & > input[type='checkbox'] {
+ & > input[type="checkbox"] {
margin-top: 7px;
}
& > div {
@@ -160,11 +160,11 @@ export default styled.div`
}
button {
margin: 0 10px;
- &[type='submit'] {
+ &[type="submit"] {
${btnPrimary};
}
- &[type='button'] {
+ &[type="button"] {
${btnDefault};
}
}
-`
+`;
diff --git a/examples/external-submit/index.js b/examples/external-submit/index.js
index a858e3a8..f9957060 100644
--- a/examples/external-submit/index.js
+++ b/examples/external-submit/index.js
@@ -1,23 +1,23 @@
-import React from 'react'
-import { render } from 'react-dom'
-import Styles from './Styles'
-import { Form, Field } from 'react-final-form'
+import React from "react";
+import { render } from "react-dom";
+import Styles from "./Styles";
+import { Form, Field } from "react-final-form";
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
-const onSubmit = async values => {
- await sleep(300)
- window.alert(JSON.stringify(values, 0, 2))
-}
+const onSubmit = async (values) => {
+ await sleep(300);
+ window.alert(JSON.stringify(values, 0, 2));
+};
const App = () => {
- let submit
+ let submit;
return (
🏁
- {' '}
+ {" "}
React Final Form Example
External Submit
@@ -31,33 +31,31 @@ const App = () => {
// { cancelable: true } required for Firefox
// https://github.com/facebook/react/issues/12639#issuecomment-382519193
document
- .getElementById('exampleForm')
- .dispatchEvent(new Event('submit', { cancelable: true, bubbles:true }))
+ .getElementById("exampleForm")
+ .dispatchEvent(
+ new Event("submit", { cancelable: true, bubbles: true }),
+ )
}
>
External Submit via document.getElementById()
{
- submit(event)
+ onClick={(event) => {
+ submit(event);
}}
style={{ marginTop: 10 }}
>
External Submit via closure
-
+
External Submit via form attribute
{
- submit = handleSubmit
+ submit = handleSubmit;
return (
@@ -85,19 +83,19 @@ const App = () => {
❤️
- {' '}
+ {" "}
Red
💚
- {' '}
+ {" "}
Green
💙
- {' '}
+ {" "}
Blue
@@ -116,11 +114,11 @@ const App = () => {
{JSON.stringify(values, 0, 2)}
- )
+ );
}}
/>
- )
-}
+ );
+};
-render( , document.getElementById('root'))
+render( , document.getElementById("root"));
diff --git a/examples/field-arrays/Styles.js b/examples/field-arrays/Styles.js
index bba6ab2d..b90cade7 100644
--- a/examples/field-arrays/Styles.js
+++ b/examples/field-arrays/Styles.js
@@ -1,4 +1,4 @@
-import styled, { css } from 'styled-components'
+import styled, { css } from "styled-components";
const btn = (light, dark) => css`
white-space: nowrap;
@@ -25,12 +25,14 @@ const btn = (light, dark) => css`
opacity: 0.6;
cursor: not-allowed;
}
-`
+`;
-const btnDefault = css`${btn('#ffffff', '#d5d5d5')} color: #555;`
+const btnDefault = css`
+ ${btn("#ffffff", "#d5d5d5")} color: #555;
+`;
-const btnPrimary = btn('#4f93ce', '#285f8f')
-const btnDanger = btn('#e27c79', '#c9302c')
+const btnPrimary = btn("#4f93ce", "#285f8f");
+const btnDanger = btn("#e27c79", "#c9302c");
export default styled.div`
font-family: sans-serif;
@@ -96,7 +98,7 @@ export default styled.div`
border: 1px solid #ccc;
border-radius: 3px;
}
- & > input[type='checkbox'] {
+ & > input[type="checkbox"] {
margin-top: 7px;
}
& > div {
@@ -126,10 +128,10 @@ export default styled.div`
}
button {
margin: 0 10px;
- &[type='submit'] {
+ &[type="submit"] {
${btnPrimary};
}
- &[type='button'] {
+ &[type="button"] {
${btnDefault};
}
}
@@ -148,4 +150,4 @@ export default styled.div`
padding: 20px;
}
}
-`
+`;
diff --git a/examples/field-arrays/index.js b/examples/field-arrays/index.js
index 1a39cb06..95f3735e 100644
--- a/examples/field-arrays/index.js
+++ b/examples/field-arrays/index.js
@@ -1,23 +1,23 @@
-import React from 'react'
-import { render } from 'react-dom'
-import Styles from './Styles'
-import { Form, Field } from 'react-final-form'
-import arrayMutators from 'final-form-arrays'
-import { FieldArray } from 'react-final-form-arrays'
+import React from "react";
+import { render } from "react-dom";
+import Styles from "./Styles";
+import { Form, Field } from "react-final-form";
+import arrayMutators from "final-form-arrays";
+import { FieldArray } from "react-final-form-arrays";
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
-const onSubmit = async values => {
- await sleep(300)
- window.alert(JSON.stringify(values, 0, 2))
-}
+const onSubmit = async (values) => {
+ await sleep(300);
+ window.alert(JSON.stringify(values, 0, 2));
+};
const App = () => (
🏁
- {' '}
+ {" "}
React Final Form - Array Fields
@@ -26,17 +26,17 @@ const App = () => (
{
return (
@@ -47,11 +47,11 @@ const App = () => (
push('customers', undefined)}
+ onClick={() => push("customers", undefined)}
>
Add Customer
- pop('customers')}>
+ pop("customers")}>
Remove Customer
@@ -72,7 +72,7 @@ const App = () => (
/>
fields.remove(index)}
- style={{ cursor: 'pointer' }}
+ style={{ cursor: "pointer" }}
role="img"
aria-label="remove customer icon"
>
@@ -97,10 +97,10 @@ const App = () => (
{JSON.stringify(values, 0, 2)}
- )
+ );
}}
/>
-)
+);
-render( , document.getElementById('root'))
+render( , document.getElementById("root"));
diff --git a/examples/field-level-validation/Styles.js b/examples/field-level-validation/Styles.js
index 0a371734..a1c46db5 100644
--- a/examples/field-level-validation/Styles.js
+++ b/examples/field-level-validation/Styles.js
@@ -1,4 +1,4 @@
-import styled, { css } from 'styled-components'
+import styled, { css } from "styled-components";
const btn = (light, dark) => css`
white-space: nowrap;
@@ -25,13 +25,13 @@ const btn = (light, dark) => css`
opacity: 0.6;
cursor: not-allowed;
}
-`
+`;
const btnDefault = css`
- ${btn('#ffffff', '#d5d5d5')} color: #555;
-`
+ ${btn("#ffffff", "#d5d5d5")} color: #555;
+`;
-const btnPrimary = btn('#4f93ce', '#285f8f')
+const btnPrimary = btn("#4f93ce", "#285f8f");
export default styled.div`
font-family: sans-serif;
@@ -85,7 +85,7 @@ export default styled.div`
border: 1px solid #ccc;
border-radius: 3px;
}
- & > input[type='checkbox'] {
+ & > input[type="checkbox"] {
margin-top: 7px;
}
& > div {
@@ -112,10 +112,10 @@ export default styled.div`
}
button {
margin: 0 10px;
- &[type='submit'] {
+ &[type="submit"] {
${btnPrimary};
}
- &[type='button'] {
+ &[type="button"] {
${btnDefault};
}
}
@@ -126,4 +126,4 @@ export default styled.div`
padding: 20px;
}
}
-`
+`;
diff --git a/examples/field-level-validation/index.js b/examples/field-level-validation/index.js
index cea9c24b..e4658091 100644
--- a/examples/field-level-validation/index.js
+++ b/examples/field-level-validation/index.js
@@ -1,21 +1,26 @@
-import React from 'react'
-import { render } from 'react-dom'
-import Styles from './Styles'
-import { Form, Field } from 'react-final-form'
+import React from "react";
+import { render } from "react-dom";
+import Styles from "./Styles";
+import { Form, Field } from "react-final-form";
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
-const onSubmit = async values => {
- await sleep(300)
- window.alert(JSON.stringify(values, 0, 2))
-}
+const onSubmit = async (values) => {
+ await sleep(300);
+ window.alert(JSON.stringify(values, 0, 2));
+};
-const required = value => (value ? undefined : 'Required')
-const mustBeNumber = value => (isNaN(value) ? 'Must be a number' : undefined)
-const minValue = min => value =>
- isNaN(value) || value >= min ? undefined : `Should be greater than ${min}`
-const composeValidators = (...validators) => value =>
- validators.reduce((error, validator) => error || validator(value), undefined)
+const required = (value) => (value ? undefined : "Required");
+const mustBeNumber = (value) => (isNaN(value) ? "Must be a number" : undefined);
+const minValue = (min) => (value) =>
+ isNaN(value) || value >= min ? undefined : `Should be greater than ${min}`;
+const composeValidators =
+ (...validators) =>
+ (value) =>
+ validators.reduce(
+ (error, validator) => error || validator(value),
+ undefined,
+ );
const App = () => (
@@ -79,6 +84,6 @@ const App = () => (
)}
/>
-)
+);
-render( , document.getElementById('root'))
+render( , document.getElementById("root"));
diff --git a/examples/field-warnings/Styles.js b/examples/field-warnings/Styles.js
index 2a2bfadd..3f54fa69 100644
--- a/examples/field-warnings/Styles.js
+++ b/examples/field-warnings/Styles.js
@@ -1,4 +1,4 @@
-import styled, { css } from 'styled-components'
+import styled, { css } from "styled-components";
const btn = (light, dark) => css`
white-space: nowrap;
@@ -25,14 +25,14 @@ const btn = (light, dark) => css`
opacity: 0.6;
cursor: not-allowed;
}
-`
+`;
const btnDefault = css`
- ${btn('#ffffff', '#d5d5d5')} color: #555;
-`
+ ${btn("#ffffff", "#d5d5d5")} color: #555;
+`;
-const btnPrimary = btn('#4f93ce', '#285f8f')
-const btnDanger = btn('#e27c79', '#c9302c')
+const btnPrimary = btn("#4f93ce", "#285f8f");
+const btnDanger = btn("#e27c79", "#c9302c");
export default styled.div`
font-family: sans-serif;
@@ -79,7 +79,7 @@ export default styled.div`
text-align: center;
display: block;
position: absolute;
- background: url('https://media.giphy.com/media/130AxGoOaR6t0I/giphy.gif')
+ background: url("https://media.giphy.com/media/130AxGoOaR6t0I/giphy.gif")
center center;
background-size: fill;
font-size: 2em;
@@ -114,7 +114,7 @@ export default styled.div`
border: 1px solid #ccc;
border-radius: 3px;
}
- & > input[type='checkbox'] {
+ & > input[type="checkbox"] {
margin-top: 7px;
}
& > div {
@@ -144,10 +144,10 @@ export default styled.div`
}
button {
margin: 0 10px;
- &[type='submit'] {
+ &[type="submit"] {
${btnPrimary};
}
- &[type='button'] {
+ &[type="button"] {
${btnDefault};
}
}
@@ -166,4 +166,4 @@ export default styled.div`
padding: 20px;
}
}
-`
+`;
diff --git a/examples/field-warnings/index.js b/examples/field-warnings/index.js
index 23fbea02..7adcfdd0 100644
--- a/examples/field-warnings/index.js
+++ b/examples/field-warnings/index.js
@@ -1,30 +1,30 @@
-import React from 'react'
-import { render } from 'react-dom'
-import Styles from './Styles'
-import { WarningEngine } from './warning-engine'
-import { Form, Field } from 'react-final-form'
-import setFieldData from 'final-form-set-field-data'
+import React from "react";
+import { render } from "react-dom";
+import Styles from "./Styles";
+import { WarningEngine } from "./warning-engine";
+import { Form, Field } from "react-final-form";
+import setFieldData from "final-form-set-field-data";
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
-const onSubmit = async values => {
- await sleep(300)
- window.alert(JSON.stringify(values, 0, 2))
-}
+const onSubmit = async (values) => {
+ await sleep(300);
+ window.alert(JSON.stringify(values, 0, 2));
+};
const App = () => (
🏁
- {' '}
+ {" "}
React Final Form Example
⚠️
- {' '}
- Warnings{' '}
+ {" "}
+ Warnings{" "}
⚠️
@@ -34,7 +34,7 @@ const App = () => (
Warnings, in this example, are defined as: suggestions to the user, like
- validation errors, but that do not prevent submission. Note that the{' '}
+ validation errors, but that do not prevent submission. Note that the{" "}
<WarningEngine/> component must be at the bottom of the
form to guarantee that all the fields have registered.
@@ -46,7 +46,7 @@ const App = () => (
form: { mutators, reset },
submitting,
pristine,
- values
+ values,
}) => {
return (
@@ -87,10 +87,10 @@ const App = () => (
{JSON.stringify(values, 0, 2)}
- )
+ );
}}
/>
-)
+);
-render( , document.getElementById('root'))
+render( , document.getElementById("root"));
diff --git a/examples/field-warnings/warning-engine.js b/examples/field-warnings/warning-engine.js
index 0aada156..91102f54 100644
--- a/examples/field-warnings/warning-engine.js
+++ b/examples/field-warnings/warning-engine.js
@@ -6,10 +6,10 @@ export const WarningEngine = ({ mutators: { setFieldData } }) => (
subscription={{ values: true }}
onChange={({ values }) => {
setFieldData("firstName", {
- warning: values.firstName ? undefined : "Recommended"
+ warning: values.firstName ? undefined : "Recommended",
});
setFieldData("lastName", {
- warning: values.lastName ? undefined : "Recommended"
+ warning: values.lastName ? undefined : "Recommended",
});
}}
/>
diff --git a/examples/fields-component/index.js b/examples/fields-component/index.js
index 7105ae8b..5f6a0229 100644
--- a/examples/fields-component/index.js
+++ b/examples/fields-component/index.js
@@ -1,29 +1,29 @@
-import React from 'react'
-import { render } from 'react-dom'
-import Styles from './Styles'
-import { Form, Field } from 'react-final-form'
+import React from "react";
+import { render } from "react-dom";
+import Styles from "./Styles";
+import { Form, Field } from "react-final-form";
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
-const onSubmit = async values => {
- await sleep(300)
- window.alert(JSON.stringify(values, 0, 2))
-}
+const onSubmit = async (values) => {
+ await sleep(300);
+ window.alert(JSON.stringify(values, 0, 2));
+};
const Fields = ({
names,
subscription,
fieldsState = {},
children,
- originalRender
+ originalRender,
}) => {
if (!names.length) {
- return (originalRender || children)(fieldsState)
+ return (originalRender || children)(fieldsState);
}
- const [name, ...rest] = names
+ const [name, ...rest] = names;
return (
- {fieldState => (
+ {(fieldState) => (
)}
- )
-}
+ );
+};
const App = () => (
🏁
- {' '}
+ {" "}
React Final Form
Fields Component
@@ -90,8 +90,8 @@ const App = () => (
Reset
-
- {fieldsState => (
+
+ {(fieldsState) => (
{JSON.stringify(fieldsState, undefined, 2)}
)}
@@ -99,6 +99,6 @@ const App = () => (
)}
/>
-)
+);
-render( , document.getElementById('root'))
+render( , document.getElementById("root"));
diff --git a/examples/focus-first-error/Styles.js b/examples/focus-first-error/Styles.js
index d40d2e49..fbb99a53 100644
--- a/examples/focus-first-error/Styles.js
+++ b/examples/focus-first-error/Styles.js
@@ -1,4 +1,4 @@
-import styled, { css } from 'styled-components'
+import styled, { css } from "styled-components";
const btn = (light, dark) => css`
white-space: nowrap;
@@ -25,14 +25,14 @@ const btn = (light, dark) => css`
opacity: 0.6;
cursor: not-allowed;
}
-`
+`;
const btnDefault = css`
- ${btn('#ffffff', '#d5d5d5')} color: #555;
-`
+ ${btn("#ffffff", "#d5d5d5")} color: #555;
+`;
-const btnPrimary = btn('#4f93ce', '#285f8f')
-const btnDanger = btn('#e27c79', '#c9302c')
+const btnPrimary = btn("#4f93ce", "#285f8f");
+const btnDanger = btn("#e27c79", "#c9302c");
export default styled.div`
font-family: sans-serif;
@@ -113,7 +113,7 @@ export default styled.div`
border: 1px solid #ccc;
border-radius: 3px;
}
- & > input[type='checkbox'] {
+ & > input[type="checkbox"] {
margin-top: 7px;
}
& > div {
@@ -193,10 +193,10 @@ export default styled.div`
}
button {
margin: 0 10px;
- &[type='submit'] {
+ &[type="submit"] {
${btnPrimary};
}
- &[type='button'] {
+ &[type="button"] {
${btnDefault};
}
}
@@ -207,4 +207,4 @@ export default styled.div`
padding: 3px 5px;
}
}
-`
+`;
diff --git a/examples/focus-first-error/index.js b/examples/focus-first-error/index.js
index 53806f0e..b9167c8e 100644
--- a/examples/focus-first-error/index.js
+++ b/examples/focus-first-error/index.js
@@ -1,31 +1,31 @@
-import React from 'react'
-import { render } from 'react-dom'
-import Styles from './Styles'
-import { Form, Field } from 'react-final-form'
-import createDecorator from 'final-form-focus'
-import validate from './validate'
+import React from "react";
+import { render } from "react-dom";
+import Styles from "./Styles";
+import { Form, Field } from "react-final-form";
+import createDecorator from "final-form-focus";
+import validate from "./validate";
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
-const onSubmit = async values => {
- await sleep(300)
- window.alert(JSON.stringify(values, 0, 2))
-}
+const onSubmit = async (values) => {
+ await sleep(300);
+ window.alert(JSON.stringify(values, 0, 2));
+};
const InputRow = ({ label, type, input, meta: { active, error, touched } }) => (
-
+
{label}
{error && touched && {error} }
-)
+);
-const focusOnError = createDecorator()
+const focusOnError = createDecorator();
const App = () => (
🏁
- {' '}
+ {" "}
React Final Form Example
Focus On First Error
@@ -33,7 +33,7 @@ const App = () => (
Read Docs
- Demonstrates how to use the{' '}
+ Demonstrates how to use the{" "}
(
>
🏁
- {' '}
- Final Form Focus{' '}
+ {" "}
+ Final Form Focus{" "}
🧐
- {' '}
- library as a pluggable{' '}
+ {" "}
+ library as a pluggable{" "}
🏁
- {' '}
+ {" "}
Final Form decorator to provide "focus on first error" functionality.
Notice what when you click the Submit button, the focus is placed on the
first field with an error.
@@ -97,6 +97,6 @@ const App = () => (
)}
/>
-)
+);
-render(
, document.getElementById('root'))
+render(
, document.getElementById("root"));
diff --git a/examples/focus-first-error/validate.js b/examples/focus-first-error/validate.js
index de6a71f3..39f80f9c 100644
--- a/examples/focus-first-error/validate.js
+++ b/examples/focus-first-error/validate.js
@@ -1,18 +1,18 @@
-export default values => {
- const errors = {}
+export default (values) => {
+ const errors = {};
if (!values.firstName) {
- errors.firstName = 'Required'
+ errors.firstName = "Required";
}
if (!values.lastName) {
- errors.lastName = 'Required'
+ errors.lastName = "Required";
}
if (!values.street) {
- errors.street = 'Required'
+ errors.street = "Required";
}
if (!values.age) {
- errors.age = 'Required'
+ errors.age = "Required";
} else if (isNaN(values.age)) {
- errors.age = 'Must be a number'
+ errors.age = "Must be a number";
}
- return errors
-}
+ return errors;
+};
diff --git a/examples/format-on-blur/Styles.js b/examples/format-on-blur/Styles.js
index ea36d7b2..48f75bad 100644
--- a/examples/format-on-blur/Styles.js
+++ b/examples/format-on-blur/Styles.js
@@ -1,4 +1,4 @@
-import styled, { css } from 'styled-components'
+import styled, { css } from "styled-components";
const btn = (light, dark) => css`
white-space: nowrap;
@@ -25,14 +25,14 @@ const btn = (light, dark) => css`
opacity: 0.6;
cursor: not-allowed;
}
-`
+`;
const btnDefault = css`
- ${btn('#ffffff', '#d5d5d5')} color: #555;
-`
+ ${btn("#ffffff", "#d5d5d5")} color: #555;
+`;
-const btnPrimary = btn('#4f93ce', '#285f8f')
-const btnDanger = btn('#e27c79', '#c9302c')
+const btnPrimary = btn("#4f93ce", "#285f8f");
+const btnDanger = btn("#e27c79", "#c9302c");
export default styled.div`
font-family: sans-serif;
@@ -128,7 +128,7 @@ export default styled.div`
font-family: monospace, monospace;
}
}
- & > input[type='checkbox'] {
+ & > input[type="checkbox"] {
margin-top: 7px;
}
& > div {
@@ -208,10 +208,10 @@ export default styled.div`
}
button {
margin: 0 10px;
- &[type='submit'] {
+ &[type="submit"] {
${btnPrimary};
}
- &[type='button'] {
+ &[type="button"] {
${btnDefault};
}
}
@@ -222,4 +222,4 @@ export default styled.div`
padding: 3px 5px;
}
}
-`
+`;
diff --git a/examples/format-on-blur/index.js b/examples/format-on-blur/index.js
index fd2dc938..c42ded40 100644
--- a/examples/format-on-blur/index.js
+++ b/examples/format-on-blur/index.js
@@ -1,27 +1,27 @@
-import React from 'react'
-import { render } from 'react-dom'
-import Styles from './Styles'
-import { Form, Field } from 'react-final-form'
-import numeral from 'numeral'
+import React from "react";
+import { render } from "react-dom";
+import Styles from "./Styles";
+import { Form, Field } from "react-final-form";
+import numeral from "numeral";
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
-const onSubmit = async values => {
- await sleep(300)
- window.alert(JSON.stringify(values, 0, 2))
-}
+const onSubmit = async (values) => {
+ await sleep(300);
+ window.alert(JSON.stringify(values, 0, 2));
+};
-const formatPrice = value =>
+const formatPrice = (value) =>
value === undefined
- ? '' // make controlled
- : numeral(value).format('$0,0.00')
+ ? "" // make controlled
+ : numeral(value).format("$0,0.00");
const App = () => (
🏁
- {' '}
+ {" "}
React Final Form
Format On Blur Example
@@ -31,8 +31,8 @@ const App = () => (
By default the format function given to Field is
called every time the component is rendered. But that can lead to a
- difficult UX for some types of values. That's why there is a{' '}
- formatOnBlur flag that will prevent the format{' '}
+ difficult UX for some types of values. That's why there is a{" "}
+ formatOnBlur flag that will prevent the format{" "}
function from being called until the field is blurred.
(
)}
/>
-)
+);
-render(
, document.getElementById('root'))
+render(
, document.getElementById("root"));
diff --git a/examples/format-string-by-pattern/Styles.js b/examples/format-string-by-pattern/Styles.js
index 06a77f51..0b4ad747 100644
--- a/examples/format-string-by-pattern/Styles.js
+++ b/examples/format-string-by-pattern/Styles.js
@@ -1,4 +1,4 @@
-import styled, { css } from 'styled-components'
+import styled, { css } from "styled-components";
const btn = (light, dark) => css`
white-space: nowrap;
@@ -25,14 +25,14 @@ const btn = (light, dark) => css`
opacity: 0.6;
cursor: not-allowed;
}
-`
+`;
const btnDefault = css`
- ${btn('#ffffff', '#d5d5d5')} color: #555;
-`
+ ${btn("#ffffff", "#d5d5d5")} color: #555;
+`;
-const btnPrimary = btn('#4f93ce', '#285f8f')
-const btnDanger = btn('#e27c79', '#c9302c')
+const btnPrimary = btn("#4f93ce", "#285f8f");
+const btnDanger = btn("#e27c79", "#c9302c");
export default styled.div`
font-family: sans-serif;
@@ -79,7 +79,7 @@ export default styled.div`
text-align: center;
display: block;
position: absolute;
- background: url('https://media.giphy.com/media/130AxGoOaR6t0I/giphy.gif')
+ background: url("https://media.giphy.com/media/130AxGoOaR6t0I/giphy.gif")
center center;
background-size: fill;
font-size: 2em;
@@ -114,7 +114,7 @@ export default styled.div`
border: 1px solid #ccc;
border-radius: 3px;
}
- & > input[type='checkbox'] {
+ & > input[type="checkbox"] {
margin-top: 7px;
}
& > div {
@@ -160,11 +160,11 @@ export default styled.div`
}
button {
margin: 0 10px;
- &[type='submit'] {
+ &[type="submit"] {
${btnPrimary};
}
- &[type='button'] {
+ &[type="button"] {
${btnDefault};
}
}
-`
+`;
diff --git a/examples/format-string-by-pattern/index.js b/examples/format-string-by-pattern/index.js
index 686de466..ce8f125c 100644
--- a/examples/format-string-by-pattern/index.js
+++ b/examples/format-string-by-pattern/index.js
@@ -1,38 +1,38 @@
-import React from 'react'
-import { render } from 'react-dom'
-import Styles from './Styles'
-import { Form, Field } from 'react-final-form'
-import formatString from 'format-string-by-pattern'
+import React from "react";
+import { render } from "react-dom";
+import Styles from "./Styles";
+import { Form, Field } from "react-final-form";
+import formatString from "format-string-by-pattern";
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
-const onSubmit = async values => {
- await sleep(300)
- window.alert(JSON.stringify(values, 0, 2))
-}
+const onSubmit = async (values) => {
+ await sleep(300);
+ window.alert(JSON.stringify(values, 0, 2));
+};
const masks = [
- { name: 'phone-1', parse: '999-999-9999' },
- { name: 'phone-2', parse: '(999) 999-9999' },
- { name: 'phone-3', parse: '+49 (AAAA) BBBBBB' },
- { name: 'cep 🇧🇷', parse: '12345-678' },
- { name: 'cpf 🇧🇷', parse: 'XXX.XXX.XXX-XX' },
- { name: 'cnpj 🇧🇷', parse: 'XX.XXX.XXX/XXXX-XX' }
-]
+ { name: "phone-1", parse: "999-999-9999" },
+ { name: "phone-2", parse: "(999) 999-9999" },
+ { name: "phone-3", parse: "+49 (AAAA) BBBBBB" },
+ { name: "cep 🇧🇷", parse: "12345-678" },
+ { name: "cpf 🇧🇷", parse: "XXX.XXX.XXX-XX" },
+ { name: "cnpj 🇧🇷", parse: "XX.XXX.XXX/XXXX-XX" },
+];
const App = () => (
🏁
- {' '}
+ {" "}
React Final Form
(
- {masks.map(mask => (
+ {masks.map((mask) => (
{mask.name}
(
)}
/>
-)
+);
-render( , document.getElementById('root'))
+render( , document.getElementById("root"));
diff --git a/examples/hybrid-sync-async-record-level-validation/Styles.js b/examples/hybrid-sync-async-record-level-validation/Styles.js
index a4edc9af..b8accf84 100644
--- a/examples/hybrid-sync-async-record-level-validation/Styles.js
+++ b/examples/hybrid-sync-async-record-level-validation/Styles.js
@@ -27,7 +27,9 @@ const btn = (light, dark) => css`
}
`;
-const btnDefault = css`${btn("#ffffff", "#d5d5d5")} color: #555;`;
+const btnDefault = css`
+ ${btn("#ffffff", "#d5d5d5")} color: #555;
+`;
const btnPrimary = btn("#4f93ce", "#285f8f");
diff --git a/examples/hybrid-sync-async-record-level-validation/index.js b/examples/hybrid-sync-async-record-level-validation/index.js
index f78a61cd..4ac45603 100644
--- a/examples/hybrid-sync-async-record-level-validation/index.js
+++ b/examples/hybrid-sync-async-record-level-validation/index.js
@@ -1,33 +1,33 @@
-import React from 'react'
-import { render } from 'react-dom'
-import Styles from './Styles'
-import Spinner from './Spinner'
-import { Form, Field } from 'react-final-form'
+import React from "react";
+import { render } from "react-dom";
+import Styles from "./Styles";
+import Spinner from "./Spinner";
+import { Form, Field } from "react-final-form";
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
-const onSubmit = async values => {
- await sleep(300)
- window.alert(JSON.stringify(values, 0, 2))
-}
+const onSubmit = async (values) => {
+ await sleep(300);
+ window.alert(JSON.stringify(values, 0, 2));
+};
-const verifyUsername = async values => {
- await sleep(400)
+const verifyUsername = async (values) => {
+ await sleep(400);
if (
- ~['john', 'paul', 'george', 'ringo'].indexOf(
- values.username && values.username.toLowerCase()
+ ~["john", "paul", "george", "ringo"].indexOf(
+ values.username && values.username.toLowerCase(),
)
) {
- return { username: 'Username taken!' }
+ return { username: "Username taken!" };
}
-}
+};
const App = () => (
🏁
- {' '}
+ {" "}
React Final Form Example
Hybrid Synchronous/Asynchronous Record-Level Validation
@@ -37,20 +37,20 @@ const App = () => (
Usernames John, Paul, George or Ringo will fail async validation.
{
- const errors = {}
+ validate={(values) => {
+ const errors = {};
if (!values.username) {
- errors.username = 'Required'
+ errors.username = "Required";
}
if (!values.password) {
- errors.password = 'Required'
+ errors.password = "Required";
}
if (!values.confirm) {
- errors.confirm = 'Required'
+ errors.confirm = "Required";
} else if (values.confirm !== values.password) {
- errors.confirm = 'Does not match'
+ errors.confirm = "Does not match";
}
- return Object.keys(errors).length ? errors : verifyUsername(values)
+ return Object.keys(errors).length ? errors : verifyUsername(values);
}}
render={({
handleSubmit,
@@ -58,7 +58,7 @@ const App = () => (
submitting,
pristine,
validating,
- values
+ values,
}) => (
{validating && }
@@ -110,6 +110,6 @@ const App = () => (
)}
/>
-)
+);
-render( , document.getElementById('root'))
+render( , document.getElementById("root"));
diff --git a/examples/independent-error-component-render-props/Styles.js b/examples/independent-error-component-render-props/Styles.js
index 2a2bfadd..3f54fa69 100644
--- a/examples/independent-error-component-render-props/Styles.js
+++ b/examples/independent-error-component-render-props/Styles.js
@@ -1,4 +1,4 @@
-import styled, { css } from 'styled-components'
+import styled, { css } from "styled-components";
const btn = (light, dark) => css`
white-space: nowrap;
@@ -25,14 +25,14 @@ const btn = (light, dark) => css`
opacity: 0.6;
cursor: not-allowed;
}
-`
+`;
const btnDefault = css`
- ${btn('#ffffff', '#d5d5d5')} color: #555;
-`
+ ${btn("#ffffff", "#d5d5d5")} color: #555;
+`;
-const btnPrimary = btn('#4f93ce', '#285f8f')
-const btnDanger = btn('#e27c79', '#c9302c')
+const btnPrimary = btn("#4f93ce", "#285f8f");
+const btnDanger = btn("#e27c79", "#c9302c");
export default styled.div`
font-family: sans-serif;
@@ -79,7 +79,7 @@ export default styled.div`
text-align: center;
display: block;
position: absolute;
- background: url('https://media.giphy.com/media/130AxGoOaR6t0I/giphy.gif')
+ background: url("https://media.giphy.com/media/130AxGoOaR6t0I/giphy.gif")
center center;
background-size: fill;
font-size: 2em;
@@ -114,7 +114,7 @@ export default styled.div`
border: 1px solid #ccc;
border-radius: 3px;
}
- & > input[type='checkbox'] {
+ & > input[type="checkbox"] {
margin-top: 7px;
}
& > div {
@@ -144,10 +144,10 @@ export default styled.div`
}
button {
margin: 0 10px;
- &[type='submit'] {
+ &[type="submit"] {
${btnPrimary};
}
- &[type='button'] {
+ &[type="button"] {
${btnDefault};
}
}
@@ -166,4 +166,4 @@ export default styled.div`
padding: 20px;
}
}
-`
+`;
diff --git a/examples/independent-error-component-render-props/index.js b/examples/independent-error-component-render-props/index.js
index c4ef8892..d8abc769 100644
--- a/examples/independent-error-component-render-props/index.js
+++ b/examples/independent-error-component-render-props/index.js
@@ -1,14 +1,14 @@
-import React from 'react'
-import { render } from 'react-dom'
-import Styles from './Styles'
-import { Form, Field } from 'react-final-form'
+import React from "react";
+import { render } from "react-dom";
+import Styles from "./Styles";
+import { Form, Field } from "react-final-form";
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
-const onSubmit = async values => {
- await sleep(300)
- window.alert(JSON.stringify(values, 0, 2))
-}
+const onSubmit = async (values) => {
+ await sleep(300);
+ window.alert(JSON.stringify(values, 0, 2));
+};
const Error = ({ name }) => (
(
touched && error ? {error} : null
}
/>
-)
+);
const App = () => (
🏁
- {' '}
+ {" "}
React Final Form Example
Reusable Independent Error Component
@@ -34,22 +34,22 @@ const App = () => (
{
- const errors = {}
+ validate={(values) => {
+ const errors = {};
if (!values.firstName) {
- errors.firstName = 'Required'
+ errors.firstName = "Required";
}
if (!values.lastName) {
- errors.lastName = 'Required'
+ errors.lastName = "Required";
}
if (!values.age) {
- errors.age = 'Required'
+ errors.age = "Required";
} else if (isNaN(values.age)) {
- errors.age = 'Must be a number'
+ errors.age = "Must be a number";
} else if (values.age < 18) {
- errors.age = 'No kids allowed'
+ errors.age = "No kids allowed";
}
- return errors
+ return errors;
}}
render={({ handleSubmit, reset, submitting, pristine, values }) => (
@@ -94,6 +94,6 @@ const App = () => (
)}
/>
-)
+);
-render( , document.getElementById('root'))
+render( , document.getElementById("root"));
diff --git a/examples/independent-error-component-with-hooks/Styles.js b/examples/independent-error-component-with-hooks/Styles.js
index 2a2bfadd..3f54fa69 100644
--- a/examples/independent-error-component-with-hooks/Styles.js
+++ b/examples/independent-error-component-with-hooks/Styles.js
@@ -1,4 +1,4 @@
-import styled, { css } from 'styled-components'
+import styled, { css } from "styled-components";
const btn = (light, dark) => css`
white-space: nowrap;
@@ -25,14 +25,14 @@ const btn = (light, dark) => css`
opacity: 0.6;
cursor: not-allowed;
}
-`
+`;
const btnDefault = css`
- ${btn('#ffffff', '#d5d5d5')} color: #555;
-`
+ ${btn("#ffffff", "#d5d5d5")} color: #555;
+`;
-const btnPrimary = btn('#4f93ce', '#285f8f')
-const btnDanger = btn('#e27c79', '#c9302c')
+const btnPrimary = btn("#4f93ce", "#285f8f");
+const btnDanger = btn("#e27c79", "#c9302c");
export default styled.div`
font-family: sans-serif;
@@ -79,7 +79,7 @@ export default styled.div`
text-align: center;
display: block;
position: absolute;
- background: url('https://media.giphy.com/media/130AxGoOaR6t0I/giphy.gif')
+ background: url("https://media.giphy.com/media/130AxGoOaR6t0I/giphy.gif")
center center;
background-size: fill;
font-size: 2em;
@@ -114,7 +114,7 @@ export default styled.div`
border: 1px solid #ccc;
border-radius: 3px;
}
- & > input[type='checkbox'] {
+ & > input[type="checkbox"] {
margin-top: 7px;
}
& > div {
@@ -144,10 +144,10 @@ export default styled.div`
}
button {
margin: 0 10px;
- &[type='submit'] {
+ &[type="submit"] {
${btnPrimary};
}
- &[type='button'] {
+ &[type="button"] {
${btnDefault};
}
}
@@ -166,4 +166,4 @@ export default styled.div`
padding: 20px;
}
}
-`
+`;
diff --git a/examples/independent-error-component-with-hooks/index.js b/examples/independent-error-component-with-hooks/index.js
index bd0cd175..9572509b 100644
--- a/examples/independent-error-component-with-hooks/index.js
+++ b/examples/independent-error-component-with-hooks/index.js
@@ -1,28 +1,28 @@
-import React from 'react'
-import { render } from 'react-dom'
-import Styles from './Styles'
-import { Form, Field, useField } from 'react-final-form'
+import React from "react";
+import { render } from "react-dom";
+import Styles from "./Styles";
+import { Form, Field, useField } from "react-final-form";
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
-const onSubmit = async values => {
- await sleep(300)
- window.alert(JSON.stringify(values, 0, 2))
-}
+const onSubmit = async (values) => {
+ await sleep(300);
+ window.alert(JSON.stringify(values, 0, 2));
+};
const Error = ({ name }) => {
const {
- meta: { touched, error }
- } = useField(name, { subscription: { touched: true, error: true } })
- return touched && error ? {error} : null
-}
+ meta: { touched, error },
+ } = useField(name, { subscription: { touched: true, error: true } });
+ return touched && error ? {error} : null;
+};
const App = () => (
🏁
- {' '}
+ {" "}
React Final Form Example
Reusable Independent Error Component
@@ -31,22 +31,22 @@ const App = () => (
{
- const errors = {}
+ validate={(values) => {
+ const errors = {};
if (!values.firstName) {
- errors.firstName = 'Required'
+ errors.firstName = "Required";
}
if (!values.lastName) {
- errors.lastName = 'Required'
+ errors.lastName = "Required";
}
if (!values.age) {
- errors.age = 'Required'
+ errors.age = "Required";
} else if (isNaN(values.age)) {
- errors.age = 'Must be a number'
+ errors.age = "Must be a number";
} else if (values.age < 18) {
- errors.age = 'No kids allowed'
+ errors.age = "No kids allowed";
}
- return errors
+ return errors;
}}
render={({ handleSubmit, reset, submitting, pristine, values }) => (
@@ -91,6 +91,6 @@ const App = () => (
)}
/>
-)
+);
-render( , document.getElementById('root'))
+render( , document.getElementById("root"));
diff --git a/examples/listening-for-external-changes/BooleanDecay.js b/examples/listening-for-external-changes/BooleanDecay.js
index da01d011..b2cbb420 100644
--- a/examples/listening-for-external-changes/BooleanDecay.js
+++ b/examples/listening-for-external-changes/BooleanDecay.js
@@ -1,5 +1,5 @@
-import React from 'react'
-import PropTypes from 'prop-types'
+import React from "react";
+import PropTypes from "prop-types";
/**
* 👋 Hey! Thanks for being curious about what this component does!
@@ -15,52 +15,52 @@ export default class BooleanDecay extends React.Component {
static propTypes = {
children: PropTypes.func.isRequired,
delay: PropTypes.number.isRequired,
- value: PropTypes.bool.isRequired
- }
+ value: PropTypes.bool.isRequired,
+ };
constructor(props) {
- super(props)
+ super(props);
this.state = {
- value: props.value
- }
+ value: props.value,
+ };
}
startTimer() {
- this.stopTimer()
+ this.stopTimer();
this.timeout = setTimeout(() => {
- this.setState({ value: false })
- }, this.props.delay)
+ this.setState({ value: false });
+ }, this.props.delay);
}
stopTimer() {
if (this.timeout) {
- clearTimeout(this.timeout)
+ clearTimeout(this.timeout);
}
}
componentDidMount() {
if (this.state.value) {
- this.startTimer()
+ this.startTimer();
}
}
componentWillUnmount() {
- this.stopTimer()
+ this.stopTimer();
}
componentWillReceiveProps(nextProps) {
- const { value } = nextProps
+ const { value } = nextProps;
if (value !== this.state.value) {
- this.setState({ value })
+ this.setState({ value });
if (value) {
- this.startTimer()
+ this.startTimer();
} else {
- this.stopTimer()
+ this.stopTimer();
}
}
}
render() {
- return this.props.children(this.state.value)
+ return this.props.children(this.state.value);
}
}
diff --git a/examples/listening-for-external-changes/ExternalModificationDetector.js b/examples/listening-for-external-changes/ExternalModificationDetector.js
index b07f9865..40169e8b 100644
--- a/examples/listening-for-external-changes/ExternalModificationDetector.js
+++ b/examples/listening-for-external-changes/ExternalModificationDetector.js
@@ -1,5 +1,5 @@
-import React from 'react'
-import { Field } from 'react-final-form'
+import React from "react";
+import { Field } from "react-final-form";
/**
* Listens for changes to a field's value, and, if the value changes
@@ -8,31 +8,34 @@ import { Field } from 'react-final-form'
*/
class ExternalModificationDetector extends React.Component {
constructor(props) {
- super(props)
+ super(props);
this.state = {
externallyModified: false,
- value: props.input.value
- }
+ value: props.input.value,
+ };
}
componentWillReceiveProps(nextProps) {
- const { input: { value }, meta: { active } } = nextProps
+ const {
+ input: { value },
+ meta: { active },
+ } = nextProps;
if (value !== this.state.value) {
this.setState({
value,
- externallyModified: !active
- })
+ externallyModified: !active,
+ });
} else if (this.state.externallyModified) {
this.setState({
- externallyModified: false
- })
+ externallyModified: false,
+ });
}
}
render() {
- const { children } = this.props
- const { externallyModified } = this.state
- return children(externallyModified)
+ const { children } = this.props;
+ const { externallyModified } = this.state;
+ return children(externallyModified);
}
}
@@ -41,10 +44,10 @@ export default ({ name, children }) => (
(
+ render={(props) => (
{children}
)}
/>
-)
+);
diff --git a/examples/listening-for-external-changes/Styles.js b/examples/listening-for-external-changes/Styles.js
index dd091033..698c8005 100644
--- a/examples/listening-for-external-changes/Styles.js
+++ b/examples/listening-for-external-changes/Styles.js
@@ -1,4 +1,4 @@
-import styled, { css } from 'styled-components'
+import styled, { css } from "styled-components";
const btn = (light, dark) => css`
white-space: nowrap;
@@ -25,14 +25,14 @@ const btn = (light, dark) => css`
opacity: 0.6;
cursor: not-allowed;
}
-`
+`;
const btnDefault = css`
- ${btn('#ffffff', '#d5d5d5')} color: #555;
-`
+ ${btn("#ffffff", "#d5d5d5")} color: #555;
+`;
-const btnPrimary = btn('#4f93ce', '#285f8f')
-const btnDanger = btn('#e27c79', '#c9302c')
+const btnPrimary = btn("#4f93ce", "#285f8f");
+const btnDanger = btn("#e27c79", "#c9302c");
export default styled.div`
font-family: sans-serif;
@@ -108,7 +108,7 @@ export default styled.div`
border: 1px solid #ccc;
border-radius: 3px;
}
- & > input[type='checkbox'] {
+ & > input[type="checkbox"] {
margin-top: 7px;
}
& > div {
@@ -188,10 +188,10 @@ export default styled.div`
}
button {
margin: 0 10px;
- &[type='submit'] {
+ &[type="submit"] {
${btnPrimary};
}
- &[type='button'] {
+ &[type="button"] {
${btnDefault};
}
}
@@ -202,4 +202,4 @@ export default styled.div`
padding: 3px 5px;
}
}
-`
+`;
diff --git a/examples/listening-for-external-changes/index.js b/examples/listening-for-external-changes/index.js
index 72220fcf..ebee728a 100644
--- a/examples/listening-for-external-changes/index.js
+++ b/examples/listening-for-external-changes/index.js
@@ -1,33 +1,33 @@
-import React from 'react'
-import { render } from 'react-dom'
-import Styles from './Styles'
-import { Form, Field } from 'react-final-form'
-import createDecorator from 'final-form-calculate'
-import ExternalModificationDetector from './ExternalModificationDetector'
-import BooleanDecay from './BooleanDecay'
+import React from "react";
+import { render } from "react-dom";
+import Styles from "./Styles";
+import { Form, Field } from "react-final-form";
+import createDecorator from "final-form-calculate";
+import ExternalModificationDetector from "./ExternalModificationDetector";
+import BooleanDecay from "./BooleanDecay";
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
-const onSubmit = async values => {
- await sleep(300)
- window.alert(JSON.stringify(values, 0, 2))
-}
+const onSubmit = async (values) => {
+ await sleep(300);
+ window.alert(JSON.stringify(values, 0, 2));
+};
const calculator = createDecorator({
field: /day\[\d\]/, // when a field matching this pattern changes...
updates: {
// ...update the total to the result of this function
total: (ignoredValue, allValues) =>
- (allValues.day || []).reduce((sum, value) => sum + Number(value || 0), 0)
- }
-})
+ (allValues.day || []).reduce((sum, value) => sum + Number(value || 0), 0),
+ },
+});
const App = () => (
🏁
- {' '}
+ {" "}
React Final Form Example
Listening for External Changes
@@ -98,17 +98,17 @@ const App = () => (
Total
- {externallyModified => (
+ {(externallyModified) => (
- {highlight => (
+ {(highlight) => (
)}
@@ -134,6 +134,6 @@ const App = () => (
)}
/>
-)
+);
-render( , document.getElementById('root'))
+render( , document.getElementById("root"));
diff --git a/examples/loading-initializing-values/Styles.js b/examples/loading-initializing-values/Styles.js
index 42a76a3e..3f54fa69 100644
--- a/examples/loading-initializing-values/Styles.js
+++ b/examples/loading-initializing-values/Styles.js
@@ -1,4 +1,4 @@
-import styled, { css } from 'styled-components'
+import styled, { css } from "styled-components";
const btn = (light, dark) => css`
white-space: nowrap;
@@ -25,12 +25,14 @@ const btn = (light, dark) => css`
opacity: 0.6;
cursor: not-allowed;
}
-`
+`;
-const btnDefault = css`${btn('#ffffff', '#d5d5d5')} color: #555;`
+const btnDefault = css`
+ ${btn("#ffffff", "#d5d5d5")} color: #555;
+`;
-const btnPrimary = btn('#4f93ce', '#285f8f')
-const btnDanger = btn('#e27c79', '#c9302c')
+const btnPrimary = btn("#4f93ce", "#285f8f");
+const btnDanger = btn("#e27c79", "#c9302c");
export default styled.div`
font-family: sans-serif;
@@ -77,7 +79,7 @@ export default styled.div`
text-align: center;
display: block;
position: absolute;
- background: url('https://media.giphy.com/media/130AxGoOaR6t0I/giphy.gif')
+ background: url("https://media.giphy.com/media/130AxGoOaR6t0I/giphy.gif")
center center;
background-size: fill;
font-size: 2em;
@@ -112,7 +114,7 @@ export default styled.div`
border: 1px solid #ccc;
border-radius: 3px;
}
- & > input[type='checkbox'] {
+ & > input[type="checkbox"] {
margin-top: 7px;
}
& > div {
@@ -142,10 +144,10 @@ export default styled.div`
}
button {
margin: 0 10px;
- &[type='submit'] {
+ &[type="submit"] {
${btnPrimary};
}
- &[type='button'] {
+ &[type="button"] {
${btnDefault};
}
}
@@ -164,4 +166,4 @@ export default styled.div`
padding: 20px;
}
}
-`
+`;
diff --git a/examples/loading-initializing-values/index.js b/examples/loading-initializing-values/index.js
index 46101198..ac2369ae 100644
--- a/examples/loading-initializing-values/index.js
+++ b/examples/loading-initializing-values/index.js
@@ -1,29 +1,29 @@
-import React from 'react'
-import { render } from 'react-dom'
-import Styles from './Styles'
-import { Form, Field } from 'react-final-form'
+import React from "react";
+import { render } from "react-dom";
+import Styles from "./Styles";
+import { Form, Field } from "react-final-form";
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
const load = async () => {
- await sleep(2000)
+ await sleep(2000);
return {
- username: 'erikras',
- firstName: 'Erik'
- }
-}
+ username: "erikras",
+ firstName: "Erik",
+ };
+};
-const onSubmit = async values => {
- await sleep(300)
- window.alert(JSON.stringify(values, 0, 2))
-}
+const onSubmit = async (values) => {
+ await sleep(300);
+ window.alert(JSON.stringify(values, 0, 2));
+};
class App extends React.Component {
- state = { data: {} }
+ state = { data: {} };
async componentDidMount() {
- this.setState({ loading: true })
- const data = await load()
- this.setState({ loading: false, data })
+ this.setState({ loading: true });
+ const data = await load();
+ this.setState({ loading: false, data });
}
render() {
@@ -32,7 +32,7 @@ class App extends React.Component {
🏁
- {' '}
+ {" "}
React Final Form - Loading and Initializing Values
@@ -75,12 +75,12 @@ class App extends React.Component {
{JSON.stringify(values, 0, 2)}
- )
+ );
}}
/>
- )
+ );
}
}
-render( , document.getElementById('root'))
+render( , document.getElementById("root"));
diff --git a/examples/loading-saving-reinitializing/LoadSaveReinitializeForm.js b/examples/loading-saving-reinitializing/LoadSaveReinitializeForm.js
index f1678681..ad753d9d 100644
--- a/examples/loading-saving-reinitializing/LoadSaveReinitializeForm.js
+++ b/examples/loading-saving-reinitializing/LoadSaveReinitializeForm.js
@@ -1,6 +1,6 @@
-import React from 'react'
-import PropTypes from 'prop-types'
-import { Form } from 'react-final-form'
+import React from "react";
+import PropTypes from "prop-types";
+import { Form } from "react-final-form";
export default class LoadSaveReinitializeForm extends React.Component {
static propTypes = {
@@ -8,62 +8,56 @@ export default class LoadSaveReinitializeForm extends React.Component {
loading: PropTypes.node.isRequired,
postLoadFormat: PropTypes.func,
preSaveFormat: PropTypes.func,
- save: PropTypes.func.isRequired
- }
+ save: PropTypes.func.isRequired,
+ };
state = {
isLoading: false,
originalValues: undefined,
- initialValues: undefined
- }
+ initialValues: undefined,
+ };
load = async () => {
- const { load, postLoadFormat } = this.props
- this.setState({ isLoading: true })
- const originalValues = await load()
+ const { load, postLoadFormat } = this.props;
+ this.setState({ isLoading: true });
+ const originalValues = await load();
const initialValues = postLoadFormat
? postLoadFormat(originalValues)
- : originalValues
+ : originalValues;
this.setState({
isLoading: false,
originalValues,
- initialValues
- })
- }
+ initialValues,
+ });
+ };
- save = async values => {
- const { postLoadFormat, preSaveFormat, save } = this.props
+ save = async (values) => {
+ const { postLoadFormat, preSaveFormat, save } = this.props;
let valuesToSave = preSaveFormat
? preSaveFormat(values, this.state.originalValues)
- : values
- const result = await save(valuesToSave)
+ : values;
+ const result = await save(valuesToSave);
this.setState({
originalValues: valuesToSave,
initialValues: postLoadFormat
? postLoadFormat(valuesToSave)
- : valuesToSave
- })
- return result
- }
+ : valuesToSave,
+ });
+ return result;
+ };
componentDidMount() {
- this.load()
+ this.load();
}
render() {
- const {
- load,
- loading,
- postLoadFormat,
- preSaveFormat,
- save,
- ...rest
- } = this.props
- const { isLoading, initialValues } = this.state
+ const { load, loading, postLoadFormat, preSaveFormat, save, ...rest } =
+ this.props;
+ const { isLoading, initialValues } = this.state;
return isLoading || !initialValues ? (
loading
) : (
- )
+ );
}
}
diff --git a/examples/loading-saving-reinitializing/Styles.js b/examples/loading-saving-reinitializing/Styles.js
index aeb652d7..2c842de6 100644
--- a/examples/loading-saving-reinitializing/Styles.js
+++ b/examples/loading-saving-reinitializing/Styles.js
@@ -1,4 +1,4 @@
-import styled, { css } from 'styled-components'
+import styled, { css } from "styled-components";
const btn = (light, dark) => css`
white-space: nowrap;
@@ -25,14 +25,14 @@ const btn = (light, dark) => css`
opacity: 0.6;
cursor: not-allowed;
}
-`
+`;
const btnDefault = css`
- ${btn('#ffffff', '#d5d5d5')} color: #555;
-`
+ ${btn("#ffffff", "#d5d5d5")} color: #555;
+`;
-const btnPrimary = btn('#4f93ce', '#285f8f')
-const btnDanger = btn('#e27c79', '#c9302c')
+const btnPrimary = btn("#4f93ce", "#285f8f");
+const btnDanger = btn("#e27c79", "#c9302c");
export default styled.div`
font-family: sans-serif;
@@ -107,7 +107,7 @@ export default styled.div`
border: 1px solid #ccc;
border-radius: 3px;
}
- & > input[type='checkbox'] {
+ & > input[type="checkbox"] {
margin-top: 7px;
}
& > div {
@@ -173,11 +173,11 @@ export default styled.div`
}
button {
margin: 0 10px;
- &[type='submit'] {
+ &[type="submit"] {
${btnPrimary};
}
- &[type='button'] {
+ &[type="button"] {
${btnDefault};
}
}
-`
+`;
diff --git a/examples/loading-saving-reinitializing/index.js b/examples/loading-saving-reinitializing/index.js
index 466bfd26..4f102d85 100644
--- a/examples/loading-saving-reinitializing/index.js
+++ b/examples/loading-saving-reinitializing/index.js
@@ -1,55 +1,55 @@
-import React from 'react'
-import { render } from 'react-dom'
-import Styles from './Styles'
-import { Field } from 'react-final-form'
-import LoadSaveReinitializeForm from './LoadSaveReinitializeForm'
+import React from "react";
+import { render } from "react-dom";
+import Styles from "./Styles";
+import { Field } from "react-final-form";
+import LoadSaveReinitializeForm from "./LoadSaveReinitializeForm";
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
let record = {
primaryKey: 42,
- phone: '2045551234',
- name: 'John Doe',
- email: 'john.doe@final-form.org',
+ phone: "2045551234",
+ name: "John Doe",
+ email: "john.doe@final-form.org",
otherExtraneousInfo: {
- creditScore: 800
- }
-}
+ creditScore: 800,
+ },
+};
const load = async () => {
- console.info('Loading...')
- await sleep(1500)
- console.info('Loaded...')
- return record
-}
+ console.info("Loading...");
+ await sleep(1500);
+ console.info("Loaded...");
+ return record;
+};
-const save = async values => {
- console.info('Saving', values)
- await sleep(1500)
- record = values
-}
+const save = async (values) => {
+ console.info("Saving", values);
+ await sleep(1500);
+ record = values;
+};
-const postLoadFormat = values => {
- const { name, email, phone } = values
- const [firstName, lastName] = name.split(/ /, 2)
+const postLoadFormat = (values) => {
+ const { name, email, phone } = values;
+ const [firstName, lastName] = name.split(/ /, 2);
return {
firstName,
lastName,
email,
phone: phone
? `${phone.slice(0, 3)}-${phone.slice(3, 6)}-${phone.slice(6, 10)}`
- : ''
- }
-}
+ : "",
+ };
+};
const preSaveFormat = (values, originalValues) => {
return {
...originalValues,
- name: `${values.firstName || ''} ${values.lastName || ''}`,
+ name: `${values.firstName || ""} ${values.lastName || ""}`,
email: values.email,
- phone: values.phone.replace(/-/g, '')
- }
-}
+ phone: values.phone.replace(/-/g, ""),
+ };
+};
const Error = ({ name }) => (
(
touched && error ? {error} : null
}
/>
-)
+);
-const loading = Loading...
+const loading = Loading...
;
-const validate = values => {
- const errors = {}
+const validate = (values) => {
+ const errors = {};
if (!values.firstName) {
- errors.firstName = 'Required'
+ errors.firstName = "Required";
}
if (!values.lastName) {
- errors.lastName = 'Required'
+ errors.lastName = "Required";
}
if (!values.email) {
- errors.email = 'Required'
+ errors.email = "Required";
}
if (!values.phone) {
- errors.phone = 'Required'
+ errors.phone = "Required";
}
- return errors
-}
+ return errors;
+};
const App = () => (
🏁
- {' '}
+ {" "}
React Final Form
Load, Save, and Reinitialize
@@ -92,10 +92,10 @@ const App = () => (
Read Docs
- LoadSaveReinitializeForm is a wrapper for a{' '}
+ LoadSaveReinitializeForm is a wrapper for a{" "}
🏁
- {' '}
+ {" "}
React Final Form component. On mount, it loads a record from the
database/API, and formats it to the shape of the form inputs. On submit,
it converts the data back to the format that the database/API wants
@@ -177,6 +177,6 @@ const App = () => (
)}
-)
+);
-render( , document.getElementById('root'))
+render( , document.getElementById("root"));
diff --git a/examples/material-ui/index.js b/examples/material-ui/index.js
index de0b5c82..e7849135 100644
--- a/examples/material-ui/index.js
+++ b/examples/material-ui/index.js
@@ -21,13 +21,13 @@ import {
// Picker
import DateFnsUtils from '@date-io/date-fns';
-const onSubmit = async values => {
- const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
+const onSubmit = async (values) => {
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
await sleep(300);
window.alert(JSON.stringify(values, 0, 2));
};
-const validate = values => {
+const validate = (values) => {
const errors = {};
if (!values.firstName) {
errors.firstName = 'Required';
diff --git a/examples/parse-format/Styles.js b/examples/parse-format/Styles.js
index 06a77f51..0b4ad747 100644
--- a/examples/parse-format/Styles.js
+++ b/examples/parse-format/Styles.js
@@ -1,4 +1,4 @@
-import styled, { css } from 'styled-components'
+import styled, { css } from "styled-components";
const btn = (light, dark) => css`
white-space: nowrap;
@@ -25,14 +25,14 @@ const btn = (light, dark) => css`
opacity: 0.6;
cursor: not-allowed;
}
-`
+`;
const btnDefault = css`
- ${btn('#ffffff', '#d5d5d5')} color: #555;
-`
+ ${btn("#ffffff", "#d5d5d5")} color: #555;
+`;
-const btnPrimary = btn('#4f93ce', '#285f8f')
-const btnDanger = btn('#e27c79', '#c9302c')
+const btnPrimary = btn("#4f93ce", "#285f8f");
+const btnDanger = btn("#e27c79", "#c9302c");
export default styled.div`
font-family: sans-serif;
@@ -79,7 +79,7 @@ export default styled.div`
text-align: center;
display: block;
position: absolute;
- background: url('https://media.giphy.com/media/130AxGoOaR6t0I/giphy.gif')
+ background: url("https://media.giphy.com/media/130AxGoOaR6t0I/giphy.gif")
center center;
background-size: fill;
font-size: 2em;
@@ -114,7 +114,7 @@ export default styled.div`
border: 1px solid #ccc;
border-radius: 3px;
}
- & > input[type='checkbox'] {
+ & > input[type="checkbox"] {
margin-top: 7px;
}
& > div {
@@ -160,11 +160,11 @@ export default styled.div`
}
button {
margin: 0 10px;
- &[type='submit'] {
+ &[type="submit"] {
${btnPrimary};
}
- &[type='button'] {
+ &[type="button"] {
${btnDefault};
}
}
-`
+`;
diff --git a/examples/parse-format/index.js b/examples/parse-format/index.js
index f38c668c..9af32c72 100644
--- a/examples/parse-format/index.js
+++ b/examples/parse-format/index.js
@@ -1,33 +1,33 @@
-import React from 'react'
-import { render } from 'react-dom'
-import Styles from './Styles'
-import { Form, Field } from 'react-final-form'
+import React from "react";
+import { render } from "react-dom";
+import Styles from "./Styles";
+import { Form, Field } from "react-final-form";
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
-const onSubmit = async values => {
- await sleep(300)
- window.alert(JSON.stringify(values, 0, 2))
-}
+const onSubmit = async (values) => {
+ await sleep(300);
+ window.alert(JSON.stringify(values, 0, 2));
+};
-const normalizePhone = value => {
- if (!value) return value
- const onlyNums = value.replace(/[^\d]/g, '')
- if (onlyNums.length <= 3) return onlyNums
+const normalizePhone = (value) => {
+ if (!value) return value;
+ const onlyNums = value.replace(/[^\d]/g, "");
+ if (onlyNums.length <= 3) return onlyNums;
if (onlyNums.length <= 7)
- return `(${onlyNums.slice(0, 3)}) ${onlyNums.slice(3, 7)}`
+ return `(${onlyNums.slice(0, 3)}) ${onlyNums.slice(3, 7)}`;
return `(${onlyNums.slice(0, 3)}) ${onlyNums.slice(3, 6)}-${onlyNums.slice(
6,
- 10
- )}`
-}
+ 10,
+ )}`;
+};
const App = () => (
🏁
- {' '}
+ {" "}
React Final Form
Parse and Format
@@ -46,8 +46,8 @@ const App = () => (
component="input"
type="text"
placeholder="Username"
- parse={value => value && value.toUpperCase()}
- format={value => (value ? value.toLowerCase() : '')}
+ parse={(value) => value && value.toUpperCase()}
+ format={(value) => (value ? value.toLowerCase() : "")}
/>
@@ -77,6 +77,6 @@ const App = () => (
)}
/>
-)
+);
-render(
, document.getElementById('root'))
+render(
, document.getElementById("root"));
diff --git a/examples/prefixed-fields/index.js b/examples/prefixed-fields/index.js
index 5bff040a..20c584dc 100644
--- a/examples/prefixed-fields/index.js
+++ b/examples/prefixed-fields/index.js
@@ -1,27 +1,27 @@
-import React from 'react'
-import { render } from 'react-dom'
-import Styles from './Styles'
-import { Form, Field } from 'react-final-form'
+import React from "react";
+import { render } from "react-dom";
+import Styles from "./Styles";
+import { Form, Field } from "react-final-form";
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
-const onSubmit = async values => {
- await sleep(300)
- window.alert(JSON.stringify(values, 0, 2))
-}
+const onSubmit = async (values) => {
+ await sleep(300);
+ window.alert(JSON.stringify(values, 0, 2));
+};
/************ IMPORTANT CODE STARTS HERE **************/
-const FieldPrefixContext = React.createContext()
+const FieldPrefixContext = React.createContext();
const FieldPrefix = ({ prefix, children }) => (
{children}
-)
+);
const PrefixedField = ({ name, ...props }) => (
- {prefix => }
+ {(prefix) => }
-)
+);
/************* IMPORTANT CODE ENDS HERE ***************/
const App = () => (
@@ -29,7 +29,7 @@ const App = () => (
🏁
- {' '}
+ {" "}
React Final Form
Prefixed Fields Example
@@ -39,14 +39,14 @@ const App = () => (
This example shows how to use React Context to create sections of your
form that have their fields' names prefixed, to structure the resulting
- form data. This provides similar functionality to Redux Form's{' '}
+ form data. This provides similar functionality to Redux Form's{" "}
FormSection
- {' '}
+ {" "}
component.
(
)}
/>
-)
+);
-render( , document.getElementById('root'))
+render( , document.getElementById("root"));
diff --git a/examples/record-level-validation/Styles.js b/examples/record-level-validation/Styles.js
index 0a371734..a1c46db5 100644
--- a/examples/record-level-validation/Styles.js
+++ b/examples/record-level-validation/Styles.js
@@ -1,4 +1,4 @@
-import styled, { css } from 'styled-components'
+import styled, { css } from "styled-components";
const btn = (light, dark) => css`
white-space: nowrap;
@@ -25,13 +25,13 @@ const btn = (light, dark) => css`
opacity: 0.6;
cursor: not-allowed;
}
-`
+`;
const btnDefault = css`
- ${btn('#ffffff', '#d5d5d5')} color: #555;
-`
+ ${btn("#ffffff", "#d5d5d5")} color: #555;
+`;
-const btnPrimary = btn('#4f93ce', '#285f8f')
+const btnPrimary = btn("#4f93ce", "#285f8f");
export default styled.div`
font-family: sans-serif;
@@ -85,7 +85,7 @@ export default styled.div`
border: 1px solid #ccc;
border-radius: 3px;
}
- & > input[type='checkbox'] {
+ & > input[type="checkbox"] {
margin-top: 7px;
}
& > div {
@@ -112,10 +112,10 @@ export default styled.div`
}
button {
margin: 0 10px;
- &[type='submit'] {
+ &[type="submit"] {
${btnPrimary};
}
- &[type='button'] {
+ &[type="button"] {
${btnDefault};
}
}
@@ -126,4 +126,4 @@ export default styled.div`
padding: 20px;
}
}
-`
+`;
diff --git a/examples/record-level-validation/index.js b/examples/record-level-validation/index.js
index 1b8c6d3f..96109338 100644
--- a/examples/record-level-validation/index.js
+++ b/examples/record-level-validation/index.js
@@ -1,14 +1,14 @@
-import React from 'react'
-import { render } from 'react-dom'
-import Styles from './Styles'
-import { Form, Field } from 'react-final-form'
+import React from "react";
+import { render } from "react-dom";
+import Styles from "./Styles";
+import { Form, Field } from "react-final-form";
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
-const onSubmit = async values => {
- await sleep(300)
- window.alert(JSON.stringify(values, 0, 2))
-}
+const onSubmit = async (values) => {
+ await sleep(300);
+ window.alert(JSON.stringify(values, 0, 2));
+};
const App = () => (
@@ -23,20 +23,20 @@ const App = () => (
{
- const errors = {}
+ validate={(values) => {
+ const errors = {};
if (!values.username) {
- errors.username = 'Required'
+ errors.username = "Required";
}
if (!values.password) {
- errors.password = 'Required'
+ errors.password = "Required";
}
if (!values.confirm) {
- errors.confirm = 'Required'
+ errors.confirm = "Required";
} else if (values.confirm !== values.password) {
- errors.confirm = 'Must match'
+ errors.confirm = "Must match";
}
- return errors
+ return errors;
}}
render={({ handleSubmit, form, submitting, pristine, values }) => (
@@ -84,6 +84,6 @@ const App = () => (
)}
/>
-)
+);
-render( , document.getElementById('root'))
+render( , document.getElementById("root"));
diff --git a/examples/redux/FormStateFromRedux.js b/examples/redux/FormStateFromRedux.js
index c0b1e767..8d672cb7 100644
--- a/examples/redux/FormStateFromRedux.js
+++ b/examples/redux/FormStateFromRedux.js
@@ -1,11 +1,11 @@
-import React from 'react'
-import { connect } from 'react-redux'
-import { getFormState } from './finalFormDuck'
+import React from "react";
+import { connect } from "react-redux";
+import { getFormState } from "./finalFormDuck";
const FormStateFromRedux = ({ state }) => (
{JSON.stringify(state, 0, 2)}
-)
+);
export default connect((state, ownProps) => ({
- state: getFormState(state, ownProps.form)
-}))(FormStateFromRedux)
+ state: getFormState(state, ownProps.form),
+}))(FormStateFromRedux);
diff --git a/examples/redux/FormStateToRedux.js b/examples/redux/FormStateToRedux.js
index c74a3bc3..28d234d5 100644
--- a/examples/redux/FormStateToRedux.js
+++ b/examples/redux/FormStateToRedux.js
@@ -1,10 +1,10 @@
-import React from 'react'
-import { connect } from 'react-redux'
-import { FormSpy } from 'react-final-form'
-import { updateFormState } from './finalFormDuck'
+import React from "react";
+import { connect } from "react-redux";
+import { FormSpy } from "react-final-form";
+import { updateFormState } from "./finalFormDuck";
const FormStateToRedux = ({ form, updateFormState }) => (
- updateFormState(form, state)} />
-)
+ updateFormState(form, state)} />
+);
-export default connect(undefined, { updateFormState })(FormStateToRedux)
+export default connect(undefined, { updateFormState })(FormStateToRedux);
diff --git a/examples/redux/Styles.js b/examples/redux/Styles.js
index aeb652d7..2c842de6 100644
--- a/examples/redux/Styles.js
+++ b/examples/redux/Styles.js
@@ -1,4 +1,4 @@
-import styled, { css } from 'styled-components'
+import styled, { css } from "styled-components";
const btn = (light, dark) => css`
white-space: nowrap;
@@ -25,14 +25,14 @@ const btn = (light, dark) => css`
opacity: 0.6;
cursor: not-allowed;
}
-`
+`;
const btnDefault = css`
- ${btn('#ffffff', '#d5d5d5')} color: #555;
-`
+ ${btn("#ffffff", "#d5d5d5")} color: #555;
+`;
-const btnPrimary = btn('#4f93ce', '#285f8f')
-const btnDanger = btn('#e27c79', '#c9302c')
+const btnPrimary = btn("#4f93ce", "#285f8f");
+const btnDanger = btn("#e27c79", "#c9302c");
export default styled.div`
font-family: sans-serif;
@@ -107,7 +107,7 @@ export default styled.div`
border: 1px solid #ccc;
border-radius: 3px;
}
- & > input[type='checkbox'] {
+ & > input[type="checkbox"] {
margin-top: 7px;
}
& > div {
@@ -173,11 +173,11 @@ export default styled.div`
}
button {
margin: 0 10px;
- &[type='submit'] {
+ &[type="submit"] {
${btnPrimary};
}
- &[type='button'] {
+ &[type="button"] {
${btnDefault};
}
}
-`
+`;
diff --git a/examples/redux/finalFormDuck.js b/examples/redux/finalFormDuck.js
index eacedceb..723be3e2 100644
--- a/examples/redux/finalFormDuck.js
+++ b/examples/redux/finalFormDuck.js
@@ -1,7 +1,8 @@
// QUACK! This is a duck. https://github.com/erikras/ducks-modular-redux
// Actions
-const UPDATE_FORM_STATE = 'final-form-redux-example/finalForm/UPDATE_FORM_STATE'
+const UPDATE_FORM_STATE =
+ "final-form-redux-example/finalForm/UPDATE_FORM_STATE";
// Reducer
export default function reducer(state = {}, action = {}) {
@@ -9,10 +10,10 @@ export default function reducer(state = {}, action = {}) {
case UPDATE_FORM_STATE:
return {
...state,
- [action.form]: action.payload
- }
+ [action.form]: action.payload,
+ };
default:
- return state
+ return state;
}
}
@@ -20,9 +21,9 @@ export default function reducer(state = {}, action = {}) {
export const updateFormState = (form, state) => ({
type: UPDATE_FORM_STATE,
form,
- payload: state
-})
+ payload: state,
+});
// Selectors
export const getFormState = (state, form) =>
- (state && state.finalForm && state.finalForm[form]) || {}
+ (state && state.finalForm && state.finalForm[form]) || {};
diff --git a/examples/redux/index.js b/examples/redux/index.js
index 809599c1..c341d0e3 100644
--- a/examples/redux/index.js
+++ b/examples/redux/index.js
@@ -1,18 +1,18 @@
-import React from 'react'
-import { render } from 'react-dom'
-import { Provider } from 'react-redux'
-import store from './store'
-import Styles from './Styles'
-import { Form, Field } from 'react-final-form'
-import FormStateToRedux from './FormStateToRedux'
-import FormStateFromRedux from './FormStateFromRedux'
+import React from "react";
+import { render } from "react-dom";
+import { Provider } from "react-redux";
+import store from "./store";
+import Styles from "./Styles";
+import { Form, Field } from "react-final-form";
+import FormStateToRedux from "./FormStateToRedux";
+import FormStateFromRedux from "./FormStateFromRedux";
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
-const onSubmit = async values => {
- await sleep(300)
- window.alert(JSON.stringify(values, 0, 2))
-}
+const onSubmit = async (values) => {
+ await sleep(300);
+ window.alert(JSON.stringify(values, 0, 2));
+};
const App = () => (
@@ -20,7 +20,7 @@ const App = () => (
🏁
- {' '}
+ {" "}
React Final Form
Redux Example
@@ -28,25 +28,25 @@ const App = () => (
Read Docs
- The only reason to keep your{' '}
+ The only reason to keep your{" "}
🏁
- {' '}
+ {" "}
Final Form form data in Redux is if you need to be able to read it from
- outside your form. This example demonstrates how to use a{' '}
+ outside your form. This example demonstrates how to use a{" "}
FormSpy to keep a copy of your form data in the Redux
store. Note that the canonical authoritative version of the data still
- lives in{' '}
+ lives in{" "}
🏁
- {' '}
+ {" "}
Final Form. If you need to mutate your data via dispatching
- Redux actions, you should probably use{' '}
+ Redux actions, you should probably use{" "}
Redux Form .
{({ handleSubmit, form, submitting, pristine }) => (
@@ -86,19 +86,19 @@ const App = () => (
❤️
- {' '}
+ {" "}
Red
💚
- {' '}
+ {" "}
Green
💙
- {' '}
+ {" "}
Blue
@@ -113,31 +113,31 @@ const App = () => (
🐷
- {' '}
+ {" "}
Ham
🍄
- {' '}
+ {" "}
Mushrooms
🧀
- {' '}
+ {" "}
Cheese
🐓
- {' '}
+ {" "}
Chicken
🍍
- {' '}
+ {" "}
Pinapple
@@ -151,7 +151,7 @@ const App = () => (
component="input"
type="radio"
value="larry"
- />{' '}
+ />{" "}
Larry
@@ -160,7 +160,7 @@ const App = () => (
component="input"
type="radio"
value="moe"
- />{' '}
+ />{" "}
Moe
@@ -169,7 +169,7 @@ const App = () => (
component="input"
type="radio"
value="curly"
- />{' '}
+ />{" "}
Curly
@@ -183,7 +183,7 @@ const App = () => (
component="input"
type="checkbox"
value="ketchup"
- />{' '}
+ />{" "}
Ketchup
@@ -192,7 +192,7 @@ const App = () => (
component="input"
type="checkbox"
value="mustard"
- />{' '}
+ />{" "}
Mustard
@@ -201,7 +201,7 @@ const App = () => (
component="input"
type="checkbox"
value="salsa"
- />{' '}
+ />{" "}
Salsa
@@ -210,8 +210,8 @@ const App = () => (
component="input"
type="checkbox"
value="guacamole"
- />{' '}
- Guacamole{' '}
+ />{" "}
+ Guacamole{" "}
🥑
@@ -241,6 +241,6 @@ const App = () => (
-)
+);
-render(
, document.getElementById('root'))
+render(
, document.getElementById("root"));
diff --git a/examples/redux/store.js b/examples/redux/store.js
index 833857cf..3823e64f 100644
--- a/examples/redux/store.js
+++ b/examples/redux/store.js
@@ -1,11 +1,13 @@
-import { createStore, combineReducers } from 'redux'
-import finalFormReducer from './finalFormDuck'
+import { createStore, combineReducers } from "redux";
+import finalFormReducer from "./finalFormDuck";
const reducer = combineReducers({
- finalForm: finalFormReducer
-})
-const store = (typeof window !== 'undefined' && window.devToolsExtension
- ? window.devToolsExtension()(createStore)
- : createStore)(reducer)
+ finalForm: finalFormReducer,
+});
+const store = (
+ typeof window !== "undefined" && window.devToolsExtension
+ ? window.devToolsExtension()(createStore)
+ : createStore
+)(reducer);
-export default store
+export default store;
diff --git a/examples/reusable-field-groups/Styles.js b/examples/reusable-field-groups/Styles.js
index 6821a1f1..c27cface 100644
--- a/examples/reusable-field-groups/Styles.js
+++ b/examples/reusable-field-groups/Styles.js
@@ -1,4 +1,4 @@
-import styled, { css } from 'styled-components'
+import styled, { css } from "styled-components";
const btn = (light, dark) => css`
white-space: nowrap;
@@ -25,14 +25,14 @@ const btn = (light, dark) => css`
opacity: 0.6;
cursor: not-allowed;
}
-`
+`;
const btnDefault = css`
- ${btn('#ffffff', '#d5d5d5')} color: #555;
-`
+ ${btn("#ffffff", "#d5d5d5")} color: #555;
+`;
-const btnPrimary = btn('#4f93ce', '#285f8f')
-const btnDanger = btn('#e27c79', '#c9302c')
+const btnPrimary = btn("#4f93ce", "#285f8f");
+const btnDanger = btn("#e27c79", "#c9302c");
export default styled.div`
font-family: sans-serif;
@@ -79,7 +79,7 @@ export default styled.div`
text-align: center;
display: block;
position: absolute;
- background: url('https://media.giphy.com/media/130AxGoOaR6t0I/giphy.gif')
+ background: url("https://media.giphy.com/media/130AxGoOaR6t0I/giphy.gif")
center center;
background-size: fill;
font-size: 2em;
@@ -114,7 +114,7 @@ export default styled.div`
border: 1px solid #ccc;
border-radius: 3px;
}
- & > input[type='checkbox'] {
+ & > input[type="checkbox"] {
margin-top: 7px;
}
& > div {
@@ -144,10 +144,10 @@ export default styled.div`
}
button {
margin: 0 10px;
- &[type='submit'] {
+ &[type="submit"] {
${btnPrimary};
}
- &[type='button'] {
+ &[type="button"] {
${btnDefault};
}
}
@@ -166,4 +166,4 @@ export default styled.div`
padding: 20px;
}
}
-`
+`;
diff --git a/examples/reusable-field-groups/index.js b/examples/reusable-field-groups/index.js
index fade75b8..48fc34d8 100644
--- a/examples/reusable-field-groups/index.js
+++ b/examples/reusable-field-groups/index.js
@@ -1,14 +1,14 @@
-import React from 'react'
-import { render } from 'react-dom'
-import Styles from './Styles'
-import { Form, Field } from 'react-final-form'
+import React from "react";
+import { render } from "react-dom";
+import Styles from "./Styles";
+import { Form, Field } from "react-final-form";
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
-const onSubmit = async values => {
- await sleep(300)
- window.alert(JSON.stringify(values, 0, 2))
-}
+const onSubmit = async (values) => {
+ await sleep(300);
+ window.alert(JSON.stringify(values, 0, 2));
+};
const Address = ({ name, label }) => (
@@ -37,14 +37,14 @@ const Address = ({ name, label }) => (
/>
-)
+);
const App = () => (
🏁
- {' '}
+ {" "}
React Final Form Example
Reusable Field Groups
@@ -78,6 +78,6 @@ const App = () => (
)}
/>
-)
+);
-render( , document.getElementById('root'))
+render( , document.getElementById("root"));
diff --git a/examples/simple/Styles.js b/examples/simple/Styles.js
index e5d1235a..80ba86b6 100644
--- a/examples/simple/Styles.js
+++ b/examples/simple/Styles.js
@@ -1,4 +1,4 @@
-import styled, { css } from 'styled-components'
+import styled, { css } from "styled-components";
const btn = (light, dark) => css`
white-space: nowrap;
@@ -25,13 +25,13 @@ const btn = (light, dark) => css`
opacity: 0.6;
cursor: not-allowed;
}
-`
+`;
const btnDefault = css`
- ${btn('#ffffff', '#d5d5d5')} color: #555;
-`
+ ${btn("#ffffff", "#d5d5d5")} color: #555;
+`;
-const btnPrimary = btn('#4f93ce', '#285f8f')
+const btnPrimary = btn("#4f93ce", "#285f8f");
export default styled.div`
font-family: sans-serif;
@@ -80,7 +80,7 @@ export default styled.div`
border: 1px solid #ccc;
border-radius: 3px;
}
- & > input[type='checkbox'] {
+ & > input[type="checkbox"] {
margin-top: 7px;
}
& > div {
@@ -101,10 +101,10 @@ export default styled.div`
}
button {
margin: 0 10px;
- &[type='submit'] {
+ &[type="submit"] {
${btnPrimary};
}
- &[type='button'] {
+ &[type="button"] {
${btnDefault};
}
}
@@ -115,4 +115,4 @@ export default styled.div`
padding: 20px;
}
}
-`
+`;
diff --git a/examples/simple/index.js b/examples/simple/index.js
index f6737b1d..b5803871 100644
--- a/examples/simple/index.js
+++ b/examples/simple/index.js
@@ -1,15 +1,15 @@
/* eslint-disable jsx-a11y/accessible-emoji */
-import React from 'react'
-import { render } from 'react-dom'
-import Styles from './Styles'
-import { Form, Field } from 'react-final-form'
+import React from "react";
+import { render } from "react-dom";
+import Styles from "./Styles";
+import { Form, Field } from "react-final-form";
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
-const onSubmit = async values => {
- await sleep(300)
- window.alert(JSON.stringify(values, 0, 2))
-}
+const onSubmit = async (values) => {
+ await sleep(300);
+ window.alert(JSON.stringify(values, 0, 2));
+};
const App = () => (
@@ -23,7 +23,7 @@ const App = () => (
(
@@ -77,7 +77,7 @@ const App = () => (
component="input"
type="checkbox"
value="ketchup"
- />{' '}
+ />{" "}
Ketchup
@@ -86,7 +86,7 @@ const App = () => (
component="input"
type="checkbox"
value="mustard"
- />{' '}
+ />{" "}
Mustard
@@ -95,7 +95,7 @@ const App = () => (
component="input"
type="checkbox"
value="mayonnaise"
- />{' '}
+ />{" "}
Mayonnaise
@@ -104,7 +104,7 @@ const App = () => (
component="input"
type="checkbox"
value="guacamole"
- />{' '}
+ />{" "}
Guacamole 🥑
@@ -118,7 +118,7 @@ const App = () => (
component="input"
type="radio"
value="larry"
- />{' '}
+ />{" "}
Larry
@@ -127,7 +127,7 @@ const App = () => (
component="input"
type="radio"
value="moe"
- />{' '}
+ />{" "}
Moe
@@ -136,7 +136,7 @@ const App = () => (
component="input"
type="radio"
value="curly"
- />{' '}
+ />{" "}
Curly
@@ -162,6 +162,6 @@ const App = () => (
)}
/>
-)
+);
-render( , document.getElementById('root'))
+render( , document.getElementById("root"));
diff --git a/examples/strongly-typed-values-typescript/components/CheckboxInput.tsx b/examples/strongly-typed-values-typescript/components/CheckboxInput.tsx
index ed28a97f..54d8e714 100644
--- a/examples/strongly-typed-values-typescript/components/CheckboxInput.tsx
+++ b/examples/strongly-typed-values-typescript/components/CheckboxInput.tsx
@@ -4,7 +4,7 @@ import { FieldRenderProps } from "react-final-form";
type Props = FieldRenderProps;
const CheckboxInput: React.FC = ({
- input: { value, ...input }
+ input: { value, ...input },
}: Props) => ;
export default CheckboxInput;
diff --git a/examples/strongly-typed-values-typescript/components/MultiCheckboxInput.tsx b/examples/strongly-typed-values-typescript/components/MultiCheckboxInput.tsx
index d1ee51ce..9683151d 100644
--- a/examples/strongly-typed-values-typescript/components/MultiCheckboxInput.tsx
+++ b/examples/strongly-typed-values-typescript/components/MultiCheckboxInput.tsx
@@ -4,7 +4,7 @@ import { FieldRenderProps } from "react-final-form";
type Props = FieldRenderProps;
const MultiCheckboxInput: React.FC = ({
- input: { value, ...input }
+ input: { value, ...input },
}: Props) => ;
export default MultiCheckboxInput;
diff --git a/examples/strongly-typed-values-typescript/index.tsx b/examples/strongly-typed-values-typescript/index.tsx
index 3b5f6e4f..2f8e4ea4 100644
--- a/examples/strongly-typed-values-typescript/index.tsx
+++ b/examples/strongly-typed-values-typescript/index.tsx
@@ -1,20 +1,20 @@
/* eslint-disable jsx-a11y/accessible-emoji */
-import React from 'react';
-import { render } from 'react-dom';
-import Styles from './Styles';
-import { Form, Field } from 'react-final-form';
-import CheckboxInput from './components/CheckboxInput';
-import RadioInput from './components/RadioInput';
-import TextInput from './components/TextInput';
-import NumberInput from './components/NumberInput';
-import TextAreaInput from './components/TextAreaInput';
-import SelectInput from './components/SelectInput';
-import MultiSelectInput from './components/MultiSelectInput';
-import MultiCheckboxInput from './components/MultiCheckboxInput';
+import React from "react";
+import { render } from "react-dom";
+import Styles from "./Styles";
+import { Form, Field } from "react-final-form";
+import CheckboxInput from "./components/CheckboxInput";
+import RadioInput from "./components/RadioInput";
+import TextInput from "./components/TextInput";
+import NumberInput from "./components/NumberInput";
+import TextAreaInput from "./components/TextAreaInput";
+import SelectInput from "./components/SelectInput";
+import MultiSelectInput from "./components/MultiSelectInput";
+import MultiCheckboxInput from "./components/MultiCheckboxInput";
-const sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));
+const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
-type Stooge = 'larry' | 'moe' | 'curly';
+type Stooge = "larry" | "moe" | "curly";
interface Values {
firstName?: string;
lastName?: string;
@@ -36,7 +36,7 @@ const App: React.FC = () => (
🏁
- {' '}
+ {" "}
React Final Form
Strongly Typed Values with TypeScript
@@ -50,7 +50,7 @@ const App: React.FC = () => (
(
@@ -114,7 +114,7 @@ const App: React.FC = () => (
component={MultiCheckboxInput}
type="checkbox"
value="ketchup"
- />{' '}
+ />{" "}
Ketchup
@@ -123,7 +123,7 @@ const App: React.FC = () => (
component="input"
type="checkbox"
value="mustard"
- />{' '}
+ />{" "}
Mustard
@@ -132,7 +132,7 @@ const App: React.FC = () => (
component="input"
type="checkbox"
value="mayonnaise"
- />{' '}
+ />{" "}
Mayonnaise
@@ -141,7 +141,7 @@ const App: React.FC = () => (
component="input"
type="checkbox"
value="guacamole"
- />{' '}
+ />{" "}
Guacamole 🥑
@@ -155,7 +155,7 @@ const App: React.FC = () => (
component={RadioInput}
type="radio"
value="larry"
- />{' '}
+ />{" "}
Larry
@@ -164,7 +164,7 @@ const App: React.FC = () => (
component={RadioInput}
type="radio"
value="moe"
- />{' '}
+ />{" "}
Moe
@@ -173,7 +173,7 @@ const App: React.FC = () => (
component={RadioInput}
type="radio"
value="curly"
- />{' '}
+ />{" "}
Curly
@@ -201,5 +201,5 @@ const App: React.FC = () => (
);
-const rootElement = document.getElementById('root');
+const rootElement = document.getElementById("root");
render( , rootElement);
diff --git a/examples/styling-with-smooth-ui/index.js b/examples/styling-with-smooth-ui/index.js
index 148d84ae..992f1c57 100644
--- a/examples/styling-with-smooth-ui/index.js
+++ b/examples/styling-with-smooth-ui/index.js
@@ -1,6 +1,6 @@
-import React from 'react'
-import { render } from 'react-dom'
-import { Form, Field } from 'react-final-form'
+import React from "react";
+import { render } from "react-dom";
+import { Form, Field } from "react-final-form";
import {
Box,
Button,
@@ -17,29 +17,28 @@ import {
Row,
Select,
Textarea,
- Typography
-} from 'smooth-ui'
+ Typography,
+} from "smooth-ui";
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
-const onSubmit = async values => {
- await sleep(300)
- window.alert(JSON.stringify(values, 0, 2))
-}
+const onSubmit = async (values) => {
+ await sleep(300);
+ window.alert(JSON.stringify(values, 0, 2));
+};
// ****************************************
//⬇️ THIS IS WHERE ALL THE MAGIC HAPPENS ⬇️
// ****************************************
-const adapt /* ⬅️ this is a HOC */ = Component => ({
- input,
- meta: { valid },
- ...rest
-}) =>
-const AdaptedInput = adapt(Input)
-const AdaptedCheckbox = adapt(Checkbox)
-const AdaptedRadio = adapt(Radio)
-const AdaptedSelect = adapt(Select)
-const AdaptedTextarea = adapt(Textarea)
+const adapt /* ⬅️ this is a HOC */ =
+ (Component) =>
+ ({ input, meta: { valid }, ...rest }) =>
+ ;
+const AdaptedInput = adapt(Input);
+const AdaptedCheckbox = adapt(Checkbox);
+const AdaptedRadio = adapt(Radio);
+const AdaptedSelect = adapt(Select);
+const AdaptedTextarea = adapt(Textarea);
const Error = ({ name }) => (
@@ -49,12 +48,12 @@ const Error = ({ name }) => (
) : null
}
-)
+);
// ****************************************
//⬆️ THIS IS WHERE ALL THE MAGIC HAPPENS ⬆️
// ****************************************
-const required = value => (value ? undefined : 'Required')
+const required = (value) => (value ? undefined : "Required");
const App = () => (
@@ -62,17 +61,17 @@ const App = () => (
🏁
- {' '}
+ {" "}
React Final Form
🍭
- {' '}
+ {" "}
Smooth-UI Example
- This example demonstrates how to use{' '}
+ This example demonstrates how to use{" "}
(
>
🍭
- {' '}
+ {" "}
Smooth-UI
- {' '}
+ {" "}
to make your forms look fabulous. All you really need is the
- higher-order component that adapts the{' '}
+ higher-order component that adapts the{" "}
🍭
- {' '}
- Smooth-UI form components to be compatible with{' '}
+ {" "}
+ Smooth-UI form components to be compatible with{" "}
🏁
- {' '}
+ {" "}
React Final Form.
(
@@ -138,9 +137,9 @@ const App = () => (
validate={required}
options={[
{},
- { value: '#ff0000', label: '❤️ Red' },
- { value: '#00ff00', label: '💚 Green' },
- { value: '#0000ff', label: '💙 Blue' }
+ { value: "#ff0000", label: "❤️ Red" },
+ { value: "#00ff00", label: "💚 Green" },
+ { value: "#0000ff", label: "💙 Blue" },
]}
control
/>
@@ -155,12 +154,12 @@ const App = () => (
multiple
arrow={false}
options={[
- { value: 'chicken', label: '🐓 Chicken' },
- { value: 'ham', label: '🐷 Ham' },
- { value: 'mushrooms', label: '🍄 Mushrooms' },
- { value: 'cheese', label: '🧀 Cheese' },
- { value: 'tuna', label: '🐟 Tuna' },
- { value: 'pineapple', label: '🍍 Pineapple' }
+ { value: "chicken", label: "🐓 Chicken" },
+ { value: "ham", label: "🐷 Ham" },
+ { value: "mushrooms", label: "🍄 Mushrooms" },
+ { value: "cheese", label: "🧀 Cheese" },
+ { value: "tuna", label: "🐟 Tuna" },
+ { value: "pineapple", label: "🍍 Pineapple" },
]}
control
/>
@@ -197,7 +196,7 @@ const App = () => (
value="guacamole"
/>
- Guacamole{' '}
+ Guacamole{" "}
🥑
@@ -270,10 +269,10 @@ const App = () => (
{JSON.stringify(values, 0, 2)}
@@ -284,6 +283,6 @@ const App = () => (
-)
+);
-render( , document.getElementById('root'))
+render( , document.getElementById("root"));
diff --git a/examples/submission-errors/Styles.js b/examples/submission-errors/Styles.js
index 68d1047e..060cf8ab 100644
--- a/examples/submission-errors/Styles.js
+++ b/examples/submission-errors/Styles.js
@@ -1,4 +1,4 @@
-import styled, { css } from 'styled-components'
+import styled, { css } from "styled-components";
const btn = (light, dark) => css`
white-space: nowrap;
@@ -25,13 +25,13 @@ const btn = (light, dark) => css`
opacity: 0.6;
cursor: not-allowed;
}
-`
+`;
const btnDefault = css`
- ${btn('#ffffff', '#d5d5d5')} color: #555;
-`
+ ${btn("#ffffff", "#d5d5d5")} color: #555;
+`;
-const btnPrimary = btn('#4f93ce', '#285f8f')
+const btnPrimary = btn("#4f93ce", "#285f8f");
export default styled.div`
font-family: sans-serif;
@@ -87,7 +87,7 @@ export default styled.div`
border: 1px solid #ccc;
border-radius: 3px;
}
- & > input[type='checkbox'] {
+ & > input[type="checkbox"] {
margin-top: 7px;
}
& > div {
@@ -114,10 +114,10 @@ export default styled.div`
}
button {
margin: 0 10px;
- &[type='submit'] {
+ &[type="submit"] {
${btnPrimary};
}
- &[type='button'] {
+ &[type="button"] {
${btnDefault};
}
}
@@ -135,4 +135,4 @@ export default styled.div`
padding: 20px;
}
}
-`
+`;
diff --git a/examples/submission-errors/index.js b/examples/submission-errors/index.js
index c91aef72..c2f2037a 100644
--- a/examples/submission-errors/index.js
+++ b/examples/submission-errors/index.js
@@ -1,21 +1,21 @@
-import React from 'react'
-import { render } from 'react-dom'
-import Styles from './Styles'
-import { Form, Field } from 'react-final-form'
-import { FORM_ERROR } from 'final-form'
+import React from "react";
+import { render } from "react-dom";
+import Styles from "./Styles";
+import { Form, Field } from "react-final-form";
+import { FORM_ERROR } from "final-form";
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
-const onSubmit = async values => {
- await sleep(300)
- if (values.username !== 'erikras') {
- return { username: 'Unknown username' }
+const onSubmit = async (values) => {
+ await sleep(300);
+ if (values.username !== "erikras") {
+ return { username: "Unknown username" };
}
- if (values.password !== 'finalformrocks') {
- return { [FORM_ERROR]: 'Login Failed' }
+ if (values.password !== "finalformrocks") {
+ return { [FORM_ERROR]: "Login Failed" };
}
- window.alert('LOGIN SUCCESS!')
-}
+ window.alert("LOGIN SUCCESS!");
+};
const App = () => (
@@ -29,20 +29,20 @@ const App = () => (
Read Docs
- Only successful credentials are erikras and{' '}
+ Only successful credentials are erikras and{" "}
finalformrocks.
{
- const errors = {}
+ validate={(values) => {
+ const errors = {};
if (!values.username) {
- errors.username = 'Required'
+ errors.username = "Required";
}
if (!values.password) {
- errors.password = 'Required'
+ errors.password = "Required";
}
- return errors
+ return errors;
}}
render={({
submitError,
@@ -50,7 +50,7 @@ const App = () => (
form,
submitting,
pristine,
- values
+ values,
}) => (
@@ -91,6 +91,6 @@ const App = () => (
)}
/>
-)
+);
-render( , document.getElementById('root'))
+render( , document.getElementById("root"));
diff --git a/examples/subscriptions/RenderCount.js b/examples/subscriptions/RenderCount.js
index 051e06c3..a783309d 100644
--- a/examples/subscriptions/RenderCount.js
+++ b/examples/subscriptions/RenderCount.js
@@ -1,13 +1,13 @@
-import React from 'react'
-import styled from 'styled-components'
+import React from "react";
+import styled from "styled-components";
export default function RenderCount() {
- const renders = React.useRef(0)
+ const renders = React.useRef(0);
- return {++renders.current}
+ return {++renders.current} ;
}
-const size = 30
+const size = 30;
const Circle = styled.i`
position: absolute;
top: 0;
@@ -20,4 +20,4 @@ const Circle = styled.i`
border-radius: ${size / 2}px;
border: 1px solid #ddd;
background: #eee;
-`
+`;
diff --git a/examples/subscriptions/Styles.js b/examples/subscriptions/Styles.js
index a14e5eaa..16dcd028 100644
--- a/examples/subscriptions/Styles.js
+++ b/examples/subscriptions/Styles.js
@@ -1,4 +1,4 @@
-import styled, { css } from 'styled-components'
+import styled, { css } from "styled-components";
const btn = (light, dark) => css`
white-space: nowrap;
@@ -25,13 +25,13 @@ const btn = (light, dark) => css`
opacity: 0.6;
cursor: not-allowed;
}
-`
+`;
const btnDefault = css`
- ${btn('#ffffff', '#d5d5d5')} color: #555;
-`
+ ${btn("#ffffff", "#d5d5d5")} color: #555;
+`;
-const btnPrimary = btn('#4f93ce', '#285f8f')
+const btnPrimary = btn("#4f93ce", "#285f8f");
export default styled.div`
font-family: sans-serif;
@@ -82,7 +82,7 @@ export default styled.div`
border: 1px solid #ccc;
border-radius: 3px;
}
- & > input[type='checkbox'] {
+ & > input[type="checkbox"] {
margin-top: 7px;
}
& > span {
@@ -109,10 +109,10 @@ export default styled.div`
}
button {
margin: 0 10px;
- &[type='submit'] {
+ &[type="submit"] {
${btnPrimary};
}
- &[type='button'] {
+ &[type="button"] {
${btnDefault};
}
}
@@ -124,4 +124,4 @@ export default styled.div`
padding: 20px;
}
}
-`
+`;
diff --git a/examples/subscriptions/index.js b/examples/subscriptions/index.js
index 9657afaf..8468bc6c 100644
--- a/examples/subscriptions/index.js
+++ b/examples/subscriptions/index.js
@@ -1,16 +1,16 @@
-import React from 'react'
-import { render } from 'react-dom'
-import Styles from './Styles'
-import { Form, Field, FormSpy } from 'react-final-form'
-import RenderCount from './RenderCount'
+import React from "react";
+import { render } from "react-dom";
+import Styles from "./Styles";
+import { Form, Field, FormSpy } from "react-final-form";
+import RenderCount from "./RenderCount";
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
-const onSubmit = async values => {
- await sleep(300)
- window.alert(JSON.stringify(values, 0, 2))
-}
-const required = value => (value ? undefined : 'Required')
+const onSubmit = async (values) => {
+ await sleep(300);
+ window.alert(JSON.stringify(values, 0, 2));
+};
+const required = (value) => (value ? undefined : "Required");
const App = () => (
@@ -36,7 +36,7 @@ const App = () => (
-)
+);
const MyForm = ({ subscription }) => (
(
{values ? (
-
- {JSON.stringify(values, 0, 2)}
+
+ {JSON.stringify(values, 0, 2)}
+
) : (
{({ values }) => (
-
+
{JSON.stringify(values, 0, 2)}
)}
@@ -94,6 +95,6 @@ const MyForm = ({ subscription }) => (
)}
/>
-)
+);
-render( , document.getElementById('root'))
+render( , document.getElementById("root"));
diff --git a/examples/third-party-components/Styles.js b/examples/third-party-components/Styles.js
index e41efd20..886ce8ad 100644
--- a/examples/third-party-components/Styles.js
+++ b/examples/third-party-components/Styles.js
@@ -1,4 +1,4 @@
-import styled, { css } from 'styled-components'
+import styled, { css } from "styled-components";
const btn = (light, dark) => css`
white-space: nowrap;
@@ -25,11 +25,13 @@ const btn = (light, dark) => css`
opacity: 0.6;
cursor: not-allowed;
}
-`
+`;
-const btnDefault = css`${btn('#ffffff', '#d5d5d5')} color: #555;`
+const btnDefault = css`
+ ${btn("#ffffff", "#d5d5d5")} color: #555;
+`;
-const btnPrimary = btn('#4f93ce', '#285f8f')
+const btnPrimary = btn("#4f93ce", "#285f8f");
export default styled.div`
font-family: sans-serif;
@@ -72,10 +74,10 @@ export default styled.div`
}
button {
margin: 0 10px;
- &[type='submit'] {
+ &[type="submit"] {
${btnPrimary};
}
- &[type='button'] {
+ &[type="button"] {
${btnDefault};
}
}
@@ -96,4 +98,4 @@ export default styled.div`
padding: 20px;
}
}
-`
+`;
diff --git a/examples/third-party-components/index.js b/examples/third-party-components/index.js
index 94539ac3..4b9c5591 100644
--- a/examples/third-party-components/index.js
+++ b/examples/third-party-components/index.js
@@ -1,22 +1,22 @@
-import React from 'react'
-import { render } from 'react-dom'
-import Styles from './Styles'
-import { Form, Field } from 'react-final-form'
-import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'
-import getMuiTheme from 'material-ui/styles/getMuiTheme'
-import TextField from 'material-ui/TextField'
-import Toggle from 'material-ui/Toggle'
-import Select from 'react-select'
-import states from './states'
+import React from "react";
+import { render } from "react-dom";
+import Styles from "./Styles";
+import { Form, Field } from "react-final-form";
+import MuiThemeProvider from "material-ui/styles/MuiThemeProvider";
+import getMuiTheme from "material-ui/styles/getMuiTheme";
+import TextField from "material-ui/TextField";
+import Toggle from "material-ui/Toggle";
+import Select from "react-select";
+import states from "./states";
const TextFieldAdapter = ({ input, meta, ...rest }) => (
input.onChange(value)}
- errorText={meta.touched ? meta.error : ''}
+ errorText={meta.touched ? meta.error : ""}
/>
-)
+);
const ToggleAdapter = ({ input: { onChange, value }, label, ...rest }) => (
(
onToggle={(event, isInputChecked) => onChange(isInputChecked)}
{...rest}
/>
-)
+);
const ReactSelectAdapter = ({ input, ...rest }) => (
-)
+);
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
-const onSubmit = async values => {
- await sleep(300)
- window.alert(JSON.stringify(values, 0, 2))
-}
-const required = value => (value ? undefined : 'Required')
+const onSubmit = async (values) => {
+ await sleep(300);
+ window.alert(JSON.stringify(values, 0, 2));
+};
+const required = (value) => (value ? undefined : "Required");
const App = () => (
@@ -45,7 +45,7 @@ const App = () => (
🏁
- {' '}
+ {" "}
React Final Form Example
Third Party Components
@@ -53,8 +53,8 @@ const App = () => (
Read Docs
(
/>
-)
+);
-render( , document.getElementById('root'))
+render( , document.getElementById("root"));
diff --git a/examples/third-party-components/states.js b/examples/third-party-components/states.js
index d8e84794..e2c7cbbc 100644
--- a/examples/third-party-components/states.js
+++ b/examples/third-party-components/states.js
@@ -1,65 +1,65 @@
const states = {
- AL: 'Alabama',
- AK: 'Alaska',
- AS: 'American Samoa',
- AZ: 'Arizona',
- AR: 'Arkansas',
- CA: 'California',
- CO: 'Colorado',
- CT: 'Connecticut',
- DE: 'Delaware',
- DC: 'District Of Columbia',
- FM: 'Federated States Of Micronesia',
- FL: 'Florida',
- GA: 'Georgia',
- GU: 'Guam',
- HI: 'Hawaii',
- ID: 'Idaho',
- IL: 'Illinois',
- IN: 'Indiana',
- IA: 'Iowa',
- KS: 'Kansas',
- KY: 'Kentucky',
- LA: 'Louisiana',
- ME: 'Maine',
- MH: 'Marshall Islands',
- MD: 'Maryland',
- MA: 'Massachusetts',
- MI: 'Michigan',
- MN: 'Minnesota',
- MS: 'Mississippi',
- MO: 'Missouri',
- MT: 'Montana',
- NE: 'Nebraska',
- NV: 'Nevada',
- NH: 'New Hampshire',
- NJ: 'New Jersey',
- NM: 'New Mexico',
- NY: 'New York',
- NC: 'North Carolina',
- ND: 'North Dakota',
- MP: 'Northern Mariana Islands',
- OH: 'Ohio',
- OK: 'Oklahoma',
- OR: 'Oregon',
- PW: 'Palau',
- PA: 'Pennsylvania',
- PR: 'Puerto Rico',
- RI: 'Rhode Island',
- SC: 'South Carolina',
- SD: 'South Dakota',
- TN: 'Tennessee',
- TX: 'Texas',
- UT: 'Utah',
- VT: 'Vermont',
- VI: 'Virgin Islands',
- VA: 'Virginia',
- WA: 'Washington',
- WV: 'West Virginia',
- WI: 'Wisconsin',
- WY: 'Wyoming'
-}
-export default Object.keys(states).map(value => ({
+ AL: "Alabama",
+ AK: "Alaska",
+ AS: "American Samoa",
+ AZ: "Arizona",
+ AR: "Arkansas",
+ CA: "California",
+ CO: "Colorado",
+ CT: "Connecticut",
+ DE: "Delaware",
+ DC: "District Of Columbia",
+ FM: "Federated States Of Micronesia",
+ FL: "Florida",
+ GA: "Georgia",
+ GU: "Guam",
+ HI: "Hawaii",
+ ID: "Idaho",
+ IL: "Illinois",
+ IN: "Indiana",
+ IA: "Iowa",
+ KS: "Kansas",
+ KY: "Kentucky",
+ LA: "Louisiana",
+ ME: "Maine",
+ MH: "Marshall Islands",
+ MD: "Maryland",
+ MA: "Massachusetts",
+ MI: "Michigan",
+ MN: "Minnesota",
+ MS: "Mississippi",
+ MO: "Missouri",
+ MT: "Montana",
+ NE: "Nebraska",
+ NV: "Nevada",
+ NH: "New Hampshire",
+ NJ: "New Jersey",
+ NM: "New Mexico",
+ NY: "New York",
+ NC: "North Carolina",
+ ND: "North Dakota",
+ MP: "Northern Mariana Islands",
+ OH: "Ohio",
+ OK: "Oklahoma",
+ OR: "Oregon",
+ PW: "Palau",
+ PA: "Pennsylvania",
+ PR: "Puerto Rico",
+ RI: "Rhode Island",
+ SC: "South Carolina",
+ SD: "South Dakota",
+ TN: "Tennessee",
+ TX: "Texas",
+ UT: "Utah",
+ VT: "Vermont",
+ VI: "Virgin Islands",
+ VA: "Virginia",
+ WA: "Washington",
+ WV: "West Virginia",
+ WI: "Wisconsin",
+ WY: "Wyoming",
+};
+export default Object.keys(states).map((value) => ({
value,
- label: states[value]
-}))
+ label: states[value],
+}));
diff --git a/examples/wizard/Styles.js b/examples/wizard/Styles.js
index 06a77f51..0b4ad747 100644
--- a/examples/wizard/Styles.js
+++ b/examples/wizard/Styles.js
@@ -1,4 +1,4 @@
-import styled, { css } from 'styled-components'
+import styled, { css } from "styled-components";
const btn = (light, dark) => css`
white-space: nowrap;
@@ -25,14 +25,14 @@ const btn = (light, dark) => css`
opacity: 0.6;
cursor: not-allowed;
}
-`
+`;
const btnDefault = css`
- ${btn('#ffffff', '#d5d5d5')} color: #555;
-`
+ ${btn("#ffffff", "#d5d5d5")} color: #555;
+`;
-const btnPrimary = btn('#4f93ce', '#285f8f')
-const btnDanger = btn('#e27c79', '#c9302c')
+const btnPrimary = btn("#4f93ce", "#285f8f");
+const btnDanger = btn("#e27c79", "#c9302c");
export default styled.div`
font-family: sans-serif;
@@ -79,7 +79,7 @@ export default styled.div`
text-align: center;
display: block;
position: absolute;
- background: url('https://media.giphy.com/media/130AxGoOaR6t0I/giphy.gif')
+ background: url("https://media.giphy.com/media/130AxGoOaR6t0I/giphy.gif")
center center;
background-size: fill;
font-size: 2em;
@@ -114,7 +114,7 @@ export default styled.div`
border: 1px solid #ccc;
border-radius: 3px;
}
- & > input[type='checkbox'] {
+ & > input[type="checkbox"] {
margin-top: 7px;
}
& > div {
@@ -160,11 +160,11 @@ export default styled.div`
}
button {
margin: 0 10px;
- &[type='submit'] {
+ &[type="submit"] {
${btnPrimary};
}
- &[type='button'] {
+ &[type="button"] {
${btnDefault};
}
}
-`
+`;
diff --git a/examples/wizard/Wizard.js b/examples/wizard/Wizard.js
index 10e085b3..72e3990f 100644
--- a/examples/wizard/Wizard.js
+++ b/examples/wizard/Wizard.js
@@ -1,30 +1,30 @@
-import React from 'react'
-import PropTypes from 'prop-types'
-import { Form } from 'react-final-form'
+import React from "react";
+import PropTypes from "prop-types";
+import { Form } from "react-final-form";
export default class Wizard extends React.Component {
static propTypes = {
- onSubmit: PropTypes.func.isRequired
- }
- static Page = ({ children }) => children
+ onSubmit: PropTypes.func.isRequired,
+ };
+ static Page = ({ children }) => children;
constructor(props) {
- super(props)
+ super(props);
this.state = {
page: 0,
- values: props.initialValues || {}
- }
+ values: props.initialValues || {},
+ };
}
- next = values =>
- this.setState(state => ({
+ next = (values) =>
+ this.setState((state) => ({
page: Math.min(state.page + 1, this.props.children.length - 1),
- values
- }))
+ values,
+ }));
previous = () =>
- this.setState(state => ({
- page: Math.max(state.page - 1, 0)
- }))
+ this.setState((state) => ({
+ page: Math.max(state.page - 1, 0),
+ }));
/**
* NOTE: Both validate and handleSubmit switching are implemented
@@ -32,29 +32,29 @@ export default class Wizard extends React.Component {
* functions once the form has been defined.
*/
- validate = values => {
+ validate = (values) => {
const activePage = React.Children.toArray(this.props.children)[
this.state.page
- ]
- return activePage.props.validate ? activePage.props.validate(values) : {}
- }
+ ];
+ return activePage.props.validate ? activePage.props.validate(values) : {};
+ };
- handleSubmit = values => {
- const { children, onSubmit } = this.props
- const { page } = this.state
- const isLastPage = page === React.Children.count(children) - 1
+ handleSubmit = (values) => {
+ const { children, onSubmit } = this.props;
+ const { page } = this.state;
+ const isLastPage = page === React.Children.count(children) - 1;
if (isLastPage) {
- return onSubmit(values)
+ return onSubmit(values);
} else {
- this.next(values)
+ this.next(values);
}
- }
+ };
render() {
- const { children } = this.props
- const { page, values } = this.state
- const activePage = React.Children.toArray(children)[page]
- const isLastPage = page === React.Children.count(children) - 1
+ const { children } = this.props;
+ const { page, values } = this.state;
+ const activePage = React.Children.toArray(children)[page];
+ const isLastPage = page === React.Children.count(children) - 1;
return (
)}
- )
+ );
}
}
diff --git a/examples/wizard/index.js b/examples/wizard/index.js
index efff5fdd..6312fe75 100644
--- a/examples/wizard/index.js
+++ b/examples/wizard/index.js
@@ -1,16 +1,16 @@
/* eslint-disable jsx-a11y/accessible-emoji */
-import React from 'react'
-import { render } from 'react-dom'
-import Styles from './Styles'
-import { Field } from 'react-final-form'
-import Wizard from './Wizard'
+import React from "react";
+import { render } from "react-dom";
+import Styles from "./Styles";
+import { Field } from "react-final-form";
+import Wizard from "./Wizard";
-const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
-const onSubmit = async values => {
- await sleep(300)
- window.alert(JSON.stringify(values, 0, 2))
-}
+const onSubmit = async (values) => {
+ await sleep(300);
+ window.alert(JSON.stringify(values, 0, 2));
+};
const Error = ({ name }) => (
(
touched && error ? {error} : null
}
/>
-)
+);
-const required = value => (value ? undefined : 'Required')
+const required = (value) => (value ? undefined : "Required");
const App = () => (
@@ -36,11 +36,11 @@ const App = () => (
Read Docs
- Notice the mixture of field-level and record-level (or page-level {' '}
+ Notice the mixture of field-level and record-level (or page-level {" "}
in this case) validation.
@@ -68,15 +68,15 @@ const App = () => (
{
- const errors = {}
+ validate={(values) => {
+ const errors = {};
if (!values.email) {
- errors.email = 'Required'
+ errors.email = "Required";
}
if (!values.favoriteColor) {
- errors.favoriteColor = 'Required'
+ errors.favoriteColor = "Required";
}
- return errors
+ return errors;
}}
>
@@ -101,14 +101,14 @@ const App = () => (
{
- const errors = {}
+ validate={(values) => {
+ const errors = {};
if (!values.toppings) {
- errors.toppings = 'Required'
+ errors.toppings = "Required";
} else if (values.toppings.length < 2) {
- errors.toppings = 'Choose more'
+ errors.toppings = "Choose more";
}
- return errors
+ return errors;
}}
>
@@ -128,12 +128,12 @@ const App = () => (
{
- const errors = {}
+ validate={(values) => {
+ const errors = {};
if (!values.notes) {
- errors.notes = 'Required'
+ errors.notes = "Required";
}
- return errors
+ return errors;
}}
>
@@ -145,11 +145,11 @@ const App = () => (
component="input"
type="radio"
value="larry"
- />{' '}
+ />{" "}
Larry
- {' '}
+ {" "}
Moe
@@ -158,7 +158,7 @@ const App = () => (
component="input"
type="radio"
value="curly"
- />{' '}
+ />{" "}
Curly
@@ -171,6 +171,6 @@ const App = () => (
-)
+);
-render( , document.getElementById('root'))
+render( , document.getElementById("root"));
diff --git a/package-scripts.js b/package-scripts.js
index a8fe31af..a61fc887 100644
--- a/package-scripts.js
+++ b/package-scripts.js
@@ -1,99 +1,103 @@
-const npsUtils = require('nps-utils')
+const npsUtils = require("nps-utils");
-const series = npsUtils.series
-const concurrent = npsUtils.concurrent
-const rimraf = npsUtils.rimraf
-const crossEnv = npsUtils.crossEnv
+const series = npsUtils.series;
+const concurrent = npsUtils.concurrent;
+const rimraf = npsUtils.rimraf;
+const crossEnv = npsUtils.crossEnv;
module.exports = {
scripts: {
test: {
- default: crossEnv('NODE_ENV=test jest --coverage'),
- update: crossEnv('NODE_ENV=test jest --coverage --updateSnapshot'),
- watch: crossEnv('NODE_ENV=test jest --watch'),
+ default: crossEnv("NODE_ENV=test jest --coverage"),
+ update: crossEnv("NODE_ENV=test jest --coverage --updateSnapshot"),
+ watch: crossEnv("NODE_ENV=test jest --watch"),
codeCov: crossEnv(
- 'cat ./coverage/lcov.info | ./node_modules/codecov.io/bin/codecov.io.js'
+ "cat ./coverage/lcov.info | ./node_modules/codecov.io/bin/codecov.io.js",
),
size: {
- description: 'check the size of the bundle',
- script: 'bundlesize'
- }
+ description: "check the size of the bundle",
+ script: "bundlesize",
+ },
},
build: {
- description: 'delete the dist directory and run all builds',
+ description: "delete the dist directory and run all builds",
default: series(
- rimraf('dist'),
+ rimraf("dist"),
concurrent.nps(
- 'build.es',
- 'build.cjs',
- 'build.umd.main',
- 'build.umd.min',
- 'copyTypes'
- )
+ "build.es",
+ "build.cjs",
+ "build.umd.main",
+ "build.umd.min",
+ "copyTypes",
+ ),
),
es: {
- description: 'run the build with rollup (uses rollup.config.js)',
- script: 'rollup --config --environment FORMAT:es'
+ description: "run the build with rollup (uses rollup.config.js)",
+ script: "rollup --config --environment FORMAT:es",
},
cjs: {
- description: 'run rollup build with CommonJS format',
- script: 'rollup --config --environment FORMAT:cjs'
+ description: "run rollup build with CommonJS format",
+ script: "rollup --config --environment FORMAT:cjs",
},
umd: {
min: {
- description: 'run the rollup build with sourcemaps',
- script: 'rollup --config --sourcemap --environment MINIFY,FORMAT:umd'
+ description: "run the rollup build with sourcemaps",
+ script: "rollup --config --sourcemap --environment MINIFY,FORMAT:umd",
},
main: {
- description: 'builds the cjs and umd files',
- script: 'rollup --config --sourcemap --environment FORMAT:umd'
- }
+ description: "builds the cjs and umd files",
+ script: "rollup --config --sourcemap --environment FORMAT:umd",
+ },
},
- andTest: series.nps('build', 'test.size')
+ andTest: series.nps("build", "test.size"),
},
copyTypes: series(
- npsUtils.copy('src/*.js.flow dist'),
+ npsUtils.copy("src/*.js.flow dist"),
npsUtils.copy(
- 'dist/index.js.flow dist --rename="react-final-form.cjs.js.flow"'
+ 'dist/index.js.flow dist --rename="react-final-form.cjs.js.flow"',
),
npsUtils.copy(
- 'dist/index.js.flow dist --rename="react-final-form.es.js.flow"'
- )
+ 'dist/index.js.flow dist --rename="react-final-form.es.js.flow"',
+ ),
),
docs: {
- description: 'Generates table of contents in README',
- script: 'doctoc README.md'
+ description: "Generates table of contents in README",
+ script: "doctoc README.md",
+ },
+ prettier: {
+ description: "Runs prettier on everything",
+ script: 'prettier --write "**/*.([jt]s*)"',
},
lint: {
- description: 'lint the entire project',
- script: 'eslint .'
+ description: "lint the entire project",
+ script: "eslint .",
},
flow: {
- description: 'flow check the entire project',
- script: 'flow check'
+ description: "flow check the entire project",
+ script: "flow check",
},
typescript: {
default: {
- description: 'typescript',
+ description: "typescript",
script:
- 'dtslint --localTs ./node_modules/typescript/lib --expectOnly ./typescript'
- }
+ "dtslint --localTs ./node_modules/typescript/lib --expectOnly ./typescript",
+ },
},
validate: {
description:
- 'This runs several scripts to make sure things look good before committing or on clean install',
+ "This runs several scripts to make sure things look good before committing or on clean install",
default: concurrent.nps(
- 'lint',
+ "lint",
// Flow has been causing headaches in this lib for years.
// Disabling now to ship some features. -@erikras, 2020-04-19
// 'flow',
- 'typescript',
- 'build.andTest',
- 'test'
- )
- }
+ "typescript",
+ "build.andTest",
+ "test",
+ ),
+ },
},
options: {
- silent: false
- }
-}
+ silent: false,
+ },
+};
diff --git a/rollup.config.js b/rollup.config.js
index 10cce73a..6183f630 100644
--- a/rollup.config.js
+++ b/rollup.config.js
@@ -1,83 +1,83 @@
-import resolve from 'rollup-plugin-node-resolve'
-import babel from 'rollup-plugin-babel'
-import commonjs from 'rollup-plugin-commonjs'
-import json from 'rollup-plugin-json'
-import { uglify } from 'rollup-plugin-uglify'
-import replace from 'rollup-plugin-replace'
-import pkg from './package.json'
+import resolve from "rollup-plugin-node-resolve";
+import babel from "rollup-plugin-babel";
+import commonjs from "rollup-plugin-commonjs";
+import json from "rollup-plugin-json";
+import { uglify } from "rollup-plugin-uglify";
+import replace from "rollup-plugin-replace";
+import pkg from "./package.json";
-const makeExternalPredicate = externalArr => {
+const makeExternalPredicate = (externalArr) => {
if (externalArr.length === 0) {
- return () => false
+ return () => false;
}
- const pattern = new RegExp(`^(${externalArr.join('|')})($|/)`)
- return id => pattern.test(id)
-}
+ const pattern = new RegExp(`^(${externalArr.join("|")})($|/)`);
+ return (id) => pattern.test(id);
+};
-const minify = process.env.MINIFY
-const format = process.env.FORMAT
-const es = format === 'es'
-const umd = format === 'umd'
-const cjs = format === 'cjs'
+const minify = process.env.MINIFY;
+const format = process.env.FORMAT;
+const es = format === "es";
+const umd = format === "umd";
+const cjs = format === "cjs";
-let output
+let output;
if (es) {
- output = { file: `dist/react-final-form.es.js`, format: 'es' }
+ output = { file: `dist/react-final-form.es.js`, format: "es" };
} else if (umd) {
if (minify) {
output = {
file: `dist/react-final-form.umd.min.js`,
- format: 'umd'
- }
+ format: "umd",
+ };
} else {
- output = { file: `dist/react-final-form.umd.js`, format: 'umd' }
+ output = { file: `dist/react-final-form.umd.js`, format: "umd" };
}
} else if (cjs) {
- output = { file: `dist/react-final-form.cjs.js`, format: 'cjs' }
+ output = { file: `dist/react-final-form.cjs.js`, format: "cjs" };
} else if (format) {
- throw new Error(`invalid format specified: "${format}".`)
+ throw new Error(`invalid format specified: "${format}".`);
} else {
- throw new Error('no format specified. --environment FORMAT:xxx')
+ throw new Error("no format specified. --environment FORMAT:xxx");
}
export default {
- input: 'src/index.js',
+ input: "src/index.js",
output: Object.assign(
{
- name: 'react-final-form',
- exports: 'named',
+ name: "react-final-form",
+ exports: "named",
globals: {
- react: 'React',
- 'final-form': 'FinalForm'
- }
+ react: "React",
+ "final-form": "FinalForm",
+ },
},
- output
+ output,
),
external: makeExternalPredicate(
umd
? Object.keys(pkg.peerDependencies || {})
: [
...Object.keys(pkg.dependencies || {}),
- ...Object.keys(pkg.peerDependencies || {})
- ]
+ ...Object.keys(pkg.peerDependencies || {}),
+ ],
),
plugins: [
- resolve({ mainFields: ['jsnext:main'] }),
+ resolve({ mainFields: ["jsnext:main"] }),
json(),
- commonjs({ include: 'node_modules/**' }),
+ commonjs({ include: "node_modules/**" }),
babel({
- exclude: 'node_modules/**',
- plugins: [['@babel/plugin-transform-runtime', { useESModules: !cjs }]],
- runtimeHelpers: true
+ exclude: "node_modules/**",
+ plugins: [["@babel/plugin-transform-runtime", { useESModules: !cjs }]],
+ runtimeHelpers: true,
}),
umd
? replace({
- 'process.env.NODE_ENV': JSON.stringify(
- minify ? 'production' : 'development'
- )
+ "process.env.NODE_ENV": JSON.stringify(
+ minify ? "production" : "development",
+ ),
})
: null,
- minify ? uglify() : null
- ].filter(Boolean)
-}
+ minify ? uglify() : null,
+ ].filter(Boolean),
+};
diff --git a/src/Field.js b/src/Field.js
index 2f46efe3..00937012 100644
--- a/src/Field.js
+++ b/src/Field.js
@@ -1,8 +1,8 @@
// @flow
-import * as React from 'react'
-import type { FieldProps as Props, FieldRenderProps } from './types'
-import renderComponent from './renderComponent'
-import useField from './useField'
+import * as React from "react";
+import type { FieldProps as Props, FieldRenderProps } from "./types";
+import renderComponent from "./renderComponent";
+import useField from "./useField";
const Field = React.forwardRef(function Field(
{
@@ -27,7 +27,7 @@ const Field = React.forwardRef(function Field(
value,
...rest
}: Props,
- ref
+ ref,
) {
const field: FieldRenderProps = useField(name, {
afterSubmit,
@@ -47,32 +47,32 @@ const Field = React.forwardRef(function Field(
type,
validate,
validateFields,
- value
- })
+ value,
+ });
- if (typeof children === 'function') {
- return (children: Function)({ ...field, ...rest })
+ if (typeof children === "function") {
+ return (children: Function)({ ...field, ...rest });
}
- if (typeof component === 'string') {
+ if (typeof component === "string") {
// ignore meta, combine input with any other props
return React.createElement(component, {
...field.input,
children,
ref,
- ...rest
- })
+ ...rest,
+ });
}
if (!name) {
- throw new Error('prop name cannot be undefined in component')
+ throw new Error("prop name cannot be undefined in component");
}
return renderComponent(
{ children, component, ref, ...rest },
field,
- `Field(${name})`
- )
-})
+ `Field(${name})`,
+ );
+});
-export default Field
+export default Field;
diff --git a/src/Field.test.js b/src/Field.test.js
index 1e62f154..afd08104 100644
--- a/src/Field.test.js
+++ b/src/Field.test.js
@@ -1,50 +1,50 @@
-import React from 'react'
-import { render, fireEvent, cleanup, act } from '@testing-library/react'
-import '@testing-library/jest-dom/extend-expect'
-import { ErrorBoundary, Toggle, wrapWith } from './testUtils'
-import Form from './ReactFinalForm'
-import Field from './Field'
+import React from "react";
+import { render, fireEvent, cleanup, act } from "@testing-library/react";
+import "@testing-library/jest-dom/extend-expect";
+import { ErrorBoundary, Toggle, wrapWith } from "./testUtils";
+import Form from "./ReactFinalForm";
+import Field from "./Field";
-const onSubmitMock = values => {}
+const onSubmitMock = (values) => {};
-const timeout = ms => new Promise(resolve => setTimeout(resolve, ms))
+const timeout = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
async function sleep(ms) {
await act(async () => {
- await timeout(ms)
- })
+ await timeout(ms);
+ });
}
-describe('Field', () => {
- afterEach(cleanup)
+describe("Field", () => {
+ afterEach(cleanup);
- it('should warn if not used inside a form', () => {
- jest.spyOn(console, 'error').mockImplementation(() => {})
- const errorSpy = jest.fn()
+ it("should warn if not used inside a form", () => {
+ jest.spyOn(console, "error").mockImplementation(() => {});
+ const errorSpy = jest.fn();
render(
-
- )
- expect(errorSpy).toHaveBeenCalled()
- expect(errorSpy).toHaveBeenCalledTimes(1)
+ ,
+ );
+ expect(errorSpy).toHaveBeenCalled();
+ expect(errorSpy).toHaveBeenCalledTimes(1);
expect(errorSpy.mock.calls[0][0].message).toBe(
- 'useField must be used inside of a component'
- )
- console.error.mockRestore()
- })
+ "useField must be used inside of a component",
+ );
+ console.error.mockRestore();
+ });
- it('should resubscribe if name changes', () => {
+ it("should resubscribe if name changes", () => {
const { getByTestId, getByText } = render(
- {isCat => (
+ {(isCat) => (
{({ handleSubmit }) => (
@@ -52,16 +52,16 @@ describe('Field', () => {
)}
)}
-
- )
- expect(getByTestId('name').value).toBe('Odie')
- fireEvent.click(getByText('Toggle'))
- expect(getByTestId('name').value).toBe('Garfield')
- fireEvent.click(getByText('Toggle'))
- expect(getByTestId('name').value).toBe('Odie')
- })
-
- it('should render via children render function', () => {
+ ,
+ );
+ expect(getByTestId("name").value).toBe("Odie");
+ fireEvent.click(getByText("Toggle"));
+ expect(getByTestId("name").value).toBe("Garfield");
+ fireEvent.click(getByText("Toggle"));
+ expect(getByTestId("name").value).toBe("Odie");
+ });
+
+ it("should render via children render function", () => {
const { getByTestId } = render(
{() => (
@@ -71,12 +71,12 @@ describe('Field', () => {
)}
-
- )
- expect(getByTestId('name')).toBeDefined()
- })
+ ,
+ );
+ expect(getByTestId("name")).toBeDefined();
+ });
- it('should render via render prop function', () => {
+ it("should render via render prop function", () => {
const { getByTestId } = render(
{() => (
@@ -87,12 +87,12 @@ describe('Field', () => {
/>
)}
-
- )
- expect(getByTestId('name')).toBeDefined()
- })
+ ,
+ );
+ expect(getByTestId("name")).toBeDefined();
+ });
- it('should include children when rendering via render prop function', () => {
+ it("should include children when rendering via render prop function", () => {
const { getByTestId } = render(
{() => (
@@ -117,22 +117,22 @@ describe('Field', () => {
)}
-
- )
- expect(getByTestId('color')).toBeDefined()
- expect(getByTestId('red')).toBeDefined()
- expect(getByTestId('green')).toBeDefined()
- expect(getByTestId('blue')).toBeDefined()
- })
-
- it('should unsubscribe on unmount', () => {
+ ,
+ );
+ expect(getByTestId("color")).toBeDefined();
+ expect(getByTestId("red")).toBeDefined();
+ expect(getByTestId("green")).toBeDefined();
+ expect(getByTestId("blue")).toBeDefined();
+ });
+
+ it("should unsubscribe on unmount", () => {
// This is mainly here for code coverage. 🧐
const { getByText } = render(
- {hidden => (
+ {(hidden) => (
{({ handleSubmit }) => (
@@ -143,13 +143,13 @@ describe('Field', () => {
)}
)}
-
- )
- fireEvent.click(getByText('Toggle'))
- })
+ ,
+ );
+ fireEvent.click(getByText("Toggle"));
+ });
- it('should focus, change, and blur', () => {
- const spy = jest.fn()
+ it("should focus, change, and blur", () => {
+ const spy = jest.fn();
const { getByTestId } = render(
{() => (
@@ -161,27 +161,27 @@ describe('Field', () => {
)}
-
- )
- expect(spy).toHaveBeenCalledTimes(1)
- expect(spy.mock.calls[0][0].meta.active).toBe(false)
- expect(spy.mock.calls[0][0].input.value).toBe('')
- fireEvent.focus(getByTestId('name'))
- expect(spy).toHaveBeenCalledTimes(2)
- expect(spy.mock.calls[1][0].meta.active).toBe(true)
- expect(spy.mock.calls[1][0].input.value).toBe('')
- fireEvent.change(getByTestId('name'), { target: { value: 'erikras' } })
- expect(spy).toHaveBeenCalledTimes(3)
- expect(spy.mock.calls[2][0].meta.active).toBe(true)
- expect(spy.mock.calls[2][0].input.value).toBe('erikras')
- fireEvent.blur(getByTestId('name'))
- expect(spy).toHaveBeenCalledTimes(4)
- expect(spy.mock.calls[3][0].meta.active).toBe(false)
- expect(spy.mock.calls[3][0].input.value).toBe('erikras')
- })
+ ,
+ );
+ expect(spy).toHaveBeenCalledTimes(1);
+ expect(spy.mock.calls[0][0].meta.active).toBe(false);
+ expect(spy.mock.calls[0][0].input.value).toBe("");
+ fireEvent.focus(getByTestId("name"));
+ expect(spy).toHaveBeenCalledTimes(2);
+ expect(spy.mock.calls[1][0].meta.active).toBe(true);
+ expect(spy.mock.calls[1][0].input.value).toBe("");
+ fireEvent.change(getByTestId("name"), { target: { value: "erikras" } });
+ expect(spy).toHaveBeenCalledTimes(3);
+ expect(spy.mock.calls[2][0].meta.active).toBe(true);
+ expect(spy.mock.calls[2][0].input.value).toBe("erikras");
+ fireEvent.blur(getByTestId("name"));
+ expect(spy).toHaveBeenCalledTimes(4);
+ expect(spy.mock.calls[3][0].meta.active).toBe(false);
+ expect(spy.mock.calls[3][0].input.value).toBe("erikras");
+ });
it("should convert '' to undefined on change", () => {
- const spy = jest.fn()
+ const spy = jest.fn();
const { getByTestId } = render(
{wrapWith(spy, () => (
@@ -189,51 +189,51 @@ describe('Field', () => {
))}
-
- )
- expect(spy).toHaveBeenCalled()
- expect(spy).toHaveBeenCalledTimes(1)
- expect(spy.mock.calls[0][0].values).toEqual({})
- fireEvent.change(getByTestId('name'), { target: { value: 'erikras' } })
- expect(spy).toHaveBeenCalledTimes(2)
- expect(spy.mock.calls[1][0].values).toEqual({ name: 'erikras' })
- fireEvent.change(getByTestId('name'), { target: { value: '' } })
- expect(spy).toHaveBeenCalledTimes(3)
- expect(spy.mock.calls[2][0].values).toEqual({})
- })
-
- it('should accept an identity parse prop to preserve empty strings', () => {
- const spy = jest.fn()
+ ,
+ );
+ expect(spy).toHaveBeenCalled();
+ expect(spy).toHaveBeenCalledTimes(1);
+ expect(spy.mock.calls[0][0].values).toEqual({});
+ fireEvent.change(getByTestId("name"), { target: { value: "erikras" } });
+ expect(spy).toHaveBeenCalledTimes(2);
+ expect(spy.mock.calls[1][0].values).toEqual({ name: "erikras" });
+ fireEvent.change(getByTestId("name"), { target: { value: "" } });
+ expect(spy).toHaveBeenCalledTimes(3);
+ expect(spy.mock.calls[2][0].values).toEqual({});
+ });
+
+ it("should accept an identity parse prop to preserve empty strings", () => {
+ const spy = jest.fn();
const { getByTestId } = render(
{wrapWith(spy, () => (
- v}>
+ v}>
{({ input: { value, ...props } }) => (
)}
))}
-
- )
- expect(spy).toHaveBeenCalled()
- expect(spy).toHaveBeenCalledTimes(1)
- expect(spy.mock.calls[0][0].values).toEqual({})
- fireEvent.change(getByTestId('name'), { target: { value: 'erikras' } })
- expect(spy).toHaveBeenCalledTimes(2)
- expect(spy.mock.calls[1][0].values).toEqual({ name: 'erikras' })
- fireEvent.change(getByTestId('name'), { target: { value: '' } })
- expect(spy).toHaveBeenCalledTimes(3)
- expect(spy.mock.calls[2][0].values).toEqual({ name: '' })
- })
-
- it('should accept a format function prop', () => {
- const spy = jest.fn()
+ ,
+ );
+ expect(spy).toHaveBeenCalled();
+ expect(spy).toHaveBeenCalledTimes(1);
+ expect(spy.mock.calls[0][0].values).toEqual({});
+ fireEvent.change(getByTestId("name"), { target: { value: "erikras" } });
+ expect(spy).toHaveBeenCalledTimes(2);
+ expect(spy.mock.calls[1][0].values).toEqual({ name: "erikras" });
+ fireEvent.change(getByTestId("name"), { target: { value: "" } });
+ expect(spy).toHaveBeenCalledTimes(3);
+ expect(spy.mock.calls[2][0].values).toEqual({ name: "" });
+ });
+
+ it("should accept a format function prop", () => {
+ const spy = jest.fn();
const { getByTestId } = render(
{wrapWith(spy, () => (
@@ -241,24 +241,24 @@ describe('Field', () => {
(value ? value.toUpperCase() : '')}
+ format={(value) => (value ? value.toUpperCase() : "")}
data-testid="name"
/>
))}
-
- )
- expect(spy).toHaveBeenCalled()
- expect(spy).toHaveBeenCalledTimes(1)
- expect(spy.mock.calls[0][0].values).toEqual({})
- fireEvent.change(getByTestId('name'), { target: { value: 'erikras' } })
- expect(spy).toHaveBeenCalledTimes(2)
- expect(spy.mock.calls[1][0].values).toEqual({ name: 'erikras' })
- expect(getByTestId('name').value).toBe('ERIKRAS')
- })
-
- it('should only format on blur if formatOnBlur is true', () => {
- const format = jest.fn(value => (value ? value.toUpperCase() : ''))
+ ,
+ );
+ expect(spy).toHaveBeenCalled();
+ expect(spy).toHaveBeenCalledTimes(1);
+ expect(spy.mock.calls[0][0].values).toEqual({});
+ fireEvent.change(getByTestId("name"), { target: { value: "erikras" } });
+ expect(spy).toHaveBeenCalledTimes(2);
+ expect(spy.mock.calls[1][0].values).toEqual({ name: "erikras" });
+ expect(getByTestId("name").value).toBe("ERIKRAS");
+ });
+
+ it("should only format on blur if formatOnBlur is true", () => {
+ const format = jest.fn((value) => (value ? value.toUpperCase() : ""));
const { getByTestId } = render(
{() => (
@@ -272,21 +272,21 @@ describe('Field', () => {
/>
)}
-
- )
- fireEvent.focus(getByTestId('name'))
- expect(getByTestId('name').value).toBe('')
- fireEvent.change(getByTestId('name'), { target: { value: 'erikras' } })
- expect(getByTestId('name').value).toBe('erikras')
- expect(format).not.toHaveBeenCalled()
- fireEvent.blur(getByTestId('name'))
- expect(format).toHaveBeenCalled()
- expect(format).toHaveBeenCalledTimes(1)
- expect(getByTestId('name').value).toBe('ERIKRAS')
- })
-
- it('should `formatOnBlur` most updated value', () => {
- const format = jest.fn(value => (value ? value.trim() : ''))
+ ,
+ );
+ fireEvent.focus(getByTestId("name"));
+ expect(getByTestId("name").value).toBe("");
+ fireEvent.change(getByTestId("name"), { target: { value: "erikras" } });
+ expect(getByTestId("name").value).toBe("erikras");
+ expect(format).not.toHaveBeenCalled();
+ fireEvent.blur(getByTestId("name"));
+ expect(format).toHaveBeenCalled();
+ expect(format).toHaveBeenCalledTimes(1);
+ expect(getByTestId("name").value).toBe("ERIKRAS");
+ });
+
+ it("should `formatOnBlur` most updated value", () => {
+ const format = jest.fn((value) => (value ? value.trim() : ""));
const { getByTestId } = render(
{() => (
@@ -296,79 +296,79 @@ describe('Field', () => {
{
+ onBlur={(e) => {
input.onChange(
- e.target.value && e.target.value.toUpperCase()
- )
- input.onBlur(e)
+ e.target.value && e.target.value.toUpperCase(),
+ );
+ input.onBlur(e);
}}
/>
)}
)}
-
- )
- const inputText = ' erikras'
- fireEvent.focus(getByTestId('name'))
- expect(getByTestId('name').value).toBe('')
- fireEvent.change(getByTestId('name'), { target: { value: inputText } })
- expect(getByTestId('name').value).toBe(inputText)
- fireEvent.blur(getByTestId('name'))
- expect(format.mock.calls[0][0]).toBe(inputText.toUpperCase())
- expect(getByTestId('name').value).toBe(inputText.trim().toUpperCase())
- })
-
- it('should not format value at all when formatOnBlur and render prop', () => {
- const format = jest.fn(value => (value ? value.toUpperCase() : ''))
+ ,
+ );
+ const inputText = " erikras";
+ fireEvent.focus(getByTestId("name"));
+ expect(getByTestId("name").value).toBe("");
+ fireEvent.change(getByTestId("name"), { target: { value: inputText } });
+ expect(getByTestId("name").value).toBe(inputText);
+ fireEvent.blur(getByTestId("name"));
+ expect(format.mock.calls[0][0]).toBe(inputText.toUpperCase());
+ expect(getByTestId("name").value).toBe(inputText.trim().toUpperCase());
+ });
+
+ it("should not format value at all when formatOnBlur and render prop", () => {
+ const format = jest.fn((value) => (value ? value.toUpperCase() : ""));
render(
{() => (
{({ input }) => {
- expect(input.value).toBeUndefined()
- expect(format).not.toHaveBeenCalled()
- return
+ expect(input.value).toBeUndefined();
+ expect(format).not.toHaveBeenCalled();
+ return ;
}}
)}
-
- )
- })
+ ,
+ );
+ });
- it('should accept an identity format prop to preserve undefined values', () => {
- const spy = jest.fn()
+ it("should accept an identity format prop to preserve undefined values", () => {
+ const spy = jest.fn();
const { getByTestId } = render(
{() => (
- v}>
+ v}>
{wrapWith(spy, ({ input: { value, ...props } }) => (
))}
)}
-
- )
- expect(spy).toHaveBeenCalled()
- expect(spy).toHaveBeenCalledTimes(1)
- expect(spy.mock.calls[0][0].input.value).toBeUndefined()
- fireEvent.change(getByTestId('name'), { target: { value: 'erikras' } })
- expect(spy).toHaveBeenCalledTimes(2)
- expect(spy.mock.calls[1][0].input.value).toBe('erikras')
- fireEvent.change(getByTestId('name'), { target: { value: '' } })
- expect(spy).toHaveBeenCalledTimes(3)
- expect(spy.mock.calls[2][0].input.value).toBeUndefined()
- })
-
- it('should provide a value of [] when empty on a select multiple', () => {
+ ,
+ );
+ expect(spy).toHaveBeenCalled();
+ expect(spy).toHaveBeenCalledTimes(1);
+ expect(spy.mock.calls[0][0].input.value).toBeUndefined();
+ fireEvent.change(getByTestId("name"), { target: { value: "erikras" } });
+ expect(spy).toHaveBeenCalledTimes(2);
+ expect(spy.mock.calls[1][0].input.value).toBe("erikras");
+ fireEvent.change(getByTestId("name"), { target: { value: "" } });
+ expect(spy).toHaveBeenCalledTimes(3);
+ expect(spy.mock.calls[2][0].input.value).toBeUndefined();
+ });
+
+ it("should provide a value of [] when empty on a select multiple", () => {
const { getByTestId } = render(
{() => (
@@ -376,16 +376,16 @@ describe('Field', () => {
)}
-
- )
+ ,
+ );
// This test is mostly for code coverage. Is there a way to assure that the value prop
// passed to the is []?
- expect(getByTestId('name').value).toBe('')
- })
+ expect(getByTestId("name").value).toBe("");
+ });
- it('should pass multiple through to custom components', () => {
- const CustomSelect = jest.fn(({ input }) => )
+ it("should pass multiple through to custom components", () => {
+ const CustomSelect = jest.fn(({ input }) => );
render(
{
)}
-
- )
+ ,
+ );
- expect(CustomSelect).toHaveBeenCalled()
- expect(CustomSelect).toHaveBeenCalledTimes(1)
- expect(CustomSelect.mock.calls[0][0].input.multiple).toBe(true)
- })
+ expect(CustomSelect).toHaveBeenCalled();
+ expect(CustomSelect).toHaveBeenCalledTimes(1);
+ expect(CustomSelect.mock.calls[0][0].input.multiple).toBe(true);
+ });
- it('should pass ref through to the input', () => {
- const ref = React.createRef()
+ it("should pass ref through to the input", () => {
+ const ref = React.createRef();
render(
{() => (
@@ -414,15 +414,15 @@ describe('Field', () => {
)}
-
- )
+ ,
+ );
- expect(ref.current).not.toBe(null)
- expect(ref.current instanceof HTMLInputElement).toBe(true)
- })
+ expect(ref.current).not.toBe(null);
+ expect(ref.current instanceof HTMLInputElement).toBe(true);
+ });
- it('should not pass an undefined type through to the input', () => {
- const MyInput = jest.fn(({ input }) => )
+ it("should not pass an undefined type through to the input", () => {
+ const MyInput = jest.fn(({ input }) => );
render(
{() => (
@@ -430,16 +430,16 @@ describe('Field', () => {
)}
-
- )
+ ,
+ );
- expect(MyInput).toHaveBeenCalled()
- expect(MyInput).toHaveBeenCalledTimes(1)
- expect(MyInput.mock.calls[0][0].input).not.toHaveProperty('type')
- })
+ expect(MyInput).toHaveBeenCalled();
+ expect(MyInput).toHaveBeenCalledTimes(1);
+ expect(MyInput.mock.calls[0][0].input).not.toHaveProperty("type");
+ });
- it('should optionally allow null values', () => {
- const spy = jest.fn()
+ it("should optionally allow null values", () => {
+ const spy = jest.fn();
const { getByTestId } = render(
{
{wrapWith(spy, ({ input: { value, ...props } }) => (
))}
)}
-
- )
- expect(spy).toHaveBeenCalled()
- expect(spy).toHaveBeenCalledTimes(1)
- expect(spy.mock.calls[0][0].input.value).toBe(null)
- fireEvent.change(getByTestId('name'), { target: { value: 'erikras' } })
- expect(spy).toHaveBeenCalledTimes(2)
- expect(spy.mock.calls[1][0].input.value).toBe('erikras')
+ ,
+ );
+ expect(spy).toHaveBeenCalled();
+ expect(spy).toHaveBeenCalledTimes(1);
+ expect(spy.mock.calls[0][0].input.value).toBe(null);
+ fireEvent.change(getByTestId("name"), { target: { value: "erikras" } });
+ expect(spy).toHaveBeenCalledTimes(2);
+ expect(spy.mock.calls[1][0].input.value).toBe("erikras");
act(() => {
- spy.mock.calls[1][0].input.onChange(null)
- })
- expect(spy).toHaveBeenCalledTimes(3)
- expect(spy.mock.calls[2][0].input.value).toBe(null)
- })
-
- it('should not allow null values when allowNull not true', () => {
- const spy = jest.fn()
+ spy.mock.calls[1][0].input.onChange(null);
+ });
+ expect(spy).toHaveBeenCalledTimes(3);
+ expect(spy.mock.calls[2][0].input.value).toBe(null);
+ });
+
+ it("should not allow null values when allowNull not true", () => {
+ const spy = jest.fn();
const { getByTestId } = render(
{
{wrapWith(spy, ({ input: { value, ...props } }) => (
))}
)}
-
- )
- expect(spy).toHaveBeenCalled()
- expect(spy).toHaveBeenCalledTimes(1)
- expect(spy.mock.calls[0][0].input.value).toBe('')
- fireEvent.change(getByTestId('name'), { target: { value: 'erikras' } })
- expect(spy).toHaveBeenCalledTimes(2)
- expect(spy.mock.calls[1][0].input.value).toBe('erikras')
+ ,
+ );
+ expect(spy).toHaveBeenCalled();
+ expect(spy).toHaveBeenCalledTimes(1);
+ expect(spy.mock.calls[0][0].input.value).toBe("");
+ fireEvent.change(getByTestId("name"), { target: { value: "erikras" } });
+ expect(spy).toHaveBeenCalledTimes(2);
+ expect(spy.mock.calls[1][0].input.value).toBe("erikras");
act(() => {
- spy.mock.calls[1][0].input.onChange(null)
- })
- expect(spy).toHaveBeenCalledTimes(3)
- expect(spy.mock.calls[2][0].input.value).toBe('')
- })
-
- it('should not let validate prop bleed through', () => {
- const spy = jest.fn()
+ spy.mock.calls[1][0].input.onChange(null);
+ });
+ expect(spy).toHaveBeenCalledTimes(3);
+ expect(spy.mock.calls[2][0].input.value).toBe("");
+ });
+
+ it("should not let validate prop bleed through", () => {
+ const spy = jest.fn();
render(
{() => (
@@ -523,15 +523,15 @@ describe('Field', () => {
)}
-
- )
- expect(spy).toHaveBeenCalled()
- expect(spy).toHaveBeenCalledTimes(1)
- expect(spy.mock.calls[0][0].validate).toBeUndefined()
- })
-
- it('should not let subscription prop bleed through', () => {
- const spy = jest.fn()
+ ,
+ );
+ expect(spy).toHaveBeenCalled();
+ expect(spy).toHaveBeenCalledTimes(1);
+ expect(spy.mock.calls[0][0].validate).toBeUndefined();
+ });
+
+ it("should not let subscription prop bleed through", () => {
+ const spy = jest.fn();
render(
{() => (
@@ -543,27 +543,27 @@ describe('Field', () => {
)}
-
- )
- expect(spy).toHaveBeenCalled()
- expect(spy).toHaveBeenCalledTimes(1)
- expect(spy.mock.calls[0][0].subscription).toBeUndefined()
- })
-
- it('should allow changing field-level validation function', () => {
- const simpleValidate = value => (value ? undefined : 'Required')
- const complexValidate = value => {
+ ,
+ );
+ expect(spy).toHaveBeenCalled();
+ expect(spy).toHaveBeenCalledTimes(1);
+ expect(spy.mock.calls[0][0].subscription).toBeUndefined();
+ });
+
+ it("should allow changing field-level validation function", () => {
+ const simpleValidate = (value) => (value ? undefined : "Required");
+ const complexValidate = (value) => {
if (value) {
if (value !== value.toUpperCase()) {
- return 'SHOULD BE UPPERCASE!'
+ return "SHOULD BE UPPERCASE!";
}
} else {
- return 'Required'
+ return "Required";
}
- }
+ };
const { getByTestId, getByText } = render(
- {useComplexValidation => (
+ {(useComplexValidation) => (
{({ handleSubmit }) => (
@@ -585,16 +585,16 @@ describe('Field', () => {
)}
)}
-
- )
- expect(getByTestId('error')).toHaveTextContent('Required')
- fireEvent.change(getByTestId('name'), { target: { value: 'erikras' } })
- expect(getByTestId('error')).toHaveTextContent('')
- fireEvent.click(getByText('Toggle'))
- expect(getByTestId('error')).toHaveTextContent('SHOULD BE UPPERCASE!')
- fireEvent.change(getByTestId('name'), { target: { value: 'ERIKRAS' } })
- expect(getByTestId('error')).toHaveTextContent('')
- })
+ ,
+ );
+ expect(getByTestId("error")).toHaveTextContent("Required");
+ fireEvent.change(getByTestId("name"), { target: { value: "erikras" } });
+ expect(getByTestId("error")).toHaveTextContent("");
+ fireEvent.click(getByText("Toggle"));
+ expect(getByTestId("error")).toHaveTextContent("SHOULD BE UPPERCASE!");
+ fireEvent.change(getByTestId("name"), { target: { value: "ERIKRAS" } });
+ expect(getByTestId("error")).toHaveTextContent("");
+ });
/**
* Allow me to explain this. If we allow field level validation functions
@@ -609,18 +609,18 @@ describe('Field', () => {
* from the newly unmounted Field, it would need to run validation on the entire
* form.
*/
- it('should ignore changes field-level validation function', () => {
- const createValidator = isRequired =>
- isRequired ? value => (value ? undefined : 'Required') : undefined
+ it("should ignore changes field-level validation function", () => {
+ const createValidator = (isRequired) =>
+ isRequired ? (value) => (value ? undefined : "Required") : undefined;
const Error = ({ name }) => (
{({ meta: { error } }) => {error}
}
- )
+ );
const { getByTestId, getByText } = render(
- {isRequired => (
+ {(isRequired) => (
{({ handleSubmit }) => (
@@ -641,23 +641,23 @@ describe('Field', () => {
)}
)}
-
- )
- expect(getByTestId('error')).toBeEmptyDOMElement()
- expect(getByTestId('error2')).toBeEmptyDOMElement()
- fireEvent.click(getByText('Toggle'))
- expect(getByTestId('error')).toHaveTextContent('Required')
- expect(getByTestId('error2')).toHaveTextContent('Required')
- fireEvent.click(getByText('Toggle'))
+ ,
+ );
+ expect(getByTestId("error")).toBeEmptyDOMElement();
+ expect(getByTestId("error2")).toBeEmptyDOMElement();
+ fireEvent.click(getByText("Toggle"));
+ expect(getByTestId("error")).toHaveTextContent("Required");
+ expect(getByTestId("error2")).toHaveTextContent("Required");
+ fireEvent.click(getByText("Toggle"));
// ERROR IS NOT CLEARED (see comment above)
- expect(getByTestId('error')).toHaveTextContent('Required')
- expect(getByTestId('error2')).toHaveTextContent('Required')
- })
+ expect(getByTestId("error")).toHaveTextContent("Required");
+ expect(getByTestId("error2")).toHaveTextContent("Required");
+ });
- it('should not rerender if validateFields is !== every time', () => {
+ it("should not rerender if validateFields is !== every time", () => {
// https://github.com/final-form/react-final-form/issues/502
- const required = value => (value ? undefined : 'Required')
- const spy = jest.fn()
+ const required = (value) => (value ? undefined : "Required");
+ const spy = jest.fn();
const { getByTestId } = render(
{({ handleSubmit }) => (
@@ -672,14 +672,14 @@ describe('Field', () => {
)}
-
- )
+ ,
+ );
// first render registered validation, second contains error
- expect(spy).toHaveBeenCalledTimes(2)
- expect(getByTestId('error')).toHaveTextContent('Required')
- })
+ expect(spy).toHaveBeenCalledTimes(2);
+ expect(getByTestId("error")).toHaveTextContent("Required");
+ });
- it('should pass along type prop', () => {
+ it("should pass along type prop", () => {
const { getByTestId } = render(
{({ handleSubmit }) => (
@@ -704,14 +704,14 @@ describe('Field', () => {
/>
)}
-
- )
- expect(getByTestId('checkbox').type).toBe('checkbox')
- expect(getByTestId('password').type).toBe('password')
- expect(getByTestId('radio').type).toBe('radio')
- })
-
- it('should render checkboxes with checked prop', () => {
+ ,
+ );
+ expect(getByTestId("checkbox").type).toBe("checkbox");
+ expect(getByTestId("password").type).toBe("password");
+ expect(getByTestId("radio").type).toBe("radio");
+ });
+
+ it("should render checkboxes with checked prop", () => {
const { getByTestId } = render(
{({ handleSubmit }) => (
@@ -724,17 +724,17 @@ describe('Field', () => {
/>
)}
-
- )
- expect(getByTestId('employed').type).toBe('checkbox')
- expect(getByTestId('employed').checked).toBe(false)
- fireEvent.change(getByTestId('employed'), { target: { checked: true } })
- expect(getByTestId('employed').checked).toBe(true)
- })
+ ,
+ );
+ expect(getByTestId("employed").type).toBe("checkbox");
+ expect(getByTestId("employed").checked).toBe(false);
+ fireEvent.change(getByTestId("employed"), { target: { checked: true } });
+ expect(getByTestId("employed").checked).toBe(true);
+ });
it('should render "array" checkboxes with checked prop when value is included in array', () => {
const { getByTestId } = render(
-
+
{({ handleSubmit }) => (
{
/>
)}
-
- )
- expect(getByTestId('red').checked).toBe(true)
- expect(getByTestId('green').checked).toBe(false)
- expect(getByTestId('blue').checked).toBe(true)
- })
+ ,
+ );
+ expect(getByTestId("red").checked).toBe(true);
+ expect(getByTestId("green").checked).toBe(false);
+ expect(getByTestId("blue").checked).toBe(true);
+ });
it('should render "array" custom checkboxes with checked prop when value is included in array', () => {
- const red = jest.fn()
- const green = jest.fn()
- const blue = jest.fn()
+ const red = jest.fn();
+ const green = jest.fn();
+ const blue = jest.fn();
render(
-
+
{({ handleSubmit }) => (
@@ -792,28 +792,28 @@ describe('Field', () => {
)}
-
- )
+ ,
+ );
// All forms without restricted subscriptions render twice at first because they
// need to update their validation and touched/modified/visited maps every time
// new fields are registered.
- expect(red).toHaveBeenCalled()
- expect(red).toHaveBeenCalledTimes(2)
- expect(red.mock.calls[0][0].input.checked).toBe(true)
- expect(red.mock.calls[1][0].input.checked).toBe(true)
- expect(green).toHaveBeenCalled()
- expect(green).toHaveBeenCalledTimes(2)
- expect(green.mock.calls[0][0].input.checked).toBe(false)
- expect(green.mock.calls[1][0].input.checked).toBe(false)
- expect(blue).toHaveBeenCalled()
- expect(blue).toHaveBeenCalledTimes(2)
- expect(blue.mock.calls[0][0].input.checked).toBe(true)
- expect(blue.mock.calls[1][0].input.checked).toBe(true)
- })
-
- it('should render radio buttons with checked prop', () => {
+ expect(red).toHaveBeenCalled();
+ expect(red).toHaveBeenCalledTimes(2);
+ expect(red.mock.calls[0][0].input.checked).toBe(true);
+ expect(red.mock.calls[1][0].input.checked).toBe(true);
+ expect(green).toHaveBeenCalled();
+ expect(green).toHaveBeenCalledTimes(2);
+ expect(green.mock.calls[0][0].input.checked).toBe(false);
+ expect(green.mock.calls[1][0].input.checked).toBe(false);
+ expect(blue).toHaveBeenCalled();
+ expect(blue).toHaveBeenCalledTimes(2);
+ expect(blue.mock.calls[0][0].input.checked).toBe(true);
+ expect(blue.mock.calls[1][0].input.checked).toBe(true);
+ });
+
+ it("should render radio buttons with checked prop", () => {
const { getByTestId } = render(
-
+
{({ handleSubmit }) => (
{
/>
)}
-
- )
- expect(getByTestId('red').type).toBe('radio')
- expect(getByTestId('red').checked).toBe(false)
- expect(getByTestId('green').type).toBe('radio')
- expect(getByTestId('green').checked).toBe(true)
- expect(getByTestId('blue').type).toBe('radio')
- expect(getByTestId('blue').checked).toBe(false)
- })
-
- it('should render custom radio component with checked prop', () => {
- const red = jest.fn()
- const green = jest.fn()
- const blue = jest.fn()
+ ,
+ );
+ expect(getByTestId("red").type).toBe("radio");
+ expect(getByTestId("red").checked).toBe(false);
+ expect(getByTestId("green").type).toBe("radio");
+ expect(getByTestId("green").checked).toBe(true);
+ expect(getByTestId("blue").type).toBe("radio");
+ expect(getByTestId("blue").checked).toBe(false);
+ });
+
+ it("should render custom radio component with checked prop", () => {
+ const red = jest.fn();
+ const green = jest.fn();
+ const blue = jest.fn();
render(
-
+
{({ handleSubmit }) => (
@@ -874,36 +874,36 @@ describe('Field', () => {
)}
-
- )
+ ,
+ );
// All forms without restricted subscriptions render twice at first because they
// need to update their validation and touched/modified/visited maps every time
// new fields are registered.
- expect(red).toHaveBeenCalled()
- expect(red).toHaveBeenCalledTimes(2)
- expect(red.mock.calls[0][0].input.checked).toBe(false)
- expect(red.mock.calls[1][0].input.checked).toBe(false)
- expect(green).toHaveBeenCalled()
- expect(green).toHaveBeenCalledTimes(2)
- expect(green.mock.calls[0][0].input.checked).toBe(true)
- expect(green.mock.calls[1][0].input.checked).toBe(true)
- expect(blue).toHaveBeenCalled()
- expect(blue).toHaveBeenCalledTimes(2)
- expect(blue.mock.calls[0][0].input.checked).toBe(false)
- expect(blue.mock.calls[1][0].input.checked).toBe(false)
- })
-
- it('should use isEqual to calculate dirty/pristine', () => {
- const isEqual = (a, b) => (a && a.toUpperCase()) === (b && b.toUpperCase())
+ expect(red).toHaveBeenCalled();
+ expect(red).toHaveBeenCalledTimes(2);
+ expect(red.mock.calls[0][0].input.checked).toBe(false);
+ expect(red.mock.calls[1][0].input.checked).toBe(false);
+ expect(green).toHaveBeenCalled();
+ expect(green).toHaveBeenCalledTimes(2);
+ expect(green.mock.calls[0][0].input.checked).toBe(true);
+ expect(green.mock.calls[1][0].input.checked).toBe(true);
+ expect(blue).toHaveBeenCalled();
+ expect(blue).toHaveBeenCalledTimes(2);
+ expect(blue.mock.calls[0][0].input.checked).toBe(false);
+ expect(blue.mock.calls[1][0].input.checked).toBe(false);
+ });
+
+ it("should use isEqual to calculate dirty/pristine", () => {
+ const isEqual = (a, b) => (a && a.toUpperCase()) === (b && b.toUpperCase());
const { getByTestId } = render(
-
+
{() => (
{({ input, meta }) => (
@@ -911,19 +911,19 @@ describe('Field', () => {
)}
-
- )
- expect(getByTestId('input').value).toBe('bob')
- expect(getByTestId('dirty')).toHaveTextContent('Pristine')
- fireEvent.change(getByTestId('input'), { target: { value: 'bobby' } })
- expect(getByTestId('dirty')).toHaveTextContent('Dirty')
- fireEvent.change(getByTestId('input'), { target: { value: 'BOB' } })
- expect(getByTestId('dirty')).toHaveTextContent('Pristine')
- })
-
- it('should be able to use inline isEqual to calculate dirty/pristine without falling into infinite rerender loop', () => {
+ ,
+ );
+ expect(getByTestId("input").value).toBe("bob");
+ expect(getByTestId("dirty")).toHaveTextContent("Pristine");
+ fireEvent.change(getByTestId("input"), { target: { value: "bobby" } });
+ expect(getByTestId("dirty")).toHaveTextContent("Dirty");
+ fireEvent.change(getByTestId("input"), { target: { value: "BOB" } });
+ expect(getByTestId("dirty")).toHaveTextContent("Pristine");
+ });
+
+ it("should be able to use inline isEqual to calculate dirty/pristine without falling into infinite rerender loop", () => {
const { getByTestId } = render(
-
+
{() => (
{
{({ input, meta }) => (
@@ -943,20 +943,20 @@ describe('Field', () => {
)}
-
- )
- expect(getByTestId('input').value).toBe('bob')
- expect(getByTestId('dirty')).toHaveTextContent('Pristine')
- fireEvent.change(getByTestId('input'), { target: { value: 'bobby' } })
- expect(getByTestId('dirty')).toHaveTextContent('Dirty')
- fireEvent.change(getByTestId('input'), { target: { value: 'BOB' } })
- expect(getByTestId('dirty')).toHaveTextContent('Pristine')
- })
-
- it('should only call each field-level validation once upon initial mount', () => {
- const fooValidate = jest.fn()
- const barValidate = jest.fn()
- const bazValidate = jest.fn()
+ ,
+ );
+ expect(getByTestId("input").value).toBe("bob");
+ expect(getByTestId("dirty")).toHaveTextContent("Pristine");
+ fireEvent.change(getByTestId("input"), { target: { value: "bobby" } });
+ expect(getByTestId("dirty")).toHaveTextContent("Dirty");
+ fireEvent.change(getByTestId("input"), { target: { value: "BOB" } });
+ expect(getByTestId("dirty")).toHaveTextContent("Pristine");
+ });
+
+ it("should only call each field-level validation once upon initial mount", () => {
+ const fooValidate = jest.fn();
+ const barValidate = jest.fn();
+ const bazValidate = jest.fn();
render(
{() => (
@@ -966,15 +966,15 @@ describe('Field', () => {
)}
-
- )
- expect(fooValidate).toHaveBeenCalledTimes(1)
- expect(barValidate).toHaveBeenCalledTimes(1)
- expect(bazValidate).toHaveBeenCalledTimes(1)
- })
-
- it('should warn when used without type prop and rendering radio, checkbox or multiple select indirectly', () => {
- const errorSpy = jest.spyOn(console, 'error').mockImplementation(() => {})
+ ,
+ );
+ expect(fooValidate).toHaveBeenCalledTimes(1);
+ expect(barValidate).toHaveBeenCalledTimes(1);
+ expect(bazValidate).toHaveBeenCalledTimes(1);
+ });
+
+ it("should warn when used without type prop and rendering radio, checkbox or multiple select indirectly", () => {
+ const errorSpy = jest.spyOn(console, "error").mockImplementation(() => {});
const { getByTestId } = render(
{() => (
@@ -992,7 +992,7 @@ describe('Field', () => {
{({ input }) => (
- {'Option'}
+ {"Option"}
)}
@@ -1002,48 +1002,48 @@ describe('Field', () => {
data-testid="selectMultipleWithoutRenderProp"
multiple
>
- {'Option'}
+ {"Option"}
)}
-
- )
-
- expect(errorSpy).not.toHaveBeenCalled()
- fireEvent.click(getByTestId('checkbox'), {
- target: { type: 'checkbox', checked: true }
- })
- expect(errorSpy).toHaveBeenCalledTimes(1)
+ ,
+ );
+
+ expect(errorSpy).not.toHaveBeenCalled();
+ fireEvent.click(getByTestId("checkbox"), {
+ target: { type: "checkbox", checked: true },
+ });
+ expect(errorSpy).toHaveBeenCalledTimes(1);
expect(errorSpy.mock.calls[0][0]).toBe(
'You must pass `type="checkbox"` prop to your Field(checkboxInput) component.\n' +
- 'Without it we don\'t know how to unpack your `value` prop - "checkboxValue".'
- )
- fireEvent.click(getByTestId('radio'), {
- target: { type: 'radio', value: 'radio value' }
- })
- expect(errorSpy).toHaveBeenCalledTimes(2)
+ 'Without it we don\'t know how to unpack your `value` prop - "checkboxValue".',
+ );
+ fireEvent.click(getByTestId("radio"), {
+ target: { type: "radio", value: "radio value" },
+ });
+ expect(errorSpy).toHaveBeenCalledTimes(2);
expect(errorSpy.mock.calls[1][0]).toBe(
'You must pass `type="radio"` prop to your Field(radioInput) component.\n' +
- 'Without it we don\'t know how to unpack your `value` prop - "radioValue".'
- )
- fireEvent.change(getByTestId('select'), {
- target: { value: ['some value'] }
- })
- expect(errorSpy).toHaveBeenCalledTimes(3)
+ 'Without it we don\'t know how to unpack your `value` prop - "radioValue".',
+ );
+ fireEvent.change(getByTestId("select"), {
+ target: { value: ["some value"] },
+ });
+ expect(errorSpy).toHaveBeenCalledTimes(3);
expect(errorSpy.mock.calls[2][0]).toBe(
'You must pass `type="select"` prop to your Field(selectMultipleInput) component.\n' +
- "Without it we don't know how to unpack your `value` prop - []."
- )
- fireEvent.change(getByTestId('selectMultipleWithoutRenderProp'), {
- target: { value: ['some value'] }
- })
+ "Without it we don't know how to unpack your `value` prop - [].",
+ );
+ fireEvent.change(getByTestId("selectMultipleWithoutRenderProp"), {
+ target: { value: ["some value"] },
+ });
// error not given, since we can deduce that it's a "select"
- expect(errorSpy).toHaveBeenCalledTimes(3)
- errorSpy.mockRestore()
- })
+ expect(errorSpy).toHaveBeenCalledTimes(3);
+ errorSpy.mockRestore();
+ });
- it('should formatOnBlur on submit', () => {
- const onSubmit = jest.fn()
+ it("should formatOnBlur on submit", () => {
+ const onSubmit = jest.fn();
const { getByTestId, getByText } = render(
{({ handleSubmit }) => (
@@ -1051,41 +1051,41 @@ describe('Field', () => {
value && value.toUpperCase()}
+ format={(value) => value && value.toUpperCase()}
formatOnBlur
data-testid="name"
/>
Submit
)}
-
- )
- expect(getByTestId('name').value).toBe('')
- fireEvent.focus(getByTestId('name'))
- fireEvent.change(getByTestId('name'), { target: { value: 'erik' } })
- expect(getByTestId('name').value).toBe('erik')
- fireEvent.blur(getByTestId('name'))
- expect(getByTestId('name').value).toBe('ERIK')
-
- fireEvent.focus(getByTestId('name'))
- fireEvent.change(getByTestId('name'), { target: { value: 'ERIKras' } })
- expect(getByTestId('name').value).toBe('ERIKras')
-
- expect(onSubmit).not.toHaveBeenCalled()
- fireEvent.click(getByText('Submit'))
- expect(onSubmit).toHaveBeenCalled()
- expect(onSubmit).toHaveBeenCalledTimes(1)
- expect(onSubmit.mock.calls[0][0]).toEqual({ name: 'ERIKRAS' })
+ ,
+ );
+ expect(getByTestId("name").value).toBe("");
+ fireEvent.focus(getByTestId("name"));
+ fireEvent.change(getByTestId("name"), { target: { value: "erik" } });
+ expect(getByTestId("name").value).toBe("erik");
+ fireEvent.blur(getByTestId("name"));
+ expect(getByTestId("name").value).toBe("ERIK");
+
+ fireEvent.focus(getByTestId("name"));
+ fireEvent.change(getByTestId("name"), { target: { value: "ERIKras" } });
+ expect(getByTestId("name").value).toBe("ERIKras");
+
+ expect(onSubmit).not.toHaveBeenCalled();
+ fireEvent.click(getByText("Submit"));
+ expect(onSubmit).toHaveBeenCalled();
+ expect(onSubmit).toHaveBeenCalledTimes(1);
+ expect(onSubmit.mock.calls[0][0]).toEqual({ name: "ERIKRAS" });
// submit again with no need for format
- fireEvent.click(getByText('Submit'))
- expect(onSubmit).toHaveBeenCalledTimes(2)
- expect(onSubmit.mock.calls[1][0]).toEqual({ name: 'ERIKRAS' })
- })
-
- it('should allow submission to be cancelled in beforeSubmit', () => {
- const onSubmit = jest.fn()
- const beforeSubmit = jest.fn(() => false)
+ fireEvent.click(getByText("Submit"));
+ expect(onSubmit).toHaveBeenCalledTimes(2);
+ expect(onSubmit.mock.calls[1][0]).toEqual({ name: "ERIKRAS" });
+ });
+
+ it("should allow submission to be cancelled in beforeSubmit", () => {
+ const onSubmit = jest.fn();
+ const beforeSubmit = jest.fn(() => false);
const { getByTestId, getByText } = render(
{({ handleSubmit }) => (
@@ -1099,20 +1099,20 @@ describe('Field', () => {
Submit
)}
-
- )
- expect(getByTestId('name').value).toBe('')
- fireEvent.focus(getByTestId('name'))
- fireEvent.change(getByTestId('name'), { target: { value: 'erik' } })
-
- expect(onSubmit).not.toHaveBeenCalled()
- expect(beforeSubmit).not.toHaveBeenCalled()
- fireEvent.click(getByText('Submit'))
- expect(onSubmit).not.toHaveBeenCalled()
- expect(beforeSubmit).toHaveBeenCalled()
- })
-
- it('update validating flag on async field-level validation', async () => {
+ ,
+ );
+ expect(getByTestId("name").value).toBe("");
+ fireEvent.focus(getByTestId("name"));
+ fireEvent.change(getByTestId("name"), { target: { value: "erik" } });
+
+ expect(onSubmit).not.toHaveBeenCalled();
+ expect(beforeSubmit).not.toHaveBeenCalled();
+ fireEvent.click(getByText("Submit"));
+ expect(onSubmit).not.toHaveBeenCalled();
+ expect(beforeSubmit).toHaveBeenCalled();
+ });
+
+ it("update validating flag on async field-level validation", async () => {
const { getByTestId } = render(
{({ handleSubmit }) => (
@@ -1120,52 +1120,52 @@ describe('Field', () => {
{
- await timeout(5)
- return value === 'erikras' ? 'Username taken' : undefined
+ validate={async (value) => {
+ await timeout(5);
+ return value === "erikras" ? "Username taken" : undefined;
}}
data-testid="name"
/>
{({ meta: { validating } }) => (
- {validating === true ? 'Spinner' : 'Not Validating'}
+ {validating === true ? "Spinner" : "Not Validating"}
)}
Submit
)}
-
- )
- expect(getByTestId('validating')).toHaveTextContent('Spinner')
+ ,
+ );
+ expect(getByTestId("validating")).toHaveTextContent("Spinner");
- await sleep(6)
+ await sleep(6);
- expect(getByTestId('name').value).toBe('')
- fireEvent.focus(getByTestId('name'))
- expect(getByTestId('validating')).toHaveTextContent('Not Validating')
+ expect(getByTestId("name").value).toBe("");
+ fireEvent.focus(getByTestId("name"));
+ expect(getByTestId("validating")).toHaveTextContent("Not Validating");
- fireEvent.change(getByTestId('name'), { target: { value: 'erik' } })
- expect(getByTestId('validating')).toHaveTextContent('Spinner')
+ fireEvent.change(getByTestId("name"), { target: { value: "erik" } });
+ expect(getByTestId("validating")).toHaveTextContent("Spinner");
- await sleep(6)
+ await sleep(6);
- expect(getByTestId('validating')).toHaveTextContent('Not Validating')
+ expect(getByTestId("validating")).toHaveTextContent("Not Validating");
- fireEvent.change(getByTestId('name'), { target: { value: 'erikras' } })
- expect(getByTestId('validating')).toHaveTextContent('Spinner')
+ fireEvent.change(getByTestId("name"), { target: { value: "erikras" } });
+ expect(getByTestId("validating")).toHaveTextContent("Spinner");
- await sleep(6)
+ await sleep(6);
- expect(getByTestId('validating')).toHaveTextContent('Not Validating')
- })
+ expect(getByTestId("validating")).toHaveTextContent("Not Validating");
+ });
- it('not call record-level validation on Field mount', () => {
- const validate = jest.fn()
+ it("not call record-level validation on Field mount", () => {
+ const validate = jest.fn();
const { getByText } = render(
- {showOtherFields => (
+ {(showOtherFields) => (
{({ handleSubmit }) => (
@@ -1187,26 +1187,26 @@ describe('Field', () => {
)}
)}
-
- )
- expect(validate).toHaveBeenCalledTimes(1)
- fireEvent.click(getByText('Toggle'))
- expect(validate).toHaveBeenCalledTimes(1)
- })
+ ,
+ );
+ expect(validate).toHaveBeenCalledTimes(1);
+ fireEvent.click(getByText("Toggle"));
+ expect(validate).toHaveBeenCalledTimes(1);
+ });
- it('submit should not throw when field with enabled `formatOnBlur` changes name `prop`', () => {
- const onSubmit = jest.fn()
+ it("submit should not throw when field with enabled `formatOnBlur` changes name `prop`", () => {
+ const onSubmit = jest.fn();
- const trim = value => value && value.trim()
+ const trim = (value) => value && value.trim();
const { getByTestId, getByText } = render(
{({ handleSubmit }) => (
- {newFieldName => (
+ {(newFieldName) => (
{
)}
)}
-
- )
-
- fireEvent.click(getByText('Toggle'))
- fireEvent.change(getByTestId('field'), {
- target: { value: 'trailing space ' }
- })
- fireEvent.click(getByText('Submit'))
- expect(onSubmit).toHaveBeenCalled()
- expect(onSubmit.mock.calls[0][0]).toEqual({ newName: 'trailing space' })
- })
-
- it('should throw an error if name prop is undefined', () => {
- jest.spyOn(console, 'error').mockImplementation(() => {})
-
- const errorSpy = jest.fn()
+ ,
+ );
+
+ fireEvent.click(getByText("Toggle"));
+ fireEvent.change(getByTestId("field"), {
+ target: { value: "trailing space " },
+ });
+ fireEvent.click(getByText("Submit"));
+ expect(onSubmit).toHaveBeenCalled();
+ expect(onSubmit.mock.calls[0][0]).toEqual({ newName: "trailing space" });
+ });
+
+ it("should throw an error if name prop is undefined", () => {
+ jest.spyOn(console, "error").mockImplementation(() => {});
+
+ const errorSpy = jest.fn();
render(
{() => } />}
-
- )
+ ,
+ );
- expect(errorSpy).toHaveBeenCalled()
- expect(errorSpy).toHaveBeenCalledTimes(1)
+ expect(errorSpy).toHaveBeenCalled();
+ expect(errorSpy).toHaveBeenCalledTimes(1);
expect(errorSpy.mock.calls[0][0].message).toBe(
- 'prop name cannot be undefined in component'
- )
- console.error.mockRestore()
- })
-})
+ "prop name cannot be undefined in component",
+ );
+ console.error.mockRestore();
+ });
+});
diff --git a/src/FormSpy.js b/src/FormSpy.js
index ca86f340..281b7d4e 100644
--- a/src/FormSpy.js
+++ b/src/FormSpy.js
@@ -1,43 +1,46 @@
// @flow
-import renderComponent from './renderComponent'
-import type { FormSpyPropsWithForm as Props, FormSpyRenderProps } from './types'
-import type { FormValuesShape } from 'final-form'
-import isSyntheticEvent from './isSyntheticEvent'
-import useForm from './useForm'
-import useFormState from './useFormState'
+import renderComponent from "./renderComponent";
+import type {
+ FormSpyPropsWithForm as Props,
+ FormSpyRenderProps,
+} from "./types";
+import type { FormValuesShape } from "final-form";
+import isSyntheticEvent from "./isSyntheticEvent";
+import useForm from "./useForm";
+import useFormState from "./useFormState";
function FormSpy({
onChange,
subscription,
...rest
}: Props) {
- const reactFinalForm = useForm('FormSpy')
- const state = useFormState({ onChange, subscription })
+ const reactFinalForm = useForm("FormSpy");
+ const state = useFormState({ onChange, subscription });
if (onChange) {
- return null
+ return null;
}
const renderProps: FormSpyRenderProps = {
form: {
...reactFinalForm,
- reset: eventOrValues => {
+ reset: (eventOrValues) => {
if (isSyntheticEvent(eventOrValues)) {
// it's a React SyntheticEvent, call reset with no arguments
- reactFinalForm.reset()
+ reactFinalForm.reset();
} else {
- reactFinalForm.reset(eventOrValues)
+ reactFinalForm.reset(eventOrValues);
}
- }
- }
- }
+ },
+ },
+ };
return renderComponent(
{
...rest,
- ...renderProps
+ ...renderProps,
},
state,
- 'FormSpy'
- )
+ "FormSpy",
+ );
}
-export default FormSpy
+export default FormSpy;
diff --git a/src/FormSpy.test.js b/src/FormSpy.test.js
index c48ea676..7a4f79ec 100644
--- a/src/FormSpy.test.js
+++ b/src/FormSpy.test.js
@@ -1,43 +1,43 @@
-import React from 'react'
-import { render, fireEvent, cleanup } from '@testing-library/react'
-import '@testing-library/jest-dom/extend-expect'
-import { ErrorBoundary, Toggle, wrapWith } from './testUtils'
-import Form from './ReactFinalForm'
-import Field from './Field'
-import FormSpy from './FormSpy'
+import React from "react";
+import { render, fireEvent, cleanup } from "@testing-library/react";
+import "@testing-library/jest-dom/extend-expect";
+import { ErrorBoundary, Toggle, wrapWith } from "./testUtils";
+import Form from "./ReactFinalForm";
+import Field from "./Field";
+import FormSpy from "./FormSpy";
-const onSubmitMock = values => {}
-const hasFormApi = props => {
- expect(props.form).toBeDefined()
- expect(typeof props.form.batch).toBe('function')
- expect(typeof props.form.blur).toBe('function')
- expect(typeof props.form.change).toBe('function')
- expect(typeof props.form.focus).toBe('function')
- expect(typeof props.form.initialize).toBe('function')
- expect(typeof props.form.reset).toBe('function')
-}
+const onSubmitMock = (values) => {};
+const hasFormApi = (props) => {
+ expect(props.form).toBeDefined();
+ expect(typeof props.form.batch).toBe("function");
+ expect(typeof props.form.blur).toBe("function");
+ expect(typeof props.form.change).toBe("function");
+ expect(typeof props.form.focus).toBe("function");
+ expect(typeof props.form.initialize).toBe("function");
+ expect(typeof props.form.reset).toBe("function");
+};
-describe('FormSpy', () => {
- afterEach(cleanup)
+describe("FormSpy", () => {
+ afterEach(cleanup);
- it('should warn if not used inside a form', () => {
- jest.spyOn(console, 'error').mockImplementation(() => {})
- const errorSpy = jest.fn()
+ it("should warn if not used inside a form", () => {
+ jest.spyOn(console, "error").mockImplementation(() => {});
+ const errorSpy = jest.fn();
render(
} />
-
- )
- expect(errorSpy).toHaveBeenCalled()
- expect(errorSpy).toHaveBeenCalledTimes(1)
+ ,
+ );
+ expect(errorSpy).toHaveBeenCalled();
+ expect(errorSpy).toHaveBeenCalledTimes(1);
expect(errorSpy.mock.calls[0][0].message).toBe(
- 'FormSpy must be used inside of a component'
- )
- console.error.mockRestore()
- })
+ "FormSpy must be used inside of a component",
+ );
+ console.error.mockRestore();
+ });
- it('should allow subscribing to everything', () => {
- const spy = jest.fn()
+ it("should allow subscribing to everything", () => {
+ const spy = jest.fn();
const { getByTestId } = render(
{() => (
@@ -50,63 +50,63 @@ describe('FormSpy', () => {
/>
)}
-
- )
- expect(spy).toHaveBeenCalled()
+ ,
+ );
+ expect(spy).toHaveBeenCalled();
// All forms without restricted subscriptions render twice at first because they
// need to update their validation and touched/modified/visited maps every time
// new fields are registered.
- expect(spy).toHaveBeenCalledTimes(2)
- hasFormApi(spy.mock.calls[0][0])
- expect(spy.mock.calls[0][0].dirty).toBe(false)
- expect(spy.mock.calls[0][0].errors).toEqual({})
- expect(spy.mock.calls[0][0].invalid).toBe(false)
- expect(spy.mock.calls[0][0].pristine).toBe(true)
- expect(spy.mock.calls[0][0].submitFailed).toBe(false)
- expect(spy.mock.calls[0][0].submitSucceeded).toBe(false)
- expect(spy.mock.calls[0][0].submitting).toBe(false)
- expect(spy.mock.calls[0][0].valid).toBe(true)
- expect(spy.mock.calls[0][0].validating).toBe(false)
- expect(spy.mock.calls[0][0].values).toEqual({})
- hasFormApi(spy.mock.calls[1][0])
- expect(spy.mock.calls[1][0].dirty).toBe(false)
- expect(spy.mock.calls[1][0].errors).toEqual({})
- expect(spy.mock.calls[1][0].invalid).toBe(false)
- expect(spy.mock.calls[1][0].pristine).toBe(true)
- expect(spy.mock.calls[1][0].submitFailed).toBe(false)
- expect(spy.mock.calls[1][0].submitSucceeded).toBe(false)
- expect(spy.mock.calls[1][0].submitting).toBe(false)
- expect(spy.mock.calls[1][0].valid).toBe(true)
- expect(spy.mock.calls[1][0].validating).toBe(false)
- expect(spy.mock.calls[1][0].values).toEqual({})
+ expect(spy).toHaveBeenCalledTimes(2);
+ hasFormApi(spy.mock.calls[0][0]);
+ expect(spy.mock.calls[0][0].dirty).toBe(false);
+ expect(spy.mock.calls[0][0].errors).toEqual({});
+ expect(spy.mock.calls[0][0].invalid).toBe(false);
+ expect(spy.mock.calls[0][0].pristine).toBe(true);
+ expect(spy.mock.calls[0][0].submitFailed).toBe(false);
+ expect(spy.mock.calls[0][0].submitSucceeded).toBe(false);
+ expect(spy.mock.calls[0][0].submitting).toBe(false);
+ expect(spy.mock.calls[0][0].valid).toBe(true);
+ expect(spy.mock.calls[0][0].validating).toBe(false);
+ expect(spy.mock.calls[0][0].values).toEqual({});
+ hasFormApi(spy.mock.calls[1][0]);
+ expect(spy.mock.calls[1][0].dirty).toBe(false);
+ expect(spy.mock.calls[1][0].errors).toEqual({});
+ expect(spy.mock.calls[1][0].invalid).toBe(false);
+ expect(spy.mock.calls[1][0].pristine).toBe(true);
+ expect(spy.mock.calls[1][0].submitFailed).toBe(false);
+ expect(spy.mock.calls[1][0].submitSucceeded).toBe(false);
+ expect(spy.mock.calls[1][0].submitting).toBe(false);
+ expect(spy.mock.calls[1][0].valid).toBe(true);
+ expect(spy.mock.calls[1][0].validating).toBe(false);
+ expect(spy.mock.calls[1][0].values).toEqual({});
// change value
- fireEvent.change(getByTestId('name'), { target: { value: 'erikras' } })
+ fireEvent.change(getByTestId("name"), { target: { value: "erikras" } });
- expect(spy).toHaveBeenCalledTimes(3)
- hasFormApi(spy.mock.calls[2][0])
- expect(spy.mock.calls[2][0].dirty).toBe(true)
- expect(spy.mock.calls[2][0].errors).toEqual({})
- expect(spy.mock.calls[2][0].invalid).toBe(false)
- expect(spy.mock.calls[2][0].pristine).toBe(false)
- expect(spy.mock.calls[2][0].submitFailed).toBe(false)
- expect(spy.mock.calls[2][0].submitSucceeded).toBe(false)
- expect(spy.mock.calls[2][0].submitting).toBe(false)
- expect(spy.mock.calls[2][0].valid).toBe(true)
- expect(spy.mock.calls[2][0].validating).toBe(false)
- expect(spy.mock.calls[2][0].values).toEqual({ name: 'erikras' })
- })
+ expect(spy).toHaveBeenCalledTimes(3);
+ hasFormApi(spy.mock.calls[2][0]);
+ expect(spy.mock.calls[2][0].dirty).toBe(true);
+ expect(spy.mock.calls[2][0].errors).toEqual({});
+ expect(spy.mock.calls[2][0].invalid).toBe(false);
+ expect(spy.mock.calls[2][0].pristine).toBe(false);
+ expect(spy.mock.calls[2][0].submitFailed).toBe(false);
+ expect(spy.mock.calls[2][0].submitSucceeded).toBe(false);
+ expect(spy.mock.calls[2][0].submitting).toBe(false);
+ expect(spy.mock.calls[2][0].valid).toBe(true);
+ expect(spy.mock.calls[2][0].validating).toBe(false);
+ expect(spy.mock.calls[2][0].values).toEqual({ name: "erikras" });
+ });
- it('should NOT resubscribe if subscription changes', () => {
- const firstSubscription = { values: true, pristine: true }
- const secondSubscription = { dirty: true, submitting: true }
- const spy = jest.fn()
+ it("should NOT resubscribe if subscription changes", () => {
+ const firstSubscription = { values: true, pristine: true };
+ const secondSubscription = { dirty: true, submitting: true };
+ const spy = jest.fn();
const { getByText } = render(
- {useAlternateSubscription => (
+ {(useAlternateSubscription) => (
{() => (
@@ -119,7 +119,7 @@ describe('FormSpy', () => {
: firstSubscription
}
>
- {wrapWith(spy, props => (
+ {wrapWith(spy, (props) => (
))}
@@ -127,121 +127,121 @@ describe('FormSpy', () => {
)}
)}
-
- )
- expect(spy).toHaveBeenCalled()
+ ,
+ );
+ expect(spy).toHaveBeenCalled();
// All forms without restricted subscriptions render twice at first because they
// need to update their validation and touched/modified/visited maps every time
// new fields are registered.
- expect(spy).toHaveBeenCalledTimes(2)
- hasFormApi(spy.mock.calls[0][0])
- expect(spy.mock.calls[0][0].dirty).toBeUndefined()
- expect(spy.mock.calls[0][0].errors).toBeUndefined()
- expect(spy.mock.calls[0][0].invalid).toBeUndefined()
- expect(spy.mock.calls[0][0].pristine).toBe(true)
- expect(spy.mock.calls[0][0].submitFailed).toBeUndefined()
- expect(spy.mock.calls[0][0].submitSucceeded).toBeUndefined()
- expect(spy.mock.calls[0][0].submitting).toBeUndefined()
- expect(spy.mock.calls[0][0].valid).toBeUndefined()
- expect(spy.mock.calls[0][0].validating).toBeUndefined()
+ expect(spy).toHaveBeenCalledTimes(2);
+ hasFormApi(spy.mock.calls[0][0]);
+ expect(spy.mock.calls[0][0].dirty).toBeUndefined();
+ expect(spy.mock.calls[0][0].errors).toBeUndefined();
+ expect(spy.mock.calls[0][0].invalid).toBeUndefined();
+ expect(spy.mock.calls[0][0].pristine).toBe(true);
+ expect(spy.mock.calls[0][0].submitFailed).toBeUndefined();
+ expect(spy.mock.calls[0][0].submitSucceeded).toBeUndefined();
+ expect(spy.mock.calls[0][0].submitting).toBeUndefined();
+ expect(spy.mock.calls[0][0].valid).toBeUndefined();
+ expect(spy.mock.calls[0][0].validating).toBeUndefined();
expect(spy.mock.calls[0][0].values).toEqual({
- dog: 'Odie',
- cat: 'Garfield'
- })
- hasFormApi(spy.mock.calls[1][0])
- expect(spy.mock.calls[1][0].dirty).toBeUndefined()
- expect(spy.mock.calls[1][0].errors).toBeUndefined()
- expect(spy.mock.calls[1][0].invalid).toBeUndefined()
- expect(spy.mock.calls[1][0].pristine).toBe(true)
- expect(spy.mock.calls[1][0].submitFailed).toBeUndefined()
- expect(spy.mock.calls[1][0].submitSucceeded).toBeUndefined()
- expect(spy.mock.calls[1][0].submitting).toBeUndefined()
- expect(spy.mock.calls[1][0].valid).toBeUndefined()
- expect(spy.mock.calls[1][0].validating).toBeUndefined()
+ dog: "Odie",
+ cat: "Garfield",
+ });
+ hasFormApi(spy.mock.calls[1][0]);
+ expect(spy.mock.calls[1][0].dirty).toBeUndefined();
+ expect(spy.mock.calls[1][0].errors).toBeUndefined();
+ expect(spy.mock.calls[1][0].invalid).toBeUndefined();
+ expect(spy.mock.calls[1][0].pristine).toBe(true);
+ expect(spy.mock.calls[1][0].submitFailed).toBeUndefined();
+ expect(spy.mock.calls[1][0].submitSucceeded).toBeUndefined();
+ expect(spy.mock.calls[1][0].submitting).toBeUndefined();
+ expect(spy.mock.calls[1][0].valid).toBeUndefined();
+ expect(spy.mock.calls[1][0].validating).toBeUndefined();
expect(spy.mock.calls[1][0].values).toEqual({
- dog: 'Odie',
- cat: 'Garfield'
- })
+ dog: "Odie",
+ cat: "Garfield",
+ });
- fireEvent.click(getByText('Toggle'))
+ fireEvent.click(getByText("Toggle"));
// one for new prop, and NOT again because no reregistering since v6
- expect(spy).toHaveBeenCalledTimes(3)
- })
+ expect(spy).toHaveBeenCalledTimes(3);
+ });
- it('should hear changes', () => {
- const spy = jest.fn()
+ it("should hear changes", () => {
+ const spy = jest.fn();
const { getByTestId } = render(
{() => (
- {wrapWith(spy, props => (
+ {wrapWith(spy, (props) => (
))}
)}
-
- )
- expect(spy).toHaveBeenCalled()
+ ,
+ );
+ expect(spy).toHaveBeenCalled();
// All forms without restricted subscriptions render twice at first because they
// need to update their validation and touched/modified/visited maps every time
// new fields are registered.
- expect(spy).toHaveBeenCalledTimes(2)
- hasFormApi(spy.mock.calls[0][0])
- expect(spy.mock.calls[0][0].dirty).toBe(false)
- expect(spy.mock.calls[0][0].errors).toBeUndefined()
- expect(spy.mock.calls[0][0].invalid).toBeUndefined()
- expect(spy.mock.calls[0][0].pristine).toBeUndefined()
- expect(spy.mock.calls[0][0].submitFailed).toBeUndefined()
- expect(spy.mock.calls[0][0].submitSucceeded).toBeUndefined()
- expect(spy.mock.calls[0][0].submitting).toBeUndefined()
- expect(spy.mock.calls[0][0].valid).toBeUndefined()
- expect(spy.mock.calls[0][0].validating).toBeUndefined()
- expect(spy.mock.calls[0][0].values).toEqual({})
- hasFormApi(spy.mock.calls[1][0])
- expect(spy.mock.calls[1][0].dirty).toBe(false)
- expect(spy.mock.calls[1][0].errors).toBeUndefined()
- expect(spy.mock.calls[1][0].invalid).toBeUndefined()
- expect(spy.mock.calls[1][0].pristine).toBeUndefined()
- expect(spy.mock.calls[1][0].submitFailed).toBeUndefined()
- expect(spy.mock.calls[1][0].submitSucceeded).toBeUndefined()
- expect(spy.mock.calls[1][0].submitting).toBeUndefined()
- expect(spy.mock.calls[1][0].valid).toBeUndefined()
- expect(spy.mock.calls[1][0].validating).toBeUndefined()
- expect(spy.mock.calls[1][0].values).toEqual({})
+ expect(spy).toHaveBeenCalledTimes(2);
+ hasFormApi(spy.mock.calls[0][0]);
+ expect(spy.mock.calls[0][0].dirty).toBe(false);
+ expect(spy.mock.calls[0][0].errors).toBeUndefined();
+ expect(spy.mock.calls[0][0].invalid).toBeUndefined();
+ expect(spy.mock.calls[0][0].pristine).toBeUndefined();
+ expect(spy.mock.calls[0][0].submitFailed).toBeUndefined();
+ expect(spy.mock.calls[0][0].submitSucceeded).toBeUndefined();
+ expect(spy.mock.calls[0][0].submitting).toBeUndefined();
+ expect(spy.mock.calls[0][0].valid).toBeUndefined();
+ expect(spy.mock.calls[0][0].validating).toBeUndefined();
+ expect(spy.mock.calls[0][0].values).toEqual({});
+ hasFormApi(spy.mock.calls[1][0]);
+ expect(spy.mock.calls[1][0].dirty).toBe(false);
+ expect(spy.mock.calls[1][0].errors).toBeUndefined();
+ expect(spy.mock.calls[1][0].invalid).toBeUndefined();
+ expect(spy.mock.calls[1][0].pristine).toBeUndefined();
+ expect(spy.mock.calls[1][0].submitFailed).toBeUndefined();
+ expect(spy.mock.calls[1][0].submitSucceeded).toBeUndefined();
+ expect(spy.mock.calls[1][0].submitting).toBeUndefined();
+ expect(spy.mock.calls[1][0].valid).toBeUndefined();
+ expect(spy.mock.calls[1][0].validating).toBeUndefined();
+ expect(spy.mock.calls[1][0].values).toEqual({});
- fireEvent.change(getByTestId('name'), { target: { value: 'erikras' } })
+ fireEvent.change(getByTestId("name"), { target: { value: "erikras" } });
- expect(spy).toHaveBeenCalledTimes(3)
- hasFormApi(spy.mock.calls[2][0])
- expect(spy.mock.calls[2][0].dirty).toBe(true)
- expect(spy.mock.calls[2][0].errors).toBeUndefined()
- expect(spy.mock.calls[2][0].invalid).toBeUndefined()
- expect(spy.mock.calls[2][0].pristine).toBeUndefined()
- expect(spy.mock.calls[2][0].submitFailed).toBeUndefined()
- expect(spy.mock.calls[2][0].submitSucceeded).toBeUndefined()
- expect(spy.mock.calls[2][0].submitting).toBeUndefined()
- expect(spy.mock.calls[2][0].valid).toBeUndefined()
- expect(spy.mock.calls[2][0].validating).toBeUndefined()
- expect(spy.mock.calls[2][0].values).toEqual({ name: 'erikras' })
- })
+ expect(spy).toHaveBeenCalledTimes(3);
+ hasFormApi(spy.mock.calls[2][0]);
+ expect(spy.mock.calls[2][0].dirty).toBe(true);
+ expect(spy.mock.calls[2][0].errors).toBeUndefined();
+ expect(spy.mock.calls[2][0].invalid).toBeUndefined();
+ expect(spy.mock.calls[2][0].pristine).toBeUndefined();
+ expect(spy.mock.calls[2][0].submitFailed).toBeUndefined();
+ expect(spy.mock.calls[2][0].submitSucceeded).toBeUndefined();
+ expect(spy.mock.calls[2][0].submitting).toBeUndefined();
+ expect(spy.mock.calls[2][0].valid).toBeUndefined();
+ expect(spy.mock.calls[2][0].validating).toBeUndefined();
+ expect(spy.mock.calls[2][0].values).toEqual({ name: "erikras" });
+ });
- it('should unsubscribe on unmount', () => {
+ it("should unsubscribe on unmount", () => {
// This is mainly here for code coverage. 🧐
- const spy = jest.fn()
+ const spy = jest.fn();
const { getByText } = render(
- {hidden => (
+ {(hidden) => (
{() => (
{!hidden && (
- {wrapWith(spy, props => (
+ {wrapWith(spy, (props) => (
))}
@@ -250,19 +250,19 @@ describe('FormSpy', () => {
)}
)}
-
- )
- expect(spy).toHaveBeenCalled()
+ ,
+ );
+ expect(spy).toHaveBeenCalled();
// All forms without restricted subscriptions render twice at first because they
// need to update their validation and touched/modified/visited maps every time
// new fields are registered.
- expect(spy).toHaveBeenCalledTimes(2)
- fireEvent.click(getByText('Toggle'))
- expect(spy).toHaveBeenCalledTimes(2)
- })
+ expect(spy).toHaveBeenCalledTimes(2);
+ fireEvent.click(getByText("Toggle"));
+ expect(spy).toHaveBeenCalledTimes(2);
+ });
- it('should call onChange', () => {
- const spy = jest.fn()
+ it("should call onChange", () => {
+ const spy = jest.fn();
const { getByTestId } = render(
{() => (
@@ -274,30 +274,30 @@ describe('FormSpy', () => {
/>
)}
-
- )
- expect(spy).toHaveBeenCalled()
- expect(spy).toHaveBeenCalledTimes(1)
- expect(spy.mock.calls[0][0].dirty).toBe(false)
- expect(spy.mock.calls[0][0].errors).toBeUndefined()
- expect(spy.mock.calls[0][0].invalid).toBeUndefined()
- expect(spy.mock.calls[0][0].pristine).toBeUndefined()
- expect(spy.mock.calls[0][0].submitFailed).toBeUndefined()
- expect(spy.mock.calls[0][0].submitSucceeded).toBeUndefined()
- expect(spy.mock.calls[0][0].submitting).toBeUndefined()
- expect(spy.mock.calls[0][0].valid).toBeUndefined()
- expect(spy.mock.calls[0][0].validating).toBeUndefined()
- expect(spy.mock.calls[0][0].values).toEqual({})
+ ,
+ );
+ expect(spy).toHaveBeenCalled();
+ expect(spy).toHaveBeenCalledTimes(1);
+ expect(spy.mock.calls[0][0].dirty).toBe(false);
+ expect(spy.mock.calls[0][0].errors).toBeUndefined();
+ expect(spy.mock.calls[0][0].invalid).toBeUndefined();
+ expect(spy.mock.calls[0][0].pristine).toBeUndefined();
+ expect(spy.mock.calls[0][0].submitFailed).toBeUndefined();
+ expect(spy.mock.calls[0][0].submitSucceeded).toBeUndefined();
+ expect(spy.mock.calls[0][0].submitting).toBeUndefined();
+ expect(spy.mock.calls[0][0].valid).toBeUndefined();
+ expect(spy.mock.calls[0][0].validating).toBeUndefined();
+ expect(spy.mock.calls[0][0].values).toEqual({});
- fireEvent.change(getByTestId('name'), { target: { value: 'erikras' } })
+ fireEvent.change(getByTestId("name"), { target: { value: "erikras" } });
- expect(spy).toHaveBeenCalledTimes(2)
- expect(spy.mock.calls[1][0].dirty).toBe(true)
- expect(spy.mock.calls[1][0].values).toEqual({ name: 'erikras' })
- })
+ expect(spy).toHaveBeenCalledTimes(2);
+ expect(spy.mock.calls[1][0].dirty).toBe(true);
+ expect(spy.mock.calls[1][0].values).toEqual({ name: "erikras" });
+ });
- it('should not rerender when onChange changes, but SHOULD use latest onChange passed', () => {
- const spy = jest.fn()
+ it("should not rerender when onChange changes, but SHOULD use latest onChange passed", () => {
+ const spy = jest.fn();
const { getByTestId } = render(
{({ values }) => (
@@ -305,34 +305,34 @@ describe('FormSpy', () => {
{
- spy(values.name, formState.values.name)
+ onChange={(formState) => {
+ spy(values.name, formState.values.name);
}}
/>
)}
-
- )
- expect(spy).toHaveBeenCalled()
- expect(spy).toHaveBeenCalledTimes(1)
- expect(spy.mock.calls[0]).toEqual([undefined, undefined])
+ ,
+ );
+ expect(spy).toHaveBeenCalled();
+ expect(spy).toHaveBeenCalledTimes(1);
+ expect(spy.mock.calls[0]).toEqual([undefined, undefined]);
- fireEvent.change(getByTestId('name'), { target: { value: 'erikras' } })
+ fireEvent.change(getByTestId("name"), { target: { value: "erikras" } });
- expect(spy).toHaveBeenCalledTimes(2)
- expect(spy.mock.calls[1]).toEqual([undefined, 'erikras'])
+ expect(spy).toHaveBeenCalledTimes(2);
+ expect(spy.mock.calls[1]).toEqual([undefined, "erikras"]);
- fireEvent.change(getByTestId('name'), {
- target: { value: 'erikras rulez' }
- })
+ fireEvent.change(getByTestId("name"), {
+ target: { value: "erikras rulez" },
+ });
- expect(spy).toHaveBeenCalledTimes(3)
- expect(spy.mock.calls[2]).toEqual(['erikras', 'erikras rulez'])
- })
+ expect(spy).toHaveBeenCalledTimes(3);
+ expect(spy.mock.calls[2]).toEqual(["erikras", "erikras rulez"]);
+ });
- it('should not render with render prop when given onChange', () => {
- const spy = jest.fn()
- const renderSpy = jest.fn()
+ it("should not render with render prop when given onChange", () => {
+ const spy = jest.fn();
+ const renderSpy = jest.fn();
render(
{() => (
@@ -345,19 +345,19 @@ describe('FormSpy', () => {
/>
)}
-
- )
- expect(spy).toHaveBeenCalled()
- expect(spy).toHaveBeenCalledTimes(1)
- expect(renderSpy).not.toHaveBeenCalled()
- })
+ ,
+ );
+ expect(spy).toHaveBeenCalled();
+ expect(spy).toHaveBeenCalledTimes(1);
+ expect(renderSpy).not.toHaveBeenCalled();
+ });
- it('should ignore SyntheticEvents on form reset ', () => {
+ it("should ignore SyntheticEvents on form reset ", () => {
const { getByTestId, getByText } = render(
{() => (
@@ -371,23 +371,23 @@ describe('FormSpy', () => {
)}
-
- )
- expect(getByTestId('name').value).toBe('erikras')
- fireEvent.change(getByTestId('name'), {
- target: { value: 'erikrasmussen' }
- })
- expect(getByTestId('name').value).toBe('erikrasmussen')
- fireEvent.click(getByText('Reset'))
- expect(getByTestId('name').value).toBe('erikras')
- })
+ ,
+ );
+ expect(getByTestId("name").value).toBe("erikras");
+ fireEvent.change(getByTestId("name"), {
+ target: { value: "erikrasmussen" },
+ });
+ expect(getByTestId("name").value).toBe("erikrasmussen");
+ fireEvent.click(getByText("Reset"));
+ expect(getByTestId("name").value).toBe("erikras");
+ });
- it('should accept new initial values on form reset ', () => {
+ it("should accept new initial values on form reset ", () => {
const { getByTestId, getByText } = render(
{() => (
@@ -396,7 +396,7 @@ describe('FormSpy', () => {
{({ form }) => (
form.reset({ name: 'bob' })}
+ onClick={() => form.reset({ name: "bob" })}
>
Reset
@@ -404,14 +404,14 @@ describe('FormSpy', () => {
)}
-
- )
- expect(getByTestId('name').value).toBe('erikras')
- fireEvent.change(getByTestId('name'), {
- target: { value: 'erikrasmussen' }
- })
- expect(getByTestId('name').value).toBe('erikrasmussen')
- fireEvent.click(getByText('Reset'))
- expect(getByTestId('name').value).toBe('bob')
- })
-})
+ ,
+ );
+ expect(getByTestId("name").value).toBe("erikras");
+ fireEvent.change(getByTestId("name"), {
+ target: { value: "erikrasmussen" },
+ });
+ expect(getByTestId("name").value).toBe("erikrasmussen");
+ fireEvent.click(getByText("Reset"));
+ expect(getByTestId("name").value).toBe("bob");
+ });
+});
diff --git a/src/ReactFinalForm.js b/src/ReactFinalForm.js
index 2efdf31e..7c881be6 100644
--- a/src/ReactFinalForm.js
+++ b/src/ReactFinalForm.js
@@ -1,44 +1,44 @@
// @flow
-import * as React from 'react'
+import * as React from "react";
import {
createForm,
formSubscriptionItems,
- version as ffVersion
-} from 'final-form'
+ version as ffVersion,
+} from "final-form";
import type {
FormApi,
Config,
FormSubscription,
FormState,
FormValuesShape,
- Unsubscribe
-} from 'final-form'
-import type { FormProps as Props, SubmitEvent } from './types'
-import renderComponent from './renderComponent'
-import useWhenValueChanges from './useWhenValueChanges'
-import useConstant from './useConstant'
-import shallowEqual from './shallowEqual'
-import isSyntheticEvent from './isSyntheticEvent'
-import type { FormRenderProps } from './types.js.flow'
-import ReactFinalFormContext from './context'
-import useLatest from './useLatest'
-import { version } from '../package.json'
-import { addLazyFormState } from './getters'
+ Unsubscribe,
+} from "final-form";
+import type { FormProps as Props, SubmitEvent } from "./types";
+import renderComponent from "./renderComponent";
+import useWhenValueChanges from "./useWhenValueChanges";
+import useConstant from "./useConstant";
+import shallowEqual from "./shallowEqual";
+import isSyntheticEvent from "./isSyntheticEvent";
+import type { FormRenderProps } from "./types.js.flow";
+import ReactFinalFormContext from "./context";
+import useLatest from "./useLatest";
+import { version } from "../package.json";
+import { addLazyFormState } from "./getters";
-export { version }
+export { version };
const versions = {
- 'final-form': ffVersion,
- 'react-final-form': version
-}
+ "final-form": ffVersion,
+ "react-final-form": version,
+};
export const all: FormSubscription = formSubscriptionItems.reduce(
(result, key) => {
- result[key] = true
- return result
+ result[key] = true;
+ return result;
},
- {}
-)
+ {},
+);
function ReactFinalForm({
debug,
@@ -63,60 +63,60 @@ function ReactFinalForm({
mutators,
onSubmit,
validate,
- validateOnBlur
- }
+ validateOnBlur,
+ };
const form: FormApi = useConstant(() => {
- const f = alternateFormApi || createForm(config)
+ const f = alternateFormApi || createForm(config);
// pause validation until children register all fields on first render (unpaused in useEffect() below)
- f.pauseValidation()
- return f
- })
+ f.pauseValidation();
+ return f;
+ });
// synchronously register and unregister to query form state for our subscription on first render
const [state, setState] = React.useState>(
(): FormState => {
- let initialState: FormState = {}
- form.subscribe(state => {
- initialState = state
- }, subscription)()
- return initialState
- }
- )
+ let initialState: FormState = {};
+ form.subscribe((state) => {
+ initialState = state;
+ }, subscription)();
+ return initialState;
+ },
+ );
// save a copy of state that can break through the closure
// on the shallowEqual() line below.
- const stateRef = useLatest>(state)
+ const stateRef = useLatest>(state);
React.useEffect(() => {
// We have rendered, so all fields are now registered, so we can unpause validation
- form.isValidationPaused() && form.resumeValidation()
+ form.isValidationPaused() && form.resumeValidation();
const unsubscriptions: Unsubscribe[] = [
- form.subscribe(s => {
+ form.subscribe((s) => {
if (!shallowEqual(s, stateRef.current)) {
- setState(s)
+ setState(s);
}
}, subscription),
...(decorators
- ? decorators.map(decorator =>
+ ? decorators.map((decorator) =>
// this noop ternary is to appease the flow gods
// istanbul ignore next
- decorator(form)
+ decorator(form),
)
- : [])
- ]
+ : []),
+ ];
return () => {
- form.pauseValidation() // pause validation so we don't revalidate on every field deregistration
- unsubscriptions.reverse().forEach(unsubscribe => unsubscribe())
+ form.pauseValidation(); // pause validation so we don't revalidate on every field deregistration
+ unsubscriptions.reverse().forEach((unsubscribe) => unsubscribe());
// don't need to resume validation here; either unmounting, or will re-run this hook with new deps
- }
+ };
// eslint-disable-next-line react-hooks/exhaustive-deps
- }, decorators)
+ }, decorators);
// warn about decorator changes
// istanbul ignore next
- if (process.env.NODE_ENV !== 'production') {
+ if (process.env.NODE_ENV !== "production") {
// You're never supposed to use hooks inside a conditional, but in this
// case we can be certain that you're not going to be changing your
// NODE_ENV between renders, so this is safe.
@@ -126,84 +126,84 @@ function ReactFinalForm({
decorators,
() => {
console.error(
- 'Form decorators should not change from one render to the next as new values will be ignored'
- )
+ "Form decorators should not change from one render to the next as new values will be ignored",
+ );
},
- shallowEqual
- )
+ shallowEqual,
+ );
}
// allow updatable config
useWhenValueChanges(debug, () => {
- form.setConfig('debug', debug)
- })
+ form.setConfig("debug", debug);
+ });
useWhenValueChanges(destroyOnUnregister, () => {
- form.destroyOnUnregister = !!destroyOnUnregister
- })
+ form.destroyOnUnregister = !!destroyOnUnregister;
+ });
useWhenValueChanges(keepDirtyOnReinitialize, () => {
- form.setConfig('keepDirtyOnReinitialize', keepDirtyOnReinitialize)
- })
+ form.setConfig("keepDirtyOnReinitialize", keepDirtyOnReinitialize);
+ });
useWhenValueChanges(
initialValues,
() => {
- form.setConfig('initialValues', initialValues)
+ form.setConfig("initialValues", initialValues);
},
- initialValuesEqual || shallowEqual
- )
+ initialValuesEqual || shallowEqual,
+ );
useWhenValueChanges(mutators, () => {
- form.setConfig('mutators', mutators)
- })
+ form.setConfig("mutators", mutators);
+ });
useWhenValueChanges(onSubmit, () => {
- form.setConfig('onSubmit', onSubmit)
- })
+ form.setConfig("onSubmit", onSubmit);
+ });
useWhenValueChanges(validate, () => {
- form.setConfig('validate', validate)
- })
+ form.setConfig("validate", validate);
+ });
useWhenValueChanges(validateOnBlur, () => {
- form.setConfig('validateOnBlur', validateOnBlur)
- })
+ form.setConfig("validateOnBlur", validateOnBlur);
+ });
const handleSubmit = (event: ?SubmitEvent) => {
if (event) {
// sometimes not true, e.g. React Native
- if (typeof event.preventDefault === 'function') {
- event.preventDefault()
+ if (typeof event.preventDefault === "function") {
+ event.preventDefault();
}
- if (typeof event.stopPropagation === 'function') {
+ if (typeof event.stopPropagation === "function") {
// prevent any outer forms from receiving the event too
- event.stopPropagation()
+ event.stopPropagation();
}
}
- return form.submit()
- }
+ return form.submit();
+ };
const renderProps: FormRenderProps = {
form: {
...form,
- reset: eventOrValues => {
+ reset: (eventOrValues) => {
if (isSyntheticEvent(eventOrValues)) {
// it's a React SyntheticEvent, call reset with no arguments
- form.reset()
+ form.reset();
} else {
- form.reset(eventOrValues)
+ form.reset(eventOrValues);
}
- }
+ },
},
- handleSubmit
- }
- addLazyFormState(renderProps, state)
+ handleSubmit,
+ };
+ addLazyFormState(renderProps, state);
return React.createElement(
ReactFinalFormContext.Provider,
{ value: form },
renderComponent(
{
...rest,
- __versions: versions
+ __versions: versions,
},
renderProps,
- 'ReactFinalForm'
- )
- )
+ "ReactFinalForm",
+ ),
+ );
}
-export default ReactFinalForm
+export default ReactFinalForm;
diff --git a/src/ReactFinalForm.test.js b/src/ReactFinalForm.test.js
index 5e38ac37..ef429f65 100644
--- a/src/ReactFinalForm.test.js
+++ b/src/ReactFinalForm.test.js
@@ -1,93 +1,93 @@
-import React from 'react'
-import { render, fireEvent, cleanup, act } from '@testing-library/react'
-import '@testing-library/jest-dom/extend-expect'
-import deepEqual from 'fast-deep-equal'
-import { ErrorBoundary, Toggle, wrapWith } from './testUtils'
-import { createForm } from 'final-form'
-import { Form, Field, version, withTypes } from '.'
-
-const onSubmitMock = values => {}
-const timeout = ms => new Promise(resolve => setTimeout(resolve, ms))
+import React from "react";
+import { render, fireEvent, cleanup, act } from "@testing-library/react";
+import "@testing-library/jest-dom/extend-expect";
+import deepEqual from "fast-deep-equal";
+import { ErrorBoundary, Toggle, wrapWith } from "./testUtils";
+import { createForm } from "final-form";
+import { Form, Field, version, withTypes } from ".";
+
+const onSubmitMock = (values) => {};
+const timeout = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
async function sleep(ms) {
await act(async () => {
- await timeout(ms)
- })
+ await timeout(ms);
+ });
}
-describe('ReactFinalForm', () => {
- afterEach(cleanup)
+describe("ReactFinalForm", () => {
+ afterEach(cleanup);
- it('should export version', () => {
- expect(version).toBeDefined()
- })
+ it("should export version", () => {
+ expect(version).toBeDefined();
+ });
- it('should export withTypes', () => {
+ it("should export withTypes", () => {
// mostly for code coverage
- expect(withTypes).toBeDefined()
- expect(withTypes()).toBeDefined()
- })
+ expect(withTypes).toBeDefined();
+ expect(withTypes()).toBeDefined();
+ });
- it('should render with render function', () => {
+ it("should render with render function", () => {
const { getByTestId } = render(
}
- />
- )
- expect(getByTestId('myDiv')).toBeDefined()
- })
+ />,
+ );
+ expect(getByTestId("myDiv")).toBeDefined();
+ });
- it('should render with children render function', () => {
+ it("should render with children render function", () => {
const { getByTestId } = render(
- {() =>
}
- )
- expect(getByTestId('myDiv')).toBeDefined()
- })
-
- it('should print a warning with no render or children specified', () => {
- jest.spyOn(console, 'error').mockImplementation(() => {})
- const errorSpy = jest.fn()
+ {() =>
} ,
+ );
+ expect(getByTestId("myDiv")).toBeDefined();
+ });
+
+ it("should print a warning with no render or children specified", () => {
+ jest.spyOn(console, "error").mockImplementation(() => {});
+ const errorSpy = jest.fn();
render(
-
- )
- expect(errorSpy).toHaveBeenCalled()
- expect(errorSpy).toHaveBeenCalledTimes(1)
+ ,
+ );
+ expect(errorSpy).toHaveBeenCalled();
+ expect(errorSpy).toHaveBeenCalledTimes(1);
expect(errorSpy.mock.calls[0][0].message).toBe(
- 'Must specify either a render prop, a render function as children, or a component prop to ReactFinalForm'
- )
- console.error.mockRestore()
- })
-
- it('should print a warning with no onSubmit specified', () => {
- jest.spyOn(console, 'error').mockImplementation(() => {})
- const errorSpy = jest.fn()
+ "Must specify either a render prop, a render function as children, or a component prop to ReactFinalForm",
+ );
+ console.error.mockRestore();
+ });
+
+ it("should print a warning with no onSubmit specified", () => {
+ jest.spyOn(console, "error").mockImplementation(() => {});
+ const errorSpy = jest.fn();
render(
} />
-
- )
- expect(errorSpy).toHaveBeenCalled()
- expect(errorSpy).toHaveBeenCalledTimes(1)
+ ,
+ );
+ expect(errorSpy).toHaveBeenCalled();
+ expect(errorSpy).toHaveBeenCalledTimes(1);
expect(errorSpy.mock.calls[0][0].message).toBe(
- 'No onSubmit function specified'
- )
- console.error.mockRestore()
- })
+ "No onSubmit function specified",
+ );
+ console.error.mockRestore();
+ });
- it('should allow render to be a component', () => {
- const Component = () =>
+ it("should allow render to be a component", () => {
+ const Component = () =>
;
const { getByTestId } = render(
-
- )
- expect(getByTestId('myDiv')).toBeDefined()
- })
+ ,
+ );
+ expect(getByTestId("myDiv")).toBeDefined();
+ });
- it('should unsubscribe on unmount', () => {
+ it("should unsubscribe on unmount", () => {
// This is mainly here for code coverage. 🧐
const Container = () => {
- const [shown, setShown] = React.useState(true)
+ const [shown, setShown] = React.useState(true);
return (
{shown &&
} />}
@@ -95,17 +95,17 @@ describe('ReactFinalForm', () => {
Unmount
- )
- }
+ );
+ };
const { getByText } = render(
-
- )
- fireEvent.click(getByText('Unmount'))
- })
-
- it('should render with a field', () => {
- const formRender = jest.fn()
- const fieldRender = jest.fn()
+ ,
+ );
+ fireEvent.click(getByText("Unmount"));
+ });
+
+ it("should render with a field", () => {
+ const formRender = jest.fn();
+ const fieldRender = jest.fn();
const { getByTestId } = render(
{wrapWith(formRender, () => (
@@ -114,7 +114,7 @@ describe('ReactFinalForm', () => {
{wrapWith(fieldRender, ({ input, meta }) => (
<>
- {meta.active ? 'active' : 'inactive'}
+ {meta.active ? "active" : "inactive"}
>
@@ -122,45 +122,45 @@ describe('ReactFinalForm', () => {
))}
-
- )
- const firstName = getByTestId('firstName')
- const active = getByTestId('firstNameActive')
- expect(firstName).toBeDefined()
- expect(active).toBeDefined()
- expect(firstName.value).toBe('')
- expect(active).toHaveTextContent('inactive')
+ ,
+ );
+ const firstName = getByTestId("firstName");
+ const active = getByTestId("firstNameActive");
+ expect(firstName).toBeDefined();
+ expect(active).toBeDefined();
+ expect(firstName.value).toBe("");
+ expect(active).toHaveTextContent("inactive");
// All forms render twice at first because they need to update their validation
// and touched/modified/visited maps every time new fields are registered.
- expect(formRender).toHaveBeenCalledTimes(2)
- expect(fieldRender).toHaveBeenCalledTimes(2)
- fireEvent.focus(firstName)
- expect(formRender).toHaveBeenCalledTimes(3)
- expect(fieldRender).toHaveBeenCalledTimes(3)
- expect(active).toHaveTextContent('active')
- fireEvent.change(firstName, { target: { value: 'E' } })
- expect(formRender).toHaveBeenCalledTimes(4)
- expect(fieldRender).toHaveBeenCalledTimes(4)
- expect(firstName.value).toBe('E')
- fireEvent.change(firstName, { target: { value: 'Er' } })
- expect(formRender).toHaveBeenCalledTimes(5)
- expect(fieldRender).toHaveBeenCalledTimes(5)
- fireEvent.change(firstName, { target: { value: 'Eri' } })
- expect(formRender).toHaveBeenCalledTimes(6)
- expect(fieldRender).toHaveBeenCalledTimes(6)
- fireEvent.change(firstName, { target: { value: 'Erik' } })
- expect(formRender).toHaveBeenCalledTimes(7)
- expect(fieldRender).toHaveBeenCalledTimes(7)
- expect(active).toHaveTextContent('active')
- fireEvent.blur(firstName)
- expect(formRender).toHaveBeenCalledTimes(8)
- expect(fieldRender).toHaveBeenCalledTimes(8)
- expect(active).toHaveTextContent('inactive')
- })
-
- it('should render with a field with a limited subscription', () => {
- const formRender = jest.fn()
- const fieldRender = jest.fn()
+ expect(formRender).toHaveBeenCalledTimes(2);
+ expect(fieldRender).toHaveBeenCalledTimes(2);
+ fireEvent.focus(firstName);
+ expect(formRender).toHaveBeenCalledTimes(3);
+ expect(fieldRender).toHaveBeenCalledTimes(3);
+ expect(active).toHaveTextContent("active");
+ fireEvent.change(firstName, { target: { value: "E" } });
+ expect(formRender).toHaveBeenCalledTimes(4);
+ expect(fieldRender).toHaveBeenCalledTimes(4);
+ expect(firstName.value).toBe("E");
+ fireEvent.change(firstName, { target: { value: "Er" } });
+ expect(formRender).toHaveBeenCalledTimes(5);
+ expect(fieldRender).toHaveBeenCalledTimes(5);
+ fireEvent.change(firstName, { target: { value: "Eri" } });
+ expect(formRender).toHaveBeenCalledTimes(6);
+ expect(fieldRender).toHaveBeenCalledTimes(6);
+ fireEvent.change(firstName, { target: { value: "Erik" } });
+ expect(formRender).toHaveBeenCalledTimes(7);
+ expect(fieldRender).toHaveBeenCalledTimes(7);
+ expect(active).toHaveTextContent("active");
+ fireEvent.blur(firstName);
+ expect(formRender).toHaveBeenCalledTimes(8);
+ expect(fieldRender).toHaveBeenCalledTimes(8);
+ expect(active).toHaveTextContent("inactive");
+ });
+
+ it("should render with a field with a limited subscription", () => {
+ const formRender = jest.fn();
+ const fieldRender = jest.fn();
const { getByTestId } = render(
{wrapWith(formRender, () => (
@@ -169,7 +169,7 @@ describe('ReactFinalForm', () => {
{wrapWith(fieldRender, ({ input, meta }) => (
<>
- {meta.active ? 'active' : 'inactive'}
+ {meta.active ? "active" : "inactive"}
>
@@ -177,44 +177,44 @@ describe('ReactFinalForm', () => {
))}
-
- )
- const firstName = getByTestId('firstName')
- const active = getByTestId('firstNameActive')
- expect(firstName).toBeDefined()
- expect(active).toBeDefined()
- expect(firstName.value).toBe('')
- expect(active).toHaveTextContent('inactive')
- expect(formRender).toHaveBeenCalledTimes(1)
- expect(fieldRender).toHaveBeenCalledTimes(1)
- fireEvent.focus(firstName)
+ ,
+ );
+ const firstName = getByTestId("firstName");
+ const active = getByTestId("firstNameActive");
+ expect(firstName).toBeDefined();
+ expect(active).toBeDefined();
+ expect(firstName.value).toBe("");
+ expect(active).toHaveTextContent("inactive");
+ expect(formRender).toHaveBeenCalledTimes(1);
+ expect(fieldRender).toHaveBeenCalledTimes(1);
+ fireEvent.focus(firstName);
// not subscribing to active, so no rerender!
- expect(formRender).toHaveBeenCalledTimes(1)
- expect(fieldRender).toHaveBeenCalledTimes(1)
- expect(active).toHaveTextContent('inactive')
- fireEvent.change(firstName, { target: { value: 'E' } })
- expect(formRender).toHaveBeenCalledTimes(1)
- expect(fieldRender).toHaveBeenCalledTimes(2)
- expect(firstName.value).toBe('E')
- fireEvent.change(firstName, { target: { value: 'Er' } })
- expect(formRender).toHaveBeenCalledTimes(1)
- expect(fieldRender).toHaveBeenCalledTimes(3)
- fireEvent.change(firstName, { target: { value: 'Eri' } })
- expect(formRender).toHaveBeenCalledTimes(1)
- expect(fieldRender).toHaveBeenCalledTimes(4)
- fireEvent.change(firstName, { target: { value: 'Erik' } })
- expect(formRender).toHaveBeenCalledTimes(1)
- expect(fieldRender).toHaveBeenCalledTimes(5)
- expect(active).toHaveTextContent('inactive')
- fireEvent.blur(firstName)
+ expect(formRender).toHaveBeenCalledTimes(1);
+ expect(fieldRender).toHaveBeenCalledTimes(1);
+ expect(active).toHaveTextContent("inactive");
+ fireEvent.change(firstName, { target: { value: "E" } });
+ expect(formRender).toHaveBeenCalledTimes(1);
+ expect(fieldRender).toHaveBeenCalledTimes(2);
+ expect(firstName.value).toBe("E");
+ fireEvent.change(firstName, { target: { value: "Er" } });
+ expect(formRender).toHaveBeenCalledTimes(1);
+ expect(fieldRender).toHaveBeenCalledTimes(3);
+ fireEvent.change(firstName, { target: { value: "Eri" } });
+ expect(formRender).toHaveBeenCalledTimes(1);
+ expect(fieldRender).toHaveBeenCalledTimes(4);
+ fireEvent.change(firstName, { target: { value: "Erik" } });
+ expect(formRender).toHaveBeenCalledTimes(1);
+ expect(fieldRender).toHaveBeenCalledTimes(5);
+ expect(active).toHaveTextContent("inactive");
+ fireEvent.blur(firstName);
// no rerender
- expect(formRender).toHaveBeenCalledTimes(1)
- expect(fieldRender).toHaveBeenCalledTimes(5)
- expect(active).toHaveTextContent('inactive')
- })
+ expect(formRender).toHaveBeenCalledTimes(1);
+ expect(fieldRender).toHaveBeenCalledTimes(5);
+ expect(active).toHaveTextContent("inactive");
+ });
- it('should call onSubmit when form is submitted', () => {
- const onSubmit = jest.fn()
+ it("should call onSubmit when form is submitted", () => {
+ const onSubmit = jest.fn();
const { getByTestId, getByText } = render(
{({ handleSubmit }) => (
@@ -224,21 +224,21 @@ describe('ReactFinalForm', () => {
Submit
)}
-
- )
- fireEvent.change(getByTestId('firstName'), { target: { value: 'Erik' } })
- fireEvent.change(getByTestId('lastName'), {
- target: { value: 'Rasmussen' }
- })
- expect(onSubmit).not.toHaveBeenCalled()
- fireEvent.click(getByText('Submit'))
- expect(onSubmit).toHaveBeenCalled()
- expect(onSubmit).toHaveBeenCalledTimes(1)
+ ,
+ );
+ fireEvent.change(getByTestId("firstName"), { target: { value: "Erik" } });
+ fireEvent.change(getByTestId("lastName"), {
+ target: { value: "Rasmussen" },
+ });
+ expect(onSubmit).not.toHaveBeenCalled();
+ fireEvent.click(getByText("Submit"));
+ expect(onSubmit).toHaveBeenCalled();
+ expect(onSubmit).toHaveBeenCalledTimes(1);
expect(onSubmit.mock.calls[0][0]).toEqual({
- firstName: 'Erik',
- lastName: 'Rasmussen'
- })
- })
+ firstName: "Erik",
+ lastName: "Rasmussen",
+ });
+ });
// it('should not throw when handleSubmit is called with no event', () => {
// const onSubmit = jest.fn()
@@ -272,16 +272,16 @@ describe('ReactFinalForm', () => {
// })
// })
- it('should reinitialize when initialValues prop changes', () => {
+ it("should reinitialize when initialValues prop changes", () => {
const initialValues = {
- name: 'Dr. Jekyll'
- }
+ name: "Dr. Jekyll",
+ };
const alternateInitialValues = {
- name: 'Mr. Hyde'
- }
+ name: "Mr. Hyde",
+ };
const { getByTestId, getByText } = render(
- {useAlternateInitialValues => (
+ {(useAlternateInitialValues) => (
{
)}
)}
-
- )
- expect(getByTestId('name').value).toBe('Dr. Jekyll')
- fireEvent.change(getByTestId('name'), { target: { value: 'Dr. Watson' } })
- expect(getByTestId('name').value).toBe('Dr. Watson')
- fireEvent.click(getByText('Toggle'))
- expect(getByTestId('name').value).toBe('Mr. Hyde')
- })
+ ,
+ );
+ expect(getByTestId("name").value).toBe("Dr. Jekyll");
+ fireEvent.change(getByTestId("name"), { target: { value: "Dr. Watson" } });
+ expect(getByTestId("name").value).toBe("Dr. Watson");
+ fireEvent.click(getByText("Toggle"));
+ expect(getByTestId("name").value).toBe("Mr. Hyde");
+ });
it("should NOT reinitialize when initialValues prop doesn't change (shallowly) but rerendered", () => {
const { getByTestId, getByText } = render(
- {useAlternateInitialValues => (
+ {(useAlternateInitialValues) => (
{({ handleSubmit }) => (
@@ -321,29 +321,29 @@ describe('ReactFinalForm', () => {
)}
)}
-
- )
- expect(getByTestId('name').value).toBe('Dr. Jekyll')
- fireEvent.change(getByTestId('name'), { target: { value: 'Dr. Watson' } })
- expect(getByTestId('name').value).toBe('Dr. Watson')
- fireEvent.click(getByText('Toggle'))
- expect(getByTestId('name').value).toBe('Dr. Watson')
- })
-
- it('should reinitialize when initialValues prop changes, deeply', () => {
+ ,
+ );
+ expect(getByTestId("name").value).toBe("Dr. Jekyll");
+ fireEvent.change(getByTestId("name"), { target: { value: "Dr. Watson" } });
+ expect(getByTestId("name").value).toBe("Dr. Watson");
+ fireEvent.click(getByText("Toggle"));
+ expect(getByTestId("name").value).toBe("Dr. Watson");
+ });
+
+ it("should reinitialize when initialValues prop changes, deeply", () => {
const initialValues = {
professor: {
- name: 'Dr. Jekyll'
- }
- }
+ name: "Dr. Jekyll",
+ },
+ };
const alternateInitialValues = {
professor: {
- name: 'Mr. Hyde'
- }
- }
+ name: "Mr. Hyde",
+ },
+ };
const { getByTestId, getByText } = render(
- {useAlternateInitialValues => (
+ {(useAlternateInitialValues) => (
{
)}
)}
-
- )
- expect(getByTestId('name').value).toBe('Dr. Jekyll')
- fireEvent.change(getByTestId('name'), { target: { value: 'Dr. Watson' } })
- expect(getByTestId('name').value).toBe('Dr. Watson')
- fireEvent.click(getByText('Toggle'))
- expect(getByTestId('name').value).toBe('Mr. Hyde')
- })
-
- it('should not reinitialize if initialValues prop is deep equal', () => {
+ ,
+ );
+ expect(getByTestId("name").value).toBe("Dr. Jekyll");
+ fireEvent.change(getByTestId("name"), { target: { value: "Dr. Watson" } });
+ expect(getByTestId("name").value).toBe("Dr. Watson");
+ fireEvent.click(getByText("Toggle"));
+ expect(getByTestId("name").value).toBe("Mr. Hyde");
+ });
+
+ it("should not reinitialize if initialValues prop is deep equal", () => {
const { getByTestId, getByText } = render(
- {useAlternateInitialValues => (
+ {(useAlternateInitialValues) => (
@@ -394,25 +394,25 @@ describe('ReactFinalForm', () => {
)}
)}
-
- )
- expect(getByTestId('name').value).toBe('Dr. Jekyll')
- fireEvent.change(getByTestId('name'), { target: { value: 'Dr. Watson' } })
- expect(getByTestId('name').value).toBe('Dr. Watson')
- fireEvent.click(getByText('Toggle'))
- expect(getByTestId('name').value).toBe('Dr. Watson')
- })
-
- it('should respect keepDirtyOnReinitialize prop when initialValues prop changes', () => {
+ ,
+ );
+ expect(getByTestId("name").value).toBe("Dr. Jekyll");
+ fireEvent.change(getByTestId("name"), { target: { value: "Dr. Watson" } });
+ expect(getByTestId("name").value).toBe("Dr. Watson");
+ fireEvent.click(getByText("Toggle"));
+ expect(getByTestId("name").value).toBe("Dr. Watson");
+ });
+
+ it("should respect keepDirtyOnReinitialize prop when initialValues prop changes", () => {
const initialValues = {
- name: 'Dr. Jekyll'
- }
+ name: "Dr. Jekyll",
+ };
const alternateInitialValues = {
- name: 'Mr. Hyde'
- }
+ name: "Mr. Hyde",
+ };
const { getByTestId, getByText } = render(
- {useAlternateInitialValues => (
+ {(useAlternateInitialValues) => (
{
)}
)}
-
- )
- expect(getByTestId('name').value).toBe('Dr. Jekyll')
- fireEvent.change(getByTestId('name'), { target: { value: 'Dr. Watson' } })
- expect(getByTestId('name').value).toBe('Dr. Watson')
- fireEvent.click(getByText('Toggle'))
- expect(getByTestId('name').value).toBe('Dr. Watson')
- })
-
- it('should update when onSubmit changes', () => {
- const firstOnSubmit = jest.fn()
- const secondOnSubmit = jest.fn()
+ ,
+ );
+ expect(getByTestId("name").value).toBe("Dr. Jekyll");
+ fireEvent.change(getByTestId("name"), { target: { value: "Dr. Watson" } });
+ expect(getByTestId("name").value).toBe("Dr. Watson");
+ fireEvent.click(getByText("Toggle"));
+ expect(getByTestId("name").value).toBe("Dr. Watson");
+ });
+
+ it("should update when onSubmit changes", () => {
+ const firstOnSubmit = jest.fn();
+ const secondOnSubmit = jest.fn();
const { getByTestId, getByText } = render(
- {useAlternateOnSubmit => (
+ {(useAlternateOnSubmit) => (
@@ -453,40 +453,40 @@ describe('ReactFinalForm', () => {
)}
)}
-
- )
- fireEvent.change(getByTestId('name'), { target: { value: 'Erik' } })
- expect(firstOnSubmit).not.toHaveBeenCalled()
- fireEvent.click(getByText('Submit'))
- expect(firstOnSubmit).toHaveBeenCalled()
- expect(firstOnSubmit).toHaveBeenCalledTimes(1)
+ ,
+ );
+ fireEvent.change(getByTestId("name"), { target: { value: "Erik" } });
+ expect(firstOnSubmit).not.toHaveBeenCalled();
+ fireEvent.click(getByText("Submit"));
+ expect(firstOnSubmit).toHaveBeenCalled();
+ expect(firstOnSubmit).toHaveBeenCalledTimes(1);
expect(firstOnSubmit.mock.calls[0][0]).toEqual({
- name: 'Erik'
- })
- expect(secondOnSubmit).not.toHaveBeenCalled()
- fireEvent.click(getByText('Toggle'))
- expect(firstOnSubmit).toHaveBeenCalledTimes(1)
- expect(secondOnSubmit).not.toHaveBeenCalled()
- fireEvent.click(getByText('Submit'))
- expect(firstOnSubmit).toHaveBeenCalledTimes(1)
- expect(secondOnSubmit).toHaveBeenCalled()
- expect(secondOnSubmit).toHaveBeenCalledTimes(1)
+ name: "Erik",
+ });
+ expect(secondOnSubmit).not.toHaveBeenCalled();
+ fireEvent.click(getByText("Toggle"));
+ expect(firstOnSubmit).toHaveBeenCalledTimes(1);
+ expect(secondOnSubmit).not.toHaveBeenCalled();
+ fireEvent.click(getByText("Submit"));
+ expect(firstOnSubmit).toHaveBeenCalledTimes(1);
+ expect(secondOnSubmit).toHaveBeenCalled();
+ expect(secondOnSubmit).toHaveBeenCalledTimes(1);
expect(secondOnSubmit.mock.calls[0][0]).toEqual({
- name: 'Erik'
- })
- })
-
- it('should warn if decorators change', () => {
- const decoratorA = form => () => {}
- const decoratorB = form => () => {}
- const decoratorC = form => () => {}
- const oldDecorators = [decoratorA, decoratorB]
- const newDecorators = [decoratorA, decoratorB, decoratorC]
- const errorSpy = jest.spyOn(console, 'error').mockImplementation(() => {})
+ name: "Erik",
+ });
+ });
+
+ it("should warn if decorators change", () => {
+ const decoratorA = (form) => () => {};
+ const decoratorB = (form) => () => {};
+ const decoratorC = (form) => () => {};
+ const oldDecorators = [decoratorA, decoratorB];
+ const newDecorators = [decoratorA, decoratorB, decoratorC];
+ const errorSpy = jest.spyOn(console, "error").mockImplementation(() => {});
const { getByText } = render(
- {useAlternateDecorators => (
+ {(useAlternateDecorators) => (
{
)}
)}
-
- )
- expect(errorSpy).not.toHaveBeenCalled()
- fireEvent.click(getByText('Toggle'))
- expect(errorSpy).toHaveBeenCalled()
+ ,
+ );
+ expect(errorSpy).not.toHaveBeenCalled();
+ fireEvent.click(getByText("Toggle"));
+ expect(errorSpy).toHaveBeenCalled();
expect(errorSpy).toHaveBeenCalledWith(
- 'Form decorators should not change from one render to the next as new values will be ignored'
- )
- errorSpy.mockRestore()
- })
+ "Form decorators should not change from one render to the next as new values will be ignored",
+ );
+ errorSpy.mockRestore();
+ });
- it('should return a promise from handleSubmit when submission is async', () => {
+ it("should return a promise from handleSubmit when submission is async", () => {
const { getByTestId, getByText } = render(
{
- await timeout(2)
+ await timeout(2);
}}
>
{({ handleSubmit }) => (
{
- const promise = handleSubmit(event)
- expect(promise).toBeDefined()
- expect(typeof promise.then).toBe('function')
+ onSubmit={(event) => {
+ const promise = handleSubmit(event);
+ expect(promise).toBeDefined();
+ expect(typeof promise.then).toBe("function");
}}
>
Submit
)}
-
- )
- fireEvent.change(getByTestId('name'), { target: { value: 'Erik' } })
- fireEvent.click(getByText('Submit'))
- })
+ ,
+ );
+ fireEvent.change(getByTestId("name"), { target: { value: "Erik" } });
+ fireEvent.click(getByText("Submit"));
+ });
- it('should ignore SyntheticEvents on form reset ', () => {
+ it("should ignore SyntheticEvents on form reset ", () => {
const { getByTestId, getByText } = render(
-
+
{({ handleSubmit, form }) => (
@@ -547,47 +547,47 @@ describe('ReactFinalForm', () => {
)}
-
- )
- expect(getByTestId('name').value).toBe('John')
- fireEvent.change(getByTestId('name'), { target: { value: 'Paul' } })
- expect(getByTestId('name').value).toBe('Paul')
- fireEvent.click(getByText('Reset'))
- expect(getByTestId('name').value).toBe('John')
- })
-
- it('should accept new initial values on form reset ', () => {
+ ,
+ );
+ expect(getByTestId("name").value).toBe("John");
+ fireEvent.change(getByTestId("name"), { target: { value: "Paul" } });
+ expect(getByTestId("name").value).toBe("Paul");
+ fireEvent.click(getByText("Reset"));
+ expect(getByTestId("name").value).toBe("John");
+ });
+
+ it("should accept new initial values on form reset ", () => {
const { getByTestId, getByText } = render(
{({ form }) => (
- form.reset({ name: 'bob' })}>
+ form.reset({ name: "bob" })}>
Reset
)}
-
- )
- expect(getByTestId('name').value).toBe('erikras')
- fireEvent.change(getByTestId('name'), {
- target: { value: 'erikrasmussen' }
- })
- expect(getByTestId('name').value).toBe('erikrasmussen')
- fireEvent.click(getByText('Reset'))
- expect(getByTestId('name').value).toBe('bob')
- })
-
- it('should use decorators, and unsubscribe them on unmount', () => {
- const unsubscribe = jest.fn()
- const decorator = jest.fn(() => unsubscribe)
+ ,
+ );
+ expect(getByTestId("name").value).toBe("erikras");
+ fireEvent.change(getByTestId("name"), {
+ target: { value: "erikrasmussen" },
+ });
+ expect(getByTestId("name").value).toBe("erikrasmussen");
+ fireEvent.click(getByText("Reset"));
+ expect(getByTestId("name").value).toBe("bob");
+ });
+
+ it("should use decorators, and unsubscribe them on unmount", () => {
+ const unsubscribe = jest.fn();
+ const decorator = jest.fn(() => unsubscribe);
const { getByText } = render(
- {hideForm =>
+ {(hideForm) =>
!hideForm && (
{({ handleSubmit }) => (
@@ -598,35 +598,35 @@ describe('ReactFinalForm', () => {
)
}
-
- )
- expect(decorator).toHaveBeenCalled()
- expect(decorator).toHaveBeenCalledTimes(1)
- expect(unsubscribe).not.toHaveBeenCalled()
- fireEvent.click(getByText('Toggle'))
- expect(unsubscribe).toHaveBeenCalled()
- })
-
- it('should all record level validation function to change', () => {
- const simpleValidation = values => {
- const errors = {}
+ ,
+ );
+ expect(decorator).toHaveBeenCalled();
+ expect(decorator).toHaveBeenCalledTimes(1);
+ expect(unsubscribe).not.toHaveBeenCalled();
+ fireEvent.click(getByText("Toggle"));
+ expect(unsubscribe).toHaveBeenCalled();
+ });
+
+ it("should all record level validation function to change", () => {
+ const simpleValidation = (values) => {
+ const errors = {};
if (!values.name) {
- errors.name = 'Required'
+ errors.name = "Required";
}
- return errors
- }
- const complexValidation = values => {
- const errors = {}
+ return errors;
+ };
+ const complexValidation = (values) => {
+ const errors = {};
if (!values.name) {
- errors.name = 'Required'
+ errors.name = "Required";
} else if (values.name.toUpperCase() !== values.name) {
- errors.name = 'SHOULD BE SHOUTING'
+ errors.name = "SHOULD BE SHOUTING";
}
- return errors
- }
+ return errors;
+ };
const { getByTestId, getByText } = render(
- {useComplexValidation => (
+ {(useComplexValidation) => (
{
)}
)}
-
- )
- expect(getByTestId('name').value).toBe('')
- expect(getByTestId('error')).toHaveTextContent('Required')
- fireEvent.change(getByTestId('name'), { target: { value: 'erikras' } })
- expect(getByTestId('error')).toHaveTextContent('')
- fireEvent.click(getByText('Toggle'))
- expect(getByTestId('error')).toHaveTextContent('SHOULD BE SHOUTING')
- fireEvent.change(getByTestId('name'), { target: { value: 'ERIKRAS' } })
- expect(getByTestId('error')).toHaveTextContent('')
- })
-
- it('should show form as invalid on second rerender if field-level validation errors are present', () => {
+ ,
+ );
+ expect(getByTestId("name").value).toBe("");
+ expect(getByTestId("error")).toHaveTextContent("Required");
+ fireEvent.change(getByTestId("name"), { target: { value: "erikras" } });
+ expect(getByTestId("error")).toHaveTextContent("");
+ fireEvent.click(getByText("Toggle"));
+ expect(getByTestId("error")).toHaveTextContent("SHOULD BE SHOUTING");
+ fireEvent.change(getByTestId("name"), { target: { value: "ERIKRAS" } });
+ expect(getByTestId("error")).toHaveTextContent("");
+ });
+
+ it("should show form as invalid on second rerender if field-level validation errors are present", () => {
// Debugging https://github.com/final-form/react-final-form/issues/196
- const spy = jest.fn()
+ const spy = jest.fn();
render(
{({ handleSubmit, invalid }) => {
- spy(invalid)
+ spy(invalid);
return (
'Required'}
+ validate={() => "Required"}
/>
- )
+ );
}}
-
- )
+ ,
+ );
// On first render, we cannot know about any field level validation rules
// because none of the fields have yet had a chance to render and register.
- expect(spy).toHaveBeenCalledTimes(2)
- expect(spy.mock.calls[0][0]).toBe(false)
- expect(spy.mock.calls[1][0]).toBe(true)
- })
+ expect(spy).toHaveBeenCalledTimes(2);
+ expect(spy.mock.calls[0][0]).toBe(false);
+ expect(spy.mock.calls[1][0]).toBe(true);
+ });
- it('should work with server-side rendering', () => {
- const errorSpy = jest.spyOn(console, 'error').mockImplementation(() => {})
+ it("should work with server-side rendering", () => {
+ const errorSpy = jest.spyOn(console, "error").mockImplementation(() => {});
render(
{
)}
- />
- )
- expect(errorSpy).not.toHaveBeenCalled()
- errorSpy.mockRestore()
- })
+ />,
+ );
+ expect(errorSpy).not.toHaveBeenCalled();
+ errorSpy.mockRestore();
+ });
- it('should allow change to debug flag', () => {
+ it("should allow change to debug flag", () => {
// this is mostly for code coverage 😰
- const debugMock = jest.fn()
+ const debugMock = jest.fn();
const { getByText } = render(
- {debug => (
+ {(debug) => (
{({ handleSubmit }) => (
@@ -720,16 +720,16 @@ describe('ReactFinalForm', () => {
)}
)}
-
- )
- fireEvent.click(getByText('Toggle'))
- })
+ ,
+ );
+ fireEvent.click(getByText("Toggle"));
+ });
- it('should allow change to destroyOnUnregister flag', () => {
+ it("should allow change to destroyOnUnregister flag", () => {
// this is mostly for code coverage 😰
const { getByText } = render(
- {destroyOnUnregister => (
+ {(destroyOnUnregister) => (
{
)}
)}
-
- )
- fireEvent.click(getByText('Toggle'))
- })
+ ,
+ );
+ fireEvent.click(getByText("Toggle"));
+ });
- it('should allow change to keepDirtyOnReinitialize flag', () => {
+ it("should allow change to keepDirtyOnReinitialize flag", () => {
// this is mostly for code coverage 😰
const { getByText } = render(
- {keepDirtyOnReinitialize => (
+ {(keepDirtyOnReinitialize) => (
{
)}
)}
-
- )
- fireEvent.click(getByText('Toggle'))
- })
+ ,
+ );
+ fireEvent.click(getByText("Toggle"));
+ });
- it('should allow change to validateOnBlur flag', () => {
+ it("should allow change to validateOnBlur flag", () => {
// this is mostly for code coverage 😰
const { getByText } = render(
- {validateOnBlur => (
+ {(validateOnBlur) => (
{({ handleSubmit }) => (
@@ -780,23 +780,23 @@ describe('ReactFinalForm', () => {
)}
)}
-
- )
- fireEvent.click(getByText('Toggle'))
- })
+ ,
+ );
+ fireEvent.click(getByText("Toggle"));
+ });
- it('should allow change to mutators', () => {
+ it("should allow change to mutators", () => {
// this is mostly for code coverage 😰
- const oldMutators = undefined
+ const oldMutators = undefined;
const newMutators = {
clearField: ([name], state, { changeValue }) => {
- changeValue(state, name, () => undefined)
- }
- }
- const spy = jest.fn()
+ changeValue(state, name, () => undefined);
+ },
+ };
+ const spy = jest.fn();
const { getByTestId, getByText } = render(
- {swapMutators => (
+ {(swapMutators) => (
{
form.mutators.clearField('name')}
+ onClick={() => form.mutators.clearField("name")}
>
Clear Name
@@ -814,105 +814,105 @@ describe('ReactFinalForm', () => {
))}
)}
-
- )
- expect(getByTestId('name').value).toBe('')
- fireEvent.change(getByTestId('name'), { target: { value: 'erikras' } })
- expect(getByTestId('name').value).toBe('erikras')
- fireEvent.click(getByText('Toggle'))
- expect(getByTestId('name').value).toBe('erikras')
- fireEvent.click(getByText('Clear Name'))
- expect(getByTestId('name').value).toBe('')
- })
+ ,
+ );
+ expect(getByTestId("name").value).toBe("");
+ fireEvent.change(getByTestId("name"), { target: { value: "erikras" } });
+ expect(getByTestId("name").value).toBe("erikras");
+ fireEvent.click(getByText("Toggle"));
+ expect(getByTestId("name").value).toBe("erikras");
+ fireEvent.click(getByText("Clear Name"));
+ expect(getByTestId("name").value).toBe("");
+ });
it("should allow handleSubmit to be called with an object that's not an event", () => {
- const onSubmitMock = jest.fn()
+ const onSubmitMock = jest.fn();
const { getByText } = render(
-
+
{({ handleSubmit }) => (
{
- handleSubmit({})
- event.preventDefault() // so react-testing-library doesn't freak out
+ onSubmit={(event) => {
+ handleSubmit({});
+ event.preventDefault(); // so react-testing-library doesn't freak out
}}
>
Submit
)}
-
- )
- expect(onSubmitMock).not.toHaveBeenCalled()
- fireEvent.click(getByText('Submit'))
- expect(onSubmitMock).toHaveBeenCalled()
- expect(onSubmitMock).toHaveBeenCalledTimes(1)
- expect(onSubmitMock.mock.calls[0][0]).toEqual({ name: 'erikras' })
- })
-
- it('should allow handleSubmit to be called with no parameters', () => {
- const onSubmitMock = jest.fn()
+ ,
+ );
+ expect(onSubmitMock).not.toHaveBeenCalled();
+ fireEvent.click(getByText("Submit"));
+ expect(onSubmitMock).toHaveBeenCalled();
+ expect(onSubmitMock).toHaveBeenCalledTimes(1);
+ expect(onSubmitMock.mock.calls[0][0]).toEqual({ name: "erikras" });
+ });
+
+ it("should allow handleSubmit to be called with no parameters", () => {
+ const onSubmitMock = jest.fn();
const { getByText } = render(
-
+
{({ handleSubmit }) => (
{
- handleSubmit()
- event.preventDefault() // so react-testing-library doesn't freak out
+ onSubmit={(event) => {
+ handleSubmit();
+ event.preventDefault(); // so react-testing-library doesn't freak out
}}
>
Submit
)}
-
- )
- expect(onSubmitMock).not.toHaveBeenCalled()
- fireEvent.click(getByText('Submit'))
- expect(onSubmitMock).toHaveBeenCalled()
- expect(onSubmitMock).toHaveBeenCalledTimes(1)
- expect(onSubmitMock.mock.calls[0][0]).toEqual({ name: 'erikras' })
- })
-
- it('should set submitting back to false after submit', async () => {
+ ,
+ );
+ expect(onSubmitMock).not.toHaveBeenCalled();
+ fireEvent.click(getByText("Submit"));
+ expect(onSubmitMock).toHaveBeenCalled();
+ expect(onSubmitMock).toHaveBeenCalledTimes(1);
+ expect(onSubmitMock.mock.calls[0][0]).toEqual({ name: "erikras" });
+ });
+
+ it("should set submitting back to false after submit", async () => {
const onSubmit = jest.fn(async () => {
- await timeout(1)
- })
- const recordSubmitting = jest.fn()
+ await timeout(1);
+ });
+ const recordSubmitting = jest.fn();
const { getByText } = render(
{({ handleSubmit, submitting }) => {
- recordSubmitting(submitting)
+ recordSubmitting(submitting);
return (
Submit
- )
+ );
}}
-
- )
- expect(onSubmit).not.toHaveBeenCalled()
- expect(recordSubmitting).toHaveBeenCalled()
- expect(recordSubmitting).toHaveBeenCalledTimes(1)
- expect(recordSubmitting.mock.calls[0][0]).toBe(false)
-
- fireEvent.click(getByText('Submit'))
-
- expect(onSubmit).toHaveBeenCalled()
- expect(onSubmit).toHaveBeenCalledTimes(1)
- expect(recordSubmitting).toHaveBeenCalledTimes(2)
- expect(recordSubmitting.mock.calls[1][0]).toBe(true)
-
- await sleep(5)
-
- expect(recordSubmitting).toHaveBeenCalledTimes(3)
- expect(recordSubmitting.mock.calls[2][0]).toBe(false)
- })
-
- it('should allow an alternative form api to be passed in', () => {
- const onSubmit = jest.fn()
- const form = createForm({ onSubmit: onSubmit })
- const formMock = jest.spyOn(form, 'registerField')
+ ,
+ );
+ expect(onSubmit).not.toHaveBeenCalled();
+ expect(recordSubmitting).toHaveBeenCalled();
+ expect(recordSubmitting).toHaveBeenCalledTimes(1);
+ expect(recordSubmitting.mock.calls[0][0]).toBe(false);
+
+ fireEvent.click(getByText("Submit"));
+
+ expect(onSubmit).toHaveBeenCalled();
+ expect(onSubmit).toHaveBeenCalledTimes(1);
+ expect(recordSubmitting).toHaveBeenCalledTimes(2);
+ expect(recordSubmitting.mock.calls[1][0]).toBe(true);
+
+ await sleep(5);
+
+ expect(recordSubmitting).toHaveBeenCalledTimes(3);
+ expect(recordSubmitting.mock.calls[2][0]).toBe(false);
+ });
+
+ it("should allow an alternative form api to be passed in", () => {
+ const onSubmit = jest.fn();
+ const form = createForm({ onSubmit: onSubmit });
+ const formMock = jest.spyOn(form, "registerField");
render(
{({ handleSubmit }) => (
@@ -920,24 +920,24 @@ describe('ReactFinalForm', () => {
)}
-
- )
- expect(formMock).toHaveBeenCalled()
+ ,
+ );
+ expect(formMock).toHaveBeenCalled();
// called once on first render to get initial state, and then again to subscribe
- expect(formMock).toHaveBeenCalledTimes(2)
- expect(formMock.mock.calls[0][0]).toBe('name')
- expect(formMock.mock.calls[0][2].active).toBe(true) // default subscription
- expect(formMock.mock.calls[1][0]).toBe('name')
- expect(formMock.mock.calls[1][2].active).toBe(true) // default subscription
- })
-
- it('should not destroy on unregister on initial unregister', () => {
+ expect(formMock).toHaveBeenCalledTimes(2);
+ expect(formMock.mock.calls[0][0]).toBe("name");
+ expect(formMock.mock.calls[0][2].active).toBe(true); // default subscription
+ expect(formMock.mock.calls[1][0]).toBe("name");
+ expect(formMock.mock.calls[1][2].active).toBe(true); // default subscription
+ });
+
+ it("should not destroy on unregister on initial unregister", () => {
// https://github.com/final-form/react-final-form/issues/523
const { getByTestId } = render(
{({ handleSubmit }) => (
@@ -945,28 +945,28 @@ describe('ReactFinalForm', () => {
)}
-
- )
+ ,
+ );
- expect(getByTestId('name')).toBeDefined()
- expect(getByTestId('name').value).toBe('erikras')
- fireEvent.focus(getByTestId('name'))
- expect(getByTestId('name').value).toBe('erikras')
- })
+ expect(getByTestId("name")).toBeDefined();
+ expect(getByTestId("name").value).toBe("erikras");
+ fireEvent.focus(getByTestId("name"));
+ expect(getByTestId("name").value).toBe("erikras");
+ });
- it('should not destroy on unregister on initial register/unregister of new field', () => {
+ it("should not destroy on unregister on initial register/unregister of new field", () => {
// https://github.com/final-form/react-final-form/issues/523
const { getByTestId, queryByTestId, getByText } = render(
{({ handleSubmit }) => (
- {showPassword =>
+ {(showPassword) =>
showPassword && (
{
)}
-
- )
-
- expect(getByTestId('name')).toBeDefined()
- expect(getByTestId('name').value).toBe('erikras')
- fireEvent.focus(getByTestId('name'))
- expect(getByTestId('name').value).toBe('erikras')
- expect(queryByTestId('password')).toBe(null)
- fireEvent.click(getByText('Toggle'))
- expect(getByTestId('password').value).toBe('f1nal-f0rm-RULEZ')
- fireEvent.focus(getByTestId('password'))
- expect(getByTestId('password').value).toBe('f1nal-f0rm-RULEZ')
- })
-})
+ ,
+ );
+
+ expect(getByTestId("name")).toBeDefined();
+ expect(getByTestId("name").value).toBe("erikras");
+ fireEvent.focus(getByTestId("name"));
+ expect(getByTestId("name").value).toBe("erikras");
+ expect(queryByTestId("password")).toBe(null);
+ fireEvent.click(getByText("Toggle"));
+ expect(getByTestId("password").value).toBe("f1nal-f0rm-RULEZ");
+ fireEvent.focus(getByTestId("password"));
+ expect(getByTestId("password").value).toBe("f1nal-f0rm-RULEZ");
+ });
+});
diff --git a/src/context.js b/src/context.js
index 896f5733..cd0ab9d4 100644
--- a/src/context.js
+++ b/src/context.js
@@ -1,5 +1,5 @@
// @flow
-import * as React from 'react'
-import type { FormApi } from 'final-form'
+import * as React from "react";
+import type { FormApi } from "final-form";
-export default React.createContext>()
+export default React.createContext>();
diff --git a/src/getValue.js b/src/getValue.js
index 6de52120..7f779795 100644
--- a/src/getValue.js
+++ b/src/getValue.js
@@ -1,67 +1,69 @@
// @flow
-const getSelectedValues = options => {
- const result = []
+const getSelectedValues = (options) => {
+ const result = [];
if (options) {
for (let index = 0; index < options.length; index++) {
- const option = options[index]
+ const option = options[index];
if (option.selected) {
- result.push(option.value)
+ result.push(option.value);
}
}
}
- return result
-}
+ return result;
+};
const getValue = (
event: SyntheticInputEvent<*>,
currentValue: any,
valueProp: any,
- isReactNative: boolean
+ isReactNative: boolean,
) => {
if (
!isReactNative &&
event.nativeEvent &&
(event.nativeEvent: Object).text !== undefined
) {
- return (event.nativeEvent: Object).text
+ return (event.nativeEvent: Object).text;
}
if (isReactNative && event.nativeEvent) {
- return (event.nativeEvent: any).text
+ return (event.nativeEvent: any).text;
}
- const detypedEvent: any = event
- const { target: { type, value, checked } } = detypedEvent
+ const detypedEvent: any = event;
+ const {
+ target: { type, value, checked },
+ } = detypedEvent;
switch (type) {
- case 'checkbox':
+ case "checkbox":
if (valueProp !== undefined) {
// we are maintaining an array, not just a boolean
if (checked) {
// add value to current array value
return Array.isArray(currentValue)
? currentValue.concat(valueProp)
- : [valueProp]
+ : [valueProp];
} else {
// remove value from current array value
if (!Array.isArray(currentValue)) {
- return currentValue
+ return currentValue;
}
- const index = currentValue.indexOf(valueProp)
+ const index = currentValue.indexOf(valueProp);
if (index < 0) {
- return currentValue
+ return currentValue;
} else {
return currentValue
.slice(0, index)
- .concat(currentValue.slice(index + 1))
+ .concat(currentValue.slice(index + 1));
}
}
} else {
// it's just a boolean
- return !!checked
+ return !!checked;
}
- case 'select-multiple':
- return getSelectedValues((event.target: any).options)
+ case "select-multiple":
+ return getSelectedValues((event.target: any).options);
default:
- return value
+ return value;
}
-}
+};
-export default getValue
+export default getValue;
diff --git a/src/getValue.test.js b/src/getValue.test.js
index 6809d762..80a21377 100644
--- a/src/getValue.test.js
+++ b/src/getValue.test.js
@@ -1,286 +1,286 @@
-import { noop } from 'lodash'
-import getValue from './getValue'
+import { noop } from "lodash";
+import getValue from "./getValue";
-describe('getValue', () => {
- it('should return event.nativeEvent.text if defined and not react-native', () => {
+describe("getValue", () => {
+ it("should return event.nativeEvent.text if defined and not react-native", () => {
expect(
getValue(
{
preventDefault: noop,
stopPropagation: noop,
nativeEvent: {
- text: 'foo'
- }
+ text: "foo",
+ },
},
undefined,
undefined,
- false
- )
- ).toBe('foo')
- })
+ false,
+ ),
+ ).toBe("foo");
+ });
- it('should return event.nativeEvent.text if react-native', () => {
+ it("should return event.nativeEvent.text if react-native", () => {
expect(
getValue(
{
preventDefault: noop,
stopPropagation: noop,
nativeEvent: {
- text: 'foo'
- }
+ text: "foo",
+ },
},
undefined,
undefined,
- true
- )
- ).toBe('foo')
+ true,
+ ),
+ ).toBe("foo");
expect(
getValue(
{
preventDefault: noop,
stopPropagation: noop,
nativeEvent: {
- text: undefined
- }
+ text: undefined,
+ },
},
undefined,
undefined,
- true
- )
- ).toBe(undefined)
+ true,
+ ),
+ ).toBe(undefined);
expect(
getValue(
{
preventDefault: noop,
stopPropagation: noop,
nativeEvent: {
- text: null
- }
+ text: null,
+ },
},
undefined,
undefined,
- true
- )
- ).toBe(null)
- })
+ true,
+ ),
+ ).toBe(null);
+ });
- it('should return event.target.checked if checkbox with no value parameter', () => {
+ it("should return event.target.checked if checkbox with no value parameter", () => {
expect(
getValue(
{
preventDefault: noop,
stopPropagation: noop,
target: {
- type: 'checkbox',
- checked: true
- }
+ type: "checkbox",
+ checked: true,
+ },
},
undefined,
undefined,
- true
- )
- ).toBe(true)
+ true,
+ ),
+ ).toBe(true);
expect(
getValue(
{
preventDefault: noop,
stopPropagation: noop,
target: {
- type: 'checkbox',
- checked: true
- }
+ type: "checkbox",
+ checked: true,
+ },
},
undefined,
undefined,
- false
- )
- ).toBe(true)
+ false,
+ ),
+ ).toBe(true);
expect(
getValue(
{
preventDefault: noop,
stopPropagation: noop,
target: {
- type: 'checkbox',
- checked: undefined
- }
+ type: "checkbox",
+ checked: undefined,
+ },
},
undefined,
undefined,
- true
- )
- ).toBe(false)
+ true,
+ ),
+ ).toBe(false);
expect(
getValue(
{
preventDefault: noop,
stopPropagation: noop,
target: {
- type: 'checkbox',
- checked: undefined
- }
+ type: "checkbox",
+ checked: undefined,
+ },
},
undefined,
undefined,
- false
- )
- ).toBe(false)
- })
+ false,
+ ),
+ ).toBe(false);
+ });
- it('should return add or remove the value to an array if checkbox with value parameter', () => {
+ it("should return add or remove the value to an array if checkbox with value parameter", () => {
expect(
getValue(
{
preventDefault: noop,
stopPropagation: noop,
target: {
- type: 'checkbox',
- checked: true
- }
+ type: "checkbox",
+ checked: true,
+ },
},
undefined,
- 'foo',
- false
- )
- ).toEqual(['foo'])
+ "foo",
+ false,
+ ),
+ ).toEqual(["foo"]);
expect(
getValue(
{
preventDefault: noop,
stopPropagation: noop,
target: {
- type: 'checkbox',
- checked: true
- }
+ type: "checkbox",
+ checked: true,
+ },
},
- ['A', 'B'],
- 'C',
- false
- )
- ).toEqual(['A', 'B', 'C'])
+ ["A", "B"],
+ "C",
+ false,
+ ),
+ ).toEqual(["A", "B", "C"]);
expect(
getValue(
{
preventDefault: noop,
stopPropagation: noop,
target: {
- type: 'checkbox',
- checked: false
- }
+ type: "checkbox",
+ checked: false,
+ },
},
- ['foo'],
- 'foo',
- false
- )
- ).toEqual([])
+ ["foo"],
+ "foo",
+ false,
+ ),
+ ).toEqual([]);
expect(
getValue(
{
preventDefault: noop,
stopPropagation: noop,
target: {
- type: 'checkbox',
- checked: false
- }
+ type: "checkbox",
+ checked: false,
+ },
},
- ['A', 'B', 'C'],
- 'B',
- false
- )
- ).toEqual(['A', 'C'])
+ ["A", "B", "C"],
+ "B",
+ false,
+ ),
+ ).toEqual(["A", "C"]);
expect(
getValue(
{
preventDefault: noop,
stopPropagation: noop,
target: {
- type: 'checkbox',
- checked: false
- }
+ type: "checkbox",
+ checked: false,
+ },
},
- ['A', 'B', 'C'],
- 'F',
- false
- )
- ).toEqual(['A', 'B', 'C'])
+ ["A", "B", "C"],
+ "F",
+ false,
+ ),
+ ).toEqual(["A", "B", "C"]);
expect(
getValue(
{
preventDefault: noop,
stopPropagation: noop,
target: {
- type: 'checkbox',
- checked: false
- }
+ type: "checkbox",
+ checked: false,
+ },
},
undefined,
- 'F',
- false
- )
- ).toBeUndefined()
- })
+ "F",
+ false,
+ ),
+ ).toBeUndefined();
+ });
- it('should return a number type for numeric inputs, when a value is set', () => {
+ it("should return a number type for numeric inputs, when a value is set", () => {
expect(
getValue(
{
preventDefault: noop,
stopPropagation: noop,
target: {
- type: 'number',
- value: '3.1415'
- }
+ type: "number",
+ value: "3.1415",
+ },
},
undefined,
undefined,
- true
- )
- ).toBe('3.1415')
+ true,
+ ),
+ ).toBe("3.1415");
expect(
getValue(
{
preventDefault: noop,
stopPropagation: noop,
target: {
- type: 'range',
- value: '2.71828'
- }
+ type: "range",
+ value: "2.71828",
+ },
},
undefined,
undefined,
- true
- )
- ).toBe('2.71828')
+ true,
+ ),
+ ).toBe("2.71828");
expect(
getValue(
{
preventDefault: noop,
stopPropagation: noop,
target: {
- type: 'number',
- value: '3'
- }
+ type: "number",
+ value: "3",
+ },
},
undefined,
undefined,
- false
- )
- ).toBe('3')
+ false,
+ ),
+ ).toBe("3");
expect(
getValue(
{
preventDefault: noop,
stopPropagation: noop,
target: {
- type: 'range',
- value: '3.1415'
- }
+ type: "range",
+ value: "3.1415",
+ },
},
undefined,
undefined,
- false
- )
- ).toBe('3.1415')
+ false,
+ ),
+ ).toBe("3.1415");
expect(
getValue(
@@ -288,240 +288,240 @@ describe('getValue', () => {
preventDefault: noop,
stopPropagation: noop,
target: {
- type: 'range',
- value: ''
- }
+ type: "range",
+ value: "",
+ },
},
undefined,
undefined,
- false
- )
- ).toBe('')
- })
+ false,
+ ),
+ ).toBe("");
+ });
- it('should return selected options if is a multiselect', () => {
+ it("should return selected options if is a multiselect", () => {
const options = [
- { selected: true, value: 'foo' },
- { selected: true, value: 'bar' },
- { selected: false, value: 'baz' }
- ]
+ { selected: true, value: "foo" },
+ { selected: true, value: "bar" },
+ { selected: false, value: "baz" },
+ ];
const expected = options
- .filter(option => option.selected)
- .map(option => option.value)
+ .filter((option) => option.selected)
+ .map((option) => option.value);
expect(
getValue(
{
preventDefault: noop,
stopPropagation: noop,
target: {
- type: 'select-multiple',
- options
- }
+ type: "select-multiple",
+ options,
+ },
},
undefined,
undefined,
- true
- )
- ).toEqual(expected)
+ true,
+ ),
+ ).toEqual(expected);
expect(
getValue(
{
preventDefault: noop,
stopPropagation: noop,
target: {
- type: 'select-multiple'
- }
+ type: "select-multiple",
+ },
},
undefined,
undefined,
- false
- )
- ).toEqual([]) // no options specified
+ false,
+ ),
+ ).toEqual([]); // no options specified
expect(
getValue(
{
preventDefault: noop,
stopPropagation: noop,
target: {
- type: 'select-multiple',
- options
- }
+ type: "select-multiple",
+ options,
+ },
},
undefined,
undefined,
- false
- )
- ).toEqual(expected)
- })
+ false,
+ ),
+ ).toEqual(expected);
+ });
- it('should return event.target.value if not file or checkbox', () => {
+ it("should return event.target.value if not file or checkbox", () => {
expect(
getValue(
{
preventDefault: noop,
stopPropagation: noop,
target: {
- value: undefined
- }
+ value: undefined,
+ },
},
undefined,
undefined,
- true
- )
- ).toBe(undefined)
+ true,
+ ),
+ ).toBe(undefined);
expect(
getValue(
{
preventDefault: noop,
stopPropagation: noop,
target: {
- value: undefined
- }
+ value: undefined,
+ },
},
undefined,
undefined,
- false
- )
- ).toBe(undefined)
+ false,
+ ),
+ ).toBe(undefined);
expect(
getValue(
{
preventDefault: noop,
stopPropagation: noop,
target: {
- value: null
- }
+ value: null,
+ },
},
undefined,
undefined,
- true
- )
- ).toBe(null)
+ true,
+ ),
+ ).toBe(null);
expect(
getValue(
{
preventDefault: noop,
stopPropagation: noop,
target: {
- value: null
- }
+ value: null,
+ },
},
undefined,
undefined,
- false
- )
- ).toBe(null)
+ false,
+ ),
+ ).toBe(null);
expect(
getValue(
{
preventDefault: noop,
stopPropagation: noop,
target: {
- value: true
- }
+ value: true,
+ },
},
undefined,
undefined,
- true
- )
- ).toBe(true)
+ true,
+ ),
+ ).toBe(true);
expect(
getValue(
{
preventDefault: noop,
stopPropagation: noop,
target: {
- value: true
- }
+ value: true,
+ },
},
undefined,
undefined,
- false
- )
- ).toBe(true)
+ false,
+ ),
+ ).toBe(true);
expect(
getValue(
{
preventDefault: noop,
stopPropagation: noop,
target: {
- value: false
- }
+ value: false,
+ },
},
undefined,
undefined,
- true
- )
- ).toBe(false)
+ true,
+ ),
+ ).toBe(false);
expect(
getValue(
{
preventDefault: noop,
stopPropagation: noop,
target: {
- value: false
- }
+ value: false,
+ },
},
undefined,
undefined,
- false
- )
- ).toBe(false)
+ false,
+ ),
+ ).toBe(false);
expect(
getValue(
{
preventDefault: noop,
stopPropagation: noop,
target: {
- value: 42
- }
+ value: 42,
+ },
},
undefined,
undefined,
- true
- )
- ).toBe(42)
+ true,
+ ),
+ ).toBe(42);
expect(
getValue(
{
preventDefault: noop,
stopPropagation: noop,
target: {
- value: 42
- }
+ value: 42,
+ },
},
undefined,
undefined,
- false
- )
- ).toBe(42)
+ false,
+ ),
+ ).toBe(42);
expect(
getValue(
{
preventDefault: noop,
stopPropagation: noop,
target: {
- value: 'foo'
- }
+ value: "foo",
+ },
},
undefined,
undefined,
- true
- )
- ).toBe('foo')
+ true,
+ ),
+ ).toBe("foo");
expect(
getValue(
{
preventDefault: noop,
stopPropagation: noop,
target: {
- value: 'foo'
- }
+ value: "foo",
+ },
},
undefined,
undefined,
- false
- )
- ).toBe('foo')
- })
-})
+ false,
+ ),
+ ).toBe("foo");
+ });
+});
diff --git a/src/getters.js b/src/getters.js
index 9f81c2d0..16cf55ba 100644
--- a/src/getters.js
+++ b/src/getters.js
@@ -1,61 +1,61 @@
-import type { FormState, FieldState } from 'final-form'
+import type { FormState, FieldState } from "final-form";
const addLazyState = (dest: Object, state: Object, keys: string[]): void => {
- keys.forEach(key => {
+ keys.forEach((key) => {
Object.defineProperty(dest, key, {
get: () => state[key],
- enumerable: true
- })
- })
-}
+ enumerable: true,
+ });
+ });
+};
export const addLazyFormState = (dest: Object, state: FormState): void =>
addLazyState(dest, state, [
- 'active',
- 'dirty',
- 'dirtyFields',
- 'dirtySinceLastSubmit',
- 'dirtyFieldsSinceLastSubmit',
- 'error',
- 'errors',
- 'hasSubmitErrors',
- 'hasValidationErrors',
- 'initialValues',
- 'invalid',
- 'modified',
- 'modifiedSinceLastSubmit',
- 'pristine',
- 'submitError',
- 'submitErrors',
- 'submitFailed',
- 'submitSucceeded',
- 'submitting',
- 'touched',
- 'valid',
- 'validating',
- 'values',
- 'visited'
- ])
+ "active",
+ "dirty",
+ "dirtyFields",
+ "dirtySinceLastSubmit",
+ "dirtyFieldsSinceLastSubmit",
+ "error",
+ "errors",
+ "hasSubmitErrors",
+ "hasValidationErrors",
+ "initialValues",
+ "invalid",
+ "modified",
+ "modifiedSinceLastSubmit",
+ "pristine",
+ "submitError",
+ "submitErrors",
+ "submitFailed",
+ "submitSucceeded",
+ "submitting",
+ "touched",
+ "valid",
+ "validating",
+ "values",
+ "visited",
+ ]);
export const addLazyFieldMetaState = (dest: Object, state: FieldState): void =>
addLazyState(dest, state, [
- 'active',
- 'data',
- 'dirty',
- 'dirtySinceLastSubmit',
- 'error',
- 'initial',
- 'invalid',
- 'length',
- 'modified',
- 'modifiedSinceLastSubmit',
- 'pristine',
- 'submitError',
- 'submitFailed',
- 'submitSucceeded',
- 'submitting',
- 'touched',
- 'valid',
- 'validating',
- 'visited'
- ])
+ "active",
+ "data",
+ "dirty",
+ "dirtySinceLastSubmit",
+ "error",
+ "initial",
+ "invalid",
+ "length",
+ "modified",
+ "modifiedSinceLastSubmit",
+ "pristine",
+ "submitError",
+ "submitFailed",
+ "submitSucceeded",
+ "submitting",
+ "touched",
+ "valid",
+ "validating",
+ "visited",
+ ]);
diff --git a/src/index.js b/src/index.js
index eac6a858..11511b77 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,12 +1,12 @@
// @flow
-import Form from './ReactFinalForm'
-import FormSpy from './FormSpy'
-export { default as Field } from './Field'
-export { default as Form, version } from './ReactFinalForm'
-export { default as FormSpy } from './FormSpy'
-export { default as useField } from './useField'
-export { default as useFormState } from './useFormState'
-export { default as useForm } from './useForm'
+import Form from "./ReactFinalForm";
+import FormSpy from "./FormSpy";
+export { default as Field } from "./Field";
+export { default as Form, version } from "./ReactFinalForm";
+export { default as FormSpy } from "./FormSpy";
+export { default as useField } from "./useField";
+export { default as useFormState } from "./useFormState";
+export { default as useForm } from "./useForm";
export function withTypes() {
- return { Form, FormSpy }
+ return { Form, FormSpy };
}
diff --git a/src/index.js.flow b/src/index.js.flow
index 1b89f370..9e29bab1 100644
--- a/src/index.js.flow
+++ b/src/index.js.flow
@@ -1,14 +1,14 @@
// @flow
-import * as React from 'react'
-import type { FormApi, FormState, FormValuesShape } from 'final-form'
+import * as React from "react";
+import type { FormApi, FormState, FormValuesShape } from "final-form";
import type {
FieldProps,
FieldRenderProps,
FormProps,
FormSpyProps,
UseFieldConfig,
- UseFormStateParams
-} from './types'
+ UseFormStateParams,
+} from "./types";
export type {
FieldProps,
@@ -16,24 +16,24 @@ export type {
FormProps,
FormRenderProps,
FormSpyProps,
- FormSpyRenderProps
-} from './types'
+ FormSpyRenderProps,
+} from "./types";
-declare export var Field: React.ComponentType
-declare export var Form: React.ComponentType>
-declare export var FormSpy: React.ComponentType>
+declare export var Field: React.ComponentType;
+declare export var Form: React.ComponentType>;
+declare export var FormSpy: React.ComponentType>;
declare export function useForm(
- componentName?: string
-): FormApi
+ componentName?: string,
+): FormApi;
declare export function useFormState(
- params?: UseFormStateParams
-): FormState
+ params?: UseFormStateParams,
+): FormState;
declare export var useField: (
name: string,
- config?: UseFieldConfig
-) => FieldRenderProps
+ config?: UseFieldConfig,
+) => FieldRenderProps;
declare export function withTypes(): {
Form: React.ComponentType>,
- FormSpy: React.ComponentType>
-}
-declare export var version: string
+ FormSpy: React.ComponentType>,
+};
+declare export var version: string;
diff --git a/src/isReactNative.js b/src/isReactNative.js
index 95634d95..beba770e 100644
--- a/src/isReactNative.js
+++ b/src/isReactNative.js
@@ -1,8 +1,8 @@
// @flow
const isReactNative =
- typeof window !== 'undefined' &&
+ typeof window !== "undefined" &&
window.navigator &&
window.navigator.product &&
- window.navigator.product === 'ReactNative'
+ window.navigator.product === "ReactNative";
-export default isReactNative
+export default isReactNative;
diff --git a/src/isSyntheticEvent.js b/src/isSyntheticEvent.js
index 34998512..25670cbe 100644
--- a/src/isSyntheticEvent.js
+++ b/src/isSyntheticEvent.js
@@ -1,5 +1,5 @@
// @flow
const isSyntheticEvent = (candidate: any): boolean =>
- !!(candidate && typeof candidate.stopPropagation === 'function')
+ !!(candidate && typeof candidate.stopPropagation === "function");
-export default isSyntheticEvent
+export default isSyntheticEvent;
diff --git a/src/renderComponent.js b/src/renderComponent.js
index b2a57764..6120cb03 100644
--- a/src/renderComponent.js
+++ b/src/renderComponent.js
@@ -1,36 +1,36 @@
// @flow
-import * as React from 'react'
-import type { RenderableProps } from './types'
+import * as React from "react";
+import type { RenderableProps } from "./types";
// shared logic between components that use either render prop,
// children render function, or component prop
export default function renderComponent(
props: RenderableProps & T,
lazyProps: Object,
- name: string
+ name: string,
): React.Node {
- const { render, children, component, ...rest } = props
+ const { render, children, component, ...rest } = props;
if (component) {
return React.createElement(
component,
Object.assign(lazyProps, rest, {
children,
- render
- })
- )
+ render,
+ }),
+ );
}
if (render) {
return render(
children === undefined
? Object.assign(lazyProps, rest)
: // inject children back in
- Object.assign(lazyProps, rest, { children })
- )
+ Object.assign(lazyProps, rest, { children }),
+ );
}
- if (typeof children !== 'function') {
+ if (typeof children !== "function") {
throw new Error(
- `Must specify either a render prop, a render function as children, or a component prop to ${name}`
- )
+ `Must specify either a render prop, a render function as children, or a component prop to ${name}`,
+ );
}
- return children(Object.assign(lazyProps, rest))
+ return children(Object.assign(lazyProps, rest));
}
diff --git a/src/renderComponent.test.js b/src/renderComponent.test.js
index 74a1267c..b584b7ae 100644
--- a/src/renderComponent.test.js
+++ b/src/renderComponent.test.js
@@ -1,72 +1,72 @@
-import renderComponent from './renderComponent'
+import renderComponent from "./renderComponent";
-describe('renderComponent', () => {
- it('should pass both render and children prop', () => {
- const children = 'some children'
- const render = () => {}
+describe("renderComponent", () => {
+ it("should pass both render and children prop", () => {
+ const children = "some children";
+ const render = () => {};
const props = {
component: () => null,
children,
- render
- }
- const name = 'TestComponent'
- const result = renderComponent(props, {}, name)
- expect(result.props).toEqual({ children, render })
- })
+ render,
+ };
+ const name = "TestComponent";
+ const result = renderComponent(props, {}, name);
+ expect(result.props).toEqual({ children, render });
+ });
- it('should include children when rendering with render', () => {
- const children = 'some children'
- const render = jest.fn()
+ it("should include children when rendering with render", () => {
+ const children = "some children";
+ const render = jest.fn();
const props = {
children,
- render
- }
- const name = 'TestComponent'
- renderComponent(props, {}, name)
- expect(render).toHaveBeenCalled()
- expect(render).toHaveBeenCalledTimes(1)
- expect(render.mock.calls[0][0].children).toBe(children)
- })
+ render,
+ };
+ const name = "TestComponent";
+ renderComponent(props, {}, name);
+ expect(render).toHaveBeenCalled();
+ expect(render).toHaveBeenCalledTimes(1);
+ expect(render.mock.calls[0][0].children).toBe(children);
+ });
- it('should throw error if no render strategy is provided', () => {
- const children = 'some children'
+ it("should throw error if no render strategy is provided", () => {
+ const children = "some children";
const props = {
- children
- }
- const name = 'TestComponent'
+ children,
+ };
+ const name = "TestComponent";
expect(() => renderComponent(props, {}, name)).toThrow(
- `Must specify either a render prop, a render function as children, or a component prop to ${name}`
- )
- })
+ `Must specify either a render prop, a render function as children, or a component prop to ${name}`,
+ );
+ });
- it('should not evaluate any of the keys given in the second argument', () => {
- const children = 'some children'
- const render = jest.fn()
+ it("should not evaluate any of the keys given in the second argument", () => {
+ const children = "some children";
+ const render = jest.fn();
const props = {
children,
- render
- }
- const getA = jest.fn()
- const getB = jest.fn()
- const name = 'TestComponent'
+ render,
+ };
+ const getA = jest.fn();
+ const getB = jest.fn();
+ const name = "TestComponent";
renderComponent(
props,
{
get a() {
- getA()
- return 1
+ getA();
+ return 1;
},
get b() {
- getB()
- return 2
- }
+ getB();
+ return 2;
+ },
},
- name
- )
- expect(render).toHaveBeenCalled()
- expect(render).toHaveBeenCalledTimes(1)
- expect(render.mock.calls[0][0].children).toBe(children)
- expect(getA).not.toHaveBeenCalled()
- expect(getB).not.toHaveBeenCalled()
- })
-})
+ name,
+ );
+ expect(render).toHaveBeenCalled();
+ expect(render).toHaveBeenCalledTimes(1);
+ expect(render.mock.calls[0][0].children).toBe(children);
+ expect(getA).not.toHaveBeenCalled();
+ expect(getB).not.toHaveBeenCalled();
+ });
+});
diff --git a/src/shallowEqual.js b/src/shallowEqual.js
index 2b22bf16..27f4d824 100644
--- a/src/shallowEqual.js
+++ b/src/shallowEqual.js
@@ -1,24 +1,24 @@
// @flow
const shallowEqual = (a: any, b: any): boolean => {
if (a === b) {
- return true
+ return true;
}
- if (typeof a !== 'object' || !a || typeof b !== 'object' || !b) {
- return false
+ if (typeof a !== "object" || !a || typeof b !== "object" || !b) {
+ return false;
}
- var keysA = Object.keys(a)
- var keysB = Object.keys(b)
+ var keysA = Object.keys(a);
+ var keysB = Object.keys(b);
if (keysA.length !== keysB.length) {
- return false
+ return false;
}
- var bHasOwnProperty = Object.prototype.hasOwnProperty.bind(b)
+ var bHasOwnProperty = Object.prototype.hasOwnProperty.bind(b);
for (var idx = 0; idx < keysA.length; idx++) {
- var key = keysA[idx]
+ var key = keysA[idx];
if (!bHasOwnProperty(key) || a[key] !== b[key]) {
- return false
+ return false;
}
}
- return true
-}
+ return true;
+};
-export default shallowEqual
+export default shallowEqual;
diff --git a/src/shallowEqual.test.js b/src/shallowEqual.test.js
index f22382f7..3f5587d9 100644
--- a/src/shallowEqual.test.js
+++ b/src/shallowEqual.test.js
@@ -1,60 +1,60 @@
-import shallowEqual from './shallowEqual'
+import shallowEqual from "./shallowEqual";
-describe('shallowEqual', () => {
- it('returns false if either argument is null', () => {
- expect(shallowEqual(null, {})).toBe(false)
- expect(shallowEqual({}, null)).toBe(false)
- })
+describe("shallowEqual", () => {
+ it("returns false if either argument is null", () => {
+ expect(shallowEqual(null, {})).toBe(false);
+ expect(shallowEqual({}, null)).toBe(false);
+ });
- it('returns true if both arguments are null or undefined', () => {
- expect(shallowEqual(null, null)).toBe(true)
- expect(shallowEqual(undefined, undefined)).toBe(true)
- })
+ it("returns true if both arguments are null or undefined", () => {
+ expect(shallowEqual(null, null)).toBe(true);
+ expect(shallowEqual(undefined, undefined)).toBe(true);
+ });
- it('returns true if arguments are shallow equal', () => {
- expect(shallowEqual({ a: 1, b: 2, c: 3 }, { a: 1, b: 2, c: 3 })).toBe(true)
- })
+ it("returns true if arguments are shallow equal", () => {
+ expect(shallowEqual({ a: 1, b: 2, c: 3 }, { a: 1, b: 2, c: 3 })).toBe(true);
+ });
- it('returns false if arguments are not objects and not equal', () => {
- expect(shallowEqual(1, 2)).toBe(false)
- })
+ it("returns false if arguments are not objects and not equal", () => {
+ expect(shallowEqual(1, 2)).toBe(false);
+ });
- it('returns false if only one argument is not an object', () => {
- expect(shallowEqual(1, {})).toBe(false)
- })
+ it("returns false if only one argument is not an object", () => {
+ expect(shallowEqual(1, {})).toBe(false);
+ });
- it('returns false if first argument has too many keys', () => {
- expect(shallowEqual({ a: 1, b: 2, c: 3 }, { a: 1, b: 2 })).toBe(false)
- })
+ it("returns false if first argument has too many keys", () => {
+ expect(shallowEqual({ a: 1, b: 2, c: 3 }, { a: 1, b: 2 })).toBe(false);
+ });
- it('returns false if second argument has too many keys', () => {
- expect(shallowEqual({ a: 1, b: 2 }, { a: 1, b: 2, c: 3 })).toBe(false)
- })
+ it("returns false if second argument has too many keys", () => {
+ expect(shallowEqual({ a: 1, b: 2 }, { a: 1, b: 2, c: 3 })).toBe(false);
+ });
- it('returns true if values are not primitives but are ===', () => {
- let obj = {}
+ it("returns true if values are not primitives but are ===", () => {
+ let obj = {};
expect(shallowEqual({ a: 1, b: 2, c: obj }, { a: 1, b: 2, c: obj })).toBe(
- true
- )
- })
+ true,
+ );
+ });
- it('returns false if arguments are not shallow equal', () => {
+ it("returns false if arguments are not shallow equal", () => {
expect(shallowEqual({ a: 1, b: 2, c: {} }, { a: 1, b: 2, c: {} })).toBe(
- false
- )
- })
+ false,
+ );
+ });
- it('should treat objects created by `Object.create(null)` like any other plain object', () => {
+ it("should treat objects created by `Object.create(null)` like any other plain object", () => {
function Foo() {
- this.a = 1
+ this.a = 1;
}
- Foo.prototype.constructor = null
+ Foo.prototype.constructor = null;
- const object2 = { a: 1 }
- expect(shallowEqual(new Foo(), object2)).toBe(true)
+ const object2 = { a: 1 };
+ expect(shallowEqual(new Foo(), object2)).toBe(true);
- const object1 = Object.create(null)
- object1.a = 1
- expect(shallowEqual(object1, object2)).toBe(true)
- })
-})
+ const object1 = Object.create(null);
+ object1.a = 1;
+ expect(shallowEqual(object1, object2)).toBe(true);
+ });
+});
diff --git a/src/testUtils.js b/src/testUtils.js
index dae4c426..acef18ba 100644
--- a/src/testUtils.js
+++ b/src/testUtils.js
@@ -1,27 +1,29 @@
-import React from 'react'
+import React from "react";
-export const wrapWith = (mock, fn) => (...args) => {
- mock(...args)
- return fn(...args)
-}
+export const wrapWith =
+ (mock, fn) =>
+ (...args) => {
+ mock(...args);
+ return fn(...args);
+ };
/** A simple container component that allows boolean to be toggled with a button */
export function Toggle({ children }) {
- const [on, setOn] = React.useState(false)
+ const [on, setOn] = React.useState(false);
return (
{children(on)}
setOn(!on)}>Toggle
- )
+ );
}
export class ErrorBoundary extends React.Component {
componentDidCatch(error) {
- this.props.spy(error)
+ this.props.spy(error);
}
render() {
- return this.props.children
+ return this.props.children;
}
}
diff --git a/src/types.js.flow b/src/types.js.flow
index de029393..9c404ed2 100644
--- a/src/types.js.flow
+++ b/src/types.js.flow
@@ -1,5 +1,5 @@
// @flow
-import * as React from 'react'
+import * as React from "react";
import type {
FormApi,
Config,
@@ -8,14 +8,14 @@ import type {
FormSubscription,
FormValuesShape,
FieldSubscription,
- FieldValidator
-} from 'final-form'
+ FieldValidator,
+} from "final-form";
-type SupportedInputs = 'input' | 'select' | 'textarea'
+type SupportedInputs = "input" | "select" | "textarea";
export type ReactContext = {
- reactFinalForm: FormApi
-}
+ reactFinalForm: FormApi,
+};
export type FieldInputProps = {
name: string,
@@ -25,8 +25,8 @@ export type FieldInputProps = {
value: any,
type?: string,
checked?: boolean,
- multiple?: boolean
-}
+ multiple?: boolean,
+};
export type FieldRenderProps = {
input: FieldInputProps,
meta: {
@@ -48,47 +48,47 @@ export type FieldRenderProps = {
touched?: boolean,
valid?: boolean,
validating?: boolean,
- visited?: boolean
- }
-}
+ visited?: boolean,
+ },
+};
export type SubmitEvent = {
- preventDefault?: $PropertyType, 'preventDefault'>,
+ preventDefault?: $PropertyType, "preventDefault">,
stopPropagation?: $PropertyType<
SyntheticEvent,
- 'stopPropagation'
- >
-}
+ "stopPropagation",
+ >,
+};
export type FormRenderProps = {
handleSubmit: (?SubmitEvent) => ?Promise,
- form: FormApi
-} & FormState
+ form: FormApi,
+} & FormState;
export type FormSpyRenderProps = {
- form: FormApi
-} & FormState
+ form: FormApi,
+} & FormState;
export type RenderableProps = {
component?: React.ComponentType<*> | SupportedInputs,
children?: ((props: T) => React.Node) | React.Node,
- render?: (props: T) => React.Node
-}
+ render?: (props: T) => React.Node,
+};
export type FormProps = {
subscription?: FormSubscription,
decorators?: Decorator[],
form?: FormApi,
- initialValuesEqual?: (?Object, ?Object) => boolean
+ initialValuesEqual?: (?Object, ?Object) => boolean,
} & Config &
- RenderableProps>
+ RenderableProps>;
export type UseFieldAutoConfig = {
afterSubmit?: () => void,
allowNull?: boolean,
beforeSubmit?: () => void | false,
- children?: $PropertyType, 'children'>,
- component?: $PropertyType, 'component'>,
+ children?: $PropertyType, "children">,
+ component?: $PropertyType, "component">,
data?: Object,
defaultValue?: any,
format?: (value: any, name: string) => any,
@@ -100,27 +100,26 @@ export type UseFieldAutoConfig = {
type?: string,
validate?: FieldValidator,
validateFields?: string[],
- value?: any
-}
+ value?: any,
+};
export type UseFieldConfig = {
- subscription?: FieldSubscription
-} & UseFieldAutoConfig
+ subscription?: FieldSubscription,
+} & UseFieldAutoConfig;
export type FieldProps = UseFieldConfig & {
- name: string
-} & RenderableProps
+ name: string,
+} & RenderableProps;
export type UseFormStateParams = {
onChange?: (formState: FormState) => void,
- subscription?: FormSubscription
-}
+ subscription?: FormSubscription,
+};
-export type FormSpyProps<
- FormValues: FormValuesShape
-> = UseFormStateParams &
- RenderableProps>
+export type FormSpyProps =
+ UseFormStateParams &
+ RenderableProps>;
export type FormSpyPropsWithForm = {
- reactFinalForm: FormApi
-} & FormSpyProps
+ reactFinalForm: FormApi,
+} & FormSpyProps;
diff --git a/src/useConstant.js b/src/useConstant.js
index 929be24b..e71931ee 100644
--- a/src/useConstant.js
+++ b/src/useConstant.js
@@ -1,5 +1,5 @@
// @flow
-import React from 'react'
+import React from "react";
/**
* A simple hook to create a constant value that lives for
@@ -14,9 +14,9 @@ import React from 'react'
* @param {Function} init - A function to generate the value
*/
export default function useConstant(init: () => T): T {
- const ref = React.useRef()
+ const ref = React.useRef();
if (!ref.current) {
- ref.current = init()
+ ref.current = init();
}
- return ref.current
+ return ref.current;
}
diff --git a/src/useConstantCallback.js b/src/useConstantCallback.js
index 0651f8ab..24c0463c 100644
--- a/src/useConstantCallback.js
+++ b/src/useConstantCallback.js
@@ -1,5 +1,5 @@
// @flow
-import * as React from 'react'
+import * as React from "react";
/**
* Creates a callback, even with closures, that will be
@@ -8,9 +8,9 @@ import * as React from 'react'
* closures.
*/
export default function useConstantCallback(callback) {
- const ref = React.useRef(callback)
+ const ref = React.useRef(callback);
React.useEffect(() => {
- ref.current = callback
- })
- return React.useCallback((...args) => ref.current.apply(null, args), [])
+ ref.current = callback;
+ });
+ return React.useCallback((...args) => ref.current.apply(null, args), []);
}
diff --git a/src/useConstantCallback.test.js b/src/useConstantCallback.test.js
index b8c9bc86..bc8ca8e5 100644
--- a/src/useConstantCallback.test.js
+++ b/src/useConstantCallback.test.js
@@ -1,25 +1,25 @@
// @flow
-import * as React from 'react'
-import { render, cleanup } from '@testing-library/react'
-import '@testing-library/jest-dom/extend-expect'
-import useConstantCallback from './useConstantCallback'
+import * as React from "react";
+import { render, cleanup } from "@testing-library/react";
+import "@testing-library/jest-dom/extend-expect";
+import useConstantCallback from "./useConstantCallback";
-describe('useConstantCallback', () => {
- afterEach(cleanup)
+describe("useConstantCallback", () => {
+ afterEach(cleanup);
- it('should give the same instance on every render, even as params/deps change', () => {
- const callback = jest.fn()
+ it("should give the same instance on every render, even as params/deps change", () => {
+ const callback = jest.fn();
const MyComponent = () => {
- const [name, setName] = React.useState('John')
- const [age, setAge] = React.useState(20)
- const [isAdmin, setAdmin] = React.useState(false)
- const constantCallback = useConstantCallback(time => {
- expect(typeof time).toBe('number')
- callback(name, age, isAdmin)
- })
- const callbackRef = React.useRef(constantCallback)
- expect(callbackRef.current).toBe(constantCallback)
+ const [name, setName] = React.useState("John");
+ const [age, setAge] = React.useState(20);
+ const [isAdmin, setAdmin] = React.useState(false);
+ const constantCallback = useConstantCallback((time) => {
+ expect(typeof time).toBe("number");
+ callback(name, age, isAdmin);
+ });
+ const callbackRef = React.useRef(constantCallback);
+ expect(callbackRef.current).toBe(constantCallback);
return (
{
>
Call
- setName('Paul')}>
+ setName("Paul")}>
{name}
setAge(25)}>
{age}
setAdmin(true)}>
- {isAdmin ? 'Yes' : 'No'}
+ {isAdmin ? "Yes" : "No"}
- )
- }
- const { getByTestId } = render( )
- const call = getByTestId('call')
- const changeName = getByTestId('changeName')
- const changeAge = getByTestId('changeAge')
- const changeAdmin = getByTestId('changeAdmin')
-
- expect(changeName).toHaveTextContent('John')
- expect(changeAge).toHaveTextContent(20)
- expect(changeAdmin).toHaveTextContent('No')
- expect(callback).not.toHaveBeenCalled()
-
- call.click()
-
- expect(callback).toHaveBeenCalled()
- expect(callback).toHaveBeenCalledTimes(1)
- expect(callback.mock.calls[0][0]).toBe('John')
- expect(callback.mock.calls[0][1]).toBe(20)
- expect(callback.mock.calls[0][2]).toBe(false)
- expect(changeName).toHaveTextContent('John')
- expect(changeAge).toHaveTextContent(20)
- expect(changeAdmin).toHaveTextContent('No')
-
- changeName.click()
-
- expect(callback).toHaveBeenCalledTimes(1)
- expect(changeName).toHaveTextContent('Paul')
- expect(changeAge).toHaveTextContent(20)
- expect(changeAdmin).toHaveTextContent('No')
-
- call.click()
-
- expect(callback).toHaveBeenCalledTimes(2)
- expect(callback.mock.calls[1][0]).toBe('Paul')
- expect(callback.mock.calls[1][1]).toBe(20)
- expect(callback.mock.calls[1][2]).toBe(false)
-
- changeAge.click()
-
- expect(callback).toHaveBeenCalledTimes(2)
- expect(changeName).toHaveTextContent('Paul')
- expect(changeAge).toHaveTextContent(25)
- expect(changeAdmin).toHaveTextContent('No')
-
- call.click()
-
- expect(callback).toHaveBeenCalledTimes(3)
- expect(callback.mock.calls[2][0]).toBe('Paul')
- expect(callback.mock.calls[2][1]).toBe(25)
- expect(callback.mock.calls[2][2]).toBe(false)
-
- changeAdmin.click()
-
- expect(callback).toHaveBeenCalledTimes(3)
- expect(changeName).toHaveTextContent('Paul')
- expect(changeAge).toHaveTextContent(25)
- expect(changeAdmin).toHaveTextContent('Yes')
-
- call.click()
-
- expect(callback).toHaveBeenCalledTimes(4)
- expect(callback.mock.calls[3][0]).toBe('Paul')
- expect(callback.mock.calls[3][1]).toBe(25)
- expect(callback.mock.calls[3][2]).toBe(true)
- })
-})
+ );
+ };
+ const { getByTestId } = render( );
+ const call = getByTestId("call");
+ const changeName = getByTestId("changeName");
+ const changeAge = getByTestId("changeAge");
+ const changeAdmin = getByTestId("changeAdmin");
+
+ expect(changeName).toHaveTextContent("John");
+ expect(changeAge).toHaveTextContent(20);
+ expect(changeAdmin).toHaveTextContent("No");
+ expect(callback).not.toHaveBeenCalled();
+
+ call.click();
+
+ expect(callback).toHaveBeenCalled();
+ expect(callback).toHaveBeenCalledTimes(1);
+ expect(callback.mock.calls[0][0]).toBe("John");
+ expect(callback.mock.calls[0][1]).toBe(20);
+ expect(callback.mock.calls[0][2]).toBe(false);
+ expect(changeName).toHaveTextContent("John");
+ expect(changeAge).toHaveTextContent(20);
+ expect(changeAdmin).toHaveTextContent("No");
+
+ changeName.click();
+
+ expect(callback).toHaveBeenCalledTimes(1);
+ expect(changeName).toHaveTextContent("Paul");
+ expect(changeAge).toHaveTextContent(20);
+ expect(changeAdmin).toHaveTextContent("No");
+
+ call.click();
+
+ expect(callback).toHaveBeenCalledTimes(2);
+ expect(callback.mock.calls[1][0]).toBe("Paul");
+ expect(callback.mock.calls[1][1]).toBe(20);
+ expect(callback.mock.calls[1][2]).toBe(false);
+
+ changeAge.click();
+
+ expect(callback).toHaveBeenCalledTimes(2);
+ expect(changeName).toHaveTextContent("Paul");
+ expect(changeAge).toHaveTextContent(25);
+ expect(changeAdmin).toHaveTextContent("No");
+
+ call.click();
+
+ expect(callback).toHaveBeenCalledTimes(3);
+ expect(callback.mock.calls[2][0]).toBe("Paul");
+ expect(callback.mock.calls[2][1]).toBe(25);
+ expect(callback.mock.calls[2][2]).toBe(false);
+
+ changeAdmin.click();
+
+ expect(callback).toHaveBeenCalledTimes(3);
+ expect(changeName).toHaveTextContent("Paul");
+ expect(changeAge).toHaveTextContent(25);
+ expect(changeAdmin).toHaveTextContent("Yes");
+
+ call.click();
+
+ expect(callback).toHaveBeenCalledTimes(4);
+ expect(callback.mock.calls[3][0]).toBe("Paul");
+ expect(callback.mock.calls[3][1]).toBe(25);
+ expect(callback.mock.calls[3][2]).toBe(true);
+ });
+});
diff --git a/src/useField.js b/src/useField.js
index 9f66363d..c6ffa686 100644
--- a/src/useField.js
+++ b/src/useField.js
@@ -1,35 +1,39 @@
// @flow
-import * as React from 'react'
-import { fieldSubscriptionItems } from 'final-form'
+import * as React from "react";
+import { fieldSubscriptionItems } from "final-form";
import type {
FieldSubscription,
FieldState,
FormApi,
- FormValuesShape
-} from 'final-form'
-import type { UseFieldConfig, FieldInputProps, FieldRenderProps } from './types'
-import isReactNative from './isReactNative'
-import getValue from './getValue'
-import useForm from './useForm'
-import useLatest from './useLatest'
-import { addLazyFieldMetaState } from './getters'
-import useConstantCallback from './useConstantCallback'
+ FormValuesShape,
+} from "final-form";
+import type {
+ UseFieldConfig,
+ FieldInputProps,
+ FieldRenderProps,
+} from "./types";
+import isReactNative from "./isReactNative";
+import getValue from "./getValue";
+import useForm from "./useForm";
+import useLatest from "./useLatest";
+import { addLazyFieldMetaState } from "./getters";
+import useConstantCallback from "./useConstantCallback";
const all: FieldSubscription = fieldSubscriptionItems.reduce((result, key) => {
- result[key] = true
- return result
-}, {})
+ result[key] = true;
+ return result;
+}, {});
const defaultFormat = (value: ?any, name: string) =>
- value === undefined ? '' : value
+ value === undefined ? "" : value;
const defaultParse = (value: ?any, name: string) =>
- value === '' ? undefined : value
+ value === "" ? undefined : value;
-const defaultIsEqual = (a: any, b: any): boolean => a === b
+const defaultIsEqual = (a: any, b: any): boolean => a === b;
function useField(
name: string,
- config: UseFieldConfig = {}
+ config: UseFieldConfig = {},
): FieldRenderProps {
const {
afterSubmit,
@@ -45,13 +49,13 @@ function useField(
subscription = all,
type,
validateFields,
- value: _value
- } = config
- const form: FormApi = useForm('useField')
+ value: _value,
+ } = config;
+ const form: FormApi = useForm("useField");
- const configRef = useLatest(config)
+ const configRef = useLatest(config);
- const register = (callback: FieldState => void, silent: boolean) =>
+ const register = (callback: (FieldState) => void, silent: boolean) =>
// avoid using `state` const in any closures created inside `register`
// because they would refer `state` from current execution context
// whereas actual `state` would defined in the subsequent `useField` hook
@@ -63,19 +67,19 @@ function useField(
const {
beforeSubmit,
formatOnBlur,
- format = defaultFormat
- } = configRef.current
+ format = defaultFormat,
+ } = configRef.current;
if (formatOnBlur) {
- const { value } = ((form.getFieldState(name): any): FieldState)
- const formatted = format(value, name)
+ const { value } = ((form.getFieldState(name): any): FieldState);
+ const formatted = format(value, name);
if (formatted !== value) {
- form.change(name, formatted)
+ form.change(name, formatted);
}
}
- return beforeSubmit && beforeSubmit()
+ return beforeSubmit && beforeSubmit();
},
data,
defaultValue,
@@ -83,36 +87,36 @@ function useField(
initialValue,
isEqual: (a, b) => (configRef.current.isEqual || defaultIsEqual)(a, b),
silent,
- validateFields
- })
+ validateFields,
+ });
- const firstRender = React.useRef(true)
+ const firstRender = React.useRef(true);
// synchronously register and unregister to query field state for our subscription on first render
const [state, setState] = React.useState((): FieldState => {
- let initialState: FieldState = {}
+ let initialState: FieldState = {};
// temporarily disable destroyOnUnregister
- const destroyOnUnregister = form.destroyOnUnregister
- form.destroyOnUnregister = false
+ const destroyOnUnregister = form.destroyOnUnregister;
+ form.destroyOnUnregister = false;
- register(state => {
- initialState = state
- }, true)()
+ register((state) => {
+ initialState = state;
+ }, true)();
// return destroyOnUnregister to its original value
- form.destroyOnUnregister = destroyOnUnregister
+ form.destroyOnUnregister = destroyOnUnregister;
- return initialState
- })
+ return initialState;
+ });
React.useEffect(
() =>
- register(state => {
+ register((state) => {
if (firstRender.current) {
- firstRender.current = false
+ firstRender.current = false;
} else {
- setState(state)
+ setState(state);
}
}, false),
// eslint-disable-next-line react-hooks/exhaustive-deps
@@ -123,53 +127,53 @@ function useField(
// If we want to allow inline fat-arrow field-level validation functions, we
// cannot reregister field every time validate function !==.
// validate,
- initialValue
+ initialValue,
// The validateFields array is often passed as validateFields={[]}, creating
// a !== new array every time. If it needs to be changed, a rerender/reregister
// can be forced by changing the key prop
// validateFields
- ]
- )
+ ],
+ );
- const meta = {}
- addLazyFieldMetaState(meta, state)
+ const meta = {};
+ addLazyFieldMetaState(meta, state);
const input: FieldInputProps = {
name,
get value() {
- let value = state.value
+ let value = state.value;
if (formatOnBlur) {
- if (component === 'input') {
- value = defaultFormat(value, name)
+ if (component === "input") {
+ value = defaultFormat(value, name);
}
} else {
- value = format(value, name)
+ value = format(value, name);
}
if (value === null && !allowNull) {
- value = ''
+ value = "";
}
- if (type === 'checkbox' || type === 'radio') {
- return _value
- } else if (component === 'select' && multiple) {
- return value || []
+ if (type === "checkbox" || type === "radio") {
+ return _value;
+ } else if (component === "select" && multiple) {
+ return value || [];
}
- return value
+ return value;
},
get checked() {
- let value = state.value
- if (type === 'checkbox') {
- value = format(value, name)
+ let value = state.value;
+ if (type === "checkbox") {
+ value = format(value, name);
if (_value === undefined) {
- return !!value
+ return !!value;
} else {
- return !!(Array.isArray(value) && ~value.indexOf(_value))
+ return !!(Array.isArray(value) && ~value.indexOf(_value));
}
- } else if (type === 'radio') {
- return format(value, name) === _value
+ } else if (type === "radio") {
+ return format(value, name) === _value;
}
- return undefined
+ return undefined;
},
onBlur: useConstantCallback((event: ?SyntheticFocusEvent<*>) => {
- state.blur()
+ state.blur();
if (formatOnBlur) {
/**
* Here we must fetch the value directly from Final Form because we cannot
@@ -178,54 +182,54 @@ function useField(
* before calling `onBlur()`, but before the field has had a chance to receive
* the value update from Final Form.
*/
- const fieldState: any = form.getFieldState(state.name)
- state.change(format(fieldState.value, state.name))
+ const fieldState: any = form.getFieldState(state.name);
+ state.change(format(fieldState.value, state.name));
}
}),
onChange: useConstantCallback((event: SyntheticInputEvent<*> | any) => {
// istanbul ignore next
- if (process.env.NODE_ENV !== 'production' && event && event.target) {
- const targetType = event.target.type
+ if (process.env.NODE_ENV !== "production" && event && event.target) {
+ const targetType = event.target.type;
const unknown =
- ~['checkbox', 'radio', 'select-multiple'].indexOf(targetType) &&
+ ~["checkbox", "radio", "select-multiple"].indexOf(targetType) &&
!type &&
- component !== 'select'
+ component !== "select";
const value: any =
- targetType === 'select-multiple' ? state.value : _value
+ targetType === "select-multiple" ? state.value : _value;
if (unknown) {
console.error(
`You must pass \`type="${
- targetType === 'select-multiple' ? 'select' : targetType
+ targetType === "select-multiple" ? "select" : targetType
}"\` prop to your Field(${name}) component.\n` +
`Without it we don't know how to unpack your \`value\` prop - ${
Array.isArray(value) ? `[${value}]` : `"${value}"`
- }.`
- )
+ }.`,
+ );
}
}
const value: any =
event && event.target
? getValue(event, state.value, _value, isReactNative)
- : event
- state.change(parse(value, name))
+ : event;
+ state.change(parse(value, name));
}),
onFocus: useConstantCallback((event: ?SyntheticFocusEvent<*>) =>
- state.focus()
- )
- }
+ state.focus(),
+ ),
+ };
if (multiple) {
- input.multiple = multiple
+ input.multiple = multiple;
}
if (type !== undefined) {
- input.type = type
+ input.type = type;
}
- const renderProps: FieldRenderProps = { input, meta } // assign to force Flow check
- return renderProps
+ const renderProps: FieldRenderProps = { input, meta }; // assign to force Flow check
+ return renderProps;
}
-export default useField
+export default useField;
diff --git a/src/useField.test.js b/src/useField.test.js
index 5d87737f..1277f1ce 100644
--- a/src/useField.test.js
+++ b/src/useField.test.js
@@ -1,67 +1,67 @@
// @flow
-import * as React from 'react'
-import { render, fireEvent, cleanup } from '@testing-library/react'
-import '@testing-library/jest-dom/extend-expect'
-import { ErrorBoundary } from './testUtils'
-import Form from './ReactFinalForm'
-import Field from './Field'
-import { useField } from './index'
-import { act } from 'react-dom/test-utils'
+import * as React from "react";
+import { render, fireEvent, cleanup } from "@testing-library/react";
+import "@testing-library/jest-dom/extend-expect";
+import { ErrorBoundary } from "./testUtils";
+import Form from "./ReactFinalForm";
+import Field from "./Field";
+import { useField } from "./index";
+import { act } from "react-dom/test-utils";
-const onSubmitMock = values => {}
+const onSubmitMock = (values) => {};
-describe('useField', () => {
- afterEach(cleanup)
+describe("useField", () => {
+ afterEach(cleanup);
// Most of the functionality of useField is tested in Field.test.js
// This file is only for testing its use as a hook in other components
- it('should warn if not used inside a form', () => {
- jest.spyOn(console, 'error').mockImplementation(() => {})
- const errorSpy = jest.fn()
+ it("should warn if not used inside a form", () => {
+ jest.spyOn(console, "error").mockImplementation(() => {});
+ const errorSpy = jest.fn();
const MyFieldComponent = () => {
- useField('name')
- return
- }
+ useField("name");
+ return
;
+ };
render(
-
- )
- expect(errorSpy).toHaveBeenCalled()
- expect(errorSpy).toHaveBeenCalledTimes(1)
+ ,
+ );
+ expect(errorSpy).toHaveBeenCalled();
+ expect(errorSpy).toHaveBeenCalledTimes(1);
expect(errorSpy.mock.calls[0][0].message).toBe(
- 'useField must be used inside of a component'
- )
- console.error.mockRestore()
- })
+ "useField must be used inside of a component",
+ );
+ console.error.mockRestore();
+ });
- it('should subscribe to all by default', () => {
+ it("should subscribe to all by default", () => {
const MyFieldListener = () => {
- const { input, meta } = useField('name')
- expect(meta.active).toBe(false)
- expect(meta.data).toEqual({})
- expect(meta.dirty).toBe(false)
- expect(meta.dirtySinceLastSubmit).toBe(false)
- expect(meta.error).toBeUndefined()
- expect(meta.initial).toBeUndefined()
- expect(meta.invalid).toBe(false)
- expect(meta.length).toBeUndefined()
- expect(meta.modified).toBe(false)
- expect(meta.modifiedSinceLastSubmit).toBe(false)
- expect(meta.pristine).toBe(true)
- expect(meta.submitError).toBeUndefined()
- expect(meta.submitFailed).toBe(false)
- expect(meta.submitSucceeded).toBe(false)
- expect(meta.submitting).toBe(false)
- expect(meta.touched).toBe(false)
- expect(meta.valid).toBe(true)
- expect(meta.validating).toBe(false)
- expect(meta.visited).toBe(false)
- expect(input.value).toBe('')
- return null
- }
+ const { input, meta } = useField("name");
+ expect(meta.active).toBe(false);
+ expect(meta.data).toEqual({});
+ expect(meta.dirty).toBe(false);
+ expect(meta.dirtySinceLastSubmit).toBe(false);
+ expect(meta.error).toBeUndefined();
+ expect(meta.initial).toBeUndefined();
+ expect(meta.invalid).toBe(false);
+ expect(meta.length).toBeUndefined();
+ expect(meta.modified).toBe(false);
+ expect(meta.modifiedSinceLastSubmit).toBe(false);
+ expect(meta.pristine).toBe(true);
+ expect(meta.submitError).toBeUndefined();
+ expect(meta.submitFailed).toBe(false);
+ expect(meta.submitSucceeded).toBe(false);
+ expect(meta.submitting).toBe(false);
+ expect(meta.touched).toBe(false);
+ expect(meta.valid).toBe(true);
+ expect(meta.validating).toBe(false);
+ expect(meta.visited).toBe(false);
+ expect(input.value).toBe("");
+ return null;
+ };
render(
{() => (
@@ -70,16 +70,16 @@ describe('useField', () => {
)}
-
- )
- })
+ ,
+ );
+ });
- it('should track field state', () => {
- const spy = jest.fn()
+ it("should track field state", () => {
+ const spy = jest.fn();
const MyFieldListener = () => {
- spy(useField('name').input.value)
- return null
- }
+ spy(useField("name").input.value);
+ return null;
+ };
const { getByTestId } = render(
{() => (
@@ -88,31 +88,31 @@ describe('useField', () => {
)}
-
- )
- expect(getByTestId('name').value).toBe('')
+ ,
+ );
+ expect(getByTestId("name").value).toBe("");
// All forms without restricted subscriptions render twice at first because they
// need to update their validation and touched/modified/visited maps every time
// new fields are registered.
- expect(spy).toHaveBeenCalledTimes(2)
- expect(spy.mock.calls[0][0]).toBe('')
- expect(spy.mock.calls[1][0]).toBe('')
- fireEvent.change(getByTestId('name'), { target: { value: 'erikras' } })
- expect(getByTestId('name').value).toBe('erikras')
- expect(spy).toHaveBeenCalledTimes(3)
- expect(spy.mock.calls[2][0]).toBe('erikras')
- })
-
- it('should allow for creation of render-controlled components', () => {
- const spy = jest.fn()
+ expect(spy).toHaveBeenCalledTimes(2);
+ expect(spy.mock.calls[0][0]).toBe("");
+ expect(spy.mock.calls[1][0]).toBe("");
+ fireEvent.change(getByTestId("name"), { target: { value: "erikras" } });
+ expect(getByTestId("name").value).toBe("erikras");
+ expect(spy).toHaveBeenCalledTimes(3);
+ expect(spy.mock.calls[2][0]).toBe("erikras");
+ });
+
+ it("should allow for creation of render-controlled components", () => {
+ const spy = jest.fn();
const MemoizedDirtyDisplay = React.memo(({ dirty }) => {
- spy(dirty)
- return {dirty ? 'Dirty' : 'Pristine'}
- })
+ spy(dirty);
+ return {dirty ? "Dirty" : "Pristine"}
;
+ });
const MyFieldListener = () => {
- const field = useField('name', { subscription: { dirty: true } })
- return
- }
+ const field = useField("name", { subscription: { dirty: true } });
+ return ;
+ };
const { getByTestId } = render(
{() => (
@@ -121,40 +121,40 @@ describe('useField', () => {
)}
-
- )
- expect(getByTestId('name').value).toBe('')
- expect(getByTestId('dirty')).toHaveTextContent('Pristine')
- expect(spy).toHaveBeenCalledTimes(1)
- expect(spy.mock.calls[0][0]).toBe(false)
+ ,
+ );
+ expect(getByTestId("name").value).toBe("");
+ expect(getByTestId("dirty")).toHaveTextContent("Pristine");
+ expect(spy).toHaveBeenCalledTimes(1);
+ expect(spy.mock.calls[0][0]).toBe(false);
// simulate typing
- fireEvent.change(getByTestId('name'), { target: { value: 'e' } })
- expect(getByTestId('dirty')).toHaveTextContent('Dirty')
- expect(spy).toHaveBeenCalledTimes(2)
- expect(spy.mock.calls[1][0]).toBe(true)
- fireEvent.change(getByTestId('name'), { target: { value: 'er' } })
- fireEvent.change(getByTestId('name'), { target: { value: 'eri' } })
- fireEvent.change(getByTestId('name'), { target: { value: 'erik' } })
- fireEvent.change(getByTestId('name'), { target: { value: 'erikr' } })
- fireEvent.change(getByTestId('name'), { target: { value: 'erikra' } })
- fireEvent.change(getByTestId('name'), { target: { value: 'erikras' } })
+ fireEvent.change(getByTestId("name"), { target: { value: "e" } });
+ expect(getByTestId("dirty")).toHaveTextContent("Dirty");
+ expect(spy).toHaveBeenCalledTimes(2);
+ expect(spy.mock.calls[1][0]).toBe(true);
+ fireEvent.change(getByTestId("name"), { target: { value: "er" } });
+ fireEvent.change(getByTestId("name"), { target: { value: "eri" } });
+ fireEvent.change(getByTestId("name"), { target: { value: "erik" } });
+ fireEvent.change(getByTestId("name"), { target: { value: "erikr" } });
+ fireEvent.change(getByTestId("name"), { target: { value: "erikra" } });
+ fireEvent.change(getByTestId("name"), { target: { value: "erikras" } });
// dirty flag hasn't changed since the first character
- expect(spy).toHaveBeenCalledTimes(2)
+ expect(spy).toHaveBeenCalledTimes(2);
// make pristine again
- fireEvent.change(getByTestId('name'), { target: { value: '' } })
- expect(getByTestId('dirty')).toHaveTextContent('Pristine')
- expect(spy).toHaveBeenCalledTimes(3)
- expect(spy.mock.calls[2][0]).toBe(false)
- })
-
- it('should give same instance of handlers as value changes', () => {
- const spy = jest.fn()
+ fireEvent.change(getByTestId("name"), { target: { value: "" } });
+ expect(getByTestId("dirty")).toHaveTextContent("Pristine");
+ expect(spy).toHaveBeenCalledTimes(3);
+ expect(spy.mock.calls[2][0]).toBe(false);
+ });
+
+ it("should give same instance of handlers as value changes", () => {
+ const spy = jest.fn();
const MyField = ({ name }) => {
- const { input } = useField(name, { subscription: { value: true } })
- const { onChange, onFocus, onBlur } = input
- spy(onChange, onFocus, onBlur)
- return
- }
+ const { input } = useField(name, { subscription: { value: true } });
+ const { onChange, onFocus, onBlur } = input;
+ spy(onChange, onFocus, onBlur);
+ return ;
+ };
render(
{() => (
@@ -162,44 +162,44 @@ describe('useField', () => {
)}
-
- )
+ ,
+ );
- expect(spy).toHaveBeenCalledTimes(2)
- expect(spy.mock.calls[1][0]).toBe(spy.mock.calls[0][0]) // onChange
- expect(spy.mock.calls[1][1]).toBe(spy.mock.calls[0][1]) // onFocus
- expect(spy.mock.calls[1][2]).toBe(spy.mock.calls[0][2]) // onBlur
+ expect(spy).toHaveBeenCalledTimes(2);
+ expect(spy.mock.calls[1][0]).toBe(spy.mock.calls[0][0]); // onChange
+ expect(spy.mock.calls[1][1]).toBe(spy.mock.calls[0][1]); // onFocus
+ expect(spy.mock.calls[1][2]).toBe(spy.mock.calls[0][2]); // onBlur
- const [onChange, onFocus, onBlur] = spy.mock.calls[0]
- const setValue = value => {
+ const [onChange, onFocus, onBlur] = spy.mock.calls[0];
+ const setValue = (value) => {
act(() => {
- onFocus()
- onChange(value)
- onBlur()
- })
- }
-
- setValue('dog')
- expect(spy).toHaveBeenCalledTimes(3)
- expect(spy.mock.calls[2][0]).toBe(spy.mock.calls[1][0]) // onChange
- expect(spy.mock.calls[2][1]).toBe(spy.mock.calls[1][1]) // onFocus
- expect(spy.mock.calls[2][2]).toBe(spy.mock.calls[1][2]) // onBlur
-
- setValue('cat')
- expect(spy).toHaveBeenCalledTimes(4)
- expect(spy.mock.calls[3][0]).toBe(spy.mock.calls[2][0]) // onChange
- expect(spy.mock.calls[3][1]).toBe(spy.mock.calls[2][1]) // onFocus
- expect(spy.mock.calls[3][2]).toBe(spy.mock.calls[2][2]) // onBlur
- })
-
- it('should give same instance of handlers as name changes', () => {
- const spy = jest.fn()
+ onFocus();
+ onChange(value);
+ onBlur();
+ });
+ };
+
+ setValue("dog");
+ expect(spy).toHaveBeenCalledTimes(3);
+ expect(spy.mock.calls[2][0]).toBe(spy.mock.calls[1][0]); // onChange
+ expect(spy.mock.calls[2][1]).toBe(spy.mock.calls[1][1]); // onFocus
+ expect(spy.mock.calls[2][2]).toBe(spy.mock.calls[1][2]); // onBlur
+
+ setValue("cat");
+ expect(spy).toHaveBeenCalledTimes(4);
+ expect(spy.mock.calls[3][0]).toBe(spy.mock.calls[2][0]); // onChange
+ expect(spy.mock.calls[3][1]).toBe(spy.mock.calls[2][1]); // onFocus
+ expect(spy.mock.calls[3][2]).toBe(spy.mock.calls[2][2]); // onBlur
+ });
+
+ it("should give same instance of handlers as name changes", () => {
+ const spy = jest.fn();
const MyField = ({ name }) => {
- const { input } = useField(name, { subscription: { value: true } })
- const { onChange, onFocus, onBlur } = input
- spy(onChange, onFocus, onBlur)
- return
- }
+ const { input } = useField(name, { subscription: { value: true } });
+ const { onChange, onFocus, onBlur } = input;
+ spy(onChange, onFocus, onBlur);
+ return ;
+ };
const { rerender } = render(
{() => (
@@ -207,14 +207,13 @@ describe('useField', () => {
)}
-
- )
-
- expect(spy).toHaveBeenCalledTimes(2)
- expect(spy.mock.calls[1][0]).toBe(spy.mock.calls[0][0]) // onChange
- expect(spy.mock.calls[1][1]).toBe(spy.mock.calls[0][1]) // onFocus
- expect(spy.mock.calls[1][2]).toBe(spy.mock.calls[0][2]) // onBlur
+ ,
+ );
+ expect(spy).toHaveBeenCalledTimes(2);
+ expect(spy.mock.calls[1][0]).toBe(spy.mock.calls[0][0]); // onChange
+ expect(spy.mock.calls[1][1]).toBe(spy.mock.calls[0][1]); // onFocus
+ expect(spy.mock.calls[1][2]).toBe(spy.mock.calls[0][2]); // onBlur
rerender(
@@ -223,26 +222,26 @@ describe('useField', () => {
)}
-
- )
-
- expect(spy).toHaveBeenCalledTimes(4)
- expect(spy.mock.calls[2][0]).toBe(spy.mock.calls[1][0]) // onChange
- expect(spy.mock.calls[2][1]).toBe(spy.mock.calls[1][1]) // onFocus
- expect(spy.mock.calls[2][2]).toBe(spy.mock.calls[1][2]) // onBlur
- expect(spy.mock.calls[3][0]).toBe(spy.mock.calls[2][0]) // onChange
- expect(spy.mock.calls[3][1]).toBe(spy.mock.calls[2][1]) // onFocus
- expect(spy.mock.calls[3][2]).toBe(spy.mock.calls[2][2]) // onBlur
- })
-
- it('should give same instance of handlers as type changes', () => {
- const spy = jest.fn()
+ ,
+ );
+
+ expect(spy).toHaveBeenCalledTimes(4);
+ expect(spy.mock.calls[2][0]).toBe(spy.mock.calls[1][0]); // onChange
+ expect(spy.mock.calls[2][1]).toBe(spy.mock.calls[1][1]); // onFocus
+ expect(spy.mock.calls[2][2]).toBe(spy.mock.calls[1][2]); // onBlur
+ expect(spy.mock.calls[3][0]).toBe(spy.mock.calls[2][0]); // onChange
+ expect(spy.mock.calls[3][1]).toBe(spy.mock.calls[2][1]); // onFocus
+ expect(spy.mock.calls[3][2]).toBe(spy.mock.calls[2][2]); // onBlur
+ });
+
+ it("should give same instance of handlers as type changes", () => {
+ const spy = jest.fn();
const MyField = ({ name, type }) => {
- const { input } = useField(name, { subscription: { value: true }, type })
- const { onChange, onFocus, onBlur } = input
- spy(onChange, onFocus, onBlur)
- return
- }
+ const { input } = useField(name, { subscription: { value: true }, type });
+ const { onChange, onFocus, onBlur } = input;
+ spy(onChange, onFocus, onBlur);
+ return ;
+ };
const { rerender } = render(
{() => (
@@ -250,42 +249,44 @@ describe('useField', () => {
)}
-
- )
-
- expect(spy).toHaveBeenCalledTimes(2)
- expect(spy.mock.calls[1][0]).toBe(spy.mock.calls[0][0]) // onChange
- expect(spy.mock.calls[1][1]).toBe(spy.mock.calls[0][1]) // onFocus
- expect(spy.mock.calls[1][2]).toBe(spy.mock.calls[0][2]) // onBlur
+ ,
+ );
+ expect(spy).toHaveBeenCalledTimes(2);
+ expect(spy.mock.calls[1][0]).toBe(spy.mock.calls[0][0]); // onChange
+ expect(spy.mock.calls[1][1]).toBe(spy.mock.calls[0][1]); // onFocus
+ expect(spy.mock.calls[1][2]).toBe(spy.mock.calls[0][2]); // onBlur
rerender(
{() => (
-
+
)}
-
- )
-
- expect(spy).toHaveBeenCalledTimes(4)
- expect(spy.mock.calls[2][0]).toBe(spy.mock.calls[1][0]) // onChange
- expect(spy.mock.calls[2][1]).toBe(spy.mock.calls[1][1]) // onFocus
- expect(spy.mock.calls[2][2]).toBe(spy.mock.calls[1][2]) // onBlur
- expect(spy.mock.calls[3][0]).toBe(spy.mock.calls[2][0]) // onChange
- expect(spy.mock.calls[3][1]).toBe(spy.mock.calls[2][1]) // onFocus
- expect(spy.mock.calls[3][2]).toBe(spy.mock.calls[2][2]) // onBlur
- })
-
- it('should give same instance of handlers as formatOnBlur changes', () => {
- const spy = jest.fn()
+ ,
+ );
+
+ expect(spy).toHaveBeenCalledTimes(4);
+ expect(spy.mock.calls[2][0]).toBe(spy.mock.calls[1][0]); // onChange
+ expect(spy.mock.calls[2][1]).toBe(spy.mock.calls[1][1]); // onFocus
+ expect(spy.mock.calls[2][2]).toBe(spy.mock.calls[1][2]); // onBlur
+ expect(spy.mock.calls[3][0]).toBe(spy.mock.calls[2][0]); // onChange
+ expect(spy.mock.calls[3][1]).toBe(spy.mock.calls[2][1]); // onFocus
+ expect(spy.mock.calls[3][2]).toBe(spy.mock.calls[2][2]); // onBlur
+ });
+
+ it("should give same instance of handlers as formatOnBlur changes", () => {
+ const spy = jest.fn();
const MyField = ({ name, formatOnBlur }) => {
- const { input } = useField(name, { subscription: { value: true }, formatOnBlur })
- const { onChange, onFocus, onBlur } = input
- spy(onChange, onFocus, onBlur)
- return
- }
+ const { input } = useField(name, {
+ subscription: { value: true },
+ formatOnBlur,
+ });
+ const { onChange, onFocus, onBlur } = input;
+ spy(onChange, onFocus, onBlur);
+ return ;
+ };
const { rerender } = render(
{() => (
@@ -293,14 +294,13 @@ describe('useField', () => {
)}
-
- )
-
- expect(spy).toHaveBeenCalledTimes(2)
- expect(spy.mock.calls[1][0]).toBe(spy.mock.calls[0][0]) // onChange
- expect(spy.mock.calls[1][1]).toBe(spy.mock.calls[0][1]) // onFocus
- expect(spy.mock.calls[1][2]).toBe(spy.mock.calls[0][2]) // onBlur
+ ,
+ );
+ expect(spy).toHaveBeenCalledTimes(2);
+ expect(spy.mock.calls[1][0]).toBe(spy.mock.calls[0][0]); // onChange
+ expect(spy.mock.calls[1][1]).toBe(spy.mock.calls[0][1]); // onFocus
+ expect(spy.mock.calls[1][2]).toBe(spy.mock.calls[0][2]); // onBlur
rerender(
@@ -309,26 +309,29 @@ describe('useField', () => {
)}
-
- )
-
- expect(spy).toHaveBeenCalledTimes(4)
- expect(spy.mock.calls[2][0]).toBe(spy.mock.calls[1][0]) // onChange
- expect(spy.mock.calls[2][1]).toBe(spy.mock.calls[1][1]) // onFocus
- expect(spy.mock.calls[2][2]).toBe(spy.mock.calls[1][2]) // onBlur
- expect(spy.mock.calls[3][0]).toBe(spy.mock.calls[2][0]) // onChange
- expect(spy.mock.calls[3][1]).toBe(spy.mock.calls[2][1]) // onFocus
- expect(spy.mock.calls[3][2]).toBe(spy.mock.calls[2][2]) // onBlur
- })
-
- it('should give same instance of handlers as parse changes', () => {
- const spy = jest.fn()
+ ,
+ );
+
+ expect(spy).toHaveBeenCalledTimes(4);
+ expect(spy.mock.calls[2][0]).toBe(spy.mock.calls[1][0]); // onChange
+ expect(spy.mock.calls[2][1]).toBe(spy.mock.calls[1][1]); // onFocus
+ expect(spy.mock.calls[2][2]).toBe(spy.mock.calls[1][2]); // onBlur
+ expect(spy.mock.calls[3][0]).toBe(spy.mock.calls[2][0]); // onChange
+ expect(spy.mock.calls[3][1]).toBe(spy.mock.calls[2][1]); // onFocus
+ expect(spy.mock.calls[3][2]).toBe(spy.mock.calls[2][2]); // onBlur
+ });
+
+ it("should give same instance of handlers as parse changes", () => {
+ const spy = jest.fn();
const MyField = ({ name, parse }) => {
- const { input } = useField(name, { subscription: { value: true }, parse })
- const { onChange, onFocus, onBlur } = input
- spy(onChange, onFocus, onBlur)
- return
- }
+ const { input } = useField(name, {
+ subscription: { value: true },
+ parse,
+ });
+ const { onChange, onFocus, onBlur } = input;
+ spy(onChange, onFocus, onBlur);
+ return ;
+ };
const { rerender } = render(
{() => (
@@ -336,14 +339,13 @@ describe('useField', () => {
)}
-
- )
-
- expect(spy).toHaveBeenCalledTimes(2)
- expect(spy.mock.calls[1][0]).toBe(spy.mock.calls[0][0]) // onChange
- expect(spy.mock.calls[1][1]).toBe(spy.mock.calls[0][1]) // onFocus
- expect(spy.mock.calls[1][2]).toBe(spy.mock.calls[0][2]) // onBlur
+ ,
+ );
+ expect(spy).toHaveBeenCalledTimes(2);
+ expect(spy.mock.calls[1][0]).toBe(spy.mock.calls[0][0]); // onChange
+ expect(spy.mock.calls[1][1]).toBe(spy.mock.calls[0][1]); // onFocus
+ expect(spy.mock.calls[1][2]).toBe(spy.mock.calls[0][2]); // onBlur
rerender(
@@ -352,26 +354,29 @@ describe('useField', () => {
x} />
)}
-
- )
-
- expect(spy).toHaveBeenCalledTimes(4)
- expect(spy.mock.calls[2][0]).toBe(spy.mock.calls[1][0]) // onChange
- expect(spy.mock.calls[2][1]).toBe(spy.mock.calls[1][1]) // onFocus
- expect(spy.mock.calls[2][2]).toBe(spy.mock.calls[1][2]) // onBlur
- expect(spy.mock.calls[3][0]).toBe(spy.mock.calls[2][0]) // onChange
- expect(spy.mock.calls[3][1]).toBe(spy.mock.calls[2][1]) // onFocus
- expect(spy.mock.calls[3][2]).toBe(spy.mock.calls[2][2]) // onBlur
- })
-
- it('should give same instance of handlers as format changes', () => {
- const spy = jest.fn()
+ ,
+ );
+
+ expect(spy).toHaveBeenCalledTimes(4);
+ expect(spy.mock.calls[2][0]).toBe(spy.mock.calls[1][0]); // onChange
+ expect(spy.mock.calls[2][1]).toBe(spy.mock.calls[1][1]); // onFocus
+ expect(spy.mock.calls[2][2]).toBe(spy.mock.calls[1][2]); // onBlur
+ expect(spy.mock.calls[3][0]).toBe(spy.mock.calls[2][0]); // onChange
+ expect(spy.mock.calls[3][1]).toBe(spy.mock.calls[2][1]); // onFocus
+ expect(spy.mock.calls[3][2]).toBe(spy.mock.calls[2][2]); // onBlur
+ });
+
+ it("should give same instance of handlers as format changes", () => {
+ const spy = jest.fn();
const MyField = ({ name, format }) => {
- const { input } = useField(name, { subscription: { value: true }, format })
- const { onChange, onFocus, onBlur } = input
- spy(onChange, onFocus, onBlur)
- return
- }
+ const { input } = useField(name, {
+ subscription: { value: true },
+ format,
+ });
+ const { onChange, onFocus, onBlur } = input;
+ spy(onChange, onFocus, onBlur);
+ return ;
+ };
const { rerender } = render(
{() => (
@@ -379,14 +384,13 @@ describe('useField', () => {
)}
-
- )
-
- expect(spy).toHaveBeenCalledTimes(2)
- expect(spy.mock.calls[1][0]).toBe(spy.mock.calls[0][0]) // onChange
- expect(spy.mock.calls[1][1]).toBe(spy.mock.calls[0][1]) // onFocus
- expect(spy.mock.calls[1][2]).toBe(spy.mock.calls[0][2]) // onBlur
+ ,
+ );
+ expect(spy).toHaveBeenCalledTimes(2);
+ expect(spy.mock.calls[1][0]).toBe(spy.mock.calls[0][0]); // onChange
+ expect(spy.mock.calls[1][1]).toBe(spy.mock.calls[0][1]); // onFocus
+ expect(spy.mock.calls[1][2]).toBe(spy.mock.calls[0][2]); // onBlur
rerender(
@@ -395,26 +399,29 @@ describe('useField', () => {
x} />
)}
-
- )
-
- expect(spy).toHaveBeenCalledTimes(4)
- expect(spy.mock.calls[2][0]).toBe(spy.mock.calls[1][0]) // onChange
- expect(spy.mock.calls[2][1]).toBe(spy.mock.calls[1][1]) // onFocus
- expect(spy.mock.calls[2][2]).toBe(spy.mock.calls[1][2]) // onBlur
- expect(spy.mock.calls[3][0]).toBe(spy.mock.calls[2][0]) // onChange
- expect(spy.mock.calls[3][1]).toBe(spy.mock.calls[2][1]) // onFocus
- expect(spy.mock.calls[3][2]).toBe(spy.mock.calls[2][2]) // onBlur
- })
-
- it('should give same instance of handlers as component changes', () => {
- const spy = jest.fn()
+ ,
+ );
+
+ expect(spy).toHaveBeenCalledTimes(4);
+ expect(spy.mock.calls[2][0]).toBe(spy.mock.calls[1][0]); // onChange
+ expect(spy.mock.calls[2][1]).toBe(spy.mock.calls[1][1]); // onFocus
+ expect(spy.mock.calls[2][2]).toBe(spy.mock.calls[1][2]); // onBlur
+ expect(spy.mock.calls[3][0]).toBe(spy.mock.calls[2][0]); // onChange
+ expect(spy.mock.calls[3][1]).toBe(spy.mock.calls[2][1]); // onFocus
+ expect(spy.mock.calls[3][2]).toBe(spy.mock.calls[2][2]); // onBlur
+ });
+
+ it("should give same instance of handlers as component changes", () => {
+ const spy = jest.fn();
const MyField = ({ name, component }) => {
- const { input } = useField(name, { subscription: { value: true }, component })
- const { onChange, onFocus, onBlur } = input
- spy(onChange, onFocus, onBlur)
- return
- }
+ const { input } = useField(name, {
+ subscription: { value: true },
+ component,
+ });
+ const { onChange, onFocus, onBlur } = input;
+ spy(onChange, onFocus, onBlur);
+ return ;
+ };
const { rerender } = render(
{() => (
@@ -422,14 +429,13 @@ describe('useField', () => {
)}
-
- )
-
- expect(spy).toHaveBeenCalledTimes(2)
- expect(spy.mock.calls[1][0]).toBe(spy.mock.calls[0][0]) // onChange
- expect(spy.mock.calls[1][1]).toBe(spy.mock.calls[0][1]) // onFocus
- expect(spy.mock.calls[1][2]).toBe(spy.mock.calls[0][2]) // onBlur
+ ,
+ );
+ expect(spy).toHaveBeenCalledTimes(2);
+ expect(spy.mock.calls[1][0]).toBe(spy.mock.calls[0][0]); // onChange
+ expect(spy.mock.calls[1][1]).toBe(spy.mock.calls[0][1]); // onFocus
+ expect(spy.mock.calls[1][2]).toBe(spy.mock.calls[0][2]); // onBlur
rerender(
@@ -438,15 +444,15 @@ describe('useField', () => {
)}
-
- )
-
- expect(spy).toHaveBeenCalledTimes(4)
- expect(spy.mock.calls[2][0]).toBe(spy.mock.calls[1][0]) // onChange
- expect(spy.mock.calls[2][1]).toBe(spy.mock.calls[1][1]) // onFocus
- expect(spy.mock.calls[2][2]).toBe(spy.mock.calls[1][2]) // onBlur
- expect(spy.mock.calls[3][0]).toBe(spy.mock.calls[2][0]) // onChange
- expect(spy.mock.calls[3][1]).toBe(spy.mock.calls[2][1]) // onFocus
- expect(spy.mock.calls[3][2]).toBe(spy.mock.calls[2][2]) // onBlur
- })
-})
+ ,
+ );
+
+ expect(spy).toHaveBeenCalledTimes(4);
+ expect(spy.mock.calls[2][0]).toBe(spy.mock.calls[1][0]); // onChange
+ expect(spy.mock.calls[2][1]).toBe(spy.mock.calls[1][1]); // onFocus
+ expect(spy.mock.calls[2][2]).toBe(spy.mock.calls[1][2]); // onBlur
+ expect(spy.mock.calls[3][0]).toBe(spy.mock.calls[2][0]); // onChange
+ expect(spy.mock.calls[3][1]).toBe(spy.mock.calls[2][1]); // onFocus
+ expect(spy.mock.calls[3][2]).toBe(spy.mock.calls[2][2]); // onBlur
+ });
+});
diff --git a/src/useForm.js b/src/useForm.js
index 6a1251df..9e319012 100644
--- a/src/useForm.js
+++ b/src/useForm.js
@@ -1,18 +1,18 @@
// @flow
-import * as React from 'react'
-import type { FormApi, FormValuesShape } from 'final-form'
-import ReactFinalFormContext from './context'
+import * as React from "react";
+import type { FormApi, FormValuesShape } from "final-form";
+import ReactFinalFormContext from "./context";
function useForm(
- componentName?: string
+ componentName?: string,
): FormApi {
- const form: ?FormApi = React.useContext(ReactFinalFormContext)
+ const form: ?FormApi = React.useContext(ReactFinalFormContext);
if (!form) {
throw new Error(
- `${componentName || 'useForm'} must be used inside of a component`
- )
+ `${componentName || "useForm"} must be used inside of a component`,
+ );
}
- return form
+ return form;
}
-export default useForm
+export default useForm;
diff --git a/src/useForm.test.js b/src/useForm.test.js
index 73e9591e..262a7f89 100644
--- a/src/useForm.test.js
+++ b/src/useForm.test.js
@@ -1,70 +1,70 @@
// @flow
-import React from 'react'
-import { render, cleanup } from '@testing-library/react'
-import '@testing-library/jest-dom/extend-expect'
-import { ErrorBoundary } from './testUtils'
-import Form from './ReactFinalForm'
-import { useForm } from './index'
+import React from "react";
+import { render, cleanup } from "@testing-library/react";
+import "@testing-library/jest-dom/extend-expect";
+import { ErrorBoundary } from "./testUtils";
+import Form from "./ReactFinalForm";
+import { useForm } from "./index";
-const onSubmitMock = values => {}
+const onSubmitMock = (values) => {};
-describe('useForm', () => {
- afterEach(cleanup)
+describe("useForm", () => {
+ afterEach(cleanup);
- it('should warn if not used inside a form', () => {
- jest.spyOn(console, 'error').mockImplementation(() => {})
- const errorSpy = jest.fn()
+ it("should warn if not used inside a form", () => {
+ jest.spyOn(console, "error").mockImplementation(() => {});
+ const errorSpy = jest.fn();
const MyFormConsumer = () => {
- useForm()
- return
- }
+ useForm();
+ return
;
+ };
render(
-
- )
- expect(errorSpy).toHaveBeenCalled()
- expect(errorSpy).toHaveBeenCalledTimes(1)
+ ,
+ );
+ expect(errorSpy).toHaveBeenCalled();
+ expect(errorSpy).toHaveBeenCalledTimes(1);
expect(errorSpy.mock.calls[0][0].message).toBe(
- 'useForm must be used inside of a component'
- )
- console.error.mockRestore()
- })
+ "useForm must be used inside of a component",
+ );
+ console.error.mockRestore();
+ });
- it('should warn with component name if not used inside a form', () => {
- jest.spyOn(console, 'error').mockImplementation(() => {})
- const errorSpy = jest.fn()
+ it("should warn with component name if not used inside a form", () => {
+ jest.spyOn(console, "error").mockImplementation(() => {});
+ const errorSpy = jest.fn();
const MyFormConsumer = () => {
- useForm('MyFormConsumer')
- return
- }
+ useForm("MyFormConsumer");
+ return
;
+ };
render(
-
- )
- expect(errorSpy).toHaveBeenCalled()
- expect(errorSpy).toHaveBeenCalledTimes(1)
+ ,
+ );
+ expect(errorSpy).toHaveBeenCalled();
+ expect(errorSpy).toHaveBeenCalledTimes(1);
expect(errorSpy.mock.calls[0][0].message).toBe(
- 'MyFormConsumer must be used inside of a component'
- )
- console.error.mockRestore()
- })
+ "MyFormConsumer must be used inside of a component",
+ );
+ console.error.mockRestore();
+ });
- it('should produce form if used inside ', () => {
+ it("should produce form if used inside ", () => {
const MyFormConsumer = () => {
- const form = useForm()
- expect(form).toBeDefined()
- expect(typeof form.change).toBe('function')
- expect(typeof form.reset).toBe('function')
+ const form = useForm();
+ expect(form).toBeDefined();
+ expect(typeof form.change).toBe("function");
+ expect(typeof form.reset).toBe("function");
return (
- {form ? 'Got a form!' : 'No form!'}
- )
- }
+ {form ? "Got a form!" : "No form!"}
+ );
+ };
const { getByTestId } = render(
- {() => }
- )
- expect(getByTestId('formCheck')).toHaveTextContent('Got a form!')
- })
-})
+ {() => } ,
+ );
+ expect(getByTestId("formCheck")).toHaveTextContent("Got a form!");
+ });
+});
diff --git a/src/useFormState.js b/src/useFormState.js
index 405a379e..3602d62e 100644
--- a/src/useFormState.js
+++ b/src/useFormState.js
@@ -1,52 +1,52 @@
// @flow
-import * as React from 'react'
-import type { UseFormStateParams } from './types'
-import type { FormState, FormApi, FormValuesShape } from 'final-form'
-import { all } from './ReactFinalForm'
-import useForm from './useForm'
-import { addLazyFormState } from './getters'
+import * as React from "react";
+import type { UseFormStateParams } from "./types";
+import type { FormState, FormApi, FormValuesShape } from "final-form";
+import { all } from "./ReactFinalForm";
+import useForm from "./useForm";
+import { addLazyFormState } from "./getters";
function useFormState({
onChange,
- subscription = all
+ subscription = all,
}: UseFormStateParams = {}): FormState {
- const form: FormApi = useForm('useFormState')
- const firstRender = React.useRef(true)
- const onChangeRef = React.useRef(onChange)
- onChangeRef.current = onChange
+ const form: FormApi = useForm("useFormState");
+ const firstRender = React.useRef(true);
+ const onChangeRef = React.useRef(onChange);
+ onChangeRef.current = onChange;
// synchronously register and unregister to query field state for our subscription on first render
const [state, setState] = React.useState>(
(): FormState => {
- let initialState: FormState = {}
- form.subscribe(state => {
- initialState = state
- }, subscription)()
+ let initialState: FormState = {};
+ form.subscribe((state) => {
+ initialState = state;
+ }, subscription)();
if (onChange) {
- onChange(initialState)
+ onChange(initialState);
}
- return initialState
- }
- )
+ return initialState;
+ },
+ );
React.useEffect(
() =>
- form.subscribe(newState => {
+ form.subscribe((newState) => {
if (firstRender.current) {
- firstRender.current = false
+ firstRender.current = false;
} else {
- setState(newState)
+ setState(newState);
if (onChangeRef.current) {
- onChangeRef.current(newState)
+ onChangeRef.current(newState);
}
}
}, subscription),
// eslint-disable-next-line react-hooks/exhaustive-deps
- []
- )
- const lazyState = {}
- addLazyFormState(lazyState, state)
- return lazyState
+ [],
+ );
+ const lazyState = {};
+ addLazyFormState(lazyState, state);
+ return lazyState;
}
-export default useFormState
+export default useFormState;
diff --git a/src/useFormState.test.js b/src/useFormState.test.js
index 2a3fa88d..71eb6226 100644
--- a/src/useFormState.test.js
+++ b/src/useFormState.test.js
@@ -1,42 +1,42 @@
// @flow
-import React from 'react'
-import { render, cleanup } from '@testing-library/react'
-import { ErrorBoundary } from './testUtils'
-import { useFormState, Form } from './index'
+import React from "react";
+import { render, cleanup } from "@testing-library/react";
+import { ErrorBoundary } from "./testUtils";
+import { useFormState, Form } from "./index";
-describe('useField', () => {
- afterEach(cleanup)
+describe("useField", () => {
+ afterEach(cleanup);
// Most of the functionality of useFormState is tested in FormSpy.test.js
// This file is only for testing its use as a hook in other components
- it('should warn if not used inside a form', () => {
- jest.spyOn(console, 'error').mockImplementation(() => {})
- const errorSpy = jest.fn()
+ it("should warn if not used inside a form", () => {
+ jest.spyOn(console, "error").mockImplementation(() => {});
+ const errorSpy = jest.fn();
const MyFormStateComponent = () => {
- useFormState()
- return
- }
+ useFormState();
+ return
;
+ };
render(
-
- )
- expect(errorSpy).toHaveBeenCalled()
- expect(errorSpy).toHaveBeenCalledTimes(1)
+ ,
+ );
+ expect(errorSpy).toHaveBeenCalled();
+ expect(errorSpy).toHaveBeenCalledTimes(1);
expect(errorSpy.mock.calls[0][0].message).toBe(
- 'useFormState must be used inside of a component'
- )
- console.error.mockRestore()
- })
+ "useFormState must be used inside of a component",
+ );
+ console.error.mockRestore();
+ });
- it('state should be enumerable', () => {
+ it("state should be enumerable", () => {
const Test = () => {
- const state = useFormState()
- expect(Object.keys(state).length > 0).toBe(true)
- return It worked
- }
+ const state = useFormState();
+ expect(Object.keys(state).length > 0).toBe(true);
+ return It worked
;
+ };
render(
{}}>
{({ handleSubmit }) => (
@@ -44,7 +44,7 @@ describe('useField', () => {
)}
-
- )
- })
-})
+ ,
+ );
+ });
+});
diff --git a/src/useLatest.js b/src/useLatest.js
index c39e27a8..05d1854a 100644
--- a/src/useLatest.js
+++ b/src/useLatest.js
@@ -1,12 +1,12 @@
// @flow
-import React from 'react'
+import React from "react";
export default function useLatest(value: T): { +current: T } {
- const ref = React.useRef(value)
+ const ref = React.useRef(value);
React.useEffect(() => {
- ref.current = value
- })
+ ref.current = value;
+ });
- return ref
+ return ref;
}
diff --git a/src/useWhenValueChanges.js b/src/useWhenValueChanges.js
index 812e24ef..471af8a7 100644
--- a/src/useWhenValueChanges.js
+++ b/src/useWhenValueChanges.js
@@ -1,16 +1,16 @@
// @flow
-import React from 'react'
+import React from "react";
export default function useWhenValueChanges(
value: any,
callback: () => void,
- isEqual: (any, any) => boolean = (a, b) => a === b
+ isEqual: (any, any) => boolean = (a, b) => a === b,
) {
- const previous = React.useRef(value)
+ const previous = React.useRef(value);
React.useEffect(() => {
if (!isEqual(value, previous.current)) {
- callback()
- previous.current = value
+ callback();
+ previous.current = value;
}
- })
+ });
}
diff --git a/typescript/Field.test.tsx b/typescript/Field.test.tsx
index d0270e29..5f12bf37 100644
--- a/typescript/Field.test.tsx
+++ b/typescript/Field.test.tsx
@@ -1,6 +1,6 @@
/* eslint-disable @typescript-eslint/no-unused-vars */
-import * as React from 'react';
-import { FieldRenderProps } from 'react-final-form';
+import * as React from "react";
+import { FieldRenderProps } from "react-final-form";
function FormText1({ input }: FieldRenderProps) {
// renders OK because of the used generic
diff --git a/typescript/FormSpy.test.tsx b/typescript/FormSpy.test.tsx
index 8e2e43e1..d3eb81af 100644
--- a/typescript/FormSpy.test.tsx
+++ b/typescript/FormSpy.test.tsx
@@ -1,6 +1,6 @@
/* eslint-disable @typescript-eslint/no-unused-vars */
-import * as React from 'react';
-import { FormSpy } from 'react-final-form';
+import * as React from "react";
+import { FormSpy } from "react-final-form";
function submitButtonSpy() {
return (
diff --git a/typescript/ReactFinalForm.test.tsx b/typescript/ReactFinalForm.test.tsx
index 8144e4e9..bbe7445c 100644
--- a/typescript/ReactFinalForm.test.tsx
+++ b/typescript/ReactFinalForm.test.tsx
@@ -1,9 +1,9 @@
/* tslint:disable: no-shadowed-variable */
/* eslint-disable @typescript-eslint/no-unused-vars */
-import { Decorator, Mutator } from 'final-form';
-import * as React from 'react';
-import { Field, Form } from 'react-final-form';
+import { Decorator, Mutator } from "final-form";
+import * as React from "react";
+import { Field, Form } from "react-final-form";
const noop = () => {};
// missing required props
@@ -77,7 +77,7 @@ function simpleSubscription() {
subscription={{
pristine: true,
submitting: true,
- values: true
+ values: true,
}}
>
{({ handleSubmit, form, submitting, pristine, values }) => (
@@ -97,7 +97,7 @@ function simpleSubscription() {
}
const setValue: Mutator = ([name, newValue], state, { changeValue }) => {
- changeValue(state, name, value => newValue);
+ changeValue(state, name, (value) => newValue);
};
function mutated() {
@@ -106,11 +106,11 @@ function mutated() {
{({
handleSubmit,
form: {
- mutators: { setValue }
+ mutators: { setValue },
},
submitting,
pristine,
- values
+ values,
}) => (
setValue('firstName', 'Kevin')}
+ onClick={(e) => setValue("firstName", "Kevin")}
disabled={submitting || pristine}
>
Reset
@@ -165,9 +165,9 @@ function withTypedFormData() {
);
}
-const decorator: Decorator = form => {
+const decorator: Decorator = (form) => {
return form.subscribe(({ values: { firstName } }) => firstName, {
- values: true
+ values: true,
});
};
@@ -179,7 +179,7 @@ function withTypedDecorator() {
// with wrong typed decorator
function withWrongTypedDecorator() {
return (
- >
+ >
// $ExpectError
decorators={[decorator]}
onSubmit={noop}
diff --git a/typescript/index.d.ts b/typescript/index.d.ts
index 055f1365..1a78c99d 100644
--- a/typescript/index.d.ts
+++ b/typescript/index.d.ts
@@ -1,4 +1,4 @@
-import * as React from 'react';
+import * as React from "react";
import {
FormApi,
Config,
@@ -7,12 +7,15 @@ import {
FormSubscription,
FieldState,
FieldSubscription,
- FieldValidator
-} from 'final-form';
+ FieldValidator,
+} from "final-form";
-type SupportedInputs = 'input' | 'select' | 'textarea';
+type SupportedInputs = "input" | "select" | "textarea";
-export interface ReactContext, InitialFormValues = Partial> {
+export interface ReactContext<
+ FormValues = Record,
+ InitialFormValues = Partial,
+> {
reactFinalForm: FormApi;
}
@@ -20,7 +23,7 @@ export type FieldMetaState = Pick<
FieldState,
Exclude<
keyof FieldState,
- 'blur' | 'change' | 'focus' | 'name' | 'value'
+ "blur" | "change" | "focus" | "name" | "value"
>
>;
@@ -42,26 +45,30 @@ interface AnyObject {
export interface FieldRenderProps<
FieldValue,
- T extends HTMLElement = HTMLElement
+ T extends HTMLElement = HTMLElement,
> {
input: FieldInputProps;
meta: FieldMetaState;
[otherProp: string]: any;
}
-export interface FormRenderProps, InitialFormValues = Partial>
- extends FormState,
+export interface FormRenderProps<
+ FormValues = Record,
+ InitialFormValues = Partial,
+> extends FormState,
RenderableProps> {
form: FormApi;
handleSubmit: (
event?: Partial<
- Pick
- >
+ Pick
+ >,
) => Promise | undefined;
}
-export interface FormSpyRenderProps, InitialFormValues = Partial>
- extends FormState {
+export interface FormSpyRenderProps<
+ FormValues = Record,
+ InitialFormValues = Partial,
+> extends FormState {
form: FormApi;
}
@@ -71,8 +78,10 @@ export interface RenderableProps {
render?: (props: T) => React.ReactNode;
}
-export interface FormProps, InitialFormValues = Partial>
- extends Config,
+export interface FormProps<
+ FormValues = Record,
+ InitialFormValues = Partial,
+> extends Config,
RenderableProps> {
subscription?: FormSubscription;
decorators?: Array>;
@@ -103,19 +112,25 @@ export interface UseFieldConfig {
export interface FieldProps<
FieldValue,
RP extends FieldRenderProps,
- T extends HTMLElement = HTMLElement
-> extends UseFieldConfig, RenderableProps {
+ T extends HTMLElement = HTMLElement,
+> extends UseFieldConfig,
+ RenderableProps {
name: string;
[otherProp: string]: any;
}
-export interface UseFormStateParams, InitialFormValues = Partial> {
+export interface UseFormStateParams<
+ FormValues = Record,
+ InitialFormValues = Partial,
+> {
onChange?: (formState: FormState) => void;
subscription?: FormSubscription;
}
-export interface FormSpyProps, InitialFormValues = Partial>
- extends UseFormStateParams,
+export interface FormSpyProps<
+ FormValues = Record,
+ InitialFormValues = Partial,
+> extends UseFormStateParams,
RenderableProps> {}
export const Field: <
@@ -124,27 +139,40 @@ export const Field: <
FieldValue,
HTMLElement
>,
- T extends HTMLElement = HTMLElement
+ T extends HTMLElement = HTMLElement,
>(
- props: FieldProps
+ props: FieldProps,
) => React.ReactElement;
-export const Form: , InitialFormValues = Partial>(
- props: FormProps
+export const Form: <
+ FormValues = Record,
+ InitialFormValues = Partial,
+>(
+ props: FormProps,
) => React.ReactElement;
-export const FormSpy: , InitialFormValues = Partial>(
- props: FormSpyProps
+export const FormSpy: <
+ FormValues = Record,
+ InitialFormValues = Partial,
+>(
+ props: FormSpyProps,
) => React.ReactElement;
export function useField(
name: string,
- config?: UseFieldConfig
+ config?: UseFieldConfig,
): FieldRenderProps;
-export function useForm, InitialFormValues = Partial>(
- componentName?: string
-): FormApi;
-export function useFormState, InitialFormValues = Partial>(
- params?: UseFormStateParams
+export function useForm<
+ FormValues = Record,
+ InitialFormValues = Partial,
+>(componentName?: string): FormApi;
+export function useFormState<
+ FormValues = Record,
+ InitialFormValues = Partial,
+>(
+ params?: UseFormStateParams,
): FormState;
-export function withTypes, InitialFormValues = Partial>(): {
+export function withTypes<
+ FormValues = Record,
+ InitialFormValues = Partial,
+>(): {
Form: React.FC>;
FormSpy: React.FC>;
};
diff --git a/typescript/useFormState.test.tsx b/typescript/useFormState.test.tsx
index 3e333bc7..703d9c6b 100644
--- a/typescript/useFormState.test.tsx
+++ b/typescript/useFormState.test.tsx
@@ -1,7 +1,7 @@
/* eslint-disable @typescript-eslint/no-unused-vars */
-import { useFormState } from 'react-final-form';
+import { useFormState } from "react-final-form";
-const submittingToLabel = (submitting: boolean) => (submitting ? 'Yes' : 'No');
+const submittingToLabel = (submitting: boolean) => (submitting ? "Yes" : "No");
function Comp1() {
const { submitting } = useFormState();
From 480847e5a702aba981ce54ae0de4483c86f0f049 Mon Sep 17 00:00:00 2001
From: Erik Rasmussen
Date: Sat, 25 Sep 2021 12:35:05 +0200
Subject: [PATCH 5/8] Node version
---
package.json | 3 +++
1 file changed, 3 insertions(+)
diff --git a/package.json b/package.json
index fd2db392..f36432c5 100644
--- a/package.json
+++ b/package.json
@@ -28,6 +28,9 @@
"url": "https://github.com/final-form/react-final-form/issues"
},
"homepage": "https://github.com/final-form/react-final-form#readme",
+ "engines": {
+ "node": "14"
+ },
"devDependencies": {
"@babel/core": "^7.15.5",
"@babel/plugin-proposal-class-properties": "^7.14.5",
From 953ecce098c17a307360c5c457d37b85f8552c44 Mon Sep 17 00:00:00 2001
From: Erik Rasmussen
Date: Sat, 25 Sep 2021 12:40:14 +0200
Subject: [PATCH 6/8] Travis and Github actions
---
.github/ci.yml | 2 ++
.travis.yml | 8 ++++----
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/.github/ci.yml b/.github/ci.yml
index d93f882f..9b1f7f9e 100644
--- a/.github/ci.yml
+++ b/.github/ci.yml
@@ -47,3 +47,5 @@ jobs:
run: yarn install --ignore-scripts --frozen-lockfile
- name: Run unit tests
run: yarn start test
+ - name: Run code coverage
+ run: npx codecov
diff --git a/.travis.yml b/.travis.yml
index 93ba8100..a446f863 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -8,13 +8,13 @@ cache:
notifications:
email: false
node_js:
- - '10'
- - '12'
- - '14'
+ - "10"
+ - "12"
+ - "14"
script:
- npm start validate
after_success:
- npx codecov
branches:
only:
- - master
+ - main
From 3a2a32bbd844fe9362892633fb34cafdd1997760 Mon Sep 17 00:00:00 2001
From: Erik Rasmussen
Date: Sat, 25 Sep 2021 13:00:44 +0200
Subject: [PATCH 7/8] Removed glow dep
---
package.json | 1 -
1 file changed, 1 deletion(-)
diff --git a/package.json b/package.json
index f36432c5..a421cb8c 100644
--- a/package.json
+++ b/package.json
@@ -70,7 +70,6 @@
"fast-deep-equal": "^3.1.3",
"final-form": "4.20.2",
"flow-bin": "^0.160.2",
- "glow": "^1.2.2",
"husky": "^4.3.0",
"jest": "^27.2.1",
"jest-mock-console": "^1.1.0",
From d73a998cf3873c9ac2676b2bf2fba721fbd2cb96 Mon Sep 17 00:00:00 2001
From: Erik Rasmussen
Date: Sat, 25 Sep 2021 13:01:42 +0200
Subject: [PATCH 8/8] Maybe fix CS CI bug?
---
.codesandbox/ci.json | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/.codesandbox/ci.json b/.codesandbox/ci.json
index d47c20ea..bbaf85e8 100644
--- a/.codesandbox/ci.json
+++ b/.codesandbox/ci.json
@@ -5,5 +5,6 @@
"/examples/field-level-validation",
"/examples/submission-errors",
"/examples/subscriptions"
- ]
+ ],
+ "node": "14"
}