@nuskin/foundation-ui-components 1.0.0-cft-35.13 → 1.0.0-develop.10

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 (247) hide show
  1. package/package.json +21 -11
  2. package/src/common/accordion/NsAccordion.tsx +69 -0
  3. package/src/common/accordion/NsAccordionHeader.tsx +77 -0
  4. package/src/common/accordion/NsAccordionItem.tsx +59 -0
  5. package/src/common/accordion/NsCollapse.tsx +110 -0
  6. package/src/common/accordion/NsToggleSection.tsx +43 -0
  7. package/src/common/accordion/ToggleSection.styled.tsx +32 -0
  8. package/src/common/accordion/colorMap.ts +117 -0
  9. package/src/common/accordion/enums.ts +8 -0
  10. package/src/common/accordion/index.ts +7 -0
  11. package/src/common/accordion/specs/NsAccordion.spec.tsx +163 -0
  12. package/src/common/accordion/specs/NsAccordionHeader.spec.tsx +130 -0
  13. package/src/common/accordion/specs/NsAccordionItem.spec.tsx +79 -0
  14. package/src/common/accordion/specs/NsCollapse.spec.tsx +129 -0
  15. package/src/common/accordion/specs/NsToggleSection.spec.tsx +74 -0
  16. package/src/common/accordion/stories/NsAccordion.stories.tsx +65 -0
  17. package/src/common/accordion/stories/NsAccordionHeader.stories.tsx +44 -0
  18. package/src/common/accordion/stories/NsAccordionItem.stories.tsx +45 -0
  19. package/src/common/accordion/stories/NsCollapse.stories.tsx +50 -0
  20. package/src/common/accordion/stories/NsToggleSection.stories.tsx +26 -0
  21. package/src/common/accordion/stories/data.tsx +143 -0
  22. package/src/common/accordion/types.d.ts +81 -0
  23. package/src/common/alert/Header.tsx +29 -0
  24. package/src/common/alert/NsAlert.spec.tsx +62 -29
  25. package/src/common/alert/NsAlert.stories.tsx +18 -17
  26. package/src/common/alert/NsAlert.styled.tsx +124 -0
  27. package/src/common/alert/NsAlert.tsx +27 -110
  28. package/src/common/alert/index.ts +2 -2
  29. package/src/common/alert/types.d.ts +23 -23
  30. package/src/common/auth-dropdown/NsAuthDropdown.spec.tsx +24 -6
  31. package/src/common/auth-dropdown/NsAuthDropdown.stories.tsx +2 -2
  32. package/src/common/auth-dropdown/NsAuthDropdown.styled.ts +21 -16
  33. package/src/common/auth-dropdown/NsAuthDropdown.tsx +7 -6
  34. package/src/common/auth-dropdown/index.ts +1 -1
  35. package/src/common/auth-dropdown/types.d.ts +3 -1
  36. package/src/common/autocomplete/NsAutocomplete.spec.tsx +69 -24
  37. package/src/common/autocomplete/NsAutocomplete.stories.tsx +64 -7
  38. package/src/common/autocomplete/NsAutocomplete.styled.tsx +12 -0
  39. package/src/common/autocomplete/NsAutocomplete.tsx +100 -46
  40. package/src/common/autocomplete/index.ts +2 -1
  41. package/src/common/autocomplete/mock/MockData.ts +50 -7
  42. package/src/common/autocomplete/mock/MockUI.tsx +2 -1
  43. package/src/common/autocomplete/{types.ts → types.d.ts} +18 -8
  44. package/src/common/banner/NsBanner.spec.tsx +13 -4
  45. package/src/common/banner/NsBanner.stories.tsx +2 -2
  46. package/src/common/banner/NsBanner.styled.tsx +1 -1
  47. package/src/common/banner/NsBanner.tsx +1 -1
  48. package/src/common/banner/index.ts +1 -1
  49. package/src/common/brand-components/NsBrand.stories.tsx +2 -2
  50. package/src/common/brand-components/NsBrandComponent.tsx +6 -3
  51. package/src/common/brand-components/index.ts +1 -1
  52. package/src/common/breadcrumb/NsBreadcrumb.spec.tsx +8 -9
  53. package/src/common/breadcrumb/NsBreadcrumb.stories.tsx +3 -5
  54. package/src/common/breadcrumb/NsBreadcrumb.tsx +5 -3
  55. package/src/common/breadcrumb/data.ts +10 -0
  56. package/src/common/breadcrumb/index.ts +1 -1
  57. package/src/common/button/NsButton.spec.tsx +66 -51
  58. package/src/common/button/NsButton.stories.tsx +61 -4
  59. package/src/common/button/NsButton.styled.tsx +54 -72
  60. package/src/common/button/NsButton.tsx +9 -3
  61. package/src/common/button/helper.ts +82 -0
  62. package/src/common/button/index.ts +1 -1
  63. package/src/common/button/types.d.ts +3 -0
  64. package/src/common/card/NsFfgCard.tsx +14 -8
  65. package/src/common/card/specs/NsFfgCard.spec.tsx +33 -0
  66. package/src/common/card/stories/NsBgCard.stories.tsx +2 -4
  67. package/src/common/card/stories/NsBrandProductCard.stories.tsx +2 -2
  68. package/src/common/card/stories/NsFfgCard.stories.tsx +49 -16
  69. package/src/common/card/stories/{data.js → data.ts} +1 -25
  70. package/src/common/card/styled/NsFfgStyled.tsx +9 -7
  71. package/src/common/card/types.d.ts +7 -4
  72. package/src/common/carousal/NsScrollingCarousal.tsx +61 -0
  73. package/src/common/carousal/index.ts +3 -0
  74. package/src/common/carousal/{tests → specs}/NsCarousal.spec.tsx +2 -2
  75. package/src/common/carousal/specs/NsScrollingCarousal.spec.tsx +61 -0
  76. package/src/common/carousal/stories/NSCarousal.stories.tsx +2 -2
  77. package/src/common/carousal/stories/NsScrollingCarousal.stories.tsx +52 -0
  78. package/src/common/carousal/types.d.ts +23 -0
  79. package/src/common/cart-icon/NsCartIcon.spec.tsx +1 -1
  80. package/src/common/cart-icon/NsCartIcon.stories.tsx +2 -2
  81. package/src/common/cart-icon/NsCartIcon.tsx +1 -1
  82. package/src/common/cart-icon/index.ts +1 -1
  83. package/src/common/checkbox/NsCheckbox.spec.tsx +2 -2
  84. package/src/common/checkbox/NsCheckbox.stories.tsx +2 -2
  85. package/src/common/checkbox/NsCheckbox.styled.tsx +15 -16
  86. package/src/common/checkbox/NsCheckbox.tsx +2 -2
  87. package/src/common/checkbox/index.ts +1 -1
  88. package/src/common/checkbox/types.d.ts +1 -7
  89. package/src/common/column-control/NsColumnControl.tsx +1 -1
  90. package/src/common/column-control/NsFlexColumns.tsx +22 -0
  91. package/src/common/column-control/NsGridColumns.tsx +22 -0
  92. package/src/common/column-control/index.ts +3 -1
  93. package/src/common/column-control/{NsColumnControl.spec.tsx → specs/NsColumnControl.spec.tsx} +3 -3
  94. package/src/common/column-control/specs/NsFlexColumns.spec.tsx +24 -0
  95. package/src/common/column-control/specs/NsGridColumns.spec.tsx +24 -0
  96. package/src/common/column-control/stories/DivArray.stories.tsx +18 -0
  97. package/src/common/column-control/stories/DivArray.tsx +63 -0
  98. package/src/common/column-control/{NsColumnControl.stories.tsx → stories/NsColumnControl.stories.tsx} +9 -16
  99. package/src/common/column-control/stories/NsFlexColumns.stories.tsx +63 -0
  100. package/src/common/column-control/stories/NsGridColumns.stories.tsx +63 -0
  101. package/src/common/column-control/stories/common.tsx +14 -0
  102. package/src/common/column-control/styled/StyledFlex.tsx +45 -0
  103. package/src/common/column-control/styled/StyledGrid.tsx +40 -0
  104. package/src/common/column-control/styled/common.ts +27 -0
  105. package/src/common/column-control/types.d.ts +15 -16
  106. package/src/common/column-control/utils.ts +5 -5
  107. package/src/common/common.types.d.ts +21 -0
  108. package/src/common/dropdown/NsDropdown.spec.tsx +1 -1
  109. package/src/common/dropdown/NsDropdown.styled.tsx +23 -18
  110. package/src/common/dropdown/NsDropdown.tsx +1 -1
  111. package/src/common/dropdown/NsDropdownOption.tsx +1 -1
  112. package/src/common/dropdown/index.ts +1 -1
  113. package/src/common/dropdown/stories/NsDropdown.stories.tsx +2 -2
  114. package/src/common/dropdown/stories/NsDropdownCountry.stories.tsx +2 -2
  115. package/src/common/dropdown/types.d.ts +3 -1
  116. package/src/common/email-simple/NsEmailSimple.spec.tsx +145 -0
  117. package/src/common/email-simple/NsEmailSimple.stories.tsx +61 -0
  118. package/src/common/email-simple/NsEmailSimple.tsx +71 -0
  119. package/src/common/email-simple/index.ts +2 -0
  120. package/src/common/email-simple/types.d.ts +14 -0
  121. package/src/common/flag/NsFlag.spec.tsx +5 -25
  122. package/src/common/flag/NsFlag.stories.tsx +2 -2
  123. package/src/common/flag/NsFlag.styled.tsx +7 -9
  124. package/src/common/flag/NsFlag.tsx +1 -3
  125. package/src/common/flag/index.ts +1 -1
  126. package/src/common/flag/types.d.ts +0 -2
  127. package/src/common/hooks/index.ts +2 -0
  128. package/src/common/hooks/specs/useWindowSize.spec.tsx +19 -0
  129. package/src/common/hooks/useAccordionMap.tsx +39 -0
  130. package/src/common/hooks/useWindowSize.tsx +30 -0
  131. package/src/common/icon/NsIcon.spec.tsx +1 -1
  132. package/src/common/icon/NsIcon.stories.tsx +2 -2
  133. package/src/common/icon/NsIcon.styled.tsx +1 -1
  134. package/src/common/icon/NsIcon.tsx +1 -1
  135. package/src/common/icon/NsIconVariants.ts +9 -4
  136. package/src/common/icon/icons/AlertErrorIcon.tsx +15 -6
  137. package/src/common/icon/icons/HamburgerIcon.tsx +29 -0
  138. package/src/common/icon/icons/UserIcon.tsx +30 -0
  139. package/src/common/icon/icons/WarningIcon.tsx +14 -5
  140. package/src/common/icon/index.ts +1 -1
  141. package/src/common/icon/types.d.ts +1 -0
  142. package/src/common/image/NsImage.spec.tsx +57 -7
  143. package/src/common/image/NsImage.stories.tsx +2 -2
  144. package/src/common/image/NsImage.tsx +24 -12
  145. package/src/common/image/NsNextImage.spec.tsx +1 -1
  146. package/src/common/image/NsNextImage.stories.tsx +2 -2
  147. package/src/common/image/NsNextImage.tsx +1 -1
  148. package/src/common/image/index.ts +1 -1
  149. package/src/common/image/types.d.ts +1 -0
  150. package/src/common/index.ts +14 -10
  151. package/src/common/input/InputFieldWrapper.tsx +4 -4
  152. package/src/common/input/InputWrapper.tsx +12 -7
  153. package/src/common/input/NsInputField.stories.tsx +13 -10
  154. package/src/common/input/NsInputField.tsx +13 -6
  155. package/src/common/input/getAdornmentProps.tsx +5 -1
  156. package/src/common/input/index.ts +1 -1
  157. package/src/common/input/types.d.ts +18 -1
  158. package/src/common/label/NsLabel.stories.tsx +6 -1
  159. package/src/common/label/NsLabel.tsx +21 -20
  160. package/src/common/label/index.ts +1 -1
  161. package/src/common/label/types.d.ts +2 -1
  162. package/src/common/link/NsLink.spec.tsx +1 -1
  163. package/src/common/link/NsLink.stories.tsx +2 -2
  164. package/src/common/link/NsLink.tsx +1 -1
  165. package/src/common/link/index.ts +1 -1
  166. package/src/common/modal/NsModal.spec.tsx +46 -0
  167. package/src/common/modal/NsModal.styled.tsx +28 -0
  168. package/src/common/modal/NsModal.tsx +37 -0
  169. package/src/common/modal/helper-component/NsModalContentBox.tsx +32 -0
  170. package/src/common/modal/helper-component/NsModalDefault.tsx +25 -0
  171. package/src/common/modal/helper-component/NsModalStatus.tsx +15 -0
  172. package/src/common/modal/helper-component/NsModalStatusIcon.tsx +14 -0
  173. package/src/common/modal/helper-component/NsModalTitle.tsx +26 -0
  174. package/src/common/modal/index.ts +2 -0
  175. package/src/common/modal/model/NsModalVariantMap.tsx +24 -0
  176. package/src/common/modal/stories/NsModal.stories.tsx +86 -0
  177. package/src/common/modal/stories/mock.tsx +46 -0
  178. package/src/common/modal/types.ts +56 -0
  179. package/src/common/nav-product-card/NsNavProductCard.spec.tsx +1 -1
  180. package/src/common/nav-product-card/NsNavProductCard.stories.tsx +2 -2
  181. package/src/common/nav-product-card/NsNavProductCard.tsx +1 -1
  182. package/src/common/nav-product-card/index.ts +1 -1
  183. package/src/common/nav-tab/NsNavTab.spec.tsx +2 -7
  184. package/src/common/nav-tab/NsNavTab.stories.tsx +2 -2
  185. package/src/common/nav-tab/NsNavTab.styled.tsx +7 -4
  186. package/src/common/nav-tab/NsNavTab.tsx +1 -1
  187. package/src/common/nav-tab/index.ts +1 -1
  188. package/src/common/nav-tab/types.d.ts +2 -2
  189. package/src/common/radiogroup/NsRadioGroup.spec.tsx +63 -0
  190. package/src/common/radiogroup/NsRadioGroup.stories.tsx +84 -0
  191. package/src/common/radiogroup/NsRadioGroup.styled.tsx +52 -0
  192. package/src/common/radiogroup/NsRadioGroup.tsx +62 -0
  193. package/src/common/radiogroup/index.ts +2 -0
  194. package/src/common/radiogroup/types.d.ts +20 -0
  195. package/src/common/search-bar/NsSeachBar.spec.tsx +1 -1
  196. package/src/common/search-bar/NsSearchBar.tsx +1 -3
  197. package/src/common/select/NsSelect.spec.tsx +193 -0
  198. package/src/common/select/NsSelect.styled.tsx +104 -0
  199. package/src/common/select/NsSelect.tsx +117 -0
  200. package/src/common/select/NsSelectOption.tsx +30 -0
  201. package/src/common/select/index.ts +3 -0
  202. package/src/common/select/stories/NsSelect.stories.tsx +134 -0
  203. package/src/common/select/types.d.ts +34 -0
  204. package/src/common/spinner/NsSpinner.spec.tsx +21 -0
  205. package/src/common/spinner/NsSpinner.stories.tsx +26 -0
  206. package/src/common/spinner/NsSpinner.styled.tsx +344 -0
  207. package/src/common/spinner/NsSpinner.tsx +14 -0
  208. package/src/common/spinner/icons/Spinner.tsx +161 -0
  209. package/src/common/spinner/index.ts +2 -0
  210. package/src/common/spinner/types.ts +5 -0
  211. package/src/common/table/NsExpandableRow.tsx +68 -0
  212. package/src/common/table/NsTable.spec.tsx +174 -0
  213. package/src/common/table/NsTable.stories.tsx +161 -0
  214. package/src/common/table/NsTable.styled.ts +127 -0
  215. package/src/common/table/NsTable.tsx +133 -0
  216. package/src/common/table/NsTableHeader.tsx +41 -0
  217. package/src/common/table/NsTablePagination.tsx +28 -0
  218. package/src/common/table/helper.ts +33 -0
  219. package/src/common/table/index.ts +2 -0
  220. package/src/common/table/types.d.ts +57 -0
  221. package/src/common/text-strip/NsTextStrip.spec.tsx +30 -0
  222. package/src/common/text-strip/NsTextStrip.stories.tsx +33 -0
  223. package/src/common/text-strip/NsTextStrip.tsx +47 -0
  224. package/src/common/text-strip/index.ts +2 -0
  225. package/src/common/text-strip/types.d.ts +17 -0
  226. package/src/common/typography/NsTypography.stories.tsx +2 -2
  227. package/src/common/typography/NsTypography.tsx +1 -1
  228. package/src/common/typography/Typography.styled.tsx +4 -4
  229. package/src/common/typography/index.ts +1 -1
  230. package/src/common/util.ts +1 -0
  231. package/src/common/utility/Show.tsx +13 -0
  232. package/src/common/utility/index.ts +1 -0
  233. package/src/common/validations/regex.ts +3 -0
  234. package/src/common/videos/NsVideo.stories.tsx +2 -2
  235. package/src/common/videos/NsVideo.tsx +1 -1
  236. package/src/common/videos/index.ts +1 -1
  237. package/src/common/videos/types.d.ts +1 -1
  238. package/src/common/alert/NsAlert.styled.ts +0 -124
  239. package/src/common/card/tests/NsFfgCard.spec.tsx +0 -23
  240. package/src/common/column-control/NDivs.story.tsx +0 -35
  241. package/src/common/common.types.ts +0 -10
  242. /package/src/common/brand-components/{NsBrandContanier.styled.tsx → NsBrandContainer.styled.tsx} +0 -0
  243. /package/src/common/card/{tests → specs}/BrandLogo.spec.tsx +0 -0
  244. /package/src/common/card/{tests → specs}/NsBgCard.spec.tsx +0 -0
  245. /package/src/common/card/{tests → specs}/NsBrandProductCard.spec.tsx +0 -0
  246. /package/src/common/carousal/{tests → specs}/Chevron.spec.tsx +0 -0
  247. /package/src/common/carousal/{tests → specs}/RenderBrand.spec.tsx +0 -0
