@lifesg/react-design-system 1.0.0-alpha.2 → 1.0.0-alpha.20

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 (253) hide show
  1. package/README.md +2 -0
  2. package/accordion/accordion-item.style.d.ts +5 -2
  3. package/accordion/accordion.style.d.ts +1 -1
  4. package/accordion/index.js +165 -172
  5. package/accordion/index.js.map +1 -1
  6. package/alert/alert.style.d.ts +4 -1
  7. package/alert/index.js +107 -119
  8. package/alert/index.js.map +1 -1
  9. package/animations/index.js +1 -1
  10. package/animations/index.js.map +1 -1
  11. package/box-container/box-container.styles.d.ts +8 -1
  12. package/box-container/index.js +69 -74
  13. package/box-container/index.js.map +1 -1
  14. package/breadcrumb/breadcrumb.style.d.ts +4 -4
  15. package/breadcrumb/index.js +102 -106
  16. package/breadcrumb/index.js.map +1 -1
  17. package/breadcrumb/types.d.ts +5 -1
  18. package/button/button.d.ts +2 -2
  19. package/button/index.js +140 -143
  20. package/button/index.js.map +1 -1
  21. package/card/card.d.ts +3 -0
  22. package/card/card.style.d.ts +1 -0
  23. package/card/index.d.ts +1 -0
  24. package/card/index.js +132 -0
  25. package/card/index.js.map +1 -0
  26. package/{icon → card}/package.json +1 -1
  27. package/card/types.d.ts +4 -0
  28. package/checkbox/checkbox.d.ts +1 -1
  29. package/checkbox/checkbox.style.d.ts +4 -1
  30. package/checkbox/index.js +11 -21
  31. package/checkbox/index.js.map +1 -1
  32. package/cjs/index.js +1999 -1021
  33. package/cjs/index.js.map +1 -1
  34. package/color/color.d.ts +4 -59
  35. package/color/index.js +1 -1
  36. package/color/index.js.map +1 -1
  37. package/color/types.d.ts +5 -1
  38. package/date-input/date-input.d.ts +1 -1
  39. package/date-input/date-input.style.d.ts +2 -6
  40. package/date-input/index.js +121 -136
  41. package/date-input/index.js.map +1 -1
  42. package/date-input/types.d.ts +14 -16
  43. package/design-token/design-token.d.ts +4 -0
  44. package/design-token/index.d.ts +2 -0
  45. package/design-token/index.js +6 -0
  46. package/design-token/index.js.map +1 -0
  47. package/design-token/package.json +7 -0
  48. package/design-token/types.d.ts +7 -0
  49. package/error-display/error-display-data.d.ts +11 -0
  50. package/error-display/error-display.d.ts +3 -0
  51. package/error-display/error-display.style.d.ts +7 -0
  52. package/error-display/index.d.ts +2 -0
  53. package/error-display/index.js +322 -0
  54. package/error-display/index.js.map +1 -0
  55. package/error-display/package.json +7 -0
  56. package/error-display/types.d.ts +20 -0
  57. package/feedback-rating/feedback-rating-data.d.ts +5 -0
  58. package/feedback-rating/feedback-rating-stars-container-data.d.ts +3 -0
  59. package/feedback-rating/feedback-rating-stars-container.d.ts +3 -0
  60. package/feedback-rating/feedback-rating-stars-container.styles.d.ts +12 -0
  61. package/feedback-rating/feedback-rating.d.ts +3 -0
  62. package/feedback-rating/feedback-rating.styles.d.ts +5 -0
  63. package/feedback-rating/index.d.ts +2 -0
  64. package/feedback-rating/index.js +329 -0
  65. package/feedback-rating/index.js.map +1 -0
  66. package/feedback-rating/package.json +7 -0
  67. package/feedback-rating/types.d.ts +14 -0
  68. package/footer/footer-download-app.d.ts +2 -0
  69. package/footer/footer-download-app.style.d.ts +6 -0
  70. package/footer/footer-helper.d.ts +12 -0
  71. package/footer/footer.d.ts +3 -0
  72. package/footer/footer.style.d.ts +12 -0
  73. package/footer/index.d.ts +2 -0
  74. package/footer/index.js +373 -0
  75. package/footer/index.js.map +1 -0
  76. package/footer/package.json +7 -0
  77. package/footer/types.d.ts +31 -0
  78. package/form/form-custom-field.d.ts +3 -0
  79. package/form/form-input-group.d.ts +1 -1
  80. package/form/form-input.d.ts +1 -1
  81. package/form/form-label-addon.d.ts +1 -2
  82. package/form/form-label.d.ts +1 -1
  83. package/form/form-label.style.d.ts +1 -0
  84. package/form/form-phone-number-input.d.ts +3 -0
  85. package/form/form-textarea.d.ts +1 -1
  86. package/form/form-unit-number-input.d.ts +3 -0
  87. package/form/index.d.ts +9 -6
  88. package/form/index.js +774 -629
  89. package/form/index.js.map +1 -1
  90. package/form/types.d.ts +14 -5
  91. package/icon-button/icon-button.d.ts +1 -1
  92. package/icon-button/icon-button.style.d.ts +6 -1
  93. package/icon-button/index.js +9 -15
  94. package/icon-button/index.js.map +1 -1
  95. package/icon-button/types.d.ts +2 -3
  96. package/index.d.ts +11 -1
  97. package/index.js +1997 -1019
  98. package/index.js.map +1 -1
  99. package/input/index.js +84 -41
  100. package/input/index.js.map +1 -1
  101. package/input/input.d.ts +1 -1
  102. package/input/input.style.d.ts +9 -0
  103. package/input/types.d.ts +2 -0
  104. package/input-group/index.js +392 -312
  105. package/input-group/index.js.map +1 -1
  106. package/input-group/input-group-list-addon.d.ts +1 -1
  107. package/input-group/input-group-list-addon.style.d.ts +4 -1
  108. package/input-group/input-group.d.ts +1 -1
  109. package/input-group/input-group.style.d.ts +1 -2
  110. package/input-group/types.d.ts +8 -8
  111. package/input-select/index.js +278 -242
  112. package/input-select/index.js.map +1 -1
  113. package/input-select/input-select-wrapper.d.ts +1 -1
  114. package/input-select/input-select.d.ts +1 -1
  115. package/input-select/input-select.styles.d.ts +5 -1
  116. package/input-select/types.d.ts +15 -11
  117. package/input-textarea/index.js +132 -121
  118. package/input-textarea/index.js.map +1 -1
  119. package/input-textarea/textarea-counter.d.ts +2 -1
  120. package/input-textarea/textarea.d.ts +2 -2
  121. package/input-textarea/types.d.ts +1 -0
  122. package/layout/container.d.ts +3 -0
  123. package/layout/content.d.ts +3 -0
  124. package/layout/index.d.ts +7 -0
  125. package/layout/index.js +55 -0
  126. package/layout/index.js.map +1 -0
  127. package/layout/package.json +7 -0
  128. package/layout/section.d.ts +3 -0
  129. package/layout/types.d.ts +15 -0
  130. package/link-list/index.js +130 -130
  131. package/link-list/index.js.map +1 -1
  132. package/link-list/link-list.styles.d.ts +12 -2
  133. package/link-list/types.d.ts +1 -1
  134. package/masonry/index.js.map +1 -1
  135. package/masonry/masonry.d.ts +2 -2
  136. package/masthead/index.d.ts +1 -0
  137. package/masthead/index.js +9 -0
  138. package/masthead/index.js.map +1 -0
  139. package/masthead/masthead.d.ts +2 -0
  140. package/masthead/masthead.style.d.ts +1 -0
  141. package/masthead/package.json +7 -0
  142. package/media/index.js +1 -1
  143. package/media/index.js.map +1 -1
  144. package/media/media.d.ts +2 -1
  145. package/modal/index.d.ts +1 -1
  146. package/modal/index.js +30 -43
  147. package/modal/index.js.map +1 -1
  148. package/modal/modal-box.styles.d.ts +5 -2
  149. package/modal/modal.d.ts +1 -1
  150. package/modal/modal.styles.d.ts +1 -0
  151. package/modal/types.d.ts +4 -2
  152. package/navbar/brand.d.ts +10 -0
  153. package/navbar/brand.styles.d.ts +5 -0
  154. package/navbar/drawer.d.ts +3 -0
  155. package/navbar/drawer.styles.d.ts +15 -0
  156. package/navbar/index.d.ts +7 -0
  157. package/navbar/index.js +651 -0
  158. package/navbar/index.js.map +1 -0
  159. package/navbar/navbar-action-buttons.d.ts +10 -0
  160. package/navbar/navbar-action-buttons.styles.d.ts +9 -0
  161. package/navbar/navbar-items.d.ts +11 -0
  162. package/navbar/navbar-items.styles.d.ts +10 -0
  163. package/navbar/navbar.d.ts +3 -0
  164. package/navbar/navbar.styles.d.ts +19 -0
  165. package/navbar/package.json +7 -0
  166. package/navbar/types.d.ts +56 -0
  167. package/notification-banner/index.d.ts +3 -0
  168. package/notification-banner/index.js +266 -0
  169. package/notification-banner/index.js.map +1 -0
  170. package/notification-banner/notification-banner-hoc.d.ts +3 -0
  171. package/notification-banner/notification-banner.d.ts +6 -0
  172. package/notification-banner/notification-banner.styles.d.ts +15 -0
  173. package/notification-banner/package.json +7 -0
  174. package/notification-banner/types.d.ts +22 -0
  175. package/overlay/index.js +1 -1
  176. package/overlay/index.js.map +1 -1
  177. package/overlay/types.d.ts +1 -1
  178. package/package.json +4 -1
  179. package/phone-number-input/data/country-code.d.ts +1 -0
  180. package/phone-number-input/index.d.ts +1 -0
  181. package/phone-number-input/index.js +850 -0
  182. package/phone-number-input/index.js.map +1 -0
  183. package/phone-number-input/package.json +7 -0
  184. package/phone-number-input/phone-number-input-helper.d.ts +5 -0
  185. package/phone-number-input/phone-number-input.d.ts +3 -0
  186. package/phone-number-input/phone-number-input.styles.d.ts +1 -0
  187. package/phone-number-input/types.d.ts +42 -0
  188. package/popover/index.js +148 -153
  189. package/popover/index.js.map +1 -1
  190. package/popover/popover.styles.d.ts +1 -1
  191. package/popover/types.d.ts +3 -3
  192. package/progress-indicator/index.d.ts +2 -0
  193. package/progress-indicator/index.js +240 -0
  194. package/progress-indicator/index.js.map +1 -0
  195. package/progress-indicator/package.json +7 -0
  196. package/progress-indicator/progress-indicator.d.ts +3 -0
  197. package/progress-indicator/progress-indicator.style.d.ts +19 -0
  198. package/progress-indicator/types.d.ts +9 -0
  199. package/radio-button/index.js +7 -7
  200. package/radio-button/index.js.map +1 -1
  201. package/shared/dropdown-list/dropdown-list.d.ts +1 -1
  202. package/shared/dropdown-list/dropdown-list.styles.d.ts +6 -2
  203. package/shared/dropdown-list/dropdown-search.d.ts +2 -1
  204. package/shared/dropdown-list/dropdown-search.styles.d.ts +9 -1
  205. package/shared/dropdown-list/types.d.ts +21 -12
  206. package/smart-app-banner/index.d.ts +2 -0
  207. package/smart-app-banner/index.js +373 -0
  208. package/smart-app-banner/index.js.map +1 -0
  209. package/smart-app-banner/package.json +7 -0
  210. package/smart-app-banner/smart-app-banner.d.ts +3 -0
  211. package/smart-app-banner/smart-app-banner.styles.d.ts +31 -0
  212. package/smart-app-banner/types.d.ts +18 -0
  213. package/spec/design-token-spec/base-design-token-set.d.ts +2 -0
  214. package/text/index.js +62 -65
  215. package/text/index.js.map +1 -1
  216. package/text/text-style.d.ts +4 -100
  217. package/text-list/index.js +7 -7
  218. package/text-list/index.js.map +1 -1
  219. package/theme/design-token-helper.d.ts +2 -0
  220. package/theme/index.js +1 -1
  221. package/theme/index.js.map +1 -1
  222. package/theme/types.d.ts +12 -3
  223. package/timeline/index.js +95 -98
  224. package/timeline/index.js.map +1 -1
  225. package/timepicker/index.js +213 -207
  226. package/timepicker/index.js.map +1 -1
  227. package/timepicker/timepicker-dropdown.styles.d.ts +2 -2
  228. package/timepicker/types.d.ts +3 -3
  229. package/toggle-button/index.js +118 -121
  230. package/toggle-button/index.js.map +1 -1
  231. package/tooltip/index.js +127 -125
  232. package/tooltip/index.js.map +1 -1
  233. package/tooltip/tooltip.styles.d.ts +3 -1
  234. package/unit-number/index.d.ts +2 -0
  235. package/unit-number/index.js +403 -0
  236. package/unit-number/index.js.map +1 -0
  237. package/unit-number/package.json +7 -0
  238. package/unit-number/types.d.ts +27 -0
  239. package/unit-number/unit-number-input.d.ts +3 -0
  240. package/unit-number/unit-number-input.style.d.ts +16 -0
  241. package/util/date-helper.d.ts +19 -0
  242. package/util/index.d.ts +2 -0
  243. package/util/utility-types.d.ts +3 -0
  244. package/icon/arrow-right-icon.d.ts +0 -3
  245. package/icon/icon.d.ts +0 -3
  246. package/icon/index.d.ts +0 -2
  247. package/icon/index.js +0 -12
  248. package/icon/index.js.map +0 -1
  249. package/icon/info-icon.d.ts +0 -3
  250. package/icon/play-alt-icon.d.ts +0 -3
  251. package/icon/search-icon.d.ts +0 -3
  252. package/icon/shared.style.d.ts +0 -1
  253. package/icon/types.d.ts +0 -9
