@nuskin/foundation-ui-components 1.0.0-develop.1 → 1.0.0-develop.11

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 (250) 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 +117 -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 +18 -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 +6 -17
  80. package/src/common/cart-icon/NsCartIcon.stories.tsx +3 -3
  81. package/src/common/cart-icon/NsCartIcon.styled.ts +7 -33
  82. package/src/common/cart-icon/NsCartIcon.tsx +6 -15
  83. package/src/common/cart-icon/index.ts +1 -1
  84. package/src/common/cart-icon/types.d.ts +1 -0
  85. package/src/common/checkbox/NsCheckbox.spec.tsx +2 -2
  86. package/src/common/checkbox/NsCheckbox.stories.tsx +2 -2
  87. package/src/common/checkbox/NsCheckbox.styled.tsx +15 -16
  88. package/src/common/checkbox/NsCheckbox.tsx +2 -2
  89. package/src/common/checkbox/index.ts +1 -1
  90. package/src/common/checkbox/types.d.ts +1 -7
  91. package/src/common/column-control/NsColumnControl.tsx +1 -1
  92. package/src/common/column-control/NsFlexColumns.tsx +22 -0
  93. package/src/common/column-control/NsGridColumns.tsx +22 -0
  94. package/src/common/column-control/index.ts +3 -1
  95. package/src/common/column-control/{NsColumnControl.spec.tsx → specs/NsColumnControl.spec.tsx} +3 -3
  96. package/src/common/column-control/specs/NsFlexColumns.spec.tsx +24 -0
  97. package/src/common/column-control/specs/NsGridColumns.spec.tsx +24 -0
  98. package/src/common/column-control/stories/DivArray.stories.tsx +18 -0
  99. package/src/common/column-control/stories/DivArray.tsx +63 -0
  100. package/src/common/column-control/{NsColumnControl.stories.tsx → stories/NsColumnControl.stories.tsx} +9 -16
  101. package/src/common/column-control/stories/NsFlexColumns.stories.tsx +63 -0
  102. package/src/common/column-control/stories/NsGridColumns.stories.tsx +63 -0
  103. package/src/common/column-control/stories/common.tsx +14 -0
  104. package/src/common/column-control/styled/StyledFlex.tsx +45 -0
  105. package/src/common/column-control/styled/StyledGrid.tsx +40 -0
  106. package/src/common/column-control/styled/common.ts +27 -0
  107. package/src/common/column-control/types.d.ts +15 -16
  108. package/src/common/column-control/utils.ts +5 -5
  109. package/src/common/common.types.d.ts +21 -0
  110. package/src/common/dropdown/NsDropdown.spec.tsx +1 -1
  111. package/src/common/dropdown/NsDropdown.styled.tsx +23 -18
  112. package/src/common/dropdown/NsDropdown.tsx +1 -1
  113. package/src/common/dropdown/NsDropdownOption.tsx +1 -1
  114. package/src/common/dropdown/index.ts +1 -1
  115. package/src/common/dropdown/stories/NsDropdown.stories.tsx +2 -2
  116. package/src/common/dropdown/stories/NsDropdownCountry.stories.tsx +2 -2
  117. package/src/common/dropdown/types.d.ts +3 -1
  118. package/src/common/email-simple/NsEmailSimple.spec.tsx +145 -0
  119. package/src/common/email-simple/NsEmailSimple.stories.tsx +61 -0
  120. package/src/common/email-simple/NsEmailSimple.tsx +71 -0
  121. package/src/common/email-simple/index.ts +2 -0
  122. package/src/common/email-simple/types.d.ts +14 -0
  123. package/src/common/flag/NsFlag.spec.tsx +5 -25
  124. package/src/common/flag/NsFlag.stories.tsx +2 -2
  125. package/src/common/flag/NsFlag.styled.tsx +7 -9
  126. package/src/common/flag/NsFlag.tsx +1 -3
  127. package/src/common/flag/index.ts +1 -1
  128. package/src/common/flag/types.d.ts +0 -2
  129. package/src/common/hooks/index.ts +2 -0
  130. package/src/common/hooks/specs/useWindowSize.spec.tsx +19 -0
  131. package/src/common/hooks/useAccordionMap.tsx +39 -0
  132. package/src/common/hooks/useWindowSize.tsx +30 -0
  133. package/src/common/icon/NsIcon.spec.tsx +1 -1
  134. package/src/common/icon/NsIcon.stories.tsx +2 -2
  135. package/src/common/icon/NsIcon.styled.tsx +1 -1
  136. package/src/common/icon/NsIcon.tsx +1 -1
  137. package/src/common/icon/NsIconVariants.ts +9 -4
  138. package/src/common/icon/icons/AlertErrorIcon.tsx +15 -6
  139. package/src/common/icon/icons/Cart.tsx +7 -32
  140. package/src/common/icon/icons/HamburgerIcon.tsx +29 -0
  141. package/src/common/icon/icons/UserIcon.tsx +30 -0
  142. package/src/common/icon/icons/WarningIcon.tsx +14 -5
  143. package/src/common/icon/index.ts +1 -1
  144. package/src/common/icon/types.d.ts +1 -0
  145. package/src/common/image/NsImage.spec.tsx +57 -7
  146. package/src/common/image/NsImage.stories.tsx +2 -2
  147. package/src/common/image/NsImage.tsx +24 -12
  148. package/src/common/image/NsNextImage.spec.tsx +1 -1
  149. package/src/common/image/NsNextImage.stories.tsx +2 -2
  150. package/src/common/image/NsNextImage.tsx +1 -1
  151. package/src/common/image/index.ts +1 -1
  152. package/src/common/image/types.d.ts +1 -0
  153. package/src/common/index.ts +14 -10
  154. package/src/common/input/InputFieldWrapper.tsx +4 -4
  155. package/src/common/input/InputWrapper.tsx +12 -7
  156. package/src/common/input/NsInputField.stories.tsx +13 -10
  157. package/src/common/input/NsInputField.tsx +13 -6
  158. package/src/common/input/getAdornmentProps.tsx +5 -1
  159. package/src/common/input/index.ts +1 -1
  160. package/src/common/input/types.d.ts +18 -1
  161. package/src/common/label/NsLabel.stories.tsx +6 -1
  162. package/src/common/label/NsLabel.tsx +21 -20
  163. package/src/common/label/index.ts +1 -1
  164. package/src/common/label/types.d.ts +2 -1
  165. package/src/common/link/NsLink.spec.tsx +1 -1
  166. package/src/common/link/NsLink.stories.tsx +2 -2
  167. package/src/common/link/NsLink.tsx +1 -1
  168. package/src/common/link/index.ts +1 -1
  169. package/src/common/modal/NsModal.spec.tsx +46 -0
  170. package/src/common/modal/NsModal.styled.tsx +28 -0
  171. package/src/common/modal/NsModal.tsx +37 -0
  172. package/src/common/modal/helper-component/NsModalContentBox.tsx +32 -0
  173. package/src/common/modal/helper-component/NsModalDefault.tsx +25 -0
  174. package/src/common/modal/helper-component/NsModalStatus.tsx +15 -0
  175. package/src/common/modal/helper-component/NsModalStatusIcon.tsx +14 -0
  176. package/src/common/modal/helper-component/NsModalTitle.tsx +26 -0
  177. package/src/common/modal/index.ts +2 -0
  178. package/src/common/modal/model/NsModalVariantMap.tsx +24 -0
  179. package/src/common/modal/stories/NsModal.stories.tsx +86 -0
  180. package/src/common/modal/stories/mock.tsx +46 -0
  181. package/src/common/modal/types.ts +56 -0
  182. package/src/common/nav-product-card/NsNavProductCard.spec.tsx +1 -1
  183. package/src/common/nav-product-card/NsNavProductCard.stories.tsx +2 -2
  184. package/src/common/nav-product-card/NsNavProductCard.tsx +1 -1
  185. package/src/common/nav-product-card/index.ts +1 -1
  186. package/src/common/nav-tab/NsNavTab.spec.tsx +2 -7
  187. package/src/common/nav-tab/NsNavTab.stories.tsx +2 -2
  188. package/src/common/nav-tab/NsNavTab.styled.tsx +7 -4
  189. package/src/common/nav-tab/NsNavTab.tsx +1 -1
  190. package/src/common/nav-tab/index.ts +1 -1
  191. package/src/common/nav-tab/types.d.ts +2 -2
  192. package/src/common/radiogroup/NsRadioGroup.spec.tsx +63 -0
  193. package/src/common/radiogroup/NsRadioGroup.stories.tsx +84 -0
  194. package/src/common/radiogroup/NsRadioGroup.styled.tsx +52 -0
  195. package/src/common/radiogroup/NsRadioGroup.tsx +62 -0
  196. package/src/common/radiogroup/index.ts +2 -0
  197. package/src/common/radiogroup/types.d.ts +20 -0
  198. package/src/common/search-bar/NsSeachBar.spec.tsx +1 -1
  199. package/src/common/search-bar/NsSearchBar.tsx +1 -3
  200. package/src/common/select/NsSelect.spec.tsx +193 -0
  201. package/src/common/select/NsSelect.styled.tsx +104 -0
  202. package/src/common/select/NsSelect.tsx +117 -0
  203. package/src/common/select/NsSelectOption.tsx +30 -0
  204. package/src/common/select/index.ts +3 -0
  205. package/src/common/select/stories/NsSelect.stories.tsx +134 -0
  206. package/src/common/select/types.d.ts +34 -0
  207. package/src/common/spinner/NsSpinner.spec.tsx +21 -0
  208. package/src/common/spinner/NsSpinner.stories.tsx +26 -0
  209. package/src/common/spinner/NsSpinner.styled.tsx +344 -0
  210. package/src/common/spinner/NsSpinner.tsx +14 -0
  211. package/src/common/spinner/icons/Spinner.tsx +161 -0
  212. package/src/common/spinner/index.ts +2 -0
  213. package/src/common/spinner/types.ts +5 -0
  214. package/src/common/table/NsExpandableRow.tsx +68 -0
  215. package/src/common/table/NsTable.spec.tsx +174 -0
  216. package/src/common/table/NsTable.stories.tsx +161 -0
  217. package/src/common/table/NsTable.styled.ts +127 -0
  218. package/src/common/table/NsTable.tsx +133 -0
  219. package/src/common/table/NsTableHeader.tsx +41 -0
  220. package/src/common/table/NsTablePagination.tsx +28 -0
  221. package/src/common/table/helper.ts +33 -0
  222. package/src/common/table/index.ts +2 -0
  223. package/src/common/table/types.d.ts +57 -0
  224. package/src/common/text-strip/NsTextStrip.spec.tsx +30 -0
  225. package/src/common/text-strip/NsTextStrip.stories.tsx +33 -0
  226. package/src/common/text-strip/NsTextStrip.tsx +47 -0
  227. package/src/common/text-strip/index.ts +2 -0
  228. package/src/common/text-strip/types.d.ts +17 -0
  229. package/src/common/typography/NsTypography.stories.tsx +2 -2
  230. package/src/common/typography/NsTypography.tsx +1 -1
  231. package/src/common/typography/Typography.styled.tsx +4 -4
  232. package/src/common/typography/index.ts +1 -1
  233. package/src/common/util.ts +1 -0
  234. package/src/common/utility/Show.tsx +13 -0
  235. package/src/common/utility/index.ts +1 -0
  236. package/src/common/validations/regex.ts +3 -0
  237. package/src/common/videos/NsVideo.stories.tsx +2 -2
  238. package/src/common/videos/NsVideo.tsx +1 -1
  239. package/src/common/videos/index.ts +1 -1
  240. package/src/common/videos/types.d.ts +1 -1
  241. package/src/common/alert/NsAlert.styled.ts +0 -124
  242. package/src/common/card/tests/NsFfgCard.spec.tsx +0 -23
  243. package/src/common/column-control/NDivs.story.tsx +0 -35
  244. package/src/common/common.types.ts +0 -10
  245. /package/src/common/brand-components/{NsBrandContanier.styled.tsx → NsBrandContainer.styled.tsx} +0 -0
  246. /package/src/common/card/{tests → specs}/BrandLogo.spec.tsx +0 -0
  247. /package/src/common/card/{tests → specs}/NsBgCard.spec.tsx +0 -0
  248. /package/src/common/card/{tests → specs}/NsBrandProductCard.spec.tsx +0 -0
  249. /package/src/common/carousal/{tests → specs}/Chevron.spec.tsx +0 -0
  250. /package/src/common/carousal/{tests → specs}/RenderBrand.spec.tsx +0 -0
