@lifesg/react-design-system 4.0.0-alpha.5 → 4.0.0-alpha.7

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 (910) hide show
  1. package/accordion/accordion.js.map +1 -1
  2. package/accordion/types.d.ts +1 -1
  3. package/alert/alert.js.map +1 -1
  4. package/alert/types.d.ts +2 -0
  5. package/animations/loading-dots/loading-dots.d.ts +5 -2
  6. package/animations/loading-dots/loading-dots.js.map +1 -1
  7. package/animations/loading-dots-spinner/loading-dots-spinner.d.ts +3 -0
  8. package/animations/loading-dots-spinner/loading-dots-spinner.js.map +1 -1
  9. package/animations/loading-dots-spinner/lottie-animation.d.ts +2 -2
  10. package/animations/loading-dots-spinner/lottie-animation.js.map +1 -1
  11. package/animations/loading-spinner/loading-spinner.d.ts +5 -2
  12. package/animations/loading-spinner/loading-spinner.js.map +1 -1
  13. package/animations/themed-loading-spinner/themed-loading-spinner.d.ts +5 -2
  14. package/animations/themed-loading-spinner/themed-loading-spinner.js.map +1 -1
  15. package/animations/types.d.ts +13 -6
  16. package/avatar/avatar.js.map +1 -1
  17. package/badge/badge.js.map +1 -1
  18. package/badge/types.d.ts +13 -2
  19. package/box-container/box-container.js.map +1 -1
  20. package/box-container/types.d.ts +2 -0
  21. package/breadcrumb/breadcrumb.d.ts +7 -0
  22. package/breadcrumb/breadcrumb.js.map +1 -1
  23. package/breadcrumb/types.d.ts +36 -0
  24. package/button/button.d.ts +1 -0
  25. package/button/button.js.map +1 -1
  26. package/button/types.d.ts +47 -9
  27. package/calendar/calendar.d.ts +3 -0
  28. package/calendar/calendar.js.map +1 -1
  29. package/calendar/types.d.ts +46 -10
  30. package/card/card.d.ts +1 -0
  31. package/card/card.js.map +1 -1
  32. package/card/types.d.ts +1 -0
  33. package/checkbox/checkbox.d.ts +3 -0
  34. package/checkbox/checkbox.js.map +1 -1
  35. package/checkbox/types.d.ts +23 -3
  36. package/cjs/accordion/accordion.js.map +1 -1
  37. package/cjs/alert/alert.js.map +1 -1
  38. package/cjs/animations/loading-dots/loading-dots.js.map +1 -1
  39. package/cjs/animations/loading-dots-spinner/loading-dots-spinner.js.map +1 -1
  40. package/cjs/animations/loading-dots-spinner/lottie-animation.js.map +1 -1
  41. package/cjs/animations/loading-spinner/loading-spinner.js.map +1 -1
  42. package/cjs/animations/themed-loading-spinner/themed-loading-spinner.js.map +1 -1
  43. package/cjs/avatar/avatar.js.map +1 -1
  44. package/cjs/badge/badge.js.map +1 -1
  45. package/cjs/box-container/box-container.js.map +1 -1
  46. package/cjs/breadcrumb/breadcrumb.js.map +1 -1
  47. package/cjs/button/button.js.map +1 -1
  48. package/cjs/calendar/calendar.js.map +1 -1
  49. package/cjs/card/card.js.map +1 -1
  50. package/cjs/checkbox/checkbox.js.map +1 -1
  51. package/cjs/countdown-timer/countdown-timer.js.map +1 -1
  52. package/cjs/dashed-border/dashed-border.js.map +1 -1
  53. package/cjs/data-table/data-table.js +1 -1
  54. package/cjs/data-table/data-table.js.map +1 -1
  55. package/cjs/data-table/data-table.styles.js +1 -1
  56. package/cjs/data-table/data-table.styles.js.map +1 -1
  57. package/cjs/data-table/data-table.styles_rxganh.css +27 -0
  58. package/cjs/date-input/date-input.js.map +1 -1
  59. package/cjs/date-navigator/date-navigator.js.map +1 -1
  60. package/cjs/date-range-input/date-range-input.js.map +1 -1
  61. package/cjs/divider/divider.js.map +1 -1
  62. package/cjs/drawer/drawer.js.map +1 -1
  63. package/cjs/e-signature/e-signature.js.map +1 -1
  64. package/cjs/error-display/error-display.js.map +1 -1
  65. package/cjs/external/dompurify/dist/purify.es.js +2 -2
  66. package/cjs/external/dompurify/dist/purify.es.js.map +1 -1
  67. package/cjs/external/lodash/_setCacheHas.js.map +1 -1
  68. package/cjs/external/lodash/lodash.js +1 -1
  69. package/cjs/external/lodash/lodash.js.map +1 -1
  70. package/cjs/feedback-rating/feedback-rating.js.map +1 -1
  71. package/cjs/file-download/file-download.js.map +1 -1
  72. package/cjs/file-upload/file-item-edit.js.map +1 -1
  73. package/cjs/file-upload/file-list/file-list.js.map +1 -1
  74. package/cjs/file-upload/file-list-item/file-list-item.js.map +1 -1
  75. package/cjs/file-upload/file-list-item/file-list-item.styles.js +1 -1
  76. package/cjs/file-upload/file-list-item/file-list-item.styles.js.map +1 -1
  77. package/cjs/file-upload/file-list-item/{file-list-item.styles_o8000f.css → file-list-item.styles_kgtfke.css} +1 -1
  78. package/cjs/file-upload/file-upload.js.map +1 -1
  79. package/cjs/filter/addons/filter-item-checkbox-helpers.js.map +1 -1
  80. package/cjs/filter/addons/filter-item-checkbox.js.map +1 -1
  81. package/cjs/filter/filter-item.js +1 -1
  82. package/cjs/filter/filter-item.js.map +1 -1
  83. package/cjs/filter/filter.js.map +1 -1
  84. package/cjs/footer/footer.js.map +1 -1
  85. package/cjs/form/form-custom-field/form-custom-field.js +2 -0
  86. package/cjs/form/form-custom-field/form-custom-field.js.map +1 -0
  87. package/cjs/form/form-date-input/form-date-input.js +2 -0
  88. package/cjs/form/form-date-input/form-date-input.js.map +1 -0
  89. package/cjs/form/form-date-range-input/form-date-range-input.js +2 -0
  90. package/cjs/form/form-date-range-input/form-date-range-input.js.map +1 -0
  91. package/cjs/form/form-e-signature/form-e-signature.js +2 -0
  92. package/cjs/form/form-e-signature/form-e-signature.js.map +1 -0
  93. package/cjs/form/form-histogram-slider/form-histogram-slider.js +2 -0
  94. package/cjs/form/form-histogram-slider/form-histogram-slider.js.map +1 -0
  95. package/cjs/form/form-input/form-input.js +2 -0
  96. package/cjs/form/form-input/form-input.js.map +1 -0
  97. package/cjs/form/form-input-group/form-input-group.js +2 -0
  98. package/cjs/form/form-input-group/form-input-group.js.map +1 -0
  99. package/cjs/form/form-label/form-label-addon.js +2 -0
  100. package/cjs/form/form-label/form-label-addon.js.map +1 -0
  101. package/cjs/form/form-label/form-label-addon.styles.js +2 -0
  102. package/cjs/form/form-label/form-label-addon.styles.js.map +1 -0
  103. package/cjs/form/form-label/form-label-addon.styles_aztasj.css +1 -0
  104. package/cjs/form/form-label/form-label.js +2 -0
  105. package/cjs/form/form-label/form-label.js.map +1 -0
  106. package/cjs/form/form-label/form-label.styles.js +2 -0
  107. package/cjs/form/form-label/form-label.styles.js.map +1 -0
  108. package/cjs/form/form-label/form-label.styles_180zf7j.css +6 -0
  109. package/cjs/form/form-masked-input/form-masked-input.js +2 -0
  110. package/cjs/form/form-masked-input/form-masked-input.js.map +1 -0
  111. package/cjs/form/form-multi-select/form-multi-select.js +2 -0
  112. package/cjs/form/form-multi-select/form-multi-select.js.map +1 -0
  113. package/cjs/form/form-nested-multi-select/form-nested-multi-select.js +2 -0
  114. package/cjs/form/form-nested-multi-select/form-nested-multi-select.js.map +1 -0
  115. package/cjs/form/form-nested-select/form-nested-select.js +2 -0
  116. package/cjs/form/form-nested-select/form-nested-select.js.map +1 -0
  117. package/cjs/form/form-otp-verification/form-otp-verification.js +2 -0
  118. package/cjs/form/form-otp-verification/form-otp-verification.js.map +1 -0
  119. package/cjs/form/form-phone-number-input/form-phone-number-input.js +2 -0
  120. package/cjs/form/form-phone-number-input/form-phone-number-input.js.map +1 -0
  121. package/cjs/form/form-predictive-text-input/form-predictive-text-input.js +2 -0
  122. package/cjs/form/form-predictive-text-input/form-predictive-text-input.js.map +1 -0
  123. package/cjs/form/form-range-select/form-range-select.js +2 -0
  124. package/cjs/form/form-range-select/form-range-select.js.map +1 -0
  125. package/cjs/form/form-range-slider/form-range-slider.js +2 -0
  126. package/cjs/form/form-range-slider/form-range-slider.js.map +1 -0
  127. package/cjs/form/form-select/form-select.js +2 -0
  128. package/cjs/form/form-select/form-select.js.map +1 -0
  129. package/cjs/form/form-select-histogram/form-select-histogram.js +2 -0
  130. package/cjs/form/form-select-histogram/form-select-histogram.js.map +1 -0
  131. package/cjs/form/form-slider/form-slider.js +2 -0
  132. package/cjs/form/form-slider/form-slider.js.map +1 -0
  133. package/cjs/form/form-textarea/form-textarea.js +2 -0
  134. package/cjs/form/form-textarea/form-textarea.js.map +1 -0
  135. package/cjs/form/form-textarea/form-textarea.styles.js +2 -0
  136. package/cjs/form/form-textarea/form-textarea.styles.js.map +1 -0
  137. package/cjs/form/form-textarea/form-textarea.styles_1kneyif.css +3 -0
  138. package/cjs/form/form-time-range-picker/form-time-range-picker.js +2 -0
  139. package/cjs/form/form-time-range-picker/form-time-range-picker.js.map +1 -0
  140. package/cjs/form/form-timepicker/form-timepicker.js +2 -0
  141. package/cjs/form/form-timepicker/form-timepicker.js.map +1 -0
  142. package/cjs/form/form-unit-number-input/form-unit-number-input.js +2 -0
  143. package/cjs/form/form-unit-number-input/form-unit-number-input.js.map +1 -0
  144. package/cjs/form/form-wrapper.js +1 -1
  145. package/cjs/form/form-wrapper.js.map +1 -1
  146. package/cjs/form/index.js +1 -1
  147. package/cjs/form/index.js.map +1 -1
  148. package/cjs/fullscreen-image-carousel/fullscreen-image-carousel.js +1 -1
  149. package/cjs/fullscreen-image-carousel/fullscreen-image-carousel.js.map +1 -1
  150. package/cjs/histogram-slider/histogram-slider.js.map +1 -1
  151. package/cjs/image-button/image-button.js.map +1 -1
  152. package/cjs/index.js +1 -1
  153. package/cjs/input/input.js.map +1 -1
  154. package/cjs/input-group/input-group.js.map +1 -1
  155. package/cjs/input-multi-select/input-multi-select.js.map +1 -1
  156. package/cjs/input-nested-multi-select/input-nested-multi-select.js.map +1 -1
  157. package/cjs/input-nested-select/input-nested-select.js.map +1 -1
  158. package/cjs/input-range-select/input-range-select.js.map +1 -1
  159. package/cjs/input-range-slider/input-range-slider.js.map +1 -1
  160. package/cjs/input-select/input-select.js.map +1 -1
  161. package/cjs/input-slider/input-slider.js.map +1 -1
  162. package/cjs/input-textarea/textarea.js.map +1 -1
  163. package/cjs/input-textarea/textarea.styles.js +1 -1
  164. package/cjs/input-textarea/textarea.styles.js.map +1 -1
  165. package/cjs/input-textarea/{textarea.styles_22z4n3.css → textarea.styles_q77m5x.css} +1 -1
  166. package/cjs/language-switcher/language-switcher.js.map +1 -1
  167. package/cjs/layout/index.js +1 -1
  168. package/cjs/layout/index.js.map +1 -1
  169. package/cjs/link-list/components/common.js.map +1 -1
  170. package/cjs/link-list/components/link-list-eager.js.map +1 -1
  171. package/cjs/link-list/components/link-list-lazy.js.map +1 -1
  172. package/cjs/link-list/link-list.js.map +1 -1
  173. package/cjs/local-nav/local-nav-dropdown/local-nav-dropdown.js.map +1 -1
  174. package/cjs/local-nav/local-nav-menu/local-nav-menu.js.map +1 -1
  175. package/cjs/markup/markup.js.map +1 -1
  176. package/cjs/masked-input/masked-input.js.map +1 -1
  177. package/cjs/masthead/masthead.js.map +1 -1
  178. package/cjs/menu/menu.js +1 -1
  179. package/cjs/menu/menu.js.map +1 -1
  180. package/cjs/modal/index.js.map +1 -1
  181. package/cjs/modal/modal-box.js +1 -1
  182. package/cjs/modal/modal-box.js.map +1 -1
  183. package/cjs/modal-v2/index.js +1 -1
  184. package/cjs/modal-v2/index.js.map +1 -1
  185. package/cjs/modal-v2/modal-v2.js +1 -1
  186. package/cjs/modal-v2/modal-v2.js.map +1 -1
  187. package/cjs/modal-v2/slots/card.js +1 -1
  188. package/cjs/modal-v2/slots/card.js.map +1 -1
  189. package/cjs/navbar/navbar.js.map +1 -1
  190. package/cjs/notification-banner/notification-banner-hoc.js.map +1 -1
  191. package/cjs/notification-banner/notification-banner.js.map +1 -1
  192. package/cjs/otp-input/otp-input.js +1 -1
  193. package/cjs/otp-input/otp-input.js.map +1 -1
  194. package/cjs/otp-verification/contact-input-section.js +1 -1
  195. package/cjs/otp-verification/contact-input-section.js.map +1 -1
  196. package/cjs/otp-verification/otp-verification.js.map +1 -1
  197. package/cjs/otp-verification/verification-section.js +1 -1
  198. package/cjs/otp-verification/verification-section.js.map +1 -1
  199. package/cjs/overlay/overlay.js.map +1 -1
  200. package/cjs/pagination/pagination.js.map +1 -1
  201. package/cjs/phone-number-input/phone-number-input.js.map +1 -1
  202. package/cjs/pill/pill.js.map +1 -1
  203. package/cjs/popover/popover-inline/popover-inline.js.map +1 -1
  204. package/cjs/popover/popover-trigger.js.map +1 -1
  205. package/cjs/popover/popover.js +1 -1
  206. package/cjs/popover/popover.js.map +1 -1
  207. package/cjs/predictive-text-input/predictive-text-input.js +1 -1
  208. package/cjs/predictive-text-input/predictive-text-input.js.map +1 -1
  209. package/cjs/progress-indicator/progress-indicator.js.map +1 -1
  210. package/cjs/radio-button/radio-button.js.map +1 -1
  211. package/cjs/schedule/schedule.js.map +1 -1
  212. package/cjs/schedule/shared/with-optional-popover.js +1 -1
  213. package/cjs/schedule/shared/with-optional-popover.js.map +1 -1
  214. package/cjs/select-histogram/select-histogram.js.map +1 -1
  215. package/cjs/shared/dropdown-list/dropdown-list.js +1 -1
  216. package/cjs/shared/dropdown-list/dropdown-list.js.map +1 -1
  217. package/cjs/shared/dropdown-wrapper/element-with-dropdown.js +1 -1
  218. package/cjs/shared/dropdown-wrapper/element-with-dropdown.js.map +1 -1
  219. package/cjs/sidenav/sidenav.js.map +1 -1
  220. package/cjs/singpass-button/singpass-button.js.map +1 -1
  221. package/cjs/smart-app-banner/smart-app-banner.js.map +1 -1
  222. package/cjs/tab/tab.js.map +1 -1
  223. package/cjs/table/table.js.map +1 -1
  224. package/cjs/table/table.styles.js +1 -1
  225. package/cjs/table/table.styles.js.map +1 -1
  226. package/cjs/table/{table.styles_1af5ipv.css → table.styles_1vjx31g.css} +1 -1
  227. package/cjs/tag/tag.js.map +1 -1
  228. package/cjs/text-list/index.js.map +1 -1
  229. package/cjs/theme/theme-provider/breakpoint.js +1 -1
  230. package/cjs/theme/theme-provider/breakpoint.js.map +1 -1
  231. package/cjs/theme/theme-provider/hooks.js.map +1 -1
  232. package/cjs/theme/theme-provider/index.js.map +1 -1
  233. package/cjs/theme/tokens/border.js.map +1 -1
  234. package/cjs/theme/tokens/breakpoint.js.map +1 -1
  235. package/cjs/theme/tokens/colour.js.map +1 -1
  236. package/cjs/theme/tokens/component.js.map +1 -1
  237. package/cjs/theme/tokens/font.js.map +1 -1
  238. package/cjs/theme/tokens/media-query.js.map +1 -1
  239. package/cjs/theme/tokens/motion.js.map +1 -1
  240. package/cjs/theme/tokens/radius.js.map +1 -1
  241. package/cjs/theme/tokens/shadow.js.map +1 -1
  242. package/cjs/theme/tokens/spacing.js.map +1 -1
  243. package/cjs/theme/types.js.map +1 -1
  244. package/cjs/theme/utils/css-variable.js.map +1 -1
  245. package/cjs/theme/utils/font.js.map +1 -1
  246. package/cjs/theme/utils/use-apply-styles.js +1 -1
  247. package/cjs/theme/utils/use-apply-styles.js.map +1 -1
  248. package/cjs/theme/utils/use-design-token-override.js.map +1 -1
  249. package/cjs/theme/utils/use-design-token.js.map +1 -1
  250. package/cjs/theme/utils/use-media-query.js.map +1 -1
  251. package/cjs/time-range-picker/combobox-picker/combobox-picker.js +1 -1
  252. package/cjs/time-range-picker/combobox-picker/combobox-picker.js.map +1 -1
  253. package/cjs/time-range-picker/common.styles.js +1 -1
  254. package/cjs/time-range-picker/common.styles.js.map +1 -1
  255. package/cjs/time-range-picker/{common.styles_1qwp4xa.css → common.styles_cnkkax.css} +2 -1
  256. package/cjs/time-range-picker/dial-picker/dial-picker.js +1 -1
  257. package/cjs/time-range-picker/dial-picker/dial-picker.js.map +1 -1
  258. package/cjs/time-range-picker/time-range-picker.js.map +1 -1
  259. package/cjs/time-slot-bar/time-slot-bar.js.map +1 -1
  260. package/cjs/time-slot-bar-week/time-slot-bar-week.js.map +1 -1
  261. package/cjs/time-slot-week-view/time-slot-week-view.js.map +1 -1
  262. package/cjs/timeline/timeline.js.map +1 -1
  263. package/cjs/timepicker/timepicker.js +1 -1
  264. package/cjs/timepicker/timepicker.js.map +1 -1
  265. package/cjs/timepicker/timepicker.styles.js +1 -1
  266. package/cjs/timepicker/timepicker.styles.js.map +1 -1
  267. package/cjs/timepicker/timepicker.styles_lyizvq.css +2 -0
  268. package/cjs/timetable/timetable-row/with-optional-popover.js +1 -1
  269. package/cjs/timetable/timetable-row/with-optional-popover.js.map +1 -1
  270. package/cjs/timetable/timetable.js +1 -1
  271. package/cjs/timetable/timetable.js.map +1 -1
  272. package/cjs/toast/toast.js.map +1 -1
  273. package/cjs/toggle/toggle.js.map +1 -1
  274. package/cjs/typography/index.js.map +1 -1
  275. package/cjs/uneditable-section/index.js.map +1 -1
  276. package/cjs/uneditable-section/section-item.js +1 -1
  277. package/cjs/uneditable-section/section-item.js.map +1 -1
  278. package/cjs/unit-number/unit-number-input.js.map +1 -1
  279. package/cjs/util/merge-refs.js.map +1 -1
  280. package/cjs/util/use-throttle.js +2 -0
  281. package/cjs/util/use-throttle.js.map +1 -0
  282. package/countdown-timer/countdown-timer.js.map +1 -1
  283. package/countdown-timer/types.d.ts +6 -6
  284. package/dashed-border/dashed-border.js.map +1 -1
  285. package/data-table/data-table.js +1 -1
  286. package/data-table/data-table.js.map +1 -1
  287. package/data-table/data-table.styles.d.ts +2 -1
  288. package/data-table/data-table.styles.js +1 -1
  289. package/data-table/data-table.styles.js.map +1 -1
  290. package/data-table/data-table.styles_rxganh.css +27 -0
  291. package/date-input/date-input.js.map +1 -1
  292. package/date-input/types.d.ts +1 -1
  293. package/date-navigator/date-navigator.js.map +1 -1
  294. package/date-navigator/types.d.ts +1 -1
  295. package/date-range-input/date-range-input.js.map +1 -1
  296. package/date-range-input/types.d.ts +2 -2
  297. package/divider/divider.js.map +1 -1
  298. package/divider/types.d.ts +1 -1
  299. package/docs/component-catalog.json +644 -0
  300. package/drawer/drawer.js.map +1 -1
  301. package/drawer/types.d.ts +1 -1
  302. package/e-signature/e-signature.js.map +1 -1
  303. package/e-signature/types.d.ts +1 -1
  304. package/error-display/error-display.js.map +1 -1
  305. package/external/dompurify/dist/purify.es.js +2 -2
  306. package/external/dompurify/dist/purify.es.js.map +1 -1
  307. package/external/lodash/_setCacheHas.js.map +1 -1
  308. package/external/lodash/lodash.js +1 -1
  309. package/external/lodash/lodash.js.map +1 -1
  310. package/feedback-rating/feedback-rating.js.map +1 -1
  311. package/file-download/file-download.js.map +1 -1
  312. package/file-download/types.d.ts +6 -1
  313. package/file-upload/file-item-edit.d.ts +1 -1
  314. package/file-upload/file-item-edit.js.map +1 -1
  315. package/file-upload/file-list/file-list.d.ts +1 -1
  316. package/file-upload/file-list/file-list.js.map +1 -1
  317. package/file-upload/file-list-item/file-list-item.d.ts +1 -1
  318. package/file-upload/file-list-item/file-list-item.js.map +1 -1
  319. package/file-upload/file-list-item/file-list-item.styles.js +1 -1
  320. package/file-upload/file-list-item/file-list-item.styles.js.map +1 -1
  321. package/file-upload/file-list-item/{file-list-item.styles_o8000f.css → file-list-item.styles_kgtfke.css} +1 -1
  322. package/file-upload/file-upload.js.map +1 -1
  323. package/file-upload/types.d.ts +6 -3
  324. package/filter/addons/filter-item-checkbox-helpers.d.ts +2 -2
  325. package/filter/addons/filter-item-checkbox-helpers.js.map +1 -1
  326. package/filter/addons/filter-item-checkbox.d.ts +1 -1
  327. package/filter/addons/filter-item-checkbox.js.map +1 -1
  328. package/filter/addons/internal-types.d.ts +12 -0
  329. package/filter/addons/types.d.ts +60 -9
  330. package/filter/filter-item.js +1 -1
  331. package/filter/filter-item.js.map +1 -1
  332. package/filter/filter.d.ts +1 -1
  333. package/filter/filter.js.map +1 -1
  334. package/filter/index.d.ts +1 -0
  335. package/filter/types.d.ts +36 -72
  336. package/footer/footer.js.map +1 -1
  337. package/form/form-custom-field/form-custom-field.js +2 -0
  338. package/form/form-custom-field/form-custom-field.js.map +1 -0
  339. package/form/form-custom-field/index.d.ts +2 -0
  340. package/form/form-custom-field/types.d.ts +7 -0
  341. package/form/form-date-input/form-date-input.js +2 -0
  342. package/form/form-date-input/form-date-input.js.map +1 -0
  343. package/form/form-date-input/index.d.ts +2 -0
  344. package/form/form-date-input/types.d.ts +8 -0
  345. package/form/form-date-range-input/form-date-range-input.js +2 -0
  346. package/form/form-date-range-input/form-date-range-input.js.map +1 -0
  347. package/form/form-date-range-input/index.d.ts +2 -0
  348. package/form/form-date-range-input/types.d.ts +8 -0
  349. package/form/form-e-signature/form-e-signature.js +2 -0
  350. package/form/form-e-signature/form-e-signature.js.map +1 -0
  351. package/form/form-e-signature/index.d.ts +2 -0
  352. package/form/form-e-signature/types.d.ts +8 -0
  353. package/form/form-histogram-slider/form-histogram-slider.js +2 -0
  354. package/form/form-histogram-slider/form-histogram-slider.js.map +1 -0
  355. package/form/form-histogram-slider/index.d.ts +2 -0
  356. package/form/form-histogram-slider/types.d.ts +8 -0
  357. package/form/form-input/form-input.js +2 -0
  358. package/form/form-input/form-input.js.map +1 -0
  359. package/form/form-input/index.d.ts +2 -0
  360. package/form/form-input/types.d.ts +8 -0
  361. package/form/form-input-group/form-input-group.js +2 -0
  362. package/form/form-input-group/form-input-group.js.map +1 -0
  363. package/form/form-input-group/index.d.ts +2 -0
  364. package/form/form-input-group/types.d.ts +10 -0
  365. package/form/form-label/form-label-addon.js +2 -0
  366. package/form/form-label/form-label-addon.js.map +1 -0
  367. package/form/form-label/form-label-addon.styles.js +2 -0
  368. package/form/form-label/form-label-addon.styles.js.map +1 -0
  369. package/form/form-label/form-label-addon.styles_aztasj.css +1 -0
  370. package/form/form-label/form-label.js +2 -0
  371. package/form/form-label/form-label.js.map +1 -0
  372. package/form/form-label/form-label.styles.js +2 -0
  373. package/form/form-label/form-label.styles.js.map +1 -0
  374. package/form/form-label/form-label.styles_180zf7j.css +6 -0
  375. package/form/form-label/index.d.ts +2 -0
  376. package/form/form-label/types.d.ts +39 -0
  377. package/form/form-masked-input/form-masked-input.js +2 -0
  378. package/form/form-masked-input/form-masked-input.js.map +1 -0
  379. package/form/form-masked-input/index.d.ts +2 -0
  380. package/form/form-masked-input/types.d.ts +8 -0
  381. package/form/form-multi-select/form-multi-select.js +2 -0
  382. package/form/form-multi-select/form-multi-select.js.map +1 -0
  383. package/form/form-multi-select/index.d.ts +2 -0
  384. package/form/form-multi-select/types.d.ts +10 -0
  385. package/form/form-nested-multi-select/form-nested-multi-select.js +2 -0
  386. package/form/form-nested-multi-select/form-nested-multi-select.js.map +1 -0
  387. package/form/form-nested-multi-select/index.d.ts +2 -0
  388. package/form/form-nested-multi-select/types.d.ts +11 -0
  389. package/form/form-nested-select/form-nested-select.js +2 -0
  390. package/form/form-nested-select/form-nested-select.js.map +1 -0
  391. package/form/form-nested-select/index.d.ts +2 -0
  392. package/form/form-nested-select/types.d.ts +11 -0
  393. package/form/{form-otp-verification.d.ts → form-otp-verification/form-otp-verification.d.ts} +1 -1
  394. package/form/form-otp-verification/form-otp-verification.js +2 -0
  395. package/form/form-otp-verification/form-otp-verification.js.map +1 -0
  396. package/form/form-otp-verification/index.d.ts +2 -0
  397. package/form/form-otp-verification/types.d.ts +1 -0
  398. package/form/form-phone-number-input/form-phone-number-input.js +2 -0
  399. package/form/form-phone-number-input/form-phone-number-input.js.map +1 -0
  400. package/form/form-phone-number-input/index.d.ts +2 -0
  401. package/form/form-phone-number-input/types.d.ts +8 -0
  402. package/form/form-predictive-text-input/form-predictive-text-input.js +2 -0
  403. package/form/form-predictive-text-input/form-predictive-text-input.js.map +1 -0
  404. package/form/form-predictive-text-input/index.d.ts +2 -0
  405. package/form/form-predictive-text-input/types.d.ts +10 -0
  406. package/form/form-range-select/form-range-select.js +2 -0
  407. package/form/form-range-select/form-range-select.js.map +1 -0
  408. package/form/form-range-select/index.d.ts +2 -0
  409. package/form/form-range-select/types.d.ts +10 -0
  410. package/form/form-range-slider/form-range-slider.js +2 -0
  411. package/form/form-range-slider/form-range-slider.js.map +1 -0
  412. package/form/form-range-slider/index.d.ts +2 -0
  413. package/form/form-range-slider/types.d.ts +8 -0
  414. package/form/form-select/form-select.js +2 -0
  415. package/form/form-select/form-select.js.map +1 -0
  416. package/form/form-select/index.d.ts +2 -0
  417. package/form/form-select/types.d.ts +10 -0
  418. package/form/form-select-histogram/form-select-histogram.js +2 -0
  419. package/form/form-select-histogram/form-select-histogram.js.map +1 -0
  420. package/form/form-select-histogram/index.d.ts +2 -0
  421. package/form/form-select-histogram/types.d.ts +8 -0
  422. package/form/form-slider/form-slider.js +2 -0
  423. package/form/form-slider/form-slider.js.map +1 -0
  424. package/form/form-slider/index.d.ts +2 -0
  425. package/form/form-slider/types.d.ts +8 -0
  426. package/form/form-textarea/form-textarea.js +2 -0
  427. package/form/form-textarea/form-textarea.js.map +1 -0
  428. package/form/form-textarea/form-textarea.styles.js +2 -0
  429. package/form/form-textarea/form-textarea.styles.js.map +1 -0
  430. package/form/form-textarea/form-textarea.styles_1kneyif.css +3 -0
  431. package/form/form-textarea/index.d.ts +2 -0
  432. package/form/form-textarea/types.d.ts +8 -0
  433. package/form/form-time-range-picker/form-time-range-picker.js +2 -0
  434. package/form/form-time-range-picker/form-time-range-picker.js.map +1 -0
  435. package/form/form-time-range-picker/index.d.ts +2 -0
  436. package/form/form-time-range-picker/types.d.ts +8 -0
  437. package/form/form-timepicker/form-timepicker.js +2 -0
  438. package/form/form-timepicker/form-timepicker.js.map +1 -0
  439. package/form/form-timepicker/index.d.ts +2 -0
  440. package/form/form-timepicker/types.d.ts +8 -0
  441. package/form/form-unit-number-input/form-unit-number-input.js +2 -0
  442. package/form/form-unit-number-input/form-unit-number-input.js.map +1 -0
  443. package/form/form-unit-number-input/index.d.ts +2 -0
  444. package/form/form-unit-number-input/types.d.ts +8 -0
  445. package/form/form-wrapper.js +1 -1
  446. package/form/form-wrapper.js.map +1 -1
  447. package/form/index.d.ts +104 -24
  448. package/form/index.js +1 -1
  449. package/form/index.js.map +1 -1
  450. package/form/types.d.ts +27 -85
  451. package/fullscreen-image-carousel/fullscreen-image-carousel.d.ts +7 -0
  452. package/fullscreen-image-carousel/fullscreen-image-carousel.js +1 -1
  453. package/fullscreen-image-carousel/fullscreen-image-carousel.js.map +1 -1
  454. package/fullscreen-image-carousel/types.d.ts +91 -3
  455. package/histogram-slider/histogram-slider.d.ts +6 -0
  456. package/histogram-slider/histogram-slider.js.map +1 -1
  457. package/histogram-slider/types.d.ts +63 -3
  458. package/image-button/image-button.d.ts +6 -0
  459. package/image-button/image-button.js.map +1 -1
  460. package/image-button/types.d.ts +11 -1
  461. package/index.js +1 -1
  462. package/input/input.d.ts +6 -0
  463. package/input/input.js.map +1 -1
  464. package/input/types.d.ts +38 -2
  465. package/input-group/input-group.d.ts +7 -0
  466. package/input-group/input-group.js.map +1 -1
  467. package/input-group/types.d.ts +84 -8
  468. package/input-multi-select/input-multi-select.d.ts +6 -0
  469. package/input-multi-select/input-multi-select.js.map +1 -1
  470. package/input-multi-select/types.d.ts +46 -5
  471. package/input-nested-multi-select/input-nested-multi-select.d.ts +8 -0
  472. package/input-nested-multi-select/input-nested-multi-select.js.map +1 -1
  473. package/input-nested-multi-select/types.d.ts +35 -5
  474. package/input-nested-select/input-nested-select.d.ts +9 -2
  475. package/input-nested-select/input-nested-select.js.map +1 -1
  476. package/input-nested-select/types.d.ts +77 -8
  477. package/input-range-select/input-range-select.d.ts +6 -0
  478. package/input-range-select/input-range-select.js.map +1 -1
  479. package/input-range-select/types.d.ts +68 -1
  480. package/input-range-slider/input-range-slider.d.ts +7 -0
  481. package/input-range-slider/input-range-slider.js.map +1 -1
  482. package/input-range-slider/types.d.ts +91 -6
  483. package/input-select/input-select.d.ts +5 -0
  484. package/input-select/input-select.js.map +1 -1
  485. package/input-select/types.d.ts +70 -14
  486. package/input-slider/input-slider.d.ts +6 -0
  487. package/input-slider/input-slider.js.map +1 -1
  488. package/input-slider/types.d.ts +21 -2
  489. package/input-textarea/textarea.d.ts +3 -0
  490. package/input-textarea/textarea.js.map +1 -1
  491. package/input-textarea/textarea.styles.js +1 -1
  492. package/input-textarea/textarea.styles.js.map +1 -1
  493. package/input-textarea/{textarea.styles_22z4n3.css → textarea.styles_q77m5x.css} +1 -1
  494. package/input-textarea/types.d.ts +24 -1
  495. package/language-switcher/language-switcher.d.ts +6 -0
  496. package/language-switcher/language-switcher.js.map +1 -1
  497. package/language-switcher/types.d.ts +23 -0
  498. package/layout/index.d.ts +16 -2
  499. package/layout/index.js +1 -1
  500. package/layout/index.js.map +1 -1
  501. package/layout/types.d.ts +61 -3
  502. package/link-list/components/common.d.ts +1 -1
  503. package/link-list/components/common.js.map +1 -1
  504. package/link-list/components/link-list-eager.d.ts +2 -2
  505. package/link-list/components/link-list-eager.js.map +1 -1
  506. package/link-list/components/link-list-lazy.d.ts +2 -2
  507. package/link-list/components/link-list-lazy.js.map +1 -1
  508. package/link-list/link-list.d.ts +6 -0
  509. package/link-list/link-list.js.map +1 -1
  510. package/link-list/types.d.ts +92 -3
  511. package/local-nav/local-nav-dropdown/local-nav-dropdown.d.ts +11 -0
  512. package/local-nav/local-nav-dropdown/local-nav-dropdown.js.map +1 -1
  513. package/local-nav/local-nav-menu/local-nav-menu.d.ts +6 -0
  514. package/local-nav/local-nav-menu/local-nav-menu.js.map +1 -1
  515. package/local-nav/types.d.ts +51 -0
  516. package/markup/markup.d.ts +6 -0
  517. package/markup/markup.js.map +1 -1
  518. package/markup/types.d.ts +6 -2
  519. package/masked-input/masked-input.d.ts +6 -0
  520. package/masked-input/masked-input.js.map +1 -1
  521. package/masked-input/types.d.ts +83 -8
  522. package/masthead/masthead.d.ts +6 -0
  523. package/masthead/masthead.js.map +1 -1
  524. package/masthead/types.d.ts +9 -0
  525. package/menu/menu.d.ts +27 -4
  526. package/menu/menu.js +1 -1
  527. package/menu/menu.js.map +1 -1
  528. package/menu/types.d.ts +49 -1
  529. package/modal/index.d.ts +13 -0
  530. package/modal/index.js.map +1 -1
  531. package/modal/modal-box.js +1 -1
  532. package/modal/modal-box.js.map +1 -1
  533. package/modal/types.d.ts +56 -7
  534. package/modal-v2/index.d.ts +1 -15
  535. package/modal-v2/index.js +1 -1
  536. package/modal-v2/index.js.map +1 -1
  537. package/modal-v2/modal-v2.d.ts +32 -1
  538. package/modal-v2/modal-v2.js +1 -1
  539. package/modal-v2/modal-v2.js.map +1 -1
  540. package/modal-v2/slots/card.js +1 -1
  541. package/modal-v2/slots/card.js.map +1 -1
  542. package/modal-v2/types.d.ts +92 -8
  543. package/navbar/navbar.d.ts +7 -0
  544. package/navbar/navbar.js.map +1 -1
  545. package/navbar/types.d.ts +201 -13
  546. package/notification-banner/notification-banner-hoc.d.ts +6 -0
  547. package/notification-banner/notification-banner-hoc.js.map +1 -1
  548. package/notification-banner/notification-banner.d.ts +7 -0
  549. package/notification-banner/notification-banner.js.map +1 -1
  550. package/notification-banner/types.d.ts +57 -2
  551. package/otp-input/otp-input.d.ts +7 -0
  552. package/otp-input/otp-input.js +1 -1
  553. package/otp-input/otp-input.js.map +1 -1
  554. package/otp-input/types.d.ts +63 -15
  555. package/otp-verification/contact-input-section.js +1 -1
  556. package/otp-verification/contact-input-section.js.map +1 -1
  557. package/otp-verification/internal-types.d.ts +22 -5
  558. package/otp-verification/otp-verification.d.ts +6 -0
  559. package/otp-verification/otp-verification.js.map +1 -1
  560. package/otp-verification/types.d.ts +125 -6
  561. package/otp-verification/verification-section.js +1 -1
  562. package/otp-verification/verification-section.js.map +1 -1
  563. package/overlay/overlay.d.ts +7 -0
  564. package/overlay/overlay.js.map +1 -1
  565. package/overlay/types.d.ts +57 -2
  566. package/package.json +1 -1
  567. package/pagination/pagination.d.ts +5 -0
  568. package/pagination/pagination.js.map +1 -1
  569. package/pagination/types.d.ts +48 -0
  570. package/phone-number-input/phone-number-input.d.ts +7 -0
  571. package/phone-number-input/phone-number-input.js.map +1 -1
  572. package/phone-number-input/types.d.ts +78 -13
  573. package/pill/pill.d.ts +6 -0
  574. package/pill/pill.js.map +1 -1
  575. package/pill/types.d.ts +19 -0
  576. package/popover/popover-inline/index.d.ts +1 -0
  577. package/popover/popover-inline/popover-inline.d.ts +6 -1
  578. package/popover/popover-inline/popover-inline.js.map +1 -1
  579. package/popover/popover-inline/types.d.ts +36 -0
  580. package/popover/popover-trigger.d.ts +6 -0
  581. package/popover/popover-trigger.js.map +1 -1
  582. package/popover/popover.d.ts +6 -0
  583. package/popover/popover.js +1 -1
  584. package/popover/popover.js.map +1 -1
  585. package/popover/types.d.ts +125 -11
  586. package/predictive-text-input/predictive-text-input.d.ts +6 -0
  587. package/predictive-text-input/predictive-text-input.js +1 -1
  588. package/predictive-text-input/predictive-text-input.js.map +1 -1
  589. package/predictive-text-input/types.d.ts +65 -11
  590. package/progress-indicator/progress-indicator.d.ts +7 -0
  591. package/progress-indicator/progress-indicator.js.map +1 -1
  592. package/progress-indicator/types.d.ts +18 -0
  593. package/radio-button/radio-button.d.ts +5 -0
  594. package/radio-button/radio-button.js.map +1 -1
  595. package/radio-button/types.d.ts +14 -0
  596. package/schedule/internal-types.d.ts +18 -0
  597. package/schedule/schedule-day-view/types.d.ts +2 -1
  598. package/schedule/schedule-week-view/types.d.ts +2 -1
  599. package/schedule/schedule.d.ts +3 -0
  600. package/schedule/schedule.js.map +1 -1
  601. package/schedule/shared/with-optional-popover.js +1 -1
  602. package/schedule/shared/with-optional-popover.js.map +1 -1
  603. package/schedule/types.d.ts +129 -10
  604. package/select-histogram/select-histogram.d.ts +5 -0
  605. package/select-histogram/select-histogram.js.map +1 -1
  606. package/select-histogram/types.d.ts +57 -4
  607. package/shared/dropdown-list/dropdown-list.js +1 -1
  608. package/shared/dropdown-list/dropdown-list.js.map +1 -1
  609. package/shared/dropdown-list/types.d.ts +52 -19
  610. package/shared/dropdown-wrapper/element-with-dropdown.d.ts +5 -4
  611. package/shared/dropdown-wrapper/element-with-dropdown.js +1 -1
  612. package/shared/dropdown-wrapper/element-with-dropdown.js.map +1 -1
  613. package/shared/dropdown-wrapper/types.d.ts +6 -0
  614. package/sidenav/sidenav.d.ts +10 -0
  615. package/sidenav/sidenav.js.map +1 -1
  616. package/sidenav/types.d.ts +71 -21
  617. package/singpass-button/singpass-button.d.ts +6 -0
  618. package/singpass-button/singpass-button.js.map +1 -1
  619. package/singpass-button/types.d.ts +29 -2
  620. package/smart-app-banner/smart-app-banner.d.ts +5 -0
  621. package/smart-app-banner/smart-app-banner.js.map +1 -1
  622. package/smart-app-banner/types.d.ts +56 -0
  623. package/tab/tab.d.ts +7 -0
  624. package/tab/tab.js.map +1 -1
  625. package/tab/types.d.ts +55 -6
  626. package/table/table.d.ts +30 -8
  627. package/table/table.js.map +1 -1
  628. package/table/table.styles.js +1 -1
  629. package/table/table.styles.js.map +1 -1
  630. package/table/{table.styles_1af5ipv.css → table.styles_1vjx31g.css} +1 -1
  631. package/table/types.d.ts +35 -0
  632. package/tag/tag.d.ts +5 -0
  633. package/tag/tag.js.map +1 -1
  634. package/tag/types.d.ts +24 -0
  635. package/text-list/index.d.ts +17 -0
  636. package/text-list/index.js.map +1 -1
  637. package/text-list/types.d.ts +33 -4
  638. package/theme/theme-provider/breakpoint.d.ts +0 -1
  639. package/theme/theme-provider/breakpoint.js +1 -1
  640. package/theme/theme-provider/breakpoint.js.map +1 -1
  641. package/theme/theme-provider/hooks.d.ts +16 -0
  642. package/theme/theme-provider/hooks.js.map +1 -1
  643. package/theme/theme-provider/index.d.ts +7 -0
  644. package/theme/theme-provider/index.js.map +1 -1
  645. package/theme/theme-provider/types.d.ts +14 -0
  646. package/theme/tokens/border.d.ts +9 -0
  647. package/theme/tokens/border.js.map +1 -1
  648. package/theme/tokens/breakpoint.d.ts +3 -0
  649. package/theme/tokens/breakpoint.js.map +1 -1
  650. package/theme/tokens/colour.d.ts +9 -0
  651. package/theme/tokens/colour.js.map +1 -1
  652. package/theme/tokens/component.d.ts +3 -0
  653. package/theme/tokens/component.js.map +1 -1
  654. package/theme/tokens/font.d.ts +6 -0
  655. package/theme/tokens/font.js.map +1 -1
  656. package/theme/tokens/media-query.d.ts +3 -0
  657. package/theme/tokens/media-query.js.map +1 -1
  658. package/theme/tokens/motion.d.ts +3 -0
  659. package/theme/tokens/motion.js.map +1 -1
  660. package/theme/tokens/radius.d.ts +3 -0
  661. package/theme/tokens/radius.js.map +1 -1
  662. package/theme/tokens/shadow.d.ts +3 -0
  663. package/theme/tokens/shadow.js.map +1 -1
  664. package/theme/tokens/spacing.d.ts +3 -0
  665. package/theme/tokens/spacing.js.map +1 -1
  666. package/theme/types.d.ts +23 -3
  667. package/theme/types.js.map +1 -1
  668. package/theme/utils/css-variable.d.ts +10 -2
  669. package/theme/utils/css-variable.js.map +1 -1
  670. package/theme/utils/font.d.ts +2 -1
  671. package/theme/utils/font.js.map +1 -1
  672. package/theme/utils/use-apply-styles.d.ts +8 -2
  673. package/theme/utils/use-apply-styles.js +1 -1
  674. package/theme/utils/use-apply-styles.js.map +1 -1
  675. package/theme/utils/use-design-token-override.d.ts +9 -1
  676. package/theme/utils/use-design-token-override.js.map +1 -1
  677. package/theme/utils/use-design-token.d.ts +9 -0
  678. package/theme/utils/use-design-token.js.map +1 -1
  679. package/theme/utils/use-media-query.d.ts +41 -3
  680. package/theme/utils/use-media-query.js.map +1 -1
  681. package/time-range-picker/combobox-picker/combobox-picker.js +1 -1
  682. package/time-range-picker/combobox-picker/combobox-picker.js.map +1 -1
  683. package/time-range-picker/common.styles.d.ts +1 -0
  684. package/time-range-picker/common.styles.js +1 -1
  685. package/time-range-picker/common.styles.js.map +1 -1
  686. package/time-range-picker/{common.styles_1qwp4xa.css → common.styles_cnkkax.css} +2 -1
  687. package/time-range-picker/dial-picker/dial-picker.js +1 -1
  688. package/time-range-picker/dial-picker/dial-picker.js.map +1 -1
  689. package/time-range-picker/time-range-picker.d.ts +5 -0
  690. package/time-range-picker/time-range-picker.js.map +1 -1
  691. package/time-range-picker/types.d.ts +85 -25
  692. package/time-slot-bar/internal-types.d.ts +1 -0
  693. package/time-slot-bar/time-slot-bar.d.ts +7 -0
  694. package/time-slot-bar/time-slot-bar.js.map +1 -1
  695. package/time-slot-bar/types.d.ts +116 -20
  696. package/time-slot-bar-week/time-slot-bar-week.d.ts +8 -0
  697. package/time-slot-bar-week/time-slot-bar-week.js.map +1 -1
  698. package/time-slot-bar-week/types.d.ts +80 -13
  699. package/time-slot-week-view/time-slot-week-view.d.ts +7 -0
  700. package/time-slot-week-view/time-slot-week-view.js.map +1 -1
  701. package/time-slot-week-view/types.d.ts +55 -10
  702. package/timeline/timeline.d.ts +6 -0
  703. package/timeline/timeline.js.map +1 -1
  704. package/timeline/types.d.ts +58 -4
  705. package/timepicker/timepicker.d.ts +5 -0
  706. package/timepicker/timepicker.js +1 -1
  707. package/timepicker/timepicker.js.map +1 -1
  708. package/timepicker/timepicker.styles.d.ts +1 -0
  709. package/timepicker/timepicker.styles.js +1 -1
  710. package/timepicker/timepicker.styles.js.map +1 -1
  711. package/timepicker/timepicker.styles_lyizvq.css +2 -0
  712. package/timepicker/types.d.ts +49 -14
  713. package/timetable/timetable-row/with-optional-popover.js +1 -1
  714. package/timetable/timetable-row/with-optional-popover.js.map +1 -1
  715. package/timetable/timetable.d.ts +6 -0
  716. package/timetable/timetable.js +1 -1
  717. package/timetable/timetable.js.map +1 -1
  718. package/timetable/types.d.ts +175 -50
  719. package/toast/toast.d.ts +6 -0
  720. package/toast/toast.js.map +1 -1
  721. package/toast/types.d.ts +44 -8
  722. package/toggle/toggle.d.ts +6 -0
  723. package/toggle/toggle.js.map +1 -1
  724. package/toggle/types.d.ts +95 -17
  725. package/tools/shared/generated-file-formatter.d.ts +6 -0
  726. package/tools/shared/jsdoc-parser.d.ts +36 -0
  727. package/tools/shared/ts-morph-project-factory.d.ts +9 -0
  728. package/tools/shared/typescript-source-provider.d.ts +9 -0
  729. package/tools/storybook-argtypes/adapters/file-system-adapter.d.ts +69 -0
  730. package/tools/storybook-argtypes/arg-types-generator.d.ts +85 -0
  731. package/tools/storybook-argtypes/config/arg-types-config.d.ts +31 -0
  732. package/tools/storybook-argtypes/index.d.ts +11 -0
  733. package/tools/storybook-argtypes/services/arg-types-row-builder.d.ts +43 -0
  734. package/tools/storybook-argtypes/services/file-path-resolver.d.ts +118 -0
  735. package/tools/storybook-argtypes/services/index.d.ts +6 -0
  736. package/tools/storybook-argtypes/services/jsdoc-metadata-extractor.d.ts +33 -0
  737. package/tools/storybook-argtypes/services/story-registry-generator.d.ts +27 -0
  738. package/tools/storybook-argtypes/services/type-dependency-resolver.d.ts +46 -0
  739. package/tools/storybook-argtypes/services/type-formatting-service.d.ts +27 -0
  740. package/tools/storybook-argtypes/types.d.ts +102 -0
  741. package/typography/index.d.ts +29 -0
  742. package/typography/index.js.map +1 -1
  743. package/typography/types.d.ts +51 -8
  744. package/uneditable-section/index.d.ts +15 -0
  745. package/uneditable-section/index.js.map +1 -1
  746. package/uneditable-section/section-item.js +1 -1
  747. package/uneditable-section/section-item.js.map +1 -1
  748. package/uneditable-section/types.d.ts +66 -23
  749. package/unit-number/types.d.ts +30 -4
  750. package/unit-number/unit-number-input.d.ts +6 -0
  751. package/unit-number/unit-number-input.js.map +1 -1
  752. package/util/index.d.ts +1 -0
  753. package/util/merge-refs.d.ts +1 -1
  754. package/util/merge-refs.js.map +1 -1
  755. package/util/use-throttle.d.ts +1 -0
  756. package/util/use-throttle.js +2 -0
  757. package/util/use-throttle.js.map +1 -0
  758. package/cjs/data-table/data-table.styles_1iqq1g7.css +0 -26
  759. package/cjs/form/form-custom-field.js +0 -2
  760. package/cjs/form/form-custom-field.js.map +0 -1
  761. package/cjs/form/form-date-input.js +0 -2
  762. package/cjs/form/form-date-input.js.map +0 -1
  763. package/cjs/form/form-date-range-input.js +0 -2
  764. package/cjs/form/form-date-range-input.js.map +0 -1
  765. package/cjs/form/form-e-signature.js +0 -2
  766. package/cjs/form/form-e-signature.js.map +0 -1
  767. package/cjs/form/form-histogram.js +0 -2
  768. package/cjs/form/form-histogram.js.map +0 -1
  769. package/cjs/form/form-input-group.js +0 -2
  770. package/cjs/form/form-input-group.js.map +0 -1
  771. package/cjs/form/form-input.js +0 -2
  772. package/cjs/form/form-input.js.map +0 -1
  773. package/cjs/form/form-label-addon.js +0 -2
  774. package/cjs/form/form-label-addon.js.map +0 -1
  775. package/cjs/form/form-label-addon.styles.js +0 -2
  776. package/cjs/form/form-label-addon.styles.js.map +0 -1
  777. package/cjs/form/form-label-addon.styles_b00z8p.css +0 -1
  778. package/cjs/form/form-label.js +0 -2
  779. package/cjs/form/form-label.js.map +0 -1
  780. package/cjs/form/form-label.styles.js +0 -2
  781. package/cjs/form/form-label.styles.js.map +0 -1
  782. package/cjs/form/form-label.styles_1nbe0bm.css +0 -6
  783. package/cjs/form/form-masked-input.js +0 -2
  784. package/cjs/form/form-masked-input.js.map +0 -1
  785. package/cjs/form/form-multi-select.js +0 -2
  786. package/cjs/form/form-multi-select.js.map +0 -1
  787. package/cjs/form/form-nested-multi-select.js +0 -2
  788. package/cjs/form/form-nested-multi-select.js.map +0 -1
  789. package/cjs/form/form-nested-select.js +0 -2
  790. package/cjs/form/form-nested-select.js.map +0 -1
  791. package/cjs/form/form-otp-verification.js +0 -2
  792. package/cjs/form/form-otp-verification.js.map +0 -1
  793. package/cjs/form/form-phone-number-input.js +0 -2
  794. package/cjs/form/form-phone-number-input.js.map +0 -1
  795. package/cjs/form/form-predictive-text-input.js +0 -2
  796. package/cjs/form/form-predictive-text-input.js.map +0 -1
  797. package/cjs/form/form-range-select.js +0 -2
  798. package/cjs/form/form-range-select.js.map +0 -1
  799. package/cjs/form/form-range-slider.js +0 -2
  800. package/cjs/form/form-range-slider.js.map +0 -1
  801. package/cjs/form/form-select-histogram.js +0 -2
  802. package/cjs/form/form-select-histogram.js.map +0 -1
  803. package/cjs/form/form-select.js +0 -2
  804. package/cjs/form/form-select.js.map +0 -1
  805. package/cjs/form/form-slider.js +0 -2
  806. package/cjs/form/form-slider.js.map +0 -1
  807. package/cjs/form/form-textarea.js +0 -2
  808. package/cjs/form/form-textarea.js.map +0 -1
  809. package/cjs/form/form-textarea.styles.js +0 -2
  810. package/cjs/form/form-textarea.styles.js.map +0 -1
  811. package/cjs/form/form-textarea.styles_3p9qoy.css +0 -3
  812. package/cjs/form/form-time-range-picker.js +0 -2
  813. package/cjs/form/form-time-range-picker.js.map +0 -1
  814. package/cjs/form/form-timepicker.js +0 -2
  815. package/cjs/form/form-timepicker.js.map +0 -1
  816. package/cjs/form/form-unit-number-input.js +0 -2
  817. package/cjs/form/form-unit-number-input.js.map +0 -1
  818. package/cjs/timepicker/timepicker.styles_1jm33yw.css +0 -1
  819. package/data-table/data-table.styles_1iqq1g7.css +0 -26
  820. package/form/form-custom-field.js +0 -2
  821. package/form/form-custom-field.js.map +0 -1
  822. package/form/form-date-input.js +0 -2
  823. package/form/form-date-input.js.map +0 -1
  824. package/form/form-date-range-input.js +0 -2
  825. package/form/form-date-range-input.js.map +0 -1
  826. package/form/form-e-signature.js +0 -2
  827. package/form/form-e-signature.js.map +0 -1
  828. package/form/form-histogram.js +0 -2
  829. package/form/form-histogram.js.map +0 -1
  830. package/form/form-input-group.js +0 -2
  831. package/form/form-input-group.js.map +0 -1
  832. package/form/form-input.js +0 -2
  833. package/form/form-input.js.map +0 -1
  834. package/form/form-label-addon.js +0 -2
  835. package/form/form-label-addon.js.map +0 -1
  836. package/form/form-label-addon.styles.js +0 -2
  837. package/form/form-label-addon.styles.js.map +0 -1
  838. package/form/form-label-addon.styles_b00z8p.css +0 -1
  839. package/form/form-label.js +0 -2
  840. package/form/form-label.js.map +0 -1
  841. package/form/form-label.styles.js +0 -2
  842. package/form/form-label.styles.js.map +0 -1
  843. package/form/form-label.styles_1nbe0bm.css +0 -6
  844. package/form/form-masked-input.js +0 -2
  845. package/form/form-masked-input.js.map +0 -1
  846. package/form/form-multi-select.js +0 -2
  847. package/form/form-multi-select.js.map +0 -1
  848. package/form/form-nested-multi-select.js +0 -2
  849. package/form/form-nested-multi-select.js.map +0 -1
  850. package/form/form-nested-select.js +0 -2
  851. package/form/form-nested-select.js.map +0 -1
  852. package/form/form-otp-verification.js +0 -2
  853. package/form/form-otp-verification.js.map +0 -1
  854. package/form/form-phone-number-input.js +0 -2
  855. package/form/form-phone-number-input.js.map +0 -1
  856. package/form/form-predictive-text-input.js +0 -2
  857. package/form/form-predictive-text-input.js.map +0 -1
  858. package/form/form-range-select.js +0 -2
  859. package/form/form-range-select.js.map +0 -1
  860. package/form/form-range-slider.js +0 -2
  861. package/form/form-range-slider.js.map +0 -1
  862. package/form/form-select-histogram.js +0 -2
  863. package/form/form-select-histogram.js.map +0 -1
  864. package/form/form-select.js +0 -2
  865. package/form/form-select.js.map +0 -1
  866. package/form/form-slider.js +0 -2
  867. package/form/form-slider.js.map +0 -1
  868. package/form/form-textarea.js +0 -2
  869. package/form/form-textarea.js.map +0 -1
  870. package/form/form-textarea.styles.js +0 -2
  871. package/form/form-textarea.styles.js.map +0 -1
  872. package/form/form-textarea.styles_3p9qoy.css +0 -3
  873. package/form/form-time-range-picker.js +0 -2
  874. package/form/form-time-range-picker.js.map +0 -1
  875. package/form/form-timepicker.js +0 -2
  876. package/form/form-timepicker.js.map +0 -1
  877. package/form/form-unit-number-input.js +0 -2
  878. package/form/form-unit-number-input.js.map +0 -1
  879. package/link-list/internal-types.d.ts +0 -31
  880. package/timepicker/timepicker.styles_1jm33yw.css +0 -1
  881. /package/{codemod-utils.d.ts → codemods/codemod-utils.d.ts} +0 -0
  882. /package/{migrate-popover → codemods/migrate-popover}/index.d.ts +0 -0
  883. /package/{run-codemod.d.ts → codemods/run-codemod.d.ts} +0 -0
  884. /package/form/{form-custom-field.d.ts → form-custom-field/form-custom-field.d.ts} +0 -0
  885. /package/form/{form-date-input.d.ts → form-date-input/form-date-input.d.ts} +0 -0
  886. /package/form/{form-date-range-input.d.ts → form-date-range-input/form-date-range-input.d.ts} +0 -0
  887. /package/form/{form-e-signature.d.ts → form-e-signature/form-e-signature.d.ts} +0 -0
  888. /package/form/{form-histogram.d.ts → form-histogram-slider/form-histogram-slider.d.ts} +0 -0
  889. /package/form/{form-input.d.ts → form-input/form-input.d.ts} +0 -0
  890. /package/form/{form-input-group.d.ts → form-input-group/form-input-group.d.ts} +0 -0
  891. /package/form/{form-label-addon.d.ts → form-label/form-label-addon.d.ts} +0 -0
  892. /package/form/{form-label-addon.styles.d.ts → form-label/form-label-addon.styles.d.ts} +0 -0
  893. /package/form/{form-label.d.ts → form-label/form-label.d.ts} +0 -0
  894. /package/form/{form-label.styles.d.ts → form-label/form-label.styles.d.ts} +0 -0
  895. /package/form/{form-masked-input.d.ts → form-masked-input/form-masked-input.d.ts} +0 -0
  896. /package/form/{form-multi-select.d.ts → form-multi-select/form-multi-select.d.ts} +0 -0
  897. /package/form/{form-nested-multi-select.d.ts → form-nested-multi-select/form-nested-multi-select.d.ts} +0 -0
  898. /package/form/{form-nested-select.d.ts → form-nested-select/form-nested-select.d.ts} +0 -0
  899. /package/form/{form-phone-number-input.d.ts → form-phone-number-input/form-phone-number-input.d.ts} +0 -0
  900. /package/form/{form-predictive-text-input.d.ts → form-predictive-text-input/form-predictive-text-input.d.ts} +0 -0
  901. /package/form/{form-range-select.d.ts → form-range-select/form-range-select.d.ts} +0 -0
  902. /package/form/{form-range-slider.d.ts → form-range-slider/form-range-slider.d.ts} +0 -0
  903. /package/form/{form-select.d.ts → form-select/form-select.d.ts} +0 -0
  904. /package/form/{form-select-histogram.d.ts → form-select-histogram/form-select-histogram.d.ts} +0 -0
  905. /package/form/{form-slider.d.ts → form-slider/form-slider.d.ts} +0 -0
  906. /package/form/{form-textarea.d.ts → form-textarea/form-textarea.d.ts} +0 -0
  907. /package/form/{form-textarea.styles.d.ts → form-textarea/form-textarea.styles.d.ts} +0 -0
  908. /package/form/{form-time-range-picker.d.ts → form-time-range-picker/form-time-range-picker.d.ts} +0 -0
  909. /package/form/{form-timepicker.d.ts → form-timepicker/form-timepicker.d.ts} +0 -0
  910. /package/form/{form-unit-number-input.d.ts → form-unit-number-input/form-unit-number-input.d.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"notification-banner.js","sources":["../../src/notification-banner/notification-banner.tsx"],"sourcesContent":["import { CrossIcon } from \"@lifesg/react-icons\";\nimport clsx from \"clsx\";\nimport type { NamedExoticComponent } from \"react\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { useResizeDetector } from \"react-resize-detector\";\n\nimport { Layout } from \"../layout\";\nimport { VisuallyHidden } from \"../shared/accessibility\";\nimport { ClickableIcon } from \"../shared/clickable-icon\";\nimport { formatUnitValue, useApplyStyle } from \"../theme\";\nimport { Typography } from \"../typography\";\nimport * as styles from \"./notification-banner.styles\";\nimport type {\n NotificationBannerProps,\n NotificationBannerWithForwardedRefProps,\n} from \"./types\";\n\nexport const NBComponent = ({\n children,\n visible = true,\n dismissible = true,\n sticky = true,\n onDismiss,\n id,\n forwardedRef,\n maxCollapsedHeight,\n onClick,\n actionButton,\n icon,\n className,\n ...otherProps\n}: NotificationBannerWithForwardedRefProps) => {\n // =============================================================================\n // CONST, STATE, REF\n // =============================================================================\n const testId = otherProps[\"data-testid\"];\n\n const [isVisible, setVisible] = useState<boolean>(visible);\n const { height: contentHeight = 0, ref: contentRef } = useResizeDetector();\n const contentTextRef = useRef<HTMLDivElement>(null);\n\n const isCollapsed =\n maxCollapsedHeight && contentHeight > maxCollapsedHeight;\n\n useApplyStyle(contentTextRef, {\n [styles.tokens.contentText.maxCollapsedHeight]: isCollapsed\n ? formatUnitValue(maxCollapsedHeight, \"px\")\n : undefined,\n });\n\n // =============================================================================\n // EFFECTS\n // =============================================================================\n useEffect(() => {\n setVisible(visible);\n }, [visible]);\n\n // =============================================================================\n // EVENT HANDLERS\n // =============================================================================\n const handleDismiss = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n setVisible(false);\n\n if (dismissible && onDismiss) onDismiss();\n };\n\n const handleActionButtonOnClick = (\n event: React.MouseEvent<HTMLButtonElement>\n ) => {\n if (!actionButton?.onClick) {\n // let it bubble\n return;\n }\n event.stopPropagation();\n actionButton.onClick(event);\n };\n\n // =============================================================================\n // RENDER FUNCTIONS\n // =============================================================================\n if (!isVisible) return null;\n\n const renderDismissButton = () => (\n <ClickableIcon\n className={styles.dismissButton}\n tabIndex={0}\n onClick={handleDismiss}\n id={formatId(\"dismiss-button\", id)}\n data-testid={formatId(\"dismiss-button\", testId)}\n focusOutline=\"browser\"\n focusHighlight={false}\n type=\"button\"\n aria-label=\"close\"\n >\n <CrossIcon aria-hidden />\n </ClickableIcon>\n );\n\n const renderActionButton = () => {\n if (!actionButton) return null;\n\n return (\n <button\n className={styles.actionButton}\n id={formatId(\"action-button\", id)}\n data-testid={formatId(\"action-button\", testId)}\n type=\"button\"\n {...actionButton}\n onClick={handleActionButtonOnClick}\n >\n {actionButton.children}\n </button>\n );\n };\n\n const renderContent = () => (\n <div\n className={styles.content}\n data-testid={formatId(\"text-content\", testId)}\n >\n <div className={styles.contentWrapper}>\n <div\n ref={contentTextRef}\n className={clsx(\n styles.contentText,\n isCollapsed && styles.contentTextCollapsed\n )}\n >\n <div ref={contentRef}>{children}</div>\n </div>\n {renderActionButton()}\n </div>\n </div>\n );\n\n const renderAccessibleBannerButton = () => (\n <VisuallyHidden>\n <button aria-label={\"Clickable banner\"} type=\"button\" />\n </VisuallyHidden>\n );\n\n return (\n <div\n ref={forwardedRef}\n className={clsx(\n styles.wrapper,\n sticky && styles.wrapperSticky,\n !!onClick && styles.wrapperClickable,\n className\n )}\n onClick={onClick}\n role=\"region\"\n {...otherProps}\n >\n <Layout.Content id={formatId(\"container\", id)}>\n {icon && (\n <div className={styles.iconContainer} aria-hidden>\n {icon}\n </div>\n )}\n <div className={styles.contentContainer}>{renderContent()}</div>\n {dismissible && renderDismissButton()}\n </Layout.Content>\n {onClick && renderAccessibleBannerButton()}\n </div>\n );\n};\n\n/**\n * Intermediate component to handle passing the ref as a prop\n */\nconst NBWithRef = (\n props: NotificationBannerProps,\n ref: React.Ref<HTMLDivElement>\n) => {\n return <NBComponent {...props} forwardedRef={ref} />;\n};\n\nconst NBLink = React.forwardRef<\n HTMLAnchorElement,\n React.ComponentProps<typeof Typography.LinkBL>\n>(function NotificationBannerLink(props, ref) {\n return (\n <Typography.LinkBL\n ref={ref}\n className={clsx(styles.contentLink, props.className)}\n {...props}\n />\n );\n});\n(NBLink as NamedExoticComponent).displayName = \"NotificationBanner.Link\";\n\n// =============================================================================\n// HELPER FUNCTIONS\n// =============================================================================\nconst formatId = (componentName: string, id = \"wrapper\"): string => {\n return `${id}-${componentName}`;\n};\n\n// =============================================================================\n// EXPORTABLE\n// =============================================================================\nconst Base = React.forwardRef(NBWithRef);\n(Base as NamedExoticComponent).displayName = \"NotificationBanner\";\nexport const NotificationBanner = Object.assign(Base, {\n Link: NBLink,\n});\n"],"names":["NBComponent","_a","children","visible","dismissible","sticky","onDismiss","id","forwardedRef","maxCollapsedHeight","onClick","actionButton","icon","className","otherProps","__rest","testId","isVisible","setVisible","useState","height","contentHeight","ref","contentRef","useResizeDetector","contentTextRef","useRef","isCollapsed","useApplyStyle","styles.tokens","contentText","formatUnitValue","undefined","useEffect","handleDismiss","event","stopPropagation","handleActionButtonOnClick","_jsxs","clsx","styles.wrapper","styles.wrapperSticky","styles.wrapperClickable","role","Layout","Content","formatId","_jsx","styles.iconContainer","styles.contentContainer","styles.content","styles.contentWrapper","styles.contentText","styles.contentTextCollapsed","Object","assign","styles.actionButton","type","ClickableIcon","styles.dismissButton","tabIndex","focusOutline","focusHighlight","CrossIcon","VisuallyHidden","NBLink","React","forwardRef","props","Typography","LinkBL","styles.contentLink","displayName","componentName","Base","NotificationBanner","Link"],"mappings":"itCAiBO,MAAMA,EAAeC,IAAA,IAAAC,SACxBA,EAAQC,QACRA,GAAU,EAAIC,YACdA,GAAc,EAAIC,OAClBA,GAAS,EAAIC,UACbA,EAASC,GACTA,EAAEC,aACFA,EAAYC,mBACZA,EAAkBC,QAClBA,EAAOC,aACPA,EAAYC,KACZA,EAAIC,UACJA,GAASZ,EACNa,EAAUC,EAAAd,EAbW,gJAkBxB,MAAMe,EAASF,EAAW,gBAEnBG,EAAWC,GAAcC,EAAkBhB,IAC1CiB,OAAQC,EAAgB,EAAGC,IAAKC,GAAeC,IACjDC,EAAiBC,EAAuB,MAExCC,EACFlB,GAAsBY,EAAgBZ,EAE1CmB,EAAcH,EAAgB,CAC1B,CAACI,EAAcC,YAAYrB,oBAAqBkB,EAC1CI,EAAgBtB,EAAoB,WACpCuB,IAMVC,GAAU,KACNf,EAAWf,EAAQ,GACpB,CAACA,IAKJ,MAAM+B,EAAiBC,IACnBA,EAAMC,kBACNlB,GAAW,GAEPd,GAAeE,GAAWA,GAAW,EAGvC+B,EACFF,KAEKxB,aAAY,EAAZA,EAAcD,WAInByB,EAAMC,kBACNzB,EAAaD,QAAQyB,GAAM,EAM/B,IAAKlB,EAAW,OAAO,KA6DvB,OACIqB,uBACIhB,IAAKd,EACLK,UAAW0B,EACPC,EACAnC,GAAUoC,IACR/B,GAAWgC,EACb7B,GAEJH,QAASA,EACTiC,KAAK,UACD7B,aAEJwB,EAACM,EAAOC,QAAO,CAACtC,GAAIuC,EAAS,YAAavC,GAAGL,SAAA,CACxCU,GACGmC,SAAKlC,UAAWmC,4BACXpC,IAGTmC,EAAA,MAAA,CAAKlC,UAAWoC,EAAuB/C,SA5C/C6C,EAAA,MAAA,CACIlC,UAAWqC,EAAc,cACZJ,EAAS,eAAgB9B,GAAOd,SAE7CoC,EAAA,MAAA,CAAKzB,UAAWsC,EAAqBjD,SAAA,CACjC6C,EAAA,MAAA,CACIzB,IAAKG,EACLZ,UAAW0B,EACPa,EACAzB,GAAe0B,GAClBnD,SAED6C,EAAA,MAAA,CAAKzB,IAAKC,EAAUrB,SAAGA,MA7B9BS,EAGDoC,EAAA,SAAAO,OAAAC,OAAA,CACI1C,UAAW2C,EACXjD,GAAIuC,EAAS,gBAAiBvC,iBACjBuC,EAAS,gBAAiB9B,GACvCyC,KAAK,UACD9C,EAAY,CAChBD,QAAS2B,EAAyBnC,SAEjCS,EAAaT,YAXI,YA8DjBE,GA9ET2C,EAACW,EAAa,CACV7C,UAAW8C,EACXC,SAAU,EACVlD,QAASwB,EACT3B,GAAIuC,EAAS,iBAAkBvC,GAAG,cACrBuC,EAAS,iBAAkB9B,GACxC6C,aAAa,UACbC,gBAAgB,EAChBL,KAAK,SAAQ,aACF,QAAOvD,SAElB6C,EAACgB,EAAS,CAAA,eAAA,SAqETrD,GA3BLqC,EAACiB,EAAc,CAAA9D,SACX6C,EAAA,SAAA,CAAA,aAAoB,mBAAoBU,KAAK,gBA2B3C,EAcRQ,EAASC,EAAMC,YAGnB,SAAgCC,EAAO9C,GACrC,OACIyB,EAACsB,EAAWC,OAAMhB,OAAAC,OAAA,CACdjC,IAAKA,EACLT,UAAW0B,EAAKgC,EAAoBH,EAAMvD,YACtCuD,GAGhB,IACCH,EAAgCO,YAAc,0BAK/C,MAAM1B,EAAW,CAAC2B,EAAuBlE,EAAK,YACnC,GAAGA,KAAMkE,IAMdC,EAAOR,EAAMC,YA/BD,CACdC,EACA9C,IAEOyB,EAAC/C,EAAWsD,OAAAC,OAAA,GAAKa,GAAO5D,aAAcc,OA4BhDoD,EAA8BF,YAAc,2BAChCG,EAAqBrB,OAAOC,OAAOmB,EAAM,CAClDE,KAAMX"}
