Compare commits
155 Commits
feature/ar
...
master
Author | SHA1 | Date | |
---|---|---|---|
![]() |
e9e9611f80 | ||
0c054687ba | |||
3b147e50a1 | |||
![]() |
e94514ed02 | ||
![]() |
0032e51858 | ||
8d6a9ab74c | |||
07c4ae8cbd | |||
a782930d3d | |||
4c1877caa5 | |||
e9324f6c14 | |||
![]() |
9fcee44e0c | ||
![]() |
9939b1c824 | ||
00deb05850 | |||
b8849945b9 | |||
08f5ee272b | |||
35aa957b35 | |||
472e8c2ea5 | |||
f17d5f3079 | |||
![]() |
4f9b33e5b9 | ||
![]() |
753223c7a9 | ||
![]() |
28cc9b1a71 | ||
![]() |
47472868e1 | ||
![]() |
f965eaddbc | ||
![]() |
2075426ff7 | ||
![]() |
209507833e | ||
eff20ae459 | |||
dcfe260f0e | |||
1af206c360 | |||
![]() |
932d23befa | ||
![]() |
e52026cf86 | ||
033a1f31ad | |||
9c79f449c5 | |||
24652d0908 | |||
944baced6c | |||
![]() |
01a873477b | ||
![]() |
d1b17592c3 | ||
1475d2db27 | |||
1ba9dc28b5 | |||
1817946fe6 | |||
de5b6ad60c | |||
![]() |
31706ca4e8 | ||
![]() |
969749c0c0 | ||
![]() |
5667f30a92 | ||
![]() |
d77c1c6388 | ||
![]() |
bd6fbbebfd | ||
![]() |
2ffce71e74 | ||
35900bec5d | |||
![]() |
c63c19e1c7 | ||
![]() |
b5443aa033 | ||
![]() |
18d02945f3 | ||
558a1fd5a7 | |||
![]() |
bee5499816 | ||
8a2a7f0c53 | |||
15b9ed1f20 | |||
cad2174bc5 | |||
0c0a79d81d | |||
df4b4d5c32 | |||
92dddab82a | |||
93cefd9ce3 | |||
373d55a543 | |||
![]() |
8a075e926e | ||
![]() |
705ae6471f | ||
![]() |
64a6e6ab20 | ||
![]() |
3cac7c7d04 | ||
![]() |
9154b1fb96 | ||
![]() |
b390ae7a2e | ||
![]() |
3c739247d2 | ||
904730dfd9 | |||
dcda165488 | |||
49d15e538b | |||
![]() |
da389cc337 | ||
3f9a76815e | |||
c99e9217f1 | |||
4479300027 | |||
e97d3abe96 | |||
![]() |
eff1a2a04f | ||
81faa7121e | |||
bbe6bcca51 | |||
c161606e08 | |||
5550b7c241 | |||
![]() |
86073d5718 | ||
85f227f7d9 | |||
![]() |
779b091bd5 | ||
![]() |
a26faeeb02 | ||
50a42955d6 | |||
9a3e545cf0 | |||
87ad19fa1a | |||
1d5eb72826 | |||
011f1564a0 | |||
89146993c7 | |||
a9895cc6dd | |||
![]() |
5afd4ced4d | ||
![]() |
f09cddff75 | ||
![]() |
8db96d108f | ||
![]() |
a7534b589f | ||
![]() |
bd1771e234 | ||
![]() |
6cdd4ed730 | ||
![]() |
12043e9123 | ||
![]() |
5e46d6a098 | ||
![]() |
18cc0084af | ||
![]() |
43a73bc538 | ||
![]() |
4c90885d92 | ||
![]() |
f3c6b65b57 | ||
![]() |
ae0f36c21e | ||
![]() |
0e3f08dea9 | ||
![]() |
10b501869a | ||
![]() |
6e71403869 | ||
![]() |
ffb5a428a0 | ||
![]() |
0411fed55e | ||
![]() |
8aaff6ab7b | ||
![]() |
a047f1fd91 | ||
![]() |
449b05c1a0 | ||
![]() |
ccadb58979 | ||
![]() |
00ee5788a8 | ||
![]() |
f5251fd04b | ||
![]() |
0931fa8fe5 | ||
![]() |
2d2e9905d3 | ||
![]() |
956109f34a | ||
![]() |
d108e88c65 | ||
![]() |
f4e83e0cc8 | ||
![]() |
4a44157efb | ||
![]() |
57b5c229a0 | ||
![]() |
37bc27bbd6 | ||
![]() |
ea783017a7 | ||
![]() |
aaecefb462 | ||
![]() |
f49b9fee1a | ||
![]() |
b5b05cd7ae | ||
![]() |
83ff35ce4f | ||
![]() |
2581ca1d88 | ||
![]() |
94f7a3d851 | ||
![]() |
f7a5aaf90e | ||
![]() |
8a64b5f0f7 | ||
![]() |
f3ccb0523a | ||
![]() |
94d23d7b0b | ||
![]() |
4a5afdf01a | ||
![]() |
24f44b4352 | ||
![]() |
ada0f450f5 | ||
![]() |
a6d9b3e417 | ||
![]() |
96027bf91a | ||
![]() |
56747b66a9 | ||
![]() |
c34cac7cee | ||
![]() |
ace9e7498d | ||
![]() |
6d36b774b2 | ||
![]() |
21c858b519 | ||
![]() |
af62f49b27 | ||
![]() |
3511e6134b | ||
![]() |
a080bc4361 | ||
![]() |
a2f80ad94f | ||
![]() |
321bb6cc9b | ||
![]() |
d5e5fe995b | ||
![]() |
4c8cb61f77 | ||
![]() |
e151986782 | ||
![]() |
d5d5ca196a | ||
![]() |
6a255a2730 | ||
![]() |
e0ff8095d0 |
0
.dockerignore
Normal file → Executable file
8
.env.development
Normal file → Executable file
@ -1,6 +1,6 @@
|
|||||||
REACT_APP_CMS_BASE_URL=https://cms.techpal.ru/api
|
REACT_APP_CMS_BASE_URL=http://scipaper.ru
|
||||||
REACT_APP_CMS_APP_NAME=techpal
|
REACT_APP_CMS_APP_NAME=scipaper
|
||||||
REACT_APP_OPENID_PROVIDER_URL=http://auth.techpal.ru/auth/realms/master/protocol/openid-connect/auth?client_id=techpal&response_type=code
|
REACT_APP_OPENID_PROVIDER_URL=http://auth.techpal.ru/auth/realms/master/protocol/openid-connect/auth?client_id=techpal&response_type=code
|
||||||
REACT_APP_INTEGRATOR_URL=http://integrator.techpal.ru
|
REACT_APP_INTEGRATOR_URL=http://scipaper.ru
|
||||||
REACT_APP_INTEGRATOR_API_VERSION=/api/1
|
REACT_APP_INTEGRATOR_API_VERSION=/v1
|
||||||
REACT_APP_GRAPHQL_URL=/graphql
|
REACT_APP_GRAPHQL_URL=/graphql
|
||||||
|
12
.env.production
Normal file → Executable file
@ -1,6 +1,6 @@
|
|||||||
REACT_APP_CMS_BASE_URL=EXT_CMS_BASE_URL
|
REACT_APP_CMS_BASE_URL=http://scipaper.ru
|
||||||
REACT_APP_CMS_APP_NAME=EXT_CMS_APP_NAME
|
REACT_APP_CMS_APP_NAME=scipaper
|
||||||
REACT_APP_OPENID_PROVIDER_URL=EXT_OPENID_PROVIDER_URL
|
REACT_APP_OPENID_PROVIDER_URL=http://auth.techpal.ru/auth/realms/master/protocol/openid-connect/auth?client_id=techpal&response_type=code
|
||||||
REACT_APP_INTEGRATOR_URL=EXT_INTEGRATOR_URL
|
REACT_APP_INTEGRATOR_URL=http://scipaper.ru
|
||||||
REACT_APP_INTEGRATOR_API_VERSION=EXT_INTEGRATOR_API_VERSION
|
REACT_APP_INTEGRATOR_API_VERSION=/v1
|
||||||
REACT_APP_GRAPHQL_URL=EXT_GRAPHQL_URL
|
REACT_APP_GRAPHQL_URL=/graphql
|
||||||
|
0
.gitignore
vendored
Normal file → Executable file
0
.storybook/index.css
Normal file → Executable file
0
.storybook/main.js
Normal file → Executable file
0
.storybook/main.ts
Normal file → Executable file
0
.storybook/preview.js
Normal file → Executable file
0
.storybook/preview.ts
Normal file → Executable file
27
Dockerfile
Normal file → Executable file
@ -17,22 +17,25 @@ COPY . .
|
|||||||
RUN npm run build
|
RUN npm run build
|
||||||
|
|
||||||
# Bundle static assets with nginx
|
# Bundle static assets with nginx
|
||||||
FROM nginx:1.21.6 as production
|
FROM node:16-alpine as production
|
||||||
# Copy built assets from builder
|
# Copy built assets from builder
|
||||||
COPY --from=builder /app/build /usr/share/nginx/html
|
WORKDIR /app
|
||||||
# Add nginx.config
|
COPY --from=builder /app/build .
|
||||||
COPY nginx.conf /etc/nginx/conf.d/default.conf
|
|
||||||
# Expose ports
|
# Expose ports
|
||||||
EXPOSE 80
|
EXPOSE 3000
|
||||||
|
|
||||||
COPY entrypoint.sh .
|
|
||||||
COPY .env.production .
|
COPY .env.production .
|
||||||
|
|
||||||
ENV NODE_ENV production
|
ENV NODE_ENV production
|
||||||
|
ENV USER_NAME=node_user USER_UID=2000 GROUP_NAME=node_group GROUP_UID=2000
|
||||||
|
|
||||||
# Execute script
|
RUN npm i -g serve \
|
||||||
RUN ["chmod", "+x", "./entrypoint.sh"]
|
&& deluser --remove-home node \
|
||||||
ENTRYPOINT ["./entrypoint.sh"]
|
&& addgroup --g ${GROUP_UID} -S ${GROUP_NAME} \
|
||||||
|
&& adduser -D -S -s /sbin/nologin -u ${USER_UID} -G ${GROUP_NAME} ${USER_NAME}\
|
||||||
|
&& chown -R ${USER_NAME}:${GROUP_NAME} "/app/"
|
||||||
|
|
||||||
# Start serving
|
|
||||||
CMD ["nginx", "-g", "daemon off;"]
|
USER "${USER_NAME}"
|
||||||
|
CMD serve -s .
|
2
Makefile
Normal file → Executable file
@ -1,4 +1,4 @@
|
|||||||
PROJECT_NAME=freeland-frontend
|
PROJECT_NAME=scipaper-frontend
|
||||||
|
|
||||||
setup:
|
setup:
|
||||||
npm i
|
npm i
|
||||||
|
0
global.d.ts
vendored
Normal file → Executable file
0
nginx.conf
Normal file → Executable file
7563
package-lock.json
generated
17
package.json
Normal file → Executable file
@ -3,11 +3,17 @@
|
|||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@fortawesome/fontawesome-svg-core": "^6.2.0",
|
||||||
|
"@fortawesome/free-brands-svg-icons": "^6.2.0",
|
||||||
|
"@fortawesome/free-solid-svg-icons": "^6.2.0",
|
||||||
|
"@fortawesome/react-fontawesome": "^0.2.0",
|
||||||
"@headlessui/react": "^1.6.6",
|
"@headlessui/react": "^1.6.6",
|
||||||
"@reduxjs/toolkit": "^1.8.3",
|
"@reduxjs/toolkit": "^1.8.3",
|
||||||
"@types/node": "^16.11.47",
|
"@types/node": "^16.11.47",
|
||||||
"@types/react": "^18.0.15",
|
"@types/react": "^18.0.15",
|
||||||
|
"@types/react-copy-to-clipboard": "^5.0.4",
|
||||||
"@types/react-dom": "^18.0.6",
|
"@types/react-dom": "^18.0.6",
|
||||||
|
"@uiw/react-md-editor": "^3.18.1",
|
||||||
"axios": "^0.27.2",
|
"axios": "^0.27.2",
|
||||||
"classnames": "^2.3.1",
|
"classnames": "^2.3.1",
|
||||||
"formik": "^2.2.9",
|
"formik": "^2.2.9",
|
||||||
@ -19,14 +25,22 @@
|
|||||||
"jwt-decode": "^3.1.2",
|
"jwt-decode": "^3.1.2",
|
||||||
"lodash": "^4.17.21",
|
"lodash": "^4.17.21",
|
||||||
"react": "^18.2.0",
|
"react": "^18.2.0",
|
||||||
|
"react-copy-to-clipboard": "^5.1.0",
|
||||||
"react-dom": "^18.2.0",
|
"react-dom": "^18.2.0",
|
||||||
"react-hotkeys": "^2.0.0",
|
"react-hotkeys": "^2.0.0",
|
||||||
"react-i18next": "^11.18.3",
|
"react-i18next": "^11.18.3",
|
||||||
|
"react-loading-skeleton": "^3.1.0",
|
||||||
|
"react-lottie": "^1.2.3",
|
||||||
|
"react-markdown": "^8.0.3",
|
||||||
"react-redux": "^8.0.2",
|
"react-redux": "^8.0.2",
|
||||||
"react-router-dom": "^6.3.0",
|
"react-router-dom": "^6.3.0",
|
||||||
"react-scripts": "5.0.1",
|
"react-scripts": "5.0.1",
|
||||||
"react-scrollbars-custom": "^4.1.0",
|
"react-scrollbars-custom": "^4.1.0",
|
||||||
|
"react-syntax-highlighter": "^15.5.0",
|
||||||
|
"remark-code-blocks": "^2.0.1",
|
||||||
|
"remark-gfm": "^3.0.1",
|
||||||
"storybook-addon-pseudo-states": "^1.15.1",
|
"storybook-addon-pseudo-states": "^1.15.1",
|
||||||
|
"swiper": "^8.3.2",
|
||||||
"tailwindcss": "^3.1.7",
|
"tailwindcss": "^3.1.7",
|
||||||
"tsconfig-paths-webpack-plugin": "^4.0.0",
|
"tsconfig-paths-webpack-plugin": "^4.0.0",
|
||||||
"typescript": "^4.7.4",
|
"typescript": "^4.7.4",
|
||||||
@ -96,12 +110,15 @@
|
|||||||
"@testing-library/react": "^13.3.0",
|
"@testing-library/react": "^13.3.0",
|
||||||
"@testing-library/user-event": "^13.5.0",
|
"@testing-library/user-event": "^13.5.0",
|
||||||
"@types/jest": "^27.5.2",
|
"@types/jest": "^27.5.2",
|
||||||
|
"@types/react-lottie": "^1.2.6",
|
||||||
|
"@types/react-syntax-highlighter": "^15.5.5",
|
||||||
"autoprefixer": "^10.4.8",
|
"autoprefixer": "^10.4.8",
|
||||||
"babel-plugin-named-exports-order": "^0.0.2",
|
"babel-plugin-named-exports-order": "^0.0.2",
|
||||||
"jest": "^28.1.3",
|
"jest": "^28.1.3",
|
||||||
"postcss": "^8.4.14",
|
"postcss": "^8.4.14",
|
||||||
"prop-types": "^15.8.1",
|
"prop-types": "^15.8.1",
|
||||||
"react-test-renderer": "^18.2.0",
|
"react-test-renderer": "^18.2.0",
|
||||||
|
"tailwind-scrollbar": "^2.0.1",
|
||||||
"webpack": "^5.74.0"
|
"webpack": "^5.74.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
0
postcss.config.js
Normal file → Executable file
0
public/favicon.svg
Normal file → Executable file
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
2
public/index.html
Normal file → Executable file
@ -24,7 +24,7 @@
|
|||||||
work correctly both with client-side routing and a non-root public URL.
|
work correctly both with client-side routing and a non-root public URL.
|
||||||
Learn how to configure a non-root public URL by running `npm run build`.
|
Learn how to configure a non-root public URL by running `npm run build`.
|
||||||
-->
|
-->
|
||||||
<title>Freeland</title>
|
<title>Scipaper</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<noscript>You need to enable JavaScript to run this app.</noscript>
|
<noscript>You need to enable JavaScript to run this app.</noscript>
|
||||||
|
121
public/locales/en/translation.json
Normal file → Executable file
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"serv": {
|
"serv": {
|
||||||
"goHome": "Home",
|
"goHome": "Home page",
|
||||||
"noSuchPath": "We don't have this page"
|
"noSuchPath": "We don't have such a page"
|
||||||
},
|
},
|
||||||
"sidemenu": {
|
"sidemenu": {
|
||||||
"dashboard": "Dashboard",
|
"dashboard": "Dashboard",
|
||||||
@ -19,45 +19,130 @@
|
|||||||
"hellousr": "Hello, {{username}}",
|
"hellousr": "Hello, {{username}}",
|
||||||
"edit": "Edit",
|
"edit": "Edit",
|
||||||
"language": "Language",
|
"language": "Language",
|
||||||
"selectLanguage": "Select language",
|
"selectLanguage": "Select a language",
|
||||||
"save": "Save",
|
"save": "Save",
|
||||||
"cancel": "Cancel",
|
"cancel": "Cancel",
|
||||||
"account": {
|
"account": {
|
||||||
"info": "Personal information",
|
"info": "Personal Information",
|
||||||
"mail": "Mail",
|
"mail": "Mail",
|
||||||
"connect": "Add account",
|
"connect": "Add Account",
|
||||||
"connectedAccounts_one": "Connected account",
|
"connectedAccounts_one": "Linked Account",
|
||||||
"connectedAccounts_other": "Connected accounts",
|
"connectedAccounts_other": "Linked Accounts",
|
||||||
"settings": "Account settings"
|
"settings": "Account Settings"
|
||||||
},
|
},
|
||||||
"security": {
|
"security": {
|
||||||
"password": {
|
"password": {
|
||||||
"caption": "Password",
|
"caption": "Password",
|
||||||
"twoFactor": "Two factor authentication (2FA)",
|
"twoFactor": "Two-factor authentication (2FA)",
|
||||||
"description": "Keep your account secure by enabling 2FA via SMS or using a temporary one-time passcode (TOTP) from an authenticator app."
|
"description": "Protect your account by enabling 2FA via SMS or using a temporary one-time password (OTP) from the authentication app."
|
||||||
},
|
},
|
||||||
"activity": {
|
"activity": {
|
||||||
"caption": "Device activity"
|
"caption": "Device activity"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"label": "Search for something.."
|
"label": "We will find something.."
|
||||||
},
|
},
|
||||||
"subscriptions": {
|
"subscriptions": {
|
||||||
"subscribed": "Service have been connected"
|
"subscribed": "The service is attached to the account"
|
||||||
},
|
},
|
||||||
"viewHistory": "View history",
|
"viewHistory": "View history",
|
||||||
"logOutEverywhere": "log out from all devices",
|
"logOutEverywhere": "Log out from all devices",
|
||||||
"back": "Back",
|
"back": "Back",
|
||||||
"logOut": "Log out",
|
"logOut": "Exit",
|
||||||
"failures": {
|
"failures": {
|
||||||
"subscriptions": {
|
"subscriptions": {
|
||||||
"failure": "Failed to connect service",
|
"failure": "Failed to attach the service to your account",
|
||||||
"exists": "Service have already been connected",
|
"exists": "The service was already attached to your account earlier",
|
||||||
"confirmation": "Invalid confirmation information provided"
|
"confirmation": "Invalid password"
|
||||||
},
|
},
|
||||||
"services": {
|
"services": {
|
||||||
"fork": "Failed to authenticate in service"
|
"fork": "Failed to perform authorization in the service"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"articlePage": {
|
||||||
|
"abstract": "Abstract",
|
||||||
|
"keywords": "Keywords",
|
||||||
|
"interactionButtons":{
|
||||||
|
"abstract": "Abstract",
|
||||||
|
"readFile": "Read File",
|
||||||
|
"download" : "Download",
|
||||||
|
"share" : "Share",
|
||||||
|
"cite" : "Cite",
|
||||||
|
"copied": "Copied"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
"navbar": {
|
||||||
|
"createNew": "Create New",
|
||||||
|
"about": {
|
||||||
|
"navTitle": "About",
|
||||||
|
"aboutProject": "About Scipaper",
|
||||||
|
"contacts": "Contacts",
|
||||||
|
"help": "Help"
|
||||||
|
},
|
||||||
|
"library": {
|
||||||
|
"navTitle": "My library",
|
||||||
|
"publications": "Publications",
|
||||||
|
"favorites": "Favorites",
|
||||||
|
"collections": "Collections",
|
||||||
|
"recentViewed": "History"
|
||||||
|
},
|
||||||
|
"auth": {
|
||||||
|
"signIn": "Sign In",
|
||||||
|
"signUp": "Sign Up"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"footer": {
|
||||||
|
"accountSettings": "Account Settings",
|
||||||
|
"about": "About Scipaper",
|
||||||
|
"help": "Help",
|
||||||
|
"contactUs": "Contacts",
|
||||||
|
"allRightsReserved": "All rights reserved",
|
||||||
|
"termsOfUse": "Terms of Use",
|
||||||
|
"privacyPolicy": "Privacy Policy",
|
||||||
|
"coockiesPolicy": "coockies Usage Policy",
|
||||||
|
"supportedBy": "Created"
|
||||||
|
},
|
||||||
|
"mainPage": {
|
||||||
|
"title": "Scientific Library with Free Access",
|
||||||
|
"search": "Search",
|
||||||
|
"article_one": "Articles",
|
||||||
|
"article_few": "Articles",
|
||||||
|
"article_many": "Articles",
|
||||||
|
"advancedSearch": "Advanced search",
|
||||||
|
"featuredArticles": {
|
||||||
|
"title": "Featured articles",
|
||||||
|
"descriptionPart1": "Select the category of science you are interested in",
|
||||||
|
"descriptionPart2": "Scientific category",
|
||||||
|
"categories": {
|
||||||
|
"Medical": "Medical",
|
||||||
|
"TechnicsAndTechlonogies": "Technics and Technology",
|
||||||
|
"Fundamental": "Fundamental",
|
||||||
|
"Humanitarian": "Humanitarian",
|
||||||
|
"Agricultural": "Agricultural",
|
||||||
|
"Social": "Social"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"featuredAuthors": "Featured authors",
|
||||||
|
"more": "See More ",
|
||||||
|
"showAll": "Show all"
|
||||||
|
},
|
||||||
|
"searchResults": {
|
||||||
|
"title": "Search results",
|
||||||
|
"totalResults":"Total results",
|
||||||
|
"nothingFound": "Nothing found"
|
||||||
|
},
|
||||||
|
"filters": {
|
||||||
|
"authors":"Authors",
|
||||||
|
"publicationsType": "Publications Type",
|
||||||
|
"content":"Content",
|
||||||
|
"publisher":"Publisher",
|
||||||
|
"publicationTopic":"Publication Topic",
|
||||||
|
"appliedFitlers":"Applied Fitlers",
|
||||||
|
"clearAll":"Clear All",
|
||||||
|
"enterAuthorsName":"Enter Author Name",
|
||||||
|
"showAll":"Show All"
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
82
public/locales/ru/translation.json
Normal file → Executable file
@ -59,5 +59,87 @@
|
|||||||
"services": {
|
"services": {
|
||||||
"fork": "Не удалось выполнить авторизацию в сервисе"
|
"fork": "Не удалось выполнить авторизацию в сервисе"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"articlePage": {
|
||||||
|
"abstract": "Введение",
|
||||||
|
"keywords": "Ключевые слова",
|
||||||
|
"interactionButtons":{
|
||||||
|
"abstract": "Развернуть",
|
||||||
|
"readFile": "Читать",
|
||||||
|
"download" : "Скачать",
|
||||||
|
"share" : "Поделиться",
|
||||||
|
"cite" : "Цитировать",
|
||||||
|
"copied": "Скопировано"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"navbar": {
|
||||||
|
"createNew": "Создать статью",
|
||||||
|
"about": {
|
||||||
|
"navTitle": "О проекте",
|
||||||
|
"aboutProject": "О Scipaper",
|
||||||
|
"contacts": "Контакты",
|
||||||
|
"help": "Помощь"
|
||||||
|
},
|
||||||
|
"library": {
|
||||||
|
"navTitle": "Моя библиотека",
|
||||||
|
"publications": "Публикации",
|
||||||
|
"favorites": "Избранное",
|
||||||
|
"collections": "Коллекции",
|
||||||
|
"recentViewed": "История"
|
||||||
|
},
|
||||||
|
"auth": {
|
||||||
|
"signIn": "Вход",
|
||||||
|
"signUp": "Регистрация"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"footer": {
|
||||||
|
"accountSettings": "Настройки аккаунта",
|
||||||
|
"about": "О scipaper",
|
||||||
|
"help": "Помощь",
|
||||||
|
"contactUs": "Контакты",
|
||||||
|
"allRightsReserved": "Все права защищены",
|
||||||
|
"termsOfUse": "Правила использования",
|
||||||
|
"privacyPolicy": "Политика конфиденциальности",
|
||||||
|
"coockiesPolicy": "Политика использования coockies",
|
||||||
|
"supportedBy": "Создано"
|
||||||
|
},
|
||||||
|
"mainPage": {
|
||||||
|
"title": "Библиотека научных статей с бесплатным доступом",
|
||||||
|
"search": "Поиск",
|
||||||
|
"article_one": "статьи",
|
||||||
|
"article_few": "статей",
|
||||||
|
"article_many": "статей",
|
||||||
|
"advancedSearch": "Расширенный поиск",
|
||||||
|
"featuredArticles": {
|
||||||
|
"title": "Популярные статьи",
|
||||||
|
"descriptionPart1": "Выберете интересующую вас ",
|
||||||
|
"descriptionPart2": "научную категорию",
|
||||||
|
"categories": {
|
||||||
|
"Medical": "Медицина",
|
||||||
|
"TechnicsAndTechlonogies": "Техника и технологии",
|
||||||
|
"Fundamental": "Естественые",
|
||||||
|
"Humanitarian": "Гуманитарные",
|
||||||
|
"Agricultural": "Аuрокультурa",
|
||||||
|
"Social": "Социальные"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"featuredAuthors": "Популярные авторы",
|
||||||
|
"more": "Больше",
|
||||||
|
"showAll": "Показать все"
|
||||||
|
},
|
||||||
|
"searchResults": {
|
||||||
|
"title": "Результаты поиска",
|
||||||
|
"totalResults":"Всего найдено",
|
||||||
|
"nothingFound": "Ничего не найдено"
|
||||||
|
},
|
||||||
|
"filters": {
|
||||||
|
"authors":"Авторы",
|
||||||
|
"publicationsType": "Публикации",
|
||||||
|
"publisher":"Издатель",
|
||||||
|
"publicationTopic":"Тема публикации",
|
||||||
|
"appliedFitlers":"Фильтры",
|
||||||
|
"clearAll":"Очистить всё",
|
||||||
|
"enterAuthorsName":"Введите имя автора",
|
||||||
|
"showAll":"Показать все"
|
||||||
}
|
}
|
||||||
}
|
}
|
0
public/logo192.png
Normal file → Executable file
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 5.2 KiB |
0
public/logo512.png
Normal file → Executable file
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 9.4 KiB |
0
public/manifest.json
Normal file → Executable file
0
public/robots.txt
Normal file → Executable file
0
src/.storybook/main.js
Normal file → Executable file
0
src/.storybook/preview.js
Normal file → Executable file
0
src/App.css
Normal file → Executable file
0
src/App.test.tsx
Normal file → Executable file
4
src/App.tsx
Normal file → Executable file
@ -2,6 +2,8 @@
|
|||||||
/* Libraries */
|
/* Libraries */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
import React from "react";
|
import React from "react";
|
||||||
|
import MainPage from "pages/MainPage";
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
/* Application root component */
|
/* Application root component */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
@ -10,7 +12,7 @@ import React from "react";
|
|||||||
* @return {JSX.Element}
|
* @return {JSX.Element}
|
||||||
*/
|
*/
|
||||||
function App() {
|
function App() {
|
||||||
return <div>Hello world!</div>;
|
return <MainPage />;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default App;
|
export default App;
|
||||||
|
24
src/article/controller/articleViewModel.ts
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
import type { ArticleStore } from "../domain/articleStore";
|
||||||
|
import { getArticleUseCase } from "../useCases/getArticleUseCase";
|
||||||
|
import { useCallback, useEffect } from "react";
|
||||||
|
|
||||||
|
function useArticleViewModel(store: ArticleStore) {
|
||||||
|
const _getArticle = useCallback(
|
||||||
|
(id: string) => getArticleUseCase(store.getArticle, store.setArticle, id),
|
||||||
|
[store.getArticle, store.setArticle]
|
||||||
|
);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (store.article != undefined) {
|
||||||
|
_getArticle(store.article.id);
|
||||||
|
}
|
||||||
|
}, [store.article?.id]);
|
||||||
|
|
||||||
|
return {
|
||||||
|
article: store.article,
|
||||||
|
shouldShowLoading: typeof store.article === "undefined" || store.isLoading,
|
||||||
|
hasError: store.hasError,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export { useArticleViewModel };
|
36
src/article/data/articleAPIService.ts
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
import axios from "axios";
|
||||||
|
import { Article } from "../domain/articleEntity";
|
||||||
|
import { create } from "../domain/articleModel";
|
||||||
|
import { FetchArticleByIdDTO } from "./dto/fetch_article_by_id_dto";
|
||||||
|
import Failure from "core/failure";
|
||||||
|
import { integratorApiClient } from "core/httpClient";
|
||||||
|
|
||||||
|
const articleEndpoint = "/papers/"
|
||||||
|
|
||||||
|
async function getArticle(id: string): Promise<Article> {
|
||||||
|
try {
|
||||||
|
const response = await integratorApiClient.get<FetchArticleByIdDTO>(
|
||||||
|
// `https://run.mocky.io/v3/62cd4581-d864-4d46-b1d6-02b45b5d1994/${id}`
|
||||||
|
// `https://jsonplaceholder.typicode.com/posts/${id}`
|
||||||
|
// `https://run.mocky.io/v3/066be3d8-0568-439a-8b20-062deed49a97`
|
||||||
|
articleEndpoint + id
|
||||||
|
);
|
||||||
|
const dto = response.data;
|
||||||
|
return create({
|
||||||
|
id: dto.id,
|
||||||
|
topic: [dto.topic],
|
||||||
|
title: dto.title,
|
||||||
|
authors: dto.authors,
|
||||||
|
tags: dto.tags,
|
||||||
|
summary: dto.summary,
|
||||||
|
content: dto.content,
|
||||||
|
});
|
||||||
|
} catch (reason) {
|
||||||
|
if (axios.isAxiosError(reason)) {
|
||||||
|
throw Failure.fromReason(reason, "failures.services.load");
|
||||||
|
}
|
||||||
|
throw reason;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export { getArticle };
|
4
src/article/data/articleActionTypes.ts
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
export const SET_ARTICLE = "SET_ARTICLE";
|
||||||
|
export const GET_ARTICLE = "GET_ARTICLE";
|
||||||
|
export const GET_ARTICLE_SUCCESS = "GET_ARTICLE.success";
|
||||||
|
export const GET_ARTICLE_FAILURE = "GET_ARTICLE.failure";
|
23
src/article/data/articleActions.ts
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import type { Article } from "../domain/articleEntity";
|
||||||
|
import { getArticle as getArticleAPI } from "./articleAPIService";
|
||||||
|
import * as actionTypes from "./articleActionTypes";
|
||||||
|
import { dispatchStatus } from "../../store/index";
|
||||||
|
|
||||||
|
const setArticleAction = (article: Article) => (dispatch: any) =>
|
||||||
|
dispatch({ type: actionTypes.SET_ARTICLE, article });
|
||||||
|
|
||||||
|
const getArticleAction = (id: string) => (dispatch: any) => {
|
||||||
|
dispatch({ type: actionTypes.GET_ARTICLE });
|
||||||
|
|
||||||
|
return getArticleAPI(id)
|
||||||
|
.then((article) => {
|
||||||
|
dispatchStatus(actionTypes.GET_ARTICLE, ".success", article)(dispatch);
|
||||||
|
return article;
|
||||||
|
})
|
||||||
|
.catch((reason) => {
|
||||||
|
dispatchStatus(actionTypes.GET_ARTICLE, ".failure", reason)(dispatch);
|
||||||
|
return reason;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
export { setArticleAction, getArticleAction };
|
39
src/article/data/articleCommonStateStore.ts
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
import React, { useCallback, useState } from "react";
|
||||||
|
import { useDispatch } from "react-redux";
|
||||||
|
import { ArticleStore } from "../domain/articleStore";
|
||||||
|
import type { Article } from "../domain/articleEntity";
|
||||||
|
import { getArticle as getArticleAPI } from "./articleAPIService";
|
||||||
|
|
||||||
|
const useArticleCommonStore = (): ArticleStore => {
|
||||||
|
const [isLoading, setLoading] = useState<boolean>(false);
|
||||||
|
const [hasError, setError] = useState<boolean>(false);
|
||||||
|
const [article, setArticleState] = useState<Article | undefined>();
|
||||||
|
|
||||||
|
const dispatch = useDispatch();
|
||||||
|
|
||||||
|
const getArticle = useCallback(
|
||||||
|
async (id: string) => {
|
||||||
|
setLoading(true);
|
||||||
|
try {
|
||||||
|
const article = await getArticleAPI(id);
|
||||||
|
setArticleState(article);
|
||||||
|
setLoading(false);
|
||||||
|
return article;
|
||||||
|
} catch (error) {
|
||||||
|
setError(true);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[dispatch]
|
||||||
|
);
|
||||||
|
|
||||||
|
return {
|
||||||
|
article: article,
|
||||||
|
isLoading,
|
||||||
|
hasError,
|
||||||
|
setArticle: setArticleState,
|
||||||
|
getArticle,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export { useArticleCommonStore };
|
32
src/article/data/articleReducer.ts
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
import { AnyAction } from "@reduxjs/toolkit";
|
||||||
|
import type { ArticleStore } from "../domain/articleStore";
|
||||||
|
import * as actionTypes from "./articleActionTypes";
|
||||||
|
|
||||||
|
type ArticleStoreState = Omit<ArticleStore, "getArticle" | "setArticle">;
|
||||||
|
|
||||||
|
const INITIAL_STATE: ArticleStoreState = {
|
||||||
|
article: undefined,
|
||||||
|
isLoading: false,
|
||||||
|
hasError: false,
|
||||||
|
};
|
||||||
|
|
||||||
|
const articleReducer = (
|
||||||
|
state: ArticleStoreState = INITIAL_STATE,
|
||||||
|
action: AnyAction
|
||||||
|
): ArticleStoreState => {
|
||||||
|
switch (action.type) {
|
||||||
|
case actionTypes.SET_ARTICLE:
|
||||||
|
return { ...state, article: action.article };
|
||||||
|
case actionTypes.GET_ARTICLE:
|
||||||
|
return { ...state, isLoading: true };
|
||||||
|
case actionTypes.GET_ARTICLE_SUCCESS:
|
||||||
|
return { ...state, isLoading: false, article: action.payload };
|
||||||
|
case actionTypes.GET_ARTICLE_FAILURE:
|
||||||
|
return { ...state, hasError: true, isLoading: false };
|
||||||
|
default:
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export { articleReducer };
|
||||||
|
export type { ArticleStoreState };
|
35
src/article/data/articleStoreImplementation.ts
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
import React, { useCallback, useState } from "react";
|
||||||
|
import { useDispatch, useSelector } from "react-redux";
|
||||||
|
import { ArticleStore } from "../domain/articleStore";
|
||||||
|
import type { Article } from "../domain/articleEntity";
|
||||||
|
import type { ArticleStoreState } from "../data/articleReducer";
|
||||||
|
import { getArticleAction, setArticleAction } from "./articleActions";
|
||||||
|
import { RootState, useAppSelector } from "store";
|
||||||
|
|
||||||
|
const articleSelector = (state: RootState): ArticleStoreState => state.article;
|
||||||
|
|
||||||
|
const useArticleStore = (): ArticleStore => {
|
||||||
|
const { isLoading, article, hasError } = useAppSelector(articleSelector);
|
||||||
|
|
||||||
|
const dispatch = useDispatch();
|
||||||
|
|
||||||
|
const setArticle = useCallback(
|
||||||
|
(article: Article) => setArticleAction(article)(dispatch),
|
||||||
|
[dispatch]
|
||||||
|
);
|
||||||
|
|
||||||
|
const getArticle = useCallback(
|
||||||
|
(id: string) => getArticleAction(id)(dispatch),
|
||||||
|
[dispatch]
|
||||||
|
);
|
||||||
|
|
||||||
|
return {
|
||||||
|
article: article,
|
||||||
|
isLoading,
|
||||||
|
hasError,
|
||||||
|
setArticle,
|
||||||
|
getArticle,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export { useArticleStore };
|
9
src/article/data/dto/fetch_article_by_id_dto.ts
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
export interface FetchArticleByIdDTO {
|
||||||
|
id: string;
|
||||||
|
topic: string;
|
||||||
|
title: string;
|
||||||
|
authors: string[];
|
||||||
|
tags: string[];
|
||||||
|
summary: string;
|
||||||
|
content: string;
|
||||||
|
}
|
9
src/article/domain/articleEntity.ts
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
export interface Article {
|
||||||
|
id: string;
|
||||||
|
title: string;
|
||||||
|
content: string;
|
||||||
|
topic?: string[];
|
||||||
|
authors?: string[];
|
||||||
|
tags?: string[];
|
||||||
|
summary?: string;
|
||||||
|
}
|
14
src/article/domain/articleModel.ts
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
import { CreateArticleParams } from "article/useCases/params/create_article_params";
|
||||||
|
import { Article } from "./articleEntity";
|
||||||
|
|
||||||
|
const create = (props: CreateArticleParams): Article => ({
|
||||||
|
id: props.id,
|
||||||
|
topic: props.topic,
|
||||||
|
title: props.title,
|
||||||
|
authors: props.authors,
|
||||||
|
tags: props.tags,
|
||||||
|
summary: props.summary,
|
||||||
|
content: props.content,
|
||||||
|
});
|
||||||
|
|
||||||
|
export { create };
|
13
src/article/domain/articleStore.ts
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
import { Article } from './articleEntity';
|
||||||
|
interface ArticleStore {
|
||||||
|
// State
|
||||||
|
article: Article | undefined;
|
||||||
|
isLoading: boolean;
|
||||||
|
hasError: boolean;
|
||||||
|
|
||||||
|
// Actions
|
||||||
|
setArticle(article?: Article): void;
|
||||||
|
getArticle(identifier: string): Promise<Article | null>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export type { ArticleStore };
|
16
src/article/useCases/getArticleUseCase.ts
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import { Article } from "article/domain/articleEntity";
|
||||||
|
import type { ArticleStore } from "../domain/articleStore";
|
||||||
|
|
||||||
|
const getArticleUseCase = async (
|
||||||
|
getArticle: ArticleStore["getArticle"],
|
||||||
|
setArticle: ArticleStore["setArticle"],
|
||||||
|
id: Article["id"]
|
||||||
|
): Promise<Article | null> => {
|
||||||
|
const article = await getArticle(id);
|
||||||
|
if (article) {
|
||||||
|
await setArticle(article);
|
||||||
|
}
|
||||||
|
return article;
|
||||||
|
};
|
||||||
|
|
||||||
|
export { getArticleUseCase };
|
9
src/article/useCases/params/create_article_params.ts
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
export interface CreateArticleParams {
|
||||||
|
id: string;
|
||||||
|
topic: string[];
|
||||||
|
title: string;
|
||||||
|
authors: string[];
|
||||||
|
tags: string[];
|
||||||
|
summary: string;
|
||||||
|
content: string;
|
||||||
|
}
|
0
src/assets/fonts/Inter-Black.ttf
Normal file → Executable file
0
src/assets/fonts/Inter-Bold.ttf
Normal file → Executable file
0
src/assets/fonts/Inter-ExtraBold.ttf
Normal file → Executable file
0
src/assets/fonts/Inter-ExtraLight.ttf
Normal file → Executable file
0
src/assets/fonts/Inter-Light.ttf
Normal file → Executable file
0
src/assets/fonts/Inter-Medium.ttf
Normal file → Executable file
0
src/assets/fonts/Inter-Regular.ttf
Normal file → Executable file
0
src/assets/fonts/Inter-SemiBold.ttf
Normal file → Executable file
0
src/assets/fonts/Inter-Thin.ttf
Normal file → Executable file
0
src/assets/fonts/Poppins-Bold.eot
Normal file → Executable file
0
src/assets/fonts/Poppins-Bold.ttf
Normal file → Executable file
0
src/assets/fonts/Poppins-Bold.woff2
Normal file → Executable file
0
src/assets/fonts/Poppins-Medium.eot
Normal file → Executable file
0
src/assets/fonts/Poppins-Medium.ttf
Normal file → Executable file
0
src/assets/fonts/Poppins-Medium.woff2
Normal file → Executable file
0
src/assets/fonts/Poppins-Regular.eot
Normal file → Executable file
0
src/assets/fonts/Poppins-Regular.ttf
Normal file → Executable file
0
src/assets/fonts/Poppins-Regular.woff2
Normal file → Executable file
0
src/assets/fonts/Poppins-Thin.eot
Normal file → Executable file
0
src/assets/fonts/Poppins-Thin.ttf
Normal file → Executable file
0
src/assets/fonts/Poppins-Thin.woff2
Normal file → Executable file
1
src/assets/lotties/notFoundAnimation.json
Normal file
0
src/assets/svg/agricultural.svg
Normal file → Executable file
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 KiB |
0
src/assets/svg/arrow-big-right.svg
Normal file → Executable file
Before Width: | Height: | Size: 510 B After Width: | Height: | Size: 513 B |
0
src/assets/svg/arrow-down.svg
Normal file → Executable file
Before Width: | Height: | Size: 341 B After Width: | Height: | Size: 345 B |
0
src/assets/svg/arrow-left.svg
Normal file → Executable file
Before Width: | Height: | Size: 341 B After Width: | Height: | Size: 345 B |
0
src/assets/svg/arrow-right.svg
Normal file → Executable file
Before Width: | Height: | Size: 307 B After Width: | Height: | Size: 311 B |
0
src/assets/svg/arrow-up.svg
Normal file → Executable file
Before Width: | Height: | Size: 311 B After Width: | Height: | Size: 315 B |
7
src/assets/svg/background.svg
Executable file
@ -0,0 +1,7 @@
|
|||||||
|
<svg width="1187" height="1234" viewBox="0 0 1187 1234" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M408.998 745.256C206.829 467.159 -0.745132 678.488 53.4493 872.858C189.728 1182.79 541.828 1319.16 839.898 1177.41C942.643 1128.57 1029.84 1050.24 1091.25 951.643C934.96 1103.83 651.196 1078.4 408.998 745.208V745.256Z" fill="#F0F0F0"/>
|
||||||
|
<path d="M589.732 553.768C311.677 115.242 0.000483082 348.859 0.000483082 616.83C-0.108684 705.549 18.2856 793.237 53.9153 873.85C16.9159 692.296 217.547 552.363 404.339 812.896C675.684 1191.27 941.763 1124.69 1090.72 952.538C1138.53 876.188 1169.42 789.736 1181.14 699.443V700.63C1117.18 906.92 834.959 940.474 589.732 553.768Z" fill="#F5F5F5"/>
|
||||||
|
<path d="M780.298 357.556C573.819 3.33809 311.98 35.3415 134.904 225.06C47.4877 335.363 -0.21692 473.901 0.000741558 616.829C18.6403 357.604 320.112 177.116 593.041 616.829C835.635 1008.16 1137.87 906.216 1180.86 701.744V699.781C1184.64 671.939 1186.24 643.826 1185.66 615.715V587.685C1080.6 665.864 942.439 635.678 780.252 357.532L780.298 357.556Z" fill="#FAFAFA"/>
|
||||||
|
<path d="M781.72 420.618C970.818 736.727 1133.84 655.859 1186.06 588.242C1183.96 540.989 1176.61 494.146 1164.16 448.648C1076.01 450.611 1055.46 435.275 968.721 297.983C836.17 86.7264 669.183 -55.8716 377.451 42.2463C282.888 80.7758 199.359 143.787 134.788 225.303C335.256 33.4762 581.228 85.5393 781.72 420.618Z" fill="white"/>
|
||||||
|
<path d="M955.787 325.116C1042.25 462.675 1094.88 469.676 1164.15 448.672C1074.33 120.595 745.743 -69.6327 430.245 23.761C412.352 29.0424 394.753 35.204 377.449 42.2459C638.053 -43.2499 822.887 113.86 955.787 325.116Z" fill="white"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.6 KiB |
0
src/assets/svg/bell-notification.svg
Normal file → Executable file
Before Width: | Height: | Size: 730 B After Width: | Height: | Size: 735 B |
0
src/assets/svg/bell.svg
Normal file → Executable file
Before Width: | Height: | Size: 633 B After Width: | Height: | Size: 637 B |
0
src/assets/svg/bookmark-filled.svg
Normal file → Executable file
Before Width: | Height: | Size: 344 B After Width: | Height: | Size: 347 B |
0
src/assets/svg/bookmark-outlined.svg
Normal file → Executable file
Before Width: | Height: | Size: 356 B After Width: | Height: | Size: 359 B |
0
src/assets/svg/caret-down.svg
Normal file → Executable file
Before Width: | Height: | Size: 303 B After Width: | Height: | Size: 306 B |
0
src/assets/svg/caret-left.svg
Normal file → Executable file
Before Width: | Height: | Size: 315 B After Width: | Height: | Size: 318 B |
0
src/assets/svg/caret-right.svg
Normal file → Executable file
Before Width: | Height: | Size: 314 B After Width: | Height: | Size: 317 B |
0
src/assets/svg/caret-up.svg
Normal file → Executable file
Before Width: | Height: | Size: 309 B After Width: | Height: | Size: 312 B |
0
src/assets/svg/chart.svg
Normal file → Executable file
Before Width: | Height: | Size: 339 B After Width: | Height: | Size: 345 B |
0
src/assets/svg/chevrones-left.svg
Normal file → Executable file
Before Width: | Height: | Size: 639 B After Width: | Height: | Size: 645 B |
0
src/assets/svg/chevrones-right.svg
Normal file → Executable file
Before Width: | Height: | Size: 588 B After Width: | Height: | Size: 594 B |
0
src/assets/svg/circle.svg
Normal file → Executable file
Before Width: | Height: | Size: 145 B After Width: | Height: | Size: 148 B |
0
src/assets/svg/cite.svg
Normal file → Executable file
Before Width: | Height: | Size: 906 B After Width: | Height: | Size: 915 B |
0
src/assets/svg/copy.svg
Normal file → Executable file
Before Width: | Height: | Size: 426 B After Width: | Height: | Size: 430 B |
0
src/assets/svg/delete.svg
Normal file → Executable file
Before Width: | Height: | Size: 537 B After Width: | Height: | Size: 542 B |
0
src/assets/svg/download.svg
Normal file → Executable file
Before Width: | Height: | Size: 485 B After Width: | Height: | Size: 490 B |
0
src/assets/svg/duplicate.svg
Normal file → Executable file
Before Width: | Height: | Size: 639 B After Width: | Height: | Size: 645 B |
0
src/assets/svg/edit1.svg
Normal file → Executable file
Before Width: | Height: | Size: 575 B After Width: | Height: | Size: 578 B |
0
src/assets/svg/edit2.svg
Normal file → Executable file
Before Width: | Height: | Size: 721 B After Width: | Height: | Size: 725 B |
0
src/assets/svg/error.svg
Normal file → Executable file
Before Width: | Height: | Size: 480 B After Width: | Height: | Size: 485 B |
0
src/assets/svg/eye.svg
Normal file → Executable file
Before Width: | Height: | Size: 441 B After Width: | Height: | Size: 445 B |
0
src/assets/svg/facebook.svg
Normal file → Executable file
Before Width: | Height: | Size: 648 B After Width: | Height: | Size: 651 B |
0
src/assets/svg/favorite-filled.svg
Normal file → Executable file
Before Width: | Height: | Size: 256 B After Width: | Height: | Size: 259 B |
0
src/assets/svg/favorite-outlined.svg
Normal file → Executable file
Before Width: | Height: | Size: 282 B After Width: | Height: | Size: 285 B |
0
src/assets/svg/file.svg
Normal file → Executable file
Before Width: | Height: | Size: 486 B After Width: | Height: | Size: 491 B |
0
src/assets/svg/filetext.svg
Normal file → Executable file
Before Width: | Height: | Size: 632 B After Width: | Height: | Size: 639 B |