Merge remote-tracking branch 'hub/main' into feature/sse-connect
This commit is contained in:
commit
25aaecf360
26
package-lock.json
generated
26
package-lock.json
generated
|
@ -110,7 +110,7 @@
|
||||||
"prosemirror-view": "1.30.2",
|
"prosemirror-view": "1.30.2",
|
||||||
"rollup": "3.21.6",
|
"rollup": "3.21.6",
|
||||||
"sass": "1.69.5",
|
"sass": "1.69.5",
|
||||||
"solid-js": "1.8.5",
|
"solid-js": "1.8.7",
|
||||||
"solid-popper": "0.3.0",
|
"solid-popper": "0.3.0",
|
||||||
"solid-tiptap": "0.6.0",
|
"solid-tiptap": "0.6.0",
|
||||||
"solid-transition-group": "0.2.3",
|
"solid-transition-group": "0.2.3",
|
||||||
|
@ -125,7 +125,7 @@
|
||||||
"typescript": "5.2.2",
|
"typescript": "5.2.2",
|
||||||
"typograf": "7.1.0",
|
"typograf": "7.1.0",
|
||||||
"uniqolor": "1.1.0",
|
"uniqolor": "1.1.0",
|
||||||
"vike": "0.4.146",
|
"vike": "0.4.148",
|
||||||
"vite": "4.5.0",
|
"vite": "4.5.0",
|
||||||
"vite-plugin-mkcert": "1.16.0",
|
"vite-plugin-mkcert": "1.16.0",
|
||||||
"vite-plugin-sass-dts": "1.3.11",
|
"vite-plugin-sass-dts": "1.3.11",
|
||||||
|
@ -17061,9 +17061,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/seroval": {
|
"node_modules/seroval": {
|
||||||
"version": "0.12.4",
|
"version": "0.15.1",
|
||||||
"resolved": "https://registry.npmjs.org/seroval/-/seroval-0.12.4.tgz",
|
"resolved": "https://registry.npmjs.org/seroval/-/seroval-0.15.1.tgz",
|
||||||
"integrity": "sha512-JIsZHp98o+okpYN8HEPyI9Blr0gxAUPIGvg3waXrEMFjPz9obiLYMz0uFiUGezKiCK8loosYbn8WsqO8WtAJUA==",
|
"integrity": "sha512-OPVtf0qmeC7RW+ScVX+7aOS+xoIM7pWcZ0jOWg2aTZigCydgRB04adfteBRbecZnnrO1WuGQ+C3tLeBBzX2zSQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=10"
|
"node": ">=10"
|
||||||
|
@ -17253,13 +17253,13 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/solid-js": {
|
"node_modules/solid-js": {
|
||||||
"version": "1.8.5",
|
"version": "1.8.7",
|
||||||
"resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.8.5.tgz",
|
"resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.8.7.tgz",
|
||||||
"integrity": "sha512-xvtJvzJzWbsn35oKFhW9kNwaxG1Z/YLMsDp4tLVcYZTMPzvzQ8vEZuyDQ6nt7xDArVgZJ7TUFrJUwrui/oq53A==",
|
"integrity": "sha512-9dzrSVieh2zj3SnJ02II6xZkonR6c+j/91b7XZUNcC6xSaldlqjjGh98F1fk5cRJ8ZTkzqF5fPIWDxEOs6QZXA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"csstype": "^3.1.0",
|
"csstype": "^3.1.0",
|
||||||
"seroval": "^0.12.0"
|
"seroval": "^0.15.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/solid-popper": {
|
"node_modules/solid-popper": {
|
||||||
|
@ -18662,14 +18662,14 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/vike": {
|
"node_modules/vike": {
|
||||||
"version": "0.4.146",
|
"version": "0.4.148",
|
||||||
"resolved": "https://registry.npmjs.org/vike/-/vike-0.4.146.tgz",
|
"resolved": "https://registry.npmjs.org/vike/-/vike-0.4.148.tgz",
|
||||||
"integrity": "sha512-1vaktcDy/eitSzVaUppKJWu+6vfwxKC4kV6uzAqj3RIK+WgteH3vF6IMZ0jnjjzCpeDRCIByN8PF4c0CtzRfHA==",
|
"integrity": "sha512-2KkrY6zB+fTVwQzzcr5zAxpIT2buezDcUP5u4oFzDdxhqcV7r5CGq2PWQ3/ALA8jP/Agz0ZdiMbXUNGJFI+uVw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@brillout/import": "0.2.3",
|
"@brillout/import": "0.2.3",
|
||||||
"@brillout/json-serializer": "^0.5.8",
|
"@brillout/json-serializer": "^0.5.8",
|
||||||
"@brillout/picocolors": "^1.0.9",
|
"@brillout/picocolors": "^1.0.10",
|
||||||
"@brillout/require-shim": "^0.1.2",
|
"@brillout/require-shim": "^0.1.2",
|
||||||
"@brillout/vite-plugin-import-build": "^0.2.20",
|
"@brillout/vite-plugin-import-build": "^0.2.20",
|
||||||
"acorn": "^8.8.2",
|
"acorn": "^8.8.2",
|
||||||
|
|
|
@ -131,7 +131,7 @@
|
||||||
"prosemirror-view": "1.30.2",
|
"prosemirror-view": "1.30.2",
|
||||||
"rollup": "3.21.6",
|
"rollup": "3.21.6",
|
||||||
"sass": "1.69.5",
|
"sass": "1.69.5",
|
||||||
"solid-js": "1.8.5",
|
"solid-js": "1.8.7",
|
||||||
"solid-popper": "0.3.0",
|
"solid-popper": "0.3.0",
|
||||||
"solid-tiptap": "0.6.0",
|
"solid-tiptap": "0.6.0",
|
||||||
"solid-transition-group": "0.2.3",
|
"solid-transition-group": "0.2.3",
|
||||||
|
@ -146,7 +146,7 @@
|
||||||
"typescript": "5.2.2",
|
"typescript": "5.2.2",
|
||||||
"typograf": "7.1.0",
|
"typograf": "7.1.0",
|
||||||
"uniqolor": "1.1.0",
|
"uniqolor": "1.1.0",
|
||||||
"vike": "0.4.146",
|
"vike": "0.4.148",
|
||||||
"vite": "4.5.0",
|
"vite": "4.5.0",
|
||||||
"vite-plugin-mkcert": "1.16.0",
|
"vite-plugin-mkcert": "1.16.0",
|
||||||
"vite-plugin-sass-dts": "1.3.11",
|
"vite-plugin-sass-dts": "1.3.11",
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
{
|
{
|
||||||
|
"A guide to horizontal editorial: how an open journal works": "A guide to horizontal editorial: how an open journal works",
|
||||||
"About": "About",
|
"About": "About",
|
||||||
"About the project": "About the project",
|
"About the project": "About the project",
|
||||||
"Add a few topics so that the reader knows what your content is about and can find it on pages of topics that interest them. Topics can be swapped, the first topic becomes the title": "Add a few topics so that the reader knows what your content is about and can find it on pages of topics that interest them. Topics can be swapped, the first topic becomes the title",
|
"Add a few topics so that the reader knows what your content is about and can find it on pages of topics that interest them. Topics can be swapped, the first topic becomes the title": "Add a few topics so that the reader knows what your content is about and can find it on pages of topics that interest them. Topics can be swapped, the first topic becomes the title",
|
||||||
|
@ -17,7 +18,7 @@
|
||||||
"Add signature": "Add signature",
|
"Add signature": "Add signature",
|
||||||
"Add subtitle": "Add subtitle",
|
"Add subtitle": "Add subtitle",
|
||||||
"Add url": "Add url",
|
"Add url": "Add url",
|
||||||
"Address on Discourse": "Address on Discourse",
|
"Address on Discours": "Address on Discours",
|
||||||
"Album name": "Название aльбома",
|
"Album name": "Название aльбома",
|
||||||
"Alignment center": "Alignment center",
|
"Alignment center": "Alignment center",
|
||||||
"Alignment left": "Alignment left",
|
"Alignment left": "Alignment left",
|
||||||
|
@ -40,6 +41,7 @@
|
||||||
"Back": "Back",
|
"Back": "Back",
|
||||||
"Back to editor": "Back to editor",
|
"Back to editor": "Back to editor",
|
||||||
"Back to main page": "Back to main page",
|
"Back to main page": "Back to main page",
|
||||||
|
"Be the first to rate": "Be the first to rate",
|
||||||
"Become an author": "Become an author",
|
"Become an author": "Become an author",
|
||||||
"Bold": "Bold",
|
"Bold": "Bold",
|
||||||
"Bookmarked": "Saved",
|
"Bookmarked": "Saved",
|
||||||
|
@ -71,8 +73,11 @@
|
||||||
"Comment successfully deleted": "Comment successfully deleted",
|
"Comment successfully deleted": "Comment successfully deleted",
|
||||||
"Comments": "Comments",
|
"Comments": "Comments",
|
||||||
"Communities": "Communities",
|
"Communities": "Communities",
|
||||||
|
"Community Discussion Rules": "Community Discussion Rules",
|
||||||
"Community Principles": "Community Principles",
|
"Community Principles": "Community Principles",
|
||||||
|
"Community values and rules of engagement for the open editorial team": "Community values and rules of engagement for the open editorial team",
|
||||||
"Confirm": "Confirm",
|
"Confirm": "Confirm",
|
||||||
|
"Contribute to free samizdat. Support Discours - an independent non-profit publication that works only for you. Become a pillar of the open newsroom": "Contribute to free samizdat. Support Discours - an independent non-profit publication that works only for you. Become a pillar of the open newsroom",
|
||||||
"Cooperate": "Cooperate",
|
"Cooperate": "Cooperate",
|
||||||
"Copy": "Copy",
|
"Copy": "Copy",
|
||||||
"Copy link": "Copy link",
|
"Copy link": "Copy link",
|
||||||
|
@ -97,11 +102,13 @@
|
||||||
"Delete userpic": "Delete userpic",
|
"Delete userpic": "Delete userpic",
|
||||||
"Description": "Description",
|
"Description": "Description",
|
||||||
"Discours": "Discours",
|
"Discours": "Discours",
|
||||||
|
"Discours Manifest": "Discours Manifest",
|
||||||
|
"Discours Partners": "Discours Partners",
|
||||||
"Discours is an intellectual environment, a web space and tools that allows authors to collaborate with readers and come together to co-create publications and media projects": "Discours is an intellectual environment, a web space and tools that allows authors to collaborate with readers and come together to co-create publications and media projects.<br/><em>We are convinced that one voice is good, but many is better. We create the most amazing stories together</em>",
|
"Discours is an intellectual environment, a web space and tools that allows authors to collaborate with readers and come together to co-create publications and media projects": "Discours is an intellectual environment, a web space and tools that allows authors to collaborate with readers and come together to co-create publications and media projects.<br/><em>We are convinced that one voice is good, but many is better. We create the most amazing stories together</em>",
|
||||||
"Discours is created with our common effort": "Discours exists because of our common effort",
|
"Discours is created with our common effort": "Discours exists because of our common effort",
|
||||||
|
"Discours – an open magazine about culture, science and society": "Discours – an open magazine about culture, science and society",
|
||||||
"Discussing": "Discussing",
|
"Discussing": "Discussing",
|
||||||
"Discussion rules": "Discussion rules",
|
"Discussion rules": "Discussion rules",
|
||||||
"Discussion rules in social networks": "Discussion rules",
|
|
||||||
"Discussions": "Discussions",
|
"Discussions": "Discussions",
|
||||||
"Do you really want to reset all changes?": "Do you really want to reset all changes?",
|
"Do you really want to reset all changes?": "Do you really want to reset all changes?",
|
||||||
"Dogma": "Dogma",
|
"Dogma": "Dogma",
|
||||||
|
@ -152,7 +159,7 @@
|
||||||
"Help": "Помощь",
|
"Help": "Помощь",
|
||||||
"Help to edit": "Help to edit",
|
"Help to edit": "Help to edit",
|
||||||
"Here you can customize your profile the way you want.": "Here you can customize your profile the way you want.",
|
"Here you can customize your profile the way you want.": "Here you can customize your profile the way you want.",
|
||||||
"Here you can manage all your Discourse subscriptions": "Here you can manage all your Discourse subscriptions",
|
"Here you can manage all your Discours subscriptions": "Here you can manage all your Discours subscriptions",
|
||||||
"Here you can upload your photo": "Here you can upload your photo",
|
"Here you can upload your photo": "Here you can upload your photo",
|
||||||
"Hide table of contents": "Hide table of contents",
|
"Hide table of contents": "Hide table of contents",
|
||||||
"Highlight": "Highlight",
|
"Highlight": "Highlight",
|
||||||
|
@ -160,11 +167,13 @@
|
||||||
"Horizontal collaborative journalistic platform": "Horizontal collaborative journalism platform",
|
"Horizontal collaborative journalistic platform": "Horizontal collaborative journalism platform",
|
||||||
"Hot topics": "Hot topics",
|
"Hot topics": "Hot topics",
|
||||||
"Hotkeys": "Горячие клавиши",
|
"Hotkeys": "Горячие клавиши",
|
||||||
|
"How Discours works": "How Discours works",
|
||||||
"How can I help/skills": "How can I help/skills",
|
"How can I help/skills": "How can I help/skills",
|
||||||
"How it works": "How it works",
|
"How it works": "How it works",
|
||||||
"How to help": "How to help?",
|
"How to help": "How to help?",
|
||||||
"How to write a good article": "Как написать хорошую статью",
|
"How to write a good article": "Как написать хорошую статью",
|
||||||
"How to write an article": "How to write an article",
|
"How to write an article": "How to write an article",
|
||||||
|
"Hundreds of people from different countries and cities share their knowledge and art on the Discours. Join us!": "Hundreds of people from different countries and cities share their knowledge and art on the Discours. Join us!",
|
||||||
"I have an account": "I have an account!",
|
"I have an account": "I have an account!",
|
||||||
"I have no account yet": "I don't have an account yet",
|
"I have no account yet": "I don't have an account yet",
|
||||||
"I know the password": "I know the password",
|
"I know the password": "I know the password",
|
||||||
|
@ -173,6 +182,7 @@
|
||||||
"Inbox": "Inbox",
|
"Inbox": "Inbox",
|
||||||
"Incut": "Incut",
|
"Incut": "Incut",
|
||||||
"Independant magazine with an open horizontal cooperation about culture, science and society": "Independant magazine with an open horizontal cooperation about culture, science and society",
|
"Independant magazine with an open horizontal cooperation about culture, science and society": "Independant magazine with an open horizontal cooperation about culture, science and society",
|
||||||
|
"Independent media project about culture, science, art and society with horizontal editing": "Independent media project about culture, science, art and society with horizontal editing",
|
||||||
"Insert footnote": "Insert footnote",
|
"Insert footnote": "Insert footnote",
|
||||||
"Insert video link": "Insert video link",
|
"Insert video link": "Insert video link",
|
||||||
"Interview": "Interview",
|
"Interview": "Interview",
|
||||||
|
@ -195,13 +205,14 @@
|
||||||
"Let's log in": "Let's log in",
|
"Let's log in": "Let's log in",
|
||||||
"Link copied": "Link copied",
|
"Link copied": "Link copied",
|
||||||
"Link sent, check your email": "Link sent, check your email",
|
"Link sent, check your email": "Link sent, check your email",
|
||||||
|
"List of authors of the open editorial community": "List of authors of the open editorial community",
|
||||||
"Lists": "Lists",
|
"Lists": "Lists",
|
||||||
"Literature": "Literature",
|
"Literature": "Literature",
|
||||||
"Load more": "Show more",
|
"Load more": "Show more",
|
||||||
"Loading": "Loading",
|
"Loading": "Loading",
|
||||||
"Logout": "Logout",
|
"Logout": "Logout",
|
||||||
"Looks like you forgot to upload the video": "Looks like you forgot to upload the video",
|
"Looks like you forgot to upload the video": "Looks like you forgot to upload the video",
|
||||||
"Manifest": "Manifest",
|
"Manifest of samizdat: principles and mission of an open magazine with a horizontal editorial board": "Manifest of samizdat: principles and mission of an open magazine with a horizontal editorial board",
|
||||||
"Manifesto": "Manifesto",
|
"Manifesto": "Manifesto",
|
||||||
"Many files, choose only one": "Many files, choose only one",
|
"Many files, choose only one": "Many files, choose only one",
|
||||||
"Mark as read": "Mark as read",
|
"Mark as read": "Mark as read",
|
||||||
|
@ -236,6 +247,7 @@
|
||||||
"Ordered list": "Ordered list",
|
"Ordered list": "Ordered list",
|
||||||
"Our regular contributor": "Our regular contributor",
|
"Our regular contributor": "Our regular contributor",
|
||||||
"Paragraphs": "Абзацев",
|
"Paragraphs": "Абзацев",
|
||||||
|
"Participate in the Discours: share information, join the editorial team": "Участвуйте в Дискурсе: делитесь информацией, присоединяйтесь к редакции",
|
||||||
"Participating": "Participating",
|
"Participating": "Participating",
|
||||||
"Participation": "Participation",
|
"Participation": "Participation",
|
||||||
"Partners": "Partners",
|
"Partners": "Partners",
|
||||||
|
@ -261,6 +273,7 @@
|
||||||
"Popular": "Popular",
|
"Popular": "Popular",
|
||||||
"Popular authors": "Popular authors",
|
"Popular authors": "Popular authors",
|
||||||
"Principles": "Community principles",
|
"Principles": "Community principles",
|
||||||
|
"Professional principles that the open editorial team follows in its work": "Professional principles that the open editorial team follows in its work",
|
||||||
"Profile": "Profile",
|
"Profile": "Profile",
|
||||||
"Profile settings": "Profile settings",
|
"Profile settings": "Profile settings",
|
||||||
"Publications": "Publications",
|
"Publications": "Publications",
|
||||||
|
@ -281,6 +294,7 @@
|
||||||
"Required": "Required",
|
"Required": "Required",
|
||||||
"Resend code": "Send confirmation",
|
"Resend code": "Send confirmation",
|
||||||
"Restore password": "Restore password",
|
"Restore password": "Restore password",
|
||||||
|
"Rules of the journal Discours": "Rules of the journal Discours",
|
||||||
"Save draft": "Save draft",
|
"Save draft": "Save draft",
|
||||||
"Save settings": "Save settings",
|
"Save settings": "Save settings",
|
||||||
"Saving...": "Saving...",
|
"Saving...": "Saving...",
|
||||||
|
@ -291,6 +305,7 @@
|
||||||
"Sections": "Sections",
|
"Sections": "Sections",
|
||||||
"Security": "Security",
|
"Security": "Security",
|
||||||
"Select": "Select",
|
"Select": "Select",
|
||||||
|
"Self-publishing exists thanks to the help of wonderful people from all over the world. Thank you!": "Samizdat exists thanks to the help of wonderful people from all over the world. Thank you!",
|
||||||
"Send": "Send",
|
"Send": "Send",
|
||||||
"Send link again": "Send link again",
|
"Send link again": "Send link again",
|
||||||
"Settings": "Settings",
|
"Settings": "Settings",
|
||||||
|
@ -326,12 +341,17 @@
|
||||||
"Success": "Success",
|
"Success": "Success",
|
||||||
"Successfully authorized": "Authorization successful",
|
"Successfully authorized": "Authorization successful",
|
||||||
"Suggest an idea": "Suggest an idea",
|
"Suggest an idea": "Suggest an idea",
|
||||||
|
"Support Discours": "Support Discours",
|
||||||
"Support the project": "Support the project",
|
"Support the project": "Support the project",
|
||||||
"Support us": "Help the magazine",
|
|
||||||
"Terms of use": "Site rules",
|
"Terms of use": "Site rules",
|
||||||
"Text checking": "Text checking",
|
"Text checking": "Text checking",
|
||||||
"Thank you": "Thank you",
|
"Thank you": "Thank you",
|
||||||
|
"Thank you!": "Thank you!",
|
||||||
"The address is already taken": "The address is already taken",
|
"The address is already taken": "The address is already taken",
|
||||||
|
"The most interesting publications on the topic": "The most interesting publications on the topic {topicName}",
|
||||||
|
"Thematic table of contents of the magazine. Here you can find all the topics that community authors have written about.": "Thematic table of contents of the magazine. Here you can find all the topics that community authors have written about.",
|
||||||
|
"Thematic table of contents of the magazine. Here you can find all the topics that the community authors wrote about": "Thematic table of contents of the magazine. Here you can find all the topics that the community authors wrote about",
|
||||||
|
"Themes and plots": "Themes and plots",
|
||||||
"Theory": "Theory",
|
"Theory": "Theory",
|
||||||
"There are unsaved changes in your profile settings. Are you sure you want to leave the page without saving?": "There are unsaved changes in your profile settings. Are you sure you want to leave the page without saving?",
|
"There are unsaved changes in your profile settings. Are you sure you want to leave the page without saving?": "There are unsaved changes in your profile settings. Are you sure you want to leave the page without saving?",
|
||||||
"There are unsaved changes in your publishing settings. Are you sure you want to leave the page without saving?": "There are unsaved changes in your publishing settings. Are you sure you want to leave the page without saving?",
|
"There are unsaved changes in your publishing settings. Are you sure you want to leave the page without saving?": "There are unsaved changes in your publishing settings. Are you sure you want to leave the page without saving?",
|
||||||
|
@ -380,8 +400,9 @@
|
||||||
"Welcome to Discours to subscribe to new publications": "Welcome to Discours to subscribe to new publications",
|
"Welcome to Discours to subscribe to new publications": "Welcome to Discours to subscribe to new publications",
|
||||||
"Welcome to Discours to vote": "Welcome to Discours to vote",
|
"Welcome to Discours to vote": "Welcome to Discours to vote",
|
||||||
"Where": "From",
|
"Where": "From",
|
||||||
|
"Why you can earn a hole in your karma and how to receive rays of gratitude for your contribution to discussions in samizdat communities": "Why you can earn a hole in your karma and how to receive rays of gratitude for your contribution to discussions in samizdat communities",
|
||||||
"Words": "Слов",
|
"Words": "Слов",
|
||||||
"Work with us": "Cooperate with Discourse",
|
"Work with us": "Cooperate with Discours",
|
||||||
"Write a comment...": "Write a comment...",
|
"Write a comment...": "Write a comment...",
|
||||||
"Write a short introduction": "Write a short introduction",
|
"Write a short introduction": "Write a short introduction",
|
||||||
"Write about the topic": "Write about the topic",
|
"Write about the topic": "Write about the topic",
|
||||||
|
@ -412,7 +433,8 @@
|
||||||
"community": "community",
|
"community": "community",
|
||||||
"contents": "contents",
|
"contents": "contents",
|
||||||
"delimiter": "delimiter",
|
"delimiter": "delimiter",
|
||||||
"discussion": "discourse",
|
"discussion": "Discours",
|
||||||
|
"dogma keywords": "Discours.io, dogma, editorial principles, code of ethics, journalism, community",
|
||||||
"drafts": "drafts",
|
"drafts": "drafts",
|
||||||
"earlier": "earlier",
|
"earlier": "earlier",
|
||||||
"email not confirmed": "email not confirmed",
|
"email not confirmed": "email not confirmed",
|
||||||
|
@ -428,6 +450,7 @@
|
||||||
"italic": "italic",
|
"italic": "italic",
|
||||||
"journal": "journal",
|
"journal": "journal",
|
||||||
"jpg, .png, max. 10 mb.": "jpg, .png, макс. 10 мб.",
|
"jpg, .png, max. 10 mb.": "jpg, .png, макс. 10 мб.",
|
||||||
|
"keywords": "Discours.io, Discours magazine, Discours, culture, science, art, society, independent journalism, literature, music, cinema, video, photography",
|
||||||
"literature": "literature",
|
"literature": "literature",
|
||||||
"marker list": "marker list",
|
"marker list": "marker list",
|
||||||
"min. 1400×1400 pix": "мин. 1400×1400 пикс.",
|
"min. 1400×1400 pix": "мин. 1400×1400 пикс.",
|
||||||
|
@ -437,6 +460,7 @@
|
||||||
"or sign in with social networks": "or sign in with social networks",
|
"or sign in with social networks": "or sign in with social networks",
|
||||||
"personal data usage and email notifications": "to process personal data and receive email notifications",
|
"personal data usage and email notifications": "to process personal data and receive email notifications",
|
||||||
"post": "post",
|
"post": "post",
|
||||||
|
"principles keywords": "Discours.io, communities, values, editorial rules, polyphony, creation",
|
||||||
"register": "register",
|
"register": "register",
|
||||||
"repeat": "repeat",
|
"repeat": "repeat",
|
||||||
"shout": "post",
|
"shout": "post",
|
||||||
|
@ -451,7 +475,9 @@
|
||||||
"subscription_rp": "subscription",
|
"subscription_rp": "subscription",
|
||||||
"subscriptions": "subscriptions",
|
"subscriptions": "subscriptions",
|
||||||
"terms of use": "terms of use",
|
"terms of use": "terms of use",
|
||||||
|
"terms of use keywords": "Discours.io, site rules, terms of use",
|
||||||
"today": "today",
|
"today": "today",
|
||||||
|
"topicKeywords": "{topic}, Discours.io, articles, journalism, research",
|
||||||
"topics": "topics",
|
"topics": "topics",
|
||||||
"user already exist": "user already exists",
|
"user already exist": "user already exists",
|
||||||
"video": "video",
|
"video": "video",
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
{
|
{
|
||||||
|
"A guide to horizontal editorial: how an open journal works": "Гид по горизонтальной редакции: как работает открытый журнал",
|
||||||
"A short introduction to keep the reader interested": "Добавьте вступление, чтобы заинтересовать читателя",
|
"A short introduction to keep the reader interested": "Добавьте вступление, чтобы заинтересовать читателя",
|
||||||
"About": "О себе",
|
"About": "О себе",
|
||||||
"About the project": "О проекте",
|
"About the project": "О проекте",
|
||||||
|
@ -19,7 +20,7 @@
|
||||||
"Add subtitle": "Добавить подзаголовок",
|
"Add subtitle": "Добавить подзаголовок",
|
||||||
"Add to bookmarks": "Добавить в закладки",
|
"Add to bookmarks": "Добавить в закладки",
|
||||||
"Add url": "Добавить ссылку",
|
"Add url": "Добавить ссылку",
|
||||||
"Address on Discourse": "Адрес на Дискурсе",
|
"Address on Discours": "Адрес на Дискурсе",
|
||||||
"Album name": "Название альбома",
|
"Album name": "Название альбома",
|
||||||
"Alignment center": "По центру",
|
"Alignment center": "По центру",
|
||||||
"Alignment left": "По левому краю",
|
"Alignment left": "По левому краю",
|
||||||
|
@ -43,6 +44,7 @@
|
||||||
"Back": "Назад",
|
"Back": "Назад",
|
||||||
"Back to editor": "Вернуться в редактор",
|
"Back to editor": "Вернуться в редактор",
|
||||||
"Back to main page": "Вернуться на главную",
|
"Back to main page": "Вернуться на главную",
|
||||||
|
"Be the first to rate": "Оцените первым",
|
||||||
"Become an author": "Стать автором",
|
"Become an author": "Стать автором",
|
||||||
"Bold": "Жирный",
|
"Bold": "Жирный",
|
||||||
"Bookmarked": "Сохранено",
|
"Bookmarked": "Сохранено",
|
||||||
|
@ -75,8 +77,11 @@
|
||||||
"Comment successfully deleted": "Комментарий успешно удален",
|
"Comment successfully deleted": "Комментарий успешно удален",
|
||||||
"Comments": "Комментарии",
|
"Comments": "Комментарии",
|
||||||
"Communities": "Сообщества",
|
"Communities": "Сообщества",
|
||||||
|
"Community Discussion Rules": "Правила дискуссий в сообществе",
|
||||||
"Community Principles": "Принципы сообщества",
|
"Community Principles": "Принципы сообщества",
|
||||||
|
"Community values and rules of engagement for the open editorial team": "Ценности сообщества и правила взаимодействия открытой редакции",
|
||||||
"Confirm": "Подтвердить",
|
"Confirm": "Подтвердить",
|
||||||
|
"Contribute to free samizdat. Support Discours - an independent non-profit publication that works only for you. Become a pillar of the open newsroom": "Внесите вклад в свободный самиздат. Поддержите Дискурс — независимое некоммерческое издание, которое работает только для вас. Станьте опорой открытой редакции",
|
||||||
"Cooperate": "Соучаствовать",
|
"Cooperate": "Соучаствовать",
|
||||||
"Copy": "Скопировать",
|
"Copy": "Скопировать",
|
||||||
"Copy link": "Скопировать ссылку",
|
"Copy link": "Скопировать ссылку",
|
||||||
|
@ -101,11 +106,14 @@
|
||||||
"Delete userpic": "Удалить аватар",
|
"Delete userpic": "Удалить аватар",
|
||||||
"Description": "Описание",
|
"Description": "Описание",
|
||||||
"Discours": "Дискурс",
|
"Discours": "Дискурс",
|
||||||
|
"Discours Manifest": "Манифест Дискурса",
|
||||||
|
"Discours Partners": "Партнеры Дискурса",
|
||||||
"Discours is an intellectual environment, a web space and tools that allows authors to collaborate with readers and come together to co-create publications and media projects": "Дискурс — это интеллектуальная среда, веб-пространство и инструменты, которые позволяют авторам сотрудничать с читателями и объединяться для совместного создания публикаций и медиапроектов.<br/>Мы убеждены, один голос хорошо, а много — лучше. Самые потрясающиe истории мы создаём вместе.",
|
"Discours is an intellectual environment, a web space and tools that allows authors to collaborate with readers and come together to co-create publications and media projects": "Дискурс — это интеллектуальная среда, веб-пространство и инструменты, которые позволяют авторам сотрудничать с читателями и объединяться для совместного создания публикаций и медиапроектов.<br/>Мы убеждены, один голос хорошо, а много — лучше. Самые потрясающиe истории мы создаём вместе.",
|
||||||
"Discours is created with our common effort": "Дискурс существует благодаря нашему общему вкладу",
|
"Discours is created with our common effort": "Дискурс существует благодаря нашему общему вкладу",
|
||||||
|
"Discours – an open magazine about culture, science and society": "Дискурс – открытый журнал о культуре, науке и обществе",
|
||||||
|
"Discours_theme": "Тема дискурса",
|
||||||
"Discussing": "Обсуждаемое",
|
"Discussing": "Обсуждаемое",
|
||||||
"Discussion rules": "Правила дискуссий",
|
"Discussion rules": "Правила дискуссий",
|
||||||
"Discussion rules in social networks": "Правила сообществ самиздата в соцсетях",
|
|
||||||
"Discussions": "Дискуссии",
|
"Discussions": "Дискуссии",
|
||||||
"Do you really want to reset all changes?": "Вы действительно хотите сбросить все изменения?",
|
"Do you really want to reset all changes?": "Вы действительно хотите сбросить все изменения?",
|
||||||
"Dogma": "Догма",
|
"Dogma": "Догма",
|
||||||
|
@ -160,7 +168,7 @@
|
||||||
"Help": "Помощь",
|
"Help": "Помощь",
|
||||||
"Help to edit": "Помочь редактировать",
|
"Help to edit": "Помочь редактировать",
|
||||||
"Here you can customize your profile the way you want.": "Здесь можно настроить свой профиль так, как вы хотите.",
|
"Here you can customize your profile the way you want.": "Здесь можно настроить свой профиль так, как вы хотите.",
|
||||||
"Here you can manage all your Discourse subscriptions": "Здесь можно управлять всеми своими подписками на Дискурсе",
|
"Here you can manage all your Discours subscriptions": "Здесь можно управлять всеми своими подписками на Дискурсе",
|
||||||
"Here you can upload your photo": "Здесь вы можете загрузить свою фотографию",
|
"Here you can upload your photo": "Здесь вы можете загрузить свою фотографию",
|
||||||
"Hide table of contents": "Скрыть главление",
|
"Hide table of contents": "Скрыть главление",
|
||||||
"Highlight": "Подсветка",
|
"Highlight": "Подсветка",
|
||||||
|
@ -168,11 +176,13 @@
|
||||||
"Horizontal collaborative journalistic platform": "Открытая платформа<br/>для независимой журналистики",
|
"Horizontal collaborative journalistic platform": "Открытая платформа<br/>для независимой журналистики",
|
||||||
"Hot topics": "Горячие темы",
|
"Hot topics": "Горячие темы",
|
||||||
"Hotkeys": "Горячие клавиши",
|
"Hotkeys": "Горячие клавиши",
|
||||||
|
"How Discours works": "Как устроен Дискурс",
|
||||||
"How can I help/skills": "Чем могу помочь/навыки",
|
"How can I help/skills": "Чем могу помочь/навыки",
|
||||||
"How it works": "Как это работает",
|
"How it works": "Как это работает",
|
||||||
"How to help": "Как помочь?",
|
"How to help": "Как помочь?",
|
||||||
"How to write a good article": "Как написать хорошую статью",
|
"How to write a good article": "Как написать хорошую статью",
|
||||||
"How to write an article": "Как написать статью",
|
"How to write an article": "Как написать статью",
|
||||||
|
"Hundreds of people from different countries and cities share their knowledge and art on the Discours. Join us!": "Сотни людей из разных стран и городов делятся своими знаниями и искусством на Дискурсе. Присоединяйтесь!",
|
||||||
"I have an account": "У меня есть аккаунт!",
|
"I have an account": "У меня есть аккаунт!",
|
||||||
"I have no account yet": "У меня еще нет аккаунта",
|
"I have no account yet": "У меня еще нет аккаунта",
|
||||||
"I know the password": "Я знаю пароль!",
|
"I know the password": "Я знаю пароль!",
|
||||||
|
@ -181,6 +191,7 @@
|
||||||
"Inbox": "Входящие",
|
"Inbox": "Входящие",
|
||||||
"Incut": "Подверстка",
|
"Incut": "Подверстка",
|
||||||
"Independant magazine with an open horizontal cooperation about culture, science and society": "Независимый журнал с открытой горизонтальной редакцией о культуре, науке и обществе",
|
"Independant magazine with an open horizontal cooperation about culture, science and society": "Независимый журнал с открытой горизонтальной редакцией о культуре, науке и обществе",
|
||||||
|
"Independent media project about culture, science, art and society with horizontal editing": "Независимый медиапроект о культуре, науке, искусстве и обществе с горизонтальной редакцией",
|
||||||
"Insert footnote": "Вставить сноску",
|
"Insert footnote": "Вставить сноску",
|
||||||
"Insert video link": "Вставить ссылку на видео",
|
"Insert video link": "Вставить ссылку на видео",
|
||||||
"Interview": "Интервью",
|
"Interview": "Интервью",
|
||||||
|
@ -205,13 +216,14 @@
|
||||||
"Let's log in": "Давайте авторизуемся",
|
"Let's log in": "Давайте авторизуемся",
|
||||||
"Link copied": "Ссылка скопирована",
|
"Link copied": "Ссылка скопирована",
|
||||||
"Link sent, check your email": "Ссылка отправлена, проверьте почту",
|
"Link sent, check your email": "Ссылка отправлена, проверьте почту",
|
||||||
|
"List of authors of the open editorial community": "Список авторов сообщества открытой редакции",
|
||||||
"Lists": "Списки",
|
"Lists": "Списки",
|
||||||
"Literature": "Литература",
|
"Literature": "Литература",
|
||||||
"Load more": "Показать ещё",
|
"Load more": "Показать ещё",
|
||||||
"Loading": "Загрузка",
|
"Loading": "Загрузка",
|
||||||
"Logout": "Выход",
|
"Logout": "Выход",
|
||||||
"Looks like you forgot to upload the video": "Похоже, что вы забыли загрузить видео",
|
"Looks like you forgot to upload the video": "Похоже, что вы забыли загрузить видео",
|
||||||
"Manifest": "Манифест",
|
"Manifest of samizdat: principles and mission of an open magazine with a horizontal editorial board": "Манифест самиздата: принципы и миссия открытого журнала с горизонтальной редакцией",
|
||||||
"Manifesto": "Манифест",
|
"Manifesto": "Манифест",
|
||||||
"Many files, choose only one": "Много файлов, выберете один",
|
"Many files, choose only one": "Много файлов, выберете один",
|
||||||
"Mark as read": "Отметить прочитанным",
|
"Mark as read": "Отметить прочитанным",
|
||||||
|
@ -247,6 +259,7 @@
|
||||||
"Ordered list": "Нумерованный список",
|
"Ordered list": "Нумерованный список",
|
||||||
"Our regular contributor": "Наш постоянный автор",
|
"Our regular contributor": "Наш постоянный автор",
|
||||||
"Paragraphs": "Абзацев",
|
"Paragraphs": "Абзацев",
|
||||||
|
"Participate in the Discours: share information, join the editorial team": "Participate in the Discours: share information, join the editorial team",
|
||||||
"Participating": "Участвовать",
|
"Participating": "Участвовать",
|
||||||
"Participation": "Соучастие",
|
"Participation": "Соучастие",
|
||||||
"Partners": "Партнёры",
|
"Partners": "Партнёры",
|
||||||
|
@ -274,6 +287,7 @@
|
||||||
"Popular authors": "Популярные авторы",
|
"Popular authors": "Популярные авторы",
|
||||||
"Preview": "Предпросмотр",
|
"Preview": "Предпросмотр",
|
||||||
"Principles": "Принципы сообщества",
|
"Principles": "Принципы сообщества",
|
||||||
|
"Professional principles that the open editorial team follows in its work": "Профессиональные принципы, которым открытая редакция следует в работе",
|
||||||
"Profile": "Профиль",
|
"Profile": "Профиль",
|
||||||
"Profile settings": "Настройки профиля",
|
"Profile settings": "Настройки профиля",
|
||||||
"Profile successfully saved": "Профиль успешно сохранён",
|
"Profile successfully saved": "Профиль успешно сохранён",
|
||||||
|
@ -298,6 +312,7 @@
|
||||||
"Required": "Поле обязательно для заполнения",
|
"Required": "Поле обязательно для заполнения",
|
||||||
"Resend code": "Выслать подтверждение",
|
"Resend code": "Выслать подтверждение",
|
||||||
"Restore password": "Восстановить пароль",
|
"Restore password": "Восстановить пароль",
|
||||||
|
"Rules of the journal Discours": "Правила журнала Дискурс",
|
||||||
"Save": "Сохранить",
|
"Save": "Сохранить",
|
||||||
"Save draft": "Сохранить черновик",
|
"Save draft": "Сохранить черновик",
|
||||||
"Save settings": "Сохранить настройки",
|
"Save settings": "Сохранить настройки",
|
||||||
|
@ -309,6 +324,7 @@
|
||||||
"Sections": "Разделы",
|
"Sections": "Разделы",
|
||||||
"Security": "Безопасность",
|
"Security": "Безопасность",
|
||||||
"Select": "Выбрать",
|
"Select": "Выбрать",
|
||||||
|
"Self-publishing exists thanks to the help of wonderful people from all over the world. Thank you!": "Самиздат существуют благодаря помощи замечательных людей со всего мира. Спасибо Вам!",
|
||||||
"Send": "Отправить",
|
"Send": "Отправить",
|
||||||
"Send link again": "Прислать ссылку ещё раз",
|
"Send link again": "Прислать ссылку ещё раз",
|
||||||
"Settings": "Настройки",
|
"Settings": "Настройки",
|
||||||
|
@ -346,12 +362,17 @@
|
||||||
"Success": "Успешно",
|
"Success": "Успешно",
|
||||||
"Successfully authorized": "Авторизация успешна",
|
"Successfully authorized": "Авторизация успешна",
|
||||||
"Suggest an idea": "Предложить идею",
|
"Suggest an idea": "Предложить идею",
|
||||||
|
"Support Discours": "Поддержите Дискурс",
|
||||||
"Support the project": "Поддержать проект",
|
"Support the project": "Поддержать проект",
|
||||||
"Support us": "Помочь журналу",
|
|
||||||
"Terms of use": "Правила сайта",
|
"Terms of use": "Правила сайта",
|
||||||
"Text checking": "Проверка текста",
|
"Text checking": "Проверка текста",
|
||||||
"Thank you": "Благодарности",
|
"Thank you": "Благодарности",
|
||||||
|
"Thank you!": "Спасибо Вам!",
|
||||||
"The address is already taken": "Адрес уже занят",
|
"The address is already taken": "Адрес уже занят",
|
||||||
|
"The most interesting publications on the topic": "Самые интересные публикации по теме {topicName}",
|
||||||
|
"Thematic table of contents of the magazine. Here you can find all the topics that community authors have written about.": "Тематическое оглавление журнала. Здесь можно найти все темы, о которых писали авторы сообщества.",
|
||||||
|
"Thematic table of contents of the magazine. Here you can find all the topics that the community authors wrote about": "Тематическое оглавление журнала. Здесь можно найти все темы, о которых писали авторы сообщества",
|
||||||
|
"Themes and plots": "Темы и сюжеты",
|
||||||
"Theory": "Теории",
|
"Theory": "Теории",
|
||||||
"There are unsaved changes in your profile settings. Are you sure you want to leave the page without saving?": "В настройках вашего профиля есть несохраненные изменения. Уверены, что хотите покинуть страницу без сохранения?",
|
"There are unsaved changes in your profile settings. Are you sure you want to leave the page without saving?": "В настройках вашего профиля есть несохраненные изменения. Уверены, что хотите покинуть страницу без сохранения?",
|
||||||
"There are unsaved changes in your publishing settings. Are you sure you want to leave the page without saving?": "В настройках публикации есть несохраненные изменения. Уверены, что хотите покинуть страницу без сохранения?",
|
"There are unsaved changes in your publishing settings. Are you sure you want to leave the page without saving?": "В настройках публикации есть несохраненные изменения. Уверены, что хотите покинуть страницу без сохранения?",
|
||||||
|
@ -401,6 +422,7 @@
|
||||||
"Welcome to Discours to vote": "Войдите в Дискурс, чтобы голосовать",
|
"Welcome to Discours to vote": "Войдите в Дискурс, чтобы голосовать",
|
||||||
"Welcome!": "Добро пожаловать!",
|
"Welcome!": "Добро пожаловать!",
|
||||||
"Where": "Откуда",
|
"Where": "Откуда",
|
||||||
|
"Why you can earn a hole in your karma and how to receive rays of gratitude for your contribution to discussions in samizdat communities": "За что можно заслужить дырку в карме и как получить лучи благодарности за вклад в дискуссии в сообществах самиздата",
|
||||||
"Words": "Слов",
|
"Words": "Слов",
|
||||||
"Work with us": "Сотрудничать с Дискурсом",
|
"Work with us": "Сотрудничать с Дискурсом",
|
||||||
"Write a comment...": "Написать комментарий...",
|
"Write a comment...": "Написать комментарий...",
|
||||||
|
@ -436,8 +458,8 @@
|
||||||
"create_chat": "Создать чат",
|
"create_chat": "Создать чат",
|
||||||
"create_group": "Создать группу",
|
"create_group": "Создать группу",
|
||||||
"delimiter": "разделитель",
|
"delimiter": "разделитель",
|
||||||
"discourse_theme": "Тема дискурса",
|
|
||||||
"discussion": "дискурс",
|
"discussion": "дискурс",
|
||||||
|
"dogma keywords": "Discours.io, догма, редакционные принципы, этический кодекс, журналистика, сообщество",
|
||||||
"drafts": "черновики",
|
"drafts": "черновики",
|
||||||
"earlier": "ранее",
|
"earlier": "ранее",
|
||||||
"email not confirmed": "email не подтвержден",
|
"email not confirmed": "email не подтвержден",
|
||||||
|
@ -453,6 +475,7 @@
|
||||||
"italic": "курсив",
|
"italic": "курсив",
|
||||||
"journal": "журнал",
|
"journal": "журнал",
|
||||||
"jpg, .png, max. 10 mb.": "jpg, .png, макс. 10 мб.",
|
"jpg, .png, max. 10 mb.": "jpg, .png, макс. 10 мб.",
|
||||||
|
"keywords": "Discours.io, журнал Дискурс, Дискурс, культура, наука, искусство, общество, независимая журналистика, литература, музыка, кино, видео, фотографии",
|
||||||
"literature": "литература",
|
"literature": "литература",
|
||||||
"marker list": "маркир. список",
|
"marker list": "маркир. список",
|
||||||
"min. 1400×1400 pix": "мин. 1400×1400 пикс.",
|
"min. 1400×1400 pix": "мин. 1400×1400 пикс.",
|
||||||
|
@ -463,6 +486,7 @@
|
||||||
"or sign in with social networks": "или войдите через соцсеть",
|
"or sign in with social networks": "или войдите через соцсеть",
|
||||||
"personal data usage and email notifications": "на обработку персональных данных и на получение почтовых уведомлений",
|
"personal data usage and email notifications": "на обработку персональных данных и на получение почтовых уведомлений",
|
||||||
"post": "пост",
|
"post": "пост",
|
||||||
|
"principles keywords": "Discours.io, сообщества, ценности, правила редакции, многоголосие, созидание",
|
||||||
"register": "зарегистрируйтесь",
|
"register": "зарегистрируйтесь",
|
||||||
"repeat": "повторить",
|
"repeat": "повторить",
|
||||||
"shout": "пост",
|
"shout": "пост",
|
||||||
|
@ -477,7 +501,9 @@
|
||||||
"subscribers": "подписчиков",
|
"subscribers": "подписчиков",
|
||||||
"subscribing...": "Подписка...",
|
"subscribing...": "Подписка...",
|
||||||
"terms of use": "правилами пользования сайтом",
|
"terms of use": "правилами пользования сайтом",
|
||||||
|
"terms of use keywords": "Discours.io, правила сайта, terms of use",
|
||||||
"today": "сегодня",
|
"today": "сегодня",
|
||||||
|
"topicKeywords": "{topic}, Discours.io, статьи, журналистика, исследования",
|
||||||
"topics": "темы",
|
"topics": "темы",
|
||||||
"user already exist": "пользователь уже существует",
|
"user already exist": "пользователь уже существует",
|
||||||
"video": "видео",
|
"video": "видео",
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
User-agent: *
|
User-agent: *
|
||||||
Disallow: /
|
Allow: /
|
||||||
|
|
|
@ -51,7 +51,6 @@ const pagesMap: Record<keyof typeof ROUTES, Component<PageProps>> = {
|
||||||
authorAbout: AuthorPage,
|
authorAbout: AuthorPage,
|
||||||
inbox: InboxPage,
|
inbox: InboxPage,
|
||||||
expo: ExpoPage,
|
expo: ExpoPage,
|
||||||
expoLayout: ExpoPage,
|
|
||||||
connect: ConnectPage,
|
connect: ConnectPage,
|
||||||
create: CreatePage,
|
create: CreatePage,
|
||||||
edit: EditPage,
|
edit: EditPage,
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
transition: background-color 0.3s;
|
transition: background-color 0.3s;
|
||||||
position: relative;
|
position: relative;
|
||||||
list-style: none;
|
list-style: none;
|
||||||
background: rgb(0 0 0 / 10%);
|
|
||||||
|
|
||||||
@include media-breakpoint-down(sm) {
|
@include media-breakpoint-down(sm) {
|
||||||
padding-right: 0;
|
padding-right: 0;
|
||||||
|
|
|
@ -2,7 +2,7 @@ import type { Author, Shout, Topic } from '../../graphql/schema/core.gen'
|
||||||
|
|
||||||
import { getPagePath } from '@nanostores/router'
|
import { getPagePath } from '@nanostores/router'
|
||||||
import { createPopper } from '@popperjs/core'
|
import { createPopper } from '@popperjs/core'
|
||||||
import { Link } from '@solidjs/meta'
|
import { Link, Meta } from '@solidjs/meta'
|
||||||
import { clsx } from 'clsx'
|
import { clsx } from 'clsx'
|
||||||
import { createEffect, For, createMemo, onMount, Show, createSignal, onCleanup } from 'solid-js'
|
import { createEffect, For, createMemo, onMount, Show, createSignal, onCleanup } from 'solid-js'
|
||||||
import { isServer } from 'solid-js/web'
|
import { isServer } from 'solid-js/web'
|
||||||
|
@ -14,7 +14,7 @@ import { MediaItem } from '../../pages/types'
|
||||||
import { DEFAULT_HEADER_OFFSET, router, useRouter } from '../../stores/router'
|
import { DEFAULT_HEADER_OFFSET, router, useRouter } from '../../stores/router'
|
||||||
import { capitalize } from '../../utils/capitalize'
|
import { capitalize } from '../../utils/capitalize'
|
||||||
import { getImageUrl } from '../../utils/getImageUrl'
|
import { getImageUrl } from '../../utils/getImageUrl'
|
||||||
import { getDescription } from '../../utils/meta'
|
import { getDescription, getKeywords } from '../../utils/meta'
|
||||||
import { Icon } from '../_shared/Icon'
|
import { Icon } from '../_shared/Icon'
|
||||||
import { Image } from '../_shared/Image'
|
import { Image } from '../_shared/Image'
|
||||||
import { Lightbox } from '../_shared/Lightbox'
|
import { Lightbox } from '../_shared/Lightbox'
|
||||||
|
@ -289,8 +289,26 @@ export const FullArticle = (props: Props) => {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ogImage = props.article.cover
|
||||||
|
? getImageUrl(props.article.cover, { width: 1200 })
|
||||||
|
: getImageUrl('production/image/logo_image.png')
|
||||||
|
const description = getDescription(props.article.description || body())
|
||||||
|
const ogTitle = props.article.title
|
||||||
|
const keywords = getKeywords(props.article)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
<Meta name="descprition" content={description} />
|
||||||
|
<Meta name="keywords" content={keywords} />
|
||||||
|
<Meta name="og:type" content="article" />
|
||||||
|
<Meta name="og:title" content={ogTitle} />
|
||||||
|
<Meta name="og:image" content={ogImage} />
|
||||||
|
<Meta name="og:description" content={description} />
|
||||||
|
<Meta name="twitter:card" content="summary_large_image" />
|
||||||
|
<Meta name="twitter:title" content={ogTitle} />
|
||||||
|
<Meta name="twitter:description" content={description} />
|
||||||
|
<Meta name="twitter:image" content={ogImage} />
|
||||||
|
|
||||||
<For each={imageUrls()}>{(imageUrl) => <Link rel="preload" as="image" href={imageUrl} />}</For>
|
<For each={imageUrls()}>{(imageUrl) => <Link rel="preload" as="image" href={imageUrl} />}</For>
|
||||||
<div class="wide-container">
|
<div class="wide-container">
|
||||||
<div class="row position-relative">
|
<div class="row position-relative">
|
||||||
|
@ -450,7 +468,7 @@ export const FullArticle = (props: Props) => {
|
||||||
<div class={styles.shoutStatsItem} ref={triggerRef}>
|
<div class={styles.shoutStatsItem} ref={triggerRef}>
|
||||||
<SharePopup
|
<SharePopup
|
||||||
title={props.article.title}
|
title={props.article.title}
|
||||||
description={getDescription(props.article.body)}
|
description={description}
|
||||||
imageUrl={props.article.cover}
|
imageUrl={props.article.cover}
|
||||||
containerCssClass={stylesHeader.control}
|
containerCssClass={stylesHeader.control}
|
||||||
trigger={
|
trigger={
|
||||||
|
@ -484,7 +502,7 @@ export const FullArticle = (props: Props) => {
|
||||||
isOwner={canEdit()}
|
isOwner={canEdit()}
|
||||||
containerCssClass={clsx(stylesHeader.control, styles.articlePopupOpener)}
|
containerCssClass={clsx(stylesHeader.control, styles.articlePopupOpener)}
|
||||||
title={props.article.title}
|
title={props.article.title}
|
||||||
description={getDescription(props.article.body)}
|
description={description}
|
||||||
imageUrl={props.article.cover}
|
imageUrl={props.article.cover}
|
||||||
shareUrl={getShareUrl({ pathname: `/${props.article.slug}` })}
|
shareUrl={getShareUrl({ pathname: `/${props.article.slug}` })}
|
||||||
trigger={
|
trigger={
|
||||||
|
|
|
@ -17,7 +17,7 @@ export const Footer = () => {
|
||||||
header: 'About the project',
|
header: 'About the project',
|
||||||
items: [
|
items: [
|
||||||
{
|
{
|
||||||
title: 'Manifest',
|
title: 'Discours Manifest',
|
||||||
slug: '/about/manifest',
|
slug: '/about/manifest',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -51,7 +51,7 @@ export const Footer = () => {
|
||||||
slug: '/create',
|
slug: '/create',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Support us',
|
title: 'Support Discours',
|
||||||
slug: '/about/help',
|
slug: '/about/help',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
@ -46,7 +46,7 @@ export type ArticleCardProps = {
|
||||||
withViewed?: boolean
|
withViewed?: boolean
|
||||||
noAuthorLink?: boolean
|
noAuthorLink?: boolean
|
||||||
}
|
}
|
||||||
desktopCoverSize: 'XS' | 'S' | 'M' | 'L'
|
desktopCoverSize?: 'XS' | 'S' | 'M' | 'L'
|
||||||
article: Shout
|
article: Shout
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,6 +114,7 @@ export const ArticleCard = (props: ArticleCardProps) => {
|
||||||
const [isCoverImageLoadError, setIsCoverImageLoadError] = createSignal(false)
|
const [isCoverImageLoadError, setIsCoverImageLoadError] = createSignal(false)
|
||||||
const [isCoverImageLoading, setIsCoverImageLoading] = createSignal(true)
|
const [isCoverImageLoading, setIsCoverImageLoading] = createSignal(true)
|
||||||
|
|
||||||
|
const description = getDescription(props.article.body)
|
||||||
return (
|
return (
|
||||||
<section
|
<section
|
||||||
class={clsx(styles.shoutCard, props.settings?.additionalClass, {
|
class={clsx(styles.shoutCard, props.settings?.additionalClass, {
|
||||||
|
@ -325,7 +326,7 @@ export const ArticleCard = (props: ArticleCardProps) => {
|
||||||
<SharePopup
|
<SharePopup
|
||||||
containerCssClass={stylesHeader.control}
|
containerCssClass={stylesHeader.control}
|
||||||
title={title}
|
title={title}
|
||||||
description={getDescription(props.article.body)}
|
description={description}
|
||||||
imageUrl={props.article.cover}
|
imageUrl={props.article.cover}
|
||||||
shareUrl={getShareUrl({ pathname: `/${props.article.slug}` })}
|
shareUrl={getShareUrl({ pathname: `/${props.article.slug}` })}
|
||||||
isVisible={(value) => setIsActionPopupActive(value)}
|
isVisible={(value) => setIsActionPopupActive(value)}
|
||||||
|
@ -348,7 +349,7 @@ export const ArticleCard = (props: ArticleCardProps) => {
|
||||||
isOwner={canEdit()}
|
isOwner={canEdit()}
|
||||||
containerCssClass={stylesHeader.control}
|
containerCssClass={stylesHeader.control}
|
||||||
title={title}
|
title={title}
|
||||||
description={getDescription(props.article.body)}
|
description={description}
|
||||||
imageUrl={props.article.cover}
|
imageUrl={props.article.cover}
|
||||||
shareUrl={getShareUrl({ pathname: `/${props.article.slug}` })}
|
shareUrl={getShareUrl({ pathname: `/${props.article.slug}` })}
|
||||||
isVisible={(value) => setIsActionPopupActive(value)}
|
isVisible={(value) => setIsActionPopupActive(value)}
|
||||||
|
|
|
@ -29,12 +29,6 @@
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
a:hover {
|
|
||||||
.sidebarItemName {
|
|
||||||
background: #000;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.userpic {
|
.userpic {
|
||||||
margin-right: 1.2rem;
|
margin-right: 1.2rem;
|
||||||
}
|
}
|
||||||
|
@ -108,12 +102,13 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
img {
|
.sidebarItemName,
|
||||||
filter: invert(1);
|
.counter {
|
||||||
|
background: var(--background-color-invert);
|
||||||
}
|
}
|
||||||
|
|
||||||
.counter {
|
img {
|
||||||
background: #000;
|
filter: invert(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
.confirmModalTitle {
|
.confirmModalTitle {
|
||||||
@include font-size(3.2rem);
|
@include font-size(3.2rem);
|
||||||
|
|
||||||
color: var(--default-color);
|
color: var(--default-color);
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
margin: 0 3rem;
|
margin: 0 3rem;
|
||||||
|
|
|
@ -259,7 +259,7 @@ export const ProfileSettings = () => {
|
||||||
</Show>
|
</Show>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h4>{t('Address on Discourse')}</h4>
|
<h4>{t('Address on Discours')}</h4>
|
||||||
<div class="pretty-form__item">
|
<div class="pretty-form__item">
|
||||||
<div class={styles.discoursName}>
|
<div class={styles.discoursName}>
|
||||||
<label for="user-address">https://{hostname()}/author/</label>
|
<label for="user-address">https://{hostname()}/author/</label>
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import type { Author } from '../../graphql/schema/core.gen'
|
import type { Author } from '../../graphql/schema/core.gen'
|
||||||
|
|
||||||
|
import { Meta } from '@solidjs/meta'
|
||||||
import { clsx } from 'clsx'
|
import { clsx } from 'clsx'
|
||||||
import { createEffect, createMemo, createSignal, For, Show } from 'solid-js'
|
import { createEffect, createMemo, createSignal, For, Show } from 'solid-js'
|
||||||
|
|
||||||
|
@ -7,7 +8,9 @@ import { useLocalize } from '../../context/localize'
|
||||||
import { useRouter } from '../../stores/router'
|
import { useRouter } from '../../stores/router'
|
||||||
import { setAuthorsSort, useAuthorsStore } from '../../stores/zine/authors'
|
import { setAuthorsSort, useAuthorsStore } from '../../stores/zine/authors'
|
||||||
import { dummyFilter } from '../../utils/dummyFilter'
|
import { dummyFilter } from '../../utils/dummyFilter'
|
||||||
|
import { getImageUrl } from '../../utils/getImageUrl'
|
||||||
import { scrollHandler } from '../../utils/scroll'
|
import { scrollHandler } from '../../utils/scroll'
|
||||||
|
import { Loading } from '../_shared/Loading'
|
||||||
import { SearchField } from '../_shared/SearchField'
|
import { SearchField } from '../_shared/SearchField'
|
||||||
import { AuthorBadge } from '../Author/AuthorBadge'
|
import { AuthorBadge } from '../Author/AuthorBadge'
|
||||||
|
|
||||||
|
@ -17,14 +20,15 @@ type AllAuthorsPageSearchParams = {
|
||||||
by: '' | 'name' | 'shouts' | 'followers'
|
by: '' | 'name' | 'shouts' | 'followers'
|
||||||
}
|
}
|
||||||
|
|
||||||
type AllAuthorsViewProps = {
|
type Props = {
|
||||||
authors: Author[]
|
authors: Author[]
|
||||||
|
isLoaded: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
const PAGE_SIZE = 20
|
const PAGE_SIZE = 20
|
||||||
const ALPHABET = [...'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ@']
|
const ALPHABET = [...'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ@']
|
||||||
|
|
||||||
export const AllAuthorsView = (props: AllAuthorsViewProps) => {
|
export const AllAuthorsView = (props: Props) => {
|
||||||
const { t, lang } = useLocalize()
|
const { t, lang } = useLocalize()
|
||||||
const [limit, setLimit] = createSignal(PAGE_SIZE)
|
const [limit, setLimit] = createSignal(PAGE_SIZE)
|
||||||
const { searchParams, changeSearchParam } = useRouter<AllAuthorsPageSearchParams>()
|
const { searchParams, changeSearchParam } = useRouter<AllAuthorsPageSearchParams>()
|
||||||
|
@ -82,7 +86,25 @@ export const AllAuthorsView = (props: AllAuthorsViewProps) => {
|
||||||
})
|
})
|
||||||
|
|
||||||
const showMore = () => setLimit((oldLimit) => oldLimit + PAGE_SIZE)
|
const showMore = () => setLimit((oldLimit) => oldLimit + PAGE_SIZE)
|
||||||
const AllAuthorsHead = () => (
|
|
||||||
|
const ogImage = getImageUrl('production/image/logo_image.png')
|
||||||
|
const ogTitle = t('Authors')
|
||||||
|
const description = t('List of authors of the open editorial community')
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div class={clsx(styles.allAuthorsPage, 'wide-container')}>
|
||||||
|
<Meta name="descprition" content={description} />
|
||||||
|
<Meta name="keywords" content={t('keywords')} />
|
||||||
|
<Meta name="og:type" content="article" />
|
||||||
|
<Meta name="og:title" content={ogTitle} />
|
||||||
|
<Meta name="og:image" content={ogImage} />
|
||||||
|
<Meta name="twitter:image" content={ogImage} />
|
||||||
|
<Meta name="og:description" content={description} />
|
||||||
|
<Meta name="twitter:card" content="summary_large_image" />
|
||||||
|
<Meta name="twitter:title" content={ogTitle} />
|
||||||
|
<Meta name="twitter:description" content={description} />
|
||||||
|
<Show when={props.isLoaded} fallback={<Loading />}>
|
||||||
|
<div class="offset-md-5">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-lg-20 col-xl-18">
|
<div class="col-lg-20 col-xl-18">
|
||||||
<h1>{t('Authors')}</h1>
|
<h1>{t('Authors')}</h1>
|
||||||
|
@ -109,14 +131,8 @@ export const AllAuthorsView = (props: AllAuthorsViewProps) => {
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div class={clsx(styles.allAuthorsPage, 'wide-container')}>
|
|
||||||
<Show when={sortedAuthors().length > 0}>
|
<Show when={sortedAuthors().length > 0}>
|
||||||
<div class="offset-md-5">
|
|
||||||
<AllAuthorsHead />
|
|
||||||
|
|
||||||
<Show when={searchParams().by === 'name'}>
|
<Show when={searchParams().by === 'name'}>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-lg-20 col-xl-18">
|
<div class="col-lg-20 col-xl-18">
|
||||||
|
@ -190,6 +206,7 @@ export const AllAuthorsView = (props: AllAuthorsViewProps) => {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</Show>
|
</Show>
|
||||||
|
</Show>
|
||||||
</div>
|
</div>
|
||||||
</Show>
|
</Show>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import type { Topic } from '../../graphql/schema/core.gen'
|
import type { Topic } from '../../graphql/schema/core.gen'
|
||||||
|
|
||||||
|
import { Meta } from '@solidjs/meta'
|
||||||
import { clsx } from 'clsx'
|
import { clsx } from 'clsx'
|
||||||
import { createEffect, createMemo, createSignal, For, Show } from 'solid-js'
|
import { createEffect, createMemo, createSignal, For, Show } from 'solid-js'
|
||||||
|
|
||||||
|
@ -9,7 +10,9 @@ import { useRouter } from '../../stores/router'
|
||||||
import { setTopicsSort, useTopicsStore } from '../../stores/zine/topics'
|
import { setTopicsSort, useTopicsStore } from '../../stores/zine/topics'
|
||||||
import { capitalize } from '../../utils/capitalize'
|
import { capitalize } from '../../utils/capitalize'
|
||||||
import { dummyFilter } from '../../utils/dummyFilter'
|
import { dummyFilter } from '../../utils/dummyFilter'
|
||||||
|
import { getImageUrl } from '../../utils/getImageUrl'
|
||||||
import { scrollHandler } from '../../utils/scroll'
|
import { scrollHandler } from '../../utils/scroll'
|
||||||
|
import { Loading } from '../_shared/Loading'
|
||||||
import { SearchField } from '../_shared/SearchField'
|
import { SearchField } from '../_shared/SearchField'
|
||||||
import { TopicCard } from '../Topic/Card'
|
import { TopicCard } from '../Topic/Card'
|
||||||
|
|
||||||
|
@ -19,13 +22,14 @@ type AllTopicsPageSearchParams = {
|
||||||
by: 'shouts' | 'authors' | 'title' | ''
|
by: 'shouts' | 'authors' | 'title' | ''
|
||||||
}
|
}
|
||||||
|
|
||||||
type AllTopicsViewProps = {
|
type Props = {
|
||||||
topics: Topic[]
|
topics: Topic[]
|
||||||
|
isLoaded: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
const PAGE_SIZE = 20
|
const PAGE_SIZE = 20
|
||||||
|
|
||||||
export const AllTopicsView = (props: AllTopicsViewProps) => {
|
export const AllTopicsView = (props: Props) => {
|
||||||
const { t, lang } = useLocalize()
|
const { t, lang } = useLocalize()
|
||||||
const { searchParams, changeSearchParam } = useRouter<AllTopicsPageSearchParams>()
|
const { searchParams, changeSearchParam } = useRouter<AllTopicsPageSearchParams>()
|
||||||
const [limit, setLimit] = createSignal(PAGE_SIZE)
|
const [limit, setLimit] = createSignal(PAGE_SIZE)
|
||||||
|
@ -106,8 +110,25 @@ export const AllTopicsView = (props: AllTopicsViewProps) => {
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const ogImage = getImageUrl('production/image/logo_image.png')
|
||||||
|
const ogTitle = t('Themes and plots')
|
||||||
|
const description = t(
|
||||||
|
'Thematic table of contents of the magazine. Here you can find all the topics that the community authors wrote about',
|
||||||
|
)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div class={clsx(styles.allTopicsPage, 'wide-container')}>
|
<div class={clsx(styles.allTopicsPage, 'wide-container')}>
|
||||||
|
<Meta name="descprition" content={description} />
|
||||||
|
<Meta name="keywords" content={t('keywords')} />
|
||||||
|
<Meta name="og:type" content="article" />
|
||||||
|
<Meta name="og:title" content={ogTitle} />
|
||||||
|
<Meta name="og:image" content={ogImage} />
|
||||||
|
<Meta name="twitter:image" content={ogImage} />
|
||||||
|
<Meta name="og:description" content={description} />
|
||||||
|
<Meta name="twitter:card" content="summary_large_image" />
|
||||||
|
<Meta name="twitter:title" content={ogTitle} />
|
||||||
|
<Meta name="twitter:description" content={description} />
|
||||||
|
<Show when={props.isLoaded} fallback={<Loading />}>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-19 offset-md-5">
|
<div class="col-md-19 offset-md-5">
|
||||||
<AllTopicsHead />
|
<AllTopicsHead />
|
||||||
|
@ -204,6 +225,7 @@ export const AllTopicsView = (props: AllTopicsViewProps) => {
|
||||||
</Show>
|
</Show>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</Show>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import type { Author, Shout, Topic } from '../../../graphql/schema/core.gen'
|
import type { Author, Shout, Topic } from '../../../graphql/schema/core.gen'
|
||||||
|
|
||||||
import { getPagePath } from '@nanostores/router'
|
import { getPagePath } from '@nanostores/router'
|
||||||
|
import { Meta } from '@solidjs/meta'
|
||||||
import { clsx } from 'clsx'
|
import { clsx } from 'clsx'
|
||||||
import { Show, createMemo, createSignal, Switch, onMount, For, Match, createEffect } from 'solid-js'
|
import { Show, createMemo, createSignal, Switch, onMount, For, Match, createEffect } from 'solid-js'
|
||||||
|
|
||||||
|
@ -9,6 +10,8 @@ import { apiClient } from '../../../graphql/client/core'
|
||||||
import { router, useRouter } from '../../../stores/router'
|
import { router, useRouter } from '../../../stores/router'
|
||||||
import { loadShouts, useArticlesStore } from '../../../stores/zine/articles'
|
import { loadShouts, useArticlesStore } from '../../../stores/zine/articles'
|
||||||
import { useAuthorsStore } from '../../../stores/zine/authors'
|
import { useAuthorsStore } from '../../../stores/zine/authors'
|
||||||
|
import { getImageUrl } from '../../../utils/getImageUrl'
|
||||||
|
import { getDescription } from '../../../utils/meta'
|
||||||
import { restoreScrollPosition, saveScrollPosition } from '../../../utils/scroll'
|
import { restoreScrollPosition, saveScrollPosition } from '../../../utils/scroll'
|
||||||
import { splitToPages } from '../../../utils/splitToPages'
|
import { splitToPages } from '../../../utils/splitToPages'
|
||||||
import { Loading } from '../../_shared/Loading'
|
import { Loading } from '../../_shared/Loading'
|
||||||
|
@ -127,8 +130,23 @@ export const AuthorView = (props: Props) => {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const ogImage = props.author?.userpic
|
||||||
|
? getImageUrl(props.author.userpic, { width: 1200 })
|
||||||
|
: getImageUrl('production/image/logo_image.png')
|
||||||
|
const description = getDescription(props.author?.bio)
|
||||||
|
const ogTitle = props.author?.name
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div class={styles.authorPage}>
|
<div class={styles.authorPage}>
|
||||||
|
<Meta name="descprition" content={description} />
|
||||||
|
<Meta name="og:type" content="profile" />
|
||||||
|
<Meta name="og:title" content={ogTitle} />
|
||||||
|
<Meta name="og:image" content={ogImage} />
|
||||||
|
<Meta name="og:description" content={description} />
|
||||||
|
<Meta name="twitter:card" content="summary_large_image" />
|
||||||
|
<Meta name="twitter:title" content={ogTitle} />
|
||||||
|
<Meta name="twitter:description" content={description} />
|
||||||
|
<Meta name="twitter:image" content={ogImage} />
|
||||||
<div class="wide-container">
|
<div class="wide-container">
|
||||||
<Show when={author()} fallback={<Loading />}>
|
<Show when={author()} fallback={<Loading />}>
|
||||||
<>
|
<>
|
||||||
|
|
|
@ -3,38 +3,63 @@ import { clsx } from 'clsx'
|
||||||
import { createEffect, createMemo, createSignal, For, on, onCleanup, onMount, Show } from 'solid-js'
|
import { createEffect, createMemo, createSignal, For, on, onCleanup, onMount, Show } from 'solid-js'
|
||||||
|
|
||||||
import { useLocalize } from '../../../context/localize'
|
import { useLocalize } from '../../../context/localize'
|
||||||
import { LoadShoutsOptions, Shout } from '../../../graphql/schema/core.gen'
|
import {
|
||||||
|
LoadRandomTopShoutsParams,
|
||||||
|
LoadShoutsFilters,
|
||||||
|
LoadShoutsOptions,
|
||||||
|
Shout,
|
||||||
|
} from '../../../graphql/schema/core.gen'
|
||||||
import { LayoutType } from '../../../pages/types'
|
import { LayoutType } from '../../../pages/types'
|
||||||
import { router, useRouter } from '../../../stores/router'
|
import { router } from '../../../stores/router'
|
||||||
import { loadShouts, resetSortedArticles, useArticlesStore } from '../../../stores/zine/articles'
|
import { loadShouts, resetSortedArticles, useArticlesStore } from '../../../stores/zine/articles'
|
||||||
|
import { apiClient } from '../../../utils/apiClient'
|
||||||
|
import { getServerDate } from '../../../utils/getServerDate'
|
||||||
import { restoreScrollPosition, saveScrollPosition } from '../../../utils/scroll'
|
import { restoreScrollPosition, saveScrollPosition } from '../../../utils/scroll'
|
||||||
import { splitToPages } from '../../../utils/splitToPages'
|
import { splitToPages } from '../../../utils/splitToPages'
|
||||||
import { Button } from '../../_shared/Button'
|
import { Button } from '../../_shared/Button'
|
||||||
import { ConditionalWrapper } from '../../_shared/ConditionalWrapper'
|
import { ConditionalWrapper } from '../../_shared/ConditionalWrapper'
|
||||||
import { Loading } from '../../_shared/Loading'
|
import { Loading } from '../../_shared/Loading'
|
||||||
|
import { ArticleCardSwiper } from '../../_shared/SolidSwiper/ArticleCardSwiper'
|
||||||
import { ArticleCard } from '../../Feed/ArticleCard'
|
import { ArticleCard } from '../../Feed/ArticleCard'
|
||||||
|
|
||||||
import styles from './Expo.module.scss'
|
import styles from './Expo.module.scss'
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
shouts: Shout[]
|
shouts: Shout[]
|
||||||
|
layout: LayoutType
|
||||||
}
|
}
|
||||||
export const PRERENDERED_ARTICLES_COUNT = 28
|
|
||||||
|
export const PRERENDERED_ARTICLES_COUNT = 24
|
||||||
const LOAD_MORE_PAGE_SIZE = 16
|
const LOAD_MORE_PAGE_SIZE = 16
|
||||||
|
|
||||||
export const Expo = (props: Props) => {
|
export const Expo = (props: Props) => {
|
||||||
const [isLoaded, setIsLoaded] = createSignal<boolean>(Boolean(props.shouts))
|
const [isLoaded, setIsLoaded] = createSignal<boolean>(Boolean(props.shouts))
|
||||||
const [isLoadMoreButtonVisible, setIsLoadMoreButtonVisible] = createSignal(false)
|
const [isLoadMoreButtonVisible, setIsLoadMoreButtonVisible] = createSignal(false)
|
||||||
|
|
||||||
|
const [randomTopArticles, setRandomTopArticles] = createSignal<Shout[]>([])
|
||||||
|
const [randomTopMonthArticles, setRandomTopMonthArticles] = createSignal<Shout[]>([])
|
||||||
|
|
||||||
const { t } = useLocalize()
|
const { t } = useLocalize()
|
||||||
const { page: getPage } = useRouter()
|
|
||||||
const getLayout = createMemo<LayoutType>(() => getPage().params['layout'] as LayoutType)
|
|
||||||
const { sortedArticles } = useArticlesStore({
|
const { sortedArticles } = useArticlesStore({
|
||||||
shouts: isLoaded() ? props.shouts : [],
|
shouts: isLoaded() ? props.shouts : [],
|
||||||
})
|
})
|
||||||
|
|
||||||
const loadMore = async (count) => {
|
const getLoadShoutsFilters = (filters: LoadShoutsFilters = {}): LoadShoutsFilters => {
|
||||||
saveScrollPosition()
|
const result = { ...filters }
|
||||||
|
|
||||||
|
if (props.layout) {
|
||||||
|
filters.layout = props.layout
|
||||||
|
} else {
|
||||||
|
filters.excludeLayout = 'article'
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
const loadMore = async (count: number) => {
|
||||||
const options: LoadShoutsOptions = {
|
const options: LoadShoutsOptions = {
|
||||||
|
filters: getLoadShoutsFilters(),
|
||||||
limit: count,
|
limit: count,
|
||||||
offset: sortedArticles().length,
|
offset: sortedArticles().length,
|
||||||
}
|
}
|
||||||
|
@ -45,9 +70,39 @@ export const Expo = (props: Props) => {
|
||||||
|
|
||||||
const { hasMore } = await loadShouts(options)
|
const { hasMore } = await loadShouts(options)
|
||||||
setIsLoadMoreButtonVisible(hasMore)
|
setIsLoadMoreButtonVisible(hasMore)
|
||||||
|
}
|
||||||
|
|
||||||
|
const loadMoreWithoutScrolling = async (count: number) => {
|
||||||
|
saveScrollPosition()
|
||||||
|
await loadMore(count)
|
||||||
restoreScrollPosition()
|
restoreScrollPosition()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const loadRandomTopArticles = async () => {
|
||||||
|
const params: LoadRandomTopShoutsParams = {
|
||||||
|
filters: getLoadShoutsFilters(),
|
||||||
|
limit: 10,
|
||||||
|
fromRandomCount: 100,
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = await apiClient.getRandomTopShouts(params)
|
||||||
|
setRandomTopArticles(result)
|
||||||
|
}
|
||||||
|
|
||||||
|
const loadRandomTopMonthArticles = async () => {
|
||||||
|
const now = new Date()
|
||||||
|
const fromDate = getServerDate(new Date(now.setMonth(now.getMonth() - 1)))
|
||||||
|
|
||||||
|
const params: LoadRandomTopShoutsParams = {
|
||||||
|
filters: getLoadShoutsFilters({ fromDate }),
|
||||||
|
limit: 10,
|
||||||
|
fromRandomCount: 10,
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = await apiClient.getRandomTopShouts(params)
|
||||||
|
setRandomTopMonthArticles(result)
|
||||||
|
}
|
||||||
|
|
||||||
const pages = createMemo<Shout[][]>(() =>
|
const pages = createMemo<Shout[][]>(() =>
|
||||||
splitToPages(sortedArticles(), PRERENDERED_ARTICLES_COUNT, LOAD_MORE_PAGE_SIZE),
|
splitToPages(sortedArticles(), PRERENDERED_ARTICLES_COUNT, LOAD_MORE_PAGE_SIZE),
|
||||||
)
|
)
|
||||||
|
@ -65,14 +120,21 @@ export const Expo = (props: Props) => {
|
||||||
if (sortedArticles().length === PRERENDERED_ARTICLES_COUNT) {
|
if (sortedArticles().length === PRERENDERED_ARTICLES_COUNT) {
|
||||||
loadMore(LOAD_MORE_PAGE_SIZE)
|
loadMore(LOAD_MORE_PAGE_SIZE)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
loadRandomTopArticles()
|
||||||
|
loadRandomTopMonthArticles()
|
||||||
})
|
})
|
||||||
|
|
||||||
createEffect(
|
createEffect(
|
||||||
on(
|
on(
|
||||||
() => getLayout(),
|
() => props.layout,
|
||||||
() => {
|
() => {
|
||||||
resetSortedArticles()
|
resetSortedArticles()
|
||||||
|
setRandomTopArticles([])
|
||||||
|
setRandomTopMonthArticles([])
|
||||||
loadMore(PRERENDERED_ARTICLES_COUNT + LOAD_MORE_PAGE_SIZE)
|
loadMore(PRERENDERED_ARTICLES_COUNT + LOAD_MORE_PAGE_SIZE)
|
||||||
|
loadRandomTopArticles()
|
||||||
|
loadRandomTopMonthArticles()
|
||||||
},
|
},
|
||||||
{ defer: true },
|
{ defer: true },
|
||||||
),
|
),
|
||||||
|
@ -83,7 +145,7 @@ export const Expo = (props: Props) => {
|
||||||
})
|
})
|
||||||
|
|
||||||
const handleLoadMoreClick = () => {
|
const handleLoadMoreClick = () => {
|
||||||
loadMore(LOAD_MORE_PAGE_SIZE)
|
loadMoreWithoutScrolling(LOAD_MORE_PAGE_SIZE)
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
@ -91,19 +153,19 @@ export const Expo = (props: Props) => {
|
||||||
<Show when={sortedArticles().length > 0} fallback={<Loading />}>
|
<Show when={sortedArticles().length > 0} fallback={<Loading />}>
|
||||||
<div class="wide-container">
|
<div class="wide-container">
|
||||||
<ul class={clsx('view-switcher', styles.navigation)}>
|
<ul class={clsx('view-switcher', styles.navigation)}>
|
||||||
<li class={clsx({ 'view-switcher__item--selected': !getLayout() })}>
|
<li class={clsx({ 'view-switcher__item--selected': !props.layout })}>
|
||||||
<ConditionalWrapper
|
<ConditionalWrapper
|
||||||
condition={Boolean(getLayout())}
|
condition={Boolean(props.layout)}
|
||||||
wrapper={(children) => <a href={getPagePath(router, 'expo')}>{children}</a>}
|
wrapper={(children) => <a href={getPagePath(router, 'expo', { layout: '' })}>{children}</a>}
|
||||||
>
|
>
|
||||||
<span class={clsx('linkReplacement')}>{t('All')}</span>
|
<span class={clsx('linkReplacement')}>{t('All')}</span>
|
||||||
</ConditionalWrapper>
|
</ConditionalWrapper>
|
||||||
</li>
|
</li>
|
||||||
<li class={clsx({ 'view-switcher__item--selected': getLayout() === 'literature' })}>
|
<li class={clsx({ 'view-switcher__item--selected': props.layout === 'literature' })}>
|
||||||
<ConditionalWrapper
|
<ConditionalWrapper
|
||||||
condition={getLayout() !== 'literature'}
|
condition={props.layout !== 'literature'}
|
||||||
wrapper={(children) => (
|
wrapper={(children) => (
|
||||||
<a href={getPagePath(router, 'expoLayout', { layout: 'literature' })}>{children}</a>
|
<a href={getPagePath(router, 'expo', { layout: 'literature' })}>{children}</a>
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<span class={clsx('linkReplacement')}>{t('Literature')}</span>
|
<span class={clsx('linkReplacement')}>{t('Literature')}</span>
|
||||||
|
@ -119,21 +181,21 @@ export const Expo = (props: Props) => {
|
||||||
<span class={clsx('linkReplacement')}>{t('Music')}</span>
|
<span class={clsx('linkReplacement')}>{t('Music')}</span>
|
||||||
</ConditionalWrapper>
|
</ConditionalWrapper>
|
||||||
</li>
|
</li>
|
||||||
<li class={clsx({ 'view-switcher__item--selected': getLayout() === 'image' })}>
|
<li class={clsx({ 'view-switcher__item--selected': props.layout === 'image' })}>
|
||||||
<ConditionalWrapper
|
<ConditionalWrapper
|
||||||
condition={getLayout() !== 'image'}
|
condition={props.layout !== 'image'}
|
||||||
wrapper={(children) => (
|
wrapper={(children) => (
|
||||||
<a href={getPagePath(router, 'expoLayout', { layout: 'image' })}>{children}</a>
|
<a href={getPagePath(router, 'expo', { layout: 'image' })}>{children}</a>
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<span class={clsx('linkReplacement')}>{t('Gallery')}</span>
|
<span class={clsx('linkReplacement')}>{t('Gallery')}</span>
|
||||||
</ConditionalWrapper>
|
</ConditionalWrapper>
|
||||||
</li>
|
</li>
|
||||||
<li class={clsx({ 'view-switcher__item--selected': getLayout() === 'video' })}>
|
<li class={clsx({ 'view-switcher__item--selected': props.layout === 'video' })}>
|
||||||
<ConditionalWrapper
|
<ConditionalWrapper
|
||||||
condition={getLayout() !== 'video'}
|
condition={props.layout !== 'video'}
|
||||||
wrapper={(children) => (
|
wrapper={(children) => (
|
||||||
<a href={getPagePath(router, 'expoLayout', { layout: 'video' })}>{children}</a>
|
<a href={getPagePath(router, 'expo', { layout: 'video' })}>{children}</a>
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<span class={clsx('cursorPointer linkReplacement')}>{t('Video')}</span>
|
<span class={clsx('cursorPointer linkReplacement')}>{t('Video')}</span>
|
||||||
|
@ -141,7 +203,7 @@ export const Expo = (props: Props) => {
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<For each={sortedArticles().slice(0, PRERENDERED_ARTICLES_COUNT)}>
|
<For each={sortedArticles().slice(0, PRERENDERED_ARTICLES_COUNT / 2)}>
|
||||||
{(shout) => (
|
{(shout) => (
|
||||||
<div class="col-md-6 mt-md-5 col-sm-8 mt-sm-3">
|
<div class="col-md-6 mt-md-5 col-sm-8 mt-sm-3">
|
||||||
<ArticleCard
|
<ArticleCard
|
||||||
|
@ -152,6 +214,23 @@ export const Expo = (props: Props) => {
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</For>
|
</For>
|
||||||
|
<Show when={randomTopMonthArticles().length > 0} keyed={true}>
|
||||||
|
<ArticleCardSwiper title={t('Top month articles')} slides={randomTopMonthArticles()} />
|
||||||
|
</Show>
|
||||||
|
<For each={sortedArticles().slice(PRERENDERED_ARTICLES_COUNT / 2, PRERENDERED_ARTICLES_COUNT)}>
|
||||||
|
{(shout) => (
|
||||||
|
<div class="col-md-6 mt-md-5 col-sm-8 mt-sm-3">
|
||||||
|
<ArticleCard
|
||||||
|
article={shout}
|
||||||
|
settings={{ nodate: true, nosubtitle: true, noAuthorLink: true }}
|
||||||
|
desktopCoverSize="XS"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</For>
|
||||||
|
<Show when={randomTopArticles().length > 0} keyed={true}>
|
||||||
|
<ArticleCardSwiper title={t('Favorite')} slides={randomTopArticles()} />
|
||||||
|
</Show>
|
||||||
<For each={pages()}>
|
<For each={pages()}>
|
||||||
{(page) => (
|
{(page) => (
|
||||||
<For each={page}>
|
<For each={page}>
|
||||||
|
|
|
@ -1,28 +1,32 @@
|
||||||
import type { Author, LoadShoutsOptions, Reaction, Shout } from '../../graphql/schema/core.gen'
|
import type { Author, LoadShoutsOptions, Reaction, Shout } from '../../graphql/schema/core.gen'
|
||||||
|
|
||||||
import { getPagePath } from '@nanostores/router'
|
import { getPagePath } from '@nanostores/router'
|
||||||
|
import { Meta } from '@solidjs/meta'
|
||||||
import { clsx } from 'clsx'
|
import { clsx } from 'clsx'
|
||||||
import { createEffect, createSignal, For, on, onMount, Show } from 'solid-js'
|
import { createEffect, createSignal, For, on, onMount, Show } from 'solid-js'
|
||||||
|
|
||||||
import { useLocalize } from '../../context/localize'
|
import { useLocalize } from '../../../context/localize'
|
||||||
import { useReactions } from '../../context/reactions'
|
import { useReactions } from '../../../context/reactions'
|
||||||
import { router, useRouter } from '../../stores/router'
|
import { router, useRouter } from '../../../stores/router'
|
||||||
import { useArticlesStore, resetSortedArticles } from '../../stores/zine/articles'
|
import { useArticlesStore, resetSortedArticles } from '../../../stores/zine/articles'
|
||||||
import { useTopAuthorsStore } from '../../stores/zine/topAuthors'
|
import { useTopAuthorsStore } from '../../../stores/zine/topAuthors'
|
||||||
import { useTopicsStore } from '../../stores/zine/topics'
|
import { useTopicsStore } from '../../../stores/zine/topics'
|
||||||
import { Icon } from '../_shared/Icon'
|
import { apiClient } from '../../../utils/apiClient'
|
||||||
import { Loading } from '../_shared/Loading'
|
import { getImageUrl } from '../../../utils/getImageUrl'
|
||||||
import { CommentDate } from '../Article/CommentDate'
|
import { Icon } from '../../_shared/Icon'
|
||||||
import { AuthorLink } from '../Author/AhtorLink'
|
import { Loading } from '../../_shared/Loading'
|
||||||
import { AuthorBadge } from '../Author/AuthorBadge'
|
import { CommentDate } from '../../Article/CommentDate'
|
||||||
import { ArticleCard } from '../Feed/ArticleCard'
|
import { AuthorLink } from '../../Author/AhtorLink'
|
||||||
import { Sidebar } from '../Feed/Sidebar'
|
import { AuthorBadge } from '../../Author/AuthorBadge'
|
||||||
|
import { ArticleCard } from '../../Feed/ArticleCard'
|
||||||
|
import { Sidebar } from '../../Feed/Sidebar'
|
||||||
|
|
||||||
import styles from './Feed.module.scss'
|
import styles from './Feed.module.scss'
|
||||||
import stylesBeside from '../../components/Feed/Beside.module.scss'
|
import stylesBeside from '../../Feed/Beside.module.scss'
|
||||||
import stylesTopic from '../Feed/CardTopic.module.scss'
|
import stylesTopic from '../../Feed/CardTopic.module.scss'
|
||||||
|
|
||||||
export const FEED_PAGE_SIZE = 20
|
export const FEED_PAGE_SIZE = 20
|
||||||
|
const UNRATED_ARTICLES_COUNT = 5
|
||||||
|
|
||||||
type FeedSearchParams = {
|
type FeedSearchParams = {
|
||||||
by: 'publish_date' | 'rating' | 'last_comment'
|
by: 'publish_date' | 'rating' | 'last_comment'
|
||||||
|
@ -58,13 +62,20 @@ export const FeedView = (props: Props) => {
|
||||||
const { topAuthors } = useTopAuthorsStore()
|
const { topAuthors } = useTopAuthorsStore()
|
||||||
const [isLoadMoreButtonVisible, setIsLoadMoreButtonVisible] = createSignal(false)
|
const [isLoadMoreButtonVisible, setIsLoadMoreButtonVisible] = createSignal(false)
|
||||||
const [topComments, setTopComments] = createSignal<Reaction[]>([])
|
const [topComments, setTopComments] = createSignal<Reaction[]>([])
|
||||||
|
const [unratedArticles, setUnratedArticles] = createSignal<Shout[]>([])
|
||||||
|
|
||||||
const {
|
const {
|
||||||
actions: { loadReactionsBy },
|
actions: { loadReactionsBy },
|
||||||
} = useReactions()
|
} = useReactions()
|
||||||
|
|
||||||
|
const loadUnratedArticles = async () => {
|
||||||
|
const result = await apiClient.getUnratedShouts(UNRATED_ARTICLES_COUNT)
|
||||||
|
setUnratedArticles(result)
|
||||||
|
}
|
||||||
|
|
||||||
onMount(() => {
|
onMount(() => {
|
||||||
loadMore()
|
loadMore()
|
||||||
|
loadUnratedArticles()
|
||||||
})
|
})
|
||||||
|
|
||||||
createEffect(
|
createEffect(
|
||||||
|
@ -113,8 +124,24 @@ export const FeedView = (props: Props) => {
|
||||||
setTopComments(comments)
|
setTopComments(comments)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const ogImage = getImageUrl('production/image/logo_image.png')
|
||||||
|
const description = t(
|
||||||
|
'Independent media project about culture, science, art and society with horizontal editing',
|
||||||
|
)
|
||||||
|
const ogTitle = t('Feed')
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div class="wide-container feed">
|
<div class="wide-container feed">
|
||||||
|
<Meta name="descprition" content={description} />
|
||||||
|
<Meta name="keywords" content={t('keywords')} />
|
||||||
|
<Meta name="og:type" content="article" />
|
||||||
|
<Meta name="og:title" content={ogTitle} />
|
||||||
|
<Meta name="og:image" content={ogImage} />
|
||||||
|
<Meta name="twitter:image" content={ogImage} />
|
||||||
|
<Meta name="og:description" content={description} />
|
||||||
|
<Meta name="twitter:card" content="summary_large_image" />
|
||||||
|
<Meta name="twitter:title" content={ogTitle} />
|
||||||
|
<Meta name="twitter:description" content={description} />
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class={clsx('col-md-5 col-xl-4', styles.feedNavigation)}>
|
<div class={clsx('col-md-5 col-xl-4', styles.feedNavigation)}>
|
||||||
<Sidebar />
|
<Sidebar />
|
||||||
|
@ -253,6 +280,14 @@ export const FeedView = (props: Props) => {
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</section>
|
</section>
|
||||||
|
<Show when={unratedArticles().length > 0}>
|
||||||
|
<section class={clsx(styles.asideSection)}>
|
||||||
|
<h4>{t('Be the first to rate')}</h4>
|
||||||
|
<For each={unratedArticles()}>
|
||||||
|
{(article) => <ArticleCard article={article} settings={{ noimage: true, nodate: true }} />}
|
||||||
|
</For>
|
||||||
|
</section>
|
||||||
|
</Show>
|
||||||
</aside>
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
1
src/components/Views/Feed/index.ts
Normal file
1
src/components/Views/Feed/index.ts
Normal file
|
@ -0,0 +1 @@
|
||||||
|
export { Feed } from './Feed'
|
|
@ -72,7 +72,7 @@ export const ProfileSubscriptions = () => {
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-20 col-lg-18 col-xl-16">
|
<div class="col-md-20 col-lg-18 col-xl-16">
|
||||||
<h1>{t('My subscriptions')}</h1>
|
<h1>{t('My subscriptions')}</h1>
|
||||||
<p class="description">{t('Here you can manage all your Discourse subscriptions')}</p>
|
<p class="description">{t('Here you can manage all your Discours subscriptions')}</p>
|
||||||
<Show when={following()} fallback={<Loading />}>
|
<Show when={following()} fallback={<Loading />}>
|
||||||
<ul class="view-switcher">
|
<ul class="view-switcher">
|
||||||
<li class={clsx({ 'view-switcher__item--selected': subscriptionFilter() === 'all' })}>
|
<li class={clsx({ 'view-switcher__item--selected': subscriptionFilter() === 'all' })}>
|
||||||
|
|
|
@ -29,17 +29,14 @@ export const SearchView = (props: Props) => {
|
||||||
|
|
||||||
const { searchParams } = useRouter<SearchPageSearchParams>()
|
const { searchParams } = useRouter<SearchPageSearchParams>()
|
||||||
let searchEl: HTMLInputElement
|
let searchEl: HTMLInputElement
|
||||||
const handleQueryChange = (_ev) => {
|
const handleQueryChange = () => {
|
||||||
setQuery(searchEl.value)
|
setQuery(searchEl.value)
|
||||||
}
|
}
|
||||||
|
|
||||||
const loadMore = async () => {
|
const loadMore = async () => {
|
||||||
saveScrollPosition()
|
saveScrollPosition()
|
||||||
const { hasMore } = await loadShouts({
|
const { hasMore } = await loadShouts({
|
||||||
filters: {
|
filters: {},
|
||||||
title: query(),
|
|
||||||
body: query(),
|
|
||||||
},
|
|
||||||
offset: offset(),
|
offset: offset(),
|
||||||
limit: LOAD_MORE_PAGE_SIZE,
|
limit: LOAD_MORE_PAGE_SIZE,
|
||||||
})
|
})
|
||||||
|
|
|
@ -3,22 +3,21 @@ import { JSX } from 'solid-js'
|
||||||
import { PageLayout } from '../_shared/PageLayout'
|
import { PageLayout } from '../_shared/PageLayout'
|
||||||
import { TableOfContents } from '../TableOfContents'
|
import { TableOfContents } from '../TableOfContents'
|
||||||
|
|
||||||
export const StaticPage = (props: {
|
type Props = {
|
||||||
title: string
|
title: string
|
||||||
children: JSX.Element
|
children: JSX.Element
|
||||||
layoutChildren: JSX.Element
|
}
|
||||||
}) => {
|
export const StaticPage = (props: Props) => {
|
||||||
let articleBodyElement: HTMLElement | undefined
|
const articleBodyElement: { current: HTMLElement } = { current: null }
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<PageLayout title={props.title}>
|
<PageLayout title={props.title}>
|
||||||
{props.layoutChildren}
|
|
||||||
<div class="wide-container">
|
<div class="wide-container">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<article
|
<article
|
||||||
class="col-md-16 col-lg-14 col-xl-12 offset-md-5"
|
class="col-md-16 col-lg-14 col-xl-12 offset-md-5"
|
||||||
id="articleBody"
|
id="articleBody"
|
||||||
ref={articleBodyElement}
|
ref={(el) => (articleBodyElement.current = el)}
|
||||||
>
|
>
|
||||||
{props.children}
|
{props.children}
|
||||||
</article>
|
</article>
|
||||||
|
@ -27,7 +26,7 @@ export const StaticPage = (props: {
|
||||||
<TableOfContents
|
<TableOfContents
|
||||||
variant="article"
|
variant="article"
|
||||||
parentSelector="#articleBody"
|
parentSelector="#articleBody"
|
||||||
body={articleBodyElement.outerHTML}
|
body={articleBodyElement.current.outerHTML}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,15 +1,20 @@
|
||||||
import type { Shout, Topic } from '../../graphql/schema/core.gen'
|
import type { Shout, Topic } from '../../graphql/schema/core.gen'
|
||||||
|
|
||||||
|
import { Meta } from '@solidjs/meta'
|
||||||
import { clsx } from 'clsx'
|
import { clsx } from 'clsx'
|
||||||
import { For, Show, createMemo, onMount, createSignal } from 'solid-js'
|
import { For, Show, createMemo, onMount, createSignal, createEffect } from 'solid-js'
|
||||||
|
|
||||||
import { useLocalize } from '../../context/localize'
|
import { useLocalize } from '../../context/localize'
|
||||||
import { useRouter } from '../../stores/router'
|
import { useRouter } from '../../stores/router'
|
||||||
import { loadShouts, useArticlesStore } from '../../stores/zine/articles'
|
import { loadShouts, useArticlesStore } from '../../stores/zine/articles'
|
||||||
import { useAuthorsStore } from '../../stores/zine/authors'
|
import { useAuthorsStore } from '../../stores/zine/authors'
|
||||||
import { useTopicsStore } from '../../stores/zine/topics'
|
import { useTopicsStore } from '../../stores/zine/topics'
|
||||||
|
import { capitalize } from '../../utils/capitalize'
|
||||||
|
import { getImageUrl } from '../../utils/getImageUrl'
|
||||||
|
import { getDescription } from '../../utils/meta'
|
||||||
import { restoreScrollPosition, saveScrollPosition } from '../../utils/scroll'
|
import { restoreScrollPosition, saveScrollPosition } from '../../utils/scroll'
|
||||||
import { splitToPages } from '../../utils/splitToPages'
|
import { splitToPages } from '../../utils/splitToPages'
|
||||||
|
import { Loading } from '../_shared/Loading'
|
||||||
import { ArticleCardSwiper } from '../_shared/SolidSwiper/ArticleCardSwiper'
|
import { ArticleCardSwiper } from '../_shared/SolidSwiper/ArticleCardSwiper'
|
||||||
import { Beside } from '../Feed/Beside'
|
import { Beside } from '../Feed/Beside'
|
||||||
import { Row1 } from '../Feed/Row1'
|
import { Row1 } from '../Feed/Row1'
|
||||||
|
@ -23,16 +28,18 @@ type TopicsPageSearchParams = {
|
||||||
by: 'comments' | '' | 'recent' | 'viewed' | 'rating' | 'commented'
|
by: 'comments' | '' | 'recent' | 'viewed' | 'rating' | 'commented'
|
||||||
}
|
}
|
||||||
|
|
||||||
interface TopicProps {
|
interface Props {
|
||||||
topic: Topic
|
topic: Topic
|
||||||
shouts: Shout[]
|
shouts: Shout[]
|
||||||
topicSlug: string
|
topicSlug: string
|
||||||
|
isLoaded: boolean
|
||||||
|
title: (val: string) => string
|
||||||
}
|
}
|
||||||
|
|
||||||
export const PRERENDERED_ARTICLES_COUNT = 28
|
export const PRERENDERED_ARTICLES_COUNT = 28
|
||||||
const LOAD_MORE_PAGE_SIZE = 9 // Row3 + Row3 + Row3
|
const LOAD_MORE_PAGE_SIZE = 9 // Row3 + Row3 + Row3
|
||||||
|
|
||||||
export const TopicView = (props: TopicProps) => {
|
export const TopicView = (props: Props) => {
|
||||||
const { t } = useLocalize()
|
const { t } = useLocalize()
|
||||||
const { searchParams, changeSearchParam } = useRouter<TopicsPageSearchParams>()
|
const { searchParams, changeSearchParam } = useRouter<TopicsPageSearchParams>()
|
||||||
|
|
||||||
|
@ -80,8 +87,30 @@ export const TopicView = (props: TopicProps) => {
|
||||||
splitToPages(sortedArticles(), PRERENDERED_ARTICLES_COUNT, LOAD_MORE_PAGE_SIZE),
|
splitToPages(sortedArticles(), PRERENDERED_ARTICLES_COUNT, LOAD_MORE_PAGE_SIZE),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const pageTitle = `#${capitalize(topic().title, true)}`
|
||||||
|
createEffect(() => props.title(pageTitle))
|
||||||
|
|
||||||
|
const ogImage = topic().pic
|
||||||
|
? getImageUrl(topic().pic, { width: 1200 })
|
||||||
|
: getImageUrl('production/image/logo_image.png')
|
||||||
|
const description = topic().body
|
||||||
|
? getDescription(topic().body)
|
||||||
|
: t('The most interesting publications on the topic', { topicName: pageTitle })
|
||||||
|
const ogTitle = pageTitle
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div class={styles.topicPage}>
|
<div class={styles.topicPage}>
|
||||||
|
<Meta name="descprition" content={description} />
|
||||||
|
<Meta name="keywords" content={t('topicKeywords', { topic: topic().title })} />
|
||||||
|
<Meta name="og:type" content="article" />
|
||||||
|
<Meta name="og:title" content={ogTitle} />
|
||||||
|
<Meta name="og:image" content={ogImage} />
|
||||||
|
<Meta name="twitter:image" content={ogImage} />
|
||||||
|
<Meta name="og:description" content={description} />
|
||||||
|
<Meta name="twitter:card" content="summary_large_image" />
|
||||||
|
<Meta name="twitter:title" content={ogTitle} />
|
||||||
|
<Meta name="twitter:description" content={description} />
|
||||||
|
<Show when={props.isLoaded} fallback={<Loading />}>
|
||||||
<Show when={topic()}>
|
<Show when={topic()}>
|
||||||
<FullTopic topic={topic()} />
|
<FullTopic topic={topic()} />
|
||||||
<div class="wide-container">
|
<div class="wide-container">
|
||||||
|
@ -177,6 +206,7 @@ export const TopicView = (props: TopicProps) => {
|
||||||
</p>
|
</p>
|
||||||
</Show>
|
</Show>
|
||||||
</Show>
|
</Show>
|
||||||
|
</Show>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,6 +85,7 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&.mobileView {
|
&.mobileView {
|
||||||
.container {
|
.container {
|
||||||
flex-direction: column-reverse;
|
flex-direction: column-reverse;
|
||||||
|
@ -100,7 +101,7 @@
|
||||||
padding: 0;
|
padding: 0;
|
||||||
|
|
||||||
& swiper-slide {
|
& swiper-slide {
|
||||||
//bind to html element <swiper-slide/>
|
// bind to html element <swiper-slide/>
|
||||||
width: unset !important;
|
width: unset !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
0
src/graphql/graphQLClient.ts
Normal file
0
src/graphql/graphQLClient.ts
Normal file
46
src/graphql/query/articles-load-random-top.ts
Normal file
46
src/graphql/query/articles-load-random-top.ts
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
import { gql } from '@urql/core'
|
||||||
|
|
||||||
|
export default gql`
|
||||||
|
query LoadRandomTopShoutsQuery($params: LoadRandomTopShoutsParams) {
|
||||||
|
loadRandomTopShouts(params: $params) {
|
||||||
|
id
|
||||||
|
title
|
||||||
|
lead
|
||||||
|
description
|
||||||
|
subtitle
|
||||||
|
slug
|
||||||
|
layout
|
||||||
|
cover
|
||||||
|
lead
|
||||||
|
# community
|
||||||
|
mainTopic
|
||||||
|
topics {
|
||||||
|
id
|
||||||
|
title
|
||||||
|
body
|
||||||
|
slug
|
||||||
|
stat {
|
||||||
|
shouts
|
||||||
|
authors
|
||||||
|
followers
|
||||||
|
}
|
||||||
|
}
|
||||||
|
authors {
|
||||||
|
id
|
||||||
|
name
|
||||||
|
slug
|
||||||
|
userpic
|
||||||
|
createdAt
|
||||||
|
bio
|
||||||
|
}
|
||||||
|
createdAt
|
||||||
|
publishedAt
|
||||||
|
stat {
|
||||||
|
viewed
|
||||||
|
reacted
|
||||||
|
rating
|
||||||
|
commented
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
46
src/graphql/query/articles-load-unrated.ts
Normal file
46
src/graphql/query/articles-load-unrated.ts
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
import { gql } from '@urql/core'
|
||||||
|
|
||||||
|
export default gql`
|
||||||
|
query LoadUnratedShoutsQuery($limit: Int!) {
|
||||||
|
loadUnratedShouts(limit: $limit) {
|
||||||
|
id
|
||||||
|
title
|
||||||
|
lead
|
||||||
|
description
|
||||||
|
subtitle
|
||||||
|
slug
|
||||||
|
layout
|
||||||
|
cover
|
||||||
|
lead
|
||||||
|
# community
|
||||||
|
mainTopic
|
||||||
|
topics {
|
||||||
|
id
|
||||||
|
title
|
||||||
|
body
|
||||||
|
slug
|
||||||
|
stat {
|
||||||
|
shouts
|
||||||
|
authors
|
||||||
|
followers
|
||||||
|
}
|
||||||
|
}
|
||||||
|
authors {
|
||||||
|
id
|
||||||
|
name
|
||||||
|
slug
|
||||||
|
userpic
|
||||||
|
createdAt
|
||||||
|
bio
|
||||||
|
}
|
||||||
|
createdAt
|
||||||
|
publishedAt
|
||||||
|
stat {
|
||||||
|
viewed
|
||||||
|
reacted
|
||||||
|
rating
|
||||||
|
commented
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
0
src/graphql/types.gen.ts
Normal file
0
src/graphql/types.gen.ts
Normal file
|
@ -1,37 +1,52 @@
|
||||||
import { PageLayout } from '../../components/_shared/PageLayout'
|
import { Meta } from '@solidjs/meta'
|
||||||
|
|
||||||
|
import { StaticPage } from '../../components/Views/StaticPage'
|
||||||
import { useLocalize } from '../../context/localize'
|
import { useLocalize } from '../../context/localize'
|
||||||
|
import { getImageUrl } from '../../utils/getImageUrl'
|
||||||
|
|
||||||
export const DiscussionRulesPage = () => {
|
export const DiscussionRulesPage = () => {
|
||||||
const { t } = useLocalize()
|
const { t } = useLocalize()
|
||||||
const title = t('Discussion rules in social networks')
|
|
||||||
|
const ogImage = getImageUrl('production/image/logo_image.png')
|
||||||
|
const ogTitle = t('Community Discussion Rules')
|
||||||
|
const description = t(
|
||||||
|
'Why you can earn a hole in your karma and how to receive rays of gratitude for your contribution to discussions in samizdat communities',
|
||||||
|
)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<PageLayout title={title}>
|
<StaticPage title={ogTitle}>
|
||||||
<article class="wide-container container--static-page">
|
<article class="wide-container container--static-page">
|
||||||
<div class="row">
|
<Meta name="descprition" content={description} />
|
||||||
<div class="col-md-12 col-xl-14 offset-md-5 order-md-first">
|
<Meta name="keywords" content={t('principles keywords')} />
|
||||||
<h1>
|
<Meta name="og:type" content="article" />
|
||||||
<span class="wrapped" innerHTML={title} />
|
<Meta name="og:title" content={ogTitle} />
|
||||||
</h1>
|
<Meta name="og:image" content={ogImage} />
|
||||||
|
<Meta name="twitter:image" content={ogImage} />
|
||||||
|
<Meta name="og:description" content={description} />
|
||||||
|
<Meta name="twitter:card" content="summary_large_image" />
|
||||||
|
<Meta name="twitter:title" content={ogTitle} />
|
||||||
|
<Meta name="twitter:description" content={description} />
|
||||||
|
|
||||||
|
<h1>{ogTitle}</h1>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Открытая редакция существует благодаря дружному сообществу авторов
|
Открытая редакция существует благодаря дружному сообществу авторов и читателей —
|
||||||
и читателей — вдумчивых и сознательных людей, приверженных ценностям
|
вдумчивых и сознательных людей, приверженных ценностям гуманизма, демократии и прав
|
||||||
гуманизма, демократии и прав человека. Мы очень ценим атмосферу осмысленного
|
человека. Мы очень ценим атмосферу осмысленного общения, которая здесь сложилась. Чтобы
|
||||||
общения, которая здесь сложилась. Чтобы сохранить ее такой же уютной
|
сохранить ее такой же уютной и творческой, мы составили правила общения
|
||||||
и творческой, мы составили правила общения в сообществе, руководствуясь
|
в сообществе, руководствуясь которыми каждый мог бы соучаствовать в плодотворных
|
||||||
которыми каждый мог бы соучаствовать в плодотворных дискуссиях, не задевая
|
дискуссиях, не задевая других. Ключевой принцип этих правил предельно прост —
|
||||||
других. Ключевой принцип этих правил предельно прост — уважайте ближних,
|
уважайте ближних, постарайтесь не нарушать законы Российской Федерации без крайней
|
||||||
постарайтесь не нарушать законы Российской Федерации без крайней
|
на то необходимости и помните, что в дискуссиях чутких и здравомыслящих
|
||||||
на то необходимости и помните, что в дискуссиях чутких
|
людей рождается истина.
|
||||||
и здравомыслящих людей рождается истина.
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h3>За что можно получить дырку в карме и выиграть бан в сообществе</h3>
|
<h3>За что можно получить дырку в карме и выиграть бан в сообществе</h3>
|
||||||
<ol>
|
<ol>
|
||||||
<li>
|
<li>
|
||||||
<p>
|
<p>
|
||||||
Оскорбления, личные нападки, травля и угрозы. В любом виде. Конкретного человека
|
Оскорбления, личные нападки, травля и угрозы. В любом виде. Конкретного человека или
|
||||||
или социальной группы — не суть. Агрессия, переход на личности
|
социальной группы — не суть. Агрессия, переход на личности
|
||||||
и токсичность едва ли способствуют плодотворному общению.
|
и токсичность едва ли способствуют плодотворному общению.
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
|
@ -45,9 +60,8 @@ export const DiscussionRulesPage = () => {
|
||||||
|
|
||||||
<li>
|
<li>
|
||||||
<p>
|
<p>
|
||||||
Спам, реклама, фейкньюз, ссылки на пропагандистские СМИ, вбросы дезинформации,
|
Спам, реклама, фейкньюз, ссылки на пропагандистские СМИ, вбросы дезинформации, специально
|
||||||
специально уводящий от темы флуд, провокации, разжигание конфликтов, намеренный срыв
|
уводящий от темы флуд, провокации, разжигание конфликтов, намеренный срыв дискуссий.
|
||||||
дискуссий.
|
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
|
@ -67,35 +81,33 @@ export const DiscussionRulesPage = () => {
|
||||||
<ol>
|
<ol>
|
||||||
<li>
|
<li>
|
||||||
<p>
|
<p>
|
||||||
<strong>Вежливость и конструктивность.</strong> Мы выступаем
|
<strong>Вежливость и конструктивность.</strong> Мы выступаем за конструктивный
|
||||||
за конструктивный диалог, аргументированные комментарии и доброжелательное
|
диалог, аргументированные комментарии и доброжелательное отношение друг к другу.
|
||||||
отношение друг к другу. Задавайте содержательные вопросы, пишите развернутые
|
Задавайте содержательные вопросы, пишите развернутые комментарии, подкрепляйте
|
||||||
комментарии, подкрепляйте их аргументами, чтобы диалог был полезен всем участникам,
|
их аргументами, чтобы диалог был полезен всем участникам, помогая глубже понять тему
|
||||||
помогая глубже понять тему и разобраться в вопросе. И, пожалуйста, уважайте
|
и разобраться в вопросе. И, пожалуйста, уважайте собеседника, даже если он вам
|
||||||
собеседника, даже если он вам лично не импонирует: только так получаются
|
лично не импонирует: только так получаются продуктивные дискуссии.
|
||||||
продуктивные дискуссии.
|
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li>
|
<li>
|
||||||
<p>
|
<p>
|
||||||
<strong>Обмен знаниями и историями.</strong> Осмысленные высказывания по теме
|
<strong>Обмен знаниями и историями.</strong> Осмысленные высказывания по теме поста,
|
||||||
поста, оригинальные рассуждения, рассказы о личном опыте и проектах, обмен
|
оригинальные рассуждения, рассказы о личном опыте и проектах, обмен профессиональной
|
||||||
профессиональной экспертизой, наблюдения и реальные истории
|
экспертизой, наблюдения и реальные истории из жизни — чем больше
|
||||||
из жизни — чем больше мы делимся друг с другом знаниями, тем
|
мы делимся друг с другом знаниями, тем интереснее и плодотворнее становится
|
||||||
интереснее и плодотворнее становится наше общение. Помните, что каждый вдумчивый
|
наше общение. Помните, что каждый вдумчивый ответ повышает качество дискуссий
|
||||||
ответ повышает качество дискуссий в сообществе и делает чтение самиздата ещё
|
в сообществе и делает чтение самиздата ещё интереснее.
|
||||||
интереснее.
|
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li>
|
<li>
|
||||||
<p>
|
<p>
|
||||||
<strong>Чувство юмора и добродушие.</strong> Остроумие и дружелюбие
|
<strong>Чувство юмора и добродушие.</strong> Остроумие и дружелюбие не только
|
||||||
не только направляют дискуссии в продуктивное русло, но и улучшают
|
направляют дискуссии в продуктивное русло, но и улучшают настроение.
|
||||||
настроение. Не вредите негативом, которого в интернете и без нас хватает,
|
Не вредите негативом, которого в интернете и без нас хватает,
|
||||||
и не травите на корню классные инициативы — всё великое
|
и не травите на корню классные инициативы — всё великое начинается
|
||||||
начинается с малого. Мы за поддерживающую и вдохновляющую атмосферу
|
с малого. Мы за поддерживающую и вдохновляющую атмосферу
|
||||||
в сообществе. Надеемся, вы тоже.
|
в сообществе. Надеемся, вы тоже.
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
|
@ -103,19 +115,16 @@ export const DiscussionRulesPage = () => {
|
||||||
<li>
|
<li>
|
||||||
<p>
|
<p>
|
||||||
<strong>Благодарность и поддержка.</strong> Если публикация вам зашла,
|
<strong>Благодарность и поддержка.</strong> Если публикация вам зашла,
|
||||||
не стесняйтесь ставить лайки, делиться понравившимися материалами, благодарить
|
не стесняйтесь ставить лайки, делиться понравившимися материалами, благодарить авторов,
|
||||||
авторов, читателей, художников и редакторов в комментариях. Цените
|
читателей, художников и редакторов в комментариях. Цените и поддерживайте
|
||||||
и поддерживайте классные проекты, сильные тексты, новое искусство, осмысленные
|
классные проекты, сильные тексты, новое искусство, осмысленные комментарии и вклад других
|
||||||
комментарии и вклад других в самиздат — сотрудничество делает нас
|
в самиздат — сотрудничество делает нас сильнее и усиливает звучание идей
|
||||||
сильнее и усиливает звучание идей и смыслов, которые помогают лучше понимать
|
и смыслов, которые помогают лучше понимать мир.
|
||||||
мир.
|
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
</ol>
|
</ol>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</article>
|
</article>
|
||||||
</PageLayout>
|
</StaticPage>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,14 +1,29 @@
|
||||||
import { PageLayout } from '../../components/_shared/PageLayout'
|
import { Meta } from '@solidjs/meta'
|
||||||
import { useLocalize } from '../../context/localize'
|
|
||||||
|
import { StaticPage } from '../../components/Views/StaticPage'
|
||||||
|
import { useLocalize } from '../../context/localize'
|
||||||
|
import { getImageUrl } from '../../utils/getImageUrl'
|
||||||
|
|
||||||
// TODO: l10n
|
|
||||||
export const DogmaPage = () => {
|
export const DogmaPage = () => {
|
||||||
const { t } = useLocalize()
|
const { t } = useLocalize()
|
||||||
|
|
||||||
|
const ogImage = getImageUrl('production/image/logo_image.png')
|
||||||
|
const ogTitle = t('Dogma')
|
||||||
|
const description = t('Professional principles that the open editorial team follows in its work')
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<PageLayout title={t('Dogma')}>
|
<StaticPage title={ogTitle}>
|
||||||
|
<Meta name="descprition" content={description} />
|
||||||
|
<Meta name="keywords" content={t('dogma keywords')} />
|
||||||
|
<Meta name="og:type" content="article" />
|
||||||
|
<Meta name="og:title" content={ogTitle} />
|
||||||
|
<Meta name="og:image" content={ogImage} />
|
||||||
|
<Meta name="twitter:image" content={ogImage} />
|
||||||
|
<Meta name="og:description" content={description} />
|
||||||
|
<Meta name="twitter:card" content="summary_large_image" />
|
||||||
|
<Meta name="twitter:title" content={ogTitle} />
|
||||||
|
<Meta name="twitter:description" content={description} />
|
||||||
<article class="wide-container container--static-page">
|
<article class="wide-container container--static-page">
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-12 col-xl-14 offset-md-5 order-md-first">
|
|
||||||
<h4>Редакционные принципы</h4>
|
<h4>Редакционные принципы</h4>
|
||||||
<p>
|
<p>
|
||||||
Дискурс — журнал с открытой горизонтальной редакцией. Содержание журнала определяется прямым
|
Дискурс — журнал с открытой горизонтальной редакцией. Содержание журнала определяется прямым
|
||||||
|
@ -18,23 +33,23 @@ export const DogmaPage = () => {
|
||||||
<ol>
|
<ol>
|
||||||
<li>
|
<li>
|
||||||
<b>На первое место ставим факты.</b> Наша задача — не судить, а наблюдать и непредвзято
|
<b>На первое место ставим факты.</b> Наша задача — не судить, а наблюдать и непредвзято
|
||||||
фиксировать происходящее. Все утверждения и выводы, которые мы делаем, подтверждаются
|
фиксировать происходящее. Все утверждения и выводы, которые мы делаем, подтверждаются фактами,
|
||||||
фактами, цифрами, мнениями экспертов или ссылками на авторитетные источники.
|
цифрами, мнениями экспертов или ссылками на авторитетные источники.
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<b>Ответственно относимся к источникам.</b>
|
<b>Ответственно относимся к источникам.</b>
|
||||||
Мы выбираем только надежные источники, проверяем информацию и рассказываем, как и откуда мы
|
Мы выбираем только надежные источники, проверяем информацию и рассказываем, как и откуда мы её
|
||||||
её получили, кроме случаев, когда это может нанести вред источникам. Тогда мы не раскроем
|
получили, кроме случаев, когда это может нанести вред источникам. Тогда мы не раскроем их, даже
|
||||||
их, даже в суде.
|
в суде.
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<b>Выбираем компетентных и независимых экспертов</b>, понимая всю степень ответственности
|
<b>Выбираем компетентных и независимых экспертов</b>, понимая всю степень ответственности перед
|
||||||
перед аудиторией.
|
аудиторией.
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<b>
|
<b>
|
||||||
Даем возможность высказаться всем заинтересованным сторонам, но не присоединяемся ни к
|
Даем возможность высказаться всем заинтересованным сторонам, но не присоединяемся ни к чьему
|
||||||
чьему лагерю.
|
лагерю.
|
||||||
</b>
|
</b>
|
||||||
Ко всем событиям, компаниям и людям мы относимся с одинаковым скептицизмом.
|
Ко всем событиям, компаниям и людям мы относимся с одинаковым скептицизмом.
|
||||||
</li>
|
</li>
|
||||||
|
@ -48,10 +63,8 @@ export const DogmaPage = () => {
|
||||||
.
|
.
|
||||||
</li>
|
</li>
|
||||||
</ol>
|
</ol>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</article>
|
</article>
|
||||||
</PageLayout>
|
</StaticPage>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,36 +2,40 @@ import { Meta } from '@solidjs/meta'
|
||||||
|
|
||||||
import { StaticPage } from '../../components/Views/StaticPage'
|
import { StaticPage } from '../../components/Views/StaticPage'
|
||||||
import { useLocalize } from '../../context/localize'
|
import { useLocalize } from '../../context/localize'
|
||||||
|
import { getImageUrl } from '../../utils/getImageUrl'
|
||||||
|
|
||||||
export const GuidePage = () => {
|
export const GuidePage = () => {
|
||||||
const { t } = useLocalize()
|
const { t } = useLocalize()
|
||||||
const title = t('How it works')
|
|
||||||
|
const ogImage = getImageUrl('production/image/logo_image.png')
|
||||||
|
const ogTitle = t('How Discours works')
|
||||||
|
const description = t('A guide to horizontal editorial: how an open journal works')
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<StaticPage
|
<StaticPage title={ogTitle}>
|
||||||
title={title}
|
|
||||||
layoutChildren={
|
|
||||||
<>
|
<>
|
||||||
<Meta name="description" content={title} />
|
<Meta name="descprition" content={description} />
|
||||||
<Meta name="keywords" content={t('Discours') + ',' + title} />
|
<Meta name="keywords" content={t('keywords')} />
|
||||||
<Meta property="og:title" content={title} />
|
<Meta name="og:type" content="article" />
|
||||||
<Meta property="og:description" content={title} />
|
<Meta name="og:title" content={ogTitle} />
|
||||||
<Meta property="og:image" content="/images/participation.png" />
|
<Meta name="og:image" content={ogImage} />
|
||||||
<Meta property="og:image:width" content="1200" />
|
<Meta name="twitter:image" content={ogImage} />
|
||||||
<Meta property="og:image:height" content="630" />
|
<Meta name="og:description" content={description} />
|
||||||
</>
|
<Meta name="twitter:card" content="summary_large_image" />
|
||||||
}
|
<Meta name="twitter:title" content={ogTitle} />
|
||||||
>
|
<Meta name="twitter:description" content={description} />
|
||||||
|
<article class="wide-container container--static-page">
|
||||||
<h1 id="about">
|
<h1 id="about">
|
||||||
<span class="wrapped">Как устроен Дискурс</span>
|
<span class="wrapped">{ogTitle}</span>
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Дискурс — независимый журнал о культуре, науке, искусстве и обществе с
|
Дискурс — независимый журнал о культуре, науке, искусстве и обществе
|
||||||
|
с
|
||||||
<a href="/about/manifest">открытой редакцией</a>. У нас нет главного редактора, инвестора
|
<a href="/about/manifest">открытой редакцией</a>. У нас нет главного редактора, инвестора
|
||||||
и вообще никого, кто бы принимал единоличные решения. Вместо традиционных иерархий Дискурс
|
и вообще никого, кто бы принимал единоличные решения. Вместо традиционных иерархий
|
||||||
основан на принципах прямой демократии: в нашем горизонтальном сообществе все редакционные
|
Дискурс основан на принципах прямой демократии: в нашем горизонтальном сообществе все
|
||||||
вопросы решаются открытым голосованием авторов журнала. Вот как это работает.
|
редакционные вопросы решаются открытым голосованием авторов журнала. Вот как это работает.
|
||||||
</p>
|
</p>
|
||||||
<h3 id="how-it-works">Как устроен сайт Дискурса</h3>
|
<h3 id="how-it-works">Как устроен сайт Дискурса</h3>
|
||||||
<p>Дискурс состоит из четырех основных разделов:</p>
|
<p>Дискурс состоит из четырех основных разделов:</p>
|
||||||
|
@ -39,16 +43,16 @@ export const GuidePage = () => {
|
||||||
<li>
|
<li>
|
||||||
<p>
|
<p>
|
||||||
<a href="/topics">Темы</a>
|
<a href="/topics">Темы</a>
|
||||||
— у нас публикуются исследования, обзоры, эссе, интервью, репортажи, аналитика
|
— у нас публикуются исследования, обзоры, эссе, интервью, репортажи,
|
||||||
и другие материалы о культуре, науке, искусстве и обществе.
|
аналитика и другие материалы о культуре, науке, искусстве и обществе.
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>
|
<p>
|
||||||
<a href="/topic/art">Искусство</a>
|
<a href="/topic/art">Искусство</a>
|
||||||
— здесь, например, представлены художественные произведения: литература, живопись,
|
— здесь, например, представлены художественные произведения: литература,
|
||||||
музыка, фотографии, видео. Этот раздел помогает прозвучать новому искусству, которое создают
|
живопись, музыка, фотографии, видео. Этот раздел помогает прозвучать новому искусству,
|
||||||
российские художники, писатели, режиссёры и музыканты.
|
которое создают российские художники, писатели, режиссёры и музыканты.
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
{/*
|
{/*
|
||||||
|
@ -79,24 +83,24 @@ export const GuidePage = () => {
|
||||||
материалы по жанрам (например, <a href="/topic/interview">интервью</a>,{' '}
|
материалы по жанрам (например, <a href="/topic/interview">интервью</a>,{' '}
|
||||||
<a href="/topic/reportage">репортажи</a>, <a href="/topic/essay">эссе</a>,{' '}
|
<a href="/topic/reportage">репортажи</a>, <a href="/topic/essay">эссе</a>,{' '}
|
||||||
<a href="/topic/likbez">ликбезы</a>
|
<a href="/topic/likbez">ликбезы</a>
|
||||||
), по тематике (<a href="/topic/cinema">кино</a>, <a href="/topic/philosophy">философия</a>,{' '}
|
), по тематике (<a href="/topic/cinema">кино</a>, <a href="/topic/philosophy">философия</a>
|
||||||
<a href="/topic/history">история</a>, <a href="/topic/absurdism">абсурдизм</a>,{' '}
|
, <a href="/topic/history">история</a>, <a href="/topic/absurdism">абсурдизм</a>,{' '}
|
||||||
<a href="/topic/sex">секс</a> и т.д.) или в серии (как «
|
<a href="/topic/sex">секс</a> и т.д.) или в серии (как «
|
||||||
<a href="/topic/zakony-mira">Законы мира</a>» или «
|
<a href="/topic/zakony-mira">Законы мира</a>» или «
|
||||||
<a href="/topic/za-liniey-mannergeyma">За линией Маннергейма</a>
|
<a href="/topic/za-liniey-mannergeyma">За линией Маннергейма</a>
|
||||||
»). Темы объединяют сотни публикаций, помогают ориентироваться в журнале и следить
|
»). Темы объединяют сотни публикаций, помогают ориентироваться в журнале
|
||||||
за интересными материалами.
|
и следить за интересными материалами.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<section>
|
<section>
|
||||||
<h3 id="become-author">Как стать автором журнала</h3>
|
<h3 id="become-author">Как стать автором журнала</h3>
|
||||||
<p>
|
<p>
|
||||||
Дискурс объединяет журналистов, активистов, музыкантов, художников, фотографов, режиссеров,
|
Дискурс объединяет журналистов, активистов, музыкантов, художников, фотографов, режиссеров,
|
||||||
философов, ученых и других замечательных людей. Каждый может <a href="/create">прислать</a>{' '}
|
философов, ученых и других замечательных людей. Каждый может{' '}
|
||||||
свой материал в журнал. Формат и тематика не имеют значения, единственное, что
|
<a href="/create">прислать</a> свой материал в журнал. Формат и тематика
|
||||||
важно — <a href="/how-to-write-a-good-article">хороший</a> ли материал. Если сообщество
|
не имеют значения, единственное, что важно —{' '}
|
||||||
поддержит вашу публикацию, она выйдет в журнале и станет доступна тысячам наших
|
<a href="/how-to-write-a-good-article">хороший</a> ли материал. Если сообщество поддержит
|
||||||
читателей.
|
вашу публикацию, она выйдет в журнале и станет доступна тысячам наших читателей.
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
@ -105,41 +109,41 @@ export const GuidePage = () => {
|
||||||
Все присылаемые в Дискурс материалы попадают в
|
Все присылаемые в Дискурс материалы попадают в
|
||||||
<strong>«Редакцию»</strong>. Это внутренний раздел сайта, где участники сообщества
|
<strong>«Редакцию»</strong>. Это внутренний раздел сайта, где участники сообщества
|
||||||
решают, что будет опубликовано в Дискурсе. Как только работа получает одобрение как минимум
|
решают, что будет опубликовано в Дискурсе. Как только работа получает одобрение как минимум
|
||||||
пятерых авторов открытой редакции, она немедленно публикуется в журнале. Если же материал
|
пятерых авторов открытой редакции, она немедленно публикуется в журнале. Если же
|
||||||
набирает более 20% голосов «против», он не выходит и может быть
|
материал набирает более 20% голосов «против», он не выходит
|
||||||
отправлен на доработку. Жестких сроков рассмотрения материалов у нас нет, иногда это
|
и может быть отправлен на доработку. Жестких сроков рассмотрения материалов у нас
|
||||||
занимает час, иногда месяц, обычно — несколько дней.
|
нет, иногда это занимает час, иногда месяц, обычно — несколько дней.
|
||||||
</p>
|
</p>
|
||||||
<section>
|
<section>
|
||||||
<p>
|
<p>
|
||||||
Как только сообщество поддержит публикацию, вы получите приглашение в интернет-редакцию
|
Как только сообщество поддержит публикацию, вы получите приглашение
|
||||||
и сможете голосовать за новые материалы.
|
в интернет-редакцию и сможете голосовать за новые материалы.
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<h3 id="editing">Как мы делаем тексты друг друга лучше</h3>
|
<h3 id="editing">Как мы делаем тексты друг друга лучше</h3>
|
||||||
<p>
|
<p>
|
||||||
Дискурс — журнал с совместным редактированием. Совершенствовать тексты нам помогает{' '}
|
Дискурс — журнал с совместным редактированием. Совершенствовать тексты нам
|
||||||
<b>система ремарок</b>. Вы можете выделить часть текста в любой статье и оставить
|
помогает <b>система ремарок</b>. Вы можете выделить часть текста в любой статье
|
||||||
к ней замечание, вопрос или предложение — автор текста получит совет на почту
|
и оставить к ней замечание, вопрос или предложение — автор текста получит
|
||||||
и сможет его учесть. Так мы устраняем опечатки, неточности и советуем друг другу, как
|
совет на почту и сможет его учесть. Так мы устраняем опечатки, неточности
|
||||||
сделать тексты качественнее и интереснее.
|
и советуем друг другу, как сделать тексты качественнее и интереснее.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Среди участников сообщества есть профессиональные редакторы, которые помогают авторам делать тексты
|
Среди участников сообщества есть профессиональные редакторы, которые помогают авторам делать
|
||||||
лучше. Если вашему материалу потребуется доработка, они помогут отредактировать текст, подобрать
|
тексты лучше. Если вашему материалу потребуется доработка, они помогут отредактировать текст,
|
||||||
иллюстрации, придумать заголовок и красиво сверстать публикацию. Если вы хотите обсудить
|
подобрать иллюстрации, придумать заголовок и красиво сверстать публикацию. Если
|
||||||
текст, прежде чем загрузить материал в интернет-редакцию — разместите его
|
вы хотите обсудить текст, прежде чем загрузить материал в интернет-редакцию —
|
||||||
в google-документе, откройте доступ к редактированию по ссылке и напишите нам
|
разместите его в google-документе, откройте доступ к редактированию по ссылке
|
||||||
на
|
и напишите нам на
|
||||||
<a href="mailto:welcome@discours.io" target="_blank">
|
<a href="mailto:welcome@discours.io" target="_blank">
|
||||||
welcome@discours.io
|
welcome@discours.io
|
||||||
</a>
|
</a>
|
||||||
.
|
.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Если у вас возникают трудности с тем, чтобы подобрать к своему материалу иллюстрации,
|
Если у вас возникают трудности с тем, чтобы подобрать к своему материалу
|
||||||
тоже пишите на
|
иллюстрации, тоже пишите на
|
||||||
<a href="mailto:welcome@discours.io" target="_blank">
|
<a href="mailto:welcome@discours.io" target="_blank">
|
||||||
почту
|
почту
|
||||||
</a>
|
</a>
|
||||||
|
@ -156,23 +160,23 @@ export const GuidePage = () => {
|
||||||
<p>
|
<p>
|
||||||
<strong>Право определять, каким будет журнал</strong>. Дискурс — это общественная
|
<strong>Право определять, каким будет журнал</strong>. Дискурс — это общественная
|
||||||
институция, созданная людьми и ради людей, функционирующая на условиях прямой
|
институция, созданная людьми и ради людей, функционирующая на условиях прямой
|
||||||
демократии. Авторы публикуют статьи и художественные проекты, участвуют в обсуждениях,
|
демократии. Авторы публикуют статьи и художественные проекты, участвуют
|
||||||
голосуют за работы коллег и таким образом вносят свой вклад в развитие проекта,
|
в обсуждениях, голосуют за работы коллег и таким образом вносят свой вклад
|
||||||
определяя содержание и направление журнала.
|
в развитие проекта, определяя содержание и направление журнала.
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>
|
<p>
|
||||||
<strong>Возможность обратиться к широкой аудитории</strong>. Дискурс читают десятки тысяч
|
<strong>Возможность обратиться к широкой аудитории</strong>. Дискурс читают десятки
|
||||||
людей, и с каждым днем их становится больше.
|
тысяч людей, и с каждым днем их становится больше.
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>
|
<p>
|
||||||
<strong>Поддержка редакции</strong>. Дискурс предоставляет авторам аккредитацию
|
<strong>Поддержка редакции</strong>. Дискурс предоставляет авторам аккредитацию
|
||||||
на мероприятия, базу контактов, юридическую поддержку, ознакомление с книжными, кино-
|
на мероприятия, базу контактов, юридическую поддержку, ознакомление с книжными,
|
||||||
и музыкальными новинками до их выхода в свет. Если что-то из этого вам
|
кино- и музыкальными новинками до их выхода в свет. Если что-то
|
||||||
понадобится, пишите на почту{' '}
|
из этого вам понадобится, пишите на почту{' '}
|
||||||
<a href="mailto:welcome@discours.io" target="_blank">
|
<a href="mailto:welcome@discours.io" target="_blank">
|
||||||
welcome@discours.io
|
welcome@discours.io
|
||||||
</a>
|
</a>
|
||||||
|
@ -181,21 +185,22 @@ export const GuidePage = () => {
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>
|
<p>
|
||||||
<strong>Пресс-карты для корреспондентов</strong>. Три опубликованные статьи позволяют авторам
|
<strong>Пресс-карты для корреспондентов</strong>. Три опубликованные статьи позволяют
|
||||||
Дискурса получить официальные удостоверения журналистов (пресс-карты) на следующий год.
|
авторам Дискурса получить официальные удостоверения журналистов (пресс-карты)
|
||||||
Пресс-карты удостоверяют, что вы журналист и можете пользоваться всеми теми правами,
|
на следующий год. Пресс-карты удостоверяют, что вы журналист и можете
|
||||||
которые гарантирует Закон о СМИ. Кроме того, многие культурные институции (музеи, галереи
|
пользоваться всеми теми правами, которые гарантирует Закон о СМИ. Кроме того, многие
|
||||||
и др.) предоставляют журналистам право свободного входа.
|
культурные институции (музеи, галереи и др.) предоставляют журналистам право свободного
|
||||||
|
входа.
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>
|
<p>
|
||||||
<strong>Помощь сотен специалистов в разных областях</strong>. В основе Дискурса лежит
|
<strong>Помощь сотен специалистов в разных областях</strong>. В основе Дискурса
|
||||||
идея совместного редактирования. Участники редакционного сообщества — несколько сотен
|
лежит идея совместного редактирования. Участники редакционного сообщества —
|
||||||
журналистов, исследователей, художников, литераторов из разных стран — изучают
|
несколько сотен журналистов, исследователей, художников, литераторов из разных стран
|
||||||
материалы друг друга до публикации и помогают сделать их качественнее
|
— изучают материалы друг друга до публикации и помогают сделать
|
||||||
и интереснее. Так, в редакции нередко складываются творческие союзы: например, авторов
|
их качественнее и интереснее. Так, в редакции нередко складываются творческие
|
||||||
текстов и художников, создающих для них иллюстрации.
|
союзы: например, авторов текстов и художников, создающих для них иллюстрации.
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
|
@ -229,12 +234,15 @@ export const GuidePage = () => {
|
||||||
с дайджестом лучших материалов.
|
с дайджестом лучших материалов.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Если вы хотите сотрудничать, что-то обсудить или предложить — пожалуйста, пишите на
|
Если вы хотите сотрудничать, что-то обсудить или предложить — пожалуйста, пишите
|
||||||
|
на
|
||||||
<a href="mailto:welcome@discours.io" target="_blank">
|
<a href="mailto:welcome@discours.io" target="_blank">
|
||||||
welcome@discours.io
|
welcome@discours.io
|
||||||
</a>
|
</a>
|
||||||
. Мы обязательно ответим.
|
. Мы обязательно ответим.
|
||||||
</p>
|
</p>
|
||||||
|
</article>
|
||||||
|
</>
|
||||||
</StaticPage>
|
</StaticPage>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,38 +3,48 @@ import { Meta } from '@solidjs/meta'
|
||||||
import { Donate } from '../../components/Discours/Donate'
|
import { Donate } from '../../components/Discours/Donate'
|
||||||
import { StaticPage } from '../../components/Views/StaticPage'
|
import { StaticPage } from '../../components/Views/StaticPage'
|
||||||
import { useLocalize } from '../../context/localize'
|
import { useLocalize } from '../../context/localize'
|
||||||
|
import { getImageUrl } from '../../utils/getImageUrl'
|
||||||
|
|
||||||
export const HelpPage = () => {
|
export const HelpPage = () => {
|
||||||
const { t } = useLocalize()
|
const { t } = useLocalize()
|
||||||
|
|
||||||
// TODO: l10n
|
const ogImage = getImageUrl('production/image/logo_image.png')
|
||||||
|
const ogTitle = t('Support Discours')
|
||||||
|
const description = t(
|
||||||
|
'Contribute to free samizdat. Support Discours - an independent non-profit publication that works only for you. Become a pillar of the open newsroom',
|
||||||
|
)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<StaticPage
|
<StaticPage title={ogTitle}>
|
||||||
title={t('Support us')}
|
|
||||||
layoutChildren={
|
|
||||||
<>
|
<>
|
||||||
<Meta name="description" content="Здесь можно поддержать Дискурс материально." />
|
<Meta name="descprition" content={description} />
|
||||||
<Meta name="keywords" content="Discours.io, помощь, благотворительность" />
|
<Meta name="keywords" content={t('keywords')} />
|
||||||
</>
|
<Meta name="og:type" content="article" />
|
||||||
}
|
<Meta name="og:title" content={ogTitle} />
|
||||||
>
|
<Meta name="og:image" content={ogImage} />
|
||||||
|
<Meta name="twitter:image" content={ogImage} />
|
||||||
|
<Meta name="og:description" content={description} />
|
||||||
|
<Meta name="twitter:card" content="summary_large_image" />
|
||||||
|
<Meta name="twitter:title" content={ogTitle} />
|
||||||
|
<Meta name="twitter:description" content={description} />
|
||||||
|
<article class="wide-container container--static-page">
|
||||||
<h1 id="help-us">
|
<h1 id="help-us">
|
||||||
<span class="wrapped">Как вы можете поддержать Дискурс?</span>
|
<span class="wrapped">Как вы можете поддержать Дискурс?</span>
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Дискурс — уникальное независимое издание с горизонтальной редакцией, существующее
|
Дискурс — уникальное независимое издание с горизонтальной редакцией,
|
||||||
в интересах своих читателей. Ваша поддержка действительно много значит —
|
существующее в интересах своих читателей. Ваша поддержка действительно много
|
||||||
не только для редакции Дискурса, но и для сохранения свободной мысли
|
значит — не только для редакции Дискурса, но и для сохранения
|
||||||
и некоммерческого искусства в нашем обществе.
|
свободной мысли и некоммерческого искусства в нашем обществе.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Дискурс существует на добровольных началах. Никакой медиахолдинг, фонд или государственная
|
Дискурс существует на добровольных началах. Никакой медиахолдинг, фонд или государственная
|
||||||
структура не финансирует нас — благодаря этому мы можем писать о том, что
|
структура не финансирует нас — благодаря этому мы можем писать о том,
|
||||||
важно, а не о том, что выгодно. Сообщество наших волонтеров ежедневно трудится, чтобы
|
что важно, а не о том, что выгодно. Сообщество наших волонтеров ежедневно
|
||||||
рассказывать вам интересные, не освещенные другими изданиями истории —
|
трудится, чтобы рассказывать вам интересные, не освещенные другими изданиями
|
||||||
но мы не сможем делать это без вашей помощи. Пожертвования читателей составляют
|
истории — но мы не сможем делать это без вашей помощи. Пожертвования
|
||||||
основу нашего бюджета и позволяют нам существовать.
|
читателей составляют основу нашего бюджета и позволяют нам существовать.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Если вам нравится то, что мы делаем и вы хотите, чтобы Дискурс продолжался,
|
Если вам нравится то, что мы делаем и вы хотите, чтобы Дискурс продолжался,
|
||||||
|
@ -48,26 +58,27 @@ export const HelpPage = () => {
|
||||||
<h3 id="financial-report">На что пойдут деньги?</h3>
|
<h3 id="financial-report">На что пойдут деньги?</h3>
|
||||||
<p>
|
<p>
|
||||||
Ваши пожертвования пойдут на оплату серверов, содержание офиса, зарплату редакции
|
Ваши пожертвования пойдут на оплату серверов, содержание офиса, зарплату редакции
|
||||||
и налоги, оплату юридического сопровождения и труда бухгалтера, совершенствование сайта,
|
и налоги, оплату юридического сопровождения и труда бухгалтера, совершенствование
|
||||||
аренду помещения для открытой редакции, на печать альманаха Дискурс с лучшими текстами
|
сайта, аренду помещения для открытой редакции, на печать альманаха Дискурс с лучшими
|
||||||
авторов за полгода, а также на другие редакционные и технические расходы.
|
текстами авторов за полгода, а также на другие редакционные и технические
|
||||||
|
расходы.
|
||||||
</p>
|
</p>
|
||||||
<h3>Ваша помощь позволит нам</h3>
|
<h3>Ваша помощь позволит нам</h3>
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<h4>Оставаться бесплатным изданием.</h4>
|
<h4>Оставаться бесплатным изданием.</h4>
|
||||||
<p>
|
<p>
|
||||||
Мы делаем открытый журнал для всех желающих, а также собираем искусство лучших авторов
|
Мы делаем открытый журнал для всех желающих, а также собираем искусство лучших
|
||||||
по всему миру. Ваша поддержка позволяет нам становиться лучше.
|
авторов по всему миру. Ваша поддержка позволяет нам становиться лучше.
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<h4>Создавать еще больше контента.</h4>
|
<h4>Создавать еще больше контента.</h4>
|
||||||
<p>
|
<p>
|
||||||
Каждый день к нам присоединяются новые люди, и чем больше нас становится, тем больше
|
Каждый день к нам присоединяются новые люди, и чем больше нас становится, тем
|
||||||
мы творим и строже оцениваем результаты творчества друг друга. В результате
|
больше мы творим и строже оцениваем результаты творчества друг друга.
|
||||||
повышается и количество, и качество контента. Каждый день мы трудимся, чтобы открывать
|
В результате повышается и количество, и качество контента. Каждый день мы
|
||||||
нашим читателям новые грани окружающего мира.
|
трудимся, чтобы открывать нашим читателям новые грани окружающего мира.
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
|
@ -80,15 +91,16 @@ export const HelpPage = () => {
|
||||||
<li>
|
<li>
|
||||||
<h4>Модернизировать сайт.</h4>
|
<h4>Модернизировать сайт.</h4>
|
||||||
<p>
|
<p>
|
||||||
Мы совершенствуем платформу и стараемся сделать проект максимально удобным для вас.
|
Мы совершенствуем платформу и стараемся сделать проект максимально удобным для
|
||||||
Мы работаем над мобильной версией, новым дизайном, фукционалом, системой регистрации,
|
вас. Мы работаем над мобильной версией, новым дизайном, фукционалом, системой
|
||||||
навигации и рекомендаций, которые сделают наше общение еще увлекательней.
|
регистрации, навигации и рекомендаций, которые сделают наше общение еще увлекательней.
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<h4>Выпускать альманах.</h4>
|
<h4>Выпускать альманах.</h4>
|
||||||
<p>
|
<p>
|
||||||
Выпускать раз в полугодие печатный альманах Дискурс с 33 лучшими текстами сайта.
|
Выпускать раз в полугодие печатный альманах Дискурс с 33 лучшими текстами
|
||||||
|
сайта.
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
|
@ -106,9 +118,9 @@ export const HelpPage = () => {
|
||||||
</p>
|
</p>
|
||||||
<h3 id="other">Как ещё можно поддержать Дискурс?</h3>
|
<h3 id="other">Как ещё можно поддержать Дискурс?</h3>
|
||||||
<p>
|
<p>
|
||||||
Есть много других способов поддержать Дискурс и труд наших авторов. Например, вы можете
|
Есть много других способов поддержать Дискурс и труд наших авторов. Например,
|
||||||
периодически рассказывать о проекте своим друзьям в соцсетях, делиться хорошими
|
вы можете периодически рассказывать о проекте своим друзьям в соцсетях, делиться
|
||||||
материалами или — что еще лучше — публиковать свои статьи
|
хорошими материалами или — что еще лучше — публиковать свои статьи
|
||||||
в «Дискурсе». Но главное, что вы можете сделать для Дискурса, —
|
в «Дискурсе». Но главное, что вы можете сделать для Дискурса, —
|
||||||
читать нас. Мы вкладываем в журнал душу, и внимание каждого читателя убеждает нас
|
читать нас. Мы вкладываем в журнал душу, и внимание каждого читателя убеждает нас
|
||||||
в правильности выбранного пути. Не переключайтесь.
|
в правильности выбранного пути. Не переключайтесь.
|
||||||
|
@ -121,6 +133,8 @@ export const HelpPage = () => {
|
||||||
</a>
|
</a>
|
||||||
.
|
.
|
||||||
</p>
|
</p>
|
||||||
|
</article>
|
||||||
|
</>
|
||||||
</StaticPage>
|
</StaticPage>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,17 +1,24 @@
|
||||||
|
import { Meta } from '@solidjs/meta'
|
||||||
|
|
||||||
import { Subscribe } from '../../components/_shared/Subscribe'
|
import { Subscribe } from '../../components/_shared/Subscribe'
|
||||||
import { Feedback } from '../../components/Discours/Feedback'
|
import { Feedback } from '../../components/Discours/Feedback'
|
||||||
import { Modal } from '../../components/Nav/Modal'
|
import { Modal } from '../../components/Nav/Modal'
|
||||||
import Opener from '../../components/Nav/Modal/Opener'
|
import Opener from '../../components/Nav/Modal/Opener'
|
||||||
import { StaticPage } from '../../components/Views/StaticPage'
|
import { StaticPage } from '../../components/Views/StaticPage'
|
||||||
import { useLocalize } from '../../context/localize'
|
import { useLocalize } from '../../context/localize'
|
||||||
|
import { getImageUrl } from '../../utils/getImageUrl'
|
||||||
|
|
||||||
export const ManifestPage = () => {
|
export const ManifestPage = () => {
|
||||||
const { t } = useLocalize()
|
const { t } = useLocalize()
|
||||||
|
|
||||||
|
const ogImage = getImageUrl('production/image/logo_image.png')
|
||||||
|
const ogTitle = t('Discours Manifest')
|
||||||
|
const description = t(
|
||||||
|
'Manifest of samizdat: principles and mission of an open magazine with a horizontal editorial board',
|
||||||
|
)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<StaticPage
|
<StaticPage title={ogTitle}>
|
||||||
title={t('Manifest')}
|
|
||||||
layoutChildren={
|
|
||||||
<>
|
<>
|
||||||
<Modal variant="wide" name="feedback">
|
<Modal variant="wide" name="feedback">
|
||||||
<Feedback />
|
<Feedback />
|
||||||
|
@ -19,36 +26,45 @@ export const ManifestPage = () => {
|
||||||
<Modal variant="wide" name="subscribe">
|
<Modal variant="wide" name="subscribe">
|
||||||
<Subscribe />
|
<Subscribe />
|
||||||
</Modal>
|
</Modal>
|
||||||
</>
|
<Meta name="descprition" content={description} />
|
||||||
}
|
<Meta name="keywords" content={t('keywords')} />
|
||||||
>
|
<Meta name="og:type" content="article" />
|
||||||
|
<Meta name="og:title" content={ogTitle} />
|
||||||
|
<Meta name="og:image" content={ogImage} />
|
||||||
|
<Meta name="twitter:image" content={ogImage} />
|
||||||
|
<Meta name="og:description" content={description} />
|
||||||
|
<Meta name="twitter:card" content="summary_large_image" />
|
||||||
|
<Meta name="twitter:title" content={ogTitle} />
|
||||||
|
<Meta name="twitter:description" content={description} />
|
||||||
|
<article class="wide-container container--static-page">
|
||||||
<h1 id="manifest">
|
<h1 id="manifest">
|
||||||
<span class="wrapped">Манифест</span>
|
<span class="wrapped">Манифест</span>
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Дискурс — независимый художественно-аналитический журнал с горизонтальной редакцией,
|
Дискурс — независимый художественно-аналитический журнал с горизонтальной
|
||||||
основанный на принципах свободы слова, прямой демократии и совместного редактирования.
|
редакцией, основанный на принципах свободы слова, прямой демократии и совместного
|
||||||
Дискурс создаётся открытым медиасообществом ученых, журналистов, музыкантов, писателей,
|
редактирования. Дискурс создаётся открытым медиасообществом ученых, журналистов, музыкантов,
|
||||||
предпринимателей, философов, инженеров, художников и специалистов со всего мира,
|
писателей, предпринимателей, философов, инженеров, художников и специалистов со всего
|
||||||
объединившихся, чтобы вместе делать общий журнал и объяснять с разных точек зрения
|
мира, объединившихся, чтобы вместе делать общий журнал и объяснять с разных точек
|
||||||
мозаичную картину современности.
|
зрения мозаичную картину современности.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Мы пишем о культуре, науке и обществе, рассказываем о новых идеях
|
Мы пишем о культуре, науке и обществе, рассказываем о новых идеях
|
||||||
и современном искусстве, публикуем статьи, исследования, репортажи, интервью людей, чью прямую
|
и современном искусстве, публикуем статьи, исследования, репортажи, интервью людей, чью
|
||||||
речь стоит услышать, и работы художников из разных стран — от фильмов
|
прямую речь стоит услышать, и работы художников из разных стран —
|
||||||
и музыки до живописи и фотографии. Помогая друг другу делать публикации качественнее
|
от фильмов и музыки до живописи и фотографии. Помогая друг другу делать
|
||||||
и общим голосованием выбирая лучшие материалы для журнала, мы создаём новую горизонтальную
|
публикации качественнее и общим голосованием выбирая лучшие материалы для журнала,
|
||||||
журналистику, чтобы честно рассказывать о важном и интересном.
|
мы создаём новую горизонтальную журналистику, чтобы честно рассказывать о важном
|
||||||
|
и интересном.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Редакция Дискурса открыта для всех: у нас нет цензуры, запретных тем и идеологических
|
Редакция Дискурса открыта для всех: у нас нет цензуры, запретных тем и идеологических
|
||||||
рамок. Каждый может <a href="/create">прислать материал</a> в журнал и
|
рамок. Каждый может <a href="/create">прислать материал</a> в журнал и
|
||||||
<a href="/about/guide">присоединиться к редакции</a>. Предоставляя трибуну для независимой
|
<a href="/about/guide">присоединиться к редакции</a>. Предоставляя трибуну для независимой
|
||||||
журналистики и художественных проектов, мы помогаем людям рассказывать свои истории так,
|
журналистики и художественных проектов, мы помогаем людям рассказывать свои истории
|
||||||
чтобы они были услышаны. Мы убеждены: чем больше голосов будет звучать на Дискурсе, тем
|
так, чтобы они были услышаны. Мы убеждены: чем больше голосов будет звучать
|
||||||
громче в полифонии мнений будет слышна истина.
|
на Дискурсе, тем громче в полифонии мнений будет слышна истина.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2 class="h2" id="participation">
|
<h2 class="h2" id="participation">
|
||||||
|
@ -65,11 +81,11 @@ export const ManifestPage = () => {
|
||||||
<h3 id="contribute">Предлагать материалы</h3>
|
<h3 id="contribute">Предлагать материалы</h3>
|
||||||
</summary>
|
</summary>
|
||||||
<p>
|
<p>
|
||||||
<a href="/create">Создавайте</a> свои статьи и художественные работы — лучшие из
|
<a href="/create">Создавайте</a> свои статьи и художественные работы — лучшие
|
||||||
них будут опубликованы в журнале. Дискурс — некоммерческое издание, авторы
|
из них будут опубликованы в журнале. Дискурс — некоммерческое издание, авторы
|
||||||
публикуются в журнале на общественных началах, получая при этом{' '}
|
публикуются в журнале на общественных началах, получая при этом{' '}
|
||||||
<a href="/create?collab=true">поддержку</a> редакции, право голоса, множество других возможностей
|
<a href="/create?collab=true">поддержку</a> редакции, право голоса, множество других
|
||||||
и читателей по всему миру.
|
возможностей и читателей по всему миру.
|
||||||
</p>
|
</p>
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
@ -79,8 +95,8 @@ export const ManifestPage = () => {
|
||||||
</summary>
|
</summary>
|
||||||
<p>
|
<p>
|
||||||
Дискурс существует на пожертвования читателей. Если вам нравится журнал, пожалуйста,{' '}
|
Дискурс существует на пожертвования читателей. Если вам нравится журнал, пожалуйста,{' '}
|
||||||
<a href="/about/help">поддержите</a> нашу работу. Ваши пожертвования пойдут на выпуск новых
|
<a href="/about/help">поддержите</a> нашу работу. Ваши пожертвования пойдут на выпуск
|
||||||
материалов, оплату серверов, труда программистов, дизайнеров и редакторов.
|
новых материалов, оплату серверов, труда программистов, дизайнеров и редакторов.
|
||||||
</p>
|
</p>
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
@ -89,20 +105,20 @@ export const ManifestPage = () => {
|
||||||
<h3 id="cooperation">Сотрудничать с журналом</h3>
|
<h3 id="cooperation">Сотрудничать с журналом</h3>
|
||||||
</summary>
|
</summary>
|
||||||
<p>
|
<p>
|
||||||
Мы всегда открыты для сотрудничества и рады единомышленникам. Если вы хотите помогать журналу
|
Мы всегда открыты для сотрудничества и рады единомышленникам. Если вы хотите помогать
|
||||||
с редактурой, корректурой, иллюстрациями, переводами, версткой, подкастами, мероприятиями,
|
журналу с редактурой, корректурой, иллюстрациями, переводами, версткой, подкастами,
|
||||||
фандрайзингом или как-то ещё — скорее пишите нам на
|
мероприятиями, фандрайзингом или как-то ещё — скорее пишите нам на
|
||||||
<a href="mailto:welcome@discours.io">welcome@discours.io</a>.
|
<a href="mailto:welcome@discours.io">welcome@discours.io</a>.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Если вы представляете некоммерческую организацию и хотите сделать с нами совместный
|
Если вы представляете некоммерческую организацию и хотите сделать с нами совместный
|
||||||
проект, получить информационную поддержку или предложить другую форму сотрудничества —{' '}
|
проект, получить информационную поддержку или предложить другую форму
|
||||||
<a href="mailto:welcome@discours.io">пишите</a>.
|
сотрудничества — <a href="mailto:welcome@discours.io">пишите</a>.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Если вы разработчик и хотите помогать с развитием сайта Дискурса,{' '}
|
Если вы разработчик и хотите помогать с развитием сайта Дискурса,{' '}
|
||||||
<a href="mailto:services@discours.io">присоединяйтесь к IT-команде самиздата</a>. Открытый
|
<a href="mailto:services@discours.io">присоединяйтесь к IT-команде самиздата</a>.
|
||||||
код платформы для независимой журналистики, а также всех наших спецпроектов
|
Открытый код платформы для независимой журналистики, а также всех наших спецпроектов
|
||||||
и медиаинструментов находится{' '}
|
и медиаинструментов находится{' '}
|
||||||
<a href="https://github.com/Discours">в свободном доступе на GitHub</a>.
|
<a href="https://github.com/Discours">в свободном доступе на GitHub</a>.
|
||||||
</p>
|
</p>
|
||||||
|
@ -115,7 +131,8 @@ export const ManifestPage = () => {
|
||||||
<p>
|
<p>
|
||||||
Советуйте Дискурс друзьям и знакомым. Обсуждайте и распространяйте наши
|
Советуйте Дискурс друзьям и знакомым. Обсуждайте и распространяйте наши
|
||||||
публикации — все материалы открытой редакции можно читать и перепечатывать
|
публикации — все материалы открытой редакции можно читать и перепечатывать
|
||||||
бесплатно. Подпишитесь на самиздат <a href="https://vk.com/discoursio">ВКонтакте</a>, в
|
бесплатно. Подпишитесь на самиздат <a href="https://vk.com/discoursio">ВКонтакте</a>,
|
||||||
|
в
|
||||||
<a href="https://facebook.com/discoursio">Фейсбуке</a> и в
|
<a href="https://facebook.com/discoursio">Фейсбуке</a> и в
|
||||||
<a href="https://t.me/discoursio">Телеграме</a>, а также на
|
<a href="https://t.me/discoursio">Телеграме</a>, а также на
|
||||||
<Opener name="subscribe">рассылку лучших материалов</Opener>, чтобы не пропустить ничего
|
<Opener name="subscribe">рассылку лучших материалов</Opener>, чтобы не пропустить ничего
|
||||||
|
@ -135,11 +152,13 @@ export const ManifestPage = () => {
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Если вы хотите предложить материал, сотрудничать, рассказать о проблеме, которую нужно
|
Если вы хотите предложить материал, сотрудничать, рассказать о проблеме, которую нужно
|
||||||
осветить, сообщить об ошибке или баге, что-то обсудить, уточнить или посоветовать, пожалуйста,{' '}
|
осветить, сообщить об ошибке или баге, что-то обсудить, уточнить или посоветовать,
|
||||||
<Opener name="feedback">напишите нам здесь</Opener> или на почту{' '}
|
пожалуйста, <Opener name="feedback">напишите нам здесь</Opener> или на почту{' '}
|
||||||
<a href="mailto:welcome@discours.io">welcome@discours.io</a>. Мы обязательно ответим
|
<a href="mailto:welcome@discours.io">welcome@discours.io</a>. Мы обязательно ответим
|
||||||
и постараемся реализовать все хорошие задумки.
|
и постараемся реализовать все хорошие задумки.
|
||||||
</p>
|
</p>
|
||||||
|
</article>
|
||||||
|
</>
|
||||||
</StaticPage>
|
</StaticPage>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,18 +1,36 @@
|
||||||
import { PageLayout } from '../../components/_shared/PageLayout'
|
import { Meta } from '@solidjs/meta'
|
||||||
|
|
||||||
|
import { StaticPage } from '../../components/Views/StaticPage'
|
||||||
import { useLocalize } from '../../context/localize'
|
import { useLocalize } from '../../context/localize'
|
||||||
|
import { getImageUrl } from '../../utils/getImageUrl'
|
||||||
|
|
||||||
export const PartnersPage = () => {
|
export const PartnersPage = () => {
|
||||||
const { t } = useLocalize()
|
const { t } = useLocalize()
|
||||||
|
|
||||||
|
const ogTitle = t('Partners')
|
||||||
|
const ogImage = getImageUrl('production/image/logo_image.png')
|
||||||
|
const description = t('Discours Partners')
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<PageLayout title={t('Partners')}>
|
<StaticPage title={ogTitle}>
|
||||||
<article class="wide-container container--static-page">
|
<article class="wide-container container--static-page">
|
||||||
|
<Meta name="descprition" content={description} />
|
||||||
|
<Meta name="keywords" content={t('keywords')} />
|
||||||
|
<Meta name="og:type" content="article" />
|
||||||
|
<Meta name="og:title" content={ogTitle} />
|
||||||
|
<Meta name="og:image" content={ogImage} />
|
||||||
|
<Meta name="twitter:image" content={ogImage} />
|
||||||
|
<Meta name="og:description" content={description} />
|
||||||
|
<Meta name="twitter:card" content="summary_large_image" />
|
||||||
|
<Meta name="twitter:title" content={ogTitle} />
|
||||||
|
<Meta name="twitter:description" content={description} />
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-12 col-xl-14 offset-md-5 order-md-first">
|
<div class="col-md-12 col-xl-14 offset-md-5 order-md-first">
|
||||||
<h1>{t('Partners')}</h1>
|
<h1>{t('Partners')}</h1>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</article>
|
</article>
|
||||||
</PageLayout>
|
</StaticPage>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,43 +1,57 @@
|
||||||
import { PageLayout } from '../../components/_shared/PageLayout'
|
import { Meta } from '@solidjs/meta'
|
||||||
|
|
||||||
|
import { StaticPage } from '../../components/Views/StaticPage'
|
||||||
import { useLocalize } from '../../context/localize'
|
import { useLocalize } from '../../context/localize'
|
||||||
|
import { getImageUrl } from '../../utils/getImageUrl'
|
||||||
|
|
||||||
export const PrinciplesPage = () => {
|
export const PrinciplesPage = () => {
|
||||||
const { t } = useLocalize()
|
const { t } = useLocalize()
|
||||||
|
|
||||||
|
const ogImage = getImageUrl('production/image/logo_image.png')
|
||||||
|
const ogTitle = t('Community Principles')
|
||||||
|
const description = t('Community values and rules of engagement for the open editorial team')
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<PageLayout title={t('Principles')}>
|
<StaticPage title={ogTitle}>
|
||||||
<article class="wide-container container--static-page">
|
<article class="wide-container container--static-page">
|
||||||
<div class="row">
|
<Meta name="descprition" content={description} />
|
||||||
<div class="col-md-12 col-xl-14 offset-md-5 order-md-first">
|
<Meta name="keywords" content={t('principles keywords')} />
|
||||||
|
<Meta name="og:type" content="article" />
|
||||||
|
<Meta name="og:title" content={ogTitle} />
|
||||||
|
<Meta name="og:image" content={ogImage} />
|
||||||
|
<Meta name="twitter:image" content={ogImage} />
|
||||||
|
<Meta name="og:description" content={description} />
|
||||||
|
<Meta name="twitter:card" content="summary_large_image" />
|
||||||
|
<Meta name="twitter:title" content={ogTitle} />
|
||||||
|
<Meta name="twitter:description" content={description} />
|
||||||
<h1>
|
<h1>
|
||||||
<span class="wrapped">{t('Principles')}</span>
|
<span class="wrapped">{ogTitle}</span>
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<ol>
|
<ol>
|
||||||
<li>
|
<li>
|
||||||
<p>
|
<p>
|
||||||
<strong>Горизонтальность</strong>. Мы все разные, и это классно. Вертикалей
|
<strong>Горизонтальность</strong>. Мы все разные, и это классно. Вертикалей
|
||||||
в мире достаточно, мы — горизонтальное сообщество и ценим наши
|
в мире достаточно, мы — горизонтальное сообщество и ценим наши различия,
|
||||||
различия, потому что знаем — в них наша сила. Благодаря разнообразию сотен
|
потому что знаем — в них наша сила. Благодаря разнообразию сотен голосов,
|
||||||
голосов, усиливающих друг друга, в сообществе складывается неповторимая синергия,
|
усиливающих друг друга, в сообществе складывается неповторимая синергия, которая помогает
|
||||||
которая помогает вместе достигать большего.
|
вместе достигать большего.
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>
|
<p>
|
||||||
<strong>Многоголосие</strong>. Мы ценим свободу слова и аргументированные
|
<strong>Многоголосие</strong>. Мы ценим свободу слова и аргументированные мнения.
|
||||||
мнения. Предоставляя трибуну каждому, кому есть что сказать, самиздат отражает полифонию
|
Предоставляя трибуну каждому, кому есть что сказать, самиздат отражает полифонию позиций,
|
||||||
позиций, знаний и опыта, которые открывают более полную картину реальности.
|
знаний и опыта, которые открывают более полную картину реальности.
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>
|
<p>
|
||||||
<strong>Взаимопомощь</strong>. Мы помогаем друг другу, потому что хотим, чтобы
|
<strong>Взаимопомощь</strong>. Мы помогаем друг другу, потому что хотим, чтобы
|
||||||
в мире было еще больше хорошего. Обсуждая что-то, мы всегда интересуемся, чем
|
в мире было еще больше хорошего. Обсуждая что-то, мы всегда интересуемся, чем можем
|
||||||
можем помочь. В самиздате можно найти специалистов практически в любых сферах
|
помочь. В самиздате можно найти специалистов практически в любых сферах
|
||||||
и получить поддержку от сотен людей. Благодаря коллективной экспертизе
|
и получить поддержку от сотен людей. Благодаря коллективной экспертизе глобального
|
||||||
глобального сообщества в самиздате выходят крутейшие публикации, которыми можно вечно
|
сообщества в самиздате выходят крутейшие публикации, которыми можно вечно гордиться.
|
||||||
гордиться.
|
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
|
@ -51,9 +65,9 @@ export const PrinciplesPage = () => {
|
||||||
<li>
|
<li>
|
||||||
<p>
|
<p>
|
||||||
<strong>Созидание</strong>. Мы создаем, потому что любим создавать. Мы открыто
|
<strong>Созидание</strong>. Мы создаем, потому что любим создавать. Мы открыто
|
||||||
делимся опытом, дарим идеи, обмениваемся мнениями и благодарим за критику,
|
делимся опытом, дарим идеи, обмениваемся мнениями и благодарим за критику, используя
|
||||||
используя ее для совершенствования мастерства и саморазвития. Мы знаем, что
|
ее для совершенствования мастерства и саморазвития. Мы знаем, что мир
|
||||||
мир не идеальное место, и делаем всё возможное, чтобы он стал лучше.
|
не идеальное место, и делаем всё возможное, чтобы он стал лучше.
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
</ol>
|
</ol>
|
||||||
|
@ -63,21 +77,21 @@ export const PrinciplesPage = () => {
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Открытая редакция объединяет сотни потрясающих людей со всего мира, которые делают
|
Открытая редакция объединяет сотни потрясающих людей со всего мира, которые делают крутейшие
|
||||||
крутейшие вещи. Это пространство, где доверяют, вдохновляют, исследуют и создают новое
|
вещи. Это пространство, где доверяют, вдохновляют, исследуют и создают новое вместе.
|
||||||
вместе. Поскольку все в сообществе очень разные, как-то мы собрались и решили
|
Поскольку все в сообществе очень разные, как-то мы собрались и решили зафиксировать
|
||||||
зафиксировать базовые ценности открытой редакции, а заодно придумали универсальные
|
базовые ценности открытой редакции, а заодно придумали универсальные правила взаимодействия,
|
||||||
правила взаимодействия, чтобы общение было не только плодотворным,
|
чтобы общение было не только плодотворным, но и приятным для всех участников
|
||||||
но и приятным для всех участников сообщества.
|
сообщества.
|
||||||
</p>
|
</p>
|
||||||
<ol>
|
<ol>
|
||||||
<li>
|
<li>
|
||||||
<p>
|
<p>
|
||||||
<strong>Действуем, помогаем и делимся</strong>. В редакции мы создаем свои
|
<strong>Действуем, помогаем и делимся</strong>. В редакции мы создаем свои
|
||||||
проекты и помогаем другим создавать свои — советами, делом, участием,
|
проекты и помогаем другим создавать свои — советами, делом, участием,
|
||||||
вовлеченностью. Мы открыто делимся опытом, мнениями и идеями, потому что ценим
|
вовлеченностью. Мы открыто делимся опытом, мнениями и идеями, потому что ценим силу
|
||||||
силу сотрудничества и знаем, что идеи реализуются скорее, лучше и веселее, если
|
сотрудничества и знаем, что идеи реализуются скорее, лучше и веселее, если над ними
|
||||||
над ними трудиться сообща.
|
трудиться сообща.
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
|
@ -109,12 +123,12 @@ export const PrinciplesPage = () => {
|
||||||
<p>
|
<p>
|
||||||
<strong>Решаем трудности не агрессией, а диалогом</strong>. Обесценивать мнения
|
<strong>Решаем трудности не агрессией, а диалогом</strong>. Обесценивать мнения
|
||||||
и оскорблять других людей только потому, что вы с ними
|
и оскорблять других людей только потому, что вы с ними
|
||||||
не согласны, — не лучший способ донести свою точку зрения. Конечно,
|
не согласны, — не лучший способ донести свою точку зрения. Конечно, важно
|
||||||
важно высказаться, если вас что-то не устраивает и откровенно бесит.
|
высказаться, если вас что-то не устраивает и откровенно бесит. Но прежде чем
|
||||||
Но прежде чем сжигать оппонента гневом, попробуйте понять, почему этот
|
сжигать оппонента гневом, попробуйте понять, почему этот «нехороший человек» так
|
||||||
«нехороший человек» так поступает. Возможно, аргументы собеседника окажутся
|
поступает. Возможно, аргументы собеседника окажутся убедительными или вам удастся изменить его
|
||||||
убедительными или вам удастся изменить его мнение. В любом случае конфликты решаются
|
мнение. В любом случае конфликты решаются в диалогах и проходят,
|
||||||
в диалогах и проходят, а налаженное взаимопонимание останется надолго.
|
а налаженное взаимопонимание останется надолго.
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
|
@ -124,8 +138,7 @@ export const PrinciplesPage = () => {
|
||||||
Всегда мудрее обсуждать точку зрения человека, а не его самого, даже если
|
Всегда мудрее обсуждать точку зрения человека, а не его самого, даже если
|
||||||
он вам не импонирует. Предвзятое отношение ограничивает кругозор, добавляет
|
он вам не импонирует. Предвзятое отношение ограничивает кругозор, добавляет
|
||||||
преждевременные морщины и не помогает окружающим стать лучше. Вежливость
|
преждевременные морщины и не помогает окружающим стать лучше. Вежливость
|
||||||
и взаимоуважение — краеугольная основа вдумчивых и осмысленных
|
и взаимоуважение — краеугольная основа вдумчивых и осмысленных дискуссий.
|
||||||
дискуссий.
|
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
|
@ -133,9 +146,9 @@ export const PrinciplesPage = () => {
|
||||||
<p>
|
<p>
|
||||||
<strong>Благодарим за помощь</strong>. Благодарите коллег даже за самые,
|
<strong>Благодарим за помощь</strong>. Благодарите коллег даже за самые,
|
||||||
казалось бы, простые вещи. «Спасибо» не зря называют волшебным
|
казалось бы, простые вещи. «Спасибо» не зря называют волшебным
|
||||||
словом — на искренней благодарности держится любое подлинное
|
словом — на искренней благодарности держится любое подлинное сотрудничество.
|
||||||
сотрудничество. Поддержка воодушевляет на новые подвиги и напоминает, что мир
|
Поддержка воодушевляет на новые подвиги и напоминает, что мир делают прекрасным
|
||||||
делают прекрасным не машины, а живые люди.
|
не машины, а живые люди.
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
|
@ -151,29 +164,27 @@ export const PrinciplesPage = () => {
|
||||||
|
|
||||||
<li>
|
<li>
|
||||||
<p>
|
<p>
|
||||||
<strong>Вместе создаем идеальную среду общения</strong>. Открытая редакция —
|
<strong>Вместе создаем идеальную среду общения</strong>. Открытая редакция — это
|
||||||
это утопическое пространство обогащающей и осмысленной коммуникации. Атмосфера
|
утопическое пространство обогащающей и осмысленной коммуникации. Атмосфера
|
||||||
горизонтального сообщества складывается из действий каждого, поэтому
|
горизонтального сообщества складывается из действий каждого, поэтому мы действуем
|
||||||
мы действуем так, чтобы способствовать сотворчеству, коллективному познанию
|
так, чтобы способствовать сотворчеству, коллективному познанию и развитию самиздата
|
||||||
и развитию самиздата и нашей альтернативной интеллектуальной медиасреды.
|
и нашей альтернативной интеллектуальной медиасреды.
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li>
|
<li>
|
||||||
<p>
|
<p>
|
||||||
<strong>Помним, что всё в сообществе зависит от нас</strong>. Если нам чего-то
|
<strong>Помним, что всё в сообществе зависит от нас</strong>. Если нам чего-то
|
||||||
не хватает, мы начинаем действовать — рассказываем об идее,
|
не хватает, мы начинаем действовать — рассказываем об идее, находим
|
||||||
находим единомышленников, готовим и запускаем проект. Так в сообществе
|
единомышленников, готовим и запускаем проект. Так в сообществе становится
|
||||||
становится на одну крутую активность больше. Так появилось наше сообщество. Так
|
на одну крутую активность больше. Так появилось наше сообщество. Так появился самиздат
|
||||||
появился самиздат и все проекты открытой редакции. Чтобы в сообществе случилось
|
и все проекты открытой редакции. Чтобы в сообществе случилось что-то прекрасное,
|
||||||
что-то прекрасное, достаточно просто положить этому начало.
|
достаточно просто положить этому начало.
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
</ol>
|
</ol>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</article>
|
</article>
|
||||||
</PageLayout>
|
</StaticPage>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,72 +1,38 @@
|
||||||
import { Meta } from '@solidjs/meta'
|
import { Meta } from '@solidjs/meta'
|
||||||
import { createSignal, Show } from 'solid-js'
|
|
||||||
|
|
||||||
import { Icon } from '../../components/_shared/Icon'
|
import { StaticPage } from '../../components/Views/StaticPage'
|
||||||
import { PageLayout } from '../../components/_shared/PageLayout'
|
|
||||||
import { useLocalize } from '../../context/localize'
|
import { useLocalize } from '../../context/localize'
|
||||||
|
import { getImageUrl } from '../../utils/getImageUrl'
|
||||||
|
|
||||||
export const TermsOfUsePage = () => {
|
export const TermsOfUsePage = () => {
|
||||||
const { t } = useLocalize()
|
const { t } = useLocalize()
|
||||||
const [indexExpanded, setIndexExpanded] = createSignal(true)
|
|
||||||
|
|
||||||
const toggleIndexExpanded = () => setIndexExpanded((oldExpanded) => !oldExpanded)
|
const ogTitle = t('Terms of use')
|
||||||
|
const ogImage = getImageUrl('production/image/logo_image.png')
|
||||||
|
const description = t('Rules of the journal Discours')
|
||||||
|
|
||||||
const title = t('Terms of use')
|
|
||||||
return (
|
return (
|
||||||
<PageLayout title={title}>
|
<StaticPage title={ogTitle}>
|
||||||
<Meta name="description" content={title} />
|
<Meta name="descprition" content={description} />
|
||||||
<Meta name="keywords" content={`Discours.io, ${title}`} />
|
<Meta name="keywords" content={t('terms of use keywords')} />
|
||||||
<Meta property="og:title" content={title} />
|
<Meta name="og:type" content="article" />
|
||||||
<Meta property="og:description" content={title} />
|
<Meta name="og:title" content={ogTitle} />
|
||||||
|
<Meta name="og:image" content={ogImage} />
|
||||||
|
<Meta name="twitter:image" content={ogImage} />
|
||||||
|
<Meta name="og:description" content={description} />
|
||||||
|
<Meta name="twitter:card" content="summary_large_image" />
|
||||||
|
<Meta name="twitter:title" content={ogTitle} />
|
||||||
|
<Meta name="twitter:description" content={description} />
|
||||||
|
|
||||||
<article class="wide-container container--static-page">
|
<article class="wide-container container--static-page">
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-6 col-lg-4 order-md-last">
|
|
||||||
<button class="button button--content-index" onClick={toggleIndexExpanded}>
|
|
||||||
<Show when={!indexExpanded()}>
|
|
||||||
<Icon name="content-index-control" />
|
|
||||||
</Show>
|
|
||||||
<Show when={indexExpanded()}>
|
|
||||||
<Icon name="content-index-control-expanded" class={'expanded'} />
|
|
||||||
</Show>
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<Show when={indexExpanded()}>
|
|
||||||
<nav class="content-index">
|
|
||||||
<h4>Оглавление</h4>
|
|
||||||
|
|
||||||
<ul class="nodash">
|
|
||||||
<li>
|
|
||||||
<a href="#terms-of-use">Пользовательское соглашение</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="#definitions">Определения</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="#copyright">Авторские права</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="#rules">Правила поведения</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="#privacy-policy">Политика конфиденциальности</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="#feedback">Обратная связь</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
</Show>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-md-12 col-xl-14 offset-md-5 order-md-first">
|
|
||||||
<h1 id="terms-of-use">
|
<h1 id="terms-of-use">
|
||||||
<span class="wrapped">Пользовательское соглашение</span>
|
<span class="wrapped">Пользовательское соглашение</span>
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Дискурс — это сообщество творческих людей, объединенных идеей делать интересный
|
Дискурс — это сообщество творческих людей, объединенных идеей делать интересный журнал
|
||||||
журнал для всех желающих. Авторы Дискурса сообща посредством прямого голосования определяют
|
для всех желающих. Авторы Дискурса сообща посредством прямого голосования определяют содержание
|
||||||
содержание журнала.
|
журнала.
|
||||||
</p>
|
</p>
|
||||||
<p>Для того, чтобы Дискурс работал без помех, разработаны настоящие Правила.</p>
|
<p>Для того, чтобы Дискурс работал без помех, разработаны настоящие Правила.</p>
|
||||||
<h3 id="definitions">Определения</h3>
|
<h3 id="definitions">Определения</h3>
|
||||||
|
@ -87,34 +53,33 @@ export const TermsOfUsePage = () => {
|
||||||
Издательство не вмешивается в принятие редакционных решений авторским сообществом.
|
Издательство не вмешивается в принятие редакционных решений авторским сообществом.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<strong>Альманах «Дискурс»</strong> (свидетельство о регистрации СМИ: ПИ
|
<strong>Альманах «Дискурс»</strong> (свидетельство о регистрации СМИ: ПИ №
|
||||||
№ ФС77-63947 от 18.12.15) — печатное периодическое издание, которое
|
ФС77-63947 от 18.12.15) — печатное периодическое издание, которое выходит раз
|
||||||
выходит раз в год и состоит из лучших публикаций на Сайте за это
|
в год и состоит из лучших публикаций на Сайте за это время.
|
||||||
время.
|
|
||||||
</p>
|
</p>
|
||||||
<h3 id="copyright">Авторские права</h3>
|
<h3 id="copyright">Авторские права</h3>
|
||||||
<ol>
|
<ol>
|
||||||
<li>
|
<li>
|
||||||
<p>
|
<p>
|
||||||
Вся информация на сайте (включая тексты, изображения, видеоматериалы, аудиозаписи,
|
Вся информация на сайте (включая тексты, изображения, видеоматериалы, аудиозаписи,
|
||||||
программный код, дизайн сайта и т.д.) является объектом интеллектуальной
|
программный код, дизайн сайта и т.д.) является объектом интеллектуальной собственности
|
||||||
собственности ее правообладателей и охраняется законодательством РФ.
|
ее правообладателей и охраняется законодательством РФ.
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>
|
<p>
|
||||||
Публикуя контент на сайте, Пользователь на безвозмездной основе предоставляет
|
Публикуя контент на сайте, Пользователь на безвозмездной основе предоставляет
|
||||||
Издательству право на воспроизведение, распространение, перевод, редактирование
|
Издательству право на воспроизведение, распространение, перевод, редактирование контента.
|
||||||
контента. Данное право предоставляется Издательству на весь срок действия авторских
|
Данное право предоставляется Издательству на весь срок действия авторских прав
|
||||||
прав Пользователя.
|
Пользователя.
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>
|
<p>
|
||||||
Пользователь предоставляет Издательству право редактировать контент, в том числе
|
Пользователь предоставляет Издательству право редактировать контент, в том числе вносить
|
||||||
вносить в него изменения, сокращения и дополнения, снабжать его иллюстрациями
|
в него изменения, сокращения и дополнения, снабжать его иллюстрациями
|
||||||
и пояснениями, исправлять ошибки и уточнять фактические сведения, при условии,
|
и пояснениями, исправлять ошибки и уточнять фактические сведения, при условии, что
|
||||||
что этим не искажается авторский замысел.
|
этим не искажается авторский замысел.
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
|
@ -124,17 +89,16 @@ export const TermsOfUsePage = () => {
|
||||||
<a href="https://creativecommons.org/licenses/by-nc-nd/4.0/deed.ru" target="_blank">
|
<a href="https://creativecommons.org/licenses/by-nc-nd/4.0/deed.ru" target="_blank">
|
||||||
Creative Commons BY-NC-ND 4.0
|
Creative Commons BY-NC-ND 4.0
|
||||||
</a>
|
</a>
|
||||||
. Все материалы сайта предназначены исключительно для личного некоммерческого
|
. Все материалы сайта предназначены исключительно для личного некоммерческого использования.
|
||||||
использования. Права на дизайн и программный код сайта принадлежат Издательству.
|
Права на дизайн и программный код сайта принадлежат Издательству.
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p class="ng-binding">
|
<p class="ng-binding">
|
||||||
Все аудиовизуальные произведения являются собственностью своих авторов
|
Все аудиовизуальные произведения являются собственностью своих авторов и правообладателей
|
||||||
и правообладателей и используются только в образовательных
|
и используются только в образовательных и информационных целях. Если
|
||||||
и информационных целях. Если вы являетесь собственником того или иного
|
вы являетесь собственником того или иного произведения и не согласны с его
|
||||||
произведения и не согласны с его размещением на сайте, пожалуйста,
|
размещением на сайте, пожалуйста, напишите на
|
||||||
напишите на
|
|
||||||
<a href="mailto:welcome@discours.io" target="_blank">
|
<a href="mailto:welcome@discours.io" target="_blank">
|
||||||
welcome@discours.io
|
welcome@discours.io
|
||||||
</a>
|
</a>
|
||||||
|
@ -162,9 +126,9 @@ export const TermsOfUsePage = () => {
|
||||||
<h4>На сайте запрещено:</h4>
|
<h4>На сайте запрещено:</h4>
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
Публиковать контент, авторские права на который принадлежат третьим лицам, без
|
Публиковать контент, авторские права на который принадлежат третьим лицам, без согласия
|
||||||
согласия этих лиц. Если авторские права на контент принадлежат нескольким лицам,
|
этих лиц. Если авторские права на контент принадлежат нескольким лицам, то его
|
||||||
то его публикация предполагает согласие их всех.
|
публикация предполагает согласие их всех.
|
||||||
</li>
|
</li>
|
||||||
<li>Размещать коммерческую и политическую рекламу.</li>
|
<li>Размещать коммерческую и политическую рекламу.</li>
|
||||||
<li>
|
<li>
|
||||||
|
@ -173,29 +137,28 @@ export const TermsOfUsePage = () => {
|
||||||
</li>
|
</li>
|
||||||
<li>Выдавать себя за другого человека и представляться его именем.</li>
|
<li>Выдавать себя за другого человека и представляться его именем.</li>
|
||||||
<li>
|
<li>
|
||||||
Размещать информацию, которая не соответствует целям создания Сайта, ущемляет
|
Размещать информацию, которая не соответствует целям создания Сайта, ущемляет интересы
|
||||||
интересы других пользователей или третьих лиц, нарушает законы Российской Федерации.
|
других пользователей или третьих лиц, нарушает законы Российской Федерации.
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>
|
<p>
|
||||||
Пользователь несет всю ответственность за содержание публикуемого контента
|
Пользователь несет всю ответственность за содержание публикуемого контента и свое
|
||||||
и свое взаимодействие с другими пользователями, и обязуется возместить все
|
взаимодействие с другими пользователями, и обязуется возместить все расходы
|
||||||
расходы в случае предъявления каких-либо претензий третьими лицами. Издательство
|
в случае предъявления каких-либо претензий третьими лицами. Издательство не несет
|
||||||
не несет ответственности за содержание публикуемой пользователями информации,
|
ответственности за содержание публикуемой пользователями информации, в том числе
|
||||||
в том числе за размещенные на сайте комментарии. Переписка между
|
за размещенные на сайте комментарии. Переписка между Пользователем
|
||||||
Пользователем и Издательством считается юридически значимой. Настоящие Правила могут
|
и Издательством считается юридически значимой. Настоящие Правила могут быть изменены
|
||||||
быть изменены Издательством, изменения вступают в силу с момента публикации
|
Издательством, изменения вступают в силу с момента публикации на Сайте.
|
||||||
на Сайте.
|
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>
|
<p>
|
||||||
Если Пользователь очевидно и целенаправленно нарушает правила, Издательство может
|
Если Пользователь очевидно и целенаправленно нарушает правила, Издательство может
|
||||||
и принять в отношении автора следующие меры: вынести предупреждение
|
и принять в отношении автора следующие меры: вынести предупреждение и обязать
|
||||||
и обязать автора устранить допущенное нарушение, удалить контент, нарушающий правила,
|
автора устранить допущенное нарушение, удалить контент, нарушающий правила, заблокировать или
|
||||||
заблокировать или удалить аккаунт нарушителя.
|
удалить аккаунт нарушителя.
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
</ol>
|
</ol>
|
||||||
|
@ -208,18 +171,17 @@ export const TermsOfUsePage = () => {
|
||||||
<p>
|
<p>
|
||||||
Данные, которые пользователи сообщают о себе сами при подаче заявки, регистрации,
|
Данные, которые пользователи сообщают о себе сами при подаче заявки, регистрации,
|
||||||
авторизации или заполнения профиля, в том числе ФИО и контактную информацию.
|
авторизации или заполнения профиля, в том числе ФИО и контактную информацию.
|
||||||
Конфиденциальные данные, такие как идентификатор и электронный адрес,
|
Конфиденциальные данные, такие как идентификатор и электронный адрес, используются
|
||||||
используются для идентификации пользователя. Данные профиля, размещённые публично
|
для идентификации пользователя. Данные профиля, размещённые публично по желанию
|
||||||
по желанию пользователя, которое выражается фактом их предоставления,
|
пользователя, которое выражается фактом их предоставления, используется для
|
||||||
используется для демонстрации другим пользователям той информации о себе, которую
|
демонстрации другим пользователям той информации о себе, которую пользователь готов
|
||||||
пользователь готов предоставить.
|
предоставить.
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>
|
<p>
|
||||||
Данные, собранные автоматическим путем, такие, как cookie-файлы. Эти
|
Данные, собранные автоматическим путем, такие, как cookie-файлы. Эти неперсонализированные
|
||||||
неперсонализированные данные могут использоваться для сбора статистики
|
данные могут использоваться для сбора статистики и улучшения работы сайта.
|
||||||
и улучшения работы сайта.
|
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -242,8 +204,8 @@ export const TermsOfUsePage = () => {
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>
|
<p>
|
||||||
Если в информации, предоставляемой Издательству Пользователем, содержатся
|
Если в информации, предоставляемой Издательству Пользователем, содержатся персональные
|
||||||
персональные данные последнего, то фактом их предоставления он соглашается
|
данные последнего, то фактом их предоставления он соглашается
|
||||||
на их обработку любым способом, не запрещенным законодательством РФ.
|
на их обработку любым способом, не запрещенным законодательством РФ.
|
||||||
</p>
|
</p>
|
||||||
<p class="ng-binding">
|
<p class="ng-binding">
|
||||||
|
@ -260,8 +222,8 @@ export const TermsOfUsePage = () => {
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>
|
<p>
|
||||||
Данные, которые мы получаем от вас, мы используем только
|
Данные, которые мы получаем от вас, мы используем только в соответствии
|
||||||
в соответствии с принципами обработки данных, указанными в этом документе.
|
с принципами обработки данных, указанными в этом документе.
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
</ol>
|
</ol>
|
||||||
|
@ -274,10 +236,8 @@ export const TermsOfUsePage = () => {
|
||||||
</a>{' '}
|
</a>{' '}
|
||||||
или через форму <a href="/connect">«предложить идею»</a>.
|
или через форму <a href="/connect">«предложить идею»</a>.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</article>
|
</article>
|
||||||
</PageLayout>
|
</StaticPage>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,22 +1,32 @@
|
||||||
import { Meta } from '@solidjs/meta'
|
import { Meta } from '@solidjs/meta'
|
||||||
|
|
||||||
import { PageLayout } from '../../components/_shared/PageLayout'
|
import { StaticPage } from '../../components/Views/StaticPage'
|
||||||
import { useLocalize } from '../../context/localize'
|
import { useLocalize } from '../../context/localize'
|
||||||
|
import { getImageUrl } from '../../utils/getImageUrl'
|
||||||
|
|
||||||
export const ThanksPage = () => {
|
export const ThanksPage = () => {
|
||||||
const { t } = useLocalize()
|
const { t } = useLocalize()
|
||||||
const title = t('Thank you')
|
const ogImage = getImageUrl('production/image/logo_image.png')
|
||||||
|
const ogTitle = t('Thank you')
|
||||||
|
const description = t(
|
||||||
|
'Self-publishing exists thanks to the help of wonderful people from all over the world. Thank you!',
|
||||||
|
)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<PageLayout title={title}>
|
<StaticPage title={ogTitle}>
|
||||||
<Meta name="description" content={title} />
|
|
||||||
<Meta name="keywords" content={`Discours.io, ${title}`} />
|
|
||||||
<Meta property="og:title" content={title} />
|
|
||||||
<Meta property="og:description" content={title} />
|
|
||||||
<article class="wide-container container--static-page">
|
<article class="wide-container container--static-page">
|
||||||
<div class="row">
|
<Meta name="descprition" content={description} />
|
||||||
<div class="col-md-12 col-xl-14 offset-md-5 order-md-first">
|
<Meta name="keywords" content={t('keywords')} />
|
||||||
|
<Meta name="og:type" content="article" />
|
||||||
|
<Meta name="og:title" content={ogTitle} />
|
||||||
|
<Meta name="og:image" content={ogImage} />
|
||||||
|
<Meta name="twitter:image" content={ogImage} />
|
||||||
|
<Meta name="og:description" content={description} />
|
||||||
|
<Meta name="twitter:card" content="summary_large_image" />
|
||||||
|
<Meta name="twitter:title" content={ogTitle} />
|
||||||
|
<Meta name="twitter:description" content={description} />
|
||||||
<h1>
|
<h1>
|
||||||
<span class="wrapped">{title}</span>
|
<span class="wrapped">{ogTitle}</span>
|
||||||
</h1>
|
</h1>
|
||||||
{/*
|
{/*
|
||||||
<h3><b>Команда</b></h3>
|
<h3><b>Команда</b></h3>
|
||||||
|
@ -45,14 +55,13 @@ export const ThanksPage = () => {
|
||||||
*/}
|
*/}
|
||||||
<h3>Неоценимый вклад в Дискурс внесли и вносят</h3>
|
<h3>Неоценимый вклад в Дискурс внесли и вносят</h3>
|
||||||
<p>
|
<p>
|
||||||
Мария Бессмертная, Дамир Бикчурин, Константин Ворович, Ян Выговский, Эльдар Гариффулин,
|
Мария Бессмертная, Дамир Бикчурин, Константин Ворович, Ян Выговский, Эльдар Гариффулин, Павел
|
||||||
Павел Гафаров, Виктория Гендлина, Александр Гусев, Данила Давыдов, Константин Дубовик,
|
Гафаров, Виктория Гендлина, Александр Гусев, Данила Давыдов, Константин Дубовик, Вячеслав
|
||||||
Вячеслав Еременко, Кристина Ибрагим, Екатерина Ильина, Анна Капаева, Яна Климова, Александр
|
Еременко, Кристина Ибрагим, Екатерина Ильина, Анна Капаева, Яна Климова, Александр Коренков, Ирэна
|
||||||
Коренков, Ирэна Лесневская, Игорь Лобанов, Анастасия Лозовая, Григорий Ломизе, Евгений
|
Лесневская, Игорь Лобанов, Анастасия Лозовая, Григорий Ломизе, Евгений Медведев, Павел Никулин,
|
||||||
Медведев, Павел Никулин, Николай Носачевский, Андрей Орловский, Михаил Панин, Антон Панов,
|
Николай Носачевский, Андрей Орловский, Михаил Панин, Антон Панов, Павел Пепперштейн, Любовь
|
||||||
Павел Пепперштейн, Любовь Покровская, Илья Розовский, Денис Светличный, Павел Соколов, Сергей
|
Покровская, Илья Розовский, Денис Светличный, Павел Соколов, Сергей Стрельников, Глеб Струнников,
|
||||||
Стрельников, Глеб Струнников, Николай Тарковский, Кирилл Филимонов, Алексей Хапов, Екатерина
|
Николай Тарковский, Кирилл Филимонов, Алексей Хапов, Екатерина Харитонова
|
||||||
Харитонова
|
|
||||||
</p>
|
</p>
|
||||||
<h3>Авторы</h3>
|
<h3>Авторы</h3>
|
||||||
<p>
|
<p>
|
||||||
|
@ -62,28 +71,25 @@ export const ThanksPage = () => {
|
||||||
</a>{' '}
|
</a>{' '}
|
||||||
за участие и поддержку проекта. Сегодня, когда для большинства деньги стали целью
|
за участие и поддержку проекта. Сегодня, когда для большинства деньги стали целью
|
||||||
и основным источником мотивации, бескорыстная помощь и основанный на энтузиазме
|
и основным источником мотивации, бескорыстная помощь и основанный на энтузиазме
|
||||||
труд бесценны. Именно вы своим трудом каждый день делаете Дискурс таким, какой
|
труд бесценны. Именно вы своим трудом каждый день делаете Дискурс таким, какой он есть.
|
||||||
он есть.
|
|
||||||
</p>
|
</p>
|
||||||
<h3>Иллюстраторы</h3>
|
<h3>Иллюстраторы</h3>
|
||||||
<p>
|
<p>
|
||||||
Ольга Аверинова, Регина Акчурина, Айгуль Берхеева, Екатерина Вакуленко, Анастасия Викулова,
|
Ольга Аверинова, Регина Акчурина, Айгуль Берхеева, Екатерина Вакуленко, Анастасия Викулова, Мария
|
||||||
Мария Власенко, Ванесса Гаврилова, Ольга Горше, Ксения Горшкова, Ангелина Гребенюкова, Илья
|
Власенко, Ванесса Гаврилова, Ольга Горше, Ксения Горшкова, Ангелина Гребенюкова, Илья Diliago,
|
||||||
Diliago, Антон Жаголкин, Саша Керова, Ольга Машинец, Злата Мечетина, Тала Никитина, Никита
|
Антон Жаголкин, Саша Керова, Ольга Машинец, Злата Мечетина, Тала Никитина, Никита Поздняков,
|
||||||
Поздняков, Матвей Сапегин, Татьяна Сафонова, Виктория Шибаева
|
Матвей Сапегин, Татьяна Сафонова, Виктория Шибаева
|
||||||
</p>
|
</p>
|
||||||
<h3>Меценаты</h3>
|
<h3>Меценаты</h3>
|
||||||
<p>
|
<p>
|
||||||
Дискурс существует исключительно на пожертвования читателей. Мы бесконечно
|
Дискурс существует исключительно на пожертвования читателей. Мы бесконечно признательны
|
||||||
признательны всем, кто нас поддерживает. Ваши пожертвования — финансовый фундамент
|
всем, кто нас поддерживает. Ваши пожертвования — финансовый фундамент журнала.
|
||||||
журнала. Благодаря вам мы развиваем платформу качественной журналистики, которая помогает
|
Благодаря вам мы развиваем платформу качественной журналистики, которая помогает самым разным
|
||||||
самым разным авторам быть услышанными. Стать нашим меценатом и подписаться
|
авторам быть услышанными. Стать нашим меценатом и подписаться на ежемесячную поддержку
|
||||||
на ежемесячную поддержку проекта можно <a href="/about/help">здесь</a>.
|
проекта можно <a href="/about/help">здесь</a>.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</article>
|
</article>
|
||||||
</PageLayout>
|
</StaticPage>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
import type { PageProps } from './types'
|
import type { PageProps } from './types'
|
||||||
|
|
||||||
import { createSignal, onMount, Show } from 'solid-js'
|
import { createSignal, onMount } from 'solid-js'
|
||||||
|
|
||||||
import { Loading } from '../components/_shared/Loading'
|
|
||||||
import { PageLayout } from '../components/_shared/PageLayout'
|
import { PageLayout } from '../components/_shared/PageLayout'
|
||||||
import { AllAuthorsView } from '../components/Views/AllAuthors'
|
import { AllAuthorsView } from '../components/Views/AllAuthors'
|
||||||
import { useLocalize } from '../context/localize'
|
import { useLocalize } from '../context/localize'
|
||||||
|
@ -24,9 +23,7 @@ export const AllAuthorsPage = (props: PageProps) => {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<PageLayout title={t('Authors')}>
|
<PageLayout title={t('Authors')}>
|
||||||
<Show when={isLoaded()} fallback={<Loading />}>
|
<AllAuthorsView isLoaded={isLoaded()} authors={props.allAuthors} />
|
||||||
<AllAuthorsView authors={props.allAuthors} />
|
|
||||||
</Show>
|
|
||||||
</PageLayout>
|
</PageLayout>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
import type { PageProps } from './types'
|
import type { PageProps } from './types'
|
||||||
|
|
||||||
import { createSignal, onMount, Show } from 'solid-js'
|
import { createSignal, onMount } from 'solid-js'
|
||||||
|
|
||||||
import { Loading } from '../components/_shared/Loading'
|
|
||||||
import { PageLayout } from '../components/_shared/PageLayout'
|
import { PageLayout } from '../components/_shared/PageLayout'
|
||||||
import { AllTopicsView } from '../components/Views/AllTopics'
|
import { AllTopicsView } from '../components/Views/AllTopics'
|
||||||
import { useLocalize } from '../context/localize'
|
import { useLocalize } from '../context/localize'
|
||||||
|
@ -23,10 +22,8 @@ export const AllTopicsPage = (props: PageProps) => {
|
||||||
})
|
})
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<PageLayout title={t('All topics')}>
|
<PageLayout title={t('Themes and plots')}>
|
||||||
<Show when={isLoaded()} fallback={<Loading />}>
|
<AllTopicsView isLoaded={isLoaded()} topics={props.allTopics} />
|
||||||
<AllTopicsView topics={props.allTopics} />
|
|
||||||
</Show>
|
|
||||||
</PageLayout>
|
</PageLayout>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import { redirectPage } from '@nanostores/router'
|
import { redirectPage } from '@nanostores/router'
|
||||||
|
import { Meta } from '@solidjs/meta'
|
||||||
import { clsx } from 'clsx'
|
import { clsx } from 'clsx'
|
||||||
|
|
||||||
import { Button } from '../components/_shared/Button'
|
import { Button } from '../components/_shared/Button'
|
||||||
|
@ -8,6 +9,7 @@ import { AuthGuard } from '../components/AuthGuard'
|
||||||
import { useLocalize } from '../context/localize'
|
import { useLocalize } from '../context/localize'
|
||||||
import { apiClient } from '../graphql/client/core'
|
import { apiClient } from '../graphql/client/core'
|
||||||
import { router } from '../stores/router'
|
import { router } from '../stores/router'
|
||||||
|
import { getImageUrl } from '../utils/getImageUrl'
|
||||||
|
|
||||||
import { LayoutType } from './types'
|
import { LayoutType } from './types'
|
||||||
|
|
||||||
|
@ -22,9 +24,22 @@ const handleCreate = async (layout: LayoutType) => {
|
||||||
|
|
||||||
export const CreatePage = () => {
|
export const CreatePage = () => {
|
||||||
const { t } = useLocalize()
|
const { t } = useLocalize()
|
||||||
|
const ogImage = getImageUrl('production/image/logo_image.png')
|
||||||
|
const ogTitle = t('Choose a post type')
|
||||||
|
const description = t('Participate in the Discours: share information, join the editorial team')
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<PageLayout title={t('Choose a post type')}>
|
<PageLayout title={ogTitle}>
|
||||||
|
<Meta name="descprition" content={description} />
|
||||||
|
<Meta name="keywords" content={t('keywords')} />
|
||||||
|
<Meta name="og:type" content="article" />
|
||||||
|
<Meta name="og:title" content={ogTitle} />
|
||||||
|
<Meta name="og:image" content={ogImage} />
|
||||||
|
<Meta name="twitter:image" content={ogImage} />
|
||||||
|
<Meta name="og:description" content={description} />
|
||||||
|
<Meta name="twitter:card" content="summary_large_image" />
|
||||||
|
<Meta name="twitter:title" content={ogTitle} />
|
||||||
|
<Meta name="twitter:description" content={description} />
|
||||||
<AuthGuard>
|
<AuthGuard>
|
||||||
<article class={clsx('wide-container', 'container--static-page', styles.Create)}>
|
<article class={clsx('wide-container', 'container--static-page', styles.Create)}>
|
||||||
<h1>{t('Choose a post type')}</h1>
|
<h1>{t('Choose a post type')}</h1>
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import { ROUTES } from '../../stores/router'
|
import { ROUTES } from '../../stores/router'
|
||||||
import { getServerRoute } from '../../utils/getServerRoute'
|
import { getServerRoute } from '../../utils/getServerRoute'
|
||||||
|
|
||||||
export default getServerRoute(ROUTES.expo)
|
// yes, it's a hack
|
||||||
|
export default getServerRoute(ROUTES.expo.replace(':layout?', '*'))
|
||||||
|
|
|
@ -4,12 +4,16 @@ import type { PageProps } from '../types'
|
||||||
import { PRERENDERED_ARTICLES_COUNT } from '../../components/Views/Expo/Expo'
|
import { PRERENDERED_ARTICLES_COUNT } from '../../components/Views/Expo/Expo'
|
||||||
import { apiClient } from '../../graphql/client/core'
|
import { apiClient } from '../../graphql/client/core'
|
||||||
|
|
||||||
export const onBeforeRender = async (_pageContext: PageContext) => {
|
export const onBeforeRender = async (pageContext: PageContext) => {
|
||||||
|
const { layout } = pageContext.routeParams
|
||||||
|
|
||||||
const expoShouts = await apiClient.getShouts({
|
const expoShouts = await apiClient.getShouts({
|
||||||
filters: { layouts: ['audio', 'video', 'literature', 'image'] },
|
filters: { layouts: ['audio', 'video', 'literature', 'image'] },
|
||||||
limit: PRERENDERED_ARTICLES_COUNT,
|
limit: PRERENDERED_ARTICLES_COUNT,
|
||||||
})
|
})
|
||||||
|
|
||||||
const pageProps: PageProps = { expoShouts, seo: { title: '' } }
|
const pageProps: PageProps = { expoShouts, seo: { title: '' } }
|
||||||
|
|
||||||
return {
|
return {
|
||||||
pageContext: {
|
pageContext: {
|
||||||
pageProps,
|
pageProps,
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import type { PageProps } from '../types'
|
import type { PageProps } from '../types'
|
||||||
|
|
||||||
import { createMemo } from 'solid-js'
|
import { createEffect, createMemo, on } from 'solid-js'
|
||||||
|
|
||||||
import { PageLayout } from '../../components/_shared/PageLayout'
|
import { PageLayout } from '../../components/_shared/PageLayout'
|
||||||
import { Topics } from '../../components/Nav/Topics'
|
import { Topics } from '../../components/Nav/Topics'
|
||||||
|
@ -14,7 +14,7 @@ export const ExpoPage = (props: PageProps) => {
|
||||||
const { page } = useRouter()
|
const { page } = useRouter()
|
||||||
const getLayout = createMemo<LayoutType>(() => page().params['layout'] as LayoutType)
|
const getLayout = createMemo<LayoutType>(() => page().params['layout'] as LayoutType)
|
||||||
|
|
||||||
const title = createMemo(() => {
|
const getTitle = () => {
|
||||||
switch (getLayout()) {
|
switch (getLayout()) {
|
||||||
case 'audio': {
|
case 'audio': {
|
||||||
return t('Audio')
|
return t('Audio')
|
||||||
|
@ -32,12 +32,22 @@ export const ExpoPage = (props: PageProps) => {
|
||||||
return t('Art')
|
return t('Art')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
|
|
||||||
|
createEffect(
|
||||||
|
on(
|
||||||
|
() => getLayout(),
|
||||||
|
() => {
|
||||||
|
document.title = getTitle()
|
||||||
|
},
|
||||||
|
{ defer: true },
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<PageLayout withPadding={true} zeroBottomPadding={true} title={title()}>
|
<PageLayout withPadding={true} zeroBottomPadding={true} title={getTitle()}>
|
||||||
<Topics />
|
<Topics />
|
||||||
<Expo shouts={props.expoShouts} />
|
<Expo shouts={props.expoShouts} layout={getLayout()} />
|
||||||
</PageLayout>
|
</PageLayout>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
import { ROUTES } from '../../stores/router'
|
|
||||||
import { getServerRoute } from '../../utils/getServerRoute'
|
|
||||||
|
|
||||||
export default getServerRoute(ROUTES.expoLayout)
|
|
|
@ -1,21 +0,0 @@
|
||||||
import type { PageContext } from '../../renderer/types'
|
|
||||||
import type { PageProps } from '../types'
|
|
||||||
|
|
||||||
import { PRERENDERED_ARTICLES_COUNT } from '../../components/Views/Expo/Expo'
|
|
||||||
import { apiClient } from '../../graphql/client/core'
|
|
||||||
|
|
||||||
export const onBeforeRender = async (pageContext: PageContext) => {
|
|
||||||
const { layout } = pageContext.routeParams
|
|
||||||
const options = {
|
|
||||||
filters: { layouts: [layout] },
|
|
||||||
limit: PRERENDERED_ARTICLES_COUNT,
|
|
||||||
}
|
|
||||||
const expoShouts = await apiClient.getShouts(options)
|
|
||||||
const pageProps: PageProps = { expoShouts, seo: { title: '' } }
|
|
||||||
|
|
||||||
return {
|
|
||||||
pageContext: {
|
|
||||||
pageProps,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -2,7 +2,7 @@ import { createEffect, Match, on, onCleanup, Switch } from 'solid-js'
|
||||||
|
|
||||||
import { PageLayout } from '../components/_shared/PageLayout'
|
import { PageLayout } from '../components/_shared/PageLayout'
|
||||||
import { AuthGuard } from '../components/AuthGuard'
|
import { AuthGuard } from '../components/AuthGuard'
|
||||||
import { FeedView } from '../components/Views/Feed'
|
import { Feed } from '../components/Views/Feed'
|
||||||
import { useLocalize } from '../context/localize'
|
import { useLocalize } from '../context/localize'
|
||||||
import { ReactionsProvider } from '../context/reactions'
|
import { ReactionsProvider } from '../context/reactions'
|
||||||
import { LoadShoutsOptions } from '../graphql/schema/core.gen'
|
import { LoadShoutsOptions } from '../graphql/schema/core.gen'
|
||||||
|
@ -40,13 +40,13 @@ export const FeedPage = () => {
|
||||||
return (
|
return (
|
||||||
<PageLayout title={t('Feed')}>
|
<PageLayout title={t('Feed')}>
|
||||||
<ReactionsProvider>
|
<ReactionsProvider>
|
||||||
<Switch fallback={<FeedView loadShouts={handleFeedLoadShouts} />}>
|
<Switch fallback={<Feed loadShouts={handleFeedLoadShouts} />}>
|
||||||
<Match when={page().route === 'feed'}>
|
<Match when={page().route === 'feed'}>
|
||||||
<FeedView loadShouts={handleFeedLoadShouts} />
|
<Feed loadShouts={handleFeedLoadShouts} />
|
||||||
</Match>
|
</Match>
|
||||||
<Match when={page().route === 'feedMy'}>
|
<Match when={page().route === 'feedMy'}>
|
||||||
<AuthGuard>
|
<AuthGuard>
|
||||||
<FeedView loadShouts={handleMyFeedLoadShouts} />
|
<Feed loadShouts={handleMyFeedLoadShouts} />
|
||||||
</AuthGuard>
|
</AuthGuard>
|
||||||
</Match>
|
</Match>
|
||||||
</Switch>
|
</Switch>
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
import type { PageProps } from './types'
|
import type { PageProps } from './types'
|
||||||
|
|
||||||
import { createEffect, createMemo, createSignal, on, onCleanup, onMount, Show } from 'solid-js'
|
import { createEffect, createMemo, createSignal, on, onCleanup, onMount } from 'solid-js'
|
||||||
|
|
||||||
import { Loading } from '../components/_shared/Loading'
|
|
||||||
import { PageLayout } from '../components/_shared/PageLayout'
|
import { PageLayout } from '../components/_shared/PageLayout'
|
||||||
import { PRERENDERED_ARTICLES_COUNT, TopicView } from '../components/Views/Topic'
|
import { PRERENDERED_ARTICLES_COUNT, TopicView } from '../components/Views/Topic'
|
||||||
import { ReactionsProvider } from '../context/reactions'
|
import { ReactionsProvider } from '../context/reactions'
|
||||||
|
@ -12,13 +11,12 @@ import { loadTopic } from '../stores/zine/topics'
|
||||||
|
|
||||||
export const TopicPage = (props: PageProps) => {
|
export const TopicPage = (props: PageProps) => {
|
||||||
const { page } = useRouter()
|
const { page } = useRouter()
|
||||||
|
|
||||||
const slug = createMemo(() => page().params['slug'] as string)
|
const slug = createMemo(() => page().params['slug'] as string)
|
||||||
|
|
||||||
const [isLoaded, setIsLoaded] = createSignal(
|
const [isLoaded, setIsLoaded] = createSignal(
|
||||||
Boolean(props.topicShouts) && Boolean(props.topic) && props.topic.slug === slug(),
|
Boolean(props.topicShouts) && Boolean(props.topic) && props.topic.slug === slug(),
|
||||||
)
|
)
|
||||||
|
const [pageTitle, setPageTitle] = createSignal<string>()
|
||||||
const preload = () =>
|
const preload = () =>
|
||||||
Promise.all([
|
Promise.all([
|
||||||
loadShouts({ filters: { topic: slug() }, limit: PRERENDERED_ARTICLES_COUNT, offset: 0 }),
|
loadShouts({ filters: { topic: slug() }, limit: PRERENDERED_ARTICLES_COUNT, offset: 0 }),
|
||||||
|
@ -53,15 +51,15 @@ export const TopicPage = (props: PageProps) => {
|
||||||
const usePrerenderedData = props.topic?.slug === slug()
|
const usePrerenderedData = props.topic?.slug === slug()
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<PageLayout title={props.seo?.title}>
|
<PageLayout title={pageTitle()}>
|
||||||
<ReactionsProvider>
|
<ReactionsProvider>
|
||||||
<Show when={isLoaded()} fallback={<Loading />}>
|
|
||||||
<TopicView
|
<TopicView
|
||||||
|
title={(title) => setPageTitle(title)}
|
||||||
|
isLoaded={isLoaded()}
|
||||||
topic={usePrerenderedData ? props.topic : null}
|
topic={usePrerenderedData ? props.topic : null}
|
||||||
shouts={usePrerenderedData ? props.topicShouts : null}
|
shouts={usePrerenderedData ? props.topicShouts : null}
|
||||||
topicSlug={slug()}
|
topicSlug={slug()}
|
||||||
/>
|
/>
|
||||||
</Show>
|
|
||||||
</ReactionsProvider>
|
</ReactionsProvider>
|
||||||
</PageLayout>
|
</PageLayout>
|
||||||
)
|
)
|
||||||
|
|
|
@ -37,8 +37,7 @@ export const ROUTES = {
|
||||||
projects: '/about/projects',
|
projects: '/about/projects',
|
||||||
termsOfUse: '/about/terms-of-use',
|
termsOfUse: '/about/terms-of-use',
|
||||||
thanks: '/about/thanks',
|
thanks: '/about/thanks',
|
||||||
expo: '/expo',
|
expo: '/expo/:layout?',
|
||||||
expoLayout: '/expo/:layout',
|
|
||||||
profileSettings: '/profile/settings',
|
profileSettings: '/profile/settings',
|
||||||
profileSecurity: '/profile/security',
|
profileSecurity: '/profile/security',
|
||||||
profileSubscriptions: '/profile/subscriptions',
|
profileSubscriptions: '/profile/subscriptions',
|
||||||
|
|
|
@ -195,14 +195,6 @@ export const resetSortedArticles = () => {
|
||||||
setSortedArticles([])
|
setSortedArticles([])
|
||||||
}
|
}
|
||||||
|
|
||||||
export const createArticle = async ({ article }: { article: ShoutInput }) => {
|
|
||||||
try {
|
|
||||||
await apiClient.createArticle({ article })
|
|
||||||
} catch (error) {
|
|
||||||
console.error(error)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type InitialState = {
|
type InitialState = {
|
||||||
shouts?: Shout[]
|
shouts?: Shout[]
|
||||||
}
|
}
|
||||||
|
|
0
src/utils/apiClient.ts
Normal file
0
src/utils/apiClient.ts
Normal file
4
src/utils/getServerDate.ts
Normal file
4
src/utils/getServerDate.ts
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
export const getServerDate = (date: Date): string => {
|
||||||
|
// 2023-12-31
|
||||||
|
return date.toISOString().slice(0, 10)
|
||||||
|
}
|
|
@ -1,10 +1,24 @@
|
||||||
|
import { Shout } from '../graphql/types.gen'
|
||||||
|
|
||||||
|
const MAX_DESCRIPTION_LENGTH = 150
|
||||||
export const getDescription = (body: string): string => {
|
export const getDescription = (body: string): string => {
|
||||||
if (!body) {
|
if (!body) {
|
||||||
return ''
|
return ''
|
||||||
}
|
}
|
||||||
const descriptionWordsArray = body
|
const descriptionWordsArray = body
|
||||||
.slice(0, 150) // meta description is roughly 155 characters long
|
.replaceAll(/<[^>]*>/g, ' ')
|
||||||
.replaceAll(/<[^>]*>/g, '')
|
.replaceAll(/\s+/g, ' ')
|
||||||
.split(' ')
|
.split(' ')
|
||||||
return descriptionWordsArray.splice(0, descriptionWordsArray.length - 1).join(' ') + '...'
|
// ¯\_(ツ)_/¯ maybe need to remove the punctuation
|
||||||
|
let description = ''
|
||||||
|
let i = 0
|
||||||
|
while (i < descriptionWordsArray.length && description.length < MAX_DESCRIPTION_LENGTH) {
|
||||||
|
description += descriptionWordsArray[i] + ' '
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
return description.trim()
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getKeywords = (shout: Shout): string => {
|
||||||
|
return shout.topics.map((topic) => topic.title).join(', ')
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user