1
+ {"version":3,"file":"notification-banner.js","sources":["../../src/notification-banner/notification-banner.tsx"],"sourcesContent":["import { CrossIcon } from \"@lifesg/react-icons\";\nimport clsx from \"clsx\";\nimport type { NamedExoticComponent } from \"react\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { useResizeDetector } from \"react-resize-detector\";\n\nimport { Layout } from \"../layout\";\nimport { VisuallyHidden } from \"../shared/accessibility\";\nimport { ClickableIcon } from \"../shared/clickable-icon\";\nimport { formatUnitValue, useApplyStyle } from \"../theme\";\nimport { Typography } from \"../typography\";\nimport * as styles from \"./notification-banner.styles\";\nimport type {\n NotificationBannerProps,\n NotificationBannerWithForwardedRefProps,\n} from \"./types\";\n\nexport const NBComponent = ({\n children,\n visible = true,\n dismissible = true,\n sticky = true,\n onDismiss,\n id,\n forwardedRef,\n maxCollapsedHeight,\n onClick,\n actionButton,\n icon,\n className,\n ...otherProps\n}: NotificationBannerWithForwardedRefProps) => {\n // =============================================================================\n // CONST, STATE, REF\n // =============================================================================\n const testId = otherProps[\"data-testid\"];\n\n const [isVisible, setVisible] = useState<boolean>(visible);\n const { height: contentHeight = 0, ref: contentRef } = useResizeDetector();\n const contentTextRef = useRef<HTMLDivElement>(null);\n\n const isCollapsed =\n maxCollapsedHeight && contentHeight > maxCollapsedHeight;\n\n useApplyStyle(contentTextRef, {\n [styles.tokens.contentText.maxCollapsedHeight]: isCollapsed\n ? formatUnitValue(maxCollapsedHeight, \"px\")\n : undefined,\n });\n\n // =============================================================================\n // EFFECTS\n // =============================================================================\n useEffect(() => {\n setVisible(visible);\n }, [visible]);\n\n // =============================================================================\n // EVENT HANDLERS\n // =============================================================================\n const handleDismiss = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n setVisible(false);\n\n if (dismissible && onDismiss) onDismiss();\n };\n\n const handleActionButtonOnClick = (\n event: React.MouseEvent<HTMLButtonElement>\n ) => {\n if (!actionButton?.onClick) {\n // let it bubble\n return;\n }\n event.stopPropagation();\n actionButton.onClick(event);\n };\n\n // =============================================================================\n // RENDER FUNCTIONS\n // =============================================================================\n if (!isVisible) return null;\n\n const renderDismissButton = () => (\n <ClickableIcon\n className={styles.dismissButton}\n tabIndex={0}\n onClick={handleDismiss}\n id={formatId(\"dismiss-button\", id)}\n data-testid={formatId(\"dismiss-button\", testId)}\n focusOutline=\"browser\"\n focusHighlight={false}\n type=\"button\"\n aria-label=\"close\"\n >\n <CrossIcon aria-hidden />\n </ClickableIcon>\n );\n\n const renderActionButton = () => {\n if (!actionButton) return null;\n\n return (\n <button\n className={styles.actionButton}\n id={formatId(\"action-button\", id)}\n data-testid={formatId(\"action-button\", testId)}\n type=\"button\"\n {...actionButton}\n onClick={handleActionButtonOnClick}\n >\n {actionButton.children}\n </button>\n );\n };\n\n const renderContent = () => (\n <div\n className={styles.content}\n data-testid={formatId(\"text-content\", testId)}\n >\n <div className={styles.contentWrapper}>\n <div\n ref={contentTextRef}\n className={clsx(\n styles.contentText,\n isCollapsed && styles.contentTextCollapsed\n )}\n >\n <div ref={contentRef}>{children}</div>\n </div>\n {renderActionButton()}\n </div>\n </div>\n );\n\n const renderAccessibleBannerButton = () => (\n <VisuallyHidden>\n <button aria-label={\"Clickable banner\"} type=\"button\" />\n </VisuallyHidden>\n );\n\n return (\n <div\n ref={forwardedRef}\n className={clsx(\n styles.wrapper,\n sticky && styles.wrapperSticky,\n !!onClick && styles.wrapperClickable,\n className\n )}\n onClick={onClick}\n role=\"region\"\n {...otherProps}\n >\n <Layout.Content id={formatId(\"container\", id)}>\n {icon && (\n <div className={styles.iconContainer} aria-hidden>\n {icon}\n </div>\n )}\n <div className={styles.contentContainer}>{renderContent()}</div>\n {dismissible && renderDismissButton()}\n </Layout.Content>\n {onClick && renderAccessibleBannerButton()}\n </div>\n );\n};\n\n/**\n * Intermediate component to handle passing the ref as a prop\n */\nconst NBWithRef = (\n props: NotificationBannerProps,\n ref: React.Ref<HTMLDivElement>\n) => {\n return <NBComponent {...props} forwardedRef={ref} />;\n};\n\nconst NBLink = React.forwardRef<\n HTMLAnchorElement,\n React.ComponentProps<typeof Typography.LinkBL>\n>(function NotificationBannerLink(props, ref) {\n return (\n <Typography.LinkBL\n ref={ref}\n className={clsx(styles.contentLink, props.className)}\n {...props}\n />\n );\n});\n(NBLink as NamedExoticComponent).displayName = \"NotificationBanner.Link\";\n\n// =============================================================================\n// HELPER FUNCTIONS\n// =============================================================================\nconst formatId = (componentName: string, id = \"wrapper\"): string => {\n return `${id}-${componentName}`;\n};\n\n// =============================================================================\n// EXPORTABLE\n// =============================================================================\nconst Base = React.forwardRef(NBWithRef);\n(Base as NamedExoticComponent).displayName = \"NotificationBanner\";\n\n// @catalog\n/**\n * A full-width informational banner that sits at the top of the page.\n *\n * Use `NotificationBanner` to surface important or persistent messages that\n * should remain visible until the user dismisses them.\n */\nexport const NotificationBanner = Object.assign(Base, {\n /** Renders an inline link styled for use inside a `NotificationBanner`. */\n Link: NBLink,\n});\n"],"names":["NBComponent","_a","children","visible","dismissible","sticky","onDismiss","id","forwardedRef","maxCollapsedHeight","onClick","actionButton","icon","className","otherProps","__rest","testId","isVisible","setVisible","useState","height","contentHeight","ref","contentRef","useResizeDetector","contentTextRef","useRef","isCollapsed","useApplyStyle","styles.tokens","contentText","formatUnitValue","undefined","useEffect","handleDismiss","event","stopPropagation","handleActionButtonOnClick","_jsxs","clsx","styles.wrapper","styles.wrapperSticky","styles.wrapperClickable","role","Layout","Content","formatId","_jsx","styles.iconContainer","styles.contentContainer","styles.content","styles.contentWrapper","styles.contentText","styles.contentTextCollapsed","Object","assign","styles.actionButton","type","ClickableIcon","styles.dismissButton","tabIndex","focusOutline","focusHighlight","CrossIcon","VisuallyHidden","NBLink","React","forwardRef","props","Typography","LinkBL","styles.contentLink","displayName","componentName","Base","NotificationBanner","Link"],"mappings":"itCAiBO,MAAMA,EAAeC,IAAA,IAAAC,SACxBA,EAAQC,QACRA,GAAU,EAAIC,YACdA,GAAc,EAAIC,OAClBA,GAAS,EAAIC,UACbA,EAASC,GACTA,EAAEC,aACFA,EAAYC,mBACZA,EAAkBC,QAClBA,EAAOC,aACPA,EAAYC,KACZA,EAAIC,UACJA,GAASZ,EACNa,EAAUC,EAAAd,EAbW,gJAkBxB,MAAMe,EAASF,EAAW,gBAEnBG,EAAWC,GAAcC,EAAkBhB,IAC1CiB,OAAQC,EAAgB,EAAGC,IAAKC,GAAeC,IACjDC,EAAiBC,EAAuB,MAExCC,EACFlB,GAAsBY,EAAgBZ,EAE1CmB,EAAcH,EAAgB,CAC1B,CAACI,EAAcC,YAAYrB,oBAAqBkB,EAC1CI,EAAgBtB,EAAoB,WACpCuB,IAMVC,GAAU,KACNf,EAAWf,EAAQ,GACpB,CAACA,IAKJ,MAAM+B,EAAiBC,IACnBA,EAAMC,kBACNlB,GAAW,GAEPd,GAAeE,GAAWA,GAAW,EAGvC+B,EACFF,KAEKxB,aAAY,EAAZA,EAAcD,WAInByB,EAAMC,kBACNzB,EAAaD,QAAQyB,GAAM,EAM/B,IAAKlB,EAAW,OAAO,KA6DvB,OACIqB,uBACIhB,IAAKd,EACLK,UAAW0B,EACPC,EACAnC,GAAUoC,IACR/B,GAAWgC,EACb7B,GAEJH,QAASA,EACTiC,KAAK,UACD7B,aAEJwB,EAACM,EAAOC,QAAO,CAACtC,GAAIuC,EAAS,YAAavC,GAAGL,SAAA,CACxCU,GACGmC,SAAKlC,UAAWmC,4BACXpC,IAGTmC,EAAA,MAAA,CAAKlC,UAAWoC,EAAuB/C,SA5C/C6C,EAAA,MAAA,CACIlC,UAAWqC,EAAc,cACZJ,EAAS,eAAgB9B,GAAOd,SAE7CoC,EAAA,MAAA,CAAKzB,UAAWsC,EAAqBjD,SAAA,CACjC6C,EAAA,MAAA,CACIzB,IAAKG,EACLZ,UAAW0B,EACPa,EACAzB,GAAe0B,GAClBnD,SAED6C,EAAA,MAAA,CAAKzB,IAAKC,EAAUrB,SAAGA,MA7B9BS,EAGDoC,EAAA,SAAAO,OAAAC,OAAA,CACI1C,UAAW2C,EACXjD,GAAIuC,EAAS,gBAAiBvC,iBACjBuC,EAAS,gBAAiB9B,GACvCyC,KAAK,UACD9C,EAAY,CAChBD,QAAS2B,EAAyBnC,SAEjCS,EAAaT,YAXI,YA8DjBE,GA9ET2C,EAACW,EAAa,CACV7C,UAAW8C,EACXC,SAAU,EACVlD,QAASwB,EACT3B,GAAIuC,EAAS,iBAAkBvC,GAAG,cACrBuC,EAAS,iBAAkB9B,GACxC6C,aAAa,UACbC,gBAAgB,EAChBL,KAAK,SAAQ,aACF,QAAOvD,SAElB6C,EAACgB,EAAS,CAAA,eAAA,SAqETrD,GA3BLqC,EAACiB,EAAc,CAAA9D,SACX6C,EAAA,SAAA,CAAA,aAAoB,mBAAoBU,KAAK,gBA2B3C,EAcRQ,EAASC,EAAMC,YAGnB,SAAgCC,EAAO9C,GACrC,OACIyB,EAACsB,EAAWC,OAAMhB,OAAAC,OAAA,CACdjC,IAAKA,EACLT,UAAW0B,EAAKgC,EAAoBH,EAAMvD,YACtCuD,GAGhB,IACCH,EAAgCO,YAAc,0BAK/C,MAAM1B,EAAW,CAAC2B,EAAuBlE,EAAK,YACnC,GAAGA,KAAMkE,IAMdC,EAAOR,EAAMC,YA/BD,CACdC,EACA9C,IAEOyB,EAAC/C,EAAWsD,OAAAC,OAAA,GAAKa,GAAO5D,aAAcc,OA4BhDoD,EAA8BF,YAAc,2BAShCG,EAAqBrB,OAAOC,OAAOmB,EAAM,CAElDE,KAAMX"}
@@ -1,27 +1,82 @@
1
1
  import type { TypographyLinkProps, TypographyProps } from "../typography";
