@soul-refiner/design-system 0.0.4 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (271) hide show
  1. package/.eslintrc.js +4 -0
  2. package/.turbo/turbo-build.log +12 -0
  3. package/.turbo/turbo-test.log +4417 -0
  4. package/CHANGELOG.md +7 -0
  5. package/babel.config.js +6 -0
  6. package/custom.d.ts +4 -0
  7. package/package.json +1 -9
  8. package/src/actions/Button/Button.module.scss +205 -0
  9. package/src/actions/Button/Button.spec.js +56 -0
  10. package/src/actions/Button/Button.tsx +143 -0
  11. package/src/actions/Button/index.ts +1 -0
  12. package/src/actions/Dropdown/Dropdown.module.scss +77 -0
  13. package/src/actions/Dropdown/Dropdown.spec.js +149 -0
  14. package/src/actions/Dropdown/Dropdown.tsx +224 -0
  15. package/src/actions/Dropdown/index.ts +6 -0
  16. package/src/actions/Dropzone/Dropzone.module.scss +48 -0
  17. package/src/actions/Dropzone/Dropzone.spec.js +60 -0
  18. package/src/actions/Dropzone/Dropzone.tsx +191 -0
  19. package/src/actions/Dropzone/index.ts +1 -0
  20. package/src/actions/Rate/Rate.module.scss +17 -0
  21. package/src/actions/Rate/Rate.tsx +53 -0
  22. package/src/actions/Rate/index.ts +1 -0
  23. package/src/actions/Switch/Switch.module.scss +35 -0
  24. package/src/actions/Switch/Switch.spec.js +31 -0
  25. package/src/actions/Switch/Switch.tsx +34 -0
  26. package/src/actions/Switch/index.ts +1 -0
  27. package/src/actions/index.ts +5 -0
  28. package/src/cards/CourseCard/CourseCard.module.scss +219 -0
  29. package/src/cards/CourseCard/CourseCard.spec.js +60 -0
  30. package/src/cards/CourseCard/CourseCard.tsx +145 -0
  31. package/src/cards/CourseCard/index.ts +1 -0
  32. package/src/cards/EpisodeCard/EpisodeCard.module.scss +69 -0
  33. package/src/cards/EpisodeCard/EpisodeCard.tsx +53 -0
  34. package/src/cards/EpisodeCard/index.ts +1 -0
  35. package/src/cards/FeatureCard/FeatureCard.module.scss +116 -0
  36. package/src/cards/FeatureCard/FeatureCard.spec.js +70 -0
  37. package/src/cards/FeatureCard/FeatureCard.tsx +123 -0
  38. package/src/cards/FeatureCard/index.ts +1 -0
  39. package/src/cards/index.ts +3 -0
  40. package/src/data/Bar/Bar.module.scss +105 -0
  41. package/src/data/Bar/Bar.tsx +161 -0
  42. package/src/data/Bar/index.ts +1 -0
  43. package/src/data/Line/Line.module.scss +102 -0
  44. package/src/data/Line/Line.tsx +162 -0
  45. package/src/data/Line/index.ts +1 -0
  46. package/src/data/Pie/Pie.module.scss +56 -0
  47. package/src/data/Pie/Pie.spec.js +72 -0
  48. package/src/data/Pie/Pie.tsx +111 -0
  49. package/src/data/Pie/index.ts +1 -0
  50. package/src/data/index.ts +3 -0
  51. package/src/editor/Editor.module.scss +125 -0
  52. package/src/editor/Editor.tsx +327 -0
  53. package/src/editor/common/elements.ts +50 -0
  54. package/src/editor/common/index.ts +2 -0
  55. package/src/editor/common/marks.ts +27 -0
  56. package/src/editor/components/MediaDrawer/MediaDrawer.module.scss +316 -0
  57. package/src/editor/components/MediaDrawer/MediaDrawer.tsx +457 -0
  58. package/src/editor/components/MediaDrawer/index.ts +1 -0
  59. package/src/editor/components/index.ts +1 -0
  60. package/src/editor/config/default.ts +213 -0
  61. package/src/editor/config/index.ts +2 -0
  62. package/src/editor/config/props.ts +9 -0
  63. package/src/editor/index.ts +2 -0
  64. package/src/editor/plateUI.ts +82 -0
  65. package/src/editor/plugins/blocks.tsx +71 -0
  66. package/src/editor/plugins/custom/assets/DefaultThumbnail.tsx +57 -0
  67. package/src/editor/plugins/custom/assets/index.ts +1 -0
  68. package/src/editor/plugins/custom/buttons.tsx +289 -0
  69. package/src/editor/plugins/custom/example.tsx +64 -0
  70. package/src/editor/plugins/custom/exitBreak.ts +41 -0
  71. package/src/editor/plugins/custom/footnote.tsx +185 -0
  72. package/src/editor/plugins/custom/index.ts +14 -0
  73. package/src/editor/plugins/custom/paywall.tsx +156 -0
  74. package/src/editor/plugins/custom/qa.tsx +390 -0
  75. package/src/editor/plugins/custom/resetBlockType.ts +29 -0
  76. package/src/editor/plugins/custom/selectOnBackspace.ts +7 -0
  77. package/src/editor/plugins/custom/softBreak.ts +20 -0
  78. package/src/editor/plugins/custom/styles/Button.module.scss +51 -0
  79. package/src/editor/plugins/custom/styles/Footnote.module.scss +58 -0
  80. package/src/editor/plugins/custom/styles/Paywall.module.scss +67 -0
  81. package/src/editor/plugins/custom/styles/QA.module.scss +140 -0
  82. package/src/editor/plugins/custom/styles/Video.module.scss +79 -0
  83. package/src/editor/plugins/custom/video.tsx +163 -0
  84. package/src/editor/plugins/index.ts +18 -0
  85. package/src/editor/plugins/inline.ts +46 -0
  86. package/src/editor/plugins/marks.ts +25 -0
  87. package/src/editor/plugins/utils.ts +22 -0
  88. package/src/feedback/Chip/Chip.module.scss +23 -0
  89. package/src/feedback/Chip/Chip.tsx +58 -0
  90. package/src/feedback/Chip/index.ts +1 -0
  91. package/src/feedback/Loader/Loader.module.scss +18 -0
  92. package/src/feedback/Loader/Loader.spec.js +18 -0
  93. package/src/feedback/Loader/Loader.tsx +53 -0
  94. package/src/feedback/Loader/index.ts +1 -0
  95. package/src/feedback/ProgressBar/ProgressBar.module.scss +13 -0
  96. package/src/feedback/ProgressBar/ProgressBar.tsx +32 -0
  97. package/src/feedback/ProgressBar/index.ts +1 -0
  98. package/src/feedback/Toast/Toast.module.scss +44 -0
  99. package/src/feedback/Toast/Toast.tsx +76 -0
  100. package/src/feedback/Toast/index.ts +1 -0
  101. package/src/feedback/Tooltip/Tooltip.module.scss +47 -0
  102. package/src/feedback/Tooltip/Tooltip.tsx +10 -0
  103. package/src/feedback/Tooltip/index.ts +1 -0
  104. package/src/feedback/index.ts +5 -0
  105. package/src/global.d.ts +6 -0
  106. package/src/iconography/Avatar/Avatar.module.scss +90 -0
  107. package/src/iconography/Avatar/Avatar.spec.js +75 -0
  108. package/src/iconography/Avatar/Avatar.tsx +96 -0
  109. package/src/iconography/Avatar/DefaultIcon.svg +4 -0
  110. package/src/iconography/Avatar/DefaultIcon.tsx +12 -0
  111. package/src/iconography/Avatar/iconHelpers.tsx +186 -0
  112. package/src/iconography/Avatar/index.ts +1 -0
  113. package/src/iconography/ColoredIcon/ColoredIcon.module.scss +40 -0
  114. package/src/iconography/ColoredIcon/ColoredIcon.tsx +30 -0
  115. package/src/iconography/ColoredIcon/index.ts +5 -0
  116. package/src/iconography/DevicePreview/DevicePreview.module.scss +143 -0
  117. package/src/iconography/DevicePreview/DevicePreview.tsx +592 -0
  118. package/src/iconography/DevicePreview/index.ts +1 -0
  119. package/src/iconography/IconHeader/IconHeader.module.scss +42 -0
  120. package/src/iconography/IconHeader/IconHeader.tsx +42 -0
  121. package/src/iconography/IconHeader/index.ts +1 -0
  122. package/src/iconography/StarRating/StarRating.tsx +99 -0
  123. package/src/iconography/StarRating/index.ts +1 -0
  124. package/src/iconography/index.ts +5 -0
  125. package/src/implementations/BodyContent/BodyContent.module.scss +38 -0
  126. package/src/implementations/BodyContent/BodyContent.tsx +78 -0
  127. package/src/implementations/BodyContent/index.ts +2 -0
  128. package/src/implementations/JoinGroupModal/JoinGroupModal.module.scss +83 -0
  129. package/src/implementations/JoinGroupModal/JoinGroupModal.tsx +176 -0
  130. package/src/implementations/JoinGroupModal/index.ts +1 -0
  131. package/src/implementations/index.ts +2 -0
  132. package/src/index.ts +149 -0
  133. package/src/inputs/CalendarInput/CalendarInput.module.scss +38 -0
  134. package/src/inputs/CalendarInput/CalendarInput.spec.js +19 -0
  135. package/src/inputs/CalendarInput/CalendarInput.tsx +29 -0
  136. package/src/inputs/CalendarInput/index.ts +1 -0
  137. package/src/inputs/CheckboxInput/CheckboxInput.module.scss +23 -0
  138. package/src/inputs/CheckboxInput/CheckboxInput.tsx +39 -0
  139. package/src/inputs/CheckboxInput/index.ts +1 -0
  140. package/src/inputs/FeedInput/FeedInput.module.scss +48 -0
  141. package/src/inputs/FeedInput/FeedInput.spec.js +16 -0
  142. package/src/inputs/FeedInput/FeedInput.tsx +197 -0
  143. package/src/inputs/FeedInput/index.ts +1 -0
  144. package/src/inputs/InboxInput/InboxInput.module.scss +48 -0
  145. package/src/inputs/InboxInput/InboxInput.spec.js +19 -0
  146. package/src/inputs/InboxInput/InboxInput.tsx +97 -0
  147. package/src/inputs/InboxInput/index.ts +1 -0
  148. package/src/inputs/PostInput/PostInput.module.scss +49 -0
  149. package/src/inputs/PostInput/PostInput.spec.js +19 -0
  150. package/src/inputs/PostInput/PostInput.tsx +54 -0
  151. package/src/inputs/PostInput/index.ts +1 -0
  152. package/src/inputs/RadioInput/RadioInput.module.scss +68 -0
  153. package/src/inputs/RadioInput/RadioInput.tsx +55 -0
  154. package/src/inputs/RadioInput/index.ts +1 -0
  155. package/src/inputs/SearchInput/SearchInput.module.scss +40 -0
  156. package/src/inputs/SearchInput/SearchInput.tsx +61 -0
  157. package/src/inputs/SearchInput/index.ts +1 -0
  158. package/src/inputs/SelectInput/SelectInput.module.scss +66 -0
  159. package/src/inputs/SelectInput/SelectInput.tsx +145 -0
  160. package/src/inputs/SelectInput/index.ts +1 -0
  161. package/src/inputs/TagInput/TagInput.module.scss +75 -0
  162. package/src/inputs/TagInput/TagInput.tsx +115 -0
  163. package/src/inputs/TagInput/index.ts +1 -0
  164. package/src/inputs/TextInput/TextInput.module.scss +35 -0
  165. package/src/inputs/TextInput/TextInput.tsx +46 -0
  166. package/src/inputs/TextInput/index.ts +1 -0
  167. package/src/inputs/index.ts +10 -0
  168. package/src/lists/ContactDetails/ContactDetails.module.scss +70 -0
  169. package/src/lists/ContactDetails/ContactDetails.spec.js +69 -0
  170. package/src/lists/ContactDetails/ContactDetails.tsx +185 -0
  171. package/src/lists/ContactDetails/index.ts +1 -0
  172. package/src/lists/index.ts +1 -0
  173. package/src/navigation/Breadcrumbs/Breadcrumbs.module.scss +18 -0
  174. package/src/navigation/Breadcrumbs/Breadcrumbs.spec.js +38 -0
  175. package/src/navigation/Breadcrumbs/Breadcrumbs.tsx +43 -0
  176. package/src/navigation/Breadcrumbs/index.ts +1 -0
  177. package/src/navigation/Drawer/Drawer.module.scss +104 -0
  178. package/src/navigation/Drawer/Drawer.tsx +177 -0
  179. package/src/navigation/Drawer/index.ts +1 -0
  180. package/src/navigation/EditorBar/EditorBar.module.scss +118 -0
  181. package/src/navigation/EditorBar/EditorBar.tsx +416 -0
  182. package/src/navigation/EditorBar/components/AlignmentDropdown/AlignmentDropdown.tsx +106 -0
  183. package/src/navigation/EditorBar/components/AlignmentDropdown/index.ts +1 -0
  184. package/src/navigation/EditorBar/components/ButtonModal/ButtonModal.module.scss +85 -0
  185. package/src/navigation/EditorBar/components/ButtonModal/ButtonModal.tsx +314 -0
  186. package/src/navigation/EditorBar/components/ButtonModal/assets/Comment.tsx +28 -0
  187. package/src/navigation/EditorBar/components/ButtonModal/assets/GiftSubscription.tsx +28 -0
  188. package/src/navigation/EditorBar/components/ButtonModal/assets/Link.tsx +28 -0
  189. package/src/navigation/EditorBar/components/ButtonModal/assets/Share.tsx +28 -0
  190. package/src/navigation/EditorBar/components/ButtonModal/assets/ShareCommunity.tsx +42 -0
  191. package/src/navigation/EditorBar/components/ButtonModal/assets/Signup.tsx +68 -0
  192. package/src/navigation/EditorBar/components/ButtonModal/assets/Special.tsx +24 -0
  193. package/src/navigation/EditorBar/components/ButtonModal/assets/Subscribe.tsx +28 -0
  194. package/src/navigation/EditorBar/components/ButtonModal/assets/index.ts +8 -0
  195. package/src/navigation/EditorBar/components/ButtonModal/index.ts +1 -0
  196. package/src/navigation/EditorBar/components/FontDropdown/FontDropdown.module.scss +16 -0
  197. package/src/navigation/EditorBar/components/FontDropdown/FontDropdown.tsx +137 -0
  198. package/src/navigation/EditorBar/components/FontDropdown/index.ts +1 -0
  199. package/src/navigation/EditorBar/components/MoreDropdown/MoreDropdown.module.scss +43 -0
  200. package/src/navigation/EditorBar/components/MoreDropdown/MoreDropdown.tsx +124 -0
  201. package/src/navigation/EditorBar/components/MoreDropdown/index.ts +1 -0
  202. package/src/navigation/EditorBar/components/OutlineDropdown/OutlineDropdown.module.scss +21 -0
  203. package/src/navigation/EditorBar/components/OutlineDropdown/OutlineDropdown.tsx +37 -0
  204. package/src/navigation/EditorBar/components/OutlineDropdown/index.ts +1 -0
  205. package/src/navigation/EditorBar/components/TextTypeDropdown/TextTypeDropdown.module.scss +51 -0
  206. package/src/navigation/EditorBar/components/TextTypeDropdown/TextTypeDropdown.tsx +80 -0
  207. package/src/navigation/EditorBar/components/TextTypeDropdown/index.ts +1 -0
  208. package/src/navigation/EditorBar/components/VideoModal/VideoModal.module.scss +150 -0
  209. package/src/navigation/EditorBar/components/VideoModal/VideoModal.tsx +163 -0
  210. package/src/navigation/EditorBar/components/VideoModal/index.ts +1 -0
  211. package/src/navigation/EditorBar/components/index.ts +7 -0
  212. package/src/navigation/EditorBar/index.ts +1 -0
  213. package/src/navigation/MenuTabs/MenuTabs.module.scss +34 -0
  214. package/src/navigation/MenuTabs/MenuTabs.spec.js +36 -0
  215. package/src/navigation/MenuTabs/MenuTabs.tsx +52 -0
  216. package/src/navigation/MenuTabs/index.ts +1 -0
  217. package/src/navigation/Navigation/Navigation.module.scss +92 -0
  218. package/src/navigation/Navigation/Navigation.spec.js +144 -0
  219. package/src/navigation/Navigation/Navigation.tsx +111 -0
  220. package/src/navigation/Navigation/SubNavigation.module.scss +255 -0
  221. package/src/navigation/Navigation/SubNavigation.spec.js +112 -0
  222. package/src/navigation/Navigation/SubNavigation.tsx +443 -0
  223. package/src/navigation/Navigation/index.ts +15 -0
  224. package/src/navigation/Pagination/Pagination.module.scss +49 -0
  225. package/src/navigation/Pagination/Pagination.tsx +115 -0
  226. package/src/navigation/Pagination/index.ts +1 -0
  227. package/src/navigation/index.ts +21 -0
  228. package/src/surfaces/Comment/Comment.module.scss +106 -0
  229. package/src/surfaces/Comment/Comment.spec.js +105 -0
  230. package/src/surfaces/Comment/Comment.tsx +157 -0
  231. package/src/surfaces/Comment/index.ts +1 -0
  232. package/src/surfaces/Faq/Faq.module.scss +91 -0
  233. package/src/surfaces/Faq/Faq.spec.js +38 -0
  234. package/src/surfaces/Faq/Faq.tsx +156 -0
  235. package/src/surfaces/Faq/index.ts +1 -0
  236. package/src/surfaces/Message/Message.module.scss +37 -0
  237. package/src/surfaces/Message/Message.spec.js +47 -0
  238. package/src/surfaces/Message/Message.tsx +54 -0
  239. package/src/surfaces/Message/index.ts +1 -0
  240. package/src/surfaces/Modal/Modal.module.scss +52 -0
  241. package/src/surfaces/Modal/Modal.spec.js +38 -0
  242. package/src/surfaces/Modal/Modal.tsx +131 -0
  243. package/src/surfaces/Modal/index.ts +5 -0
  244. package/src/surfaces/Plan/Plan.module.scss +79 -0
  245. package/src/surfaces/Plan/Plan.tsx +75 -0
  246. package/src/surfaces/Plan/index.ts +1 -0
  247. package/src/surfaces/Post/Post.module.scss +46 -0
  248. package/src/surfaces/Post/Post.spec.js +103 -0
  249. package/src/surfaces/Post/Post.tsx +185 -0
  250. package/src/surfaces/Post/index.ts +1 -0
  251. package/src/surfaces/Post/postHelpers.ts +20 -0
  252. package/src/surfaces/ProfileHeader/ProfileHeader.module.scss +202 -0
  253. package/src/surfaces/ProfileHeader/ProfileHeader.tsx +103 -0
  254. package/src/surfaces/ProfileHeader/index.ts +1 -0
  255. package/src/surfaces/RatingsOverview/RatingsOverview.module.scss +54 -0
  256. package/src/surfaces/RatingsOverview/RatingsOverview.tsx +69 -0
  257. package/src/surfaces/RatingsOverview/index.ts +1 -0
  258. package/src/surfaces/Review/Review.module.scss +73 -0
  259. package/src/surfaces/Review/Review.tsx +88 -0
  260. package/src/surfaces/Review/index.ts +1 -0
  261. package/src/surfaces/index.ts +9 -0
  262. package/src/tables/Filter/Filter.module.scss +34 -0
  263. package/src/tables/Filter/Filter.tsx +30 -0
  264. package/src/tables/Filter/index.ts +1 -0
  265. package/src/tables/Table/Table.module.scss +126 -0
  266. package/src/tables/Table/Table.spec.js +113 -0
  267. package/src/tables/Table/Table.tsx +251 -0
  268. package/src/tables/Table/index.ts +7 -0
  269. package/src/tables/index.ts +7 -0
  270. package/tsconfig.json +14 -0
  271. package/vite.config.ts +29 -0
