diff --git a/.pnp.cjs b/.pnp.cjs index 4eb542e45..68304b191 100644 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -144,7 +144,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["react-dnd-html5-backend", "npm:14.1.0"],\ ["react-dom", "virtual:9909ff5388c6b6a3a46f12eb37c0afb449fcd1eedb9f02d871bde711a076c929583f48ecc4b85fa6d71478b076104a25f83dee45bc69687a22f551c576d7595d#npm:18.2.0"],\ ["react-i18next", "virtual:9909ff5388c6b6a3a46f12eb37c0afb449fcd1eedb9f02d871bde711a076c929583f48ecc4b85fa6d71478b076104a25f83dee45bc69687a22f551c576d7595d#npm:11.18.6"],\ - ["react-virtuoso", "virtual:9909ff5388c6b6a3a46f12eb37c0afb449fcd1eedb9f02d871bde711a076c929583f48ecc4b85fa6d71478b076104a25f83dee45bc69687a22f551c576d7595d#npm:2.19.0"],\ + ["react-virtuoso", "virtual:9909ff5388c6b6a3a46f12eb37c0afb449fcd1eedb9f02d871bde711a076c929583f48ecc4b85fa6d71478b076104a25f83dee45bc69687a22f551c576d7595d#npm:4.7.11"],\ ["recharts", "virtual:9909ff5388c6b6a3a46f12eb37c0afb449fcd1eedb9f02d871bde711a076c929583f48ecc4b85fa6d71478b076104a25f83dee45bc69687a22f551c576d7595d#npm:2.3.2"],\ ["rollbar", "npm:2.25.2"],\ ["storybook", "npm:6.5.16"],\ @@ -14794,38 +14794,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["@virtuoso.dev/react-urx", [\ - ["npm:0.2.13", {\ - "packageLocation": "./.yarn/cache/@virtuoso.dev-react-urx-npm-0.2.13-778c2d6bbd-173e91c21f.zip/node_modules/@virtuoso.dev/react-urx/",\ - "packageDependencies": [\ - ["@virtuoso.dev/react-urx", "npm:0.2.13"]\ - ],\ - "linkType": "SOFT"\ - }],\ - ["virtual:26177e722f00ca89320a6a83c5a3f74eac9b6514cec04ec85fb7eae618184140929536c639ee96982e91b5b8ad588991cdbd72299e754702c14fefef975f289e#npm:0.2.13", {\ - "packageLocation": "./.yarn/__virtual__/@virtuoso.dev-react-urx-virtual-a923eb6e20/0/cache/@virtuoso.dev-react-urx-npm-0.2.13-778c2d6bbd-173e91c21f.zip/node_modules/@virtuoso.dev/react-urx/",\ - "packageDependencies": [\ - ["@virtuoso.dev/react-urx", "virtual:26177e722f00ca89320a6a83c5a3f74eac9b6514cec04ec85fb7eae618184140929536c639ee96982e91b5b8ad588991cdbd72299e754702c14fefef975f289e#npm:0.2.13"],\ - ["@types/react", "npm:18.0.21"],\ - ["@virtuoso.dev/urx", "npm:0.2.13"],\ - ["react", "npm:18.2.0"]\ - ],\ - "packagePeers": [\ - "@types/react",\ - "react"\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["@virtuoso.dev/urx", [\ - ["npm:0.2.13", {\ - "packageLocation": "./.yarn/cache/@virtuoso.dev-urx-npm-0.2.13-c1ced89fba-682a99cf40.zip/node_modules/@virtuoso.dev/urx/",\ - "packageDependencies": [\ - ["@virtuoso.dev/urx", "npm:0.2.13"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["@webassemblyjs/ast", [\ ["npm:1.11.1", {\ "packageLocation": "./.yarn/cache/@webassemblyjs-ast-npm-1.11.1-623d3d973e-1eee1534ad.zip/node_modules/@webassemblyjs/ast/",\ @@ -28175,7 +28143,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["react-dnd-html5-backend", "npm:14.1.0"],\ ["react-dom", "virtual:9909ff5388c6b6a3a46f12eb37c0afb449fcd1eedb9f02d871bde711a076c929583f48ecc4b85fa6d71478b076104a25f83dee45bc69687a22f551c576d7595d#npm:18.2.0"],\ ["react-i18next", "virtual:9909ff5388c6b6a3a46f12eb37c0afb449fcd1eedb9f02d871bde711a076c929583f48ecc4b85fa6d71478b076104a25f83dee45bc69687a22f551c576d7595d#npm:11.18.6"],\ - ["react-virtuoso", "virtual:9909ff5388c6b6a3a46f12eb37c0afb449fcd1eedb9f02d871bde711a076c929583f48ecc4b85fa6d71478b076104a25f83dee45bc69687a22f551c576d7595d#npm:2.19.0"],\ + ["react-virtuoso", "virtual:9909ff5388c6b6a3a46f12eb37c0afb449fcd1eedb9f02d871bde711a076c929583f48ecc4b85fa6d71478b076104a25f83dee45bc69687a22f551c576d7595d#npm:4.7.11"],\ ["recharts", "virtual:9909ff5388c6b6a3a46f12eb37c0afb449fcd1eedb9f02d871bde711a076c929583f48ecc4b85fa6d71478b076104a25f83dee45bc69687a22f551c576d7595d#npm:2.3.2"],\ ["rollbar", "npm:2.25.2"],\ ["storybook", "npm:6.5.16"],\ @@ -31519,21 +31487,19 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["react-virtuoso", [\ - ["npm:2.19.0", {\ - "packageLocation": "./.yarn/cache/react-virtuoso-npm-2.19.0-61fadc72f6-146416808b.zip/node_modules/react-virtuoso/",\ + ["npm:4.7.11", {\ + "packageLocation": "./.yarn/cache/react-virtuoso-npm-4.7.11-6c36a0cdb4-3e9b56e8bd.zip/node_modules/react-virtuoso/",\ "packageDependencies": [\ - ["react-virtuoso", "npm:2.19.0"]\ + ["react-virtuoso", "npm:4.7.11"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:9909ff5388c6b6a3a46f12eb37c0afb449fcd1eedb9f02d871bde711a076c929583f48ecc4b85fa6d71478b076104a25f83dee45bc69687a22f551c576d7595d#npm:2.19.0", {\ - "packageLocation": "./.yarn/__virtual__/react-virtuoso-virtual-26177e722f/0/cache/react-virtuoso-npm-2.19.0-61fadc72f6-146416808b.zip/node_modules/react-virtuoso/",\ + ["virtual:9909ff5388c6b6a3a46f12eb37c0afb449fcd1eedb9f02d871bde711a076c929583f48ecc4b85fa6d71478b076104a25f83dee45bc69687a22f551c576d7595d#npm:4.7.11", {\ + "packageLocation": "./.yarn/__virtual__/react-virtuoso-virtual-42154e1c34/0/cache/react-virtuoso-npm-4.7.11-6c36a0cdb4-3e9b56e8bd.zip/node_modules/react-virtuoso/",\ "packageDependencies": [\ - ["react-virtuoso", "virtual:9909ff5388c6b6a3a46f12eb37c0afb449fcd1eedb9f02d871bde711a076c929583f48ecc4b85fa6d71478b076104a25f83dee45bc69687a22f551c576d7595d#npm:2.19.0"],\ + ["react-virtuoso", "virtual:9909ff5388c6b6a3a46f12eb37c0afb449fcd1eedb9f02d871bde711a076c929583f48ecc4b85fa6d71478b076104a25f83dee45bc69687a22f551c576d7595d#npm:4.7.11"],\ ["@types/react", "npm:18.0.21"],\ ["@types/react-dom", null],\ - ["@virtuoso.dev/react-urx", "virtual:26177e722f00ca89320a6a83c5a3f74eac9b6514cec04ec85fb7eae618184140929536c639ee96982e91b5b8ad588991cdbd72299e754702c14fefef975f289e#npm:0.2.13"],\ - ["@virtuoso.dev/urx", "npm:0.2.13"],\ ["react", "npm:18.2.0"],\ ["react-dom", "virtual:9909ff5388c6b6a3a46f12eb37c0afb449fcd1eedb9f02d871bde711a076c929583f48ecc4b85fa6d71478b076104a25f83dee45bc69687a22f551c576d7595d#npm:18.2.0"]\ ],\ diff --git a/.yarn/cache/@virtuoso.dev-react-urx-npm-0.2.13-778c2d6bbd-173e91c21f.zip b/.yarn/cache/@virtuoso.dev-react-urx-npm-0.2.13-778c2d6bbd-173e91c21f.zip deleted file mode 100644 index a29495bb7..000000000 Binary files a/.yarn/cache/@virtuoso.dev-react-urx-npm-0.2.13-778c2d6bbd-173e91c21f.zip and /dev/null differ diff --git a/.yarn/cache/@virtuoso.dev-urx-npm-0.2.13-c1ced89fba-682a99cf40.zip b/.yarn/cache/@virtuoso.dev-urx-npm-0.2.13-c1ced89fba-682a99cf40.zip deleted file mode 100644 index a9eda6b0f..000000000 Binary files a/.yarn/cache/@virtuoso.dev-urx-npm-0.2.13-c1ced89fba-682a99cf40.zip and /dev/null differ diff --git a/.yarn/cache/react-virtuoso-npm-2.19.0-61fadc72f6-146416808b.zip b/.yarn/cache/react-virtuoso-npm-2.19.0-61fadc72f6-146416808b.zip deleted file mode 100644 index 58e0235bd..000000000 Binary files a/.yarn/cache/react-virtuoso-npm-2.19.0-61fadc72f6-146416808b.zip and /dev/null differ diff --git a/.yarn/cache/react-virtuoso-npm-4.7.11-6c36a0cdb4-3e9b56e8bd.zip b/.yarn/cache/react-virtuoso-npm-4.7.11-6c36a0cdb4-3e9b56e8bd.zip new file mode 100644 index 000000000..3e31dd675 Binary files /dev/null and b/.yarn/cache/react-virtuoso-npm-4.7.11-6c36a0cdb4-3e9b56e8bd.zip differ diff --git a/amplify.yml b/amplify.yml index 9a65ba857..9861b4164 100644 --- a/amplify.yml +++ b/amplify.yml @@ -6,23 +6,24 @@ frontend: - nvm install 18.13 - nvm use 18.13 - | - if [[ "${AWS_BRANCH_ARN#*/branches/}" == *"pr-"* ]]; then + if [[ "${AWS_BRANCH_ARN#*/branches/}" != "main" ]] && [["${AWS_BRANCH_ARN#*/branches/}" != "staging"]]; then PREVIEW_URL="https://${AWS_BRANCH_ARN#*/branches/}.${AWS_APP_ID}.amplifyapp.com"; NEXTAUTH_URL=$PREVIEW_URL; echo "PREVIEW_URL=$PREVIEW_URL" >> .env; - elif [[ "${AWS_BRANCH}" != "main" && "${AWS_BRANCH}" != "staging" ]]; then - PREVIEW_URL="https://${AWS_BRANCH}.${AWS_APP_ID}.amplifyapp.com"; - NEXTAUTH_URL=$PREVIEW_URL; - echo "PREVIEW_URL=$PREVIEW_URL" >> .env; fi - echo "NEXTAUTH_URL=$NEXTAUTH_URL" >> .env - echo "NODE_ENV=$NODE_ENV" >> .env - - yarn set version 3.3.0 + - yarn set version 3.2.3 - yarn config set nodeLinker node-modules - yarn -v - yarn - yarn disable-telemetry - - yarn gql + - | + if [[ "${AWS_BRANCH_ARN#*/branches/}" != "main" ]] && [["${AWS_BRANCH_ARN#*/branches/}" != "staging"]]; then + API_URL=https://api.mpdx.org/graphql yarn gql + else + yarn gql + fi build: commands: - yarn build:amplify diff --git a/package.json b/package.json index 98d836e2a..a53829f46 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "react-dnd-html5-backend": "^14.0.2", "react-dom": "^18.2.0", "react-i18next": "^11.18.6", - "react-virtuoso": "2.19.0", + "react-virtuoso": "^4.7.4", "recharts": "2.3.2", "rollbar": "^2.25.2", "storybook": "^6.5.16", diff --git a/pages/_app.page.tsx b/pages/_app.page.tsx index 5e8c263a1..71cba2d2e 100644 --- a/pages/_app.page.tsx +++ b/pages/_app.page.tsx @@ -35,8 +35,7 @@ import { useRequiredSession } from 'src/hooks/useRequiredSession'; import makeClient from 'src/lib/apollo/client'; import i18n from 'src/lib/i18n'; import theme from 'src/theme'; -import './helpscout.css'; -import './print.css'; +import './styles.css'; export type PageWithLayout = NextPage & { layout?: React.FC; diff --git a/pages/_document.page.tsx b/pages/_document.page.tsx index 156e8c914..202b14de7 100644 --- a/pages/_document.page.tsx +++ b/pages/_document.page.tsx @@ -22,13 +22,20 @@ class MyDocument extends Document { href="https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@300;400;700&display=swap" rel="stylesheet" /> + {process.env.DATADOG_CONFIGURED === 'true' && ( - )} {process.env.GOOGLE_TAG_MANAGER_CONTAINER_ID && ( - )} diff --git a/pages/accountLists/[accountListId]/tasks/[[...contactId]].page.tsx b/pages/accountLists/[accountListId]/tasks/[[...contactId]].page.tsx index f5ccf7be9..b04a83176 100644 --- a/pages/accountLists/[accountListId]/tasks/[[...contactId]].page.tsx +++ b/pages/accountLists/[accountListId]/tasks/[[...contactId]].page.tsx @@ -24,6 +24,7 @@ import { } from 'src/components/Shared/Header/ListHeader'; import { TaskModalEnum } from 'src/components/Task/Modal/TaskModal'; import { TaskRow } from 'src/components/Task/TaskRow/TaskRow'; +import { TaskRowSkeleton } from 'src/components/Task/TaskRow/TaskRowSkeleton.skeleton'; import { TaskFilterSetInput } from 'src/graphql/types.generated'; import { useGetTaskIdsForMassSelectionQuery } from 'src/hooks/GetIdsForMassSelection.generated'; import { useAccountListId } from 'src/hooks/useAccountListId'; @@ -402,6 +403,8 @@ const TasksPage: React.FC = () => { data-foo="bar" loading={loading} data={data?.tasks.nodes} + Skeleton={TaskRowSkeleton} + numberOfSkeletons={25} style={{ height: `calc(100vh - ${navBarHeight} - ${headerHeight} - ${buttonBarHeight})`, }} diff --git a/pages/helpscout.css b/pages/helpscout.css deleted file mode 100644 index 3184cb2a0..000000000 --- a/pages/helpscout.css +++ /dev/null @@ -1,27 +0,0 @@ -.BeaconFabButtonFrame { - right: 70px !important; - bottom: 30px !important; -} - -@media only screen and (max-width: 900px) { - .BeaconFabButtonFrame { - right: 40px !important; - bottom: 25px !important; - } -} - -@media only screen and (max-width: 600px) { - .BeaconFabButtonFrame { - right: 30px !important; - bottom: 30px !important; - } -} - -.BeaconContainer { - right: 20px !important; - bottom: 90px !important; - z-index: 1350 !important; -} -.BeaconFabButtonFrame { - z-index: 1500 !important; -} diff --git a/pages/print.css b/pages/print.css deleted file mode 100644 index f9442e4ca..000000000 --- a/pages/print.css +++ /dev/null @@ -1,25 +0,0 @@ -@media print { - body, - html, - #wrapper { - width: 100%; - } - - body #__next, - body #__next > div, - body #__next > div > div, - body #__next > div > div > div, - body #__next > div > div > div > div { - height: auto; - overflow: auto; - padding: 0; - } - - header { - display: none !important; - } - - #beacon-container { - display: none; - } -} diff --git a/pages/styles.css b/pages/styles.css new file mode 100644 index 000000000..66a492da2 --- /dev/null +++ b/pages/styles.css @@ -0,0 +1,1018 @@ +/* ======================================== +To prevent multiple requests for CSS, I'm combining these style sheets + - HelpScout + - Print styles + - Google Fonts +*/ + +/* -------------------------------- */ +/* HelpScout */ + +.BeaconFabButtonFrame { + right: 70px !important; + bottom: 30px !important; +} + +@media only screen and (max-width: 900px) { + .BeaconFabButtonFrame { + right: 40px !important; + bottom: 25px !important; + } +} + +@media only screen and (max-width: 600px) { + .BeaconFabButtonFrame { + right: 30px !important; + bottom: 30px !important; + } +} + +.BeaconContainer { + right: 20px !important; + bottom: 90px !important; + z-index: 1350 !important; +} +.BeaconFabButtonFrame { + z-index: 1500 !important; +} + +/* -------------------------------- */ +/* Print styles */ + +@media print { + body, + html, + #wrapper { + width: 100%; + } + + body #__next, + body #__next > div, + body #__next > div > div, + body #__next > div > div > div, + body #__next > div > div > div > div { + height: auto; + overflow: auto; + padding: 0; + } + + header { + display: none !important; + } + + #beacon-container { + display: none; + } +} + +/* -------------------------------- */ +/* Google Fonts */ + +/* + * See: https://fonts.google.com/license/googlerestricted + */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 400; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPiIUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0308, U+0530-058F, U+2010, U+2024, U+25CC, U+FB13-FB17; +} +/* bengali */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 400; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPiAUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0951-0952, U+0964-0965, U+0980-09FE, U+1CD0, U+1CD2, + U+1CD5-1CD6, U+1CD8, U+1CE1, U+1CEA, U+1CED, U+1CF2, U+1CF5-1CF7, + U+200C-200D, U+20B9, U+25CC, U+A8F1; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 400; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPj8UvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, + U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 400; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjYUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* devanagari */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 400; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjMUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0900-097F, U+1CD0-1CF9, U+200C-200D, U+20A8, U+20B9, U+20F0, + U+25CC, U+A830-A839, U+A8E0-A8FF, U+11B00-11B09; +} +/* ethiopic */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 400; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPiMUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+1200-1399, U+2D80-2DDE, U+AB01-AB2E, U+1E7E0-1E7E6, + U+1E7E8-1E7EB, U+1E7ED-1E7EE, U+1E7F0-1E7FE; +} +/* georgian */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 400; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPi0UvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0589, U+10A0-10FF, U+1C90-1CBA, U+1CBD-1CBF, U+2D00-2D2F; +} +/* greek */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 400; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjEUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, + U+03A3-03FF; +} +/* gujarati */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 400; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPikUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0951-0952, U+0964-0965, U+0A80-0AFF, U+200C-200D, U+20B9, + U+25CC, U+A830-A839; +} +/* gurmukhi */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 400; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPhEUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0951-0952, U+0964-0965, U+0A01-0A76, U+200C-200D, U+20B9, + U+25CC, U+262C, U+A830-A839; +} +/* hebrew */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 400; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjAUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F; +} +/* khmer */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 400; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjkUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+1780-17FF, U+19E0-19FF, U+200C-200D, U+25CC; +} +/* lao */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 400; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjsUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0E81-0EDF, U+200C-200D, U+25CC; +} +/* oriya */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 400; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPisUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0951-0952, U+0964-0965, U+0B01-0B77, U+1CDA, U+1CF2, + U+200C-200D, U+20B9, U+25CC; +} +/* sinhala */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 400; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPi8UvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0964-0965, U+0D81-0DF4, U+1CF2, U+200C-200D, U+25CC, + U+111E1-111F4; +} +/* tamil */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 400; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPiQUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0964-0965, U+0B82-0BFA, U+200C-200D, U+20B9, U+25CC; +} +/* telugu */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 400; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPi4UvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0951-0952, U+0964-0965, U+0C00-0C7F, U+1CDA, U+1CF2, + U+200C-200D, U+25CC; +} +/* thai */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 400; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPiYUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0E01-0E5B, U+200C-200D, U+25CC; +} +/* vietnamese */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 400; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPj0UvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, + U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, + U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 400; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjwUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, + U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 400; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjIUvbQoi-E.woff2) + format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, + U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, + U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* armenian */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 500; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPiIUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0308, U+0530-058F, U+2010, U+2024, U+25CC, U+FB13-FB17; +} +/* bengali */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 500; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPiAUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0951-0952, U+0964-0965, U+0980-09FE, U+1CD0, U+1CD2, + U+1CD5-1CD6, U+1CD8, U+1CE1, U+1CEA, U+1CED, U+1CF2, U+1CF5-1CF7, + U+200C-200D, U+20B9, U+25CC, U+A8F1; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 500; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPj8UvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, + U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 500; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjYUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* devanagari */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 500; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjMUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0900-097F, U+1CD0-1CF9, U+200C-200D, U+20A8, U+20B9, U+20F0, + U+25CC, U+A830-A839, U+A8E0-A8FF, U+11B00-11B09; +} +/* ethiopic */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 500; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPiMUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+1200-1399, U+2D80-2DDE, U+AB01-AB2E, U+1E7E0-1E7E6, + U+1E7E8-1E7EB, U+1E7ED-1E7EE, U+1E7F0-1E7FE; +} +/* georgian */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 500; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPi0UvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0589, U+10A0-10FF, U+1C90-1CBA, U+1CBD-1CBF, U+2D00-2D2F; +} +/* greek */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 500; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjEUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, + U+03A3-03FF; +} +/* gujarati */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 500; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPikUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0951-0952, U+0964-0965, U+0A80-0AFF, U+200C-200D, U+20B9, + U+25CC, U+A830-A839; +} +/* gurmukhi */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 500; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPhEUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0951-0952, U+0964-0965, U+0A01-0A76, U+200C-200D, U+20B9, + U+25CC, U+262C, U+A830-A839; +} +/* hebrew */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 500; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjAUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F; +} +/* khmer */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 500; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjkUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+1780-17FF, U+19E0-19FF, U+200C-200D, U+25CC; +} +/* lao */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 500; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjsUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0E81-0EDF, U+200C-200D, U+25CC; +} +/* oriya */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 500; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPisUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0951-0952, U+0964-0965, U+0B01-0B77, U+1CDA, U+1CF2, + U+200C-200D, U+20B9, U+25CC; +} +/* sinhala */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 500; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPi8UvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0964-0965, U+0D81-0DF4, U+1CF2, U+200C-200D, U+25CC, + U+111E1-111F4; +} +/* tamil */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 500; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPiQUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0964-0965, U+0B82-0BFA, U+200C-200D, U+20B9, U+25CC; +} +/* telugu */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 500; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPi4UvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0951-0952, U+0964-0965, U+0C00-0C7F, U+1CDA, U+1CF2, + U+200C-200D, U+25CC; +} +/* thai */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 500; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPiYUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0E01-0E5B, U+200C-200D, U+25CC; +} +/* vietnamese */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 500; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPj0UvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, + U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, + U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 500; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjwUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, + U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 500; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjIUvbQoi-E.woff2) + format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, + U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, + U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* armenian */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 700; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPiIUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0308, U+0530-058F, U+2010, U+2024, U+25CC, U+FB13-FB17; +} +/* bengali */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 700; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPiAUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0951-0952, U+0964-0965, U+0980-09FE, U+1CD0, U+1CD2, + U+1CD5-1CD6, U+1CD8, U+1CE1, U+1CEA, U+1CED, U+1CF2, U+1CF5-1CF7, + U+200C-200D, U+20B9, U+25CC, U+A8F1; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 700; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPj8UvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, + U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 700; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjYUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* devanagari */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 700; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjMUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0900-097F, U+1CD0-1CF9, U+200C-200D, U+20A8, U+20B9, U+20F0, + U+25CC, U+A830-A839, U+A8E0-A8FF, U+11B00-11B09; +} +/* ethiopic */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 700; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPiMUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+1200-1399, U+2D80-2DDE, U+AB01-AB2E, U+1E7E0-1E7E6, + U+1E7E8-1E7EB, U+1E7ED-1E7EE, U+1E7F0-1E7FE; +} +/* georgian */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 700; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPi0UvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0589, U+10A0-10FF, U+1C90-1CBA, U+1CBD-1CBF, U+2D00-2D2F; +} +/* greek */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 700; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjEUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, + U+03A3-03FF; +} +/* gujarati */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 700; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPikUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0951-0952, U+0964-0965, U+0A80-0AFF, U+200C-200D, U+20B9, + U+25CC, U+A830-A839; +} +/* gurmukhi */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 700; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPhEUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0951-0952, U+0964-0965, U+0A01-0A76, U+200C-200D, U+20B9, + U+25CC, U+262C, U+A830-A839; +} +/* hebrew */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 700; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjAUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F; +} +/* khmer */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 700; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjkUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+1780-17FF, U+19E0-19FF, U+200C-200D, U+25CC; +} +/* lao */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 700; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjsUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0E81-0EDF, U+200C-200D, U+25CC; +} +/* oriya */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 700; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPisUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0951-0952, U+0964-0965, U+0B01-0B77, U+1CDA, U+1CF2, + U+200C-200D, U+20B9, U+25CC; +} +/* sinhala */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 700; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPi8UvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0964-0965, U+0D81-0DF4, U+1CF2, U+200C-200D, U+25CC, + U+111E1-111F4; +} +/* tamil */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 700; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPiQUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0964-0965, U+0B82-0BFA, U+200C-200D, U+20B9, U+25CC; +} +/* telugu */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 700; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPi4UvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0951-0952, U+0964-0965, U+0C00-0C7F, U+1CDA, U+1CF2, + U+200C-200D, U+25CC; +} +/* thai */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 700; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPiYUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0E01-0E5B, U+200C-200D, U+25CC; +} +/* vietnamese */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 700; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPj0UvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, + U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, + U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 700; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjwUvbQoi-Entw.woff2) + format('woff2'); + unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, + U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 700; + src: url(https://fonts.gstatic.com/s/googlesans/v58/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjIUvbQoi-E.woff2) + format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, + U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, + U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic */ +@font-face { + font-family: 'Google Sans Text'; + font-style: normal; + font-weight: 400; + src: url(https://fonts.gstatic.com/s/googlesanstext/v21/5aUu9-KzpRiLCAt4Unrc-xIKmCU5qE52i0VBuxOCBA.woff2) + format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek */ +@font-face { + font-family: 'Google Sans Text'; + font-style: normal; + font-weight: 400; + src: url(https://fonts.gstatic.com/s/googlesanstext/v21/5aUu9-KzpRiLCAt4Unrc-xIKmCU5qEl2i0VBuxOCBA.woff2) + format('woff2'); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, + U+03A3-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Google Sans Text'; + font-style: normal; + font-weight: 400; + src: url(https://fonts.gstatic.com/s/googlesanstext/v21/5aUu9-KzpRiLCAt4Unrc-xIKmCU5qEV2i0VBuxOCBA.woff2) + format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, + U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, + U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Google Sans Text'; + font-style: normal; + font-weight: 400; + src: url(https://fonts.gstatic.com/s/googlesanstext/v21/5aUu9-KzpRiLCAt4Unrc-xIKmCU5qER2i0VBuxOCBA.woff2) + format('woff2'); + unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, + U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Google Sans Text'; + font-style: normal; + font-weight: 400; + src: url(https://fonts.gstatic.com/s/googlesanstext/v21/5aUu9-KzpRiLCAt4Unrc-xIKmCU5qEp2i0VBuxM.woff2) + format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, + U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, + U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + src: url(https://fonts.gstatic.com/s/roboto/v30/KFOlCnqEu92Fr1MmSU5fCRc4AMP6lbBP.woff2) + format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, + U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + src: url(https://fonts.gstatic.com/s/roboto/v30/KFOlCnqEu92Fr1MmSU5fABc4AMP6lbBP.woff2) + format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + src: url(https://fonts.gstatic.com/s/roboto/v30/KFOlCnqEu92Fr1MmSU5fCBc4AMP6lbBP.woff2) + format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + src: url(https://fonts.gstatic.com/s/roboto/v30/KFOlCnqEu92Fr1MmSU5fBxc4AMP6lbBP.woff2) + format('woff2'); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, + U+03A3-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + src: url(https://fonts.gstatic.com/s/roboto/v30/KFOlCnqEu92Fr1MmSU5fCxc4AMP6lbBP.woff2) + format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, + U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, + U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + src: url(https://fonts.gstatic.com/s/roboto/v30/KFOlCnqEu92Fr1MmSU5fChc4AMP6lbBP.woff2) + format('woff2'); + unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, + U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + src: url(https://fonts.gstatic.com/s/roboto/v30/KFOlCnqEu92Fr1MmSU5fBBc4AMP6lQ.woff2) + format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, + U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, + U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + src: url(https://fonts.gstatic.com/s/roboto/v30/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2) + format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, + U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + src: url(https://fonts.gstatic.com/s/roboto/v30/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2) + format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + src: url(https://fonts.gstatic.com/s/roboto/v30/KFOmCnqEu92Fr1Mu7mxKKTU1Kvnz.woff2) + format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + src: url(https://fonts.gstatic.com/s/roboto/v30/KFOmCnqEu92Fr1Mu4WxKKTU1Kvnz.woff2) + format('woff2'); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, + U+03A3-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + src: url(https://fonts.gstatic.com/s/roboto/v30/KFOmCnqEu92Fr1Mu7WxKKTU1Kvnz.woff2) + format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, + U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, + U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + src: url(https://fonts.gstatic.com/s/roboto/v30/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2) + format('woff2'); + unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, + U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + src: url(https://fonts.gstatic.com/s/roboto/v30/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2) + format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, + U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, + U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 500; + src: url(https://fonts.gstatic.com/s/roboto/v30/KFOlCnqEu92Fr1MmEU9fCRc4AMP6lbBP.woff2) + format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, + U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 500; + src: url(https://fonts.gstatic.com/s/roboto/v30/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) + format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 500; + src: url(https://fonts.gstatic.com/s/roboto/v30/KFOlCnqEu92Fr1MmEU9fCBc4AMP6lbBP.woff2) + format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 500; + src: url(https://fonts.gstatic.com/s/roboto/v30/KFOlCnqEu92Fr1MmEU9fBxc4AMP6lbBP.woff2) + format('woff2'); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, + U+03A3-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 500; + src: url(https://fonts.gstatic.com/s/roboto/v30/KFOlCnqEu92Fr1MmEU9fCxc4AMP6lbBP.woff2) + format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, + U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, + U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 500; + src: url(https://fonts.gstatic.com/s/roboto/v30/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) + format('woff2'); + unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, + U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 500; + src: url(https://fonts.gstatic.com/s/roboto/v30/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) + format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, + U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, + U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 700; + src: url(https://fonts.gstatic.com/s/roboto/v30/KFOlCnqEu92Fr1MmWUlfCRc4AMP6lbBP.woff2) + format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, + U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 700; + src: url(https://fonts.gstatic.com/s/roboto/v30/KFOlCnqEu92Fr1MmWUlfABc4AMP6lbBP.woff2) + format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 700; + src: url(https://fonts.gstatic.com/s/roboto/v30/KFOlCnqEu92Fr1MmWUlfCBc4AMP6lbBP.woff2) + format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 700; + src: url(https://fonts.gstatic.com/s/roboto/v30/KFOlCnqEu92Fr1MmWUlfBxc4AMP6lbBP.woff2) + format('woff2'); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, + U+03A3-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 700; + src: url(https://fonts.gstatic.com/s/roboto/v30/KFOlCnqEu92Fr1MmWUlfCxc4AMP6lbBP.woff2) + format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, + U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, + U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 700; + src: url(https://fonts.gstatic.com/s/roboto/v30/KFOlCnqEu92Fr1MmWUlfChc4AMP6lbBP.woff2) + format('woff2'); + unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, + U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 700; + src: url(https://fonts.gstatic.com/s/roboto/v30/KFOlCnqEu92Fr1MmWUlfBBc4AMP6lQ.woff2) + format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, + U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, + U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} diff --git a/src/components/Contacts/ContactDetails/ContactTasksTab/ContactTaskRow/TaskCommentsButton/TaskCommentsButton.tsx b/src/components/Contacts/ContactDetails/ContactTasksTab/ContactTaskRow/TaskCommentsButton/TaskCommentsButton.tsx index b6efcc7a1..21ca5e881 100644 --- a/src/components/Contacts/ContactDetails/ContactTasksTab/ContactTaskRow/TaskCommentsButton/TaskCommentsButton.tsx +++ b/src/components/Contacts/ContactDetails/ContactTasksTab/ContactTaskRow/TaskCommentsButton/TaskCommentsButton.tsx @@ -4,7 +4,7 @@ import { Button, ButtonProps, Typography } from '@mui/material'; import { styled } from '@mui/material/styles'; import theme from 'src/theme'; -const TaskRowWrap = styled(Button, { +export const TaskRowWrap = styled(Button, { shouldForwardProp: (prop) => prop !== 'small' && prop !== 'detailsPage', })<{ small?: boolean; detailsPage?: boolean }>( ({ theme, small, detailsPage }) => ({ @@ -20,7 +20,7 @@ const TaskRowWrap = styled(Button, { }), ); -const TaskCommentIcon = styled(ChatBubbleOutline, { +export const TaskCommentIcon = styled(ChatBubbleOutline, { shouldForwardProp: (prop) => prop !== 'small', })<{ small?: boolean }>(({ small }) => ({ color: theme.palette.text.secondary, diff --git a/src/components/Contacts/ContactDetails/ContactTasksTab/ContactTasksTab.tsx b/src/components/Contacts/ContactDetails/ContactTasksTab/ContactTasksTab.tsx index 8a54c0f4c..e62843084 100644 --- a/src/components/Contacts/ContactDetails/ContactTasksTab/ContactTasksTab.tsx +++ b/src/components/Contacts/ContactDetails/ContactTasksTab/ContactTasksTab.tsx @@ -10,6 +10,7 @@ import { ListHeaderCheckBoxState } from 'src/components/Shared/Header/ListHeader import { StarFilterButton } from 'src/components/Shared/Header/StarFilterButton/StarFilterButton'; import { TasksMassActionsDropdown } from 'src/components/Shared/MassActions/TasksMassActionsDropdown'; import { TaskModalEnum } from 'src/components/Task/Modal/TaskModal'; +import { TaskRowSkeleton } from 'src/components/Task/TaskRow/TaskRowSkeleton.skeleton'; import { SearchBox } from 'src/components/common/SearchBox/SearchBox'; import { TaskFilterSetInput } from 'src/graphql/types.generated'; import { useGetTaskIdsForMassSelectionQuery } from 'src/hooks/GetIdsForMassSelection.generated'; @@ -227,6 +228,8 @@ export const ContactTasksTab: React.FC = ({ } itemContent={(index, task) => ( diff --git a/src/components/Contacts/ContactFlow/ContactFlowColumn/ContactFlowColumn.test.tsx b/src/components/Contacts/ContactFlow/ContactFlowColumn/ContactFlowColumn.test.tsx index 7eb0add7d..7870bb0af 100644 --- a/src/components/Contacts/ContactFlow/ContactFlowColumn/ContactFlowColumn.test.tsx +++ b/src/components/Contacts/ContactFlow/ContactFlowColumn/ContactFlowColumn.test.tsx @@ -36,7 +36,7 @@ const router = { describe('ContactFlowColumn', () => { it('should render a column with correct details', async () => { - const { getByText, getByTestId } = render( + const { getByText, findByText, getByTestId } = render( @@ -75,7 +75,7 @@ describe('ContactFlowColumn', () => { ); await waitFor(() => expect(getByText(title)).toBeInTheDocument()); expect(getByText('1')).toBeInTheDocument(); - expect(getByText('Test Person')).toBeInTheDocument(); + expect(await findByText('Test Person')).toBeInTheDocument(); expect(getByTestId('column-header')).toHaveStyle({ backgroundColor: 'theme.palette.mpdxBlue.main', }); diff --git a/src/components/Contacts/ContactFlow/ContactFlowColumn/ContactFlowColumn.tsx b/src/components/Contacts/ContactFlow/ContactFlowColumn/ContactFlowColumn.tsx index 2e28e0b5b..a35da03e5 100644 --- a/src/components/Contacts/ContactFlow/ContactFlowColumn/ContactFlowColumn.tsx +++ b/src/components/Contacts/ContactFlow/ContactFlowColumn/ContactFlowColumn.tsx @@ -23,6 +23,7 @@ import { InfiniteList } from '../../../InfiniteList/InfiniteList'; import { ContactRowFragment } from '../../ContactRow/ContactRow.generated'; import { ContactFlowDropZone } from '../ContactFlowDropZone/ContactFlowDropZone'; import { ContactFlowRow } from '../ContactFlowRow/ContactFlowRow'; +import { ContactFlowRowSkeleton } from '../ContactFlowRow/ContactFlowRow.skeleton'; interface Props { data?: ContactRowFragment[]; @@ -150,6 +151,8 @@ export const ContactFlowColumn: React.FC = ({ ( ({ + display: 'flex', + width: '100%', + flexDirection: 'column', +})); + +export const ContactFlowRowSkeleton: React.FC = () => { + return ( + + + + + + + + + + + + + + + + + + ); +}; diff --git a/src/components/Contacts/ContactFlow/ContactFlowRow/ContactFlowRow.tsx b/src/components/Contacts/ContactFlow/ContactFlowRow/ContactFlowRow.tsx index e15623fd2..33eacc835 100644 --- a/src/components/Contacts/ContactFlow/ContactFlowRow/ContactFlowRow.tsx +++ b/src/components/Contacts/ContactFlow/ContactFlowRow/ContactFlowRow.tsx @@ -32,7 +32,7 @@ const ContactLink = styled(Typography)(() => ({ }, })); -const DraggableBox = styled(Box)(() => ({ +export const DraggableBox = styled(Box)(() => ({ display: 'flex', justifyContent: 'space-between', alignItems: 'center', diff --git a/src/components/Contacts/ContactRow/ContactRow.tsx b/src/components/Contacts/ContactRow/ContactRow.tsx index c5b92c865..eea29272e 100644 --- a/src/components/Contacts/ContactRow/ContactRow.tsx +++ b/src/components/Contacts/ContactRow/ContactRow.tsx @@ -15,6 +15,7 @@ import { ContactsContext, ContactsType, } from 'src/components/Contacts/ContactsContext/ContactsContext'; +import theme from 'src/theme'; import { CelebrationIcons } from '../CelebrationIcons/CelebrationIcons'; import { ContactPartnershipStatus } from '../ContactPartnershipStatus/ContactPartnershipStatus'; import { ContactUncompletedTasksCount } from '../ContactUncompletedTasksCount/ContactUncompletedTasksCount'; @@ -22,21 +23,10 @@ import { preloadContactsRightPanel } from '../ContactsRightPanel/DynamicContacts import { StarContactIconButton } from '../StarContactIconButton/StarContactIconButton'; import { ContactRowFragment } from './ContactRow.generated'; -interface Props { - contact: ContactRowFragment; - useTopMargin?: boolean; -} - -export const ContactRow: React.FC = ({ contact, useTopMargin }) => { - const { - accountListId, - isRowChecked: isChecked, - contactDetailsOpen, - setContactFocus: onContactSelected, - toggleSelectionById: onContactCheckToggle, - } = React.useContext(ContactsContext) as ContactsType; - - const ListItemButton = styled(ButtonBase)(({ theme }) => ({ +const ListItemButton = styled(ButtonBase, { + shouldForwardProp: (prop) => prop !== 'isChecked', +})<{ isChecked: boolean; useTopMargin?: boolean }>( + ({ isChecked, useTopMargin }) => ({ flex: '1 1 auto', textAlign: 'left', marginTop: useTopMargin ? '16px' : '0', @@ -44,111 +34,129 @@ export const ContactRow: React.FC = ({ contact, useTopMargin }) => { [theme.breakpoints.up('sm')]: { padding: theme.spacing(0, 0.5), }, - ...(isChecked(contactId) - ? { backgroundColor: theme.palette.cruGrayLight.main } - : {}), - })); + ...(isChecked ? { backgroundColor: theme.palette.cruGrayLight.main } : {}), + }), +); - const StyledCheckbox = styled(Checkbox, { - shouldForwardProp: (prop) => prop !== 'value', - })(() => ({ - '&:hover': { - backgroundColor: 'rgba(0, 0, 0, 0.04)', - }, - })); +const StyledCheckbox = styled(Checkbox, { + shouldForwardProp: (prop) => prop !== 'value', +})(() => ({ + '&:hover': { + backgroundColor: 'rgba(0, 0, 0, 0.04)', + }, +})); - const onClick = () => { - onContactSelected(contact.id); - }; +interface Props { + contact: ContactRowFragment; + useTopMargin?: boolean; +} - const { - id: contactId, - lateAt, - name, - pledgeAmount, - pledgeCurrency, - pledgeFrequency, - pledgeReceived, - primaryAddress, - starred, - status, - uncompletedTasksCount, - } = contact; +// eslint-disable-next-line react/display-name +export const ContactRow: React.FC = React.memo( + ({ contact, useTopMargin }) => { + const { + accountListId, + isRowChecked: isChecked, + contactDetailsOpen, + setContactFocus: onContactSelected, + toggleSelectionById: onContactCheckToggle, + } = React.useContext(ContactsContext) as ContactsType; - return ( - - - - event.stopPropagation()} - onChange={() => onContactCheckToggle(contact.id)} - value={isChecked} - /> - - - - - - - {name} - - - - } - secondary={ - primaryAddress && ( - - - {[ - primaryAddress.street, - primaryAddress.city, - primaryAddress.state, - primaryAddress.postalCode, - ].join(', ')} - - - ) - } - /> - - - + const onClick = () => { + onContactSelected(contact.id); + }; + + const { + id: contactId, + lateAt, + name, + pledgeAmount, + pledgeCurrency, + pledgeFrequency, + pledgeReceived, + primaryAddress, + starred, + status, + uncompletedTasksCount, + } = contact; + + return ( + + + + event.stopPropagation()} + onChange={() => onContactCheckToggle(contact.id)} + value={isChecked} + /> + + + + + + + {name} + + + + } + secondary={ + primaryAddress && ( + + + {[ + primaryAddress.street, + primaryAddress.city, + primaryAddress.state, + primaryAddress.postalCode, + ].join(', ')} + + + ) + } + /> + + + + - - - event.stopPropagation()}> - - - - - - - - ); -}; + + event.stopPropagation()}> + + + + + + + + ); + }, +); diff --git a/src/components/Contacts/ContactRow/ContactRowSkeleton.skeleton.tsx b/src/components/Contacts/ContactRow/ContactRowSkeleton.skeleton.tsx new file mode 100644 index 000000000..78ab08c05 --- /dev/null +++ b/src/components/Contacts/ContactRow/ContactRowSkeleton.skeleton.tsx @@ -0,0 +1,93 @@ +import React from 'react'; +import CheckCircleOutlineIcon from '@mui/icons-material/CheckCircleOutline'; +import { + Box, + ButtonBase, + Grid, + Hidden, + IconButton, + ListItemIcon, + ListItemSecondaryAction, + Skeleton, +} from '@mui/material'; +import { styled } from '@mui/material/styles'; +import { InfiniteListRowSkeletonProps } from 'src/components/InfiniteList/InfiniteList'; +import { StarredItemIcon } from 'src/components/common/StarredItemIcon/StarredItemIcon'; +import theme from 'src/theme'; + +const ListItemButton = styled(ButtonBase, { + shouldForwardProp: (prop) => prop !== 'isFirst', +})<{ isFirst?: boolean }>(({ isFirst }) => ({ + flex: '1 1 auto', + textAlign: 'left', + marginTop: isFirst ? '16px' : '0', + padding: theme.spacing(0, 0.5, 0, 2), + [theme.breakpoints.up('sm')]: { + padding: theme.spacing(0, 0.5), + }, +})); + +export const ContactRowSkeleton: React.FC = + // eslint-disable-next-line react/display-name + React.memo(({ isFirst }) => { + return ( + + + + + + + + + + + + +
+ + +
+
+
+ + + + + + + + + + + + + + + +
+ ); + }); diff --git a/src/components/Contacts/ContactsContext/ContactsContext.test.tsx b/src/components/Contacts/ContactsContext/ContactsContext.test.tsx index 107efadda..2f909e716 100644 --- a/src/components/Contacts/ContactsContext/ContactsContext.test.tsx +++ b/src/components/Contacts/ContactsContext/ContactsContext.test.tsx @@ -47,39 +47,29 @@ jest.mock('notistack', () => ({ })); const TestRender: React.FC = () => { - const { viewMode, handleViewModeChange, userOptionsLoading } = useContext( + const { viewMode, handleViewModeChange } = useContext( ContactsContext, ) as ContactsType; return ( - {!userOptionsLoading ? ( - <> - {viewMode} - - - - - ) : ( - <>Loading - )} + {viewMode} + + + ); }; @@ -128,7 +118,6 @@ describe('ContactsPageContext', () => {
, ); - expect(getByText('Loading')).toBeInTheDocument(); await waitFor(() => expect(getByText('Flows Button')).toBeInTheDocument()); userEvent.click(getByText('Flows Button')); await waitFor(() => expect(getByText('flows')).toBeInTheDocument()); @@ -171,7 +160,6 @@ describe('ContactsPageContext', () => { , ); - expect(getByText('Loading')).toBeInTheDocument(); await waitFor(() => expect(getByText('Map Button')).toBeInTheDocument()); userEvent.click(getByText('Map Button')); await waitFor(() => expect(getByText('map')).toBeInTheDocument()); @@ -192,7 +180,7 @@ describe('ContactsPageContext', () => { }); it('does not have a contact id and changes to map', async () => { - const { getByText, queryByText } = render( + const { getByText } = render( { , ); - expect(getByText('Loading')).toBeInTheDocument(); - await waitFor(() => expect(queryByText('Loading')).not.toBeInTheDocument()); await waitFor(() => expect(getByText('Map Button')).toBeInTheDocument()); userEvent.click(getByText('Map Button')); await waitFor(() => expect(getByText('map')).toBeInTheDocument()); diff --git a/src/components/Contacts/ContactsContext/ContactsContext.tsx b/src/components/Contacts/ContactsContext/ContactsContext.tsx index c4af76d21..19408f0f3 100644 --- a/src/components/Contacts/ContactsContext/ContactsContext.tsx +++ b/src/components/Contacts/ContactsContext/ContactsContext.tsx @@ -156,16 +156,18 @@ export const ContactsProvider: React.FC = ({ //User options for display view const { loading: userOptionsLoading } = useGetUserOptionsQuery({ onCompleted: ({ userOptions }) => { - if (contactId?.includes('list')) { - setViewMode(TableViewModeEnum.List); - } else { - setViewMode( - (userOptions.find((option) => option.key === 'contacts_view') - ?.value as TableViewModeEnum) || TableViewModeEnum.List, - ); - } + setViewMode( + (userOptions.find((option) => option.key === 'contacts_view') + ?.value as TableViewModeEnum) || TableViewModeEnum.List, + ); }, + skip: contactId?.includes('list'), }); + useEffect(() => { + if (contactId?.includes('list')) { + setViewMode(TableViewModeEnum.List); + } + }, []); const contactsFilters = useMemo( () => ({ diff --git a/src/components/Contacts/ContactsList/ContactsList.tsx b/src/components/Contacts/ContactsList/ContactsList.tsx index b1553cc88..0f31e21b2 100644 --- a/src/components/Contacts/ContactsList/ContactsList.tsx +++ b/src/components/Contacts/ContactsList/ContactsList.tsx @@ -9,6 +9,7 @@ import { navBarHeight } from 'src/components/Layouts/Primary/Primary'; import NullState from 'src/components/Shared/Filters/NullState/NullState'; import { headerHeight } from 'src/components/Shared/Header/ListHeader'; import { ContactRow } from '../ContactRow/ContactRow'; +import { ContactRowSkeleton } from '../ContactRow/ContactRowSkeleton.skeleton'; export const ContactsList: React.FC = () => { const { @@ -16,20 +17,27 @@ export const ContactsList: React.FC = () => { searchTerm, isFiltered, setActiveFilters, + userOptionsLoading, } = React.useContext(ContactsContext) as ContactsType; return ( ( - - )} + itemContent={ + loading + ? (index) => + : (index, contact) => ( + + ) + } groupBy={(item) => ({ label: item.name[0].toUpperCase() })} endReached={() => data?.contacts?.pageInfo.hasNextPage && diff --git a/src/components/Contacts/ContactsMainPanel/ContactsMainPanel.tsx b/src/components/Contacts/ContactsMainPanel/ContactsMainPanel.tsx index 473188f50..81e069504 100644 --- a/src/components/Contacts/ContactsMainPanel/ContactsMainPanel.tsx +++ b/src/components/Contacts/ContactsMainPanel/ContactsMainPanel.tsx @@ -17,28 +17,26 @@ export const ContactsMainPanel: React.FC = () => { searchTerm, setContactFocus, viewMode, - userOptionsLoading, } = React.useContext(ContactsContext) as ContactsType; return ( <> - {!userOptionsLoading && - (viewMode === TableViewModeEnum.List ? ( - - ) : viewMode === TableViewModeEnum.Flows ? ( - - ) : ( - - ))} + {viewMode === TableViewModeEnum.List ? ( + + ) : viewMode === TableViewModeEnum.Flows ? ( + + ) : ( + + )} ); }; diff --git a/src/components/Dashboard/Dashboard.tsx b/src/components/Dashboard/Dashboard.tsx index a0abbdf05..d05df648d 100644 --- a/src/components/Dashboard/Dashboard.tsx +++ b/src/components/Dashboard/Dashboard.tsx @@ -1,6 +1,5 @@ import React, { ReactElement } from 'react'; import { Box, Container, Grid } from '@mui/material'; -import { motion } from 'framer-motion'; import { GetDashboardQuery } from 'pages/accountLists/GetDashboard.generated'; import Balance from './Balance'; import DonationHistories from './DonationHistories'; @@ -13,62 +12,41 @@ interface Props { accountListId: string; } -const variants = { - animate: { - transition: { - delayChildren: 1, - staggerChildren: 0.15, - }, - }, - exit: { - transition: { - staggerChildren: 0.1, - }, - }, -}; - const Dashboard = ({ data, accountListId }: Props): ReactElement => { return ( <> - - - - - - - - - - - - - - + + + + + + + + + + + + - + diff --git a/src/components/InfiniteList/InfiniteList.test.tsx b/src/components/InfiniteList/InfiniteList.test.tsx index ceaf7c204..20e0e42ab 100644 --- a/src/components/InfiniteList/InfiniteList.test.tsx +++ b/src/components/InfiniteList/InfiniteList.test.tsx @@ -1,15 +1,23 @@ import React from 'react'; +import { Skeleton } from '@mui/material'; import { ThemeProvider } from '@mui/material/styles'; import { render } from '@testing-library/react'; import { VirtuosoMockContext } from 'react-virtuoso'; import theme from '../../theme'; import { InfiniteList } from './InfiniteList'; +const RowSkeleton: React.FC = () => ( +
+ + +
+); + const endReached = jest.fn(); describe('InfiniteList', () => { it('should show loading indicator', async () => { - const { getByTestId } = render( + const { getAllByTestId } = render( { , ); - expect(getByTestId('infinite-list-skeleton-loading')).toBeVisible(); + expect(getAllByTestId('infinite-list-skeleton-loading').length).toBe(2); + }); + + it('should show custom skeletons', async () => { + const { getAllByTestId } = render( + +
{item}
} + endReached={() => true} + EmptyPlaceholder={
No items
} + /> +
, + ); + + expect(getAllByTestId('infinite-list-skeleton-loading').length).toBe(2); + // 10 skeletons for loading, and another 10 for next items + expect(getAllByTestId('row-skeleton').length).toBe(20); + }); + + it('does not show loading when items are present', async () => { + const { getAllByTestId } = render( + +
{item}
} + endReached={endReached} + EmptyPlaceholder={
No items
} + /> +
, + ); + + expect(getAllByTestId('infinite-list-skeleton-loading').length).toBe(1); + }); + + it('empty', async () => { + const { queryByTestId, getByText } = render( + +
{item}
} + endReached={endReached} + EmptyPlaceholder={
No items
} + /> +
, + ); + + expect(queryByTestId('infinite-list-skeleton-loading')).toBeNull(); + expect(getByText('No items')).toBeInTheDocument(); }); it('should render data', async () => { @@ -75,22 +137,4 @@ describe('InfiniteList', () => { expect(queryByText('No items')).toBeNull(); expect(endReached).not.toHaveBeenCalled(); }); - - it('empty', async () => { - const { queryByTestId, getByText } = render( - -
{item}
} - endReached={endReached} - EmptyPlaceholder={
No items
} - /> -
, - ); - - expect(queryByTestId('infinite-list-skeleton-loading')).toBeNull(); - expect(getByText('No items')).toBeInTheDocument(); - }); }); diff --git a/src/components/InfiniteList/InfiniteList.tsx b/src/components/InfiniteList/InfiniteList.tsx index 28532a697..a013a6641 100644 --- a/src/components/InfiniteList/InfiniteList.tsx +++ b/src/components/InfiniteList/InfiniteList.tsx @@ -40,7 +40,11 @@ const ItemWithBorders = styled(ListItem, { }), })); -const Item: React.ComponentType = (props) => ( +export interface InfiniteListRowSkeletonProps { + isFirst?: boolean; +} + +const Item: React.ComponentType> = (props) => ( ); @@ -50,14 +54,19 @@ const SkeletonItem: React.FC<{ height: number }> = ({ height }) => ( ); -const Loading: React.FC = () => ( +type LoadingProps = { + Skeleton: React.FC | null; + numberOfSkeletons: number; +}; +const Loading: React.FC = ({ Skeleton, numberOfSkeletons }) => (
- - - - - - + {[...Array(numberOfSkeletons).keys()].map((value) => { + return Skeleton ? ( + + ) : ( + + ); + })}
); @@ -72,6 +81,8 @@ export interface InfiniteListProps { loading: boolean; EmptyPlaceholder?: ReactElement | null; itemContent: ItemContent; + Skeleton?: React.FC | null; + numberOfSkeletons?: number; // eslint-disable-next-line @typescript-eslint/no-explicit-any context?: any; groupBy?: (item: T) => { label: string; order?: number }; @@ -84,6 +95,8 @@ export const InfiniteList = ({ context, groupBy, itemContent, + Skeleton = null, + numberOfSkeletons = 6, ...props }: Omit, 'groupCounts' | 'itemContent'> & InfiniteListProps): ReactElement => { @@ -95,11 +108,13 @@ export const InfiniteList = ({ const commonProps: Omit, 'itemContent'> = { ...props, components: { - Footer: loading ? Loading : undefined, + Footer: loading + ? () => Loading({ Skeleton, numberOfSkeletons }) + : undefined, EmptyPlaceholder: loading ? undefined : () => EmptyPlaceholder, List: ListContainer, Item, - ScrollSeekPlaceholder: SkeletonItem, + ScrollSeekPlaceholder: Skeleton ? Skeleton : SkeletonItem, ...props.components, }, scrollSeekConfiguration: { @@ -109,28 +124,33 @@ export const InfiniteList = ({ }, }; - if (groupCounts.length > 0) { - return ( - ( - {groupLabels[index]} - )} - itemContent={(index) => - items[index] && itemContent(index, items[index], context) - } - {...commonProps} - /> - ); - } else { - return ( - - items[index] && itemContent(index, items[index], context) - } - {...commonProps} - /> - ); - } + return ( + + {loading && !items.length && ( + + )} + + {!!groupCounts.length && ( + ( + {groupLabels[index]} + )} + itemContent={(index) => + items[index] && itemContent(index, items[index], context) + } + {...commonProps} + /> + )} + {!groupCounts.length && ( + + items[index] && itemContent(index, items[index], context) + } + {...commonProps} + /> + )} + + ); }; diff --git a/src/components/PageHeading/PageHeading.tsx b/src/components/PageHeading/PageHeading.tsx index bd62e2941..66f12b490 100644 --- a/src/components/PageHeading/PageHeading.tsx +++ b/src/components/PageHeading/PageHeading.tsx @@ -42,10 +42,7 @@ const PageHeading = ({ const { classes } = useStyles(); return ( - {subheading && ( @@ -85,7 +94,7 @@ const PageHeading = ({ )} - + ); }; diff --git a/src/components/Settings/Organization/Contacts/Contacts.tsx b/src/components/Settings/Organization/Contacts/Contacts.tsx index a495b4b64..dcf671fc2 100644 --- a/src/components/Settings/Organization/Contacts/Contacts.tsx +++ b/src/components/Settings/Organization/Contacts/Contacts.tsx @@ -7,6 +7,7 @@ import { OrganizationsContext, OrganizationsContextType, } from 'pages/accountLists/[accountListId]/settings/organizations/OrganizationsContext'; +import { ContactRowSkeleton } from 'src/components/Contacts/ContactRow/ContactRowSkeleton.skeleton'; import { InfiniteList } from 'src/components/InfiniteList/InfiniteList'; import { NullStateBox } from 'src/components/Shared/Filters/NullState/NullStateBox'; import { LoadingSpinner } from '../LoadingSpinner'; @@ -53,6 +54,8 @@ export const Contacts: React.FC = () => { {loading && } { - const stringParts = inputKey.split('_'); - - return stringParts.reduce((outputKey, part, index) => { - if (index === 0) { - return part; - } - - return `${outputKey}${part.charAt(0).toUpperCase()}${part.slice(1)}`; - }, ''); -}; - const FilterHeader = styled(Box)(({ theme }) => ({ padding: theme.spacing(2), borderBottom: '1px solid', diff --git a/src/components/Task/TaskRow/TaskRow.tsx b/src/components/Task/TaskRow/TaskRow.tsx index 878653373..d7c63dfca 100644 --- a/src/components/Task/TaskRow/TaskRow.tsx +++ b/src/components/Task/TaskRow/TaskRow.tsx @@ -20,14 +20,14 @@ import { StarTaskIconButton } from '../../Contacts/ContactDetails/ContactTasksTa import { TaskModalEnum } from '../Modal/TaskModal'; import { TaskRowFragment } from './TaskRow.generated'; -const SubjectWrapOuter = styled(Box)(({ theme }) => ({ +export const SubjectWrapOuter = styled(Box)(({ theme }) => ({ width: 'fit-content', display: 'flex', alignItems: 'center', marginRight: theme.spacing(1), })); -const SubjectWrapInner = styled(Box)(({}) => ({ +export const SubjectWrapInner = styled(Box)(({}) => ({ display: 'flex', '&:hover': { textDecoration: 'underline', @@ -94,7 +94,7 @@ export const TaskRow: React.FC = ({ whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis', - marginTop: useTopMargin ? '20px' : '0', + marginTop: useTopMargin ? '16px' : '0', })); const { openTaskModal, preloadTaskModal } = useTaskModal(); diff --git a/src/components/Task/TaskRow/TaskRowSkeleton.skeleton.tsx b/src/components/Task/TaskRow/TaskRowSkeleton.skeleton.tsx new file mode 100644 index 000000000..c8ea6c96f --- /dev/null +++ b/src/components/Task/TaskRow/TaskRowSkeleton.skeleton.tsx @@ -0,0 +1,115 @@ +import React from 'react'; +import CalendarToday from '@mui/icons-material/CalendarToday'; +import { Box, Hidden, Skeleton, Typography } from '@mui/material'; +import { styled } from '@mui/material/styles'; +import { + TaskCommentIcon, + TaskRowWrap, +} from 'src/components/Contacts/ContactDetails/ContactTasksTab/ContactTaskRow/TaskCommentsButton/TaskCommentsButton'; +import { InfiniteListRowSkeletonProps } from 'src/components/InfiniteList/InfiniteList'; +import { DeletedItemIcon } from 'src/components/common/DeleteItemIcon/DeleteItemIcon'; +import { StarredItemIcon } from 'src/components/common/StarredItemIcon/StarredItemIcon'; +import theme from 'src/theme'; + +const TaskRowSkeletonWrap = styled(Box)(({ theme }) => ({ + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + margin: theme.spacing(1), +})); + +const TaskCalendarIcon = styled(CalendarToday)(() => ({ + width: 20, + height: 20, + color: theme.palette.text.secondary, +})); + +const TaskCommentNumber = styled(Typography)(() => ({ + color: theme.palette.text.primary, + margin: theme.spacing(0.5), +})); + +const ContactRowButton = styled(Box)(() => ({ + height: '56px', + width: '100%', + display: 'flex', + flexDirection: 'row', + justifyContent: 'space-evenly', + alignItems: 'center', + alignContent: 'center', + cursor: 'pointer', + whiteSpace: 'nowrap', + overflow: 'hidden', + textOverflow: 'ellipsis', + marginTop: '0', +})); + +export const TaskRowSkeleton: React.FC = () => ( + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + + + +); diff --git a/yarn.lock b/yarn.lock index 5aeaa51ac..916696723 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8154,24 +8154,6 @@ __metadata: languageName: node linkType: hard -"@virtuoso.dev/react-urx@npm:^0.2.12": - version: 0.2.13 - resolution: "@virtuoso.dev/react-urx@npm:0.2.13" - dependencies: - "@virtuoso.dev/urx": ^0.2.13 - peerDependencies: - react: ">=16" - checksum: 173e91c21f6a8cd506ad3b72af10656897fe1951124ed9eeb1fd85575534993bea2f97cba3f81c08ae1e88a2613df348e2c80d0ceecb3021f8c8c8fe0e053ee2 - languageName: node - linkType: hard - -"@virtuoso.dev/urx@npm:^0.2.12, @virtuoso.dev/urx@npm:^0.2.13": - version: 0.2.13 - resolution: "@virtuoso.dev/urx@npm:0.2.13" - checksum: 682a99cf40ccc429241268dd37495cd1ed4695ae58b5a1169c75df1630d5dc3fd8eb3aaa655f71c37f39ba9c23c0aaf4401b76d8a986986d1a38a422d596a6ba - languageName: node - linkType: hard - "@webassemblyjs/ast@npm:1.11.1": version: 1.11.1 resolution: "@webassemblyjs/ast@npm:1.11.1" @@ -19529,7 +19511,7 @@ __metadata: react-dnd-html5-backend: ^14.0.2 react-dom: ^18.2.0 react-i18next: ^11.18.6 - react-virtuoso: 2.19.0 + react-virtuoso: ^4.7.4 recharts: 2.3.2 rollbar: ^2.25.2 storybook: ^6.5.16 @@ -22257,16 +22239,13 @@ __metadata: languageName: node linkType: hard -"react-virtuoso@npm:2.19.0": - version: 2.19.0 - resolution: "react-virtuoso@npm:2.19.0" - dependencies: - "@virtuoso.dev/react-urx": ^0.2.12 - "@virtuoso.dev/urx": ^0.2.12 +"react-virtuoso@npm:^4.7.4": + version: 4.7.11 + resolution: "react-virtuoso@npm:4.7.11" peerDependencies: react: ">=16 || >=17 || >= 18" react-dom: ">=16 || >=17 || >= 18" - checksum: 146416808b72a533d9e710826dfa2626fcc5761d6cb5709d082ed069b92b76e1258ae14bcea391fb6ac9fec09280e5e9b33fb10b4f269695e234f4323af4434c + checksum: 3e9b56e8bd2ae88b04563ff3ce221c95db493741ff89667475e390a8abfb202a9b0692cbe9edd822316a27c902c835ce0e287b036df6644909317c7a6c1462fc languageName: node linkType: hard