2
+ /**
3
+ * Props for the `NotificationBanner` component.
4
+ *
5
+ * When `onClick` is provided, the entire banner becomes interactive and a
6
+ * visually hidden accessible button is rendered for keyboard and screen-reader
7
+ * users.
8
+ */
2
9
  export interface NotificationBannerProps extends React.HTMLAttributes<HTMLDivElement> {
3
10
  children?: React.ReactNode | undefined;
11
+ /**
12
+ * Whether the dismiss button is rendered. The caller is responsible
13
+ * for dismissing the banner in the callback.
14
+ *
15
+ * @default true
16
+ */
4
17
  dismissible?: boolean | undefined;
18
+ /**
19
+ * Controls the visibility of the banner.
20
+ *
21
+ * @default true
22
+ */
5
23
  visible?: boolean | undefined;
24
+ /**
25
+ * Whether the banner sticks to the top of the viewport while the page
26
+ * scrolls.
27
+ *
28
+ * @default true
29
+ */
6
30
  sticky?: boolean | undefined;
31
+ /**
32
+ * An optional icon element rendered at the leading edge of the banner.
33
+ */
7
34
  icon?: JSX.Element | undefined;
35
+ /**
36
+ * Called when the user activates the dismiss button and `dismissible` is `true`.
37
+ */
8
38
  onDismiss?: (() => void) | undefined;
9
39
  "data-testid"?: string | undefined;
10
- /** Specifies the maximum height of content, after which it is collapsed */
40
+ /**
41
+ * Maximum height in pixels for the content area. When the rendered content
42
+ * exceeds this value, the overflow is clipped.
43
+ */
11
44
  maxCollapsedHeight?: number | undefined;
12
- /** Action button that will be displayed */
45
+ /**
46
+ * An action button rendered inside the content area. When
47
+ * `actionButton.onClick` is provided it stops propagation to the banner's
48
+ * own `onClick` handler.
49
+ */
13
50
  actionButton?: React.ButtonHTMLAttributes<HTMLButtonElement> | undefined;
14
51
  }
