@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
package/CHANGELOG.md ADDED
@@ -0,0 +1,7 @@
1
+ # @abide/core
2
+
3
+ ## 0.0.1
4
+
5
+ ### Patch Changes
6
+
7
+ - init
@@ -0,0 +1,6 @@
1
+ module.exports = {
2
+ presets: [
3
+ ["@babel/preset-env", { targets: { node: "current" } }],
4
+ "@babel/preset-typescript",
5
+ ],
6
+ };
package/custom.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ declare module "*.svg" {
2
+ const content: any;
3
+ export default content;
4
+ }
package/package.json CHANGED
@@ -1,14 +1,8 @@
1
1
  {
2
2
  "name": "@soul-refiner/design-system",
3
- "version": "0.0.14",
3
+ "version": "0.0.16",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
- "files": [
7
- "dist"
8
- ],
9
- "main": "./dist/index.umd.cjs",
10
- "module": "./dist/index.js",
11
- "types": "./dist/index.d.ts",
12
6
  "scripts": {
13
7
  "dev": "vite",
14
8
  "build": "mkdir -p dist && cp --parents `find -name \\*scss` ./dist && tsc && vite build",
@@ -0,0 +1,205 @@
1
+ .button {
2
+ width: fit-content;
3
+ font-size: 14px;
4
+ line-height: 20px;
5
+ cursor: pointer;
6
+ display: flex;
7
+ gap: 12px;
8
+ align-items: center;
9
+ justify-content: center;
10
+ user-select: none;
11
+ color: var(--color);
12
+ background-color: var(--background-color);
13
+
14
+ & > * {
15
+ pointer-events: none;
16
+ }
17
+ // types
18
+ &[class~=secondary] {
19
+ background-color: var(--color-grey-10);
20
+ border: 1px solid var(--color-grey-6);
21
+ color: var(--color-grey-1);
22
+ [class~=icon] {
23
+ background-color: transparent;
24
+ > svg {
25
+ fill: var(--color-grey-1);
26
+ }
27
+ }
28
+
29
+ &:hover {
30
+ background-color: var(--color-grey-9);
31
+ }
32
+ &:active {
33
+ background-color: var(--color-grey-1);
34
+ color: var(--color-grey-10);
35
+ [class~=icon] > svg {
36
+ fill: var(--color-grey-10);
37
+ }
38
+ }
39
+ &[class~=focus] {
40
+ background-color: var(--color-grey-9);
41
+ border: 1px solid var(--color-grey-1);
42
+ [class~=icon] > svg {
43
+ fill: var(--color-grey-1);
44
+ }
45
+ }
46
+ }
47
+ &[class~=tertiary] {
48
+ background-color: #FFFFFF;
49
+ border: none;
50
+ color: var(--color-grey-1);
51
+ [class~=icon] {
52
+ background-color: transparent;
53
+ > svg {
54
+ fill: var(--color-grey-1);
55
+ }
56
+ }
57
+ &:disabled {
58
+ color: var(--color-grey-5);
59
+ background-color: #FFFFFF;
60
+ }
61
+ &:hover {
62
+ background-color: var(--color-grey-9);
63
+ }
64
+ &:active {
65
+ color: var(--color-grey-1);
66
+ background-color: var(--color-grey-7);
67
+ [class~=icon] > svg {
68
+ fill: var(--color-grey-1);
69
+ }
70
+ }
71
+ &[class~=focus] {
72
+ border: 1px solid var(--color-grey-8);
73
+ background-color: #FFFFFF;
74
+ }
75
+ }
76
+
77
+ &[class~=quarternary] {
78
+ padding: 4px 16px 4px 4px !important;
79
+ background-color: var(--color-blue-10);
80
+ border: 1px solid var(--color-blue-9);
81
+ color: var(--color-blue-4);
82
+ height: 35px;
83
+
84
+ [class~=icon] {
85
+ justify-self: stretch;
86
+ aspect-ratio: 1;
87
+ height: 100%;
88
+ max-height: 40px;
89
+ width: unset;
90
+
91
+ background-color: #E3EBFF;
92
+ border-radius: 999px;
93
+ padding: 2px;
94
+ &> svg {
95
+ fill: var(--color-blue-4);
96
+ }
97
+ }
98
+ &:hover {
99
+ background-color: var(--color-blue-9);
100
+ [class~=icon] {
101
+ background-color: var(--color-blue-10);
102
+ }
103
+ }
104
+ &:active {
105
+ background-color: var(--color-blue-9);
106
+ color: var(--color-blue-8);
107
+ [class~=icon] {
108
+ background-color: var(--color-blue-10);
109
+ }
110
+ [class~=icon] > svg {
111
+ fill: var(--color-blue-8);
112
+ }
113
+ }
114
+ &[class~=focus] {
115
+ background-color: var(--color-grey-9);
116
+ border: 1px solid var(--color-grey-1);
117
+ [class~=icon] > svg {
118
+ fill: var(--color-grey-1);
119
+ }
120
+ }
121
+ }
122
+
123
+ // shapes
124
+ &[class~=rectangular] {
125
+ border-radius: 5px;
126
+ }
127
+
128
+ // font
129
+ &[class~=bold] {
130
+ font-weight: 600;
131
+ }
132
+ &[class~=uppercase] {
133
+ text-transform: uppercase;
134
+ }
135
+
136
+ // icon
137
+ &[class~=icon-right] {
138
+ span {
139
+ order: 1;
140
+ }
141
+ [class~=icon] {
142
+ justify-self: flex-end;
143
+ order: 2;
144
+ }
145
+ }
146
+
147
+ // size
148
+ &[class~=default] {
149
+ padding: 9px 32px;
150
+ &[class~=rounded] {
151
+ border-radius: 19px;
152
+ }
153
+ }
154
+ &[class~=small] {
155
+ padding: 6px 16px;
156
+ &[class~=rounded] {
157
+ border-radius: 16px;
158
+ }
159
+ }
160
+ &[class~=large] {
161
+ padding: 14px 40px;
162
+ &[class~=rounded] {
163
+ border-radius: 24px;
164
+ }
165
+ }
166
+
167
+ // states
168
+ &[class~=disabled] {
169
+ pointer-events: none;
170
+ }
171
+ &:disabled {
172
+ background-color: var(--color-grey-9) !important;
173
+ color: var(--color-grey-5) !important;
174
+
175
+ div {
176
+ background-color: var(--color-grey-9) !important;
177
+ color: var(--color-grey-5) !important;
178
+ svg {
179
+ fill: var(--color-grey-5) !important;
180
+ }
181
+ }
182
+ }
183
+ &:hover {
184
+ background-color: var(--hover-color);
185
+ [class~=icon] {
186
+ background-color: transparent;
187
+ }
188
+ }
189
+ &:active {
190
+ background-color: var(--color);
191
+ color: var(--background-color);
192
+ [class~=icon] > svg {
193
+ fill: var(--background-color);
194
+ }
195
+ }
196
+ &[class~=focus] {
197
+ background-color: var(--focus-color);
198
+ &:active {
199
+ color: var(--color);
200
+ }
201
+ [class~=icon] > svg {
202
+ fill: var(--color);
203
+ }
204
+ }
205
+ }
@@ -0,0 +1,56 @@
1
+ import React from "react";
2
+ import "@testing-library/jest-dom";
3
+ import { render, screen } from "@testing-library/react";
4
+
5
+ import { Like } from "@soul-refiner/icons/src";
6
+ import { Button } from "./Button";
7
+
8
+ const generateMockProps = (props) => ({
9
+ children: "button",
10
+ ...props,
11
+ });
12
+
13
+ describe("Button renders", () => {
14
+ it("as a semantically different element", () => {
15
+ const props = generateMockProps({
16
+ as: "a",
17
+ href: "https://google.com",
18
+ });
19
+ render(<Button {...props} />);
20
+ expect(screen.getByRole("link"));
21
+ });
22
+
23
+ it("with different text styles", () => {
24
+ const props = generateMockProps({
25
+ bold: false,
26
+ uppercase: false,
27
+ });
28
+ render(<Button {...props} />);
29
+ const button = screen.getByRole("button");
30
+ expect(!button.className.includes("bold"));
31
+ expect(!button.className.includes("uppercase"));
32
+ });
33
+
34
+ it("with an icon", () => {
35
+ const props = generateMockProps({
36
+ icon: <Like data-testid="icon" iconSize={8} size={16} fill="#000" />,
37
+ });
38
+ render(<Button {...props} />);
39
+ expect(screen.getByTestId("icon"));
40
+ });
41
+
42
+ it("with loading state", () => {
43
+ const props = generateMockProps({
44
+ loading: true,
45
+ });
46
+ render(<Button {...props} />);
47
+ const button = screen.getByRole("button");
48
+ expect(button.firstChild).toHaveStyle({
49
+ width: "14px",
50
+ height: "14px",
51
+ borderBottomColor: "transparent",
52
+ borderRightColor: "transparent",
53
+ borderLeftColor: "transparent",
54
+ });
55
+ });
56
+ });
@@ -0,0 +1,143 @@
1
+ import React from "react";
2
+ import buttonStyles from "./Button.module.scss";
3
+ import { Loader } from "../../feedback/Loader";
4
+ import { ChevronDown, ChevronUp } from "@soul-refiner/icons/src";
5
+ import {
6
+ deriveHoverColor,
7
+ deriveFocusColor,
8
+ } from "@soul-refiner/utils/src/colors";
9
+
10
+ export interface ButtonProps
11
+ extends React.PropsWithChildren,
12
+ Omit<
13
+ React.HTMLProps<HTMLButtonElement | HTMLAnchorElement>,
14
+ "type" | "size" | "as"
15
+ > {
16
+ as?: React.ElementType;
17
+ bold?: boolean;
18
+ buttonType?: "primary" | "secondary" | "tertiary" | "quarternary";
19
+ buttonColor?: string;
20
+ className?: string;
21
+ dropdownOpen?: boolean;
22
+ icon?: React.ReactElement;
23
+ iconPosition?: "left" | "right";
24
+ inverted?: boolean;
25
+ focus?: boolean;
26
+ fluid?: boolean;
27
+ loading?: boolean;
28
+ padded?: boolean;
29
+ shape?: "rectangular" | "rounded";
30
+ size?: "default" | "small" | "large" | number;
31
+ styles?: React.CSSProperties;
32
+ color?: string;
33
+ uppercase?: boolean;
34
+ }
35
+
36
+ interface ButtonStyles extends React.CSSProperties {
37
+ "--background-color"?: string;
38
+ "--color"?: string;
39
+ "--hover-color"?: string;
40
+ "--focus-color"?: string;
41
+ }
42
+
43
+ export const Button = ({
44
+ as: Tag = "button",
45
+ bold = true,
46
+ buttonType = "primary",
47
+ buttonColor = "var(--color-blue-10)",
48
+ children,
49
+ className,
50
+ color = "var(--colorify-blue-3)",
51
+ disabled,
52
+ dropdownOpen,
53
+ focus,
54
+ icon,
55
+ iconPosition = "left",
56
+ inverted,
57
+ href,
58
+ fluid,
59
+ loading,
60
+ padded = true,
61
+ shape = "rounded",
62
+ size = "default",
63
+ style,
64
+ uppercase = true,
65
+ ...rest
66
+ }: ButtonProps) => {
67
+ /**
68
+ * TODO: Refactor styles below to use variable definition pattern (width, padding, border-radius)
69
+ */
70
+ const additionalStyles: ButtonStyles = {
71
+ ...style,
72
+ };
73
+ if (fluid) {
74
+ additionalStyles.width = "100%";
75
+ }
76
+ if (!padded) {
77
+ additionalStyles.padding = "0px 0px 0px 0px";
78
+ }
79
+ if (typeof size === "number") {
80
+ additionalStyles.paddingLeft = 18 * size;
81
+ additionalStyles.paddingRight = 18 * size;
82
+ additionalStyles.paddingTop = 9 * size;
83
+ additionalStyles.paddingBottom = 9 * size;
84
+ if (shape === "rounded") {
85
+ additionalStyles.borderRadius = `${10 + 9 * size}px`;
86
+ }
87
+ }
88
+
89
+ additionalStyles["--background-color"] = inverted ? color : buttonColor;
90
+ additionalStyles["--color"] = !inverted ? color : buttonColor;
91
+ additionalStyles["--hover-color"] = deriveHoverColor(
92
+ inverted ? color : buttonColor
93
+ );
94
+ additionalStyles["--focus-color"] = deriveFocusColor(
95
+ inverted ? color : buttonColor
96
+ );
97
+
98
+ return (
99
+ <Tag
100
+ className={`${buttonStyles.button} ${focus ? "focus" : ""} ${
101
+ bold ? "bold" : ""
102
+ } ${buttonType ? buttonType : ""} ${disabled ? "disabled" : ""} ${
103
+ iconPosition ? "icon-" + iconPosition : ""
104
+ } ${size} ${shape ? shape : ""} ${uppercase ? "uppercase" : ""} ${
105
+ className ? className : ""
106
+ }`}
107
+ disabled={disabled}
108
+ href={!disabled && href ? href : undefined}
109
+ style={additionalStyles}
110
+ {...rest}
111
+ >
112
+ {icon && !loading && icon}
113
+ {!disabled && loading && (
114
+ <Loader
115
+ color={!inverted ? color : buttonColor}
116
+ inline
117
+ size={14}
118
+ styles={{ marginRight: 8 }}
119
+ />
120
+ )}
121
+ <span style={{ flexShrink: 0 }}>{children}</span>
122
+ {dropdownOpen !== undefined ? (
123
+ dropdownOpen ? (
124
+ <ChevronUp
125
+ fill={!inverted ? color : buttonColor}
126
+ inline
127
+ size={14}
128
+ iconSize={12}
129
+ style={{ margin: "0px 0px 0px 8px" }}
130
+ />
131
+ ) : (
132
+ <ChevronDown
133
+ fill={!inverted ? color : buttonColor}
134
+ inline
135
+ size={14}
136
+ iconSize={12}
137
+ style={{ margin: "0px 0px 0px 8px" }}
138
+ />
139
+ )
140
+ ) : null}
141
+ </Tag>
142
+ );
143
+ };
@@ -0,0 +1 @@
1
+ export { Button, type ButtonProps } from "./Button";
@@ -0,0 +1,77 @@
1
+ @use "@soul-refiner/styles/mixins";
2
+
3
+ .dropdown {
4
+ position: relative;
5
+ display: block;
6
+ width: var(--width);
7
+ outline: none;
8
+
9
+ [class~="options"] {
10
+ position: absolute;
11
+ width: max-content;
12
+ padding: 8px;
13
+ border-radius: var(--border-radius-small);
14
+ box-shadow: 0px 15px 50px rgba(0, 0, 0, 0.15);
15
+ background-color: white;
16
+ z-index: 100;
17
+ outline: none;
18
+ cursor: pointer;
19
+
20
+ &[class~="open-left"] {
21
+ right: 100%;
22
+ }
23
+ }
24
+
25
+ [class~="disabled"] {
26
+ pointer-events: none;
27
+ }
28
+ }
29
+
30
+ .option {
31
+ @include mixins.flex($gap: 8px, $align: center);
32
+ @include mixins.font(400, 14px, 22px);
33
+ padding: 5px 8px;
34
+ height: 32px;
35
+ width: 100%;
36
+ color: var(--color-grey-0);
37
+ border-radius: var(--border-radius-tiny);
38
+ user-select: none;
39
+ outline: none;
40
+ flex-shrink: 0;
41
+
42
+ &[class~="selected"] {
43
+ background-color: var(--color-blue-9);
44
+ }
45
+
46
+ &:disabled {
47
+ color: var(--color-grey-5);
48
+ & > div > svg {
49
+ fill: var(--color-grey-5);
50
+ }
51
+ }
52
+
53
+ & > * {
54
+ pointer-events: none;
55
+ user-select: none;
56
+ }
57
+
58
+ input {
59
+ // TODO: style checkbox of list component
60
+ --todo: #fff;
61
+ }
62
+
63
+ &:hover {
64
+ background-color: var(--color-grey-9);
65
+ }
66
+ }
67
+
68
+ .spacer {
69
+ width: 100%;
70
+ height: 1px;
71
+ background-color: var(--color-grey-8);
72
+ margin: 16px 0px;
73
+
74
+ &:hover {
75
+ appearance: none;
76
+ }
77
+ }
@@ -0,0 +1,149 @@
1
+ import React from "react";
2
+ import "@testing-library/jest-dom";
3
+ import { fireEvent, render, screen } from "@testing-library/react";
4
+
5
+ import { Like } from "@soul-refiner/icons/src";
6
+ import { Dropdown } from "./Dropdown";
7
+ import { Button } from "../Button";
8
+
9
+ const generateMockProps = (props) => ({
10
+ onChange: jest.fn(),
11
+ closeOnChange: true,
12
+ options: [
13
+ {
14
+ value: "option1",
15
+ label: "Option 1",
16
+ style: { width: 160 },
17
+ },
18
+ {
19
+ value: "option2",
20
+ label: "Option 2",
21
+ style: { width: 160 },
22
+ },
23
+ {
24
+ value: "option3",
25
+ label: "Option 3",
26
+ style: { width: 160 },
27
+ },
28
+ {
29
+ value: "option4",
30
+ label: "Option 4",
31
+ style: { width: 160 },
32
+ },
33
+ ],
34
+ trigger: <Button>Dropdown</Button>,
35
+ ...props,
36
+ });
37
+
38
+ describe("Dropdown", () => {
39
+ it("renders its options", () => {
40
+ const props = generateMockProps({});
41
+ render(<Dropdown {...props} />);
42
+ const trigger = screen.getByRole("button");
43
+ fireEvent.click(trigger);
44
+ const optionsWrapper = screen.getByTestId("options-wrapper");
45
+ expect(optionsWrapper.children.length).toEqual(4);
46
+ });
47
+
48
+ it("renders selectable options", () => {
49
+ const props = generateMockProps({
50
+ closeOnChange: false,
51
+ });
52
+ render(<Dropdown {...props} />);
53
+ const trigger = screen.getByRole("button");
54
+ fireEvent.click(trigger);
55
+ const optionsWrapper = screen.getByTestId("options-wrapper");
56
+ fireEvent.click(optionsWrapper.children[0]);
57
+ expect(optionsWrapper.children[0]).toHaveAttribute(
58
+ "class",
59
+ "undefined selected"
60
+ );
61
+ });
62
+
63
+ it("renders checkbox options", () => {
64
+ const props = generateMockProps({
65
+ options: [
66
+ {
67
+ checkbox: true,
68
+ value: "option1",
69
+ label: "Option 1",
70
+ style: { width: 160 },
71
+ },
72
+ {
73
+ checkbox: true,
74
+ value: "option2",
75
+ label: "Option 2",
76
+ style: { width: 160 },
77
+ },
78
+ {
79
+ checkbox: true,
80
+ value: "option3",
81
+ label: "Option 3",
82
+ style: { width: 160 },
83
+ },
84
+ {
85
+ checkbox: true,
86
+ value: "option4",
87
+ label: "Option 4",
88
+ style: { width: 160 },
89
+ },
90
+ ],
91
+ });
92
+ render(<Dropdown {...props} />);
93
+ const trigger = screen.getByRole("button");
94
+ fireEvent.click(trigger);
95
+ const optionsWrapper = screen.getByTestId("options-wrapper");
96
+ expect(optionsWrapper.children[0].children[0].tagName).toEqual("INPUT");
97
+ });
98
+
99
+ it("renders icon options", () => {
100
+ const props = generateMockProps({
101
+ options: [
102
+ {
103
+ value: "option1",
104
+ label: "Option 1",
105
+ style: { width: 160 },
106
+ icon: <Like iconSize={16} size="20" fill="var(--color-grey-4)" />,
107
+ },
108
+ {
109
+ value: "option2",
110
+ label: "Option 2",
111
+ style: { width: 160 },
112
+ icon: <Like iconSize={16} size="20" fill="var(--color-grey-4)" />,
113
+ },
114
+ {
115
+ value: "option3",
116
+ label: "Option 3",
117
+ style: { width: 160 },
118
+ icon: <Like iconSize={16} size="20" fill="var(--color-grey-4)" />,
119
+ },
120
+ {
121
+ value: "option4",
122
+ label: "Option 4",
123
+ style: { width: 160 },
124
+ icon: <Like iconSize={16} size="20" fill="var(--color-grey-4)" />,
125
+ },
126
+ ],
127
+ });
128
+ render(<Dropdown {...props} />);
129
+ const trigger = screen.getByRole("button");
130
+ fireEvent.click(trigger);
131
+ const optionsWrapper = screen.getByTestId("options-wrapper");
132
+ expect(optionsWrapper.children[0].children[0]).toHaveAttribute(
133
+ "class",
134
+ "undefined icon "
135
+ );
136
+ });
137
+
138
+ it("fires the onChange handler upon selection", () => {
139
+ const props = generateMockProps({
140
+ closeOnChange: false,
141
+ });
142
+ render(<Dropdown {...props} />);
143
+ const trigger = screen.getByRole("button");
144
+ fireEvent.click(trigger);
145
+ const optionsWrapper = screen.getByTestId("options-wrapper");
146
+ fireEvent.click(optionsWrapper.children[0]);
147
+ expect(props.onChange).toHaveBeenCalled();
148
+ });
149
+ });