@@ -0,0 +1,38 @@
1
+ .calendar {
2
+ display: flex;
3
+ flex-direction: row;
4
+ gap: 16px;
5
+ place-items: center;
6
+
7
+ [class~=icon] svg {
8
+ fill: var(--color-grey-3);
9
+ }
10
+
11
+ input[type=date] {
12
+ resize: none;
13
+ border: 1px solid var(--color-grey-9);
14
+ border-radius: 16px;
15
+ background-color: var(--color-grey-10);
16
+ box-sizing: border-box;
17
+ padding: 10px 20px;
18
+ font-size: 16px;
19
+ line-height: 24px;
20
+ color: var(--color-grey-1);
21
+ overflow-y: hidden;
22
+
23
+ &::-webkit-datetime-edit-day-field:focus,
24
+ &::-webkit-datetime-edit-month-field:focus,
25
+ &::-webkit-datetime-edit-year-field:focus {
26
+ background-color: transparent;
27
+ color: var(--color-grey-3);
28
+ }
29
+
30
+ &:focus {
31
+ outline: none;
32
+ }
33
+
34
+ &::placeholder {
35
+ color: var(--color-grey-7);
36
+ }
37
+ }
38
+ }
@@ -0,0 +1,19 @@
1
+ import React from "react";
2
+ import "@testing-library/jest-dom";
3
+ import { fireEvent, render, screen } from "@testing-library/react";
4
+
5
+ import { CalendarInput } from "./CalendarInput";
6
+
7
+ const generateMockProps = props => ({
8
+ ...props,
9
+ });
10
+
11
+ describe("Calendar Input", () => {
12
+ it("selects the date", () => {
13
+ const props = generateMockProps({});
14
+ render(<CalendarInput {...props} />);
15
+ const input = screen.getByTestId("calendar-input");
16
+ fireEvent.click(input);
17
+ fireEvent.change(input, { target: { value: "2022-09-23" } })
18
+ });
19
+ });
@@ -0,0 +1,29 @@
1
+ import React from "react";
2
+ import calendarStyles from "./CalendarInput.module.scss";
3
+ import { Calendar } from "@soul-refiner/icons/src";
4
+
5
+ export interface CalendarInputProps extends React.HTMLProps<HTMLInputElement> {
6
+ icon?: boolean;
7
+ }
8
+
9
+ export const CalendarInput = ({ icon = true, ...rest }: CalendarInputProps) => {
10
+ const ref = React.useRef<HTMLInputElement>(null);
11
+ const handleWrapperClick = () => {
12
+ if (ref?.current && (ref.current as any)?.showPicker) {
13
+ (ref.current as any).showPicker();
14
+ }
15
+ };
16
+
17
+ return (
18
+ <label className={calendarStyles.calendar} onClick={handleWrapperClick}>
19
+ {icon && <Calendar />}
20
+ <input
21
+ {...rest}
22
+ data-testid="calendar-input"
23
+ type="date"
24
+ data-form-type="other"
25
+ ref={ref}
26
+ />
27
+ </label>
28
+ );
29
+ };
@@ -0,0 +1 @@
1
+ export { CalendarInput, type CalendarInputProps } from "./CalendarInput";
@@ -0,0 +1,23 @@
1
+ @use "@soul-refiner/styles/mixins";
2
+
3
+ .checkbox {
4
+ @include mixins.flex($justify: center, $align: center);
5
+ width: 22px;
6
+ height: 22px;
7
+ border: 1px solid var(--color-grey-7);
8
+ border-radius: 4px;
9
+
10
+ &:not([class~="has-onclick"]) {
11
+ user-select: none;
12
+ }
13
+ }
14
+
15
+ .active {
16
+ background-color: var(--color-blue-3);
17
+ border: 1px solid var(--color-grey-3);
18
+ }
19
+
20
+ .disabled {
21
+ background-color: var(--color-grey-9) !important;
22
+ border: 1px solid transparent;
23
+ }
@@ -0,0 +1,39 @@
1
+ import React from "react";
2
+ import { Check } from "@soul-refiner/icons/src";
3
+ import styles from "./CheckboxInput.module.scss";
4
+
5
+ export interface CheckboxInputProps {
6
+ disabled?: boolean;
7
+ onClick?: () => undefined;
8
+ selected: boolean;
9
+ }
10
+
11
+ export const CheckboxInput = ({
12
+ disabled,
13
+ onClick,
14
+ selected,
15
+ }: CheckboxInputProps) => {
16
+ if (selected) {
17
+ return (
18
+ <div
19
+ className={`${styles.checkbox} ${styles.active} ${
20
+ onClick ? "has-onclick" : ""
21
+ } ${disabled ? styles.disabled : ""}`.trim()}
22
+ >
23
+ <Check
24
+ fill={disabled ? "var(--color-grey-3)" : "var(--color-grey-10)"}
25
+ iconColor="transparent"
26
+ iconSize={14}
27
+ size={22}
28
+ />
29
+ </div>
30
+ );
31
+ }
32
+ return (
33
+ <div
34
+ className={`${styles.checkbox} ${onClick ? "has-onclick" : ""} ${
35
+ disabled ? styles.disabled : ""
36
+ }`.trim()}
37
+ />
38
+ );
39
+ };
@@ -0,0 +1 @@
1
+ export { CheckboxInput, type CheckboxInputProps } from "./CheckboxInput";
@@ -0,0 +1,48 @@
1
+ @use "@soul-refiner/styles/_mixins";
2
+
3
+ .input {
4
+ box-shadow: 0px 0px 15px rgba(0, 0, 0, 0.05);
5
+ border-radius: 24px;
6
+ width: 100%;
7
+
8
+ [class~="header"] {
9
+ @include mixins.flex($gap: 16px, $align: center);
10
+ border-bottom: 1px solid var(--color-grey-9);
11
+ padding: 16px 24px;
12
+ }
13
+
14
+ textarea {
15
+ flex: 1;
16
+ margin: 14px 24px;
17
+ width: calc(100% - 48px);
18
+ padding: 30px 20px;
19
+ }
20
+
21
+ [class~="actions-wrapper"] {
22
+ padding: 16px 24px;
23
+ border-top: 1px solid var(--color-grey-9);
24
+
25
+ div {
26
+ @include mixins.flex($gap: 10px);
27
+ }
28
+
29
+ [class~="actions-bar"] {
30
+ border: 1px solid rgba(0, 0, 0, 0.05);
31
+ box-shadow: 0px 3px 10px rgba(0, 0, 0, 0.05);
32
+ border-radius: 33px;
33
+ margin-top: 16px;
34
+ padding: 16px 24px;
35
+ justify-content: flex-end;
36
+ align-items: center;
37
+
38
+ button {
39
+ border-radius: 50%;
40
+ }
41
+
42
+ p {
43
+ color: var(--color-grey-4);
44
+ margin-right: auto;
45
+ }
46
+ }
47
+ }
48
+ }
@@ -0,0 +1,16 @@
1
+ import React from "react";
2
+ import "@testing-library/jest-dom";
3
+ import { render, screen, fireEvent } from "@testing-library/react";
4
+
5
+
6
+ import { FeedInput } from "./FeedInput";
7
+
8
+
9
+ describe("Feed Input", () => {
10
+ it("renders the text that is typed into it", () => {
11
+ render(<FeedInput />);
12
+ const textarea = screen.getByRole("textbox");
13
+ fireEvent.change(textarea, { target: { value: "God is good" } });
14
+ expect(textarea.value).toEqual("God is good");
15
+ });
16
+ })
@@ -0,0 +1,197 @@
1
+ import React from "react";
2
+ import feedInputStyles from "./FeedInput.module.scss";
3
+ import { PostInput } from "../PostInput/PostInput";
4
+ import { Button } from "../../actions";
5
+ import {
6
+ Anchor,
7
+ Bell,
8
+ CircleCheck,
9
+ CommentOutline,
10
+ Emoji,
11
+ Eye,
12
+ Gear,
13
+ Link,
14
+ Media,
15
+ PenToPaper,
16
+ Video,
17
+ } from "@soul-refiner/icons/src";
18
+
19
+ export interface FeedInputProps extends React.HTMLProps<HTMLTextAreaElement> {}
20
+
21
+ export const FeedInput = ({ onChange, value, ...rest }: FeedInputProps) => {
22
+ const [editMode, setEditMode] = React.useState("");
23
+
24
+ const handleEditMode = (event: React.MouseEvent) => {
25
+ event.preventDefault();
26
+ setEditMode((prev) => {
27
+ const value = (event.target as HTMLButtonElement).value;
28
+ if (prev === value) {
29
+ return "";
30
+ }
31
+ return value;
32
+ });
33
+ };
34
+
35
+ const handlePost = () => {
36
+ // TODO
37
+ };
38
+
39
+ return (
40
+ <fieldset className={`${feedInputStyles.input}`}>
41
+ <div className="header">
42
+ <PenToPaper fill="var(--colorify-blue-3)" iconSize={20} size={20} />
43
+ <h5>Leave a Post</h5>
44
+ </div>
45
+ <PostInput
46
+ onChange={onChange}
47
+ placeholder="Share something with the community"
48
+ value={value}
49
+ {...rest}
50
+ />
51
+ <div className="actions-wrapper">
52
+ <div>
53
+ <Button
54
+ bold={false}
55
+ buttonColor={
56
+ editMode === "media" ? "var(--colorify-orange-1)" : "#FFF"
57
+ }
58
+ color={
59
+ editMode === "media"
60
+ ? "var(--colorify-orange-3)"
61
+ : "var(--color-grey-4)"
62
+ }
63
+ icon={
64
+ <Media fill="var(--colorify-orange-3)" iconSize={15} size={18} />
65
+ }
66
+ onClick={handleEditMode}
67
+ size="small"
68
+ style={{
69
+ border: `1px solid ${
70
+ editMode === "media"
71
+ ? "var(--colorify-orange-2)"
72
+ : "var(--color-grey-8)"
73
+ }`,
74
+ }}
75
+ uppercase={false}
76
+ value="media"
77
+ >
78
+ Add Media
79
+ </Button>
80
+ <Button
81
+ bold={false}
82
+ buttonColor={
83
+ editMode === "settings" ? "var(--colorify-blue-1)" : "#FFF"
84
+ }
85
+ color={
86
+ editMode === "settings"
87
+ ? "var(--colorify-blue-3)"
88
+ : "var(--color-grey-4)"
89
+ }
90
+ icon={
91
+ <Gear fill="var(--colorify-blue-3)" iconSize={18} size={18} />
92
+ }
93
+ onClick={handleEditMode}
94
+ size="small"
95
+ style={{
96
+ border: `1px solid ${
97
+ editMode === "settings"
98
+ ? "var(--colorify-blue-2)"
99
+ : "var(--color-grey-8)"
100
+ }`,
101
+ }}
102
+ uppercase={false}
103
+ value="settings"
104
+ >
105
+ Post Settings
106
+ </Button>
107
+ <Button
108
+ bold={false}
109
+ buttonColor="var(--color-blue-4)"
110
+ color="var(--color-grey-10)"
111
+ onClick={handlePost}
112
+ size="small"
113
+ style={{
114
+ marginLeft: "auto",
115
+ }}
116
+ uppercase={false}
117
+ >
118
+ Post
119
+ </Button>
120
+ </div>
121
+ {editMode === "media" && (
122
+ <div className="actions-bar">
123
+ <p className="body body-large bold">Add to post</p>
124
+ <Media
125
+ as="button"
126
+ fill="#EFB520"
127
+ iconSize={18}
128
+ size={34}
129
+ style={{ backgroundColor: "#FFF3C7" }}
130
+ />
131
+ <Video
132
+ as="button"
133
+ fill="#FF5722"
134
+ iconSize={18}
135
+ size={34}
136
+ style={{ backgroundColor: "#FFEAD2" }}
137
+ />
138
+ <Emoji
139
+ as="button"
140
+ fill="#F72F4D"
141
+ iconSize={18}
142
+ size={34}
143
+ style={{ backgroundColor: "#FEDED5" }}
144
+ />
145
+ <Link
146
+ as="button"
147
+ fill="#FB19B4"
148
+ iconSize={18}
149
+ size={34}
150
+ style={{ backgroundColor: "#FED3E1" }}
151
+ />
152
+ </div>
153
+ )}
154
+ {editMode === "settings" && (
155
+ <div className="actions-bar">
156
+ <p className="body body-large bold">Post Settings</p>
157
+ <CircleCheck
158
+ as="button"
159
+ fill="#7A5BF5"
160
+ iconSize={18}
161
+ size={34}
162
+ style={{ backgroundColor: "#ECE1FE" }}
163
+ />
164
+ <Anchor
165
+ as="button"
166
+ fill="#6C75F7"
167
+ iconSize={18}
168
+ size={34}
169
+ style={{ backgroundColor: "#DFEAFF" }}
170
+ />
171
+ <Bell
172
+ as="button"
173
+ fill="#24A3D0"
174
+ iconSize={18}
175
+ size={34}
176
+ style={{ backgroundColor: "#CFF9F2" }}
177
+ />
178
+ <Eye
179
+ as="button"
180
+ fill="#1EA385"
181
+ iconSize={18}
182
+ size={34}
183
+ style={{ backgroundColor: "#D4FAE4" }}
184
+ />
185
+ <CommentOutline
186
+ as="button"
187
+ fill="#2FA52D"
188
+ iconSize={18}
189
+ size={34}
190
+ style={{ backgroundColor: "#E3FAD6" }}
191
+ />
192
+ </div>
193
+ )}
194
+ </div>
195
+ </fieldset>
196
+ );
197
+ };
@@ -0,0 +1 @@
1
+ export { FeedInput, type FeedInputProps } from "./FeedInput";
@@ -0,0 +1,48 @@
1
+ @use "@soul-refiner/styles/_mixins";
2
+
3
+ .inboxinput {
4
+ @include mixins.flex($align: center);
5
+ position: relative;
6
+ padding: 10px 17px;
7
+ border-radius: 47px;
8
+ width: 100%;
9
+
10
+ textarea {
11
+ flex: 1;
12
+ appearance: none;
13
+ border: none;
14
+ outline: none;
15
+ resize: none;
16
+ font-size: 18px;
17
+ }
18
+
19
+ em-emoji-picker {
20
+ position: absolute;
21
+ top: -443px;
22
+ left: 25px;
23
+ }
24
+
25
+ [class~="icon"] {
26
+ &:hover {
27
+ cursor: pointer;
28
+ & > svg {
29
+ fill: var(--color-blue-6);
30
+ }
31
+ }
32
+ }
33
+
34
+ [class~="icon"]:first-of-type {
35
+ margin-right: 32px;
36
+ }
37
+
38
+ [class~="icon"]:last-of-type {
39
+ margin-right: unset;
40
+ }
41
+
42
+ [class~="divider"] {
43
+ width: 1px;
44
+ max-width: 1px;
45
+ background: var(--color-grey-8);
46
+ margin-right: 32px;
47
+ }
48
+ }
@@ -0,0 +1,19 @@
1
+ import React from "react";
2
+ import "@testing-library/jest-dom";
3
+ import { render, screen, fireEvent } from "@testing-library/react";
4
+
5
+
6
+ import { InboxInput } from "./InboxInput";
7
+
8
+ const props = {
9
+ onSubmit: jest.fn()
10
+ };
11
+
12
+ describe("Inbox Input", () => {
13
+ it("renders the text that is typed into it", () => {
14
+ render(<InboxInput {...props} />);
15
+ const textarea = screen.getByRole("textbox");
16
+ fireEvent.change(textarea, { target: { value: "God is good" } });
17
+ expect(textarea.value).toEqual("God is good");
18
+ });
19
+ })
@@ -0,0 +1,97 @@
1
+ import React from "react";
2
+ import emojiData from "@soul-refiner/styles/emojis.json";
3
+ import Picker from "@emoji-mart/react";
4
+ import inboxInputStyles from "./InboxInput.module.scss";
5
+ import { Emoji, SendOutline } from "@soul-refiner/icons/src";
6
+
7
+ export interface InboxInputProps extends React.HTMLProps<HTMLTextAreaElement> {}
8
+
9
+ export const InboxInput = ({ onChange, onSubmit, value }: InboxInputProps) => {
10
+ const ref = React.useRef<HTMLTextAreaElement>(null);
11
+ const [showPicker, setShowPicker] = React.useState(false);
12
+
13
+ React.useEffect(() => {
14
+ if (ref.current) {
15
+ ref.current.style.height = "0px";
16
+ const scrollHeight = ref.current.scrollHeight;
17
+ ref.current.style.height = scrollHeight + "px";
18
+ }
19
+ }, [ref.current, value]);
20
+
21
+ const handleAddEmoji = ({ native }: Record<string, string>) => {
22
+ const prevValue = ref.current?.value;
23
+ onChange &&
24
+ onChange({
25
+ target: { value: prevValue + native },
26
+ } as unknown as React.FormEvent<HTMLTextAreaElement>);
27
+ if (ref.current) {
28
+ ref.current.style.height = "0px";
29
+ const scrollHeight = ref.current.scrollHeight;
30
+ ref.current.style.height = scrollHeight + "px";
31
+ }
32
+ };
33
+
34
+ const handlePicker = (event: React.MouseEvent) => {
35
+ event.stopPropagation();
36
+ setShowPicker((prev) => !prev);
37
+ };
38
+
39
+ const handlePickerBlur = () => setShowPicker(false);
40
+
41
+ const handleSubmit = (event: React.FormEvent) => {
42
+ event.preventDefault();
43
+ onSubmit && onSubmit(event as React.FormEvent<HTMLTextAreaElement>);
44
+ };
45
+
46
+ const dividerHeight =
47
+ ref.current?.scrollHeight && ref.current?.scrollHeight > 46
48
+ ? ref.current?.scrollHeight - 11
49
+ : 47;
50
+
51
+ return (
52
+ <form
53
+ className={`${inboxInputStyles.inboxinput} shadow-small`}
54
+ onClick={() => ref.current?.focus()}
55
+ >
56
+ <Emoji
57
+ data-testid="emoji-button"
58
+ fill="var(--color-grey-6)"
59
+ iconSize={30}
60
+ onClick={handlePicker}
61
+ size={39}
62
+ />
63
+ {showPicker && (
64
+ <Picker
65
+ data={emojiData}
66
+ onEmojiSelect={handleAddEmoji}
67
+ onClickOutside={handlePickerBlur}
68
+ maxFrequentRows={1}
69
+ navPosition="none"
70
+ previewPosition="none"
71
+ perLine={9}
72
+ style={{ position: "absolute" }}
73
+ theme="auto"
74
+ />
75
+ )}
76
+ <div className="divider" style={{ height: dividerHeight }}></div>
77
+ <textarea
78
+ onChange={onChange}
79
+ placeholder="Type your reply here..."
80
+ ref={ref}
81
+ value={value}
82
+ />
83
+ <SendOutline
84
+ as="button"
85
+ fill="var(--color-grey-10)"
86
+ iconColor="#2393EF"
87
+ iconSize={28}
88
+ onClick={handleSubmit}
89
+ size={70}
90
+ style={{
91
+ borderRadius: "50%",
92
+ marginLeft: "32px",
93
+ }}
94
+ />
95
+ </form>
96
+ );
97
+ };
@@ -0,0 +1 @@
1
+ export { InboxInput, type InboxInputProps } from "./InboxInput";
@@ -0,0 +1,49 @@
1
+ .postinput {
2
+ width: 100%;
3
+ resize: none;
4
+ border: 1px solid var(--color-grey-9);
5
+ border-radius: 16px;
6
+ background-color: var(--color-grey-10);
7
+ box-sizing: border-box;
8
+ padding: 10px 20px;
9
+ font-size: 16px;
10
+ line-height: 24px;
11
+ color: var(--color-grey-1);
12
+ overflow-y: hidden;
13
+
14
+ &:focus {
15
+ outline: none;
16
+ }
17
+
18
+ &::placeholder {
19
+ color: var(--color-grey-7);
20
+ }
21
+
22
+ &[class~=has-character-count] {
23
+ padding-right: 76px;
24
+ position: relative;
25
+
26
+ &::after {
27
+ content: #{var(--value) / var(--maxLength)};
28
+ position: absolute;
29
+ right: 16px;
30
+ top: calc(50% - 12px);
31
+ }
32
+ }
33
+ }
34
+
35
+ .wrapper {
36
+ width: 100%;
37
+ position: relative;
38
+
39
+ textarea {
40
+ padding-right: 106px;
41
+ }
42
+
43
+ span {
44
+ position: absolute;
45
+ right: 16px;
46
+ top: calc(50% - 10px);
47
+ color: var(--color-grey-4);
48
+ }
49
+ }
@@ -0,0 +1,19 @@
1
+ import React from "react";
2
+ import "@testing-library/jest-dom";
3
+ import { render, screen, fireEvent } from "@testing-library/react";
4
+
5
+
6
+ import { PostInput } from "./PostInput";
7
+
8
+ const props = {
9
+ onSubmit: jest.fn()
10
+ };
11
+
12
+ describe("Post Input", () => {
13
+ it("renders the text that is typed into it", () => {
14
+ render(<PostInput {...props} />);
15
+ const textarea = screen.getByRole("textbox");
16
+ fireEvent.change(textarea, { target: { value: "God is good" } });
17
+ expect(textarea.value).toEqual("God is good");
18
+ });
19
+ })