52
+ /**
53
+ * Props for the `withNotificationBanner` HOC wrapper,
54
+ * extending `NotificationBannerProps` with a forwarded ref.
55
+ */
15
56
  export interface NotificationBannerWithForwardedRefProps extends NotificationBannerProps {
16
57
  forwardedRef?: React.Ref<HTMLDivElement> | undefined;
17
58
  }
59
+ /**
60
+ * Discriminant for `NotificationContentAttributes` content items.
61
+ *
62
+ * - `"text"` items are sanitized and injected as HTML paragraphs.
63
+ * - `"link"` items are rendered as `NotificationBanner.Link` elements.
64
+ */
18
65
  export type ContentType = "text" | "link";
66
+ /** Props for a `"link"` content item inside a notification banner. */
19
67
  export interface ContentLinkAttributes extends TypographyLinkProps {
20
68
  }
69
+ /** Props for a `"text"` content item inside a notification banner. */
21
70
  export interface ContentTextAttributes extends TypographyProps {
22
71
  }
72
+ /**
73
+ * A single content item for use with `withNotificationBanner`.
74
+ */
23
75
  export interface NotificationContentAttributes {
76
+ /** Determines how `content` is rendered inside the banner. */
24
77
  type: ContentType;
78
+ /** The text string or link label to display. */
25
79
  content: string;
80
+ /** Additional props forwarded to the rendered text or link element. */
26
81
  otherAttributes?: TypographyLinkProps | TypographyProps | undefined;
27
82
  }
@@ -1,3 +1,10 @@
1
1
  import type React from "react";
2
2
  import type { OtpInputProps, OtpInputRef } from "./types";
3
+ /**
4
+ * A field composed of individual inputs for a numeric one-time password
5
+ * with an in-built countdown mechanism.
6
+ *
7
+ * Use `OtpInput` when users must enter the one-time password (OTP)
8
+ * for multi-factored authentication methods.
9
+ */
3
10
  export declare const OtpInput: (props: OtpInputProps & React.RefAttributes<OtpInputRef>) => React.ReactElement | null;
