decidim-posts 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (117) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE-AGPLv3.txt +661 -0
  3. data/README.md +40 -0
  4. data/Rakefile +9 -0
  5. data/app/cells/decidim/posts/comments/add_comment.erb +15 -0
  6. data/app/cells/decidim/posts/comments/comments_loading.erb +1 -0
  7. data/app/cells/decidim/posts/comments/order_control.erb +13 -0
  8. data/app/cells/decidim/posts/comments/show.erb +31 -0
  9. data/app/cells/decidim/posts/comments_cell.rb +158 -0
  10. data/app/cells/decidim/posts/content_blocks/posts/show.erb +3 -0
  11. data/app/cells/decidim/posts/content_blocks/posts_cell.rb +50 -0
  12. data/app/cells/decidim/posts/content_blocks/posts_settings_form/show.erb +3 -0
  13. data/app/cells/decidim/posts/content_blocks/posts_settings_form_cell.rb +23 -0
  14. data/app/cells/decidim/posts/feed_dropdown_metadata_cell.rb +19 -0
  15. data/app/cells/decidim/posts/meeting/show.erb +65 -0
  16. data/app/cells/decidim/posts/meeting_cell.rb +44 -0
  17. data/app/cells/decidim/posts/post/show.erb +30 -0
  18. data/app/cells/decidim/posts/post/survey.erb +68 -0
  19. data/app/cells/decidim/posts/post_attachments/show.erb +40 -0
  20. data/app/cells/decidim/posts/post_attachments_cell.rb +17 -0
  21. data/app/cells/decidim/posts/post_cell.rb +44 -0
  22. data/app/cells/decidim/posts/post_comment/show.erb +17 -0
  23. data/app/cells/decidim/posts/post_comment_cell.rb +49 -0
  24. data/app/cells/decidim/posts/post_header/show.erb +53 -0
  25. data/app/cells/decidim/posts/post_header_cell.rb +79 -0
  26. data/app/cells/decidim/posts/post_host/show.erb +74 -0
  27. data/app/cells/decidim/posts/post_host_cell.rb +73 -0
  28. data/app/cells/decidim/posts/post_metadata/show.erb +9 -0
  29. data/app/cells/decidim/posts/post_metadata_cell.rb +67 -0
  30. data/app/cells/decidim/posts/reaction_menu/show.erb +18 -0
  31. data/app/cells/decidim/posts/reaction_menu/styles.erb +7 -0
  32. data/app/cells/decidim/posts/reaction_menu_cell.rb +26 -0
  33. data/app/cells/decidim/posts/reactions/show.erb +8 -0
  34. data/app/cells/decidim/posts/reactions_cell.rb +22 -0
  35. data/app/commands/decidim/posts/add_reaction_to_resource.rb +90 -0
  36. data/app/commands/decidim/posts/create_post.rb +112 -0
  37. data/app/commands/decidim/posts/destroy_post.rb +20 -0
  38. data/app/commands/decidim/posts/remove_reaction_from_resource.rb +41 -0
  39. data/app/commands/decidim/posts/update_post.rb +72 -0
  40. data/app/controllers/concerns/decidim/posts/admin/filterable.rb +46 -0
  41. data/app/controllers/concerns/decidim/posts/reactionable.rb +31 -0
  42. data/app/controllers/decidim/posts/admin/application_controller.rb +26 -0
  43. data/app/controllers/decidim/posts/admin/posts_controller.rb +93 -0
  44. data/app/controllers/decidim/posts/application_controller.rb +18 -0
  45. data/app/controllers/decidim/posts/meetings_controller.rb +176 -0
  46. data/app/controllers/decidim/posts/posts_controller.rb +202 -0
  47. data/app/controllers/decidim/posts/reactions_controller.rb +54 -0
  48. data/app/controllers/decidim/posts/user_answers_controller.rb +36 -0
  49. data/app/events/decidim/posts/resource_reacted_event.rb +38 -0
  50. data/app/forms/decidim/posts/answer_form.rb +13 -0
  51. data/app/forms/decidim/posts/post_form.rb +121 -0
  52. data/app/forms/decidim/posts/question_form.rb +20 -0
  53. data/app/helpers/decidim/posts/admin/posts_helper.rb +8 -0
  54. data/app/helpers/decidim/posts/application_helper.rb +20 -0
  55. data/app/helpers/decidim/posts/post_cells_helper.rb +35 -0
  56. data/app/helpers/decidim/posts/posts_helper.rb +34 -0
  57. data/app/helpers/decidim/posts/reaction_helper.rb +22 -0
  58. data/app/models/decidim/posts/answer.rb +13 -0
  59. data/app/models/decidim/posts/application_record.rb +10 -0
  60. data/app/models/decidim/posts/post.rb +116 -0
  61. data/app/models/decidim/posts/question.rb +17 -0
  62. data/app/models/decidim/posts/reaction.rb +22 -0
  63. data/app/models/decidim/posts/reaction_type.rb +13 -0
  64. data/app/models/decidim/posts/user_answer.rb +11 -0
  65. data/app/packs/entrypoints/decidim_posts.js +5 -0
  66. data/app/packs/entrypoints/decidim_posts.scss +1 -0
  67. data/app/packs/images/decidim/posts/icon.svg +1 -0
  68. data/app/packs/src/decidim/posts/carousel.js +112 -0
  69. data/app/packs/src/decidim/posts/host_status.js +75 -0
  70. data/app/packs/src/decidim/posts/newFeeds.js +98 -0
  71. data/app/packs/src/decidim/posts/posts.js +272 -0
  72. data/app/packs/src/decidim/posts/submenu.js +46 -0
  73. data/app/packs/src/decidim/posts/survey.js +94 -0
  74. data/app/packs/stylesheets/decidim/posts/_variables.scss +10 -0
  75. data/app/packs/stylesheets/decidim/posts/posts.scss +415 -0
  76. data/app/permissions/decidim/posts/admin/permissions.rb +23 -0
  77. data/app/permissions/decidim/posts/permissions.rb +101 -0
  78. data/app/presenters/decidim/posts/post_presenter.rb +45 -0
  79. data/app/views/decidim/posts/admin/posts/_post-tr.html.erb +45 -0
  80. data/app/views/decidim/posts/admin/posts/index.html.erb +54 -0
  81. data/app/views/decidim/posts/meetings/edit.html.erb +24 -0
  82. data/app/views/decidim/posts/posts/_admin_options.html.erb +30 -0
  83. data/app/views/decidim/posts/posts/_attachment.html.erb +24 -0
  84. data/app/views/decidim/posts/posts/_edit_form.html.erb +16 -0
  85. data/app/views/decidim/posts/posts/_feed.html.erb +8 -0
  86. data/app/views/decidim/posts/posts/_form.html.erb +104 -0
  87. data/app/views/decidim/posts/posts/_index.html.erb +49 -0
  88. data/app/views/decidim/posts/posts/_meeting_form.erb +18 -0
  89. data/app/views/decidim/posts/posts/_new.html.erb +33 -0
  90. data/app/views/decidim/posts/posts/_new_survey.html.erb +20 -0
  91. data/app/views/decidim/posts/posts/_new_survey_answer.html.erb +11 -0
  92. data/app/views/decidim/posts/posts/_new_survey_question.html.erb +17 -0
  93. data/app/views/decidim/posts/posts/_post.html.erb +11 -0
  94. data/app/views/decidim/posts/posts/_post_form.html.erb +5 -0
  95. data/app/views/decidim/posts/posts/_sidebar.html.erb +36 -0
  96. data/app/views/decidim/posts/posts/edit.html.erb +34 -0
  97. data/app/views/decidim/posts/posts/index.html.erb +1 -0
  98. data/app/views/decidim/posts/posts/show.html.erb +12 -0
  99. data/app/views/decidim/posts/reactions/_update_buttons_and_counters.html.erb +1 -0
  100. data/config/assets.rb +9 -0
  101. data/config/i18n-tasks.yml +10 -0
  102. data/config/locales/bs.yml +215 -0
  103. data/config/locales/de.yml +217 -0
  104. data/config/locales/en.yml +216 -0
  105. data/config/locales/hr.yml +219 -0
  106. data/config/locales/it.yml +215 -0
  107. data/config/locales/sr.yml +220 -0
  108. data/config/locales/tr.yml +219 -0
  109. data/lib/decidim/posts/admin.rb +10 -0
  110. data/lib/decidim/posts/admin_engine.rb +25 -0
  111. data/lib/decidim/posts/component.rb +59 -0
  112. data/lib/decidim/posts/content_blocks/content_blocks_homepage.rb +19 -0
  113. data/lib/decidim/posts/engine.rb +84 -0
  114. data/lib/decidim/posts/test/factories.rb +14 -0
  115. data/lib/decidim/posts/version.rb +9 -0
  116. data/lib/decidim/posts.rb +13 -0
  117. metadata +183 -0
