diff --git a/packages/plasma-ui/package-lock.json b/packages/plasma-ui/package-lock.json index db40ae713..f74ffaa8c 100644 --- a/packages/plasma-ui/package-lock.json +++ b/packages/plasma-ui/package-lock.json @@ -5621,6 +5621,16 @@ "@hapi/hoek": "^8.3.0" } }, + "@hypnosphi/create-react-context": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@hypnosphi/create-react-context/-/create-react-context-0.3.1.tgz", + "integrity": "sha512-V1klUed202XahrWJLLOT3EXNeCpFHCcJntdFGI15ntCwau+jfT386w7OFTMaCqOgXUH1fa0w/I1oZs+i/Rfr0A==", + "dev": true, + "requires": { + "gud": "^1.0.0", + "warning": "^4.0.3" + } + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -7579,6 +7589,16 @@ "integrity": "sha512-0R8ZTtGsWq417NB7B+HQWn7bUlxeF83aqmSNkUwBXvfSVgl+GW+DAMe0u4BDpmonKdQCEQGYcbPcTgHu9BHfEA==", "dev": true }, + "@semantic-ui-react/event-stack": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@semantic-ui-react/event-stack/-/event-stack-3.1.2.tgz", + "integrity": "sha512-Yd0Qf7lPCIjzJ9bZYfurlNu2RDXT6KKSyubHfYK3WjRauhxCsq6Fk2LMRI9DEvShoEU+AsLSv3NGkqXAcVp0zg==", + "dev": true, + "requires": { + "exenv": "^1.2.2", + "prop-types": "^15.6.2" + } + }, "@sindresorhus/is": { "version": "0.14.0", "resolved": false, @@ -7603,6 +7623,27 @@ "@sinonjs/commons": "^1.7.0" } }, + "@stardust-ui/react-component-event-listener": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@stardust-ui/react-component-event-listener/-/react-component-event-listener-0.38.0.tgz", + "integrity": "sha512-sIP/e0dyOrrlb8K7KWumfMxj/gAifswTBC4o68Aa+C/GA73ccRp/6W1VlHvF/dlOR4KLsA+5SKnhjH36xzPsWg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.1.2", + "prop-types": "^15.7.2" + } + }, + "@stardust-ui/react-component-ref": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@stardust-ui/react-component-ref/-/react-component-ref-0.38.0.tgz", + "integrity": "sha512-xjs6WnvJVueSIXMWw0C3oWIgAPpcD03qw43oGOjUXqFktvpNkB73JoKIhS4sCrtQxBdct75qqr4ZL6JiyPcESw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.1.2", + "prop-types": "^15.7.2", + "react-is": "^16.6.3" + } + }, "@storybook/addon-actions": { "version": "6.3.8", "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-6.3.8.tgz", @@ -18783,6 +18824,12 @@ "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", "dev": true }, + "exenv": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", + "integrity": "sha1-KueOhdmJQVhnCwPUe+wfA72Ru50=", + "dev": true + }, "exit": { "version": "0.1.2", "resolved": false, @@ -29712,6 +29759,12 @@ "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", "dev": true }, + "keyboard-key": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keyboard-key/-/keyboard-key-1.1.0.tgz", + "integrity": "sha512-qkBzPTi3rlAKvX7k0/ub44sqOfXeLc/jcnGGmj5c7BJpU8eDrEVPyhCvNYAaoubbsLm9uGWwQJO1ytQK1a9/dQ==", + "dev": true + }, "keyv": { "version": "3.1.0", "resolved": false, @@ -30623,6 +30676,12 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", + "dev": true + }, "negotiator": { "version": "0.6.2", "resolved": false, @@ -31656,6 +31715,12 @@ } } }, + "popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", + "dev": true + }, "portfinder": { "version": "1.0.28", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", @@ -37226,6 +37291,42 @@ "node-forge": "^0.10.0" } }, + "semantic-ui-react": { + "version": "0.88.2", + "resolved": "https://registry.npmjs.org/semantic-ui-react/-/semantic-ui-react-0.88.2.tgz", + "integrity": "sha512-+02kN2z8PuA/cMdvDUsHhbJmBzxxgOXVHMFr9XK7zGb0wkW9A6OPQMFokWz7ozlVtKjN6r7zsb+Qvjk/qq1OWw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.1.2", + "@semantic-ui-react/event-stack": "^3.1.0", + "@stardust-ui/react-component-event-listener": "~0.38.0", + "@stardust-ui/react-component-ref": "~0.38.0", + "classnames": "^2.2.6", + "keyboard-key": "^1.0.4", + "lodash": "^4.17.15", + "prop-types": "^15.7.2", + "react-is": "^16.8.6", + "react-popper": "^1.3.4", + "shallowequal": "^1.1.0" + }, + "dependencies": { + "react-popper": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-1.3.11.tgz", + "integrity": "sha512-VSA/bS+pSndSF2fiasHK/PTEEAyOpX60+H5EPAjoArr8JGm+oihu4UbrqcEBpQibJxBVCpYyjAX7abJ+7DoYVg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.1.2", + "@hypnosphi/create-react-context": "^0.3.1", + "deep-equal": "^1.1.1", + "popper.js": "^1.14.4", + "prop-types": "^15.6.1", + "typed-styles": "^0.0.7", + "warning": "^4.0.2" + } + } + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -39671,6 +39772,80 @@ "prelude-ls": "~1.1.2" } }, + "type-coverage-core": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/type-coverage-core/-/type-coverage-core-2.21.0.tgz", + "integrity": "sha512-VNC7Ig0KAzpYjWvxQ1SaMufEqSm4GPSsdVaCWA5fRHSjSvkXbPVK+C6H0lIq2t8brkrvnXk7iDs9g4sjux6JQw==", + "dev": true, + "requires": { + "fast-glob": "3", + "minimatch": "3", + "normalize-path": "3", + "tslib": "1 || 2", + "tsutils": "3" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + } + } + }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -39693,6 +39868,12 @@ "mime-types": "~2.1.24" } }, + "typed-styles": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.7.tgz", + "integrity": "sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q==", + "dev": true + }, "typedarray": { "version": "0.0.6", "resolved": false, @@ -39714,6 +39895,137 @@ "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", "dev": true }, + "typescript-coverage-report": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/typescript-coverage-report/-/typescript-coverage-report-0.6.4.tgz", + "integrity": "sha512-G+0OFYxwN5oRbORlU1nKYtO00G567lcl4+nbg3MU3Y9ayFnh677dMHmAL4JGP/4Cb1IBN5h/DUQDr/z9X+9lag==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "cli-table3": "^0.6.1", + "commander": "^5.0.0", + "ncp": "^2.0.0", + "react": "^16.13.1", + "react-dom": "^16.13.1", + "rimraf": "^3.0.2", + "semantic-ui-react": "^0.88.2", + "type-coverage-core": "^2.17.2" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cli-table3": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz", + "integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==", + "dev": true, + "requires": { + "colors": "1.4.0", + "string-width": "^4.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "unbox-primitive": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", diff --git a/packages/plasma-ui/package.json b/packages/plasma-ui/package.json index efeb278c5..9576d71f6 100644 --- a/packages/plasma-ui/package.json +++ b/packages/plasma-ui/package.json @@ -60,7 +60,8 @@ "sb": "6.3.8", "styled-components": "5.3.1", "ts-jest": "27.0.5", - "typescript": "3.9.10" + "typescript": "3.9.10", + "typescript-coverage-report": "0.6.4" }, "publishConfig": { "access": "public" @@ -82,24 +83,19 @@ "storybook:build:docs": "DOCS=true build-storybook --quiet -s .storybook/public -c .storybook -o build-sb-docs --docs", "storybook:extract": "sb extract build-sb ./build-sb/stories.json", "test": "BABEL_ENV=cjs jest", - "test:watch": "BABEL_ENV=cjs jest --watch" + "test:watch": "BABEL_ENV=cjs jest --watch", + "typescript-coverage": "npx typescript-coverage-report" + }, + "typeCoverage": { + "ignoreFiles": ["src/**/*component-test.tsx", "src/**/*stories.tsx"], + "atLeast": 100 }, "jest": { "moduleNameMapper": { "^styled-components": "/node_modules/styled-components" } }, - "files": [ - "components", - "hocs", - "hooks", - "mixins", - "types", - "utils", - "index.d.ts", - "index.js", - "es" - ], + "files": ["components", "hocs", "hooks", "mixins", "types", "utils", "index.d.ts", "index.js", "es"], "contributors": [ "Vasiliy Loginevskiy", "Антонов Игорь Александрович", diff --git a/packages/plasma-ui/src/components/Device/DeviceDetection.tsx b/packages/plasma-ui/src/components/Device/DeviceDetection.tsx index 86a0b5d75..9a1d89c1b 100644 --- a/packages/plasma-ui/src/components/Device/DeviceDetection.tsx +++ b/packages/plasma-ui/src/components/Device/DeviceDetection.tsx @@ -37,6 +37,8 @@ export interface DeviceThemeProps { detectDeviceCallback?: () => DeviceKind; } +export type ThemeProviderValue = DeviceThemeProps & { deviceScale: number }; + /** * Провайдер обязателен для использования, необходимо обернуть в него все приложение. * diff --git a/packages/plasma-ui/src/components/Grid/Col.tsx b/packages/plasma-ui/src/components/Grid/Col.tsx index e6b768315..2078699ba 100644 --- a/packages/plasma-ui/src/components/Grid/Col.tsx +++ b/packages/plasma-ui/src/components/Grid/Col.tsx @@ -9,6 +9,8 @@ import { gridColumns, } from '@sberdevices/plasma-core'; +import { ThemeProviderValue } from '../Device/DeviceDetection'; + export interface ColProps extends BaseProps { /** * Тип ячейки @@ -27,7 +29,7 @@ export interface ColProps extends BaseProps { * С примером использования можно ознакомиться в документации по [каруселям](/?path=/docs/controls-carousel--basic). */ export const Col = styled(BaseCol)` - ${({ type = 'rel', theme, size, offset, ...props }) => + ${({ type = 'rel', theme, size, offset, ...props }: { theme: ThemeProviderValue } & ColProps) => gridSizes.map((breakpoint) => { const bpSize = sizes[breakpoint]; const bpOffset = offsets[breakpoint]; diff --git a/packages/plasma-ui/src/components/Grid/Container.tsx b/packages/plasma-ui/src/components/Grid/Container.tsx index 9237fd6cc..c246fe385 100644 --- a/packages/plasma-ui/src/components/Grid/Container.tsx +++ b/packages/plasma-ui/src/components/Grid/Container.tsx @@ -11,6 +11,8 @@ import { useIsomorphicLayoutEffect, } from '@sberdevices/plasma-core'; +import { ThemeProviderValue } from '../Device/DeviceDetection'; + interface StyledContainerProps { $width: number; } @@ -19,7 +21,7 @@ const sidesCount = 2; const htmlFontSizePx = 16; const StyledContainer = styled(BaseContainer)` - ${({ $width, theme }) => + ${({ $width, theme }: { $width: number; theme: ThemeProviderValue }) => gridSizes.map((breakpoint) => { const containerWidth = $width; const margins = diff --git a/packages/plasma-ui/src/components/Header/HeaderArrow.tsx b/packages/plasma-ui/src/components/Header/HeaderArrow.tsx index 149c74161..1f62b2ce9 100644 --- a/packages/plasma-ui/src/components/Header/HeaderArrow.tsx +++ b/packages/plasma-ui/src/components/Header/HeaderArrow.tsx @@ -5,6 +5,7 @@ import type { PickOptional } from '@sberdevices/plasma-core'; import { mediaQuery } from '@sberdevices/plasma-core'; import { Button, ButtonProps } from '../Button'; +import { ThemeProviderValue } from '../Device/DeviceDetection'; export interface HeaderArrowProps extends PickOptional, @@ -25,7 +26,7 @@ const StyledButton = styled(Button)` right: 100%; margin-right: 0.5rem; - ${({ theme }) => + ${({ theme }: { theme: ThemeProviderValue }) => mediaQuery( 'S', theme.deviceScale, diff --git a/packages/plasma-ui/src/components/Header/HeaderRoot.tsx b/packages/plasma-ui/src/components/Header/HeaderRoot.tsx index a6fbc2035..c1050393e 100644 --- a/packages/plasma-ui/src/components/Header/HeaderRoot.tsx +++ b/packages/plasma-ui/src/components/Header/HeaderRoot.tsx @@ -3,6 +3,8 @@ import styled, { css } from 'styled-components'; import { mediaQuery } from '@sberdevices/plasma-core'; import Color from 'color'; +import { ThemeProviderValue } from '../Device/DeviceDetection'; + const sizes = { sberBox: css` --plasma-header-height: 2.25rem; /* 36px */ @@ -34,7 +36,7 @@ const StyledHeaderRoot = styled.header` padding-top: var(--plasma-header-pt); padding-bottom: var(--plasma-header-pb); - ${({ $size, theme }) => + ${({ $size, theme }: { theme: ThemeProviderValue; $size?: keyof typeof sizes }) => $size ? sizes[$size] // Выберет указанный размер или разложит размеры по брейкпоинтам : css` diff --git a/packages/plasma-ui/src/components/Header/HeaderSubtitle.tsx b/packages/plasma-ui/src/components/Header/HeaderSubtitle.tsx index e1bf645c7..d0c141eb1 100644 --- a/packages/plasma-ui/src/components/Header/HeaderSubtitle.tsx +++ b/packages/plasma-ui/src/components/Header/HeaderSubtitle.tsx @@ -2,6 +2,7 @@ import styled, { css } from 'styled-components'; import { mediaQuery } from '@sberdevices/plasma-core'; import { TextBoxSubTitle } from '../TextBox'; +import { ThemeProviderValue } from '../Device/DeviceDetection'; /** * Компонент для размещения подзаголовка. @@ -13,7 +14,7 @@ export const HeaderSubtitle = styled(TextBoxSubTitle)` overflow: hidden; text-overflow: ellipsis; - ${({ theme }) => css` + ${({ theme }: { theme: ThemeProviderValue }) => css` ${mediaQuery( 'S', theme.deviceScale, diff --git a/packages/plasma-ui/src/components/Header/HeaderTitle.tsx b/packages/plasma-ui/src/components/Header/HeaderTitle.tsx index c29e0d7e2..82be7edc2 100644 --- a/packages/plasma-ui/src/components/Header/HeaderTitle.tsx +++ b/packages/plasma-ui/src/components/Header/HeaderTitle.tsx @@ -3,6 +3,7 @@ import { body2 } from '@sberdevices/plasma-tokens'; import { mediaQuery } from '@sberdevices/plasma-core'; import { Headline4 } from '../Typography'; +import { ThemeProviderValue } from '../Device/DeviceDetection'; /** * Компонент для размещения заголовка. @@ -14,10 +15,10 @@ export const HeaderTitle = styled(Headline4)` overflow: hidden; text-overflow: ellipsis; - ${(props) => + ${({ theme }: { theme: ThemeProviderValue }) => mediaQuery( 'S', - props.theme.deviceScale, + theme.deviceScale, )(css` ${body2}; `)} diff --git a/packages/plasma-ui/src/components/Pickers/DatePicker.tsx b/packages/plasma-ui/src/components/Pickers/DatePicker.tsx index 78c43a255..5332b8b8c 100644 --- a/packages/plasma-ui/src/components/Pickers/DatePicker.tsx +++ b/packages/plasma-ui/src/components/Pickers/DatePicker.tsx @@ -4,7 +4,7 @@ import { useIsomorphicLayoutEffect } from '@sberdevices/plasma-core'; import { SimpleDatePicker, SimpleDatePickerProps } from './SimpleDatePicker'; import { getDateValues, getNormalizeValues, getTimeValues, isChanged } from './utils'; -import { DateType } from './types'; +import { DateType, PickerItem, PickerItemValue } from './types'; const defaultOptions = { years: true, @@ -160,7 +160,7 @@ export const DatePicker: React.FC = ({ ); const onYearChange = React.useCallback( - ({ value: y }) => { + ({ value: y }: PickerItemValue) => { setState(([, m, d]) => { const nextMonth = getNextMonth(m, y); const nextDay = getNextDay(d, nextMonth, y); @@ -171,7 +171,7 @@ export const DatePicker: React.FC = ({ [getNextDay, getNextMonth], ); const onMonthChange = React.useCallback( - ({ value: m }) => { + ({ value: m }: PickerItemValue) => { setState(([y, , d]) => { const nextDay = getNextDay(d, m, y); @@ -180,7 +180,7 @@ export const DatePicker: React.FC = ({ }, [getNextDay], ); - const onDayChange = React.useCallback(({ value: d }) => setState(([y, m]) => [y, m, d]), []); + const onDayChange = React.useCallback(({ value: d }: PickerItemValue) => setState(([y, m]) => [y, m, d]), []); /** * При очередном прогоне, если значения year, month, day изменились, diff --git a/packages/plasma-ui/src/components/Pickers/TimePicker.tsx b/packages/plasma-ui/src/components/Pickers/TimePicker.tsx index 1f8c31277..b70fa2bee 100644 --- a/packages/plasma-ui/src/components/Pickers/TimePicker.tsx +++ b/packages/plasma-ui/src/components/Pickers/TimePicker.tsx @@ -5,7 +5,7 @@ import { useIsomorphicLayoutEffect } from '@sberdevices/plasma-core'; import { PickerDots } from './PickerDots'; import { SimpleTimePicker, SimpleTimePickerProps } from './SimpleTimePicker'; import { getNormalizeValues, getTimeValues, isChanged } from './utils'; -import type { TimeType } from './types'; +import type { PickerItem, TimeType, PickerItemValue } from './types'; const StyledWrapper = styled.div` display: flex; @@ -195,9 +195,9 @@ export const TimePicker: React.FC = ({ ]; }, [minHours, maxHours, minMinutes, maxMinutes, minSeconds, maxSeconds, hours, minutes, step]); - const onHoursChange = React.useCallback(({ value: h }) => setState(([, m, s]) => [h, m, s]), []); - const onMinutesChange = React.useCallback(({ value: m }) => setState(([h, , s]) => [h, m, s]), []); - const onSecondsChange = React.useCallback(({ value: s }) => setState(([h, m]) => [h, m, s]), []); + const onHoursChange = React.useCallback(({ value: h }: PickerItemValue) => setState(([, m, s]) => [h, m, s]), []); + const onMinutesChange = React.useCallback(({ value: m }: PickerItemValue) => setState(([h, , s]) => [h, m, s]), []); + const onSecondsChange = React.useCallback(({ value: s }: PickerItemValue) => setState(([h, m]) => [h, m, s]), []); // При очередном прогоне, если значения hours, minutes, seconds изменились, // необходимо вызвать событие изменения, создав новый экземпляр Date diff --git a/packages/plasma-ui/src/components/Pickers/types.ts b/packages/plasma-ui/src/components/Pickers/types.ts index 292fd98b3..97d8fbb16 100644 --- a/packages/plasma-ui/src/components/Pickers/types.ts +++ b/packages/plasma-ui/src/components/Pickers/types.ts @@ -12,6 +12,10 @@ export type PickerItem = { isVirtual?: boolean; }; +export type PickerItemValue = { + value: number; +}; + export const DEFAULT_PICKER_SIZE: PickerSize = 's'; export const DEFAULT_VISIBLE_ITEMS: PickerVisibleItems = 5; diff --git a/packages/plasma-ui/src/components/Slider/Double.tsx b/packages/plasma-ui/src/components/Slider/Double.tsx index 1f8444254..4e9c03934 100644 --- a/packages/plasma-ui/src/components/Slider/Double.tsx +++ b/packages/plasma-ui/src/components/Slider/Double.tsx @@ -1,4 +1,5 @@ import React from 'react'; +import { DraggableData } from 'react-draggable'; import { SliderBase } from './SliderBase'; import { Handle } from './Handle'; @@ -65,7 +66,7 @@ export const Slider: React.FC = ({ min, max, value, disabled, onCha })); }, [value, state.stepSize, min]); - const setStepSize = React.useCallback((newStepSize) => { + const setStepSize = React.useCallback((newStepSize: number) => { setState((prevState) => ({ ...prevState, stepSize: newStepSize, @@ -73,7 +74,7 @@ export const Slider: React.FC = ({ min, max, value, disabled, onCha }, []); const onFirstHandleChange = React.useCallback( - (handleValue, data) => { + (handleValue: number, data: DraggableData) => { if (secondHandleRef?.current) { const newHandleXPosition = data.x; const secondHandleXPosition = getXCenterHandle(secondHandleRef.current); @@ -95,7 +96,7 @@ export const Slider: React.FC = ({ min, max, value, disabled, onCha ); const onFirstHandleChangeCommited = React.useCallback( - (handleValue, data) => { + (handleValue: number, data: DraggableData) => { onChangeCommitted([handleValue, value[1]]); setState((prevState) => ({ @@ -108,7 +109,7 @@ export const Slider: React.FC = ({ min, max, value, disabled, onCha ); const onSecondHandleChange = React.useCallback( - (handleValue, data) => { + (handleValue: number, data: DraggableData) => { if (firstHandleRef?.current) { const firstXHandleXPosition = getXCenterHandle(firstHandleRef.current); @@ -131,7 +132,7 @@ export const Slider: React.FC = ({ min, max, value, disabled, onCha ); const onSecondHandleChangeCommited = React.useCallback( - (handleValue, data) => { + (handleValue: number, data: DraggableData) => { onChangeCommitted([value[0], handleValue]); setState((prevState) => ({ ...prevState, diff --git a/packages/plasma-ui/src/components/Slider/Handle.tsx b/packages/plasma-ui/src/components/Slider/Handle.tsx index 0d0ec7798..1ad7d5d35 100644 --- a/packages/plasma-ui/src/components/Slider/Handle.tsx +++ b/packages/plasma-ui/src/components/Slider/Handle.tsx @@ -1,6 +1,6 @@ import React from 'react'; import styled from 'styled-components'; -import Draggable, { DraggableData } from 'react-draggable'; +import Draggable, { DraggableData, DraggableEventHandler } from 'react-draggable'; import { surfaceLiquid03, white } from '@sberdevices/plasma-tokens'; import { handleDiameter, handleBorderWidth } from './SliderBase'; @@ -63,7 +63,7 @@ export const Handle = React.forwardRef( ({ stepSize, onChangeCommitted, onChange, xPosition, min, max, bounds = [], zIndex, disabled, side }, ref) => { const lastOnChangeValue = React.useRef(null); - const onDrag = React.useCallback( + const onDrag = React.useCallback( (_, data) => { const newHandleXPosition = data.lastX; @@ -78,7 +78,7 @@ export const Handle = React.forwardRef( [onChange, stepSize, min, max], ); - const onStop = React.useCallback( + const onStop = React.useCallback( (_, data) => { const newHandleXPosition = data.lastX; const newValue = getValue(newHandleXPosition, stepSize, min, max); diff --git a/packages/plasma-ui/src/components/Slider/Single.tsx b/packages/plasma-ui/src/components/Slider/Single.tsx index d9ddf777e..bad98614a 100644 --- a/packages/plasma-ui/src/components/Slider/Single.tsx +++ b/packages/plasma-ui/src/components/Slider/Single.tsx @@ -1,4 +1,5 @@ import React from 'react'; +import { DraggableData } from 'react-draggable'; import { SliderBase } from './SliderBase'; import { Handle } from './Handle'; @@ -48,7 +49,7 @@ export const Slider: React.FC = ({ min, max, value, disabled, onCha })); }, [value, state.stepSize, min]); - const setStepSize = React.useCallback((newStepSize) => { + const setStepSize = React.useCallback((newStepSize: number) => { setState((prevState) => ({ ...prevState, stepSize: newStepSize, @@ -56,7 +57,7 @@ export const Slider: React.FC = ({ min, max, value, disabled, onCha }, []); const onHandleChange = React.useCallback( - (handleValue, data) => { + (handleValue: number, data: DraggableData) => { const newHandleXPosition = data.x; setState((prevState) => ({ @@ -72,7 +73,7 @@ export const Slider: React.FC = ({ min, max, value, disabled, onCha ); const onHandleChangeCommited = React.useCallback( - (handleValue, data) => { + (handleValue: number, data: { lastX: number }) => { onChangeCommitted(handleValue); setState((prevState) => ({ ...prevState, diff --git a/packages/plasma-ui/src/components/Slider/SliderBase.tsx b/packages/plasma-ui/src/components/Slider/SliderBase.tsx index 1a834c6f2..c9694cfb2 100644 --- a/packages/plasma-ui/src/components/Slider/SliderBase.tsx +++ b/packages/plasma-ui/src/components/Slider/SliderBase.tsx @@ -2,6 +2,8 @@ import React from 'react'; import styled, { css, ThemeContext } from 'styled-components'; import { surfaceLiquid03, buttonAccent, scalingPixelBasis, sberPortalScale } from '@sberdevices/plasma-tokens'; +import { ThemeProviderValue } from '../Device/DeviceDetection'; + export const handleDiameter = 1.5; export const handleBorderWidth = 0.0625; export const railHeight = 0.25; @@ -59,7 +61,7 @@ export const SliderBase: React.FC = ({ disabled, }) => { const ref = React.useRef(null); - const theme = React.useContext(ThemeContext); + const theme = React.useContext(ThemeContext); React.useLayoutEffect(() => { const resizeHandler = () => { diff --git a/packages/plasma-ui/src/components/Stepper/Stepper.tsx b/packages/plasma-ui/src/components/Stepper/Stepper.tsx index ade171f84..027beb0d4 100644 --- a/packages/plasma-ui/src/components/Stepper/Stepper.tsx +++ b/packages/plasma-ui/src/components/Stepper/Stepper.tsx @@ -87,7 +87,9 @@ export const Stepper: React.FC = ({ const { showRemove: remover, onRemove, ...rest } = props as RemoverProps; const onLessClick = React.useCallback(() => onChange(value - step), [value, step, onChange]); const onMoreClick = React.useCallback(() => onChange(value + step), [value, step, onChange]); - const onRemoveClick = React.useCallback((e) => onRemove?.(e), [onRemove]); + const onRemoveClick = React.useCallback>((e) => onRemove?.(e), [ + onRemove, + ]); const isMin = value <= min; const isMax = value >= max; const lessDisabled = isMin || value - step < min; diff --git a/packages/plasma-ui/src/components/Tabs/Tabs.tsx b/packages/plasma-ui/src/components/Tabs/Tabs.tsx index 370ebe5f4..ecf7a9829 100644 --- a/packages/plasma-ui/src/components/Tabs/Tabs.tsx +++ b/packages/plasma-ui/src/components/Tabs/Tabs.tsx @@ -1,5 +1,5 @@ import React, { forwardRef, useMemo } from 'react'; -import type { TabsProps as BaseProps } from '@sberdevices/plasma-core'; +import type { TabItemProps, TabsProps as BaseProps } from '@sberdevices/plasma-core'; import { TabsView, TabsViewProps } from './TabsView'; import { TabItem } from './TabItem'; @@ -40,7 +40,7 @@ export const Tabs = forwardRef(function Tabs({ childr const { index, ...rest } = props; const childrenArray = React.Children.toArray(children); const animatedChildren = childrenArray.map((child, i) => { - if (React.isValidElement(child)) { + if (React.isValidElement(child)) { return ; } return child; diff --git a/packages/plasma-ui/src/helpers/GridLines.tsx b/packages/plasma-ui/src/helpers/GridLines.tsx index a2021cd38..f7e26c8ee 100644 --- a/packages/plasma-ui/src/helpers/GridLines.tsx +++ b/packages/plasma-ui/src/helpers/GridLines.tsx @@ -3,6 +3,7 @@ import styled, { css } from 'styled-components'; import { mediaQuery } from '@sberdevices/plasma-core'; import { Container, Row, Col } from '../components/Grid'; +import { ThemeProviderValue } from '../components/Device/DeviceDetection'; const StyledFullHeightContainer = styled(Container)` position: fixed; @@ -20,7 +21,7 @@ const StyledFullHeightRow = styled(Row)` const StyledFullHeightCol = styled(Col)` height: 100vh; - ${({ theme }) => + ${({ theme }: { theme: ThemeProviderValue }) => css` ${mediaQuery( 'S', @@ -67,7 +68,7 @@ export interface GridLinesProps extends React.HTMLAttributes { * Вспомогательный компонент для демонстрации в Storybook. */ export const GridLines: React.FC = ({ columns = 12, ...rest }) => { - const cols = Array(columns).fill(0); + const cols: number[] = Array(columns).fill(0); return ( diff --git a/packages/plasma-ui/src/helpers/StoryDecorators.tsx b/packages/plasma-ui/src/helpers/StoryDecorators.tsx index 0d1bcfd6f..2101473cb 100644 --- a/packages/plasma-ui/src/helpers/StoryDecorators.tsx +++ b/packages/plasma-ui/src/helpers/StoryDecorators.tsx @@ -10,7 +10,7 @@ export const InSpacing = (Story: React.FC) => ( ); -export const WithGridLines = (Story: React.FC, context) => ( +export const WithGridLines = (Story: React.FC, context: { args: { displayGrid: boolean } }) => ( <> {context.args.displayGrid && }