@@ -1,2 +1,2 @@
1
- import{__rest as e}from"../_virtual/_tslib.js";import{jsxs as t,jsx as r}from"react/jsx-runtime";import n from"clsx";import{forwardRef as o,useRef as a,useState as i,useEffect as s,useImperativeHandle as l}from"react";import{Button as d}from"../button/button.js";import{FormErrorMessage as c}from"../form/form-label.js";import{Input as u}from"../input/input.js";import{VisuallyHidden as p}from"../shared/accessibility/index.js";import{Typography as m}from"../typography/index.js";import"../util/calendar-helper.js";import"../external/dayjs/dayjs.min.js";import{useId as f}from"../util/simple-id-generator.js";import{StringHelper as v}from"../util/string-helper.js";import"@react-aria/live-announcer";import{inputContainer as y,prefix as g,inputField as h,ctaButton as b,wrapper as w}from"./otp-input.styles.js";import{stripOtpFromAutofill as j,validateUserInput as C}from"./utils.js";const O=o(((o,O)=>{var{id:$,value:x=[],"data-testid":D,className:T,cooldownDuration:P,actionButtonProps:N,errorMessage:k,numOfInput:B,prefix:R,onChange:I,onCooldownStart:A,onCooldownEnd:E,otpOnly:L,onCountdownChange:M}=o,S=e(o,["id","value","data-testid","className","cooldownDuration","actionButtonProps","errorMessage","numOfInput","prefix","onChange","onCooldownStart","onCooldownEnd","otpOnly","onCountdownChange"]);const _=null!=N?N:{},{disabled:z,onClick:K,styleType:q="secondary"}=_,F=e(_,["disabled","onClick","styleType"]),G=a([]),H=a(I),[J,Q]=i(new Array(B).fill("")),[U,V]=i(P),[W,X]=i(new Date),Y=f(),Z=!!k,ee=`${Y}-error`,te=`${Y}-timer`;s((()=>{var e;return null===(e=null==G?void 0:G.current[0])||void 0===e||e.focus(),document.addEventListener("paste",ae),()=>document.removeEventListener("paste",ae)}),[]),s((()=>{if(0!==P){A&&A();const e=se();return()=>e()}}),[W]),l(O,(()=>({startCooldown:()=>{X(new Date),V(P)}}))),s((()=>{H.current=I}),[I]),s((()=>{x.length===B&&Q(x)}),[x]);const re=e=>{if(e&&C(e,B)){const t=e.split("");return Q(t),H.current&&H.current(t),!0}return!1},ne=e=>t=>{var r;const n=t.target.value,o=J.every((e=>""===e)),a=j(n,B,R);if(o&&re(a))return;const i=n.replace(/[^0-9]/g,"");if(C(i)){const t=[...J];t[e]=i.substring(i.length-1),null===(r=G.current[e+1])||void 0===r||r.focus(),Q(t),I&&I(t)}},oe=e=>t=>{var r,n,o;const{key:a,code:i}=t;if("Backspace"===a||"Backspace"===i){const t=[...J];""!==t[e]?t[e]="":0!==e&&(t[e-1]="",null===(r=G.current[e-1])||void 0===r||r.focus()),Q(t),I&&I(t)}else"ArrowRight"===t.code?null===(n=G.current[e+1])||void 0===n||n.focus():"ArrowLeft"===t.code&&(null===(o=G.current[e-1])||void 0===o||o.focus())},ae=e=>{if(!e.clipboardData)return;const t=e.clipboardData.getData("text"),r=j(t,B,R);re(r)||e.preventDefault()},ie=()=>{const e=Date.now(),t=1e3*P;return e<W.valueOf()+t},se=()=>{const e=setInterval((()=>{const t=Date.now(),r=1e3*P,n=Math.ceil((W.valueOf()+r-t)/1e3);V(n),n<=0?(E&&E(),clearInterval(e)):M&&M(n)}),1e3);return()=>{clearInterval(e)}},le=(e,t,r)=>r?`${r}-${t}-${e+1}`:`${t}-${e+1}`,de=e=>`${e} second${1===e?"":"s"}`;return t("div",{id:$,"data-testid":D,className:n(w,T),children:[t("div",{className:y,role:"group","aria-label":`${B}-digit OTP input field`,children:[R&&t(m.BodyBL,{as:"span",className:g,"data-testid":"otp-prefix",weight:"semibold",children:[r(p,{children:"O T P prefix"}),`${R.value} ${R.separator}`]}),J.map(((e,t)=>r(u,Object.assign({className:h,id:le(t,"otp-input",$),"data-testid":le(t,"otp-input",D),"aria-label":`${v.formatOrdinal(t+1)} digit`,"aria-invalid":Z,"aria-describedby":Z?ee:void 0,ref:e=>G.current[t]=e,type:"text",inputMode:"numeric",value:e,error:Z,onChange:ne(t),onKeyDown:oe(t),autoComplete:"off"},S),t)))]}),k&&r(c,{id:ee,"data-testid":"otp-error-message",children:k}),t(p,{role:"timer",id:te,children:[de(U)," remaining"]}),r(p,{"aria-live":"polite",children:U>0?"":"Ready to resend OTP"}),!L&&r(d,Object.assign({className:b,styleType:q,type:"button",sizeType:"small"},F,{onClick:e=>{Q(new Array(B).fill("")),ie()||(X(new Date),V(P)),K&&K(e)},disabled:z||ie()},F.children?{children:F.children}:{children:U>0?`Resend OTP in ${de(U)}`:"Resend OTP","aria-label":U>0?`Resend OTP in ${de(P)}`:"Resend OTP","aria-describedby":te}))]})}));export{O as OtpInput};
1
+ import{__rest as e}from"../_virtual/_tslib.js";import{jsxs as t,jsx as r}from"react/jsx-runtime";import n from"clsx";import{forwardRef as o,useRef as a,useState as i,useEffect as l,useImperativeHandle as s}from"react";import{Button as d}from"../button/button.js";import{FormErrorMessage as c}from"../form/form-label/form-label.js";import{Input as u}from"../input/input.js";import{VisuallyHidden as p}from"../shared/accessibility/index.js";import{Typography as m}from"../typography/index.js";import"../util/calendar-helper.js";import"../external/dayjs/dayjs.min.js";import{useId as f}from"../util/simple-id-generator.js";import{StringHelper as v}from"../util/string-helper.js";import"@react-aria/live-announcer";import{inputContainer as y,prefix as g,inputField as h,ctaButton as b,wrapper as w}from"./otp-input.styles.js";import{stripOtpFromAutofill as j,validateUserInput as C}from"./utils.js";const O=o(((o,O)=>{var{id:$,value:x=[],"data-testid":D,className:T,cooldownDuration:P,actionButtonProps:N,errorMessage:k,numOfInput:B,prefix:R,onChange:I,onCooldownStart:A,onCooldownEnd:E,otpOnly:L,onCountdownChange:M}=o,S=e(o,["id","value","data-testid","className","cooldownDuration","actionButtonProps","errorMessage","numOfInput","prefix","onChange","onCooldownStart","onCooldownEnd","otpOnly","onCountdownChange"]);const _=null!=N?N:{},{disabled:z,onClick:K,styleType:q="secondary"}=_,F=e(_,["disabled","onClick","styleType"]),G=a([]),H=a(I),[J,Q]=i(new Array(B).fill("")),[U,V]=i(P),[W,X]=i(new Date),Y=f(),Z=!!k,ee=`${Y}-error`,te=`${Y}-timer`;l((()=>{var e;return null===(e=null==G?void 0:G.current[0])||void 0===e||e.focus(),document.addEventListener("paste",ae),()=>document.removeEventListener("paste",ae)}),[]),l((()=>{if(0!==P){A&&A();const e=le();return()=>e()}}),[W]),s(O,(()=>({startCooldown:()=>{X(new Date),V(P)}}))),l((()=>{H.current=I}),[I]),l((()=>{x.length===B&&Q(x)}),[x]);const re=e=>{if(e&&C(e,B)){const t=e.split("");return Q(t),H.current&&H.current(t),!0}return!1},ne=e=>t=>{var r;const n=t.target.value,o=J.every((e=>""===e)),a=j(n,B,R);if(o&&re(a))return;const i=n.replace(/[^0-9]/g,"");if(C(i)){const t=[...J];t[e]=i.substring(i.length-1),null===(r=G.current[e+1])||void 0===r||r.focus(),Q(t),I&&I(t)}},oe=e=>t=>{var r,n,o;const{key:a,code:i}=t;if("Backspace"===a||"Backspace"===i){const t=[...J];""!==t[e]?t[e]="":0!==e&&(t[e-1]="",null===(r=G.current[e-1])||void 0===r||r.focus()),Q(t),I&&I(t)}else"ArrowRight"===t.code?null===(n=G.current[e+1])||void 0===n||n.focus():"ArrowLeft"===t.code&&(null===(o=G.current[e-1])||void 0===o||o.focus())},ae=e=>{if(!e.clipboardData)return;const t=e.clipboardData.getData("text"),r=j(t,B,R);re(r)||e.preventDefault()},ie=()=>{const e=Date.now(),t=1e3*P;return e<W.valueOf()+t},le=()=>{const e=setInterval((()=>{const t=Date.now(),r=1e3*P,n=Math.ceil((W.valueOf()+r-t)/1e3);V(n),n<=0?(E&&E(),clearInterval(e)):M&&M(n)}),1e3);return()=>{clearInterval(e)}},se=(e,t,r)=>r?`${r}-${t}-${e+1}`:`${t}-${e+1}`,de=e=>`${e} second${1===e?"":"s"}`;return t("div",{id:$,"data-testid":D,className:n(w,T),children:[t("div",{className:y,role:"group","aria-label":`${B}-digit OTP input field`,children:[R&&t(m.BodyBL,{as:"span",className:g,"data-testid":"otp-prefix",weight:"semibold",children:[r(p,{children:"O T P prefix"}),`${R.value} ${R.separator}`]}),J.map(((e,t)=>r(u,Object.assign({className:h,id:se(t,"otp-input",$),"data-testid":se(t,"otp-input",D),"aria-label":`${v.formatOrdinal(t+1)} digit`,"aria-invalid":Z,"aria-describedby":Z?ee:void 0,ref:e=>G.current[t]=e,type:"text",inputMode:"numeric",value:e,error:Z,onChange:ne(t),onKeyDown:oe(t),autoComplete:"off"},S),t)))]}),k&&r(c,{id:ee,"data-testid":"otp-error-message",children:k}),t(p,{role:"timer",id:te,children:[de(U)," remaining"]}),r(p,{"aria-live":"polite",children:U>0?"":"Ready to resend OTP"}),!L&&r(d,Object.assign({className:b,styleType:q,type:"button",sizeType:"small"},F,{onClick:e=>{Q(new Array(B).fill("")),ie()||(X(new Date),V(P)),K&&K(e)},disabled:z||ie()},F.children?{children:F.children}:{children:U>0?`Resend OTP in ${de(U)}`:"Resend OTP","aria-label":U>0?`Resend OTP in ${de(P)}`:"Resend OTP","aria-describedby":te}))]})}));export{O as OtpInput};
2
2
  //# sourceMappingURL=otp-input.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"otp-input.js","sources":["../../src/otp-input/otp-input.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport type React from \"react\";\nimport {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from \"react\";\n\nimport { Button } from \"../button\";\nimport { FormErrorMessage } from \"../form/form-label\";\nimport { Input } from \"../input\";\nimport { VisuallyHidden } from \"../shared/accessibility\";\nimport { Typography } from \"../typography\";\nimport { StringHelper, useId } from \"../util\";\nimport * as styles from \"./otp-input.styles\";\nimport type { OtpInputProps, OtpInputRef } from \"./types\";\nimport { stripOtpFromAutofill, validateUserInput } from \"./utils\";\n\nconst Component = (\n {\n id,\n value = [],\n \"data-testid\": dataTestId,\n className,\n cooldownDuration,\n actionButtonProps,\n errorMessage,\n numOfInput,\n prefix,\n onChange,\n onCooldownStart,\n onCooldownEnd,\n otpOnly,\n onCountdownChange,\n ...otherProps\n }: OtpInputProps,\n ref: React.Ref<OtpInputRef>\n) => {\n // =============================================================================\n // CONST, STATE, REF\n // =============================================================================\n const {\n disabled,\n onClick,\n styleType = \"secondary\",\n ...otherCtaProps\n } = actionButtonProps ?? {};\n\n const inputRefs = useRef<(HTMLInputElement | null)[]>([]);\n const onChangeRef = useRef(onChange);\n\n const [otpValues, setOtpValues] = useState<string[]>(\n new Array(numOfInput).fill(\"\")\n );\n const [countDown, setCountDown] = useState<number>(cooldownDuration);\n const [lastCtaTimestamp, setLastCtaTimestamp] = useState<Date>(new Date());\n const internalId = useId();\n\n const hasError = !!errorMessage;\n const errorId = `${internalId}-error`;\n const timerId = `${internalId}-timer`;\n\n // =============================================================================\n // EFFECTS\n // =============================================================================\n useEffect(() => {\n inputRefs?.current[0]?.focus();\n document.addEventListener(\"paste\", handlePaste);\n return () => document.removeEventListener(\"paste\", handlePaste);\n }, []);\n\n useEffect(() => {\n if (cooldownDuration !== 0) {\n if (onCooldownStart) onCooldownStart();\n const cleanup = beginCountdown();\n\n return () => cleanup();\n }\n }, [lastCtaTimestamp]);\n\n useImperativeHandle(ref, () => ({\n startCooldown: () => {\n setLastCtaTimestamp(new Date());\n setCountDown(cooldownDuration);\n },\n }));\n\n useEffect(() => {\n onChangeRef.current = onChange;\n }, [onChange]);\n\n useEffect(() => {\n if (value.length === numOfInput) {\n setOtpValues(value);\n }\n }, [value]);\n\n // =============================================================================\n // EVENT HANDLERS\n // =============================================================================\n const handleInputFullValue = (incomingValue: string) => {\n if (incomingValue && validateUserInput(incomingValue, numOfInput)) {\n const incomingValueArr = incomingValue.split(\"\");\n setOtpValues(incomingValueArr);\n if (onChangeRef.current) {\n onChangeRef.current(incomingValueArr);\n }\n\n return true;\n }\n\n return false;\n };\n\n const handleChange =\n (index: number) => (event: React.ChangeEvent<HTMLInputElement>) => {\n const eventValue = event.target.value;\n\n /* handle autofill */\n const fieldIsEmpty = otpValues.every((num) => num === \"\");\n const autofillOtp = stripOtpFromAutofill(\n eventValue,\n numOfInput,\n prefix\n );\n if (fieldIsEmpty && handleInputFullValue(autofillOtp)) {\n return;\n }\n\n /* handle normal input */\n const value = eventValue.replace(/[^0-9]/g, \"\");\n if (validateUserInput(value)) {\n const newOtpValues = [...otpValues];\n\n newOtpValues[index] = value.substring(value.length - 1);\n inputRefs.current[index + 1]?.focus();\n\n setOtpValues(newOtpValues);\n\n if (onChange) {\n onChange(newOtpValues);\n }\n }\n };\n\n const handleKeyDown =\n (index: number) => (event: React.KeyboardEvent<HTMLInputElement>) => {\n const { key, code } = event;\n\n if (key === \"Backspace\" || code === \"Backspace\") {\n const newOtpValues = [...otpValues];\n if (newOtpValues[index] !== \"\") {\n newOtpValues[index] = \"\";\n } else if (index !== 0) {\n newOtpValues[index - 1] = \"\";\n inputRefs.current[index - 1]?.focus();\n }\n\n setOtpValues(newOtpValues);\n\n if (onChange) {\n onChange(newOtpValues);\n }\n } else if (event.code === \"ArrowRight\") {\n inputRefs.current[index + 1]?.focus();\n } else if (event.code === \"ArrowLeft\") {\n inputRefs.current[index - 1]?.focus();\n }\n };\n\n const handlePaste = (event: ClipboardEvent): void => {\n if (!event.clipboardData) return;\n\n const pastedValue = event.clipboardData.getData(\"text\");\n const autofillOtp = stripOtpFromAutofill(\n pastedValue,\n numOfInput,\n prefix\n );\n if (!handleInputFullValue(autofillOtp)) {\n event.preventDefault();\n }\n };\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n setOtpValues(new Array(numOfInput).fill(\"\"));\n\n if (!isWithinCooldown()) {\n setLastCtaTimestamp(new Date());\n setCountDown(cooldownDuration);\n }\n\n if (onClick) {\n onClick(event);\n }\n };\n\n // =========================================================================\n // HELPER FUNCTIONS\n // =========================================================================\n const isWithinCooldown = (): boolean => {\n const currentTime = Date.now();\n const coolDownInMilliseconds = cooldownDuration * 1000;\n\n return (\n currentTime < lastCtaTimestamp.valueOf() + coolDownInMilliseconds\n );\n };\n\n const beginCountdown = () => {\n const interval = setInterval(() => {\n const currentTime = Date.now();\n const coolDownInMilliseconds = cooldownDuration * 1000;\n\n const timer = Math.ceil(\n (lastCtaTimestamp.valueOf() +\n coolDownInMilliseconds -\n currentTime) /\n 1000\n );\n setCountDown(timer);\n if (timer <= 0) {\n if (onCooldownEnd) onCooldownEnd();\n clearInterval(interval);\n } else if (onCountdownChange) {\n onCountdownChange(timer);\n }\n }, 1000);\n\n return () => {\n clearInterval(interval);\n };\n };\n\n const generateId = (index: number, name: string, prefix?: string) => {\n return prefix\n ? `${prefix}-${name}-${index + 1}`\n : `${name}-${index + 1}`;\n };\n\n const displaySeconds = (time: number) => {\n return `${time} second${time === 1 ? \"\" : \"s\"}`;\n };\n\n const getCTALabelProps = (): Partial<\n React.HTMLAttributes<HTMLButtonElement>\n > => {\n return otherCtaProps.children\n ? { children: otherCtaProps.children }\n : {\n children:\n countDown > 0\n ? `Resend OTP in ${displaySeconds(countDown)}`\n : \"Resend OTP\",\n // use a fixed label to avoid repeated screen reader updates when the button is focused\n \"aria-label\":\n countDown > 0\n ? `Resend OTP in ${displaySeconds(cooldownDuration)}`\n : \"Resend OTP\",\n // use a secondary element to reflect the latest countdown\n \"aria-describedby\": timerId,\n };\n };\n\n // =============================================================================\n // RENDER FUNCTIONS\n // =============================================================================\n return (\n <div\n id={id}\n data-testid={dataTestId}\n className={clsx(styles.wrapper, className)}\n >\n <div\n className={styles.inputContainer}\n role=\"group\"\n aria-label={`${numOfInput}-digit OTP input field`}\n >\n {prefix && (\n <Typography.BodyBL\n as=\"span\"\n className={styles.prefix}\n data-testid=\"otp-prefix\"\n weight=\"semibold\"\n >\n <VisuallyHidden>O T P prefix</VisuallyHidden>\n {`${prefix.value} ${prefix.separator}`}\n </Typography.BodyBL>\n )}\n {otpValues.map((data, index) => {\n return (\n <Input\n className={styles.inputField}\n id={generateId(index, \"otp-input\", id)}\n data-testid={generateId(\n index,\n \"otp-input\",\n dataTestId\n )}\n aria-label={`${StringHelper.formatOrdinal(\n index + 1\n )} digit`}\n aria-invalid={hasError}\n aria-describedby={hasError ? errorId : undefined}\n key={index}\n ref={(el) => (inputRefs.current[index] = el)}\n type=\"text\"\n inputMode=\"numeric\"\n value={data}\n error={hasError}\n onChange={handleChange(index)}\n onKeyDown={handleKeyDown(index)}\n autoComplete=\"off\"\n {...otherProps}\n />\n );\n })}\n </div>\n {errorMessage && (\n <FormErrorMessage id={errorId} data-testid=\"otp-error-message\">\n {errorMessage}\n </FormErrorMessage>\n )}\n {/* visually hidden elements need to be rendered before the button so that Voiceover/Chrome doesn't skip the button */}\n <VisuallyHidden role=\"timer\" id={timerId}>\n {displaySeconds(countDown)} remaining\n </VisuallyHidden>\n <VisuallyHidden aria-live=\"polite\">\n {countDown > 0 ? \"\" : \"Ready to resend OTP\"}\n </VisuallyHidden>\n {!otpOnly && (\n <Button\n className={styles.ctaButton}\n styleType={styleType}\n type=\"button\"\n sizeType=\"small\"\n {...otherCtaProps}\n onClick={handleClick}\n disabled={disabled || isWithinCooldown()}\n {...getCTALabelProps()}\n />\n )}\n </div>\n );\n};\n\nexport const OtpInput = forwardRef(Component);\n"],"names":["OtpInput","forwardRef","_a","ref","id","value","dataTestId","className","cooldownDuration","actionButtonProps","errorMessage","numOfInput","prefix","onChange","onCooldownStart","onCooldownEnd","otpOnly","onCountdownChange","otherProps","__rest","_b","disabled","onClick","styleType","otherCtaProps","inputRefs","useRef","onChangeRef","otpValues","setOtpValues","useState","Array","fill","countDown","setCountDown","lastCtaTimestamp","setLastCtaTimestamp","Date","internalId","useId","hasError","errorId","timerId","useEffect","current","focus","document","addEventListener","handlePaste","removeEventListener","cleanup","beginCountdown","useImperativeHandle","startCooldown","length","handleInputFullValue","incomingValue","validateUserInput","incomingValueArr","split","handleChange","index","event","eventValue","target","fieldIsEmpty","every","num","autofillOtp","stripOtpFromAutofill","replace","newOtpValues","substring","handleKeyDown","key","code","_c","clipboardData","pastedValue","getData","preventDefault","isWithinCooldown","currentTime","now","coolDownInMilliseconds","valueOf","interval","setInterval","timer","Math","ceil","clearInterval","generateId","name","displaySeconds","time","_jsxs","clsx","styles.wrapper","children","styles.inputContainer","role","Typography","BodyBL","as","styles.prefix","weight","_jsx","VisuallyHidden","separator","map","data","Input","Object","assign","styles.inputField","StringHelper","formatOrdinal","undefined","el","type","inputMode","error","onKeyDown","autoComplete","FormErrorMessage","Button","styles.ctaButton","sizeType"],"mappings":"o3BAoBA,MAwUaA,EAAWC,GAxUN,CACdC,EAiBAC,KAjBA,IAAAC,GACIA,EAAEC,MACFA,EAAQ,GACR,cAAeC,EAAUC,UACzBA,EAASC,iBACTA,EAAgBC,kBAChBA,EAAiBC,aACjBA,EAAYC,WACZA,EAAUC,OACVA,EAAMC,SACNA,EAAQC,gBACRA,EAAeC,cACfA,EAAaC,QACbA,EAAOC,kBACPA,GAAiBf,EACdgB,EAAUC,EAAAjB,EAfjB,iMAsBA,MAAMkB,EAKFX,QAAAA,EAAqB,CAAA,GALnBY,SACFA,EAAQC,QACRA,EAAOC,UACPA,EAAY,aAAWH,EACpBI,EAAaL,EAAAC,EAJd,CAAA,WAAA,UAAA,cAOAK,EAAYC,EAAoC,IAChDC,EAAcD,EAAOb,IAEpBe,EAAWC,GAAgBC,EAC9B,IAAIC,MAAMpB,GAAYqB,KAAK,MAExBC,EAAWC,GAAgBJ,EAAiBtB,IAC5C2B,EAAkBC,GAAuBN,EAAe,IAAIO,MAC7DC,EAAaC,IAEbC,IAAa9B,EACb+B,GAAU,GAAGH,UACbI,GAAU,GAAGJ,UAKnBK,GAAU,WAGN,OAFqB,QAArBzC,EAAAuB,aAAS,EAATA,EAAWmB,QAAQ,UAAE,IAAA1C,GAAAA,EAAE2C,QACvBC,SAASC,iBAAiB,QAASC,IAC5B,IAAMF,SAASG,oBAAoB,QAASD,GAAY,GAChE,IAEHL,GAAU,KACN,GAAyB,IAArBnC,EAAwB,CACpBM,GAAiBA,IACrB,MAAMoC,EAAUC,KAEhB,MAAO,IAAMD,GACjB,IACD,CAACf,IAEJiB,EAAoBjD,GAAK,KAAA,CACrBkD,cAAe,KACXjB,EAAoB,IAAIC,MACxBH,EAAa1B,EAAiB,MAItCmC,GAAU,KACNhB,EAAYiB,QAAU/B,CAAQ,GAC/B,CAACA,IAEJ8B,GAAU,KACFtC,EAAMiD,SAAW3C,GACjBkB,EAAaxB,EACjB,GACD,CAACA,IAKJ,MAAMkD,GAAwBC,IAC1B,GAAIA,GAAiBC,EAAkBD,EAAe7C,GAAa,CAC/D,MAAM+C,EAAmBF,EAAcG,MAAM,IAM7C,OALA9B,EAAa6B,GACT/B,EAAYiB,SACZjB,EAAYiB,QAAQc,IAGjB,CACX,CAEA,OAAO,CAAK,EAGVE,GACDC,GAAmBC,UAChB,MAAMC,EAAaD,EAAME,OAAO3D,MAG1B4D,EAAerC,EAAUsC,OAAOC,GAAgB,KAARA,IACxCC,EAAcC,EAChBN,EACApD,EACAC,GAEJ,GAAIqD,GAAgBV,GAAqBa,GACrC,OAIJ,MAAM/D,EAAQ0D,EAAWO,QAAQ,UAAW,IAC5C,GAAIb,EAAkBpD,GAAQ,CAC1B,MAAMkE,EAAe,IAAI3C,GAEzB2C,EAAaV,GAASxD,EAAMmE,UAAUnE,EAAMiD,OAAS,GACzB,QAA5BpD,EAAAuB,EAAUmB,QAAQiB,EAAQ,UAAE,IAAA3D,GAAAA,EAAE2C,QAE9BhB,EAAa0C,GAET1D,GACAA,EAAS0D,EAEjB,GAGFE,GACDZ,GAAmBC,cAChB,MAAMY,IAAEA,EAAGC,KAAEA,GAASb,EAEtB,GAAY,cAARY,GAAgC,cAATC,EAAsB,CAC7C,MAAMJ,EAAe,IAAI3C,GACG,KAAxB2C,EAAaV,GACbU,EAAaV,GAAS,GACL,IAAVA,IACPU,EAAaV,EAAQ,GAAK,GACE,QAA5B3D,EAAAuB,EAAUmB,QAAQiB,EAAQ,UAAE,IAAA3D,GAAAA,EAAE2C,SAGlChB,EAAa0C,GAET1D,GACAA,EAAS0D,EAEjB,KAA0B,eAAfT,EAAMa,KACe,QAA5BvD,EAAAK,EAAUmB,QAAQiB,EAAQ,UAAE,IAAAzC,GAAAA,EAAEyB,QACR,cAAfiB,EAAMa,OACe,QAA5BC,EAAAnD,EAAUmB,QAAQiB,EAAQ,UAAE,IAAAe,GAAAA,EAAE/B,QAClC,EAGFG,GAAec,IACjB,IAAKA,EAAMe,cAAe,OAE1B,MAAMC,EAAchB,EAAMe,cAAcE,QAAQ,QAC1CX,EAAcC,EAChBS,EACAnE,EACAC,GAEC2C,GAAqBa,IACtBN,EAAMkB,gBACV,EAmBEC,GAAmB,KACrB,MAAMC,EAAc7C,KAAK8C,MACnBC,EAA4C,IAAnB5E,EAE/B,OACI0E,EAAc/C,EAAiBkD,UAAYD,CAAsB,EAInEjC,GAAiB,KACnB,MAAMmC,EAAWC,aAAY,KACzB,MAAML,EAAc7C,KAAK8C,MACnBC,EAA4C,IAAnB5E,EAEzBgF,EAAQC,KAAKC,MACdvD,EAAiBkD,UACdD,EACAF,GACA,KAERhD,EAAasD,GACTA,GAAS,GACLzE,GAAeA,IACnB4E,cAAcL,IACPrE,GACPA,EAAkBuE,EACtB,GACD,KAEH,MAAO,KACHG,cAAcL,EAAS,CAC1B,EAGCM,GAAa,CAAC/B,EAAegC,EAAcjF,IACtCA,EACD,GAAGA,KAAUiF,KAAQhC,EAAQ,IAC7B,GAAGgC,KAAQhC,EAAQ,IAGvBiC,GAAkBC,GACb,GAAGA,WAAuB,IAATA,EAAa,GAAK,MA0B9C,OACIC,EAAA,MAAA,CACI5F,GAAIA,gBACSE,EACbC,UAAW0F,EAAKC,EAAgB3F,GAAU4F,SAAA,CAE1CH,EAAA,MAAA,CACIzF,UAAW6F,EACXC,KAAK,QAAO,aACA,GAAG1F,0BAAkCwF,SAAA,CAEhDvF,GACGoF,EAACM,EAAWC,OAAM,CACdC,GAAG,OACHjG,UAAWkG,EAAa,cACZ,aACZC,OAAO,qBAEPC,EAACC,6BACA,GAAGhG,EAAOP,SAASO,EAAOiG,eAGlCjF,EAAUkF,KAAI,CAACC,EAAMlD,IAEd8C,EAACK,EAAKC,OAAAC,OAAA,CACF3G,UAAW4G,EACX/G,GAAIwF,GAAW/B,EAAO,YAAazD,GAAG,cACzBwF,GACT/B,EACA,YACAvD,GACH,aACW,GAAG8G,EAAaC,cACxBxD,EAAQ,0BAEErB,EAAQ,mBACJA,EAAWC,QAAU6E,EAEvCnH,IAAMoH,GAAQ9F,EAAUmB,QAAQiB,GAAS0D,EACzCC,KAAK,OACLC,UAAU,UACVpH,MAAO0G,EACPW,MAAOlF,EACP3B,SAAU+C,GAAaC,GACvB8D,UAAWlD,GAAcZ,GACzB+D,aAAa,OACT1G,GATC2C,QAcpBnD,GACGiG,EAACkB,EAAgB,CAACzH,GAAIqC,GAAO,cAAc,oBAAmB0D,SACzDzF,IAITsF,EAACY,EAAc,CAACP,KAAK,QAAQjG,GAAIsC,aAC5BoD,GAAe7D,GAAU,gBAE9B0E,EAACC,EAAc,CAAA,YAAW,SAAQT,SAC7BlE,EAAY,EAAI,GAAK,yBAExBjB,GACE2F,EAACmB,EAAMb,OAAAC,OAAA,CACH3G,UAAWwH,EACXxG,UAAWA,EACXiG,KAAK,SACLQ,SAAS,SACLxG,GACJF,QAzJKwC,IACjBjC,EAAa,IAAIE,MAAMpB,GAAYqB,KAAK,KAEnCiD,OACD7C,EAAoB,IAAIC,MACxBH,EAAa1B,IAGbc,GACAA,EAAQwC,EACZ,EAgJYzC,SAAUA,GAAY4D,MA3F3BzD,EAAc2E,SACf,CAAEA,SAAU3E,EAAc2E,UAC1B,CACIA,SACIlE,EAAY,EACN,iBAAiB6D,GAAe7D,KAChC,aAEV,aACIA,EAAY,EACN,iBAAiB6D,GAAetF,KAChC,aAEV,mBAAoBkC,QAkFxB"}
