diff --git a/.eslintrc.js b/.eslintrc.js index 71d7ac22..1fc1bc4f 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -11,14 +11,7 @@ module.exports = { }, }, { - files: [ - './**/__stories__/**/*', - './**/__stories__/**/*', - './**/*.test.*', - './**/*.test.*', - '*.ts', - '*.tsx', - ], + files: ['./**/__stories__/**/*', './**/__stories__/**/*', './**/*.test.*', './**/*.test.*'], rules: { 'require-jsdoc': 'off', 'jsdoc/require-jsdoc': 'off', diff --git a/.storybook/index.stories.mdx b/.storybook/index.stories.mdx index eee358ec..c97eb8dd 100644 --- a/.storybook/index.stories.mdx +++ b/.storybook/index.stories.mdx @@ -2,7 +2,7 @@ import { Meta } from '@storybook/addon-docs'; import Readme from '../readme.md'; ), }, + backgrounds: { + default: 'white', + values: [ + { + name: 'white', + value: '#fff', + }, + { + name: 'custom:gray', + value: '#ccc', + }, + ], + }, }; diff --git a/package-lock.json b/package-lock.json index 411c20fe..aef894bc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,8 +9,6 @@ "version": "0.0.0", "license": "Apache-2.0", "dependencies": { - "@sima-land/ui-nucleons": "^44.2.10", - "@sima-land/ui-quarks": "^3.6.0", "classnames": "^2.3.2", "date-fns": "^2.29.3", "lodash": "^4.17.21", @@ -25,6 +23,7 @@ "@rushstack/eslint-patch": "^1.2.0", "@sima-land/linters": "^2.2.0", "@storybook/addon-actions": "^6.5.16", + "@storybook/addon-backgrounds": "^6.5.16", "@storybook/addon-docs": "^6.5.16", "@storybook/addon-storysource": "^6.5.16", "@storybook/addon-viewport": "^6.5.16", @@ -54,7 +53,6 @@ "jest": "^29.4.1", "jest-environment-jsdom": "^29.4.1", "lint-staged": "^13.1.0", - "postcss": "^8.4.21", "prettier": "^2.8.3", "react": "^17.0.2", "react-docgen-typescript": "^2.2.2", @@ -71,6 +69,8 @@ "node": ">=16.15.1" }, "peerDependencies": { + "@sima-land/ui-nucleons": "^45.0.0-alpha.0", + "@sima-land/ui-quarks": "^3.6.0", "react": ">=17", "react-dom": ">=17" } @@ -2158,6 +2158,49 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/@floating-ui/core": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.1.1.tgz", + "integrity": "sha512-PL7g3dhA4dHgZfujkuD8Q+tfJJynEtnNQSPzmucCnxMvkxf4cLBJw/ZYqZUn4HCh33U3WHrAfv2R2tbi9UCSmw==", + "peer": true + }, + "node_modules/@floating-ui/dom": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.1.1.tgz", + "integrity": "sha512-TpIO93+DIujg3g7SykEAGZMDtbJRrmnYRCNYSjJlvIbGhBjRSNTLVbNeDQBrzy9qDgUbiWdc7KA0uZHZ2tJmiw==", + "peer": true, + "dependencies": { + "@floating-ui/core": "^1.1.0" + } + }, + "node_modules/@floating-ui/react": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.17.0.tgz", + "integrity": "sha512-LYlTmiB1O2TmeNub1agGYJrO7Qkw1B0Q53aElN5dgZDO5v3yzYJmrGm/xmfD+0T03yEECzPKdwlSFCEPWKMLEQ==", + "peer": true, + "dependencies": { + "@floating-ui/react-dom": "^1.2.0", + "aria-hidden": "^1.1.3", + "tabbable": "^6.0.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-1.2.2.tgz", + "integrity": "sha512-DbmFBLwFrZhtXgCI2ra7wXYT8L2BN4/4AMQKyu05qzsVji51tXOfF36VE2gpMB6nhJGHa85PdEg75FB4+vnLFQ==", + "peer": true, + "dependencies": { + "@floating-ui/dom": "^1.1.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, "node_modules/@gar/promisify": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", @@ -3844,9 +3887,10 @@ } }, "node_modules/@krutoo/input-mask": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@krutoo/input-mask/-/input-mask-0.0.8.tgz", - "integrity": "sha512-EleFytQTqwfiFPyW8Ca486nuFRiLE23G2vfod4fq4ac0SZVZlgu3Bi5ULZLTXFWfmqQs5TPsQVA+7TyWwrgmFw==" + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@krutoo/input-mask/-/input-mask-0.0.9.tgz", + "integrity": "sha512-J30IxwnPkA45BpDrsEVQS+Ntc16aIvYPrHF/aEMliFiIavwduDpfQdrE4VubdI7iqfkFWjss9nZZ4c6hyJRW4A==", + "peer": true }, "node_modules/@mdx-js/mdx": { "version": "1.6.22", @@ -4186,23 +4230,26 @@ } }, "node_modules/@sima-land/ui-nucleons": { - "version": "44.2.10", - "resolved": "https://registry.npmjs.org/@sima-land/ui-nucleons/-/ui-nucleons-44.2.10.tgz", - "integrity": "sha512-x3Y2kKOuG2ZxaY54P1N6z/EnqUyBHCjMMg4r/jKGW8m6z3Tm6lAe9pxP57VY19REJmUnYKDAdPYPFanS2tzwFw==", + "version": "45.0.0-alpha.0", + "resolved": "https://registry.npmjs.org/@sima-land/ui-nucleons/-/ui-nucleons-45.0.0-alpha.0.tgz", + "integrity": "sha512-RFMFJMzXmCvJyNVPO4LxwMjZu3MkpY8M6igWtoeSgQzkfyN0j74Z2dsELQzbML2LDLMrDTTwdCRMsWJr+LgVwQ==", + "peer": true, "dependencies": { - "@krutoo/input-mask": "^0.0.8", - "@sima-land/ui-quarks": "^3.0.0", + "@floating-ui/react": "^0.17.0", + "@krutoo/input-mask": "^0.0.9", + "@sima-land/ui-quarks": "^3.6.0", "body-scroll-lock": "3.1.5", "classnames": "^2.3.1", "date-fns": "^2.28.0", - "intersection-observer": "^0.12.0", + "focus-trap": "^7.2.0", "lodash": "^4.17.21", - "overlayscrollbars": "^1.13.1", - "overlayscrollbars-react": "^0.2.3", - "react-transition-group": "^4.4.2" + "overlayscrollbars": "^1.13.3", + "overlayscrollbars-react": "^0.3.0", + "react-transition-group": "^4.4.2", + "redux": "^4.2.0" }, "engines": { - "node": ">=14.15.5" + "node": ">=16.15.1" }, "peerDependencies": { "react": ">=17", @@ -4212,7 +4259,8 @@ "node_modules/@sima-land/ui-quarks": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/@sima-land/ui-quarks/-/ui-quarks-3.6.0.tgz", - "integrity": "sha512-i1P9AVNQ52fSugcCFGfwj7lNE/mVQZXmY4vyjlxkZco57Xy84MyvA1UtxRDImMgMIDnzbTV0JFMfum6YYd16QA==" + "integrity": "sha512-i1P9AVNQ52fSugcCFGfwj7lNE/mVQZXmY4vyjlxkZco57Xy84MyvA1UtxRDImMgMIDnzbTV0JFMfum6YYd16QA==", + "peer": true }, "node_modules/@sinclair/typebox": { "version": "0.25.21", @@ -4281,6 +4329,43 @@ } } }, + "node_modules/@storybook/addon-backgrounds": { + "version": "6.5.16", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-6.5.16.tgz", + "integrity": "sha512-t7qooZ892BruhilFmzYPbysFwpULt/q4zYXNSmKVbAYta8UVvitjcU4F18p8FpWd9WvhiTr0SDlyhNZuzvDfug==", + "dev": true, + "dependencies": { + "@storybook/addons": "6.5.16", + "@storybook/api": "6.5.16", + "@storybook/client-logger": "6.5.16", + "@storybook/components": "6.5.16", + "@storybook/core-events": "6.5.16", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/theming": "6.5.16", + "core-js": "^3.8.2", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, "node_modules/@storybook/addon-docs": { "version": "6.5.16", "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-6.5.16.tgz", @@ -10452,7 +10537,7 @@ "version": "17.0.37", "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.37.tgz", "integrity": "sha512-2FS1oTqBGcH/s0E+CjrCCR9+JMpsu9b69RTFO+40ua43ZqP5MmQ4iUde/dMjWR909KxZwmOQIFq6AV6NjEG5xg==", - "dev": true, + "devOptional": true, "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -10481,13 +10566,13 @@ "version": "3.0.10", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz", "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==", - "dev": true + "devOptional": true }, "node_modules/@types/scheduler": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "dev": true + "devOptional": true }, "node_modules/@types/semver": { "version": "7.3.13", @@ -11518,6 +11603,27 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/aria-hidden": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.2.tgz", + "integrity": "sha512-6y/ogyDTk/7YAe91T3E2PR1ALVKyM2QbTio5HwM+N1Q6CMlCKhvClyIjkckBswa0f2xJhjsfzIGa1yVSe1UMVA==", + "peer": true, + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.9.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/aria-query": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz", @@ -12634,7 +12740,8 @@ "node_modules/body-scroll-lock": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/body-scroll-lock/-/body-scroll-lock-3.1.5.tgz", - "integrity": "sha512-Yi1Xaml0EvNA0OYWxXiYNqY24AfWkbA6w5vxE7GWxtKfzIbZM+Qw+aSmkgsbWzbHiy/RCSkUZBplVxTA+E4jJg==" + "integrity": "sha512-Yi1Xaml0EvNA0OYWxXiYNqY24AfWkbA6w5vxE7GWxtKfzIbZM+Qw+aSmkgsbWzbHiy/RCSkUZBplVxTA+E4jJg==", + "peer": true }, "node_modules/boolbase": { "version": "1.0.0", @@ -17238,6 +17345,15 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/focus-trap": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.2.0.tgz", + "integrity": "sha512-v4wY6HDDYvzkBy4735kW5BUEuw6Yz9ABqMYLuTNbzAFPcBOGiGHwwcNVMvUz4G0kgSYh13wa/7TG3XwTeT4O/A==", + "peer": true, + "dependencies": { + "tabbable": "^6.0.1" + } + }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -18832,11 +18948,6 @@ "node": ">= 0.10" } }, - "node_modules/intersection-observer": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.12.0.tgz", - "integrity": "sha512-2Vkz8z46Dv401zTWudDGwO7KiGHNDkMv417T5ItcNYfmvHR/1qCTVBO9vwH8zZmQ0WkA/1ARwpysR9bsnop4NQ==" - }, "node_modules/ip": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", @@ -25077,17 +25188,19 @@ } }, "node_modules/overlayscrollbars": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/overlayscrollbars/-/overlayscrollbars-1.13.1.tgz", - "integrity": "sha512-gIQfzgGgu1wy80EB4/6DaJGHMEGmizq27xHIESrzXq0Y/J0Ay1P3DWk6tuVmEPIZH15zaBlxeEJOqdJKmowHCQ==" + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/overlayscrollbars/-/overlayscrollbars-1.13.3.tgz", + "integrity": "sha512-1nB/B5kaakJuHXaLXLRK0bUIilWhUGT6q5g+l2s5vqYdLle/sd0kscBHkQC1kuuDg9p9WR4MTdySDOPbeL/86g==", + "peer": true }, "node_modules/overlayscrollbars-react": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/overlayscrollbars-react/-/overlayscrollbars-react-0.2.3.tgz", - "integrity": "sha512-eN/JsEtJvPulOXOZXIdo1H90eriUWcgj4TwSdOcchk2M4uY2/BpsHlZ2+0viZMLXTcNQNJz+/4m47NugSBg+0g==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/overlayscrollbars-react/-/overlayscrollbars-react-0.3.0.tgz", + "integrity": "sha512-dV74p9VL/aImqJpeYz0vmpScZYu6UiNTmRKfyI4CS0OYUpYCUiTd723adY38Grz2W57hoNCECWDzkOJRFDQeZg==", + "peer": true, "peerDependencies": { "overlayscrollbars": "^1.10.0", - "react": "^16.4.0 || ^17.0.0" + "react": "^16.4.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/p-all": { @@ -26709,6 +26822,15 @@ "node": ">=8" } }, + "node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, "node_modules/refractor": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", @@ -29118,6 +29240,12 @@ "integrity": "sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g==", "dev": true }, + "node_modules/tabbable": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.0.1.tgz", + "integrity": "sha512-SYJSIgeyXW7EuX1ytdneO5e8jip42oHWg9xl/o3oTYhmXusZVgiA+VlPvjIN+kHii9v90AmzTZEBcsEvuAY+TA==", + "peer": true + }, "node_modules/table": { "version": "6.8.1", "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", @@ -32970,6 +33098,41 @@ } } }, + "@floating-ui/core": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.1.1.tgz", + "integrity": "sha512-PL7g3dhA4dHgZfujkuD8Q+tfJJynEtnNQSPzmucCnxMvkxf4cLBJw/ZYqZUn4HCh33U3WHrAfv2R2tbi9UCSmw==", + "peer": true + }, + "@floating-ui/dom": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.1.1.tgz", + "integrity": "sha512-TpIO93+DIujg3g7SykEAGZMDtbJRrmnYRCNYSjJlvIbGhBjRSNTLVbNeDQBrzy9qDgUbiWdc7KA0uZHZ2tJmiw==", + "peer": true, + "requires": { + "@floating-ui/core": "^1.1.0" + } + }, + "@floating-ui/react": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.17.0.tgz", + "integrity": "sha512-LYlTmiB1O2TmeNub1agGYJrO7Qkw1B0Q53aElN5dgZDO5v3yzYJmrGm/xmfD+0T03yEECzPKdwlSFCEPWKMLEQ==", + "peer": true, + "requires": { + "@floating-ui/react-dom": "^1.2.0", + "aria-hidden": "^1.1.3", + "tabbable": "^6.0.1" + } + }, + "@floating-ui/react-dom": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-1.2.2.tgz", + "integrity": "sha512-DbmFBLwFrZhtXgCI2ra7wXYT8L2BN4/4AMQKyu05qzsVji51tXOfF36VE2gpMB6nhJGHa85PdEg75FB4+vnLFQ==", + "peer": true, + "requires": { + "@floating-ui/dom": "^1.1.1" + } + }, "@gar/promisify": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", @@ -34245,9 +34408,10 @@ } }, "@krutoo/input-mask": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@krutoo/input-mask/-/input-mask-0.0.8.tgz", - "integrity": "sha512-EleFytQTqwfiFPyW8Ca486nuFRiLE23G2vfod4fq4ac0SZVZlgu3Bi5ULZLTXFWfmqQs5TPsQVA+7TyWwrgmFw==" + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@krutoo/input-mask/-/input-mask-0.0.9.tgz", + "integrity": "sha512-J30IxwnPkA45BpDrsEVQS+Ntc16aIvYPrHF/aEMliFiIavwduDpfQdrE4VubdI7iqfkFWjss9nZZ4c6hyJRW4A==", + "peer": true }, "@mdx-js/mdx": { "version": "1.6.22", @@ -34490,26 +34654,30 @@ } }, "@sima-land/ui-nucleons": { - "version": "44.2.10", - "resolved": "https://registry.npmjs.org/@sima-land/ui-nucleons/-/ui-nucleons-44.2.10.tgz", - "integrity": "sha512-x3Y2kKOuG2ZxaY54P1N6z/EnqUyBHCjMMg4r/jKGW8m6z3Tm6lAe9pxP57VY19REJmUnYKDAdPYPFanS2tzwFw==", + "version": "45.0.0-alpha.0", + "resolved": "https://registry.npmjs.org/@sima-land/ui-nucleons/-/ui-nucleons-45.0.0-alpha.0.tgz", + "integrity": "sha512-RFMFJMzXmCvJyNVPO4LxwMjZu3MkpY8M6igWtoeSgQzkfyN0j74Z2dsELQzbML2LDLMrDTTwdCRMsWJr+LgVwQ==", + "peer": true, "requires": { - "@krutoo/input-mask": "^0.0.8", - "@sima-land/ui-quarks": "^3.0.0", + "@floating-ui/react": "^0.17.0", + "@krutoo/input-mask": "^0.0.9", + "@sima-land/ui-quarks": "^3.6.0", "body-scroll-lock": "3.1.5", "classnames": "^2.3.1", "date-fns": "^2.28.0", - "intersection-observer": "^0.12.0", + "focus-trap": "^7.2.0", "lodash": "^4.17.21", - "overlayscrollbars": "^1.13.1", - "overlayscrollbars-react": "^0.2.3", - "react-transition-group": "^4.4.2" + "overlayscrollbars": "^1.13.3", + "overlayscrollbars-react": "^0.3.0", + "react-transition-group": "^4.4.2", + "redux": "^4.2.0" } }, "@sima-land/ui-quarks": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/@sima-land/ui-quarks/-/ui-quarks-3.6.0.tgz", - "integrity": "sha512-i1P9AVNQ52fSugcCFGfwj7lNE/mVQZXmY4vyjlxkZco57Xy84MyvA1UtxRDImMgMIDnzbTV0JFMfum6YYd16QA==" + "integrity": "sha512-i1P9AVNQ52fSugcCFGfwj7lNE/mVQZXmY4vyjlxkZco57Xy84MyvA1UtxRDImMgMIDnzbTV0JFMfum6YYd16QA==", + "peer": true }, "@sinclair/typebox": { "version": "0.25.21", @@ -34562,6 +34730,27 @@ "uuid-browser": "^3.1.0" } }, + "@storybook/addon-backgrounds": { + "version": "6.5.16", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-6.5.16.tgz", + "integrity": "sha512-t7qooZ892BruhilFmzYPbysFwpULt/q4zYXNSmKVbAYta8UVvitjcU4F18p8FpWd9WvhiTr0SDlyhNZuzvDfug==", + "dev": true, + "requires": { + "@storybook/addons": "6.5.16", + "@storybook/api": "6.5.16", + "@storybook/client-logger": "6.5.16", + "@storybook/components": "6.5.16", + "@storybook/core-events": "6.5.16", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/theming": "6.5.16", + "core-js": "^3.8.2", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, "@storybook/addon-docs": { "version": "6.5.16", "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-6.5.16.tgz", @@ -39334,7 +39523,7 @@ "version": "17.0.37", "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.37.tgz", "integrity": "sha512-2FS1oTqBGcH/s0E+CjrCCR9+JMpsu9b69RTFO+40ua43ZqP5MmQ4iUde/dMjWR909KxZwmOQIFq6AV6NjEG5xg==", - "dev": true, + "devOptional": true, "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -39345,7 +39534,7 @@ "version": "3.0.10", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz", "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==", - "dev": true + "devOptional": true } } }, @@ -39371,7 +39560,7 @@ "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "dev": true + "devOptional": true }, "@types/semver": { "version": "7.3.13", @@ -40208,6 +40397,15 @@ "sprintf-js": "~1.0.2" } }, + "aria-hidden": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.2.tgz", + "integrity": "sha512-6y/ogyDTk/7YAe91T3E2PR1ALVKyM2QbTio5HwM+N1Q6CMlCKhvClyIjkckBswa0f2xJhjsfzIGa1yVSe1UMVA==", + "peer": true, + "requires": { + "tslib": "^2.0.0" + } + }, "aria-query": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz", @@ -41053,7 +41251,8 @@ "body-scroll-lock": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/body-scroll-lock/-/body-scroll-lock-3.1.5.tgz", - "integrity": "sha512-Yi1Xaml0EvNA0OYWxXiYNqY24AfWkbA6w5vxE7GWxtKfzIbZM+Qw+aSmkgsbWzbHiy/RCSkUZBplVxTA+E4jJg==" + "integrity": "sha512-Yi1Xaml0EvNA0OYWxXiYNqY24AfWkbA6w5vxE7GWxtKfzIbZM+Qw+aSmkgsbWzbHiy/RCSkUZBplVxTA+E4jJg==", + "peer": true }, "boolbase": { "version": "1.0.0", @@ -44693,6 +44892,15 @@ } } }, + "focus-trap": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.2.0.tgz", + "integrity": "sha512-v4wY6HDDYvzkBy4735kW5BUEuw6Yz9ABqMYLuTNbzAFPcBOGiGHwwcNVMvUz4G0kgSYh13wa/7TG3XwTeT4O/A==", + "peer": true, + "requires": { + "tabbable": "^6.0.1" + } + }, "for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -45909,11 +46117,6 @@ "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", "dev": true }, - "intersection-observer": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.12.0.tgz", - "integrity": "sha512-2Vkz8z46Dv401zTWudDGwO7KiGHNDkMv417T5ItcNYfmvHR/1qCTVBO9vwH8zZmQ0WkA/1ARwpysR9bsnop4NQ==" - }, "ip": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", @@ -50587,14 +50790,16 @@ "optional": true }, "overlayscrollbars": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/overlayscrollbars/-/overlayscrollbars-1.13.1.tgz", - "integrity": "sha512-gIQfzgGgu1wy80EB4/6DaJGHMEGmizq27xHIESrzXq0Y/J0Ay1P3DWk6tuVmEPIZH15zaBlxeEJOqdJKmowHCQ==" + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/overlayscrollbars/-/overlayscrollbars-1.13.3.tgz", + "integrity": "sha512-1nB/B5kaakJuHXaLXLRK0bUIilWhUGT6q5g+l2s5vqYdLle/sd0kscBHkQC1kuuDg9p9WR4MTdySDOPbeL/86g==", + "peer": true }, "overlayscrollbars-react": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/overlayscrollbars-react/-/overlayscrollbars-react-0.2.3.tgz", - "integrity": "sha512-eN/JsEtJvPulOXOZXIdo1H90eriUWcgj4TwSdOcchk2M4uY2/BpsHlZ2+0viZMLXTcNQNJz+/4m47NugSBg+0g==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/overlayscrollbars-react/-/overlayscrollbars-react-0.3.0.tgz", + "integrity": "sha512-dV74p9VL/aImqJpeYz0vmpScZYu6UiNTmRKfyI4CS0OYUpYCUiTd723adY38Grz2W57hoNCECWDzkOJRFDQeZg==", + "peer": true, "requires": {} }, "p-all": { @@ -51829,6 +52034,15 @@ "strip-indent": "^3.0.0" } }, + "redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "peer": true, + "requires": { + "@babel/runtime": "^7.9.2" + } + }, "refractor": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", @@ -53750,6 +53964,12 @@ "integrity": "sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g==", "dev": true }, + "tabbable": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.0.1.tgz", + "integrity": "sha512-SYJSIgeyXW7EuX1ytdneO5e8jip42oHWg9xl/o3oTYhmXusZVgiA+VlPvjIN+kHii9v90AmzTZEBcsEvuAY+TA==", + "peer": true + }, "table": { "version": "6.8.1", "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", diff --git a/package.json b/package.json index c8819a69..6263a24f 100644 --- a/package.json +++ b/package.json @@ -25,8 +25,6 @@ "prettier:check": "prettier --check \"./src/**/*.{js,jsx,ts,tsx,css,scss}\" --loglevel error" }, "dependencies": { - "@sima-land/ui-nucleons": "^44.2.10", - "@sima-land/ui-quarks": "^3.6.0", "classnames": "^2.3.2", "date-fns": "^2.29.3", "lodash": "^4.17.21", @@ -34,6 +32,8 @@ "react-transition-group": "^4.4.5" }, "peerDependencies": { + "@sima-land/ui-nucleons": "^45.0.0-alpha.0", + "@sima-land/ui-quarks": "^3.6.0", "react": ">=17", "react-dom": ">=17" }, @@ -45,6 +45,7 @@ "@rushstack/eslint-patch": "^1.2.0", "@sima-land/linters": "^2.2.0", "@storybook/addon-actions": "^6.5.16", + "@storybook/addon-backgrounds": "^6.5.16", "@storybook/addon-docs": "^6.5.16", "@storybook/addon-storysource": "^6.5.16", "@storybook/addon-viewport": "^6.5.16", @@ -74,7 +75,6 @@ "jest": "^29.4.1", "jest-environment-jsdom": "^29.4.1", "lint-staged": "^13.1.0", - "postcss": "^8.4.21", "prettier": "^2.8.3", "react": "^17.0.2", "react-docgen-typescript": "^2.2.2", diff --git a/postcss.config.js b/postcss.config.js deleted file mode 100644 index eb022cd6..00000000 --- a/postcss.config.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - plugins: [ - require('autoprefixer'), - ], -}; diff --git a/readme.md b/readme.md index 9572b4e9..ffe6bed9 100644 --- a/readme.md +++ b/readme.md @@ -4,7 +4,7 @@ React-компоненты, привязанные к контексту инт ## Начало работы -### Подключение +### Установка Для подключения к проекту используйте @@ -12,70 +12,65 @@ React-компоненты, привязанные к контексту инт # npm $ npm i -S @sima-land/moleculas -# yarn +# или yarn $ yarn add @sima-land/moleculas ``` +### Настройка среды + +Компоненты библиотеки используют: + +- импорты изображений (jpg, png..) как URL/base64 +- импорты css/scss-файлов как css-модулей (каждый такой файл промаркирован в виде `*.module.scss`) +- импорты svg-файлов как react-компонентов + +Поэтому, для использования библиотеки необходимо сконфигурировать среду (сборщик или тестовый фреймворк) таким образом чтобы данные импорты работали корректно. + +## Разработка + ### Консольные команды, необходимые в процессе разработки - `npm run test` - запуск unit-тестов - `npm run lint` - запуск линтеров - `npm run storybook` - запуск _storybook_ -## Соглашения +### Общие соглашения -1. В проекте используется линтер _ESLint_. Чтобы сделать `commit` и `push` в репозиторий, изменения должны пройти проверку линтером. -1. Необходимо полное покрытие тестами всего функционала. Чтобы сделать `push` в репозиторий, все тесты должны пройти успешно. -1. Коммиты должны быть оформлены по следующему шаблону: +1. Сообщения коммитов должны быть оформлены по следующему шаблону: ``` - [№ задачи] [Название задачи] + [№ задачи] - [Изменение №1] - [Изменение №2] + - [Изменение №1] + - [Изменение №2] ... - [Изменение №n] + - [Изменение №n] ``` Пример: ``` - #62 Подключить отладку серверного приложения, написать документацию по работе с проектом + #62 - Внесены изменения в README.md, добавлены инструкции по началу работы в проекте - Добавлены конфигурационные файлы для Jest - Настроена отладка приложения в режиме разработки, инструкции по настройке IDE добавлены в README.md + - Внесены изменения в README.md, добавлены инструкции по началу работы в проекте + - Добавлены конфигурационные файлы для Jest + - Настроена отладка приложения в режиме разработки, инструкции по настройке IDE добавлены в README.md ``` -## Отладка - -Для отладки иногда полезно подключить данную библиотеку к проекту напрямую, сделав `symlink` в файловой системе. - -1. Клонируем библиотеку. Заходим в папку этой библиотеки и делаем `npm run build && cd build && npm link`. Это нужно сделать 1 раз. -2. Заходим в папку проекта к которому подключена библиотека и делаем `npm link "@sima-land/moleculas"`. Это - приведет к тому, что код в node_modules будет заменен на ссылку в вашей FS. -3. Для возврата в нормальный режим `npm unlink "@sima-land/moleculas" && npm install --force` - -Примечание: Если возникли ошибки с реактом/хуками, и одной из проблем в логе ошибки значится дублирование react'a, -следует сделать линк реакта молекул с реактом проекта: - -1. Директория проекта куда добавлены молекулы `cd ./node_modules/react && yarn link`. -2. Директория молекул `npm link "react"`. - -## Витрина компонентов +### Витрина компонентов В качестве витрины компонентов для отображения размещенных в библиотеке компонентов используется [storybook](https://storybook.js.org/) Истории и документация компонентов позволяют увидеть варианты использования компонента с различными свойствами и примеры использования не вникая в код и логику компонента, что позволяет ускорить разработку при использовании библиотеки. Поэтому, при создании историй/документации компонентов необходимо учитывать различные **варианты использования** и различные **комбинации входных параметров**. -### Соглашения +#### Соглашения по витрине компонентов Истории компонентов должны соответствовать формату `*.stories.(ts|tsx)`. Истории и вспомогательные файлы должны размещаться в директории `__stories__` в директории компонента. -### Требования к историям/документации +#### Требования к историям/документации **История должна содержать:** @@ -90,3 +85,18 @@ $ yarn add @sima-land/moleculas - Блок кода с примером использования компонента; - Если компонент принимает в параметрах функции-обработчики, то они должны быть объявлены как [action](https://storybook.js.org/docs/react/essentials/actions), для отображения выполнения обработчиков на вкладке _Actions_ в UI. Для свойств-обработчиков, чьи имена начинаются с `on*` добавление [action](https://storybook.js.org/docs/react/essentials/actions) происходит автоматически, дополнительных действий с ними не требуется. + +### Отладка + +Для отладки иногда полезно подключить данную библиотеку к проекту напрямую, сделав `symlink` в файловой системе. + +1. Клонируем библиотеку. Заходим в папку этой библиотеки и делаем `npm run build && cd build && npm link`. Это нужно сделать 1 раз. +2. Заходим в папку проекта к которому подключена библиотека и делаем `npm link "@sima-land/moleculas"`. Это + приведет к тому, что код в node_modules будет заменен на ссылку в вашей FS. +3. Для возврата в нормальный режим `npm unlink "@sima-land/moleculas" && npm install --force` + +Примечание: Если возникли ошибки с реактом/хуками, и одной из проблем в логе ошибки значится дублирование react'a, +следует сделать линк реакта молекул с реактом проекта: + +1. Директория проекта куда добавлены молекулы `cd ./node_modules/react && yarn link`. +2. Директория молекул `npm link "react"`. diff --git a/src/common/components/adult-block/__test__/__snapshots__/adult-block.test.tsx.snap b/src/common/components/adult-block/__test__/__snapshots__/adult-block.test.tsx.snap deleted file mode 100644 index 62ba57b6..00000000 --- a/src/common/components/adult-block/__test__/__snapshots__/adult-block.test.tsx.snap +++ /dev/null @@ -1,79 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[` should render with props 1`] = ` -
-
-
- - Товар для взрослых - -
- - Подтвердите, что вы старше 18 лет, чтобы посмотреть товар. - - -
-
-`; - -exports[` should render without props 1`] = ` -
-
-
- - Товар для взрослых - -
- - Если вам уже есть 18 лет, авторизуйтесь, чтобы перейти к товару. - - -
-
-`; diff --git a/src/common/components/adult-block/__test__/adult-block.test.tsx b/src/common/components/adult-block/__test__/adult-block.test.tsx deleted file mode 100644 index f788f49c..00000000 --- a/src/common/components/adult-block/__test__/adult-block.test.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import React from 'react'; -import { AdultBlock } from '..'; -import { fireEvent, render } from '@testing-library/react'; - -describe('', () => { - it('should render without props', () => { - const { container } = render(); - expect(container).toMatchSnapshot(); - }); - - it('should render with props', () => { - const spy = jest.fn(); - - const { container, getByRole } = render(); - - expect(container).toMatchSnapshot(); - - expect(spy).toHaveBeenCalledTimes(0); - fireEvent.click(getByRole('button')); - expect(spy).toHaveBeenCalledTimes(1); - }); -}); diff --git a/src/common/components/adult-block/index.tsx b/src/common/components/adult-block/index.tsx deleted file mode 100644 index 48561f2d..00000000 --- a/src/common/components/adult-block/index.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import React from 'react'; -import { Box } from '@sima-land/ui-nucleons/box'; -import { Text } from '@sima-land/ui-nucleons/text'; -import { Link } from '@sima-land/ui-nucleons/link'; - -export interface AdultBlockProps { - isAuthUser?: boolean; - onClick?: React.MouseEventHandler; - marginTop?: number; -} - -const textBlocks = { - forGuest: { - condition: 'Если вам уже есть 18 лет, авторизуйтесь, чтобы перейти к товару.', - action: 'Авторизоваться', - }, - forAuthorized: { - condition: 'Подтвердите, что вы старше 18 лет, чтобы посмотреть товар.', - action: 'Подтвердить', - }, -}; - -/** - * Компонент блока-заглушки описания товара для взрослых. - * @param props Свойства компонента. - * @param props.isAuthUser Пользователь авторизован. - * @param props.onClick Обработчик клика на ссылку. - * @param props.alignItems Расположение блоков. - * @param props.marginTop Отступ сверху. - * @return Элемент. - */ -export const AdultBlock = ({ isAuthUser, onClick, marginTop = 0 }: AdultBlockProps) => { - const actualTextBlocks = isAuthUser ? textBlocks.forAuthorized : textBlocks.forGuest; - - return ( - - - - Товар для взрослых - - - - {actualTextBlocks.condition} - - - - - {actualTextBlocks.action} - - - - - ); -}; diff --git a/src/common/components/badge-list/__stories__/index.stories.tsx b/src/common/components/badge-list/__stories__/index.stories.tsx index facb2997..f09c9c20 100644 --- a/src/common/components/badge-list/__stories__/index.stories.tsx +++ b/src/common/components/badge-list/__stories__/index.stories.tsx @@ -1,8 +1,8 @@ -import React from 'react'; +import React, { useState } from 'react'; import { BadgeList } from '..'; import { Badge, BadgeProps } from '../../badge'; import { addMonths } from 'date-fns'; -import { WithHint } from '@sima-land/ui-nucleons/with-hint'; +import { Hint, useHintFloating, useHintFloatingStyle } from '@sima-land/ui-nucleons/hint'; const items: BadgeProps[] = [ { @@ -77,25 +77,32 @@ export const Primary = () => ( Primary.storyName = 'Простой пример'; export function Hints() { + const [open, setOpen] = useState(false); + const { refs, ...floating } = useHintFloating({ open, onOpenChange: setOpen }); + const style = useHintFloatingStyle(floating); + return ( - + <> {items.map((item, index) => ( - - - {(ref, toggle) => ( - toggle(true)} - onMouseLeave={() => toggle(false)} - /> - )} - - + { + refs.setReference(e.currentTarget); + setOpen(true); + }} + onMouseLeave={() => { + setOpen(false); + }} + {...item} + /> ))} - + + + Тестовый хинт для шильдика + + ); } diff --git a/src/common/components/badge-list/index.tsx b/src/common/components/badge-list/index.tsx index 57419705..9677a206 100644 --- a/src/common/components/badge-list/index.tsx +++ b/src/common/components/badge-list/index.tsx @@ -42,6 +42,11 @@ export const BadgeList = ({ children, className, lineLimit, style }: BadgeListPr ); +/** + * Слот для вывода Badge с произвольной оберткой. + * @param props Свойства. + * @return Элемент. + */ function BadgeListSlot({ children }: { children?: ReactNode }) { return
{children}
; } diff --git a/src/common/components/badge/__stories__/badge.stories.tsx b/src/common/components/badge/__stories__/badge.stories.tsx index 646bb123..95ddbadd 100644 --- a/src/common/components/badge/__stories__/badge.stories.tsx +++ b/src/common/components/badge/__stories__/badge.stories.tsx @@ -1,18 +1,13 @@ -import React from 'react'; +import React, { useState } from 'react'; import { Badge } from '..'; import { addDays, addMonths } from 'date-fns'; -import { WithHint } from '@sima-land/ui-nucleons/with-hint'; +import { Hint, useHintFloating, useHintOnHover } from '@sima-land/ui-nucleons/hint'; export default { title: 'common/Badge', component: Badge, parameters: { layout: 'padded', - docs: { - description: { - component: 'Компонент шильдика', - }, - }, }, }; @@ -103,21 +98,25 @@ export const NoInteractiveView = () => ( NoInteractiveView.storyName = 'Без ссылки и hover'; -export const Hints = () => ( -
- - {(ref, toggle) => ( - toggle(true)} - onMouseLeave={() => toggle(false)} - /> - )} - -
-); +export function Hints() { + const [open, setOpen] = useState(false); + const { refs, ...floating } = useHintFloating({ open, onOpenChange: setOpen }); + const { getReferenceProps, getFloatingProps } = useHintOnHover(floating); + + return ( +
+ + + Привет, это очень простой хинт + +
+ ); +} Hints.storyName = 'С хинтом'; diff --git a/src/common/components/intractive-image/interactive-image.tsx b/src/common/components/intractive-image/interactive-image.tsx index c8bc62b4..c19610c1 100644 --- a/src/common/components/intractive-image/interactive-image.tsx +++ b/src/common/components/intractive-image/interactive-image.tsx @@ -39,6 +39,10 @@ export const InteractiveImage = forwardRef) { return ( ( ({ className, 'data-testid': testId = 'interactive-image:image', ...rest }, ref) => ( ), ); +/** + * Точка которая будет располагаться на изображении. + * @param props Свойства. + * @return Элемент. + */ const Point = forwardRef( ({ x, y, className, style, 'data-testid': testId = 'interactive-image:point', ...rest }, ref) => ( - - + + - + - + - + - + - + - + Сапоги детские MINAKU, цвет синий, размер 31 - Фото 5 + + + +
+
- -
- - + + - -
+ + + +
- -
+ +
- + @@ -432,26 +422,21 @@ exports[`GalleryModal should renders 1`] = ` exports[`GalleryModal should renders with review footer 1`] = `
+ +
+
+
- -
- - + + - -
+ + + +
- -
+ +
+ +
@@ -968,26 +948,21 @@ exports[`GalleryModal should renders with review footer 1`] = ` exports[`GalleryModal should renders with review footer 2`] = `
+
+ @@ -1416,26 +1386,21 @@ exports[`GalleryModal should renders with review footer 2`] = ` exports[`GalleryModal should renders with review footer 3`] = `
+ +
+
-
- Сапоги детские MINAKU, цвет синий, размер 31 - Фото 1 -
+ Сапоги детские MINAKU, цвет синий, размер 31 - Фото 1
- -
+ +
+
+ @@ -1863,26 +1823,21 @@ exports[`GalleryModal should renders with review footer 3`] = ` exports[`GalleryModal should renders with review footer 4`] = `
+ +
+
-
- Сапоги детские MINAKU, цвет синий, размер 31 - Фото 3 -
-
- - + Сапоги детские MINAKU, цвет синий, размер 31 - Фото 3 +
+ +
+ + @@ -2310,26 +2260,21 @@ exports[`GalleryModal should renders with review footer 4`] = ` exports[`GalleryModal should renders with review footer 5`] = `
+ +
+
-
- Сапоги детские MINAKU, цвет синий, размер 31 - Фото 2 -
+ Сапоги детские MINAKU, цвет синий, размер 31 - Фото 2
- -
+ +
+ + @@ -2757,26 +2697,21 @@ exports[`GalleryModal should renders with review footer 5`] = ` exports[`GalleryModal should renders with single item media list 1`] = `