@@ -1,5 +1,5 @@
1
1
  import type { StoryObj, Meta } from '@storybook/react';
2
- import { withCenterDecorator } from '../../stories/decorators/withCenterDecorator';
2
+ import { withCenterDecorator } from '@/stories/decorators/withCenterDecorator';
3
3
  import { NsImage } from './';
4
4
 
5
5
  type ComponentType = typeof NsImage;
@@ -7,7 +7,7 @@ type Story = StoryObj<ComponentType>;
7
7
  type MetaStory = Meta<ComponentType>;
8
8
 
9
9
  export default {
10
- title: 'Components/NsImage',
10
+ title: 'Components/Data Display/NsImage',
11
11
  component: NsImage,
12
12
  decorators: [withCenterDecorator],
13
13
  args: {
@@ -1,19 +1,31 @@
1
- import { NsImageProps } from './types';
1
+ import { NsImageProps } from './types.d';
2
2
 
3
3
  // eslint-disable-next-line no-unused-vars
4
4
  const NsImage = ({ src, width, height, alt, variant, ...rest }: NsImageProps) => {
5
- let cHeight: string | number | undefined = height,
6
- cWidth: string | number | undefined = width;
7
- if (variant === 'product') {
8
- (cHeight = 300), (cWidth = 300);
9
- } else if (variant === 'icon') {
10
- (cHeight = 60), (cWidth = 60);
11
- } else if (variant === 'award') {
12
- (cHeight = 130), (cWidth = 130);
13
- } else if (variant === 'fill') {
14
- (cHeight = 'auto'), (cWidth = '100%');
5
+ let cHeight, cWidth;
6
+ switch (variant) {
7
+ case 'product':
8
+ cHeight = 300;
9
+ cWidth = 300;
10
+ break;
11
+ case 'icon':
12
+ cHeight = 60;
13
+ cWidth = 60;
14
+ break;
15
+ case 'award':
16
+ cHeight = 130;
17
+ cWidth = 130;
18
+ break;
19
+ case 'fill':
20
+ cHeight = 'auto';
21
+ cWidth = '100%';
22
+ break;
23
+ default:
24
+ cHeight = height;
25
+ cWidth = width;
26
+ break;
15
27
  }
16
28
  // eslint-disable-next-line @next/next/no-img-element
17
- return <img src={src} alt={alt} height={cHeight} width={cWidth} />;
29
+ return <img src={src} alt={alt} height={cHeight} width={cWidth} {...rest} />;
18
30
  };
19
31
  export default NsImage;
@@ -1,4 +1,4 @@
1
- import { render, screen } from '../../../test-utils';
1
+ import { render, screen } from '@/test-utils/index';
2
2
  import NsNextImage from './NsNextImage';
3
3
  describe('NsNextImage', () => {
4
4
  it('test image element renders', () => {
@@ -1,5 +1,5 @@
1
1
  import { NsNextImage } from '.';
2
- import { withCenterDecorator } from '../../stories/decorators/withCenterDecorator';
2
+ import { withCenterDecorator } from '@/stories/decorators/withCenterDecorator';
3
3
  import type { StoryObj, Meta } from '@storybook/react';
4
4
 
5
5
  type ComponentType = typeof NsNextImage;
@@ -7,7 +7,7 @@ type Story = StoryObj<ComponentType>;
7
7
  type MetaStory = Meta<ComponentType>;
8
8
 
9
9
  export default {
10
- title: 'Components/NsNextImage',
10
+ title: 'Components/Data Display/NsNextImage',
11
11
  component: NsNextImage,
12
12
  decorators: [withCenterDecorator],
13
13
  } as MetaStory;
@@ -1,4 +1,4 @@
1
- import { NsNextImageProps } from './types';
1
+ import { NsNextImageProps } from './types.d';
2
2
  import Image from 'next/image';
3
3
 
4
4
  const NsNextImage = ({ src, width, height, alt, fill, priority, ...props }: NsNextImageProps) => {
@@ -1,3 +1,3 @@
1
1
  export { default as NsNextImage } from './NsNextImage';
2
- export type { NsImageProps, NsNextImageProps } from './types';
2
+ export type { NsImageProps, NsNextImageProps } from './types.d';
3
3
  export { default as NsImage } from './NsImage';
@@ -15,6 +15,7 @@ export type NsNextImageProps = Pick<
15
15
  | 'blurDataURL'
16
16
  | 'fill'
17
17
  | 'unoptimized'
18
+ | 'loader'
18
19
  > & { id?: string; className?: string };
19
20
 
20
21
  export type NsImageProps = {
@@ -1,4 +1,7 @@
1
+ export * from './accordion';
2
+ export * from './alert';
1
3
  export * from './auth-dropdown';
4
+ export * from './autocomplete';
2
5
  export * from './banner';
3
6
  export * from './breadcrumb';
4
7
  export * from './brand-components';
@@ -8,21 +11,22 @@ export * from './carousal';
8
11
  export * from './cart-icon';
9
12
  export * from './column-control';
10
13
  export * from './checkbox';
14
+ export * from './common.types.d';
11
15
  export * from './dropdown';
16
+ export * from './email-simple';
12
17
  export * from './flag';
18
+ export * from './hooks';
13
19
  export * from './icon';
14
- export * from './input';
15
20
  export * from './image';
16
- export * from './link';
21
+ export * from './input';
17
22
  export * from './label';
18
- export * from './autocomplete';
19
-
20
- /* Dropdown Components */
21
- export * from './dropdown';
22
- export * from './auth-dropdown';
23
- export * from './alert';
23
+ export * from './link';
24
+ export * from './modal';
24
25
  export * from './nav-tab';
25
26
  export * from './nav-product-card';
27
+ export * from './radiogroup';
28
+ export * from './spinner';
29
+ export * from './text-strip';
30
+ export * from './table';
26
31
  export * from './typography';
27
-
28
- export * from './common.types';
32
+ export * from './utility';
@@ -1,6 +1,6 @@
1
1
  import { Stack } from '@mui/material';
2
2
  import { styled, ColorUtils } from '@nuskin/foundation-theme';
3
- const { getPaletteColor, getAppColor } = ColorUtils;
3
+ const { color, paletteColor } = ColorUtils;
4
4
 
5
5
  const InputFieldWrapper = styled(Stack)(({ theme }: any) => {
6
6
  return {
@@ -10,12 +10,12 @@ const InputFieldWrapper = styled(Stack)(({ theme }: any) => {
10
10
  '.MuiFormHelperText-root': {
11
11
  fontSize: '11px',
12
12
  marginTop: 0,
13
- color: getPaletteColor(theme, 'primary', 'main'),
13
+ color: paletteColor('primary', 'main')({ theme }),
14
14
  '&.success': {
15
- color: getAppColor(theme, 'success', '40') as string,
15
+ color: color('success', '40')({ theme }),
16
16
  },
17
17
  '&.error': {
18
- color: getPaletteColor(theme, 'error', 'main'),
18
+ color: paletteColor('error', 'main')({ theme }),
19
19
  },
20
20
  },
21
21
  };
@@ -1,20 +1,25 @@
1
1
  import { Box } from '@mui/material';
2
- import { styled, nuskinTheme } from '@nuskin/foundation-theme';
3
- import { fieldStateType } from './types';
2
+ import { styled, nuskinTheme, ColorUtils, FoundationTheme } from '@nuskin/foundation-theme';
3
+ import {fieldStateType} from './types.d';
4
4
 
5
+ const { isDarkMode } = ColorUtils;
5
6
  const { colors } = nuskinTheme;
6
7
 
7
8
  const options = {
8
9
  shouldForwardProp: (propKey: string) => propKey !== 'fieldState',
9
10
  };
10
11
 
11
- const getInputBorderColor = (palette: any, fieldState: fieldStateType, isLight = true): string => {
12
+ const getInputBorderColor = (
13
+ palette: FoundationTheme.Theme['palette'],
14
+ fieldState: fieldStateType,
15
+ isLight = true
16
+ ): string => {
12
17
  if (fieldState === 'success') {
13
- return isLight ? colors.success[40] : colors.success[40];
18
+ return colors.success[40];
14
19
  } else if (fieldState === 'error') {
15
20
  return isLight ? colors.red[40] : colors.red[20];
16
21
  } else {
17
- return palette.primary.main;
22
+ return palette?.primary.main ?? '';
18
23
  }
19
24
  };
20
25
 
@@ -28,7 +33,7 @@ const InputWrapper = styled(
28
33
  )<InputWrapperType>(({ theme, fieldState }) => {
29
34
  /* default value added so that unit tests do not fail */
30
35
  const { palette = { primary: { main: '', contrastText: '' } } } = theme;
31
- const isLight = palette.primary.main === colors.primary.black;
36
+ const isLight = isDarkMode({ theme });
32
37
  const inputFocusedBorder = isLight ? colors.accentColorB[20] : colors.accentColorB[30];
33
38
  const inputDisabledBg = isLight ? colors.neutral[30] : colors.neutral[70];
34
39
  const inputDisabledBorder = isLight ? colors.neutral[60] : colors.neutral[80];
@@ -56,7 +61,7 @@ const InputWrapper = styled(
56
61
  },
57
62
  },
58
63
  fieldset: {
59
- border: `1px solid ${getInputBorderColor(palette as any, fieldState, isLight)}`,
64
+ border: `1px solid ${getInputBorderColor(palette, fieldState, isLight)}`,
60
65
  },
61
66
  input: {
62
67
  color: palette.primary.main,
@@ -1,37 +1,40 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react';
2
2
  import { NsInputField } from '.';
3
3
  import { NsIcon } from '../icon';
4
+ import { withCenterDecorator } from '@/stories/decorators/withCenterDecorator';
4
5
 
5
6
  type ComponentType = typeof NsInputField;
6
7
  type Story = StoryObj<ComponentType>;
7
8
  type MetaStory = Meta<ComponentType>;
8
9
 
9
10
  export default {
10
- title: 'Components/NsInputField',
11
+ title: 'Components/Inputs/NsInputField',
11
12
  component: NsInputField,
12
- decorators: [(story) => <div style={{ margin: '20px' }}>{story()}</div>],
13
-
14
- args: {},
13
+ decorators: [withCenterDecorator],
14
+ args: {
15
+ helperText: '',
16
+ iconSide: <NsIcon name="trash" />,
17
+ focused: false,
18
+ placeholder: 'enter text',
19
+ disabled: false,
20
+ fullWidth: false,
21
+ },
15
22
  argTypes: {
16
23
  fieldState: { control: 'select', options: ['default', 'success', 'error'] },
17
24
  value: { control: 'text' },
25
+ helperText: { control: 'text', description: 'text shown below input' },
18
26
  required: { control: 'boolean' },
19
27
  disabled: { control: 'boolean' },
20
28
  fullWidth: { control: 'boolean' },
21
- showOptional: { control: 'boolean' },
29
+ showOptional: { control: 'boolean', description: 'if true, an optional text is shown along with label' },
22
30
  focused: { control: 'boolean' },
23
31
  },
24
32
  } as MetaStory;
25
33
 
26
34
  export const Default: Story = {
27
35
  args: {
28
- focused: false,
29
- placeholder: 'enter text',
30
- disabled: false,
31
- fullWidth: false,
32
36
  value: 'Input value',
33
37
  fieldState: 'success',
34
- iconSide: <NsIcon name="trash" />,
35
38
  },
36
39
  };
37
40
 
@@ -1,9 +1,9 @@
1
1
  import { TextField, FormHelperText } from '@mui/material';
2
2
  import InputWrapper from './InputWrapper';
3
- import { NsInputFieldProps } from './types';
3
+ import { NsInputFieldProps } from './types.d';
4
4
  import { NsLabel } from '../label';
5
5
  import InputFieldWrapper from './InputFieldWrapper';
6
- import { getAdornmentProps } from './getAdornmentProps';
6
+ import { AdornmentPropsType, getAdornmentProps } from './getAdornmentProps';
7
7
 
8
8
  /**
9
9
  * we are using fieldState in place of error prop
@@ -14,6 +14,7 @@ const NsInputField = (props: NsInputFieldProps) => {
14
14
  const {
15
15
  autoComplete,
16
16
  autoFocus,
17
+ additionalProps,
17
18
  defaultValue,
18
19
  disabled,
19
20
  fullWidth,
@@ -54,16 +55,22 @@ const NsInputField = (props: NsInputFieldProps) => {
54
55
  } = props;
55
56
  /** EndIcon is created so that we can automatically add success and error icon based of fieldState,
56
57
  * it will override iconEnd. Also to note, InputProps is given to override both iconStart, iconEnd and EndIcon */
57
- let EndIcon: any = getAdornmentProps({ disabled, fieldState, iconEnd, iconStart });
58
+ const EndIcon: AdornmentPropsType = getAdornmentProps({ disabled, fieldState, iconEnd, iconStart });
58
59
 
59
60
  return (
60
61
  <InputFieldWrapper>
61
62
  {label ? (
62
- <NsLabel {...InputLabelProps} showOptional={showOptional} required={required} disabled={disabled}>
63
+ <NsLabel
64
+ {...InputLabelProps}
65
+ showOptional={showOptional}
66
+ required={required}
67
+ disabled={disabled}
68
+ error={fieldState === 'error' && !disabled}
69
+ >
63
70
  {label}
64
71
  </NsLabel>
65
72
  ) : null}
66
- <InputWrapper fieldState={fieldState} data-testid="ns-input-field">
73
+ <InputWrapper fieldState={fieldState} data-testid={additionalProps?.testid ?? 'ns-input-field'}>
67
74
  <TextField
68
75
  {...rest}
69
76
  InputProps={{
@@ -97,7 +104,7 @@ const NsInputField = (props: NsInputFieldProps) => {
97
104
  />
98
105
  {iconSide}
99
106
  </InputWrapper>
100
- {helperText ? (
107
+ {helperText && !disabled ? (
101
108
  <FormHelperText {...FormHelperTextProps} className={fieldState}>
102
109
  {helperText}
103
110
  </FormHelperText>
@@ -1,6 +1,6 @@
1
1
  import { NsIcon, NsIconNameType } from '../icon';
2
2
  import { InputAdornment } from '@mui/material';
3
- import { fieldStateType } from './types';
3
+ import { fieldStateType } from './types.d';
4
4
  import { ReactNode } from 'react';
5
5
 
6
6
  type IconMapType = {
@@ -22,6 +22,10 @@ type props = {
22
22
  * @param param0
23
23
  * @returns
24
24
  */
25
+ export type AdornmentPropsType = {
26
+ startAdornment?: ReactNode;
27
+ endAdornment?: ReactNode;
28
+ }
25
29
  export const getAdornmentProps = ({ disabled, fieldState, iconStart, iconEnd }: props) => {
26
30
  const icons = {
27
31
  startAdornment: iconStart ? <InputAdornment position="start">{iconStart}</InputAdornment> : null,
@@ -1,2 +1,2 @@
1
1
  export { default as NsInputField } from './NsInputField';
2
- export type { NsInputFieldProps } from './types';
2
+ export type { NsInputFieldProps } from './types.d';
@@ -1,6 +1,8 @@
1
1
  import { ReactNode } from 'react';
2
2
  import { TextFieldProps } from '@mui/material';
3
+ import { AdditionalProps } from '../common.types';
3
4
 
5
+ // TODO: check if fieldStateType could be converted to enum, since we also have to account for undefined
4
6
  export type fieldStateType = undefined | 'error' | 'success';
5
7
  export type NsInputFieldProps = Omit<
6
8
  TextFieldProps,
@@ -17,11 +19,26 @@ export type NsInputFieldProps = Omit<
17
19
  | 'select'
18
20
  | 'SelectProps'
19
21
  > & {
22
+ /**
23
+ * has default undefined value, and we can update the value to success
24
+ * on successful validation and update value to 'error' in case of error
25
+ */
26
+
20
27
  fieldState?: fieldStateType;
21
28
  iconStart?: ReactNode;
29
+ /**
30
+ * assign react component for end icon
31
+ */
22
32
  iconEnd?: ReactNode;
33
+ /**
34
+ * assign react component for side icon
35
+ */
36
+
23
37
  iconSide?: ReactNode;
24
38
  /** purpose of showOptional props is to show additional text 'optional' in the label,
25
39
  * if required = false and this flag is true */
26
40
  showOptional?: boolean;
27
- };
41
+ defaultValue?: string;
42
+ rows?: number;
43
+ id?: string;
44
+ } & AdditionalProps;
@@ -1,5 +1,6 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react';
2
2
  import { NsLabel } from '.';
3
+ import { withCenterDecorator } from '@/stories/decorators/withCenterDecorator';
3
4
 
4
5
  type ComponentType = typeof NsLabel;
5
6
  type Story = StoryObj<ComponentType>;
@@ -7,13 +8,15 @@ type MetaStory = Meta<ComponentType>;
7
8
 
8
9
  export default {
9
10
  component: NsLabel,
10
- title: 'Components/NsLabel',
11
+ title: 'Components/Inputs/NsLabel',
12
+ decorators: [withCenterDecorator],
11
13
  } as MetaStory;
12
14
 
13
15
  export const Default: Story = {
14
16
  args: {
15
17
  children: 'Label',
16
18
  required: false,
19
+ size: 16,
17
20
  },
18
21
  };
19
22
 
@@ -21,6 +24,7 @@ export const Optional: Story = {
21
24
  args: {
22
25
  children: 'Label',
23
26
  showOptional: true,
27
+ size: 16,
24
28
  },
25
29
  };
26
30
 
@@ -29,5 +33,6 @@ export const Required: Story = {
29
33
  children: 'Label',
30
34
  showOptional: true,
31
35
  required: true,
36
+ size: 16,
32
37
  },
33
38
  };
@@ -1,33 +1,34 @@
1
- import { InputLabel } from '@mui/material';
2
- import { NsLabelProps } from './types';
3
- import { styled, nuskinTheme } from '@nuskin/foundation-theme';
1
+ import { CSSProperties } from 'react';
4
2
 
5
- const { colors } = nuskinTheme;
3
+ import { FormLabel } from '@mui/material';
6
4
 
7
- const StyledLabel = styled(InputLabel)(({ theme }: any) => {
8
- const isLight = theme.palette?.primary?.main === '#252525';
5
+ import { styled, ColorUtils } from '@nuskin/foundation-theme';
6
+
7
+ import { NsLabelProps } from './types.d';
8
+
9
+ const { paletteColor, isDarkMode, color } = ColorUtils;
10
+
11
+ const StyledLabel = styled(FormLabel)<{ fontSize?: number; style?: CSSProperties }>(({ theme, fontSize, style }) => {
12
+ const isLight = !isDarkMode({ theme });
9
13
  return {
10
- fontSize: '14px',
11
- color: theme.palette?.primary?.main ?? '#252525',
14
+ fontSize: fontSize ? `${fontSize}px` : '14px',
15
+ textAlign: style?.textAlign ?? 'left',
16
+ color: paletteColor('primary', 'main')({ theme }),
12
17
  '.optional-label': {
13
- color: isLight ? colors?.neutral?.[60] : colors?.neutral?.[50],
18
+ color: isLight ? color('neutral', '60')({ theme }) : color('neutral', '50')({ theme }),
14
19
  },
15
20
  '.MuiInputLabel-asterisk': {
16
- color: isLight ? colors?.red?.[40] : colors?.red?.[20],
21
+ color: isLight ? color('error', '40')({ theme }) : color('error', '20')({ theme }),
17
22
  },
18
- };
23
+ ...(style || {}),
24
+ } as any; // TODO: may be this "any" has to be fixed from foundation-theme
19
25
  });
20
- /**
21
- * NOTE: we are passing error = false, in props, because
22
- * we do not want to change the color of label to red, in case of error
23
- * @param props
24
- * @returns
25
- */
26
+
26
27
  const NsLabel = (props: NsLabelProps) => {
27
- const { required, showOptional } = props;
28
+ const { required, showOptional, children, size } = props;
28
29
  return (
29
- <StyledLabel {...props} required={required} error={false}>
30
- {props.children}
30
+ <StyledLabel {...props} fontSize={size} required={required}>
31
+ {children}
31
32
  {!required && showOptional ? <span className="optional-label">{' (Optional)'}</span> : null}
32
33
  </StyledLabel>
33
34
  );
@@ -1,2 +1,2 @@
1
1
  export { default as NsLabel } from './NsLabel';
2
- export type { NsLabelProps } from './types';
2
+ export type { NsLabelProps } from './types.d';
@@ -2,8 +2,9 @@ import { InputLabelProps } from '@mui/material';
2
2
  import { PropsWithChildren } from 'react';
3
3
 
4
4
  export type NsLabelProps = PropsWithChildren &
5
- Omit<InputLabelProps, 'sx' | 'classes' | 'color' | 'margin' | 'variant' | 'classes' | 'error'> & {
5
+ Omit<InputLabelProps, 'sx' | 'classes' | 'color' | 'margin' | 'variant' | 'classes'> & {
6
6
  /** purpose of showOptional props is to show additional text 'optional' in the label,
7
7
  * if required = false and this flag is true */
8
8
  showOptional?: boolean;
9
+ size?: number;
9
10
  };
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import { styled } from '@nuskin/foundation-theme';
3
3
 
4
- import { render } from '../../../test-utils/index';
4
+ import { render } from '@/test-utils/index';
5
5
  import { NsLink } from './';
6
6
 
7
7
  const CustomLink = styled.a`
@@ -6,7 +6,7 @@
6
6
 
7
7
  import React from 'react';
8
8
  import type { StoryObj, Meta } from '@storybook/react';
9
- import { withCenterDecorator } from '../../stories/decorators/withCenterDecorator';
9
+ import { withCenterDecorator } from '@/stories/decorators/withCenterDecorator';
10
10
 
11
11
  import { NsLink } from './';
12
12
  import { NsTypography } from '../typography';
@@ -16,7 +16,7 @@ type Story = StoryObj<ComponentType>;
16
16
  type MetaStory = Meta<ComponentType>;
17
17
 
18
18
  export default {
19
- title: 'Components/NsLink',
19
+ title: 'Components/Data Display/NsLink',
20
20
  component: NsLink,
21
21
  decorators: [withCenterDecorator],
22
22
  argTypes: {
@@ -6,7 +6,7 @@
6
6
  import React, { PropsWithChildren } from 'react';
7
7
 
8
8
  import { StyledLink, StyledNextLink } from './NsLink.styled';
9
- import { NsLinkProps } from './types';
9
+ import { NsLinkProps } from './types.d';
10
10
 
11
11
  /**
12
12
  * @component NsLink
@@ -1,2 +1,2 @@
1
1
  export { default as NsLink } from './NsLink';
2
- export type { NsLinkProps } from './types';
2
+ export type { NsLinkProps } from './types.d';
@@ -0,0 +1,46 @@
1
+ import React from 'react';
2
+ import { render } from '@/test-utils/index';
3
+ import NsModal from './NsModal';
4
+ import { NsModalData } from './stories/mock';
5
+ import { NsModalProps } from './types';
6
+
7
+ describe('NsModal', () => {
8
+ const onHandleClose = jest.fn();
9
+
10
+ const NsModalProp = NsModalData as NsModalProps;
11
+
12
+ test('1. check NsModal component open', () => {
13
+ const { getByTestId } = render(<NsModal {...NsModalProp} handleClose={onHandleClose} />);
14
+ expect(getByTestId('nsmodal-dialog')).toBeInTheDocument();
15
+ });
16
+
17
+ test('2. should render NsModal default component', () => {
18
+ const { getByTestId } = render(<NsModal {...NsModalProp} handleClose={onHandleClose} />);
19
+ expect(getByTestId('modal-default')).toBeInTheDocument();
20
+ });
21
+
22
+ test('3. should render NsModal status component', () => {
23
+ const VariantProps: NsModalProps = {
24
+ ...NsModalProp,
25
+ variant: 'info',
26
+ };
27
+ const { getByTestId } = render(<NsModal {...VariantProps} handleClose={onHandleClose} />);
28
+ expect(getByTestId('modal-status')).toBeInTheDocument();
29
+ });
30
+
31
+ test('4. should render NsModal title with close button', () => {
32
+ const { getByTestId } = render(<NsModal {...NsModalProp} handleClose={onHandleClose} />);
33
+ expect(getByTestId('modal-title')).toBeInTheDocument();
34
+ expect(getByTestId('modal-close-button')).toBeInTheDocument();
35
+ });
36
+
37
+ test('5. should render NsModal body content', () => {
38
+ const { getByTestId } = render(<NsModal {...NsModalProp} handleClose={onHandleClose} />);
39
+ expect(getByTestId('modal-body-content')).toBeInTheDocument();
40
+ });
41
+
42
+ test('6. should render NsModal footer', () => {
43
+ const { getByTestId } = render(<NsModal {...NsModalProp} handleClose={onHandleClose} />);
44
+ expect(getByTestId('modal-footer')).toBeInTheDocument();
45
+ });
46
+ });
@@ -0,0 +1,28 @@
1
+ import { styled } from '@nuskin/foundation-theme';
2
+ import { NsButton } from '../button';
3
+ import { DialogActions } from '@mui/material';
4
+
5
+ export const NsInfoWrapper = styled.div`
6
+ display: flex;
7
+ .status-icon {
8
+ padding: 16px 0px 0px 24px;
9
+ }
10
+ .title-icon {
11
+ padding-right: 10px;
12
+ }
13
+ `;
14
+
15
+ export const CloseButton = styled(NsButton)`
16
+ position: absolute;
17
+ right: 8px;
18
+ top: 8px;
19
+ `;
20
+
21
+ export const ModalFooter = styled(DialogActions)`
22
+ display: flex;
23
+ justify-content: space-around;
24
+ padding: 20px 0px 10px 0px;
25
+ button {
26
+ width: 100%;
27
+ }
28
+ `;