1
+ {"version":3,"file":"otp-input.js","sources":["../../src/otp-input/otp-input.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport type React from \"react\";\nimport {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from \"react\";\n\nimport { Button } from \"../button\";\nimport { FormErrorMessage } from \"../form/form-label\";\nimport { Input } from \"../input\";\nimport { VisuallyHidden } from \"../shared/accessibility\";\nimport { Typography } from \"../typography\";\nimport { StringHelper, useId } from \"../util\";\nimport * as styles from \"./otp-input.styles\";\nimport type { OtpInputProps, OtpInputRef } from \"./types\";\nimport { stripOtpFromAutofill, validateUserInput } from \"./utils\";\n\nconst Component = (\n {\n id,\n value = [],\n \"data-testid\": dataTestId,\n className,\n cooldownDuration,\n actionButtonProps,\n errorMessage,\n numOfInput,\n prefix,\n onChange,\n onCooldownStart,\n onCooldownEnd,\n otpOnly,\n onCountdownChange,\n ...otherProps\n }: OtpInputProps,\n ref: React.Ref<OtpInputRef>\n) => {\n // =============================================================================\n // CONST, STATE, REF\n // =============================================================================\n const {\n disabled,\n onClick,\n styleType = \"secondary\",\n ...otherCtaProps\n } = actionButtonProps ?? {};\n\n const inputRefs = useRef<(HTMLInputElement | null)[]>([]);\n const onChangeRef = useRef(onChange);\n\n const [otpValues, setOtpValues] = useState<string[]>(\n new Array(numOfInput).fill(\"\")\n );\n const [countDown, setCountDown] = useState<number>(cooldownDuration);\n const [lastCtaTimestamp, setLastCtaTimestamp] = useState<Date>(new Date());\n const internalId = useId();\n\n const hasError = !!errorMessage;\n const errorId = `${internalId}-error`;\n const timerId = `${internalId}-timer`;\n\n // =============================================================================\n // EFFECTS\n // =============================================================================\n useEffect(() => {\n inputRefs?.current[0]?.focus();\n document.addEventListener(\"paste\", handlePaste);\n return () => document.removeEventListener(\"paste\", handlePaste);\n }, []);\n\n useEffect(() => {\n if (cooldownDuration !== 0) {\n if (onCooldownStart) onCooldownStart();\n const cleanup = beginCountdown();\n\n return () => cleanup();\n }\n }, [lastCtaTimestamp]);\n\n useImperativeHandle(ref, () => ({\n startCooldown: () => {\n setLastCtaTimestamp(new Date());\n setCountDown(cooldownDuration);\n },\n }));\n\n useEffect(() => {\n onChangeRef.current = onChange;\n }, [onChange]);\n\n useEffect(() => {\n if (value.length === numOfInput) {\n setOtpValues(value);\n }\n }, [value]);\n\n // =============================================================================\n // EVENT HANDLERS\n // =============================================================================\n const handleInputFullValue = (incomingValue: string) => {\n if (incomingValue && validateUserInput(incomingValue, numOfInput)) {\n const incomingValueArr = incomingValue.split(\"\");\n setOtpValues(incomingValueArr);\n if (onChangeRef.current) {\n onChangeRef.current(incomingValueArr);\n }\n\n return true;\n }\n\n return false;\n };\n\n const handleChange =\n (index: number) => (event: React.ChangeEvent<HTMLInputElement>) => {\n const eventValue = event.target.value;\n\n /* handle autofill */\n const fieldIsEmpty = otpValues.every((num) => num === \"\");\n const autofillOtp = stripOtpFromAutofill(\n eventValue,\n numOfInput,\n prefix\n );\n if (fieldIsEmpty && handleInputFullValue(autofillOtp)) {\n return;\n }\n\n /* handle normal input */\n const value = eventValue.replace(/[^0-9]/g, \"\");\n if (validateUserInput(value)) {\n const newOtpValues = [...otpValues];\n\n newOtpValues[index] = value.substring(value.length - 1);\n inputRefs.current[index + 1]?.focus();\n\n setOtpValues(newOtpValues);\n\n if (onChange) {\n onChange(newOtpValues);\n }\n }\n };\n\n const handleKeyDown =\n (index: number) => (event: React.KeyboardEvent<HTMLInputElement>) => {\n const { key, code } = event;\n\n if (key === \"Backspace\" || code === \"Backspace\") {\n const newOtpValues = [...otpValues];\n if (newOtpValues[index] !== \"\") {\n newOtpValues[index] = \"\";\n } else if (index !== 0) {\n newOtpValues[index - 1] = \"\";\n inputRefs.current[index - 1]?.focus();\n }\n\n setOtpValues(newOtpValues);\n\n if (onChange) {\n onChange(newOtpValues);\n }\n } else if (event.code === \"ArrowRight\") {\n inputRefs.current[index + 1]?.focus();\n } else if (event.code === \"ArrowLeft\") {\n inputRefs.current[index - 1]?.focus();\n }\n };\n\n const handlePaste = (event: ClipboardEvent): void => {\n if (!event.clipboardData) return;\n\n const pastedValue = event.clipboardData.getData(\"text\");\n const autofillOtp = stripOtpFromAutofill(\n pastedValue,\n numOfInput,\n prefix\n );\n if (!handleInputFullValue(autofillOtp)) {\n event.preventDefault();\n }\n };\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n setOtpValues(new Array(numOfInput).fill(\"\"));\n\n if (!isWithinCooldown()) {\n setLastCtaTimestamp(new Date());\n setCountDown(cooldownDuration);\n }\n\n if (onClick) {\n onClick(event);\n }\n };\n\n // =========================================================================\n // HELPER FUNCTIONS\n // =========================================================================\n const isWithinCooldown = (): boolean => {\n const currentTime = Date.now();\n const coolDownInMilliseconds = cooldownDuration * 1000;\n\n return (\n currentTime < lastCtaTimestamp.valueOf() + coolDownInMilliseconds\n );\n };\n\n const beginCountdown = () => {\n const interval = setInterval(() => {\n const currentTime = Date.now();\n const coolDownInMilliseconds = cooldownDuration * 1000;\n\n const timer = Math.ceil(\n (lastCtaTimestamp.valueOf() +\n coolDownInMilliseconds -\n currentTime) /\n 1000\n );\n setCountDown(timer);\n if (timer <= 0) {\n if (onCooldownEnd) onCooldownEnd();\n clearInterval(interval);\n } else if (onCountdownChange) {\n onCountdownChange(timer);\n }\n }, 1000);\n\n return () => {\n clearInterval(interval);\n };\n };\n\n const generateId = (index: number, name: string, prefix?: string) => {\n return prefix\n ? `${prefix}-${name}-${index + 1}`\n : `${name}-${index + 1}`;\n };\n\n const displaySeconds = (time: number) => {\n return `${time} second${time === 1 ? \"\" : \"s\"}`;\n };\n\n const getCTALabelProps = (): Partial<\n React.HTMLAttributes<HTMLButtonElement>\n > => {\n return otherCtaProps.children\n ? { children: otherCtaProps.children }\n : {\n children:\n countDown > 0\n ? `Resend OTP in ${displaySeconds(countDown)}`\n : \"Resend OTP\",\n // use a fixed label to avoid repeated screen reader updates when the button is focused\n \"aria-label\":\n countDown > 0\n ? `Resend OTP in ${displaySeconds(cooldownDuration)}`\n : \"Resend OTP\",\n // use a secondary element to reflect the latest countdown\n \"aria-describedby\": timerId,\n };\n };\n\n // =============================================================================\n // RENDER FUNCTIONS\n // =============================================================================\n return (\n <div\n id={id}\n data-testid={dataTestId}\n className={clsx(styles.wrapper, className)}\n >\n <div\n className={styles.inputContainer}\n role=\"group\"\n aria-label={`${numOfInput}-digit OTP input field`}\n >\n {prefix && (\n <Typography.BodyBL\n as=\"span\"\n className={styles.prefix}\n data-testid=\"otp-prefix\"\n weight=\"semibold\"\n >\n <VisuallyHidden>O T P prefix</VisuallyHidden>\n {`${prefix.value} ${prefix.separator}`}\n </Typography.BodyBL>\n )}\n {otpValues.map((data, index) => {\n return (\n <Input\n className={styles.inputField}\n id={generateId(index, \"otp-input\", id)}\n data-testid={generateId(\n index,\n \"otp-input\",\n dataTestId\n )}\n aria-label={`${StringHelper.formatOrdinal(\n index + 1\n )} digit`}\n aria-invalid={hasError}\n aria-describedby={hasError ? errorId : undefined}\n key={index}\n ref={(el) => (inputRefs.current[index] = el)}\n type=\"text\"\n inputMode=\"numeric\"\n value={data}\n error={hasError}\n onChange={handleChange(index)}\n onKeyDown={handleKeyDown(index)}\n autoComplete=\"off\"\n {...otherProps}\n />\n );\n })}\n </div>\n {errorMessage && (\n <FormErrorMessage id={errorId} data-testid=\"otp-error-message\">\n {errorMessage}\n </FormErrorMessage>\n )}\n {/* visually hidden elements need to be rendered before the button so that Voiceover/Chrome doesn't skip the button */}\n <VisuallyHidden role=\"timer\" id={timerId}>\n {displaySeconds(countDown)} remaining\n </VisuallyHidden>\n <VisuallyHidden aria-live=\"polite\">\n {countDown > 0 ? \"\" : \"Ready to resend OTP\"}\n </VisuallyHidden>\n {!otpOnly && (\n <Button\n className={styles.ctaButton}\n styleType={styleType}\n type=\"button\"\n sizeType=\"small\"\n {...otherCtaProps}\n onClick={handleClick}\n disabled={disabled || isWithinCooldown()}\n {...getCTALabelProps()}\n />\n )}\n </div>\n );\n};\n\n// @catalog\n/**\n * A field composed of individual inputs for a numeric one-time password\n * with an in-built countdown mechanism.\n *\n * Use `OtpInput` when users must enter the one-time password (OTP)\n * for multi-factored authentication methods.\n */\nexport const OtpInput = forwardRef(Component);\n"],"names":["OtpInput","forwardRef","_a","ref","id","value","dataTestId","className","cooldownDuration","actionButtonProps","errorMessage","numOfInput","prefix","onChange","onCooldownStart","onCooldownEnd","otpOnly","onCountdownChange","otherProps","__rest","_b","disabled","onClick","styleType","otherCtaProps","inputRefs","useRef","onChangeRef","otpValues","setOtpValues","useState","Array","fill","countDown","setCountDown","lastCtaTimestamp","setLastCtaTimestamp","Date","internalId","useId","hasError","errorId","timerId","useEffect","current","focus","document","addEventListener","handlePaste","removeEventListener","cleanup","beginCountdown","useImperativeHandle","startCooldown","length","handleInputFullValue","incomingValue","validateUserInput","incomingValueArr","split","handleChange","index","event","eventValue","target","fieldIsEmpty","every","num","autofillOtp","stripOtpFromAutofill","replace","newOtpValues","substring","handleKeyDown","key","code","_c","clipboardData","pastedValue","getData","preventDefault","isWithinCooldown","currentTime","now","coolDownInMilliseconds","valueOf","interval","setInterval","timer","Math","ceil","clearInterval","generateId","name","displaySeconds","time","_jsxs","clsx","styles.wrapper","children","styles.inputContainer","role","Typography","BodyBL","as","styles.prefix","weight","_jsx","VisuallyHidden","separator","map","data","Input","Object","assign","styles.inputField","StringHelper","formatOrdinal","undefined","el","type","inputMode","error","onKeyDown","autoComplete","FormErrorMessage","Button","styles.ctaButton","sizeType"],"mappings":"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"}
@@ -1,34 +1,82 @@
1
1
  import type { ButtonProps } from "../button";
2
+ /**
3
+ * Props for the prefix label rendered before the OTP input cells.
4
+ */
5
+ type OtpInputPrefix = {
6
+ /** Prefix text, usually a few alphabetic characters. */
7
+ value: string;
8
+ /**
9
+ * Separator between the prefix and the OTP input.
10
+ * Only `"-"` is supported.
11
+ */
12
+ separator: "-";
13
+ };
14
+ /**
15
+ * Props for the `OtpInput` component.
16
+ */
2
17
  export interface OtpInputProps extends React.AriaAttributes {
3
18
  id?: string | undefined;
4
19
  "data-testid"?: string | undefined;
5
20
  className?: string | undefined;
6
- /** The array of input values */
21
+ /**
22
+ * Controlled array of digit strings, one entry per input cell.
23
+ * Only applied when the array length equals `numOfInput`.
24
+ */
7
25
  value?: string[] | undefined;
26
+ /**
27
+ * Error text displayed below the input cells.
28
+ */
8
29
  errorMessage?: string | React.ReactNode | undefined;
9
- /** The duration (in seconds) to disable the submit button after a click is made */
30
+ /**
31
+ * Duration in seconds to disable the action button after it is clicked.
32
+ * Pass `0` to skip the cooldown entirely.
33
+ */
10
34
  cooldownDuration: number;
11
- /** The props for the submit button */
35
+ /**
36
+ * Props forwarded to the action button. When `children` is not provided,
37
+ * the button label defaults to `"Resend OTP"`, or `"Resend OTP in X seconds"`
38
+ * while a cooldown is active.
39
+ *
40
+ * @default styleType: "secondary"
41
+ */
12
42
  actionButtonProps?: ButtonProps | undefined;
13
- /** Flag to indicate if only OTP inputs should be rendered without the action button */
43
+ /**
44
+ * When `true`, renders only the OTP input cells without the action button.
45
+ */
14
46
  otpOnly?: boolean | undefined;
15
- /** The number of characters for the Otp */
47
+ /**
48
+ * Number of single-digit input cells to render.
49
+ */
16
50
  numOfInput: number;
17
- prefix?: {
18
- /** Optional OTP prefix, usually consisting of a few alphabetic characters */
19
- value: string;
20
- /** separator between prefix and otp digits. Only "-" supported for now */
21
- separator: "-";
22
- } | undefined;
23
- /** Called when one of the input is changed. Returns an array of all the input values */
51
+ /**
52
+ * Optional prefix label rendered before the input cells.
53
+ */
54
+ prefix?: OtpInputPrefix | undefined;
55
+ /**
56
+ * Called when any input cell changes.
57
+ *
58
+ * @param value Array of all input cell values, one string per cell.
59
+ */
24
60
  onChange?: ((value: string[]) => void) | undefined;
25
- /** Called when the countdown changes. Returns the remaining time in seconds */
61
+ /**
62
+ * Called each second while a cooldown countdown is active.
63
+ *
64
+ * @param remaining Seconds remaining in the current cooldown.
65
+ */
26
66
  onCountdownChange?: ((remaining: number) => void) | undefined;
27
- /** Called when the cooldown begins */
67
+ /** Called when a cooldown period begins. */
28
68
  onCooldownStart?: (() => void) | undefined;
29
- /** Called when the cooldown ends */
69
+ /** Called when a cooldown period ends. */
30
70
  onCooldownEnd?: (() => void) | undefined;
31
71
  }
72
+ /**
73
+ * Imperative handle returned by `OtpInput` via `ref`.
74
+ */
32
75
  export type OtpInputRef = {
76
+ /**
77
+ * Starts a new cooldown countdown without clearing the input cells.
78
+ * Fires `onCooldownStart` and begins the countdown timer.
79
+ */
33
80
  startCooldown: () => void;
34
81
  };