@@ -0,0 +1,272 @@
1
+ import { initSurvey } from './survey.js';
2
+ import carousel from './carousel.js';
3
+ import { host_status } from './host_status.js';
4
+ import { closeDialog, activateCategory, hideAllForms } from './newFeeds.js';
5
+ import Submenu from './submenu.js';
6
+ import CommentsComponent from "src/decidim/comments/comments.component"
7
+
8
+ document.addEventListener('DOMContentLoaded', function () {
9
+ function addEventListeners(rootElement) {
10
+ rootElement.querySelectorAll("[data-decidim-posts-comments]").forEach((el) => {
11
+ const $el = $(el);
12
+ let comments = $(el).data("comments");
13
+ if (!comments) {
14
+ comments = new CommentsComponent($el, $el.data("decidim-posts-comments"));
15
+ }
16
+ comments.mountComponent();
17
+ $(el).data("comments", comments);
18
+ });
19
+
20
+ const loadMoreBtn = rootElement.querySelector('#loadMoreBtn');
21
+ if (loadMoreBtn) {
22
+ loadMoreBtn.addEventListener('click', loadMoreButtonClicked);
23
+ observer.observe(loadMoreBtn);
24
+ }
25
+
26
+ rootElement
27
+ .querySelectorAll('.posts__post_actions_submenu > button')
28
+ .forEach((button) => {
29
+ const submenuId = button.getAttribute('aria-controls');
30
+ const submenu = rootElement.querySelector(`#${submenuId}`);
31
+ if (submenu) {
32
+ new Submenu(button, submenu);
33
+ }
34
+ });
35
+
36
+ rootElement
37
+ .querySelectorAll('.posts__post_reactions_submenu > button')
38
+ .forEach((button) => {
39
+ const submenuId = button.getAttribute('aria-controls');
40
+ const submenu = rootElement.querySelector(`#${submenuId}`);
41
+ if (submenu) {
42
+ new Submenu(button, submenu);
43
+ }
44
+ });
45
+
46
+ rootElement.querySelectorAll('.reaction_btn').forEach((button) => {
47
+ const reactionTypeId = button.getAttribute('data-reaction-id');
48
+ const reactionableGlobalId = button.getAttribute('data-reactionable-id');
49
+ const url = button.getAttribute('data-reaction-url');
50
+ if (reactionTypeId && url) {
51
+ button.addEventListener('click', function (event) {
52
+ let reaction = button.getAttribute('data-reaction');
53
+ event.preventDefault();
54
+ fetch(url, {
55
+ method: 'POST',
56
+ headers: {
57
+ 'Content-Type': 'application/json',
58
+ 'X-CSRF-Token': document.querySelector('meta[name="csrf-token"]')
59
+ .content,
60
+ Accept: 'text/html',
61
+ },
62
+ body: JSON.stringify({
63
+ reaction_type_id: reactionTypeId,
64
+ resource_id: reactionableGlobalId,
65
+ }),
66
+ })
67
+ .then((response) => {
68
+ if (!response.ok) {
69
+ throw new Error('Network response was not ok');
70
+ }
71
+ return response.text();
72
+ })
73
+ .then((response) => {
74
+ var resourceId = reactionableGlobalId.split('/').pop();
75
+ var reactionsBlock = document.getElementById(
76
+ `feeds_post-${resourceId}_reactions`
77
+ );
78
+ var submenuId = `post_${resourceId}_posts__post_reactions_submenu`;
79
+ var submenu = document.querySelector(`#${submenuId}`);
80
+ var submenuButtonId = `post_${resourceId}_posts__post_reactions_submenuButton`;
81
+ var submenuButton = document.querySelector(
82
+ `#${submenuButtonId}`
83
+ );
84
+ if (submenuButton.getAttribute('data-reaction') === reaction) {
85
+ reaction = '';
86
+ }
87
+ submenuButton.setAttribute('data-reaction', reaction);
88
+ // replace the reactions block with the new one
89
+ reactionsBlock.innerHTML = response;
90
+ submenuButton.setAttribute('aria-expanded', false);
91
+ submenu.classList.toggle('hidden', true);
92
+ })
93
+ .catch((error) => {
94
+ console.error(
95
+ 'There was a problem while updating the reactions:',
96
+ error
97
+ );
98
+ });
99
+ });
100
+ }
101
+ });
102
+
103
+ // Select all comments__header h2 elements
104
+ const commentsHeaders = rootElement.querySelectorAll(
105
+ '.comments__header h2'
106
+ );
107
+ commentsHeaders.forEach((commentsHeader) => {
108
+ const parentContainer = commentsHeader.closest('[data-decidim-posts-comments]');
109
+ const parentId = parentContainer.getAttribute('id');
110
+ commentsHeader.setAttribute('aria-controls', `${parentId}-threads`);
111
+ commentsHeader.setAttribute('aria-expanded', 'false');
112
+ });
113
+
114
+ const newCommentBtns = rootElement.querySelectorAll('.newCommentBtn');
115
+ const showCommentsBtns = rootElement.querySelectorAll(
116
+ '.comments__header h2'
117
+ );
118
+
119
+ newCommentBtns.forEach((newCommentBtn) => {
120
+ addActionToNewCommentBtn(newCommentBtn);
121
+ });
122
+
123
+ showCommentsBtns.forEach((showCommentsBtn) => {
124
+ addActionToShowCommentsBtn(showCommentsBtn);
125
+ });
126
+ }
127
+
128
+ const spinner = "<span class='loading-spinner'></span>";
129
+
130
+ // Implement infinite scroll
131
+ const observer = new IntersectionObserver((entries) => {
132
+ if (entries[0].isIntersecting) {
133
+ loadMore(entries[0].target);
134
+ }
135
+ });
136
+
137
+ function loadMoreButtonClicked(event) {
138
+ event.preventDefault();
139
+
140
+ loadMore(event.target);
141
+ }
142
+
143
+ function loadMore(button) {
144
+ // remove event listener to prevent multiple clicks
145
+ button.removeEventListener('click', loadMoreButtonClicked);
146
+ const oldBtn = button.innerHTML;
147
+ button.innerHTML = spinner;
148
+
149
+ // get url from data-url attribute
150
+ const url = button.getAttribute('data-url');
151
+
152
+ // get html from url and add page as query parameter
153
+ fetch(url)
154
+ .then((response) => {
155
+ if (!response.ok) {
156
+ // enable the button again
157
+ button.addEventListener('click', loadMoreButtonClicked);
158
+ // reset the button text
159
+ button.innerHTML = oldBtn;
160
+ throw new Error('Network response was not ok');
161
+ }
162
+ return response.text();
163
+ })
164
+ .then((html) => {
165
+ // activate all buttons in the new html
166
+ const tempContainer = document.createElement('div');
167
+ tempContainer.innerHTML = html;
168
+ const fragment = document.createDocumentFragment();
169
+ addEventListeners(tempContainer);
170
+ Array.from(tempContainer.children).forEach((element) => {
171
+ fragment.appendChild(element);
172
+ });
173
+
174
+ // replace the button with the new html
175
+ button.parentNode.replaceChild(fragment, button);
176
+ // alternative:
177
+ // button.parentNode.insertAfter(fragment, button);
178
+ // button.remove();
179
+
180
+ // add event listener to new button
181
+ const newButton = document.getElementById('loadMoreBtn');
182
+ if (newButton) {
183
+ newButton.addEventListener('click', loadMoreButtonClicked);
184
+ observer.observe(newButton);
185
+ }
186
+ })
187
+ .catch((error) => {
188
+ // enable the button again
189
+ button.addEventListener('click', loadMoreButtonClicked);
190
+ // reset the button text
191
+ button.innerHTML = oldBtn;
192
+ console.error('Error:', error);
193
+ });
194
+ }
195
+
196
+ // add event listeners to all the buttons found in the document
197
+ addEventListeners(document);
198
+
199
+ function addActionToNewCommentBtn(newCommentBtn) {
200
+ newCommentBtn.addEventListener('click', function () {
201
+ const postId = newCommentBtn.getAttribute('data-post-id');
202
+ const modelType = newCommentBtn.getAttribute('data-model-type');
203
+ const showCommentBtnId = `comments-for-${modelType}-${postId}`;
204
+ const controlledDivId = `new_comment_for_${modelType}_${postId}`;
205
+ const commentsDivId = `comments-for-${modelType}-${postId}-threads`;
206
+ const showCommentBtn = document.getElementById(showCommentBtnId);
207
+
208
+ const wasExpanded =
209
+ newCommentBtn.getAttribute('aria-expanded') === 'true';
210
+ const showCommentsWasExpanded =
211
+ showCommentBtn.getAttribute('aria-expanded') === 'true';
212
+ const controlledDivIds = newCommentBtn
213
+ .getAttribute('aria-controls')
214
+ .split(' ');
215
+
216
+ const controlledDiv = document.getElementById(controlledDivId);
217
+ newCommentBtn.setAttribute('aria-expanded', !wasExpanded);
218
+ showCommentBtn.setAttribute('aria-expanded', !showCommentsWasExpanded);
219
+
220
+ toggleCommentsVisibility(controlledDivId);
221
+
222
+ if (!wasExpanded) {
223
+ showDiv(commentsDivId);
224
+ controlledDiv.scrollIntoView({ behavior: 'smooth', block: 'center' });
225
+ } else {
226
+ hideDiv(commentsDivId);
227
+ }
228
+ });
229
+ }
230
+
231
+ function addActionToShowCommentsBtn(showCommentsBtn) {
232
+ showCommentsBtn.addEventListener('click', function () {
233
+ const controlledDivIds = showCommentsBtn
234
+ .getAttribute('aria-controls')
235
+ .split(' ');
236
+ controlledDivIds.forEach((controlledDivId) => {
237
+ const isExpanded =
238
+ showCommentsBtn.getAttribute('aria-expanded') === 'true';
239
+ showCommentsBtn.setAttribute('aria-expanded', !isExpanded);
240
+ toggleCommentsVisibility(controlledDivId);
241
+ });
242
+ });
243
+ }
244
+
245
+ function toggleCommentsVisibility(controlledDivId) {
246
+ const controlledDiv = document.getElementById(controlledDivId);
247
+
248
+ if (controlledDiv.style.visibility === 'visible') {
249
+ hideDiv(controlledDivId);
250
+ } else {
251
+ showDiv(controlledDivId);
252
+ }
253
+ }
254
+
255
+ function showDiv(id) {
256
+ const div = document.getElementById(id);
257
+ div.style.height = 'auto';
258
+ div.style.visibility = 'visible';
259
+ div.style.marginTop = '8px';
260
+ }
261
+
262
+ function hideDiv(id) {
263
+ const div = document.getElementById(id);
264
+ div.style.height = '0';
265
+ div.style.visibility = 'hidden';
266
+ div.style.marginTop = '0';
267
+ }
268
+
269
+ initSurvey();
270
+ carousel.init();
271
+ host_status();
272
+ });
@@ -0,0 +1,46 @@
1
+ class Submenu {
2
+ constructor(button, submenu) {
3
+ this.button = button;
4
+ this.submenu = submenu;
5
+ this.init();
6
+ }
7
+
8
+ init() {
9
+ this.button.addEventListener('click', () => this.toggleSubmenu());
10
+ document.addEventListener('click', (event) =>
11
+ this.handleClickOutside(event)
12
+ );
13
+ this.submenu.addEventListener('keydown', (event) =>
14
+ this.handleKeydown(event)
15
+ );
16
+ }
17
+
18
+ toggleSubmenu() {
19
+ const isExpanded = this.button.getAttribute('aria-expanded') === 'true';
20
+ this.button.setAttribute('aria-expanded', !isExpanded);
21
+ this.submenu.classList.toggle('hidden', isExpanded);
22
+ }
23
+
24
+ handleClickOutside(event) {
25
+ if (
26
+ !this.button.contains(event.target) &&
27
+ !this.submenu.contains(event.target)
28
+ ) {
29
+ this.closeSubmenu();
30
+ }
31
+ }
32
+
33
+ handleKeydown(event) {
34
+ if (event.key === 'Escape') {
35
+ this.closeSubmenu();
36
+ this.button.focus();
37
+ }
38
+ }
39
+
40
+ closeSubmenu() {
41
+ this.button.setAttribute('aria-expanded', 'false');
42
+ this.submenu.classList.add('hidden');
43
+ }
44
+ }
45
+
46
+ export default Submenu;
@@ -0,0 +1,94 @@
1
+ export function initSurvey() {
2
+ // Add event listener to the new survey button
3
+ const liveRegion = document.getElementById(
4
+ 'posts__post_newSurvey_liveRegion'
5
+ );
6
+ const newSurveyButton = document.querySelector('.posts__post_newSurvey-btn');
7
+ if (newSurveyButton)
8
+ newSurveyButton.addEventListener('click', () => {
9
+ const questionContainer = document.getElementById(
10
+ 'posts__post_newSurvey_questionsContainer'
11
+ );
12
+
13
+ // copy content from question_template to questionContainer
14
+ const template = document.getElementById('question_template');
15
+ var content = template.innerHTML.replace(
16
+ /NEW_RECORD/g,
17
+ new Date().getTime()
18
+ );
19
+ questionContainer.insertAdjacentHTML('beforeend', content);
20
+ liveRegion.textContent =
21
+ window.translations.newSurvey.newQuestionResponse;
22
+ });
23
+
24
+ // TODO: this does not work as the button does not exist yet and there will be multiple buttons
25
+ document.addEventListener('click', (event) => {
26
+ if (event.target.classList.contains('posts__post_newAnswer-btn')) {
27
+ const questionId = event.target.dataset.questionId;
28
+ // get div with class posts__post_newSurvey_answersContainer inside the same container as the clicked button
29
+ const answerContainer = document.getElementById(
30
+ `posts__post_newSurvey_answersContainer-${questionId}`
31
+ );
32
+
33
+ const questionAnswers = answerContainer.children.length + 1;
34
+ // answerContainer.dataset.questionAnswers = questionAnswers;
35
+
36
+ // copy content from question_template to questionContainer
37
+ const template = document.getElementById('answer_template');
38
+ var content = template.innerHTML.replace(
39
+ /NEW_RECORD/g,
40
+ new Date().getTime()
41
+ );
42
+ content = content.replace(/QUESTION_RECORD/g, questionId);
43
+ content = content.replace(/ANSWER_NR/g, questionAnswers);
44
+
45
+ answerContainer.insertAdjacentHTML('beforeend', content);
46
+ liveRegion.textContent = window.translations.newSurvey.newAnswerResponse;
47
+ }
48
+ });
49
+
50
+ document.querySelectorAll('.survey-answer-checkbox').forEach((checkbox) => {
51
+ checkbox.addEventListener('change', (event) => {
52
+ const questionId = event.target.dataset.questionId;
53
+ const answerId = event.target.dataset.answerId;
54
+ const checked = event.target.checked;
55
+ console.log(questionId, answerId, checked);
56
+ Rails.ajax({
57
+ url: 'user_answers/',
58
+ type: 'GET',
59
+ data: new URLSearchParams({
60
+ question_id: questionId,
61
+ answer_id: answerId,
62
+ checked: checked,
63
+ }),
64
+ success: function (response) {
65
+ console.log(response);
66
+ for (const [answerId, counter] of Object.entries(
67
+ response.user_answers
68
+ )) {
69
+ // for each user_answer, change the width of the progress bar
70
+ const progressBar = document.getElementById(
71
+ `answer-${answerId}-progressbar`
72
+ );
73
+ const percentage =
74
+ response.survey_responses_count > 0
75
+ ? (counter / response.survey_responses_count) * 100
76
+ : 0;
77
+ progressBar.style.width = `${percentage}%`;
78
+ const counterSpan = document.getElementById(
79
+ `answer-${answerId}-counter`
80
+ );
81
+ counterSpan.textContent = counter;
82
+ const totalSpan = document.getElementById(
83
+ `answer-${answerId}-total`
84
+ );
85
+ totalSpan.textContent = `${response.survey_responses_count}`;
86
+ }
87
+ },
88
+ error: function (xhr, status, error) {
89
+ console.log(xhr, status, error);
90
+ },
91
+ });
92
+ });
93
+ });
94
+ }
@@ -0,0 +1,10 @@
1
+ :root {
2
+ --dg-color-white: 255 255 255;
3
+ --dg-color-black: 60 57 52;
4
+ --dg-color-post: 229 57 144;
5
+ --dg-color-help: 1 114 187;
6
+ --dg-color-sharecare: 36 166 32;
7
+ --dg-color-host: 219 15 16;
8
+ --dg-color-survey: 50 49 143;
9
+ --dg-color-calendar: 253 182 32;
10
+ }