@@ -0,0 +1,22 @@
1
+ /// <reference types="react" />
2
+ import { TextLinkProps, TextProps } from "../text/types";
3
+ export interface NotificationBannerProps extends React.HTMLAttributes<HTMLDivElement> {
4
+ children?: JSX.Element | JSX.Element[] | string | undefined;
5
+ dismissible?: boolean | undefined;
6
+ visible?: boolean | undefined;
7
+ sticky?: boolean | undefined;
8
+ onDismiss?: (() => void) | undefined;
9
+ }
10
+ export interface NotificationBannerWithForwardedRefProps extends NotificationBannerProps {
11
+ forwardedRef?: React.Ref<HTMLDivElement> | undefined;
12
+ }
13
+ export declare type ContentType = "text" | "link";
14
+ export interface ContentLinkAttributes extends TextLinkProps {
15
+ }
16
+ export interface ContentTextAttributes extends TextProps {
17
+ }
18
+ export interface NotificationContentAttributes {
19
+ type: ContentType;
20
+ content: string;
21
+ otherAttributes?: TextLinkProps | TextProps | undefined;
22
+ }
package/overlay/index.js CHANGED
@@ -36,5 +36,5 @@ import{jsx as t}from"react/jsx-runtime";import e,{useState as n,useRef as i,useE
36
36
  `,t.$disableTransition&&(e+=s`
37
37
  transition: none;
38
38
  `),e}}
39
- `,c=({show:d=!1,rootId:s,onOverlayClick:c,children:b,backgroundOpacity:y,backgroundBlur:h=!0,disableTransition:p=!1,enableOverlayClick:v=!1,zIndex:$,id:f})=>{const[g,w]=n(null),[k,x]=n(),T=i(),C=i(null),I=b&&e.cloneElement(b,{ref:C}),O=f?`lifesg-ds-overlay-root-${f}`:"lifesg-ds-overlay-root";o((()=>{if(d){const t=L();if(B(t),!t){const t=setTimeout((()=>{W("add")}),200);return()=>clearTimeout(t)}}else if(!T.current){const t=setTimeout((()=>{W("add")}),200);return()=>clearTimeout(t)}}),[d]),o((()=>{w(E());const t=L();return B(t),t||z(),()=>{W("remove")}}),[]);const B=t=>{T.current=t,x(t)},E=()=>document&&s?document.getElementById(s):document?document.body:null,L=()=>document.body.classList.contains(m),z=()=>{if(!document.getElementById(u)){const t=document.createElement("style");t.id=u;const e=document.documentElement.clientWidth,n=window.innerWidth-e;t.innerHTML=`\n\t\t\t\t.${m} {\n\t\t\t\t\toverflow: hidden;\n\t\t\t\t\tpadding-right: ${n}px !important;\n\t\t\t\t\t-ms-overflow-style: none;\n\t\t\t\t\tscrollbar-width: none;\n\t\t\t\t}\n\n\t\t\t\t.${m}::-webkit-scrollbar {\n\t\t\t\t\tdisplay: none;\n\t\t\t\t}\n\t\t\t`,document.body.appendChild(t)}},W=t=>{const e=document.body.classList.contains(m);"add"!==t||e?"remove"===t&&e&&document.body.classList.remove(m):document.body.classList.add(m)},j=t=>{t.preventDefault();const e=C.current?.firstChild;e&&e.contains(t.target)||c&&v&&c()};return g?r.createPortal(t(l,{id:O,"data-testid":O,$show:d,zIndex:$,$stacked:k,children:b&&t(a,{"data-testid":"overlay-wrapper",$show:d,$backgroundOpacity:y||(k?.5:.8),$backgroundBlur:h,$disableTransition:p,$enableOverlayClick:v,onClick:j,children:I})}),g):null},u="lifesg-ds-overlay-stylesheet",m="lifesg-ds-overlay-open";export{c as Overlay};
39
+ `,c=({show:d=!1,rootId:s,onOverlayClick:c,children:b,backgroundOpacity:y,backgroundBlur:h=!0,disableTransition:p=!1,enableOverlayClick:v=!1,zIndex:$,id:f})=>{const[g,w]=n(null),[k,x]=n(),T=i(),C=i(null),I=b&&e.cloneElement(b,{ref:C}),O=f?`lifesg-ds-overlay-root-${f}`:"lifesg-ds-overlay-root";o((()=>{if(d){const t=L();if(B(t),!t){const t=setTimeout((()=>{W("add")}),200);return()=>clearTimeout(t)}}else if(!T.current){const t=setTimeout((()=>{W("remove")}),200);return()=>clearTimeout(t)}}),[d]),o((()=>{w(E());const t=L();return B(t),t||z(),()=>{W("remove")}}),[]);const B=t=>{T.current=t,x(t)},E=()=>document&&s?document.getElementById(s):document?document.body:null,L=()=>document.body.classList.contains(m),z=()=>{if(!document.getElementById(u)){const t=document.createElement("style");t.id=u;const e=document.documentElement.clientWidth,n=window.innerWidth-e;t.innerHTML=`\n\t\t\t\t.${m} {\n\t\t\t\t\toverflow: hidden;\n\t\t\t\t\tpadding-right: ${n}px !important;\n\t\t\t\t\t-ms-overflow-style: none;\n\t\t\t\t\tscrollbar-width: none;\n\t\t\t\t}\n\n\t\t\t\t.${m}::-webkit-scrollbar {\n\t\t\t\t\tdisplay: none;\n\t\t\t\t}\n\t\t\t`,document.body.appendChild(t)}},W=t=>{const e=document.body.classList.contains(m);"add"!==t||e?"remove"===t&&e&&document.body.classList.remove(m):document.body.classList.add(m)},j=t=>{t.preventDefault();const e=C.current?.firstChild;e&&e.contains(t.target)||c&&v&&c()};return g?r.createPortal(t(l,{id:O,"data-testid":O,$show:d,zIndex:$,$stacked:k,children:b&&t(a,{"data-testid":"overlay-wrapper",$show:d,$backgroundOpacity:y||(k?.5:.8),$backgroundBlur:h,$disableTransition:p,$enableOverlayClick:v,onClick:j,children:I})}),g):null},u="lifesg-ds-overlay-stylesheet",m="lifesg-ds-overlay-open";export{c as Overlay};
40
40
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/overlay/overlay.styles.tsx","../../src/overlay/overlay.tsx"],"sourcesContent":["import styled, { css } from \"styled-components\";\nimport { StyleProps } from \"./types\";\n\nconst getBackdropFilter = (blur: boolean) => {\n let styleString = \"\";\n\n if (blur) {\n styleString += \"blur(10px)\";\n }\n\n return styleString.length > 0 ? styleString : \"none\";\n};\n\nexport const Root = styled.div<StyleProps>`\n position: fixed;\n left: 0;\n top: 0;\n height: 0;\n width: 0;\n visibility: hidden;\n z-index: ${(props) => {\n return props.zIndex || (props.$stacked ? 99999 : 99998);\n }};\n\n ${(props) => {\n if (props.$show) {\n return css`\n height: 100%;\n width: 100vw;\n visibility: visible;\n `;\n }\n }}\n`;\n\nexport const Wrapper = styled.div<StyleProps>`\n position: absolute;\n left: 0;\n top: 0;\n background-color: rgba(5, 1, 1, ${(props) => props.$backgroundOpacity});\n backdrop-filter: ${(props) => getBackdropFilter(props.$backgroundBlur)};\n transition: opacity 200ms ease;\n\n ${(props) => {\n let customStyles = \"\";\n if (props.$show) {\n customStyles += css`\n visibility: visible;\n opacity: 1;\n pointer-events: auto;\n height: 100%;\n width: 100vw;\n `;\n } else {\n customStyles += css`\n visibility: hidden;\n opacity: 0;\n transition-delay: ${props.$disableTransition ? \"0ms\" : \"400ms\"};\n pointer-events: none;\n height: 0;\n width: 0;\n `;\n }\n if (props.$disableTransition) {\n customStyles += css`\n transition: none;\n `;\n }\n\n return customStyles;\n }}\n`;\n","import React, { useEffect, useRef, useState } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { OverlayProps } from \"./types\";\nimport { Root, Wrapper } from \"./overlay.styles\";\n\nexport const Overlay = ({\n show = false,\n rootId,\n onOverlayClick,\n children,\n backgroundOpacity,\n backgroundBlur = true,\n disableTransition = false,\n enableOverlayClick = false,\n zIndex,\n id,\n}: OverlayProps): JSX.Element | null => {\n // =============================================================================\n // CONST, STATE, REF\n // =============================================================================\n const [rootElement, setRootElement] = useState<HTMLElement | null>(null);\n const [isStacked, _setIsStacked] = useState<boolean>();\n\n const stacked = useRef<boolean>();\n\n const childRef = useRef<HTMLDivElement>(null);\n const childWithRef =\n children && React.cloneElement(children, { ref: childRef });\n\n const overlayRootId = id\n ? `lifesg-ds-overlay-root-${id}`\n : \"lifesg-ds-overlay-root\";\n\n // =============================================================================\n // EFFECTS\n // =============================================================================\n useEffect(() => {\n if (show) {\n const isStacked = checkIfStacked();\n setStacked(isStacked);\n\n if (!isStacked) {\n const timerId = setTimeout(() => {\n applyBodyStyleClass(\"add\");\n }, 200); // Allow overlay animations to complete\n return () => clearTimeout(timerId);\n }\n } else {\n /**\n * Here we have to used the ref value to know if it is stacked\n * rather than checking for the presence of the overlay class\n * on <body>\n */\n if (!stacked.current) {\n const timerId = setTimeout(() => {\n applyBodyStyleClass(\"add\");\n }, 200); // Allow overlay animations to complete\n return () => clearTimeout(timerId);\n }\n }\n }, [show]);\n\n useEffect(() => {\n setRootElement(getRootElement());\n\n /**\n * Only add stylesheet for a non-stacked overlay\n */\n const isStacked = checkIfStacked();\n setStacked(isStacked);\n if (!isStacked) addStylesheetForDocumentBody();\n\n return () => {\n applyBodyStyleClass(\"remove\");\n };\n }, []);\n\n // =============================================================================\n // REF FUNCTIONS\n // =============================================================================\n const setStacked = (data: boolean) => {\n stacked.current = data;\n _setIsStacked(data);\n };\n\n // =============================================================================\n // HELPER FUNCTIONS\n // =============================================================================\n const getRootElement = (): HTMLElement | null => {\n if (document && rootId) {\n return document.getElementById(rootId);\n } else if (document) {\n // If rootId not specified, we'll use body\n return document.body;\n } else {\n return null;\n }\n };\n\n const checkIfStacked = () => {\n /**\n * Check if the body style was altered before. If it was, then this is\n * a stacked overlay\n */\n return document.body.classList.contains(OVERLAY_OPEN_CLASSNAME);\n };\n\n const addStylesheetForDocumentBody = () => {\n /**\n * This stylesheet is to manipulate the <body>. We only add once\n */\n if (!document.getElementById(STYLESHEET_ID)) {\n const overlayStyleSheet = document.createElement(\"style\");\n overlayStyleSheet.id = STYLESHEET_ID;\n\n const documentWidth = document.documentElement.clientWidth;\n const windowWidth = window.innerWidth;\n const scrollBarWidth = windowWidth - documentWidth;\n\n overlayStyleSheet.innerHTML = `\n\t\t\t\t.${OVERLAY_OPEN_CLASSNAME} {\n\t\t\t\t\toverflow: hidden;\n\t\t\t\t\tpadding-right: ${scrollBarWidth}px !important;\n\t\t\t\t\t-ms-overflow-style: none;\n\t\t\t\t\tscrollbar-width: none;\n\t\t\t\t}\n\n\t\t\t\t.${OVERLAY_OPEN_CLASSNAME}::-webkit-scrollbar {\n\t\t\t\t\tdisplay: none;\n\t\t\t\t}\n\t\t\t`;\n\n document.body.appendChild(overlayStyleSheet);\n }\n };\n\n /**\n * This sets the style of <body> to hide the scrollbar\n */\n const applyBodyStyleClass = (action: \"add\" | \"remove\") => {\n const isOverlayStyleClassApplied = document.body.classList.contains(\n OVERLAY_OPEN_CLASSNAME\n );\n\n if (action === \"add\" && !isOverlayStyleClassApplied) {\n document.body.classList.add(OVERLAY_OPEN_CLASSNAME);\n } else if (action === \"remove\" && isOverlayStyleClassApplied) {\n document.body.classList.remove(OVERLAY_OPEN_CLASSNAME);\n }\n };\n\n // =============================================================================\n // EVENT HANDLERS\n // =============================================================================\n const handleWrapperClick = (event: React.MouseEvent<HTMLDivElement>) => {\n event.preventDefault();\n\n const modal = childRef.current?.firstChild;\n if (modal && (modal as any).contains(event.target)) {\n return;\n } else if (onOverlayClick && enableOverlayClick) {\n onOverlayClick();\n }\n };\n\n // =============================================================================\n // RENDER\n // =============================================================================\n const renderWrapper = () => (\n <Wrapper\n data-testid={\"overlay-wrapper\"}\n $show={show}\n $backgroundOpacity={backgroundOpacity || (isStacked ? 0.5 : 0.8)}\n $backgroundBlur={backgroundBlur}\n $disableTransition={disableTransition}\n $enableOverlayClick={enableOverlayClick}\n onClick={handleWrapperClick}\n >\n {childWithRef}\n </Wrapper>\n );\n\n const renderComponent = () => (\n <Root\n id={overlayRootId}\n data-testid={overlayRootId}\n $show={show}\n zIndex={zIndex}\n $stacked={isStacked}\n >\n {children && renderWrapper()}\n </Root>\n );\n\n return rootElement\n ? ReactDOM.createPortal(renderComponent(), rootElement)\n : null;\n};\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\nconst STYLESHEET_ID = \"lifesg-ds-overlay-stylesheet\";\nconst OVERLAY_OPEN_CLASSNAME = \"lifesg-ds-overlay-open\";\n"],"names":["Root","styled","div","props","zIndex","$stacked","$show","css","Wrapper","$backgroundOpacity","blur","styleString","length","getBackdropFilter","$backgroundBlur","customStyles","$disableTransition","Overlay","show","rootId","onOverlayClick","children","backgroundOpacity","backgroundBlur","disableTransition","enableOverlayClick","id","rootElement","setRootElement","useState","isStacked","_setIsStacked","stacked","useRef","childRef","childWithRef","React","cloneElement","ref","overlayRootId","useEffect","checkIfStacked","setStacked","timerId","setTimeout","applyBodyStyleClass","clearTimeout","current","getRootElement","addStylesheetForDocumentBody","data","document","getElementById","body","classList","contains","OVERLAY_OPEN_CLASSNAME","STYLESHEET_ID","overlayStyleSheet","createElement","documentWidth","documentElement","clientWidth","scrollBarWidth","window","innerWidth","innerHTML","appendChild","action","isOverlayStyleClassApplied","remove","add","handleWrapperClick","event","preventDefault","modal","firstChild","target","ReactDOM","createPortal","_jsx","$enableOverlayClick","onClick"],"mappings":"2KAGA,MAUaA,EAAOC,EAAOC,GAAe;;;;;;;eAO1BC,GACDA,EAAMC,SAAWD,EAAME,SAAW,MAAQ;;MAGlDF,IACC,GAAIA,EAAMG,MACN,OAAOC,CAAG;;;;;EASTC,EAAUP,EAAOC,GAAe;;;;sCAINC,GAAUA,EAAMM;uBAC/BN,GArCE,CAACO,IACvB,IAAIC,EAAc,GAMlB,OAJID,IACAC,GAAe,cAGZA,EAAYC,OAAS,EAAID,EAAc,QA8BhBE,CAAkBV,EAAMW;;;MAGnDX,IACC,IAAIY,EAAe,GAyBnB,OAxBIZ,EAAMG,MACNS,GAAgBR,CAAG;;;;;;cAQnBQ,GAAgBR,CAAG;;;oCAGKJ,EAAMa,mBAAqB,MAAQ;;;;cAM3Db,EAAMa,qBACND,GAAgBR,CAAG;;eAKhBQ;EChEFE,EAAU,EACnBC,QAAO,EACPC,SACAC,iBACAC,WACAC,oBACAC,kBAAiB,EACjBC,qBAAoB,EACpBC,sBAAqB,EACrBrB,SACAsB,SAKA,MAAOC,EAAaC,GAAkBC,EAA6B,OAC5DC,EAAWC,GAAiBF,IAE7BG,EAAUC,IAEVC,EAAWD,EAAuB,MAClCE,EACFd,GAAYe,EAAMC,aAAahB,EAAU,CAAEiB,IAAKJ,IAE9CK,EAAgBb,EAChB,0BAA0BA,IAC1B,yBAKNc,GAAU,KACN,GAAItB,EAAM,CACN,MAAMY,EAAYW,IAGlB,GAFAC,EAAWZ,IAENA,EAAW,CACZ,MAAMa,EAAUC,YAAW,KACvBC,EAAoB,SACrB,KACH,MAAO,IAAMC,aAAaH,SAQ9B,IAAKX,EAAQe,QAAS,CAClB,MAAMJ,EAAUC,YAAW,KACvBC,EAAoB,SACrB,KACH,MAAO,IAAMC,aAAaH,MAGnC,CAACzB,IAEJsB,GAAU,KACNZ,EAAeoB,KAKf,MAAMlB,EAAYW,IAIlB,OAHAC,EAAWZ,GACNA,GAAWmB,IAET,KACHJ,EAAoB,aAEzB,IAKH,MAAMH,EAAcQ,IAChBlB,EAAQe,QAAUG,EAClBnB,EAAcmB,IAMZF,EAAiB,IACfG,UAAYhC,EACLgC,SAASC,eAAejC,GACxBgC,SAEAA,SAASE,KAET,KAITZ,EAAiB,IAKZU,SAASE,KAAKC,UAAUC,SAASC,GAGtCP,EAA+B,KAIjC,IAAKE,SAASC,eAAeK,GAAgB,CACzC,MAAMC,EAAoBP,SAASQ,cAAc,SACjDD,EAAkBhC,GAAK+B,EAEvB,MAAMG,EAAgBT,SAASU,gBAAgBC,YAEzCC,EADcC,OAAOC,WACUL,EAErCF,EAAkBQ,UAAY,cACnCV,8DAEeO,iHAKfP,sEAKKL,SAASE,KAAKc,YAAYT,KAO5Bb,EAAuBuB,IACzB,MAAMC,EAA6BlB,SAASE,KAAKC,UAAUC,SACvDC,GAGW,QAAXY,GAAqBC,EAEH,WAAXD,GAAuBC,GAC9BlB,SAASE,KAAKC,UAAUgB,OAAOd,GAF/BL,SAASE,KAAKC,UAAUiB,IAAIf,IAS9BgB,EAAsBC,IACxBA,EAAMC,iBAEN,MAAMC,EAAQzC,EAASa,SAAS6B,WAC5BD,GAAUA,EAAcpB,SAASkB,EAAMI,SAEhCzD,GAAkBK,GACzBL,KAiCR,OAAOO,EACDmD,EAASC,aAZXC,EAAChF,EACG,CAAA0B,GAAIa,EACS,cAAAA,EACNjC,MAAAY,EACPd,OAAQA,EACEC,SAAAyB,EAETT,SAAAA,GArBL2D,EAACxE,EAAO,CAAA,cACS,kBAAiBF,MACvBY,EACaT,mBAAAa,IAAsBQ,EAAY,GAAM,IAC3ChB,gBAAAS,qBACGC,EAAiByD,oBAChBxD,EACrByD,QAASV,WAERrC,MAiBsCR,GACzC,MAMJ8B,EAAgB,+BAChBD,EAAyB"}
1
+ {"version":3,"file":"index.js","sources":["../../src/overlay/overlay.styles.tsx","../../src/overlay/overlay.tsx"],"sourcesContent":["import styled, { css } from \"styled-components\";\nimport { StyleProps } from \"./types\";\n\nconst getBackdropFilter = (blur: boolean) => {\n let styleString = \"\";\n\n if (blur) {\n styleString += \"blur(10px)\";\n }\n\n return styleString.length > 0 ? styleString : \"none\";\n};\n\nexport const Root = styled.div<StyleProps>`\n position: fixed;\n left: 0;\n top: 0;\n height: 0;\n width: 0;\n visibility: hidden;\n z-index: ${(props) => {\n return props.zIndex || (props.$stacked ? 99999 : 99998);\n }};\n\n ${(props) => {\n if (props.$show) {\n return css`\n height: 100%;\n width: 100vw;\n visibility: visible;\n `;\n }\n }}\n`;\n\nexport const Wrapper = styled.div<StyleProps>`\n position: absolute;\n left: 0;\n top: 0;\n background-color: rgba(5, 1, 1, ${(props) => props.$backgroundOpacity});\n backdrop-filter: ${(props) => getBackdropFilter(props.$backgroundBlur)};\n transition: opacity 200ms ease;\n\n ${(props) => {\n let customStyles = \"\";\n if (props.$show) {\n customStyles += css`\n visibility: visible;\n opacity: 1;\n pointer-events: auto;\n height: 100%;\n width: 100vw;\n `;\n } else {\n customStyles += css`\n visibility: hidden;\n opacity: 0;\n transition-delay: ${props.$disableTransition ? \"0ms\" : \"400ms\"};\n pointer-events: none;\n height: 0;\n width: 0;\n `;\n }\n if (props.$disableTransition) {\n customStyles += css`\n transition: none;\n `;\n }\n\n return customStyles;\n }}\n`;\n","import React, { useEffect, useRef, useState } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { OverlayProps } from \"./types\";\nimport { Root, Wrapper } from \"./overlay.styles\";\n\nexport const Overlay = ({\n show = false,\n rootId,\n onOverlayClick,\n children,\n backgroundOpacity,\n backgroundBlur = true,\n disableTransition = false,\n enableOverlayClick = false,\n zIndex,\n id,\n}: OverlayProps): JSX.Element | null => {\n // =============================================================================\n // CONST, STATE, REF\n // =============================================================================\n const [rootElement, setRootElement] = useState<HTMLElement | null>(null);\n const [isStacked, _setIsStacked] = useState<boolean>();\n\n const stacked = useRef<boolean>();\n\n const childRef = useRef<HTMLDivElement>(null);\n const childWithRef =\n children && React.cloneElement(children, { ref: childRef });\n\n const overlayRootId = id\n ? `lifesg-ds-overlay-root-${id}`\n : \"lifesg-ds-overlay-root\";\n\n // =============================================================================\n // EFFECTS\n // =============================================================================\n useEffect(() => {\n if (show) {\n const isStacked = checkIfStacked();\n setStacked(isStacked);\n\n if (!isStacked) {\n const timerId = setTimeout(() => {\n applyBodyStyleClass(\"add\");\n }, 200); // Allow overlay animations to complete\n return () => clearTimeout(timerId);\n }\n } else {\n /**\n * Here we have to used the ref value to know if it is stacked\n * rather than checking for the presence of the overlay class\n * on <body>\n */\n if (!stacked.current) {\n const timerId = setTimeout(() => {\n applyBodyStyleClass(\"remove\");\n }, 200); // Allow overlay animations to complete\n return () => clearTimeout(timerId);\n }\n }\n }, [show]);\n\n useEffect(() => {\n setRootElement(getRootElement());\n\n /**\n * Only add stylesheet for a non-stacked overlay\n */\n const isStacked = checkIfStacked();\n setStacked(isStacked);\n if (!isStacked) addStylesheetForDocumentBody();\n\n return () => {\n applyBodyStyleClass(\"remove\");\n };\n }, []);\n\n // =============================================================================\n // REF FUNCTIONS\n // =============================================================================\n const setStacked = (data: boolean) => {\n stacked.current = data;\n _setIsStacked(data);\n };\n\n // =============================================================================\n // HELPER FUNCTIONS\n // =============================================================================\n const getRootElement = (): HTMLElement | null => {\n if (document && rootId) {\n return document.getElementById(rootId);\n } else if (document) {\n // If rootId not specified, we'll use body\n return document.body;\n } else {\n return null;\n }\n };\n\n const checkIfStacked = () => {\n /**\n * Check if the body style was altered before. If it was, then this is\n * a stacked overlay\n */\n return document.body.classList.contains(OVERLAY_OPEN_CLASSNAME);\n };\n\n const addStylesheetForDocumentBody = () => {\n /**\n * This stylesheet is to manipulate the <body>. We only add once\n */\n if (!document.getElementById(STYLESHEET_ID)) {\n const overlayStyleSheet = document.createElement(\"style\");\n overlayStyleSheet.id = STYLESHEET_ID;\n\n const documentWidth = document.documentElement.clientWidth;\n const windowWidth = window.innerWidth;\n const scrollBarWidth = windowWidth - documentWidth;\n\n overlayStyleSheet.innerHTML = `\n\t\t\t\t.${OVERLAY_OPEN_CLASSNAME} {\n\t\t\t\t\toverflow: hidden;\n\t\t\t\t\tpadding-right: ${scrollBarWidth}px !important;\n\t\t\t\t\t-ms-overflow-style: none;\n\t\t\t\t\tscrollbar-width: none;\n\t\t\t\t}\n\n\t\t\t\t.${OVERLAY_OPEN_CLASSNAME}::-webkit-scrollbar {\n\t\t\t\t\tdisplay: none;\n\t\t\t\t}\n\t\t\t`;\n\n document.body.appendChild(overlayStyleSheet);\n }\n };\n\n /**\n * This sets the style of <body> to hide the scrollbar\n */\n const applyBodyStyleClass = (action: \"add\" | \"remove\") => {\n const isOverlayStyleClassApplied = document.body.classList.contains(\n OVERLAY_OPEN_CLASSNAME\n );\n\n if (action === \"add\" && !isOverlayStyleClassApplied) {\n document.body.classList.add(OVERLAY_OPEN_CLASSNAME);\n } else if (action === \"remove\" && isOverlayStyleClassApplied) {\n document.body.classList.remove(OVERLAY_OPEN_CLASSNAME);\n }\n };\n\n // =============================================================================\n // EVENT HANDLERS\n // =============================================================================\n const handleWrapperClick = (event: React.MouseEvent<HTMLDivElement>) => {\n event.preventDefault();\n\n const modal = childRef.current?.firstChild;\n if (modal && (modal as any).contains(event.target)) {\n return;\n } else if (onOverlayClick && enableOverlayClick) {\n onOverlayClick();\n }\n };\n\n // =============================================================================\n // RENDER\n // =============================================================================\n const renderWrapper = () => (\n <Wrapper\n data-testid={\"overlay-wrapper\"}\n $show={show}\n $backgroundOpacity={backgroundOpacity || (isStacked ? 0.5 : 0.8)}\n $backgroundBlur={backgroundBlur}\n $disableTransition={disableTransition}\n $enableOverlayClick={enableOverlayClick}\n onClick={handleWrapperClick}\n >\n {childWithRef}\n </Wrapper>\n );\n\n const renderComponent = () => (\n <Root\n id={overlayRootId}\n data-testid={overlayRootId}\n $show={show}\n zIndex={zIndex}\n $stacked={isStacked}\n >\n {children && renderWrapper()}\n </Root>\n );\n\n return rootElement\n ? ReactDOM.createPortal(renderComponent(), rootElement)\n : null;\n};\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\nconst STYLESHEET_ID = \"lifesg-ds-overlay-stylesheet\";\nconst OVERLAY_OPEN_CLASSNAME = \"lifesg-ds-overlay-open\";\n"],"names":["Root","styled","div","props","zIndex","$stacked","$show","css","Wrapper","$backgroundOpacity","blur","styleString","length","getBackdropFilter","$backgroundBlur","customStyles","$disableTransition","Overlay","show","rootId","onOverlayClick","children","backgroundOpacity","backgroundBlur","disableTransition","enableOverlayClick","id","rootElement","setRootElement","useState","isStacked","_setIsStacked","stacked","useRef","childRef","childWithRef","React","cloneElement","ref","overlayRootId","useEffect","checkIfStacked","setStacked","timerId","setTimeout","applyBodyStyleClass","clearTimeout","current","getRootElement","addStylesheetForDocumentBody","data","document","getElementById","body","classList","contains","OVERLAY_OPEN_CLASSNAME","STYLESHEET_ID","overlayStyleSheet","createElement","documentWidth","documentElement","clientWidth","scrollBarWidth","window","innerWidth","innerHTML","appendChild","action","isOverlayStyleClassApplied","remove","add","handleWrapperClick","event","preventDefault","modal","firstChild","target","ReactDOM","createPortal","_jsx","$enableOverlayClick","onClick"],"mappings":"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"}
@@ -8,7 +8,7 @@ export interface OverlayProps {
8
8
  disableTransition?: boolean | undefined;
9
9
  enableOverlayClick?: boolean | undefined;
10
10
  zIndex?: number | undefined;
11
- onOverlayClick?: () => void | undefined;
11
+ onOverlayClick?: (() => void) | undefined;
12
12
  id?: string | undefined;
13
13
  }
14
14
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lifesg/react-design-system",
3
- "version": "1.0.0-alpha.2",
3
+ "version": "1.0.0-alpha.20",
4
4
  "description": "A component design system for LifeSG web apps",
5
5
  "main": "./cjs/index.js",
6
6
  "module": "./index.js",
@@ -28,5 +28,8 @@
28
28
  "eslint --fix"
29
29
  ]
30
30
  },
31
+ "dependencies": {
32
+ "@lifesg/react-icons": "^1.1.0"
33
+ },
31
34
  "private": false
32
35
  }
@@ -0,0 +1 @@
1
+ export declare const CountryData: (string | number | string[])[][];
@@ -0,0 +1 @@
1
+ export * from "./phone-number-input";