82
+ export {};
@@ -1,2 +1,2 @@
1
- import{jsxs as e,jsx as i}from"react/jsx-runtime";import{TickCircleFillIcon as a}from"@lifesg/react-icons";import r from"clsx";import{Button as t}from"../button/button.js";import{FormErrorMessage as n}from"../form/form-label.js";import{InputGroup as d}from"../input-group/input-group.js";import{PhoneNumberInput as o}from"../phone-number-input/phone-number-input.js";import{concatIds as l}from"../shared/accessibility/index.js";import{contactSectionWrapper as s,contactInputSectionWrapper as m,verifiedIconWrapper as c,contactInputWrapper as u,contactInputWrapperError as b,contactInputWrapperDisabled as p,contactInputWrapperReadonly as v,contactButton as h,emailContactInput as f,emailContactInputDisabled as y,emailContactInputReadonly as g,phoneContactInput as O,phoneContactInputDisabled as N,phoneContactInputReadonly as j}from"./contact-input-section.styles.js";const x=({id:x,"data-testid":C,disabled:E,readOnly:P,inputId:$,type:V,sendOtpPlaceholder:S,emailValue:T,onEmailChange:R,phoneNumberValue:q,onPhoneNumberChange:w,fixedCountry:B,isLoading:L,isVerified:k,countdown:A,onSendOtp:I,onStateReset:z,sendOtpError:D,"aria-labelledby":F,"aria-describedby":G})=>{const H=x?`${x}-contact-error`:void 0,J=e=>{z(),"email"===V&&R&&R(e.target.value)},K=e=>{z(),"phone-number"===V&&w&&w(e)},M=e=>{var i;return`Enter your ${null!==(i=null==e?void 0:e.name)&&void 0!==i?i:""} mobile number to receive a verification OTP`.replace(/\s+/g," ")};return e("div",{id:x,"data-testid":C,className:s,children:[e("div",{className:m,children:[e("div",{"data-max-width":"email"===V,className:r(u,!!D&&b,E&&p,P&&v),children:["email"===V?i(d,{id:$,"data-testid":C?`${C}-contact-input`:void 0,placeholder:S||"Enter email",value:T,onChange:J,type:"email",noBorder:!0,"aria-invalid":!!D,"aria-required":!0,"aria-label":"Enter your email address to receive a verification OTP","aria-labelledby":F,"aria-describedby":l(D?H:void 0,G),disabled:E,readOnly:P,className:r(f,E&&y,P&&g)}):i(o,{id:$,"data-testid":C?`${C}-contact-input`:void 0,placeholder:S||"Enter mobile number",value:q,onChange:K,noBorder:!0,fixedCountry:B,"aria-invalid":!!D,"aria-required":!0,getAriaLabel:M,"aria-labelledby":F,"aria-describedby":l(D?H:void 0,G),disabled:E,readOnly:P,className:r(O,E&&N,P&&j)}),k&&i("div",{className:c,"aria-label":"Verified",role:"img",children:i(a,{})})]}),!E&&!P&&i(t,{type:"button","data-testid":C?`${C}-contact-button`:void 0,onClick:I,disabled:A.isRunning||k,loading:L,className:h,children:k?"Verified":L?"":A.isRunning?"Sent OTP":"Send OTP"})]}),D&&i(n,{id:H,"data-testid":C?`${C}-contact-error`:void 0,role:"alert",children:D})]})};export{x as ContactInputSection};
1
+ import{jsxs as e,jsx as i}from"react/jsx-runtime";import{TickCircleFillIcon as a}from"@lifesg/react-icons";import r from"clsx";import{Button as t}from"../button/button.js";import{FormErrorMessage as n}from"../form/form-label/form-label.js";import{InputGroup as o}from"../input-group/input-group.js";import{PhoneNumberInput as d}from"../phone-number-input/phone-number-input.js";import{concatIds as l}from"../shared/accessibility/index.js";import{contactSectionWrapper as s,contactInputSectionWrapper as m,verifiedIconWrapper as c,contactInputWrapper as u,contactInputWrapperError as b,contactInputWrapperDisabled as p,contactInputWrapperReadonly as v,contactButton as f,emailContactInput as h,emailContactInputDisabled as y,emailContactInputReadonly as g,phoneContactInput as O,phoneContactInputDisabled as N,phoneContactInputReadonly as j}from"./contact-input-section.styles.js";const x=({id:x,"data-testid":C,disabled:E,readOnly:P,inputId:$,type:V,sendOtpPlaceholder:S,emailValue:T,onEmailChange:R,phoneNumberValue:q,onPhoneNumberChange:w,fixedCountry:B,isLoading:L,isVerified:k,countdown:A,onSendOtp:I,onStateReset:z,sendOtpError:D,"aria-labelledby":F,"aria-describedby":G})=>{const H=x?`${x}-contact-error`:void 0,J=e=>{z(),"email"===V&&R&&R(e.target.value)},K=e=>{z(),"phone-number"===V&&w&&w(e)},M=e=>{var i;return`Enter your ${null!==(i=null==e?void 0:e.name)&&void 0!==i?i:""} mobile number to receive a verification OTP`.replace(/\s+/g," ")};return e("div",{id:x,"data-testid":C,className:s,children:[e("div",{className:m,children:[e("div",{"data-max-width":"email"===V,className:r(u,!!D&&b,E&&p,P&&v),children:["email"===V?i(o,{id:$,"data-testid":C?`${C}-contact-input`:void 0,placeholder:S||"Enter email",value:T,onChange:J,type:"email",noBorder:!0,"aria-invalid":!!D,"aria-required":!0,"aria-label":"Enter your email address to receive a verification OTP","aria-labelledby":F,"aria-describedby":l(D?H:void 0,G),disabled:E,readOnly:P,className:r(h,E&&y,P&&g)}):i(d,{id:$,"data-testid":C?`${C}-contact-input`:void 0,placeholder:S||"Enter mobile number",value:q,onChange:K,noBorder:!0,fixedCountry:B,"aria-invalid":!!D,"aria-required":!0,getAriaLabel:M,"aria-labelledby":F,"aria-describedby":l(D?H:void 0,G),disabled:E,readOnly:P,className:r(O,E&&N,P&&j)}),k&&i("div",{className:c,"aria-label":"Verified",role:"img",children:i(a,{})})]}),!E&&!P&&i(t,{type:"button","data-testid":C?`${C}-contact-button`:void 0,onClick:I,disabled:A.isRunning||k,loading:L,className:f,children:k?"Verified":L?"":A.isRunning?"Sent OTP":"Send OTP"})]}),D&&i(n,{id:H,"data-testid":C?`${C}-contact-error`:void 0,role:"alert",children:D})]})};export{x as ContactInputSection};
2
2
  //# sourceMappingURL=contact-input-section.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"contact-input-section.js","sources":["../../src/otp-verification/contact-input-section.tsx"],"sourcesContent":["import { TickCircleFillIcon } from \"@lifesg/react-icons\";\nimport clsx from \"clsx\";\n\nimport { Button } from \"../button\";\nimport { FormErrorMessage } from \"../form/form-label\";\nimport { InputGroup } from \"../input-group\";\nimport type {\n CountryValue,\n PhoneNumberInputValue,\n} from \"../phone-number-input\";\nimport { PhoneNumberInput } from \"../phone-number-input\";\nimport { concatIds } from \"../shared/accessibility\";\nimport * as styles from \"./contact-input-section.styles\";\nimport type { ContactInputSectionProps } from \"./internal-types\";\n\nexport const ContactInputSection = ({\n id,\n \"data-testid\": dataTestId,\n disabled,\n readOnly,\n inputId,\n type,\n sendOtpPlaceholder,\n emailValue,\n onEmailChange,\n phoneNumberValue,\n onPhoneNumberChange,\n fixedCountry,\n isLoading,\n isVerified,\n countdown,\n onSendOtp,\n onStateReset,\n sendOtpError,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n}: ContactInputSectionProps) => {\n const contactErrorId = id ? `${id}-contact-error` : undefined;\n\n // =============================================================================\n // EVENT HANDLERS\n // =============================================================================\n const handleEmailInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onStateReset();\n if (type === \"email\" && onEmailChange) {\n onEmailChange(e.target.value);\n }\n };\n\n const handlePhoneInputChange = (value: PhoneNumberInputValue) => {\n onStateReset();\n if (type === \"phone-number\" && onPhoneNumberChange) {\n onPhoneNumberChange(value);\n }\n };\n\n // =============================================================================\n // HELPER FUNCTIONS\n // =============================================================================\n const getContactButtonText = () => {\n if (isVerified) {\n return \"Verified\";\n }\n\n if (isLoading) {\n return \"\";\n }\n\n if (countdown.isRunning) {\n return \"Sent OTP\";\n }\n\n return \"Send OTP\";\n };\n\n const getMobileAriaLabel = (country?: CountryValue) =>\n `Enter your ${\n country?.name ?? \"\"\n } mobile number to receive a verification OTP`.replace(/\\s+/g, \" \");\n\n // =============================================================================\n // RENDER FUNCTIONS\n // =============================================================================\n const renderContactInput = () =>\n type === \"email\" ? (\n <InputGroup\n id={inputId}\n data-testid={\n dataTestId ? `${dataTestId}-contact-input` : undefined\n }\n placeholder={sendOtpPlaceholder || \"Enter email\"}\n value={emailValue}\n onChange={handleEmailInputChange}\n type=\"email\"\n noBorder\n aria-invalid={!!sendOtpError}\n aria-required={true}\n aria-label=\"Enter your email address to receive a verification OTP\"\n aria-labelledby={ariaLabelledBy}\n aria-describedby={concatIds(\n sendOtpError ? contactErrorId : undefined,\n ariaDescribedBy\n )}\n disabled={disabled}\n readOnly={readOnly}\n className={clsx(\n styles.emailContactInput,\n disabled && styles.emailContactInputDisabled,\n readOnly && styles.emailContactInputReadonly\n )}\n />\n ) : (\n <PhoneNumberInput\n id={inputId}\n data-testid={\n dataTestId ? `${dataTestId}-contact-input` : undefined\n }\n placeholder={sendOtpPlaceholder || \"Enter mobile number\"}\n value={phoneNumberValue}\n onChange={handlePhoneInputChange}\n noBorder\n fixedCountry={fixedCountry}\n aria-invalid={!!sendOtpError}\n aria-required={true}\n getAriaLabel={getMobileAriaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-describedby={concatIds(\n sendOtpError ? contactErrorId : undefined,\n ariaDescribedBy\n )}\n disabled={disabled}\n readOnly={readOnly}\n className={clsx(\n styles.phoneContactInput,\n disabled && styles.phoneContactInputDisabled,\n readOnly && styles.phoneContactInputReadonly\n )}\n />\n );\n\n // =============================================================================\n // RENDER FUNCTIONS\n // =============================================================================\n return (\n <div\n id={id}\n data-testid={dataTestId}\n className={styles.contactSectionWrapper}\n >\n <div className={styles.contactInputSectionWrapper}>\n <div\n data-max-width={type === \"email\"}\n className={clsx(\n styles.contactInputWrapper,\n !!sendOtpError && styles.contactInputWrapperError,\n disabled && styles.contactInputWrapperDisabled,\n readOnly && styles.contactInputWrapperReadonly\n )}\n >\n {renderContactInput()}\n {isVerified && (\n <div\n className={styles.verifiedIconWrapper}\n aria-label=\"Verified\"\n role=\"img\"\n >\n <TickCircleFillIcon />\n </div>\n )}\n </div>\n {!disabled && !readOnly && (\n <Button\n type=\"button\"\n data-testid={\n dataTestId\n ? `${dataTestId}-contact-button`\n : undefined\n }\n onClick={onSendOtp}\n disabled={countdown.isRunning || isVerified}\n loading={isLoading}\n className={styles.contactButton}\n >\n {getContactButtonText()}\n </Button>\n )}\n </div>\n {sendOtpError && (\n <FormErrorMessage\n id={contactErrorId}\n data-testid={\n dataTestId ? `${dataTestId}-contact-error` : undefined\n }\n role=\"alert\"\n >\n {sendOtpError}\n </FormErrorMessage>\n )}\n </div>\n );\n};\n"],"names":["ContactInputSection","id","dataTestId","disabled","readOnly","inputId","type","sendOtpPlaceholder","emailValue","onEmailChange","phoneNumberValue","onPhoneNumberChange","fixedCountry","isLoading","isVerified","countdown","onSendOtp","onStateReset","sendOtpError","ariaLabelledBy","ariaDescribedBy","contactErrorId","undefined","handleEmailInputChange","e","target","value","handlePhoneInputChange","getMobileAriaLabel","country","_a","name","replace","_jsxs","className","styles.contactSectionWrapper","styles.contactInputSectionWrapper","children","clsx","styles.contactInputWrapper","styles.contactInputWrapperError","styles.contactInputWrapperDisabled","styles.contactInputWrapperReadonly","_jsx","InputGroup","placeholder","onChange","noBorder","concatIds","styles.emailContactInput","styles.emailContactInputDisabled","styles.emailContactInputReadonly","PhoneNumberInput","getAriaLabel","styles.phoneContactInput","styles.phoneContactInputDisabled","styles.phoneContactInputReadonly","styles.verifiedIconWrapper","role","TickCircleFillIcon","Button","onClick","isRunning","loading","styles.contactButton","FormErrorMessage"],"mappings":"q2BAeO,MAAMA,EAAsB,EAC/BC,KACA,cAAeC,EACfC,WACAC,WACAC,UACAC,OACAC,qBACAC,aACAC,gBACAC,mBACAC,sBACAC,eACAC,YACAC,aACAC,YACAC,YACAC,eACAC,eACA,kBAAmBC,EACnB,mBAAoBC,MAEpB,MAAMC,EAAiBpB,EAAK,GAAGA,uBAAqBqB,EAK9CC,EAA0BC,IAC5BP,IACa,UAATX,GAAoBG,GACpBA,EAAce,EAAEC,OAAOC,MAC3B,EAGEC,EAA0BD,IAC5BT,IACa,iBAATX,GAA2BK,GAC3BA,EAAoBe,EACxB,EAsBEE,EAAsBC,UACxB,MAAA,sBACIC,EAAAD,aAAO,EAAPA,EAASE,oBAAQ,iDAC0BC,QAAQ,OAAQ,IAAI,EAiEvE,OACIC,SACIhC,GAAIA,EAAE,cACOC,EACbgC,UAAWC,YAEXF,EAAA,MAAA,CAAKC,UAAWE,EAAiCC,SAAA,CAC7CJ,EAAA,MAAA,CAAA,iBAC6B,UAAT3B,EAChB4B,UAAWI,EACPC,IACErB,GAAgBsB,EAClBrC,GAAYsC,EACZrC,GAAYsC,GACfL,SAAA,CAzEJ,UAAT/B,EACIqC,EAACC,GACG3C,GAAII,EAAO,cAEPH,EAAa,GAAGA,uBAA6BoB,EAEjDuB,YAAatC,GAAsB,cACnCmB,MAAOlB,EACPsC,SAAUvB,EACVjB,KAAK,QACLyC,6BACgB7B,EAAY,iBACb,eACJ,yDAAwD,kBAClDC,EAAc,mBACb6B,EACd9B,EAAeG,OAAiBC,EAChCF,GAEJjB,SAAUA,EACVC,SAAUA,EACV8B,UAAWI,EACPW,EACA9C,GAAY+C,EACZ9C,GAAY+C,KAIpBR,EAACS,EAAgB,CACbnD,GAAII,gBAEAH,EAAa,GAAGA,uBAA6BoB,EAEjDuB,YAAatC,GAAsB,sBACnCmB,MAAOhB,EACPoC,SAAUnB,EACVoB,UAAQ,EACRnC,aAAcA,mBACEM,EAAY,iBACb,EACfmC,aAAczB,oBACGT,EAAc,mBACb6B,EACd9B,EAAeG,OAAiBC,EAChCF,GAEJjB,SAAUA,EACVC,SAAUA,EACV8B,UAAWI,EACPgB,EACAnD,GAAYoD,EACZnD,GAAYoD,KAyBX1C,GACG6B,EAAA,MAAA,CACIT,UAAWuB,EAA0B,aAC1B,WACXC,KAAK,MAAKrB,SAEVM,EAACgB,EAAkB,CAAA,SAI7BxD,IAAaC,GACXuC,EAACiB,GACGtD,KAAK,SAAQ,cAETJ,EACM,GAAGA,wBACHoB,EAEVuC,QAAS7C,EACTb,SAAUY,EAAU+C,WAAahD,EACjCiD,QAASlD,EACTqB,UAAW8B,EAAoB3B,SAzH3CvB,EACO,WAGPD,EACO,GAGPE,EAAU+C,UACH,WAGJ,gBAmHF5C,GACGyB,EAACsB,EAAgB,CACbhE,GAAIoB,EAAc,cAEdnB,EAAa,GAAGA,uBAA6BoB,EAEjDoC,KAAK,QAAOrB,SAEXnB,MAGP"}