@@ -0,0 +1,124 @@
1
+ /* eslint-disable max-len */
2
+ import { styled, css, ColorUtils, FoundationTheme } from '@nuskin/foundation-theme';
3
+
4
+ const { color } = ColorUtils;
5
+
6
+ import type { AlertContainerParams, AlertType, AlertParams, TypeMapCSS } from './types';
7
+ const gutterWidth = '10px';
8
+ const closeButtonWidth = '12px';
9
+ const iconWidth = '24px';
10
+
11
+ const TypeMap: TypeMapCSS = {
12
+ banner: {
13
+ minHeight: '114px',
14
+ padding: '15px 45px',
15
+ contentColumnStart: 'row-center',
16
+ contentColumnEnd: 'row-center',
17
+ barPosition: 'top',
18
+ footVisibility: 'block',
19
+ },
20
+ card: {
21
+ minHeight: '72px',
22
+ padding: '24px 24px',
23
+ contentColumnStart: 'row-left',
24
+ contentColumnEnd: 'row-right',
25
+ barPosition: 'left',
26
+ footDisplay: 'none',
27
+ },
28
+ };
29
+
30
+ const contextType = {
31
+ error: 'red',
32
+ info: 'info',
33
+ notice: 'info',
34
+ success: 'success',
35
+ warning: 'warning',
36
+ };
37
+
38
+ export const AlertContainer = styled.div<AlertContainerParams>`
39
+ display: ${({ visible }) => (visible ? 'block' : 'none')};
40
+ * {
41
+ box-sizing: border-box;
42
+ webkit-font-smoothing: antialiased;
43
+ }
44
+ text-align: left;
45
+ `;
46
+ //[Todo-Arun] - Fonts should be driven through @next/font and according to theme
47
+ const fontFamilyStyles = css`
48
+ font-family: 'proxima-nova', 'OpenSans', 'Pridi', 'NotoSans', 'NotoSansSC', 'NotoSansHebrew', 'NotoSansJapanese',
49
+ 'Hiragino Kaku Gothic Pro', 'Yu Gothic Medium', 'Yu Gothic', Meiryo, 'source-han-sans-japanese',
50
+ 'source-han-sans-korean', 'source-han-sans-simplified-c', Helvetica, Arial, sans-serif;
51
+ `;
52
+
53
+ export const Alert = styled.div<AlertParams>`
54
+ position: relative;
55
+ display: grid;
56
+ grid-template-columns: [row-left] ${iconWidth} [space] ${gutterWidth} [row-center] auto [space] ${gutterWidth} [row-right] ${closeButtonWidth};
57
+ grid-template-rows: [row1] auto;
58
+ grid-auto-row: auto;
59
+ grid-auto-flow: row;
60
+ background-color: ${color('primary', 'white')};
61
+ border: 1px solid ${color('primary', 'black')};
62
+ min-height: ${({ type }) => TypeMap?.[type]?.minHeight};
63
+ padding: ${({ type }) => TypeMap?.[type]?.padding};
64
+ color: ${(props) => color(contextType?.[props?.context] as FoundationTheme.AppColors, '40')(props)} };
65
+ `;
66
+
67
+ export const AlertCloseButton = styled.div`
68
+ grid-column-start: row-right;
69
+ grid-column-end: row-right;
70
+ grid-row-start: row1;
71
+ grid-row-end: row1;
72
+ align-self: center;
73
+ cursor: pointer;
74
+ `;
75
+
76
+ export const AlertIcon = styled.div`
77
+ grid-column-start: row-left;
78
+ grid-column-end: row-left;
79
+ grid-row-start: row1;
80
+ grid-row-end: row1;
81
+ width: ${iconWidth};
82
+ height: ${iconWidth};
83
+ `;
84
+
85
+ export const AlertHead = styled.div`
86
+ grid-column-start: row-center;
87
+ grid-column-end: row-center;
88
+ grid-row-start: row1;
89
+ grid-row-end: row1;
90
+ display: flex;
91
+ flex-direction: column;
92
+ justify-content: center;
93
+ span {
94
+ ${fontFamilyStyles}
95
+ color: ${color('primary', 'black')};
96
+ font-weight: 600;
97
+ font-size: 18px;
98
+ line-height: 20px;
99
+ }
100
+ `;
101
+
102
+ export const AlertContent = styled.div<{ type: AlertType }>`
103
+ margin-top: 8px;
104
+ color: ${color('primary', 'black')};
105
+ grid-column-start: ${({ type }) => TypeMap?.[type]?.contentColumnStart};
106
+ grid-column-end: ${({ type }) => TypeMap?.[type]?.contentColumnEnd};
107
+ `;
108
+
109
+ export const AlertFoot = styled.div<{ type: AlertType }>`
110
+ margin-top: 8px;
111
+ color: ${color('primary', 'black')};
112
+ display: ${({ type }) => TypeMap?.[type]?.['footDisplay']};
113
+ ${fontFamilyStyles}
114
+ font-weight: 300;
115
+ font-size: 14px;
116
+ line-height: 18px;
117
+ `;
118
+
119
+ export const AlertBody = styled.div`
120
+ ${fontFamilyStyles}
121
+ font-weight: 300;
122
+ font-size: 16px;
123
+ line-height: 21px;
124
+ `;
@@ -1,6 +1,5 @@
1
- /* eslint-disable react/require-default-props */
2
1
  import React, { useEffect, useState } from 'react';
