Compare commits
223 Commits
fix/headin
...
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 | ||
![]() |
af62f49b27 | ||
![]() |
3511e6134b | ||
![]() |
a080bc4361 | ||
![]() |
a2f80ad94f | ||
![]() |
321bb6cc9b | ||
![]() |
d5e5fe995b | ||
![]() |
4c8cb61f77 | ||
![]() |
e151986782 | ||
![]() |
d5d5ca196a | ||
![]() |
6a255a2730 | ||
![]() |
bd3015dcf0 | ||
![]() |
28854c35b1 | ||
![]() |
040fecbcbf | ||
![]() |
3b2c3c5e9c | ||
![]() |
0c34803cfb | ||
![]() |
c319c8298b | ||
![]() |
5e3b000bd6 | ||
![]() |
b076b8ef69 | ||
![]() |
d448ac0110 | ||
![]() |
bc9fc9495d | ||
![]() |
faed5dd8dc | ||
![]() |
30f0e02a4d | ||
![]() |
cd4f5f55ca | ||
![]() |
159913fe97 | ||
![]() |
27a769277e | ||
![]() |
e0ff8095d0 | ||
![]() |
ebbb66e48a | ||
![]() |
84564a5158 | ||
![]() |
e87a920d99 | ||
![]() |
0fa8033830 | ||
![]() |
4caaa13752 | ||
![]() |
fa308f11d1 | ||
![]() |
47c4f2c113 | ||
![]() |
9376f9db09 | ||
![]() |
d53d32c5fa | ||
![]() |
1aa8f104bd | ||
![]() |
896ea45d23 | ||
![]() |
f42b505136 | ||
![]() |
118b2a8fb1 | ||
![]() |
cc36def1b5 | ||
![]() |
f8c1141e8c | ||
![]() |
87cb915f4a | ||
![]() |
b557d05718 | ||
![]() |
4247766746 | ||
![]() |
dd231a1903 | ||
![]() |
29c5ec0f3e | ||
![]() |
3421670619 | ||
![]() |
f7ce6f0a07 | ||
![]() |
d2976eb824 | ||
![]() |
8d2036207e | ||
![]() |
adf23f3b8f | ||
![]() |
c7af2deb9c | ||
![]() |
b6ba21be7d | ||
![]() |
4c44a1ba2d | ||
![]() |
fba6faecd2 | ||
![]() |
4b9ce789f7 | ||
![]() |
4cd741bbf2 | ||
![]() |
fdbc5bff53 | ||
![]() |
79f89fac3f | ||
![]() |
44de4f1195 | ||
![]() |
dec8bce3e3 | ||
![]() |
a314782acb | ||
![]() |
79f015c5b0 | ||
![]() |
d38f76c38f | ||
![]() |
2dcdfda4bf | ||
![]() |
f3b757937b | ||
![]() |
9abdabf66b | ||
![]() |
246aa98a73 | ||
![]() |
037fa4e92b | ||
![]() |
965892818e | ||
![]() |
4dd580c53f | ||
![]() |
41726d47ac | ||
![]() |
dafbb444be | ||
![]() |
977da92786 | ||
![]() |
3671d3d5bc | ||
![]() |
f1cbc0bae7 | ||
![]() |
f082b4ce47 | ||
![]() |
02d7781ca7 | ||
![]() |
2e5e57550c | ||
![]() |
bdb87d715a |
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_APP_NAME=techpal
|
||||
REACT_APP_CMS_BASE_URL=http://scipaper.ru
|
||||
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_INTEGRATOR_URL=http://integrator.techpal.ru
|
||||
REACT_APP_INTEGRATOR_API_VERSION=/api/1
|
||||
REACT_APP_INTEGRATOR_URL=http://scipaper.ru
|
||||
REACT_APP_INTEGRATOR_API_VERSION=/v1
|
||||
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_APP_NAME=EXT_CMS_APP_NAME
|
||||
REACT_APP_OPENID_PROVIDER_URL=EXT_OPENID_PROVIDER_URL
|
||||
REACT_APP_INTEGRATOR_URL=EXT_INTEGRATOR_URL
|
||||
REACT_APP_INTEGRATOR_API_VERSION=EXT_INTEGRATOR_API_VERSION
|
||||
REACT_APP_GRAPHQL_URL=EXT_GRAPHQL_URL
|
||||
REACT_APP_CMS_BASE_URL=http://scipaper.ru
|
||||
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_INTEGRATOR_URL=http://scipaper.ru
|
||||
REACT_APP_INTEGRATOR_API_VERSION=/v1
|
||||
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
|
||||
|
||||
# Bundle static assets with nginx
|
||||
FROM nginx:1.21.6 as production
|
||||
FROM node:16-alpine as production
|
||||
# Copy built assets from builder
|
||||
COPY --from=builder /app/build /usr/share/nginx/html
|
||||
# Add nginx.config
|
||||
COPY nginx.conf /etc/nginx/conf.d/default.conf
|
||||
# Expose ports
|
||||
EXPOSE 80
|
||||
WORKDIR /app
|
||||
COPY --from=builder /app/build .
|
||||
|
||||
# Expose ports
|
||||
EXPOSE 3000
|
||||
|
||||
COPY entrypoint.sh .
|
||||
COPY .env.production .
|
||||
|
||||
ENV NODE_ENV production
|
||||
ENV USER_NAME=node_user USER_UID=2000 GROUP_NAME=node_group GROUP_UID=2000
|
||||
|
||||
# Execute script
|
||||
RUN ["chmod", "+x", "./entrypoint.sh"]
|
||||
ENTRYPOINT ["./entrypoint.sh"]
|
||||
RUN npm i -g serve \
|
||||
&& deluser --remove-home node \
|
||||
&& 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:
|
||||
npm i
|
||||
|
0
global.d.ts
vendored
Normal file → Executable file
0
nginx.conf
Normal file → Executable file
7563
package-lock.json
generated
22
package.json
Normal file → Executable file
@ -3,11 +3,17 @@
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"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",
|
||||
"@reduxjs/toolkit": "^1.8.3",
|
||||
"@types/node": "^16.11.47",
|
||||
"@types/react": "^18.0.15",
|
||||
"@types/react-copy-to-clipboard": "^5.0.4",
|
||||
"@types/react-dom": "^18.0.6",
|
||||
"@uiw/react-md-editor": "^3.18.1",
|
||||
"axios": "^0.27.2",
|
||||
"classnames": "^2.3.1",
|
||||
"formik": "^2.2.9",
|
||||
@ -19,19 +25,27 @@
|
||||
"jwt-decode": "^3.1.2",
|
||||
"lodash": "^4.17.21",
|
||||
"react": "^18.2.0",
|
||||
"react-copy-to-clipboard": "^5.1.0",
|
||||
"react-dom": "^18.2.0",
|
||||
"react-hotkeys": "^2.0.0",
|
||||
"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-router-dom": "^6.3.0",
|
||||
"react-scripts": "5.0.1",
|
||||
"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",
|
||||
"swiper": "^8.3.2",
|
||||
"tailwindcss": "^3.1.7",
|
||||
"tsconfig-paths-webpack-plugin": "^4.0.0",
|
||||
"typescript": "^4.7.4",
|
||||
"web-vitals": "^2.1.4",
|
||||
"yup": "^0.32.11",
|
||||
"tailwindcss": "^3.1.7"
|
||||
"yup": "^0.32.11"
|
||||
},
|
||||
"scripts": {
|
||||
"dev-tools": "redux-devtools --hostname=localhost --port=8000",
|
||||
@ -91,16 +105,20 @@
|
||||
"@storybook/react": "^6.5.9",
|
||||
"@storybook/testing-library": "^0.0.13",
|
||||
"@svgr/webpack": "^6.3.1",
|
||||
"@tailwindcss/line-clamp": "^0.4.0",
|
||||
"@testing-library/jest-dom": "^5.16.4",
|
||||
"@testing-library/react": "^13.3.0",
|
||||
"@testing-library/user-event": "^13.5.0",
|
||||
"@types/jest": "^27.5.2",
|
||||
"@types/react-lottie": "^1.2.6",
|
||||
"@types/react-syntax-highlighter": "^15.5.5",
|
||||
"autoprefixer": "^10.4.8",
|
||||
"babel-plugin-named-exports-order": "^0.0.2",
|
||||
"jest": "^28.1.3",
|
||||
"postcss": "^8.4.14",
|
||||
"prop-types": "^15.8.1",
|
||||
"react-test-renderer": "^18.2.0",
|
||||
"tailwind-scrollbar": "^2.0.1",
|
||||
"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.
|
||||
Learn how to configure a non-root public URL by running `npm run build`.
|
||||
-->
|
||||
<title>Freeland</title>
|
||||
<title>Scipaper</title>
|
||||
</head>
|
||||
<body>
|
||||
<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": {
|
||||
"goHome": "Home",
|
||||
"noSuchPath": "We don't have this page"
|
||||
"goHome": "Home page",
|
||||
"noSuchPath": "We don't have such a page"
|
||||
},
|
||||
"sidemenu": {
|
||||
"dashboard": "Dashboard",
|
||||
@ -19,45 +19,130 @@
|
||||
"hellousr": "Hello, {{username}}",
|
||||
"edit": "Edit",
|
||||
"language": "Language",
|
||||
"selectLanguage": "Select language",
|
||||
"selectLanguage": "Select a language",
|
||||
"save": "Save",
|
||||
"cancel": "Cancel",
|
||||
"account": {
|
||||
"info": "Personal information",
|
||||
"info": "Personal Information",
|
||||
"mail": "Mail",
|
||||
"connect": "Add account",
|
||||
"connectedAccounts_one": "Connected account",
|
||||
"connectedAccounts_other": "Connected accounts",
|
||||
"settings": "Account settings"
|
||||
"connect": "Add Account",
|
||||
"connectedAccounts_one": "Linked Account",
|
||||
"connectedAccounts_other": "Linked Accounts",
|
||||
"settings": "Account Settings"
|
||||
},
|
||||
"security": {
|
||||
"password": {
|
||||
"caption": "Password",
|
||||
"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."
|
||||
"twoFactor": "Two-factor authentication (2FA)",
|
||||
"description": "Protect your account by enabling 2FA via SMS or using a temporary one-time password (OTP) from the authentication app."
|
||||
},
|
||||
"activity": {
|
||||
"caption": "Device activity"
|
||||
}
|
||||
},
|
||||
"search": {
|
||||
"label": "Search for something.."
|
||||
"label": "We will find something.."
|
||||
},
|
||||
"subscriptions": {
|
||||
"subscribed": "Service have been connected"
|
||||
"subscribed": "The service is attached to the account"
|
||||
},
|
||||
"viewHistory": "View history",
|
||||
"logOutEverywhere": "log out from all devices",
|
||||
"logOutEverywhere": "Log out from all devices",
|
||||
"back": "Back",
|
||||
"logOut": "Log out",
|
||||
"logOut": "Exit",
|
||||
"failures": {
|
||||
"subscriptions": {
|
||||
"failure": "Failed to connect service",
|
||||
"exists": "Service have already been connected",
|
||||
"confirmation": "Invalid confirmation information provided"
|
||||
"failure": "Failed to attach the service to your account",
|
||||
"exists": "The service was already attached to your account earlier",
|
||||
"confirmation": "Invalid password"
|
||||
},
|
||||
"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": {
|
||||
"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 */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
import React from "react";
|
||||
import MainPage from "pages/MainPage";
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* Application root component */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
@ -10,7 +12,7 @@ import React from "react";
|
||||
* @return {JSX.Element}
|
||||
*/
|
||||
function App() {
|
||||
return <div>Hello world!</div>;
|
||||
return <MainPage />;
|
||||
}
|
||||
|
||||
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
3
src/assets/svg/agricultural.svg
Executable file
@ -0,0 +1,3 @@
|
||||
<svg viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M16.5495 18.1523C20.0358 21.1083 21.1165 25.66 19.7396 29.9152H30.4102C31.4258 26.9366 34.4857 25.2281 37.9199 26.6722L39.1536 19.4836C39.362 18.2715 38.138 17.2497 36.8978 17.2497H30.0098V11.8372C30.0098 11.415 29.668 11.0636 29.2448 11.0442V8.24616H28.1901V11.0442C27.7767 11.0733 27.4479 11.4182 27.4479 11.834V17.2497H22.0703C23.099 12.4304 21.8978 10.7831 21.2044 5.88004C20.931 5.1773 20.3939 5.01934 19.7884 5H7.25586C6.6276 5.00645 6.19141 5.31591 5.96354 5.96063L5.11393 14.068L3.42122 16.0473C2.68229 16.8951 2.89714 16.6984 3.57747 17.7106C3.69466 17.6268 3.81185 17.543 3.93229 17.4656C7.49349 15.1576 13.1966 15.5734 16.5495 18.1523ZM29.0951 6.74397C29.1439 6.69561 29.222 6.69239 29.2741 6.74074C29.3229 6.7891 29.3262 6.86646 29.2773 6.91804C29.1829 7.01475 29.2188 7.15336 29.2513 7.28231C29.3099 7.50151 29.362 7.70137 29.0951 7.85288C29.0332 7.88834 28.9583 7.86578 28.9225 7.80775C28.8867 7.74973 28.9128 7.67236 28.9714 7.6369C29.069 7.5821 29.0397 7.46928 29.0072 7.34678C28.9583 7.15336 28.903 6.94383 29.0951 6.74397ZM28.3333 6.74397C28.3822 6.69561 28.4603 6.69239 28.5124 6.74074C28.5612 6.7891 28.5645 6.86646 28.5156 6.91804C28.4212 7.01475 28.457 7.15336 28.4896 7.28231C28.5482 7.50151 28.6003 7.70137 28.3333 7.85288C28.2715 7.88834 28.1966 7.86578 28.1608 7.80775C28.125 7.7465 28.1478 7.67236 28.2064 7.6369C28.304 7.5821 28.2747 7.46928 28.2422 7.34678C28.1934 7.15336 28.138 6.94383 28.3333 6.74397ZM14.4694 7.68203V13.6618C15.8659 13.9745 17.2461 14.4032 18.6035 14.9512C19.3132 15.2381 20.1497 14.313 20 13.5683L19.0885 9.06173C18.9388 8.31708 18.4603 7.67881 17.6921 7.67881H14.4694V7.68203ZM13.0827 13.3878V7.68203H9.63216C8.86393 7.68203 8.41146 8.32353 8.23568 9.06496L7.63021 11.6503C7.45768 12.3917 8.25846 13.0203 9.02669 13.0332C10.3939 13.0461 11.7448 13.1654 13.0827 13.3878ZM35.7585 27.2428C38.099 27.2428 40 29.1222 40 31.4432C40 33.7609 38.1022 35.6403 35.7585 35.6403C33.4147 35.6403 31.5202 33.7609 31.5202 31.4432C31.5202 29.1222 33.418 27.2428 35.7585 27.2428ZM9.05925 17.8267C14.0625 17.8267 18.1185 21.8433 18.1185 26.798C18.1185 31.7526 14.0625 35.7692 9.05925 35.7692C4.05599 35.7692 0 31.7526 0 26.798C0 21.8433 4.05599 17.8267 9.05925 17.8267ZM9.05925 21.9755C11.748 21.9755 13.929 24.1353 13.929 26.798C13.929 29.4607 11.748 31.6205 9.05925 31.6205C6.37044 31.6205 4.18945 29.4607 4.18945 26.798C4.18945 24.1353 6.37044 21.9755 9.05925 21.9755ZM35.7585 29.3124C36.9466 29.3124 37.9069 30.2666 37.9069 31.4399C37.9069 32.6166 36.9434 33.5675 35.7585 33.5675C34.5703 33.5675 33.61 32.6133 33.61 31.4399C33.61 30.2666 34.5736 29.3124 35.7585 29.3124ZM29.4564 19.8737H34.8112L34.6908 20.4862H29.3522L29.4564 19.8737ZM27.5781 23.1746H34.8112L34.6908 23.7871H27.4707L27.5781 23.1746ZM28.2454 21.5242H34.8145L34.694 22.1366H28.138L28.2454 21.5242Z" fill="#8C8C8C"/>
|
||||
</svg>
|
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 |
6
src/assets/svg/duplicate.svg
Executable file
@ -0,0 +1,6 @@
|
||||
<svg viewBox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M8 20.5V8.5C8 7.39543 8.89543 6.5 10 6.5H15.5H18C19.1046 6.5 20 7.39543 20 8.5L20 11.3V20.5C20 21.6046 19.1046 22.5 18 22.5H10C8.89543 22.5 8 21.6046 8 20.5Z" fill="none" stroke-width="2" stroke-linecap="round"/>
|
||||
<path d="M11 14.5H17" fill="none" stroke-width="2" stroke-linecap="round"/>
|
||||
<path d="M11 18.5H17" fill="none" stroke-width="2" stroke-linecap="round"/>
|
||||
<path d="M16 6.3L16 4.50001C16 3.39543 15.1046 2.5 14 2.5H11.5H6C4.89543 2.5 4 3.39543 4 4.5V16.5C4 17.6046 4.89543 18.5 6 18.5H8" fill="none" stroke-width="2" stroke-linecap="round"/>
|
||||
</svg>
|
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 |