1
+ {"version":3,"file":"contact-input-section.js","sources":["../../src/otp-verification/contact-input-section.tsx"],"sourcesContent":["import { TickCircleFillIcon } from \"@lifesg/react-icons\";\nimport clsx from \"clsx\";\n\nimport { Button } from \"../button\";\nimport { FormErrorMessage } from \"../form/form-label\";\nimport { InputGroup } from \"../input-group\";\nimport type {\n CountryValue,\n PhoneNumberInputValue,\n} from \"../phone-number-input\";\nimport { PhoneNumberInput } from \"../phone-number-input\";\nimport { concatIds } from \"../shared/accessibility\";\nimport * as styles from \"./contact-input-section.styles\";\nimport type { ContactInputSectionProps } from \"./internal-types\";\n\nexport const ContactInputSection = ({\n id,\n \"data-testid\": dataTestId,\n disabled,\n readOnly,\n inputId,\n type,\n sendOtpPlaceholder,\n emailValue,\n onEmailChange,\n phoneNumberValue,\n onPhoneNumberChange,\n fixedCountry,\n isLoading,\n isVerified,\n countdown,\n onSendOtp,\n onStateReset,\n sendOtpError,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n}: ContactInputSectionProps) => {\n const contactErrorId = id ? `${id}-contact-error` : undefined;\n\n // =============================================================================\n // EVENT HANDLERS\n // =============================================================================\n const handleEmailInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onStateReset();\n if (type === \"email\" && onEmailChange) {\n onEmailChange(e.target.value);\n }\n };\n\n const handlePhoneInputChange = (value: PhoneNumberInputValue) => {\n onStateReset();\n if (type === \"phone-number\" && onPhoneNumberChange) {\n onPhoneNumberChange(value);\n }\n };\n\n // =============================================================================\n // HELPER FUNCTIONS\n // =============================================================================\n const getContactButtonText = () => {\n if (isVerified) {\n return \"Verified\";\n }\n\n if (isLoading) {\n return \"\";\n }\n\n if (countdown.isRunning) {\n return \"Sent OTP\";\n }\n\n return \"Send OTP\";\n };\n\n const getMobileAriaLabel = (country?: CountryValue) =>\n `Enter your ${\n country?.name ?? \"\"\n } mobile number to receive a verification OTP`.replace(/\\s+/g, \" \");\n\n // =============================================================================\n // RENDER FUNCTIONS\n // =============================================================================\n const renderContactInput = () =>\n type === \"email\" ? (\n <InputGroup\n id={inputId}\n data-testid={\n dataTestId ? `${dataTestId}-contact-input` : undefined\n }\n placeholder={sendOtpPlaceholder || \"Enter email\"}\n value={emailValue}\n onChange={handleEmailInputChange}\n type=\"email\"\n noBorder\n aria-invalid={!!sendOtpError}\n aria-required={true}\n aria-label=\"Enter your email address to receive a verification OTP\"\n aria-labelledby={ariaLabelledBy}\n aria-describedby={concatIds(\n sendOtpError ? contactErrorId : undefined,\n ariaDescribedBy\n )}\n disabled={disabled}\n readOnly={readOnly}\n className={clsx(\n styles.emailContactInput,\n disabled && styles.emailContactInputDisabled,\n readOnly && styles.emailContactInputReadonly\n )}\n />\n ) : (\n <PhoneNumberInput\n id={inputId}\n data-testid={\n dataTestId ? `${dataTestId}-contact-input` : undefined\n }\n placeholder={sendOtpPlaceholder || \"Enter mobile number\"}\n value={phoneNumberValue}\n onChange={handlePhoneInputChange}\n noBorder\n fixedCountry={fixedCountry}\n aria-invalid={!!sendOtpError}\n aria-required={true}\n getAriaLabel={getMobileAriaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-describedby={concatIds(\n sendOtpError ? contactErrorId : undefined,\n ariaDescribedBy\n )}\n disabled={disabled}\n readOnly={readOnly}\n className={clsx(\n styles.phoneContactInput,\n disabled && styles.phoneContactInputDisabled,\n readOnly && styles.phoneContactInputReadonly\n )}\n />\n );\n\n // =============================================================================\n // RENDER FUNCTIONS\n // =============================================================================\n return (\n <div\n id={id}\n data-testid={dataTestId}\n className={styles.contactSectionWrapper}\n >\n <div className={styles.contactInputSectionWrapper}>\n <div\n data-max-width={type === \"email\"}\n className={clsx(\n styles.contactInputWrapper,\n !!sendOtpError && styles.contactInputWrapperError,\n disabled && styles.contactInputWrapperDisabled,\n readOnly && styles.contactInputWrapperReadonly\n )}\n >\n {renderContactInput()}\n {isVerified && (\n <div\n className={styles.verifiedIconWrapper}\n aria-label=\"Verified\"\n role=\"img\"\n >\n <TickCircleFillIcon />\n </div>\n )}\n </div>\n {!disabled && !readOnly && (\n <Button\n type=\"button\"\n data-testid={\n dataTestId\n ? `${dataTestId}-contact-button`\n : undefined\n }\n onClick={onSendOtp}\n disabled={countdown.isRunning || isVerified}\n loading={isLoading}\n className={styles.contactButton}\n >\n {getContactButtonText()}\n </Button>\n )}\n </div>\n {sendOtpError && (\n <FormErrorMessage\n id={contactErrorId}\n data-testid={\n dataTestId ? `${dataTestId}-contact-error` : undefined\n }\n role=\"alert\"\n >\n {sendOtpError}\n </FormErrorMessage>\n )}\n </div>\n );\n};\n"],"names":["ContactInputSection","id","dataTestId","disabled","readOnly","inputId","type","sendOtpPlaceholder","emailValue","onEmailChange","phoneNumberValue","onPhoneNumberChange","fixedCountry","isLoading","isVerified","countdown","onSendOtp","onStateReset","sendOtpError","ariaLabelledBy","ariaDescribedBy","contactErrorId","undefined","handleEmailInputChange","e","target","value","handlePhoneInputChange","getMobileAriaLabel","country","_a","name","replace","_jsxs","className","styles.contactSectionWrapper","styles.contactInputSectionWrapper","children","clsx","styles.contactInputWrapper","styles.contactInputWrapperError","styles.contactInputWrapperDisabled","styles.contactInputWrapperReadonly","_jsx","InputGroup","placeholder","onChange","noBorder","concatIds","styles.emailContactInput","styles.emailContactInputDisabled","styles.emailContactInputReadonly","PhoneNumberInput","getAriaLabel","styles.phoneContactInput","styles.phoneContactInputDisabled","styles.phoneContactInputReadonly","styles.verifiedIconWrapper","role","TickCircleFillIcon","Button","onClick","isRunning","loading","styles.contactButton","FormErrorMessage"],"mappings":"g3BAeO,MAAMA,EAAsB,EAC/BC,KACA,cAAeC,EACfC,WACAC,WACAC,UACAC,OACAC,qBACAC,aACAC,gBACAC,mBACAC,sBACAC,eACAC,YACAC,aACAC,YACAC,YACAC,eACAC,eACA,kBAAmBC,EACnB,mBAAoBC,MAEpB,MAAMC,EAAiBpB,EAAK,GAAGA,uBAAqBqB,EAK9CC,EAA0BC,IAC5BP,IACa,UAATX,GAAoBG,GACpBA,EAAce,EAAEC,OAAOC,MAC3B,EAGEC,EAA0BD,IAC5BT,IACa,iBAATX,GAA2BK,GAC3BA,EAAoBe,EACxB,EAsBEE,EAAsBC,UACxB,MAAA,sBACIC,EAAAD,aAAO,EAAPA,EAASE,oBAAQ,iDAC0BC,QAAQ,OAAQ,IAAI,EAiEvE,OACIC,SACIhC,GAAIA,EAAE,cACOC,EACbgC,UAAWC,YAEXF,EAAA,MAAA,CAAKC,UAAWE,EAAiCC,SAAA,CAC7CJ,EAAA,MAAA,CAAA,iBAC6B,UAAT3B,EAChB4B,UAAWI,EACPC,IACErB,GAAgBsB,EAClBrC,GAAYsC,EACZrC,GAAYsC,GACfL,SAAA,CAzEJ,UAAT/B,EACIqC,EAACC,GACG3C,GAAII,EAAO,cAEPH,EAAa,GAAGA,uBAA6BoB,EAEjDuB,YAAatC,GAAsB,cACnCmB,MAAOlB,EACPsC,SAAUvB,EACVjB,KAAK,QACLyC,6BACgB7B,EAAY,iBACb,eACJ,yDAAwD,kBAClDC,EAAc,mBACb6B,EACd9B,EAAeG,OAAiBC,EAChCF,GAEJjB,SAAUA,EACVC,SAAUA,EACV8B,UAAWI,EACPW,EACA9C,GAAY+C,EACZ9C,GAAY+C,KAIpBR,EAACS,EAAgB,CACbnD,GAAII,gBAEAH,EAAa,GAAGA,uBAA6BoB,EAEjDuB,YAAatC,GAAsB,sBACnCmB,MAAOhB,EACPoC,SAAUnB,EACVoB,UAAQ,EACRnC,aAAcA,mBACEM,EAAY,iBACb,EACfmC,aAAczB,oBACGT,EAAc,mBACb6B,EACd9B,EAAeG,OAAiBC,EAChCF,GAEJjB,SAAUA,EACVC,SAAUA,EACV8B,UAAWI,EACPgB,EACAnD,GAAYoD,EACZnD,GAAYoD,KAyBX1C,GACG6B,EAAA,MAAA,CACIT,UAAWuB,EAA0B,aAC1B,WACXC,KAAK,MAAKrB,SAEVM,EAACgB,EAAkB,CAAA,SAI7BxD,IAAaC,GACXuC,EAACiB,GACGtD,KAAK,SAAQ,cAETJ,EACM,GAAGA,wBACHoB,EAEVuC,QAAS7C,EACTb,SAAUY,EAAU+C,WAAahD,EACjCiD,QAASlD,EACTqB,UAAW8B,EAAoB3B,SAzH3CvB,EACO,WAGPD,EACO,GAGPE,EAAU+C,UACH,WAGJ,gBAmHF5C,GACGyB,EAACsB,EAAgB,CACbhE,GAAIoB,EAAc,cAEdnB,EAAa,GAAGA,uBAA6BoB,EAEjDoC,KAAK,QAAOrB,SAEXnB,MAGP"}
@@ -25,16 +25,33 @@ export interface ContactInputSectionProps {
25
25
  export interface VerificationSectionProps {
26
26
  id?: string | undefined;
27
27
  "data-testid"?: string | undefined;
28
+ countdown: ReturnType<typeof useCountdown>;
29
+ isVerifyLoading: boolean;
30
+ otpCode?: string | undefined;
31
+ otpPrefix?: string | undefined;
32
+ otpSeparator?: string | undefined;
28
33
  type: "email" | "phone-number";
34
+ /**
35
+ * Whether to display the thumbnail image in the OTP verification section,
36
+ * visible in the `"sent"` state.
37
+ */
29
38
  showVerifyOtpThumbnail?: boolean | undefined;
39
+ /**
40
+ * Custom icon in the OTP verification section, visible in the `"sent"` state.
41
+ */
42
+ verifyOtpIcon?: React.ReactNode | undefined;
43
+ /**
44
+ * Custom heading in the OTP verification section, visible in the `"sent"` state.
45
+ */
30
46
  verifyOtpTitle?: string | undefined;
47
+ /**
48
+ * Custom body text in the OTP verification section, visible in the `"sent"` state.
49
+ */
31
50
  verifyOtpMessage?: string | undefined;
51
+ /**
52
+ * Error message displayed below the OTP input after a failed verification attempt.
53
+ */
32
54
  verifyOtpError?: string | undefined;
33
- otpCode?: string | undefined;
34
55
  setOtpCode?: (value: string) => void;
35
- isVerifyLoading: boolean;
36
- countdown: ReturnType<typeof useCountdown>;
37
56
  onVerifyOtp: () => void;
38
- otpPrefix?: string | undefined;
39
- otpSeparator?: string | undefined;
40
57
  }
@@ -1,2 +1,8 @@
1
1
  import type { OtpVerificationProps } from "./types";
2
+ /**
3
+ * A multi-step form component that guides users through OTP-based verification.
4
+ *
5
+ * Use `OtpVerification` when you need to verify a user's identity through
6
+ * email address or phone number.
7
+ */
2
8
  export declare const OtpVerification: (props: OtpVerificationProps) => import("react/jsx-runtime").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"otp-verification.js","sources":["../../src/otp-verification/otp-verification.tsx"],"sourcesContent":["import { announce, clearAnnouncer } from \"@react-aria/live-announcer\";\nimport clsx from \"clsx\";\nimport { useState } from \"react\";\n\nimport { useCountdown } from \"../util\";\nimport { ContactInputSection } from \"./contact-input-section\";\nimport * as styles from \"./otp-verification.styles\";\nimport type { OtpVerificationProps } from \"./types\";\nimport { VerificationSection } from \"./verification-section\";\n\nexport const OtpVerification = (props: OtpVerificationProps) => {\n // =============================================================================\n // CONST, STATE, REF\n // =============================================================================\n const {\n id,\n \"data-testid\": dataTestId,\n className,\n inputId,\n onSendOtp,\n onVerifyOtp,\n verifyOtpCountdownTimer = 60,\n sendOtpError,\n verifyOtpError,\n otpValue,\n onOtpChange,\n otpState,\n onOtpStateChange,\n otpReminderInterval = 120,\n } = props;\n\n const [isLoading, setIsLoading] = useState(false);\n const [isVerifyLoading, setIsVerifyLoading] = useState(false);\n\n const countdown = useCountdown({\n duration: verifyOtpCountdownTimer,\n reminderInterval: otpReminderInterval,\n getStartMessage: (duration) =>\n `You can resend the OTP in ${duration} seconds`,\n getIntervalMessage: (remaining) => `${remaining} seconds remaining`,\n getCompletionMessage: () => \"You can now resend the OTP\",\n });\n\n // =============================================================================\n // EVENT HANDLERS\n // =============================================================================\n // Send OTP\n const handleSendOtp = async () => {\n if (!onSendOtp || isLoading) return;\n\n try {\n setIsLoading(true);\n await onSendOtp();\n onOtpStateChange(\"sent\");\n countdown.reset();\n countdown.start();\n } catch {\n // do nothing\n } finally {\n setIsLoading(false);\n }\n };\n\n // Verify OTP\n const handleVerifyOtp = async () => {\n if (!onVerifyOtp || isVerifyLoading || !otpValue?.value) return;\n\n try {\n setIsVerifyLoading(true);\n await onVerifyOtp(otpValue.value);\n\n onOtpStateChange(\"verified\");\n\n clearAnnouncer(\"polite\");\n announce(\n \"Success. Your email or mobile number has been verified.\",\n \"polite\"\n );\n\n // Reset the countdown and clear the OTP code in case user enter new OTP later\n countdown.reset();\n onOtpChange?.(\"\");\n } catch {\n // do nothing\n } finally {\n setIsVerifyLoading(false);\n }\n };\n\n // =============================================================================\n // HELPER FUNCTIONS\n // =============================================================================\n const resetToDefault = () => {\n if (otpState === \"verified\") {\n onOtpStateChange(\"default\");\n }\n };\n\n // =============================================================================\n // RENDER FUNCTIONS\n // =============================================================================\n return (\n <div\n id={id}\n data-testid={dataTestId}\n className={clsx(styles.otpInputWrapper, className)}\n >\n <ContactInputSection\n {...props}\n inputId={inputId}\n data-testid={dataTestId ? `${dataTestId}-contact` : undefined}\n isLoading={isLoading}\n isVerified={otpState === \"verified\"}\n countdown={countdown}\n onSendOtp={handleSendOtp}\n onStateReset={resetToDefault}\n sendOtpError={sendOtpError}\n fixedCountry={\n props.type === \"phone-number\" ? props.fixedCountry : true\n }\n />\n\n {otpState === \"sent\" && (\n <VerificationSection\n {...props}\n data-testid={\n dataTestId ? `${dataTestId}-verification` : undefined\n }\n otpCode={otpValue?.value}\n otpPrefix={otpValue?.prefix}\n otpSeparator={otpValue?.separator}\n setOtpCode={onOtpChange}\n isVerifyLoading={isVerifyLoading}\n countdown={countdown}\n onVerifyOtp={handleVerifyOtp}\n verifyOtpError={verifyOtpError}\n />\n )}\n </div>\n );\n};\n"],"names":["OtpVerification","props","id","dataTestId","className","inputId","onSendOtp","onVerifyOtp","verifyOtpCountdownTimer","sendOtpError","verifyOtpError","otpValue","onOtpChange","otpState","onOtpStateChange","otpReminderInterval","isLoading","setIsLoading","useState","isVerifyLoading","setIsVerifyLoading","countdown","useCountdown","duration","reminderInterval","getStartMessage","getIntervalMessage","remaining","getCompletionMessage","_jsxs","clsx","styles.otpInputWrapper","children","_jsx","ContactInputSection","Object","assign","undefined","isVerified","__awaiter","reset","start","_a","onStateReset","fixedCountry","type","VerificationSection","otpCode","value","otpPrefix","prefix","otpSeparator","separator","setOtpCode","clearAnnouncer","announce"],"mappings":"6mBAUO,MAAMA,EAAmBC,IAI5B,MAAMC,GACFA,EACA,cAAeC,EAAUC,UACzBA,EAASC,QACTA,EAAOC,UACPA,EAASC,YACTA,EAAWC,wBACXA,EAA0B,GAAEC,aAC5BA,EAAYC,eACZA,EAAcC,SACdA,EAAQC,YACRA,EAAWC,SACXA,EAAQC,iBACRA,EAAgBC,oBAChBA,EAAsB,KACtBd,GAEGe,EAAWC,GAAgBC,GAAS,IACpCC,EAAiBC,GAAsBF,GAAS,GAEjDG,EAAYC,EAAa,CAC3BC,SAAUf,EACVgB,iBAAkBT,EAClBU,gBAAkBF,GACd,6BAA6BA,YACjCG,mBAAqBC,GAAc,GAAGA,sBACtCC,qBAAsB,IAAM,+BA6DhC,OACIC,EAAA,MAAA,CACI3B,GAAIA,gBACSC,EACbC,UAAW0B,EAAKC,EAAwB3B,GAAU4B,SAAA,CAElDC,EAACC,EAAmBC,OAAAC,OAAA,CAAA,EACZnC,EAAK,CACTI,QAASA,EAAO,cACHF,EAAa,GAAGA,iBAAuBkC,EACpDrB,UAAWA,EACXsB,WAAyB,aAAbzB,EACZQ,UAAWA,EACXf,UAnEU,IAAWiC,OAAA,OAAA,OAAA,GAAA,YAC7B,GAAKjC,IAAaU,EAElB,IACIC,GAAa,SACPX,IACNQ,EAAiB,QACjBO,EAAUmB,QACVnB,EAAUoB,OACd,CAAE,MAAAC,GAEF,SACIzB,GAAa,EACjB,CACJ,IAsDY0B,aAvBW,KACF,aAAb9B,GACAC,EAAiB,UACrB,EAqBQL,aAAcA,EACdmC,aACmB,iBAAf3C,EAAM4C,MAA0B5C,EAAM2C,gBAIhC,SAAb/B,GACGoB,EAACa,mBACO7C,EAAK,CAAA,cAELE,EAAa,GAAGA,sBAA4BkC,EAEhDU,QAASpC,eAAAA,EAAUqC,MACnBC,UAAWtC,aAAQ,EAARA,EAAUuC,OACrBC,aAAcxC,aAAQ,EAARA,EAAUyC,UACxBC,WAAYzC,EACZO,gBAAiBA,EACjBE,UAAWA,EACXd,YAtEQ,IAAWgC,OAAA,OAAA,OAAA,GAAA,YAC/B,GAAKhC,IAAeY,IAAoBR,aAAQ,EAARA,EAAUqC,OAElD,IACI5B,GAAmB,SACbb,EAAYI,EAASqC,OAE3BlC,EAAiB,YAEjBwC,EAAe,UACfC,EACI,0DACA,UAIJlC,EAAUmB,QACV5B,SAAAA,EAAc,GAClB,CAAE,MAAA8B,GAEF,SACItB,GAAmB,EACvB,CACJ,IAgDgBV,eAAgBA,OAGtB"}
1
+ {"version":3,"file":"otp-verification.js","sources":["../../src/otp-verification/otp-verification.tsx"],"sourcesContent":["import { announce, clearAnnouncer } from \"@react-aria/live-announcer\";\nimport clsx from \"clsx\";\nimport { useState } from \"react\";\n\nimport { useCountdown } from \"../util\";\nimport { ContactInputSection } from \"./contact-input-section\";\nimport * as styles from \"./otp-verification.styles\";\nimport type { OtpVerificationProps } from \"./types\";\nimport { VerificationSection } from \"./verification-section\";\n\n// @catalog\n/**\n * A multi-step form component that guides users through OTP-based verification.\n *\n * Use `OtpVerification` when you need to verify a user's identity through\n * email address or phone number.\n */\nexport const OtpVerification = (props: OtpVerificationProps) => {\n // =============================================================================\n // CONST, STATE, REF\n // =============================================================================\n const {\n id,\n \"data-testid\": dataTestId,\n className,\n inputId,\n onSendOtp,\n onVerifyOtp,\n verifyOtpCountdownTimer = 60,\n sendOtpError,\n verifyOtpError,\n otpValue,\n onOtpChange,\n otpState,\n onOtpStateChange,\n otpReminderInterval = 120,\n } = props;\n\n const [isLoading, setIsLoading] = useState(false);\n const [isVerifyLoading, setIsVerifyLoading] = useState(false);\n\n const countdown = useCountdown({\n duration: verifyOtpCountdownTimer,\n reminderInterval: otpReminderInterval,\n getStartMessage: (duration) =>\n `You can resend the OTP in ${duration} seconds`,\n getIntervalMessage: (remaining) => `${remaining} seconds remaining`,\n getCompletionMessage: () => \"You can now resend the OTP\",\n });\n\n // =============================================================================\n // EVENT HANDLERS\n // =============================================================================\n // Send OTP\n const handleSendOtp = async () => {\n if (!onSendOtp || isLoading) return;\n\n try {\n setIsLoading(true);\n await onSendOtp();\n onOtpStateChange(\"sent\");\n countdown.reset();\n countdown.start();\n } catch {\n // do nothing\n } finally {\n setIsLoading(false);\n }\n };\n\n // Verify OTP\n const handleVerifyOtp = async () => {\n if (!onVerifyOtp || isVerifyLoading || !otpValue?.value) return;\n\n try {\n setIsVerifyLoading(true);\n await onVerifyOtp(otpValue.value);\n\n onOtpStateChange(\"verified\");\n\n clearAnnouncer(\"polite\");\n announce(\n \"Success. Your email or mobile number has been verified.\",\n \"polite\"\n );\n\n // Reset the countdown and clear the OTP code in case user enter new OTP later\n countdown.reset();\n onOtpChange?.(\"\");\n } catch {\n // do nothing\n } finally {\n setIsVerifyLoading(false);\n }\n };\n\n // =============================================================================\n // HELPER FUNCTIONS\n // =============================================================================\n const resetToDefault = () => {\n if (otpState === \"verified\") {\n onOtpStateChange(\"default\");\n }\n };\n\n // =============================================================================\n // RENDER FUNCTIONS\n // =============================================================================\n return (\n <div\n id={id}\n data-testid={dataTestId}\n className={clsx(styles.otpInputWrapper, className)}\n >\n <ContactInputSection\n {...props}\n inputId={inputId}\n data-testid={dataTestId ? `${dataTestId}-contact` : undefined}\n isLoading={isLoading}\n isVerified={otpState === \"verified\"}\n countdown={countdown}\n onSendOtp={handleSendOtp}\n onStateReset={resetToDefault}\n sendOtpError={sendOtpError}\n fixedCountry={\n props.type === \"phone-number\" ? props.fixedCountry : true\n }\n />\n\n {otpState === \"sent\" && (\n <VerificationSection\n {...props}\n data-testid={\n dataTestId ? `${dataTestId}-verification` : undefined\n }\n otpCode={otpValue?.value}\n otpPrefix={otpValue?.prefix}\n otpSeparator={otpValue?.separator}\n setOtpCode={onOtpChange}\n isVerifyLoading={isVerifyLoading}\n countdown={countdown}\n onVerifyOtp={handleVerifyOtp}\n verifyOtpError={verifyOtpError}\n />\n )}\n </div>\n );\n};\n"],"names":["OtpVerification","props","id","dataTestId","className","inputId","onSendOtp","onVerifyOtp","verifyOtpCountdownTimer","sendOtpError","verifyOtpError","otpValue","onOtpChange","otpState","onOtpStateChange","otpReminderInterval","isLoading","setIsLoading","useState","isVerifyLoading","setIsVerifyLoading","countdown","useCountdown","duration","reminderInterval","getStartMessage","getIntervalMessage","remaining","getCompletionMessage","_jsxs","clsx","styles.otpInputWrapper","children","_jsx","ContactInputSection","Object","assign","undefined","isVerified","__awaiter","reset","start","_a","onStateReset","fixedCountry","type","VerificationSection","otpCode","value","otpPrefix","prefix","otpSeparator","separator","setOtpCode","clearAnnouncer","announce"],"mappings":"6mBAiBO,MAAMA,EAAmBC,IAI5B,MAAMC,GACFA,EACA,cAAeC,EAAUC,UACzBA,EAASC,QACTA,EAAOC,UACPA,EAASC,YACTA,EAAWC,wBACXA,EAA0B,GAAEC,aAC5BA,EAAYC,eACZA,EAAcC,SACdA,EAAQC,YACRA,EAAWC,SACXA,EAAQC,iBACRA,EAAgBC,oBAChBA,EAAsB,KACtBd,GAEGe,EAAWC,GAAgBC,GAAS,IACpCC,EAAiBC,GAAsBF,GAAS,GAEjDG,EAAYC,EAAa,CAC3BC,SAAUf,EACVgB,iBAAkBT,EAClBU,gBAAkBF,GACd,6BAA6BA,YACjCG,mBAAqBC,GAAc,GAAGA,sBACtCC,qBAAsB,IAAM,+BA6DhC,OACIC,EAAA,MAAA,CACI3B,GAAIA,gBACSC,EACbC,UAAW0B,EAAKC,EAAwB3B,GAAU4B,SAAA,CAElDC,EAACC,EAAmBC,OAAAC,OAAA,CAAA,EACZnC,EAAK,CACTI,QAASA,EAAO,cACHF,EAAa,GAAGA,iBAAuBkC,EACpDrB,UAAWA,EACXsB,WAAyB,aAAbzB,EACZQ,UAAWA,EACXf,UAnEU,IAAWiC,OAAA,OAAA,OAAA,GAAA,YAC7B,GAAKjC,IAAaU,EAElB,IACIC,GAAa,SACPX,IACNQ,EAAiB,QACjBO,EAAUmB,QACVnB,EAAUoB,OACd,CAAE,MAAAC,GAEF,SACIzB,GAAa,EACjB,CACJ,IAsDY0B,aAvBW,KACF,aAAb9B,GACAC,EAAiB,UACrB,EAqBQL,aAAcA,EACdmC,aACmB,iBAAf3C,EAAM4C,MAA0B5C,EAAM2C,gBAIhC,SAAb/B,GACGoB,EAACa,mBACO7C,EAAK,CAAA,cAELE,EAAa,GAAGA,sBAA4BkC,EAEhDU,QAASpC,eAAAA,EAAUqC,MACnBC,UAAWtC,aAAQ,EAARA,EAAUuC,OACrBC,aAAcxC,aAAQ,EAARA,EAAUyC,UACxBC,WAAYzC,EACZO,gBAAiBA,EACjBE,UAAWA,EACXd,YAtEQ,IAAWgC,OAAA,OAAA,OAAA,GAAA,YAC/B,GAAKhC,IAAeY,IAAoBR,aAAQ,EAARA,EAAUqC,OAElD,IACI5B,GAAmB,SACbb,EAAYI,EAASqC,OAE3BlC,EAAiB,YAEjBwC,EAAe,UACfC,EACI,0DACA,UAIJlC,EAAUmB,QACV5B,SAAAA,EAAc,GAClB,CAAE,MAAA8B,GAEF,SACItB,GAAmB,EACvB,CACJ,IAgDgBV,eAAgBA,OAGtB"}