@soul-refiner/design-system 0.0.14 → 0.0.16

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 -7
  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 +86 -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 +28 -0
@@ -0,0 +1,55 @@
1
+ import React, { ChangeEvent, CSSProperties, useState } from "react";
2
+ import radioStyles from "./RadioInput.module.scss";
3
+
4
+ export interface RadioInputProps
5
+ extends Partial<
6
+ Omit<
7
+ React.DetailedHTMLProps<
8
+ React.InputHTMLAttributes<HTMLInputElement>,
9
+ HTMLInputElement
10
+ >,
11
+ "onChange"
12
+ >
13
+ > {
14
+ label?: string | React.ReactNode;
15
+ reverse?: boolean;
16
+ onChange?: (event: React.ChangeEvent, checked?: boolean) => void;
17
+ }
18
+
19
+ export const RadioInput = ({
20
+ checked = false,
21
+ label,
22
+ onChange,
23
+ reverse,
24
+ ...rest
25
+ }: RadioInputProps) => {
26
+ const [isChecked, setIsChecked] = useState<boolean>();
27
+
28
+ const style: CSSProperties = {
29
+ flexDirection: reverse ? "row-reverse" : "row",
30
+ };
31
+
32
+ const handleChange = (e: ChangeEvent<HTMLInputElement>) => {
33
+ e.stopPropagation();
34
+ setIsChecked((prev) => !prev);
35
+ onChange && onChange(e, checked);
36
+ };
37
+
38
+ React.useEffect(() => {
39
+ setIsChecked(checked);
40
+ }, [checked]);
41
+
42
+ return (
43
+ <div className={radioStyles.radio}>
44
+ <label style={style}>
45
+ <input
46
+ checked={isChecked}
47
+ type="radio"
48
+ onChange={handleChange}
49
+ {...rest}
50
+ />
51
+ {label}
52
+ </label>
53
+ </div>
54
+ );
55
+ };
@@ -0,0 +1 @@
1
+ export { RadioInput, type RadioInputProps } from "./RadioInput"
@@ -0,0 +1,40 @@
1
+ .searchInput {
2
+ display: flex;
3
+ height: 40px;
4
+ border-radius: 20px;
5
+ border: 1px solid transparent;
6
+ padding: 0 16px;
7
+ place-items: center;
8
+ place-content: center;
9
+ position: relative;
10
+ max-width: max-content;
11
+
12
+ transition: 250ms width ease-in-out, 125ms border-color ease-in-out;
13
+
14
+ input[type=text] {
15
+ width: 100%;
16
+ height: 100%;
17
+ border: none;
18
+ outline: none;
19
+ background-color: transparent;
20
+ font-size: var(--size-16);
21
+ color: var(--color-grey-3);
22
+
23
+ &::placeholder {
24
+ font-size: var(--size-16);
25
+ font-weight: var(--weight-inter-medium);
26
+ color: var(--color-grey-6);
27
+ }
28
+ }
29
+
30
+ .magnify {
31
+ cursor: pointer;
32
+ position: absolute;
33
+ right: 0;
34
+ transform: translateX(-50%);
35
+
36
+ &:hover {
37
+ opacity: 0.8;
38
+ }
39
+ }
40
+ }
@@ -0,0 +1,61 @@
1
+ import React, { useState, useEffect, createRef } from "react";
2
+ import { Component } from "@soul-refiner/utils/src";
3
+ import searchStyle from "./SearchInput.module.scss";
4
+
5
+ import { Magnify } from "@soul-refiner/icons/src";
6
+
7
+ export interface SearchInputProps
8
+ extends Omit<React.HTMLProps<HTMLInputElement>, "as"> {
9
+ as?: React.ElementType;
10
+ expandable: boolean;
11
+ expanded?: boolean;
12
+ onSubmit?: () => void;
13
+ width?: number;
14
+ }
15
+
16
+ export const SearchInput = ({
17
+ as,
18
+ expandable = false,
19
+ expanded = false,
20
+ onSubmit,
21
+ width = 340,
22
+ ...rest
23
+ }: SearchInputProps) => {
24
+ const [isExpended, setIsExpended] = useState(expanded);
25
+ const inputRef = createRef<HTMLInputElement>();
26
+
27
+ useEffect(() => {
28
+ setIsExpended(isExpended);
29
+ }, [isExpended]);
30
+
31
+ const style = {
32
+ width: isExpended ? width : 40,
33
+ borderColor: isExpended ? "#AFB6B9" : "transparent",
34
+ };
35
+
36
+ const handleExpendSearch = () => {
37
+ const expended = isExpended;
38
+
39
+ if (expended) inputRef.current?.blur();
40
+ else inputRef.current?.focus();
41
+
42
+ setIsExpended(!isExpended);
43
+ };
44
+
45
+ return (
46
+ <Component
47
+ as={as ?? "form"}
48
+ className={`${searchStyle.searchInput}`}
49
+ style={style}
50
+ onSubmit={onSubmit}
51
+ >
52
+ <input ref={inputRef} type="text" autoComplete="false" {...rest} />
53
+ <Magnify
54
+ className={searchStyle.magnify}
55
+ iconSize={24}
56
+ fill="#5C6264"
57
+ onClick={handleExpendSearch}
58
+ />
59
+ </Component>
60
+ );
61
+ };
@@ -0,0 +1 @@
1
+ export { SearchInput, type SearchInputProps } from "./SearchInput";
@@ -0,0 +1,66 @@
1
+ .selectInput {
2
+ $height: 40px;
3
+ $borderColor: #AFB6B9;
4
+ $borderSize: 1px;
5
+
6
+ display: flex;
7
+ flex-direction: column;
8
+ place-content: center;
9
+ position: relative;
10
+ border: 1px solid $borderColor;
11
+ padding: 8px 16px;
12
+ outline: none;
13
+ user-select: none;
14
+ background-color: #FFF;
15
+
16
+ height: $height;
17
+ border-radius: 0.5 * $height;
18
+
19
+ cursor: pointer;
20
+
21
+ .title {
22
+ display: flex;
23
+ flex-direction: row;
24
+ gap: 16px;
25
+ place-items: center;
26
+ place-content: space-between;
27
+ }
28
+
29
+ &[class~=expanded] {
30
+ border-bottom-left-radius: 0;
31
+ border-bottom-right-radius: 0;
32
+ border-bottom-color: transparent;
33
+
34
+ .options {
35
+ box-shadow: 0 20px 20px -10px rgb(0 0 0 / 10%);
36
+ }
37
+ }
38
+
39
+ &:active {
40
+
41
+ }
42
+
43
+ .options {
44
+ position: absolute;
45
+ bottom: 0;
46
+ left: 0 - $borderSize;
47
+ transform: translateY(100%);
48
+ border: 1px solid $borderColor;
49
+ border-top-width: 0;
50
+ border-radius: 0.5 * $height;
51
+ border-top-left-radius: 0;
52
+ border-top-right-radius: 0;
53
+ background-color: rgba(255 255 255 / 50%);
54
+ backdrop-filter: blur(40px) saturate(200%);
55
+ min-width: calc(100% + ($borderSize * 2));
56
+ overflow: hidden;
57
+ }
58
+
59
+ .option {
60
+ padding: 8px 16px;
61
+
62
+ &[class~=active] {
63
+ background-color: var(--color-blue-9);
64
+ }
65
+ }
66
+ }
@@ -0,0 +1,145 @@
1
+ import React, { useState, useEffect, useRef, ReactNode } from "react";
2
+ import styles from "./SelectInput.module.scss";
3
+ import { ChevronDown } from "@soul-refiner/icons/src";
4
+
5
+ export interface SelectInputProps {
6
+ icon?: ReactNode;
7
+ name: string;
8
+ onSelect?: (value: string) => void;
9
+ options: Array<HTMLOptionElement>;
10
+ placeholder?: string;
11
+ }
12
+
13
+ export const SelectInput = ({
14
+ icon,
15
+ name,
16
+ onSelect,
17
+ options,
18
+ placeholder = "Select an option",
19
+ }: SelectInputProps) => {
20
+ const [focused, setFocused] = useState<boolean>(false);
21
+ const [expanded, _setExpanded] = useState<boolean>(false);
22
+ const [selectedIndex, setSelectedIndex] = useState<number>();
23
+ const [scrollIndex, _setScrollIndex] = useState<number>(-1);
24
+
25
+ const selectRef = useRef<HTMLDivElement>(null);
26
+
27
+ const expandedRef = useRef<boolean>(expanded);
28
+ const setExpanded = (expanded: boolean) => {
29
+ expandedRef.current = expanded;
30
+ _setExpanded(expanded);
31
+ };
32
+
33
+ const scrollIndexRef = useRef<number | undefined>(selectedIndex);
34
+ const setScrollIndex = (index: number) => {
35
+ index = index < 0 ? index + options.length : index;
36
+ scrollIndexRef.current = index;
37
+ _setScrollIndex(index);
38
+ };
39
+
40
+ useEffect(() => {
41
+ if (focused) {
42
+ document.addEventListener("keydown", handleKeydown);
43
+ } else {
44
+ document.removeEventListener("keydown", handleKeydown);
45
+ }
46
+
47
+ return () => {
48
+ document.removeEventListener("keydown", handleKeydown);
49
+ };
50
+ }, [focused]);
51
+
52
+ useEffect(() => {
53
+ if (typeof selectedIndex === "number" && onSelect) {
54
+ onSelect(options[selectedIndex].value);
55
+ }
56
+ }, [selectedIndex]);
57
+
58
+ const handleKeydown = (e: KeyboardEvent) => {
59
+ e.preventDefault();
60
+
61
+ const increment = expandedRef.current ? 1 : 0;
62
+ const currentScrollRef = scrollIndexRef.current
63
+ ? scrollIndexRef.current
64
+ : 0;
65
+
66
+ switch (e.key) {
67
+ case "ArrowUp":
68
+ setExpanded(true);
69
+ setScrollIndex((currentScrollRef - increment) % options.length);
70
+ break;
71
+ case "ArrowDown":
72
+ setExpanded(true);
73
+ setScrollIndex((currentScrollRef + increment) % options.length);
74
+ break;
75
+ case "Escape":
76
+ setExpanded(false);
77
+ break;
78
+ case "Enter":
79
+ if (expandedRef.current) {
80
+ setSelectedIndex(currentScrollRef);
81
+ setExpanded(false);
82
+ } else {
83
+ setExpanded(true);
84
+ }
85
+ break;
86
+ }
87
+ };
88
+
89
+ const handleOnClick = () => {
90
+ setExpanded(!expanded);
91
+ };
92
+
93
+ return (
94
+ <div
95
+ ref={selectRef}
96
+ tabIndex={0}
97
+ onClick={handleOnClick}
98
+ onBlur={(e) => {
99
+ e.preventDefault();
100
+ setFocused(false);
101
+ setExpanded(false);
102
+ }}
103
+ onFocus={(e) => {
104
+ e.preventDefault();
105
+ setFocused(true);
106
+ }}
107
+ className={`${styles.selectInput} ${expanded ? "expanded" : ""}`}
108
+ >
109
+ <div className={styles.title}>
110
+ {placeholder && selectedIndex === undefined && placeholder}
111
+ {selectedIndex !== undefined && options[selectedIndex].label}
112
+ {icon ? icon : <ChevronDown size={16} fill={"var(--color-grey-3)"} />}
113
+ </div>
114
+
115
+ {expanded && (
116
+ <div className={styles.options}>
117
+ {options?.map((option, index) => {
118
+ return (
119
+ <div
120
+ key={index}
121
+ onClick={(e) => {
122
+ e.stopPropagation();
123
+ setSelectedIndex(index);
124
+ setExpanded(false);
125
+ selectRef.current?.focus();
126
+ }}
127
+ onMouseOver={() => setScrollIndex(index)}
128
+ className={`${styles.option} ${
129
+ scrollIndex === index ? "active" : ""
130
+ }`}
131
+ >
132
+ {option.label}
133
+ </div>
134
+ );
135
+ })}
136
+ </div>
137
+ )}
138
+ <input
139
+ type="hidden"
140
+ name={name}
141
+ value={selectedIndex ? options[selectedIndex].value : ""}
142
+ />
143
+ </div>
144
+ );
145
+ };
@@ -0,0 +1 @@
1
+ export { SelectInput, type SelectInputProps } from "./SelectInput"
@@ -0,0 +1,75 @@
1
+ .container {
2
+
3
+ border: 1px solid var(--color-grey-9);
4
+ display: flex;
5
+ border-radius: var(--border-radius-small);
6
+ position: relative;
7
+ padding: 8px;
8
+
9
+ &[class~=maxLength] {
10
+ padding-bottom: 2.5em;
11
+
12
+ .counter {
13
+ position: absolute;
14
+ bottom: 0;
15
+ right: 0;
16
+ padding: 10px;
17
+ color: var(--color-grey-5);
18
+ }
19
+ }
20
+
21
+ .tags {
22
+ display: flex;
23
+ gap: 8px;
24
+ flex-direction: row;
25
+ flex-wrap: wrap;
26
+
27
+ position: relative;
28
+
29
+ .tag {
30
+ display: flex;
31
+ flex-direction: row;
32
+ place-content: space-between;
33
+ place-items: center;
34
+ gap: 8px;
35
+
36
+ background: var(--color-grey-9);
37
+ border-radius: 4px;
38
+ padding: 0px 0 0 10px;
39
+ height: 2.5em;
40
+
41
+ cursor: pointer;
42
+
43
+ &>div {
44
+ min-width: 1ch;
45
+ height: 1em;
46
+ display: flex;
47
+ place-items: center;
48
+ padding-right: 10px;
49
+
50
+ &:first-child {
51
+ flex: 1;
52
+ }
53
+
54
+ &:focus {
55
+ outline: none;
56
+
57
+ &:first-child {
58
+ cursor:text;
59
+ }
60
+ }
61
+ }
62
+ &:focus-within {
63
+ outline: 2px solid var(--colorify-blue-3);
64
+ }
65
+ &[class~=createTag] {
66
+ background-color: white;
67
+ border: none;
68
+ flex: 1;
69
+ min-width: 4em;
70
+ }
71
+ }
72
+ }
73
+
74
+
75
+ }
@@ -0,0 +1,115 @@
1
+ import React, { useState, KeyboardEvent, useRef, CSSProperties } from "react";
2
+ import { Close } from "@soul-refiner/icons/src";
3
+ import tagInputStyle from "./TagInput.module.scss";
4
+
5
+ export interface TagInputProps {
6
+ max?: number;
7
+ style?: CSSProperties;
8
+ }
9
+
10
+ export const TagInput = ({ max, style }: TagInputProps) => {
11
+ const [tags, setTags] = useState<Array<string>>([]);
12
+
13
+ const addTag = (tag: string) => {
14
+ setTags((previous) => {
15
+ return [...previous, tag];
16
+ });
17
+ };
18
+
19
+ const updateTag = (tag: string, index: number) => {
20
+ const t: Array<string> = [...tags];
21
+ t.splice(index, 1, tag);
22
+ setTags(t);
23
+ };
24
+
25
+ const deleteTag = (index: number) => {
26
+ const t: Array<string> = [...tags];
27
+ t.splice(index, 1);
28
+ setTags(t);
29
+ };
30
+
31
+ const RenderTag = ({
32
+ tag,
33
+ index,
34
+ createTag = false,
35
+ }: {
36
+ tag?: string;
37
+ index?: number;
38
+ createTag?: boolean;
39
+ }) => {
40
+ const [thisTag] = useState<string>(tag ? tag : "");
41
+ const ref = useRef<HTMLDivElement>(null);
42
+ const updating: boolean = typeof index === "number";
43
+
44
+ const handleKeyPress = (e: KeyboardEvent<HTMLDivElement>) => {
45
+ const innerText: string = ref.current ? ref.current.innerText : "";
46
+
47
+ switch (e.code) {
48
+ case "Enter":
49
+ case "Comma":
50
+ e.preventDefault();
51
+
52
+ if (tags.find((tag) => tag === innerText)) {
53
+ break;
54
+ }
55
+
56
+ if (updating) {
57
+ updateTag(innerText, index as number);
58
+ } else {
59
+ addTag(innerText);
60
+ }
61
+
62
+ break;
63
+ default:
64
+ //setThisTag(ref.current ? ref.current.innerText : "");
65
+ break;
66
+ }
67
+ };
68
+
69
+ const handleDelete = () => {
70
+ if (typeof index !== "undefined") deleteTag(index);
71
+ };
72
+
73
+ return (
74
+ <div
75
+ className={`${tagInputStyle.tag} ${createTag ? "createTag" : ""}`}
76
+ onClick={() => ref.current?.focus()}
77
+ >
78
+ <div
79
+ ref={ref}
80
+ contentEditable={true}
81
+ onKeyPress={handleKeyPress}
82
+ suppressContentEditableWarning
83
+ >
84
+ {thisTag}
85
+ </div>
86
+ {!createTag && (
87
+ <div onClick={handleDelete}>
88
+ <Close fill="var(--color-grey-6)" size={14} />
89
+ </div>
90
+ )}
91
+ </div>
92
+ );
93
+ };
94
+
95
+ return (
96
+ <div
97
+ style={style}
98
+ className={`${tagInputStyle.container} ${
99
+ typeof max === "number" ? "maxLength" : ""
100
+ }`}
101
+ >
102
+ <div className={tagInputStyle.tags}>
103
+ {tags.map((tag, index) => {
104
+ return <RenderTag key={index} index={index} tag={tag} />;
105
+ })}
106
+ {(!max || (max && tags.length < max)) && <RenderTag createTag={true} />}
107
+ </div>
108
+ {max && (
109
+ <div className={tagInputStyle.counter}>
110
+ {tags.length} / {max}
111
+ </div>
112
+ )}
113
+ </div>
114
+ );
115
+ };
@@ -0,0 +1 @@
1
+ export { TagInput, type TagInputProps } from "./TagInput"
@@ -0,0 +1,35 @@
1
+ @use "@soul-refiner/styles/mixins";
2
+
3
+ .textField {
4
+ position: relative;
5
+ width: 100%;
6
+ display: flex;
7
+ padding: 12px 16px;
8
+ border-radius: var(--border-radius-normal);
9
+ background-color: var(--color-blue-10);
10
+
11
+ .counter {
12
+ @include mixins.font(400, 16px, 24px);
13
+ position: absolute;
14
+ bottom: 8px;
15
+ right: 16px;
16
+ color: #a4b0bf;
17
+ }
18
+
19
+ textarea[type="text"] {
20
+ width: 100%;
21
+ border: none;
22
+ resize: none;
23
+ background-color: transparent;
24
+ font-size: var(--size-16);
25
+ color: var(--color-grey-1);
26
+
27
+ &:focus {
28
+ outline: none;
29
+ }
30
+ }
31
+ }
32
+
33
+ .hasCharacterCount {
34
+ padding-bottom: 32px;
35
+ }
@@ -0,0 +1,46 @@
1
+ import React from "react";
2
+ import styles from "./TextInput.module.scss";
3
+
4
+ export interface TextInputProps extends React.HTMLProps<HTMLTextAreaElement> {
5
+ characterCount?: boolean;
6
+ }
7
+
8
+ export const TextInput = ({
9
+ className,
10
+ characterCount = true,
11
+ maxLength,
12
+ value,
13
+ ...rest
14
+ }: TextInputProps) => {
15
+ const ref = React.useRef<HTMLTextAreaElement>(null);
16
+
17
+ React.useEffect(() => {
18
+ if (ref.current) {
19
+ ref.current.style.height = "0px";
20
+ const scrollHeight = ref.current.scrollHeight;
21
+ ref.current.style.height = scrollHeight + "px";
22
+ }
23
+ }, [ref.current, value]);
24
+
25
+ return (
26
+ <div
27
+ className={`${styles.textField} ${
28
+ characterCount ? styles.hasCharacterCount : ""
29
+ }`}
30
+ >
31
+ <textarea
32
+ className={`${className ? " " + className : ""}`}
33
+ type="text"
34
+ maxLength={maxLength}
35
+ ref={ref}
36
+ value={value}
37
+ {...rest}
38
+ />
39
+ {characterCount && value !== undefined && maxLength && (
40
+ <span className={styles.counter}>
41
+ {value.toString().length.toString()} / {maxLength.toString()}
42
+ </span>
43
+ )}
44
+ </div>
45
+ );
46
+ };
@@ -0,0 +1 @@
1
+ export { TextInput, type TextInputProps } from "./TextInput";
@@ -0,0 +1,10 @@
1
+ export { CalendarInput, type CalendarInputProps } from "./CalendarInput";
2
+ export { CheckboxInput, type CheckboxInputProps } from "./CheckboxInput";
3
+ export { FeedInput, type FeedInputProps } from "./FeedInput";
4
+ export { InboxInput, type InboxInputProps } from "./InboxInput";
5
+ export { PostInput, type PostInputProps } from "./PostInput";
6
+ export { RadioInput, type RadioInputProps } from "./RadioInput";
7
+ export { SearchInput, type SearchInputProps } from "./SearchInput";
8
+ export { SelectInput, type SelectInputProps } from "./SelectInput";
9
+ export { TagInput, type TagInputProps } from "./TagInput";
10
+ export { TextInput, type TextInputProps } from "./TextInput";