@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
@@ -0,0 +1,30 @@
1
+ import React from 'react';
2
+ import { ListItem, ListItemContainer } from './NsSelect.styled';
3
+ import { SelectOptionProps } from './types.d';
4
+
5
+ export const NsSelectOption: React.FC<SelectOptionProps> = ({
6
+ value,
7
+ label,
8
+ onSelect,
9
+ selectedValue,
10
+ showListDivider = true,
11
+ }) => {
12
+ const handleClick = () => {
13
+ if (onSelect && typeof onSelect === 'function') {
14
+ onSelect(value);
15
+ }
16
+ };
17
+
18
+ return (
19
+ <ListItemContainer
20
+ data-testid={`option-${value}`}
21
+ isSelected={value === selectedValue}
22
+ showListDivider={showListDivider}
23
+ onClick={handleClick}
24
+ >
25
+ <ListItem isSelected={value === selectedValue}>{label}</ListItem>
26
+ </ListItemContainer>
27
+
28
+ );
29
+ };
30
+ export default NsSelectOption;
@@ -0,0 +1,3 @@
1
+ export { default as NsSelect } from './NsSelect';
2
+ export { default as NsSelectOption } from './NsSelectOption';
3
+ export type { SelectOptionProps, SelectProps } from './types.d';
@@ -0,0 +1,134 @@
1
+ import React, { useState } from 'react';
2
+ import { ComponentStory, ComponentMeta } from '@storybook/react';
3
+ import NsSelect from '../NsSelect';
4
+ import NsSelectOption from '../NsSelectOption';
5
+
6
+ export default {
7
+ title: 'Components/Inputs/NsSelect',
8
+ decorators: [
9
+ (story) => <div style={{ display: 'flex', justifyContent: 'center', alignItems: 'center' }}>{story()}</div>,
10
+ ],
11
+ component: NsSelect,
12
+ argTypes: {
13
+ type: { control: 'select', options: ['unfilled', 'outlined'] },
14
+ disabled: { control: 'boolean' },
15
+ selectBorderColor: {
16
+ control: 'select',
17
+ options: ['primary', 'secondary', 'accentColorA', 'accentColorB', 'accentColorC'],
18
+ },
19
+ placeholder: { control: 'text' },
20
+ closeOnMouseLeave: { control: 'boolean' },
21
+ showListDivider: { control: 'boolean' },
22
+ label: { control: 'text' },
23
+ name: { control: 'text' },
24
+ menuProps: { control: 'text' },
25
+ reverseArrowControls: { control: 'boolean' },
26
+ validateOnBlur: { control: 'boolean' },
27
+ autoComplete: { control: 'text' },
28
+ rules: { control: 'array' },
29
+ },
30
+ parameters: {
31
+ options: [
32
+ { label: 'Alabama', value: 'AL' },
33
+ { label: 'Alaska', value: 'AK' },
34
+ { label: 'Arizona', value: 'AZ' },
35
+ { label: 'Arkansas', value: 'AR' },
36
+ { label: 'California', value: 'CA' },
37
+ { label: 'Colorado', value: 'CO' },
38
+ { label: 'Connecticut', value: 'CT' },
39
+ { label: 'Delaware', value: 'DE' },
40
+ { label: 'District of Columbia', value: 'DC' },
41
+ { label: 'Florida', value: 'FL' },
42
+ { label: 'Georgia', value: 'GA' },
43
+ { label: 'Hawaii', value: 'HI' },
44
+ { label: 'Idaho', value: 'ID' },
45
+ { label: 'Illinois', value: 'IL' },
46
+ { label: 'Indiana', value: 'IN' },
47
+ { label: 'Iowa', value: 'IA' },
48
+ { label: 'Kansas', value: 'KA' },
49
+ { label: 'Kentucky', value: 'KY' },
50
+ { label: 'Louisiana', value: 'LA' },
51
+ { label: 'Maine', value: 'ME' },
52
+ { label: 'Maryland', value: 'MY' },
53
+ { label: 'Massachusetts', value: 'MA' },
54
+ { label: 'Michigan', value: 'MC' },
55
+ { label: 'Minnesota', value: 'MN' },
56
+ { label: 'Mississippi', value: 'MI' },
57
+ { label: 'Missouri', value: 'MO' },
58
+ { label: 'Montana', value: 'MT' },
59
+ { label: 'Nebraska', value: 'NE' },
60
+ { label: 'Nevada', value: 'NA' },
61
+ { label: 'New Hampshire', value: 'NH' },
62
+ { label: 'New Jersey', value: 'NJ' },
63
+ { label: 'New Mexico', value: 'NM' },
64
+ { label: 'New York', value: 'NY' },
65
+ { label: 'North Carolina', value: 'NC' },
66
+ { label: 'North Dakota', value: 'CD' },
67
+ { label: 'Ohio', value: 'OH' },
68
+ { label: 'Oklahoma', value: 'OK' },
69
+ { label: 'Oregon', value: 'OR' },
70
+ { label: 'Pennsylvania', value: 'PA' },
71
+ { label: 'Rhode Island', value: 'RI' },
72
+ { label: 'South Carolina', value: 'SC' },
73
+ { label: 'South Dakota', value: 'SD' },
74
+ { label: 'Tennessee', value: 'TN' },
75
+ { label: 'Texas', value: 'TX' },
76
+ { label: 'Utah', value: 'UT' },
77
+ { label: 'Vermont', value: 'VT' },
78
+ { label: 'Virginia', value: 'VA' },
79
+ { label: 'Washington', value: 'WA' },
80
+ { label: 'West Virginia', value: 'WV' },
81
+ { label: 'Wisconsin', value: 'WN' },
82
+ { label: 'Wyoming', value: 'WY' },
83
+ ],
84
+ },
85
+ args: {
86
+ type: 'outlined',
87
+ disabled: false,
88
+ selectBorderColor: 'primary',
89
+ closeOnMouseLeave: false,
90
+ showListDivider: true,
91
+ selectedValue: '',
92
+ selectedLabel: '',
93
+ label: 'State',
94
+ placeholder: '',
95
+ name: '',
96
+ menuProps: 'auto',
97
+ reverseArrowControls: false,
98
+ itemText: 'Text',
99
+ itemValue: 'Value',
100
+ validateOnBlur: false,
101
+ autoComplete: '',
102
+ rules: [],
103
+ },
104
+ } as ComponentMeta<typeof NsSelect>;
105
+
106
+ export const Select: ComponentStory<typeof NsSelect> = (args, context) => {
107
+ const [selectedLabel, setSelectedLabel] = useState(args.selectedLabel);
108
+ const [selectedValue, setSelectedValue] = useState(args.selectedValue);
109
+
110
+ const options = context.parameters.options;
111
+ const handleSelect = (value: string) => {
112
+ setSelectedValue(value);
113
+ options.find((option: any) => {
114
+ if (option.value === value) {
115
+ setSelectedLabel(option.label);
116
+ }
117
+ });
118
+ console.log('Selected:', value);
119
+ };
120
+
121
+ return (
122
+ <NsSelect
123
+ {...args}
124
+ selectedValue={selectedValue}
125
+ selectedLabel={selectedLabel}
126
+ onSelect={handleSelect}
127
+ label={args.label}
128
+ >
129
+ {options.map((option: any) => (
130
+ <NsSelectOption key={option.value} value={option.value} label={option.label} />
131
+ ))}
132
+ </NsSelect>
133
+ );
134
+ };
@@ -0,0 +1,34 @@
1
+ import { ReactNode } from 'react';
2
+ import { FoundationTheme } from '@nuskin/foundation-theme';
3
+
4
+ export interface SelectProps {
5
+ selectedValue: string;
6
+ selectedLabel: string;
7
+ onSelect: (arg: string) => void; // eslint-disable-line
8
+ children?: ReactNode | null;
9
+ disabled?: boolean;
10
+ type?: 'outlined' | 'unfilled';
11
+ placeholder?: string;
12
+ selectBorderColor?: FoundationTheme.PaletteColors;
13
+ closeOnMouseLeave?: boolean;
14
+ showListDivider?: boolean;
15
+ label?: string;
16
+ readOnly?: boolean;
17
+ name?: string;
18
+ errorMessage?: string;
19
+ menuProps?: string | object;
20
+ reverseArrowControls?: boolean;
21
+ itemText?: string;
22
+ itemValue?: string;
23
+ validateOnBlur?: boolean;
24
+ autoComplete?: string;
25
+ rules?: any[];
26
+ }
27
+
28
+ export interface SelectOptionProps {
29
+ value: string;
30
+ label: string;
31
+ selectedValue?: string;
32
+ onSelect?: (arg: string) => void; // eslint-disable-line
33
+ showListDivider?: boolean;
34
+ }
@@ -0,0 +1,21 @@
1
+ import React from 'react';
2
+ import { render, screen } from '@/test-utils/index';
3
+ import NsSpinner from './NsSpinner';
4
+
5
+ describe('NsSpinner', () => {
6
+ test('1.renders spinner', () => {
7
+ const { container } = render(<NsSpinner additionalProps={{ 'data-testid': 'spinner' }} />);
8
+
9
+ expect(screen.getByTestId('spinner')).toBeInTheDocument();
10
+ expect(container.getElementsByTagName('svg')).toHaveLength(1);
11
+ expect(screen.getByTestId('spinner')).toHaveStyle('width:100px');
12
+ });
13
+
14
+ test('2.renders spinner with different size', () => {
15
+ render(<NsSpinner size={200} additionalProps={{ 'data-testid': 'spinner' }} />);
16
+
17
+ expect(screen.getByTestId('spinner')).toBeInTheDocument();
18
+ expect(screen.getByTestId('spinner')).toHaveStyle('width:200px');
19
+ expect(screen.getByTestId('spinner')).toHaveStyle('height:200px');
20
+ });
21
+ });
@@ -0,0 +1,26 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import NsSpinner from './NsSpinner';
3
+ import { withCenterDecorator } from '@/stories/decorators/withCenterDecorator';
4
+
5
+ type ComponentType = typeof NsSpinner;
6
+ type Story = StoryObj<ComponentType>;
7
+ type MetaStory = Meta<ComponentType>;
8
+
9
+ export default {
10
+ title: 'Components/Feedback/NsSpinner',
11
+ component: NsSpinner,
12
+ decorators: [
13
+ (Story) => (
14
+ <div className="flex place-content-center">
15
+ <Story />
16
+ </div>
17
+ ),
18
+ withCenterDecorator,
19
+ ],
20
+ argTypes: {},
21
+ args: {
22
+ size: 200,
23
+ },
24
+ } as MetaStory;
25
+
26
+ export const Spinner: Story = {};
@@ -0,0 +1,344 @@
1
+ import { styled } from '@nuskin/foundation-theme';
2
+
3
+ export const SpinnerContainer = styled.div<{ size: number }>`
4
+ width: ${(prop) => prop.size}px;
5
+ height: ${(prop) => prop.size}px;
6
+ svg {
7
+ width: ${(prop) => prop.size}px;
8
+ height: ${(prop) => prop.size}px;
9
+ }
10
+ #ns-spinner-7_tr {
11
+ animation: ns-spinner-7_tr__tr 4000ms linear infinite normal forwards;
12
+ }
13
+ @keyframes ns-spinner-7_tr__tr {
14
+ 0% {
15
+ transform: translate(232.873721px, 220.430229px) rotate(71.000016deg);
16
+ }
17
+ 80% {
18
+ transform: translate(232.873721px, 220.430229px) rotate(71.000016deg);
19
+ animation-timing-function: cubic-bezier(0.495, 0.49, 0.82, 0.11);
20
+ }
21
+ 100% {
22
+ transform: translate(232.873721px, 220.430229px) rotate(430deg);
23
+ }
24
+ }
25
+ #ns-spinner-7 {
26
+ animation: ns-spinner-7_c_o 4000ms linear infinite normal forwards;
27
+ }
28
+ @keyframes ns-spinner-7_c_o {
29
+ 0% {
30
+ opacity: 0;
31
+ }
32
+ 77.500000% {
33
+ opacity: 0;
34
+ }
35
+ 80% {
36
+ opacity: 1;
37
+ }
38
+ 97.500000% {
39
+ opacity: 1;
40
+ }
41
+ 100% {
42
+ opacity: 0;
43
+ }
44
+ }
45
+ #ns-spinner-8_tr {
46
+ animation: ns-spinner-8_tr__tr 4000ms linear infinite normal forwards;
47
+ }
48
+ @keyframes ns-spinner-8_tr__tr {
49
+ 0% {
50
+ transform: translate(232.873721px, 220.430229px) rotate(71.000016deg);
51
+ }
52
+ 77.500000% {
53
+ transform: translate(232.873721px, 220.430229px) rotate(71.000016deg);
54
+ animation-timing-function: cubic-bezier(0.1, 0.365, 0.82, 0.11);
55
+ }
56
+ 100% {
57
+ transform: translate(232.873721px, 220.430229px) rotate(430deg);
58
+ }
59
+ }
60
+ #ns-spinner-8 {
61
+ animation: ns-spinner-8_c_o 4000ms linear infinite normal forwards;
62
+ }
63
+ @keyframes ns-spinner-8_c_o {
64
+ 0% {
65
+ opacity: 0;
66
+ }
67
+ 75% {
68
+ opacity: 0;
69
+ }
70
+ 77.500000% {
71
+ opacity: 1;
72
+ }
73
+ 97.500000% {
74
+ opacity: 1;
75
+ }
76
+ 100% {
77
+ opacity: 0;
78
+ }
79
+ }
80
+ #ns-spinner-9_tr {
81
+ animation: ns-spinner-9_tr__tr 4000ms linear infinite normal forwards;
82
+ }
83
+ @keyframes ns-spinner-9_tr__tr {
84
+ 0% {
85
+ transform: translate(232.873721px, 220.430229px) rotate(71.000016deg);
86
+ }
87
+ 30% {
88
+ transform: translate(232.873721px, 220.430229px) rotate(71.000016deg);
89
+ animation-timing-function: cubic-bezier(0.5, 0.495, 0.82, 0.11);
90
+ }
91
+ 50% {
92
+ transform: translate(232.873721px, 220.430229px) rotate(430deg);
93
+ }
94
+ 100% {
95
+ transform: translate(232.873721px, 220.430229px) rotate(430deg);
96
+ }
97
+ }
98
+ #ns-spinner-9 {
99
+ animation: ns-spinner-9_c_o 4000ms linear infinite normal forwards;
100
+ }
101
+ @keyframes ns-spinner-9_c_o {
102
+ 0% {
103
+ opacity: 0;
104
+ }
105
+ 25% {
106
+ opacity: 0;
107
+ }
108
+ 27.500000% {
109
+ opacity: 1;
110
+ }
111
+ 47.500000% {
112
+ opacity: 1;
113
+ }
114
+ 50% {
115
+ opacity: 0;
116
+ }
117
+ 100% {
118
+ opacity: 0;
119
+ }
120
+ }
121
+ #ns-spinner-10_tr {
122
+ animation: ns-spinner-10_tr__tr 4000ms linear infinite normal forwards;
123
+ }
124
+ @keyframes ns-spinner-10_tr__tr {
125
+ 0% {
126
+ transform: translate(232.873721px, 220.430229px) rotate(71.000016deg);
127
+ }
128
+ 27.500000% {
129
+ transform: translate(232.873721px, 220.430229px) rotate(71.000016deg);
130
+ animation-timing-function: cubic-bezier(0.1, 0.365, 0.82, 0.11);
131
+ }
132
+ 50% {
133
+ transform: translate(232.873721px, 220.430229px) rotate(430deg);
134
+ }
135
+ 100% {
136
+ transform: translate(232.873721px, 220.430229px) rotate(430deg);
137
+ }
138
+ }
139
+ #ns-spinner-10 {
140
+ animation: ns-spinner-10_c_o 4000ms linear infinite normal forwards;
141
+ }
142
+ @keyframes ns-spinner-10_c_o {
143
+ 0% {
144
+ opacity: 0;
145
+ }
146
+ 25% {
147
+ opacity: 0;
148
+ }
149
+ 27.500000% {
150
+ opacity: 1;
151
+ }
152
+ 47.500000% {
153
+ opacity: 1;
154
+ }
155
+ 50% {
156
+ opacity: 0;
157
+ }
158
+ 100% {
159
+ opacity: 0;
160
+ }
161
+ }
162
+ #ns-spinner-11_tr {
163
+ animation: ns-spinner-11_tr__tr 4000ms linear infinite normal forwards;
164
+ }
165
+ @keyframes ns-spinner-11_tr__tr {
166
+ 0% {
167
+ transform: translate(232.873721px, 220.430229px) rotate(71.000016deg);
168
+ }
169
+ 55% {
170
+ transform: translate(232.873721px, 220.430229px) rotate(71.000016deg);
171
+ animation-timing-function: cubic-bezier(0.495, 0.49, 0.82, 0.11);
172
+ }
173
+ 75% {
174
+ transform: translate(232.873721px, 220.430229px) rotate(430deg);
175
+ }
176
+ 100% {
177
+ transform: translate(232.873721px, 220.430229px) rotate(430deg);
178
+ }
179
+ }
180
+ #ns-spinner-11 {
181
+ animation: ns-spinner-11_c_o 4000ms linear infinite normal forwards;
182
+ }
183
+ @keyframes ns-spinner-11_c_o {
184
+ 0% {
185
+ opacity: 0;
186
+ }
187
+ 52.500000% {
188
+ opacity: 0;
189
+ }
190
+ 55% {
191
+ opacity: 1;
192
+ }
193
+ 72.500000% {
194
+ opacity: 1;
195
+ }
196
+ 75% {
197
+ opacity: 0;
198
+ }
199
+ 100% {
200
+ opacity: 0;
201
+ }
202
+ }
203
+ #ns-spinner-12_tr {
204
+ animation: ns-spinner-12_tr__tr 4000ms linear infinite normal forwards;
205
+ }
206
+ @keyframes ns-spinner-12_tr__tr {
207
+ 0% {
208
+ transform: translate(232.873721px, 220.430229px) rotate(71.000016deg);
209
+ }
210
+ 52.500000% {
211
+ transform: translate(232.873721px, 220.430229px) rotate(71.000016deg);
212
+ animation-timing-function: cubic-bezier(0.1, 0.365, 0.82, 0.11);
213
+ }
214
+ 75% {
215
+ transform: translate(232.873721px, 220.430229px) rotate(430deg);
216
+ }
217
+ 100% {
218
+ transform: translate(232.873721px, 220.430229px) rotate(430deg);
219
+ }
220
+ }
221
+ #ns-spinner-12 {
222
+ animation: ns-spinner-12_c_o 4000ms linear infinite normal forwards;
223
+ }
224
+ @keyframes ns-spinner-12_c_o {
225
+ 0% {
226
+ opacity: 0;
227
+ }
228
+ 50% {
229
+ opacity: 0;
230
+ }
231
+ 52.500000% {
232
+ opacity: 1;
233
+ }
234
+ 72.500000% {
235
+ opacity: 1;
236
+ }
237
+ 75% {
238
+ opacity: 0;
239
+ }
240
+ 100% {
241
+ opacity: 0;
242
+ }
243
+ }
244
+ #ns-spinner-13_tr {
245
+ animation: ns-spinner-13_tr__tr 4000ms linear infinite normal forwards;
246
+ }
247
+ @keyframes ns-spinner-13_tr__tr {
248
+ 0% {
249
+ transform: translate(232.873721px, 220.430229px) rotate(71.000016deg);
250
+ }
251
+ 5% {
252
+ transform: translate(232.873721px, 220.430229px) rotate(71.000016deg);
253
+ animation-timing-function: cubic-bezier(0.495, 0.49, 0.82, 0.11);
254
+ }
255
+ 25% {
256
+ transform: translate(232.873721px, 220.430229px) rotate(430deg);
257
+ }
258
+ 100% {
259
+ transform: translate(232.873721px, 220.430229px) rotate(430deg);
260
+ }
261
+ }
262
+ #ns-spinner-13 {
263
+ animation: ns-spinner-13_c_o 4000ms linear infinite normal forwards;
264
+ }
265
+ @keyframes ns-spinner-13_c_o {
266
+ 0% {
267
+ opacity: 1;
268
+ }
269
+ 5% {
270
+ opacity: 1;
271
+ }
272
+ 25% {
273
+ opacity: 1;
274
+ }
275
+ 27.500000% {
276
+ opacity: 0;
277
+ }
278
+ 100% {
279
+ opacity: 0;
280
+ }
281
+ }
282
+ #ns-spinner-14_tr {
283
+ animation: ns-spinner-14_tr__tr 4000ms linear infinite normal forwards;
284
+ }
285
+ @keyframes ns-spinner-14_tr__tr {
286
+ 0% {
287
+ transform: translate(232.873721px, 220.430229px) rotate(71.000016deg);
288
+ }
289
+ 2.500000% {
290
+ transform: translate(232.873721px, 220.430229px) rotate(71.000016deg);
291
+ animation-timing-function: cubic-bezier(0.1, 0.365, 0.82, 0.11);
292
+ }
293
+ 25% {
294
+ transform: translate(232.873721px, 220.430229px) rotate(430deg);
295
+ }
296
+ 100% {
297
+ transform: translate(232.873721px, 220.430229px) rotate(430deg);
298
+ }
299
+ }
300
+ #ns-spinner-14 {
301
+ animation: ns-spinner-14_c_o 4000ms linear infinite normal forwards;
302
+ }
303
+ @keyframes ns-spinner-14_c_o {
304
+ 0% {
305
+ opacity: 1;
306
+ }
307
+ 2.500000% {
308
+ opacity: 1;
309
+ }
310
+ 25% {
311
+ opacity: 1;
312
+ }
313
+ 27.500000% {
314
+ opacity: 0;
315
+ }
316
+ 100% {
317
+ opacity: 0;
318
+ }
319
+ }
320
+ #ns-spinner-15_tr {
321
+ animation: ns-spinner-15_tr__tr 4000ms linear infinite normal forwards;
322
+ }
323
+ @keyframes ns-spinner-15_tr__tr {
324
+ 0% {
325
+ transform: translate(232.873721px, 220.430229px) rotate(71.000016deg);
326
+ animation-timing-function: cubic-bezier(0, 0.25, 0.795, 0.345);
327
+ }
328
+ 25% {
329
+ transform: translate(232.873721px, 220.430229px) rotate(430deg);
330
+ animation-timing-function: cubic-bezier(0, 0.25, 0.795, 0.345);
331
+ }
332
+ 50% {
333
+ transform: translate(232.873721px, 220.430229px) rotate(791deg);
334
+ animation-timing-function: cubic-bezier(0, 0.25, 0.795, 0.345);
335
+ }
336
+ 75% {
337
+ transform: translate(232.873721px, 220.430229px) rotate(1151deg);
338
+ animation-timing-function: cubic-bezier(0, 0.25, 0.795, 0.345);
339
+ }
340
+ 100% {
341
+ transform: translate(232.873721px, 220.430229px) rotate(1511deg);
342
+ }
343
+ }
344
+ `;
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ import SpinnerIcon from './icons/Spinner';
3
+ import { SpinnerContainer } from './NsSpinner.styled';
4
+ import { NsSpinnerProps } from './types';
5
+
6
+ const NsSpinner: React.FC<NsSpinnerProps> = ({ size = 100, additionalProps }) => {
7
+ return (
8
+ <SpinnerContainer size={size} className="spinner" {...additionalProps}>
9
+ <SpinnerIcon />
10
+ </SpinnerContainer>
11
+ );
12
+ };
13
+
14
+ export default NsSpinner;