3
- import {
2
+ import {
4
3
  AlertContainer,
5
4
  Alert,
6
5
  AlertIcon,
@@ -8,146 +7,64 @@ import {
8
7
  AlertCloseButton,
9
8
  AlertContent,
10
9
  AlertFoot,
11
- AlertBody
12
- } from './NsAlert.styled'
13
- import type { NsAlertProps, HeaderProps, ContextType, AlertType } from './types';
10
+ AlertBody,
11
+ } from './NsAlert.styled';
12
+ import type { NsAlertProps, ContextType, AlertType } from './types.d';
14
13
  import { NsIcon } from '../icon';
15
- import { NsIconNameType } from '../icon/types'
16
- import { FoundationTheme } from '@nuskin/foundation-theme/src/themes';
17
-
18
- const Header: React.FC<HeaderProps> = ({ children, head }) => (
19
- <>
20
- {children}
21
- {head}
22
- </>
23
- );
24
-
25
- function isValidContextValue(value: string): boolean {
26
- return (value as ContextType) !== undefined;
27
- }
28
-
29
- function isValidTypeValue(value: string):boolean {
30
- return (value as AlertType) !== undefined;
31
- }
32
-
33
- const colorMap:{ [key: string]: FoundationTheme.PaletteColors } = {
34
- error: 'error',
35
- notice: 'info',
36
- success: 'secondary',
37
- warning: 'warning',
38
- default: 'info',
39
- };
40
-
41
- const iconMap:{ [key: string]: NsIconNameType } = {
42
- error: 'alertError',
43
- success: 'success',
44
- warning: 'warning',
45
- default: 'infoFilled',
46
- };
14
+ import Header, { colorMap, iconMap } from './Header';
15
+ import useWindowSize from '../hooks/useWindowSize';
47
16
 
48
17
  export default function NsAlert({
49
18
  context = 'info',
50
19
  title = 'Information',
51
- threshhold = 600,
20
+ threshold = 600,
52
21
  type = 'banner',
53
22
  visible = false,
54
23
  head,
55
24
  body,
56
25
  foot,
57
- onDismiss = undefined
26
+ onDismiss = undefined,
58
27
  }: NsAlertProps) {
59
28
  const [alertType, setAlertType] = useState('banner');
60
- const [windowWidth, setWindowWidth] = useState(window.innerWidth);
29
+ const windowSize = useWindowSize();
61
30
 
62
31
  const hasDismissListener = typeof onDismiss === 'function';
63
32
 
64
- const getColor = () => {
65
- return colorMap[context] || colorMap.default;
66
- };
67
-
68
- const getIcon = () => {
69
- return iconMap[context] || iconMap.default;
70
- };
71
-
72
- const getTitleText = () => {
73
- if (title) {
74
- return title;
75
- }
76
- };
77
-
78
- const handleDismiss = () => {
79
- if (hasDismissListener) {
80
- onDismiss();
81
- }
82
- };
83
-
84
- const handleResize = () => {
85
- setWindowWidth(window.innerWidth);
86
- };
87
-
88
- useEffect(() => {
89
- let aType = ''
90
- if (type === 'auto') {
91
- aType = windowWidth < threshhold ? 'card' : 'banner';
92
- } else {
93
- aType = type;
94
- }
95
- setAlertType(aType)
96
- }, [threshhold, type, windowWidth])
97
-
98
33
  useEffect(() => {
99
- if (!isValidContextValue(context)) {
34
+ if (!context) {
100
35
  console.error(`Invalid prop value for 'context': ${context}`);
101
36
  }
102
-
103
- if (!isValidTypeValue(type)) {
37
+ if (!type) {
104
38
  console.error(`Invalid prop value for 'type': ${type}`);
105
39
  }
106
- }, [context, type]);
107
-
108
- useEffect(() => {
109
- window.addEventListener('resize', handleResize);
110
- return () => {
111
- window.removeEventListener('resize', handleResize);
112
- };
113
- }, []);
40
+ if (type === 'auto') {
41
+ setAlertType(windowSize.width < threshold ? 'card' : 'banner');
42
+ } else {
43
+ setAlertType(type);
44
+ }
45
+ }, [threshold, type, windowSize.width, context]);
114
46
 
115
47
  return (
116
48
  <AlertContainer visible={visible} data-testid="alert-container">
117
49
  <Alert type={alertType as AlertType} context={context as ContextType}>
118
50
  <AlertIcon>
119
51
  <NsIcon
120
- name={getIcon()}
121
- color={getColor()}
52
+ name={iconMap[context] || iconMap.default}
53
+ color={colorMap[context] || colorMap.default}
122
54
  size="large"
123
55
  />
124
56
  </AlertIcon>
125
57
  <AlertHead>
126
- <Header head={<span>{getTitleText()}</span>}>
127
- {head}
128
- </Header>
58
+ <Header head={<span>{title}</span>}>{head}</Header>
129
59
  </AlertHead>
130
- {
131
- hasDismissListener ? (
132
- <AlertCloseButton data-testid="alert-close-button" onClick={handleDismiss}>
133
- <NsIcon
134
- name='close'
135
- size='small'
136
- />
137
- </AlertCloseButton>
138
- ) : null
139
- }
60
+ {hasDismissListener && (
61
+ <AlertCloseButton data-testid="alert-close-button" onClick={onDismiss}>
62
+ <NsIcon name="close" size="small" />
63
+ </AlertCloseButton>
64
+ )}
140
65
  <AlertContent type={alertType as AlertType}>
141
- <AlertBody>
142
- {body}
143
- </AlertBody>
144
- {
145
- foot ? (
146
- <AlertFoot type={alertType as AlertType}>
147
- {foot}
148
- </AlertFoot>
149
- ) : null
150
- }
66
+ <AlertBody>{body}</AlertBody>
67
+ {foot ? <AlertFoot type={alertType as AlertType}>{foot}</AlertFoot> : null}
151
68
  </AlertContent>
152
69
  </Alert>
153
70
  </AlertContainer>
@@ -1,2 +1,2 @@
1
- export { default as NsAlert} from './NsAlert';
2
- export type { NsAlertProps } from './types';
1
+ export { default as NsAlert } from './NsAlert';
2
+ export type { NsAlertProps } from './types.d';
@@ -1,15 +1,15 @@
1
1
  import { ReactNode, CSSProperties } from 'react';
2
2
 
3
3
  export interface NsAlertProps {
4
- context?: string,
5
- title?: string,
6
- threshhold?: number,
7
- type?: string,
8
- visible?: boolean,
9
- head?: ReactNode,
10
- body?: ReactNode,
11
- onDismiss?: () => void,
12
- foot?: ReactNode
4
+ context?: string;
5
+ title?: string;
6
+ threshold?: number;
7
+ type?: string;
8
+ visible?: boolean;
9
+ head?: ReactNode;
10
+ body?: ReactNode;
11
+ onDismiss?: () => void;
12
+ foot?: ReactNode;
13
13
  }
14
14
 
15
15
  export interface HeaderProps {
@@ -18,28 +18,28 @@ export interface HeaderProps {
18
18
  }
19
19
 
20
20
  export type AlertContainerParams = {
21
- visible: boolean
21
+ visible: boolean;
22
22
  };
23
23
 
24
- export type ContextType = 'error' | 'info' | 'notice'| 'success' | 'warning';
24
+ export type ContextType = 'error' | 'info' | 'notice' | 'success' | 'warning';
25
25
  export type AlertType = 'auto' | 'banner' | 'card';
26
26
 
27
27
  export type AlertParams = {
28
- context: ContextType,
29
- type: AlertType
30
- }
28
+ context: ContextType;
29
+ type: AlertType;
30
+ };
31
31
 
32
32
  export type CustomCSSProperties = CSSProperties & {
33
- 'min-height'?: string;
34
- 'content-column-start'? : string;
35
- 'content-column-end'? : string;
36
- 'bar-position'? : string;
37
- 'foot-visibility'? : string;
38
- 'foot-display'? : string;
33
+ minHeight?: string;
34
+ contentColumnStart?: string;
35
+ contentColumnEnd?: string;
36
+ barPosition?: string;
37
+ footVisibility?: string;
38
+ footDisplay?: string;
39
39
  };
40
40
 
41
41
  export interface TypeMapCSS {
42
- banner: CustomCSSProperties,
43
- card: CustomCSSProperties,
44
- auto?: CustomCSSProperties
42
+ banner: CustomCSSProperties;
43
+ card: CustomCSSProperties;
44
+ auto?: CustomCSSProperties;
45
45
  }
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { render, fireEvent, screen } from '../../../test-utils';
2
+ import { render, fireEvent, screen } from '@/test-utils/index';
3
3
  import { NsAuthDropdown } from './';
4
4
 
5
5
  describe('NsAuthDropdown', () => {
@@ -10,27 +10,45 @@ describe('NsAuthDropdown', () => {
10
10
  signUpLinkText: 'Sign Up',
11
11
  signUpLinkPrefixText: 'Do not have an account?',
12
12
  titleText: 'Welcome',
13
- closeOnMouseLeave: false,
14
13
  };
15
14
 
16
- it('should render component with title text', () => {
15
+ it('1. should render component with title text', () => {
17
16
  render(<NsAuthDropdown {...props} />);
18
17
  expect(screen.getByText('Welcome')).toBeInTheDocument();
19
18
  });
20
19
 
21
- it('should render the sign in button with text', () => {
20
+ it('2. should render the sign in button with text', () => {
22
21
  render(<NsAuthDropdown {...props} />);
23
22
  const authHead = screen.getByTestId('auth-head');
24
23
  fireEvent.click(authHead);
25
24
  expect(screen.getByTestId('sign-in-btn')).toBeInTheDocument();
26
- expect(screen.getByTestId('sign-in-btn')).toHaveTextContent('Sign In');
25
+ expect(screen.getByTestId('sign-in-btn')).toHaveTextContent(props.signInBtnText);
26
+ expect(screen.getByTestId('signup-link')).toHaveTextContent(props.signUpLinkText);
27
27
  });
28
28
 
29
- it('should have the correct href attribute in SignUpLink', () => {
29
+ it('3. should have the correct href attribute in SignUpLink', () => {
30
30
  render(<NsAuthDropdown {...props} />);
31
31
  const authHead = screen.getByTestId('auth-head');
32
32
  fireEvent.click(authHead);
33
33
  const signUpLink = screen.getByTestId('signup-link');
34
34
  expect(signUpLink).toHaveAttribute('href', '/signUp');
35
35
  });
36
+ it('4. should close dropdown on mouse leave', () => {
37
+ const { container } = render(<NsAuthDropdown {...props} closeOnMouseLeave={true} />);
38
+ const authHead = screen.getByTestId('auth-head');
39
+ fireEvent.click(authHead);
40
+ expect(screen.getByTestId('sign-in-btn')).toHaveTextContent('Sign In');
41
+ const wrapper = container.querySelector('.auth-wrapper');
42
+ if (wrapper) fireEvent.mouseLeave(wrapper);
43
+ expect(container.querySelector('.auth-wrapper')).toBeNull();
44
+ });
45
+ it('5. should not close dropdown on mouse leave', () => {
46
+ const { container } = render(<NsAuthDropdown {...props} closeOnMouseLeave={false} />);
47
+ const authHead = screen.getByTestId('auth-head');
48
+ fireEvent.click(authHead);
49
+ expect(screen.getByTestId('sign-in-btn')).toHaveTextContent('Sign In');
50
+ const wrapper = container.querySelector('.auth-wrapper');
51
+ if (wrapper) fireEvent.mouseLeave(wrapper);
52
+ expect(container.querySelector('.auth-wrapper')).not.toBeNull();
53
+ });
36
54
  });
@@ -1,13 +1,13 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react';
2
2
  import { NsAuthDropdown } from './';
3
- import { withCenterDecorator } from '../../stories/decorators/withCenterDecorator';
3
+ import { withCenterDecorator } from '@/stories/decorators/withCenterDecorator';
4
4
 
5
5
  type ComponentType = typeof NsAuthDropdown;
6
6
  type Story = StoryObj<ComponentType>;
7
7
  type MetaStory = Meta<ComponentType>;
8
8
 
9
9
  export default {
10
- title: 'Components/NsAuthDropdown',
10
+ title: 'Components/Data Display/NsAuthDropdown',
11
11
  component: NsAuthDropdown,
12
12
  decorators: [withCenterDecorator],
13
13
  argTypes: {},
@@ -1,8 +1,11 @@
1
1
  import { styled, ColorUtils } from '@nuskin/foundation-theme';
2
- import { getAppColor } from '@nuskin/foundation-theme/src/utils/color-utils';
3
- const { getPaletteColor } = ColorUtils;
2
+ import { DarkModeEnabledOption } from '../common.types';
3
+ import { skipDarkModeEnabled } from '../util';
4
4
 
5
- const MAGENTA_COLOR = '#bb29bb';
5
+ //[TODO-Arun] - Use from custom color variables
6
+ // const MAGENTA_COLOR = '#bb29bb';
7
+
8
+ const { color, paletteColor } = ColorUtils;
6
9
 
7
10
  export const AuthDropdownContainer = styled.div`
8
11
  position: relative;
@@ -19,7 +22,7 @@ export const AuthDropdown = styled.div`
19
22
  z-index: 600;
20
23
  top: calc(100% + 18px);
21
24
  right: 5%;
22
- box-shadow: 0 0 5px 0 ${({ theme }) => getAppColor(theme, 'neutral', '20')};
25
+ box-shadow: 0 0 5px 0 ${color('neutral', '20')};
23
26
  transition: all 0.15s ease-in-out;
24
27
  padding: 25px;
25
28
  `;
@@ -39,21 +42,23 @@ export const Triangle = styled.div`
39
42
  position: absolute;
40
43
  width: 14px;
41
44
  height: 14px;
42
- background-color: ${({ theme }) => getAppColor(theme, 'primary', 'white')};
45
+ background-color: ${color('primary', 'white')};
43
46
  transform: rotate(45deg);
44
47
  top: 17px;
45
48
  left: 5px;
46
- box-shadow: 0 0 5px 0 ${({ theme }) => getAppColor(theme, 'neutral', '20')};
49
+ box-shadow: 0 0 5px 0 ${color('neutral', '20')};
47
50
  }
48
51
  `;
49
-
50
- export const AuthHead = styled.div`
52
+ const options = {
53
+ shouldForwardProp: skipDarkModeEnabled,
54
+ };
55
+ export const AuthHead = styled('div', options)<DarkModeEnabledOption>`
51
56
  cursor: pointer;
52
57
  padding: 5px 10px;
53
58
  display: flex;
54
59
  justify-content: space-between;
55
60
  align-items: center;
56
- color: ${({ theme }) => getPaletteColor(theme, 'primary')};
61
+ color: ${paletteColor('primary')};
57
62
  `;
58
63
 
59
64
  export const Button = styled.div`
@@ -68,18 +73,18 @@ export const SignInButton = styled(Link)`
68
73
  display: block;
69
74
  padding: 13px;
70
75
  width: 100%;
71
- background-color: ${MAGENTA_COLOR};
72
- color: ${({ theme }) => getAppColor(theme, 'primary', 'white')};
76
+ background-color: ${color('primary', 'black')};
77
+ color: ${color('primary', 'white')};
73
78
  border: 0;
74
79
  font-size: 16px;
75
80
  &:hover {
76
- background-color: ${({ theme }) => getAppColor(theme, 'neutral', '70')};
81
+ background-color: ${color('neutral', '70')};
77
82
  }
78
83
  `;
79
84
 
80
85
  export const SignUpLinkContainer = styled.div`
81
86
  margin-top: 15px;
82
- color: ${({ theme }) => getAppColor(theme, 'primary', 'main')};
87
+ color: ${color('primary', 'black')};
83
88
  font-size: 13px;
84
89
  line-height: 16px;
85
90
  text-align: left;
@@ -91,11 +96,11 @@ export const SignUpLink = styled(Link)`
91
96
  font-size: 13px;
92
97
  line-height: 16px;
93
98
  text-decoration: none;
94
- color: ${MAGENTA_COLOR};
99
+ color: ${color('primary', 'black')};
95
100
  position: relative;
96
101
  transition: all 0.15s ease-in-out;
97
102
  &:hover {
98
- color: ${({ theme }) => getAppColor(theme, 'neutral', '70')};
103
+ color: ${color('neutral', '70')};
99
104
  font-size: 14px;
100
105
  }
101
106
  &:hover::after {
@@ -110,7 +115,7 @@ export const SignUpLink = styled(Link)`
110
115
  right: 0;
111
116
  width: 100%;
112
117
  height: 1px;
113
- background-color: ${MAGENTA_COLOR};
118
+ background-color: ${color('primary', 'black')};
114
119
  transition: all 0.15s ease-in-out;
115
120
  opacity: 0;
116
121
  visibility: hidden;
@@ -1,4 +1,4 @@
1
- import { useState } from 'react';
1
+ import { useCallback, useState } from 'react';
2
2
  import { NsIcon } from '../icon';
3
3
  import {
4
4
  AuthDropdownContainer,
@@ -10,7 +10,7 @@ import {
10
10
  SignUpLinkContainer,
11
11
  SignUpLink,
12
12
  } from './NsAuthDropdown.styled';
13
- import { NsAuthDropdownProps } from './types';
13
+ import { NsAuthDropdownProps } from './types.d';
14
14
 
15
15
  const NsAuthDropdown = ({
16
16
  signInRedirectLink,
@@ -20,6 +20,7 @@ const NsAuthDropdown = ({
20
20
  signUpLinkPrefixText,
21
21
  titleText,
22
22
  closeOnMouseLeave = false,
23
+ darkModeEnabled = true,
23
24
  }: NsAuthDropdownProps) => {
24
25
  const [isOpen, setIsOpen] = useState(false);
25
26
 
@@ -27,19 +28,19 @@ const NsAuthDropdown = ({
27
28
  setIsOpen((prevIsOpen) => !prevIsOpen);
28
29
  };
29
30
 
30
- const closeDropdown = () => {
31
+ const closeDropdown = useCallback(() => {
31
32
  if (closeOnMouseLeave) {
32
33
  setIsOpen(false);
33
34
  }
34
- };
35
+ }, [closeOnMouseLeave]);
35
36
 
36
37
  return (
37
38
  <AuthDropdownContainer>
38
- <AuthHead data-testid="auth-head" onClick={handleToggle}>
39
+ <AuthHead data-testid="auth-head" onClick={handleToggle} darkModeEnabled={darkModeEnabled}>
39
40
  <Button>{titleText}</Button>
40
41
  <NsIcon testId="chevron-icon" name={isOpen ? 'arrowUp' : 'arrowDown'} color="primary" />
41
42
  {isOpen ? (
42
- <div onMouseLeave={closeDropdown}>
43
+ <div onMouseLeave={closeDropdown} className="auth-wrapper">
43
44
  <Triangle />
44
45
  <AuthDropdown>
45
46
  <SignInButton href={signInRedirectLink} data-testid="sign-in-btn">
@@ -1,2 +1,2 @@
1
1
  export { default as NsAuthDropdown } from './NsAuthDropdown';
2
- export type { NsAuthDropdownProps } from './types';
2
+ export type { NsAuthDropdownProps } from './types.d';
@@ -1,3 +1,5 @@
1
+ import { AdditionalProps } from '../common.types';
2
+
1
3
  export type NsAuthDropdownProps = {
2
4
  signInRedirectLink: string;
3
5
  signUpRedirectLink: string;
@@ -6,4 +8,4 @@ export type NsAuthDropdownProps = {
6
8
  signUpLinkPrefixText: string;
7
9
  titleText: string;
8
10
  closeOnMouseLeave?: boolean;
9
- };
11
+ } & AdditionalProps;