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

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 (545) hide show
  1. package/accordion/accordion-item.styles_1j4eb32.css +2 -2
  2. package/accordion/accordion.d.ts +19 -0
  3. package/accordion/accordion.js.map +1 -1
  4. package/accordion/accordion.styles_bzrfrs.css +2 -2
  5. package/accordion/types.d.ts +42 -2
  6. package/alert/alert.d.ts +8 -0
  7. package/alert/alert.js.map +1 -1
  8. package/alert/alert.styles_patwo2.css +2 -2
  9. package/alert/types.d.ts +26 -2
  10. package/animations/loading-dots/loading-dots.styles_1rgrrmw.css +2 -2
  11. package/animations/loading-dots/lottie-animation.styles_1m15v69.css +1 -1
  12. package/animations/loading-dots-spinner/loading-dots-spinner.styles_1hcqkhs.css +2 -2
  13. package/animations/loading-dots-spinner/lottie-animation.styles_13d1unb.css +1 -1
  14. package/animations/loading-spinner/loading-spinner.styles_n6xoft.css +2 -2
  15. package/animations/loading-spinner/lottie-animation.styles_bnn4qt.css +1 -1
  16. package/avatar/avatar.d.ts +7 -0
  17. package/avatar/avatar.js.map +1 -1
  18. package/avatar/avatar.styles_16efw4.css +2 -2
  19. package/avatar/types.d.ts +11 -0
  20. package/badge/badge.d.ts +7 -0
  21. package/badge/badge.js.map +1 -1
  22. package/badge/badge.styles_1c3c6wj.css +2 -2
  23. package/badge/types.d.ts +20 -0
  24. package/box-container/box-container.d.ts +8 -0
  25. package/box-container/box-container.js.map +1 -1
  26. package/box-container/box-container.styles_5t2j9k.css +2 -2
  27. package/box-container/types.d.ts +24 -0
  28. package/breadcrumb/breadcrumb.styles_1nl4aua.css +2 -2
  29. package/button/button.styles_1pxy0co.css +2 -2
  30. package/calendar/calendar.styles_11ho5x8.css +2 -2
  31. package/card/card.styles_1gh9gs3.css +2 -2
  32. package/checkbox/checkbox.styles_gm5bu1.css +2 -2
  33. package/cjs/accordion/accordion-item.styles_1j4eb32.css +2 -2
  34. package/cjs/accordion/accordion.js.map +1 -1
  35. package/cjs/accordion/accordion.styles_bzrfrs.css +2 -2
  36. package/cjs/alert/alert.js.map +1 -1
  37. package/cjs/alert/alert.styles_patwo2.css +2 -2
  38. package/cjs/animations/loading-dots/loading-dots.styles_1rgrrmw.css +2 -2
  39. package/cjs/animations/loading-dots/lottie-animation.styles_1m15v69.css +1 -1
  40. package/cjs/animations/loading-dots-spinner/loading-dots-spinner.styles_1hcqkhs.css +2 -2
  41. package/cjs/animations/loading-dots-spinner/lottie-animation.styles_13d1unb.css +1 -1
  42. package/cjs/animations/loading-spinner/loading-spinner.styles_n6xoft.css +2 -2
  43. package/cjs/animations/loading-spinner/lottie-animation.styles_bnn4qt.css +1 -1
  44. package/cjs/avatar/avatar.js.map +1 -1
  45. package/cjs/avatar/avatar.styles_16efw4.css +2 -2
  46. package/cjs/badge/badge.js.map +1 -1
  47. package/cjs/badge/badge.styles_1c3c6wj.css +2 -2
  48. package/cjs/box-container/box-container.js.map +1 -1
  49. package/cjs/box-container/box-container.styles_5t2j9k.css +2 -2
  50. package/cjs/breadcrumb/breadcrumb.styles_1nl4aua.css +2 -2
  51. package/cjs/button/button.styles_1pxy0co.css +2 -2
  52. package/cjs/calendar/calendar.styles_11ho5x8.css +2 -2
  53. package/cjs/card/card.styles_1gh9gs3.css +2 -2
  54. package/cjs/checkbox/checkbox.styles_gm5bu1.css +2 -2
  55. package/cjs/countdown-timer/countdown-timer.js.map +1 -1
  56. package/cjs/countdown-timer/countdown-timer.styles_ipn1b0.css +2 -2
  57. package/cjs/dashed-border/dashed-border.js.map +1 -1
  58. package/cjs/dashed-border/dashed-border.styles_zszoox.css +2 -2
  59. package/cjs/data-table/data-table.js.map +1 -1
  60. package/cjs/data-table/data-table.styles_1iqq1g7.css +2 -2
  61. package/cjs/date-input/date-input.js.map +1 -1
  62. package/cjs/date-input/date-input.styles_1r5kcc7.css +1 -1
  63. package/cjs/date-navigator/date-navigator.js.map +1 -1
  64. package/cjs/date-navigator/date-navigator.styles_wokh56.css +2 -2
  65. package/cjs/date-range-input/date-range-input.js.map +1 -1
  66. package/cjs/date-range-input/date-range-input.styles_1s7ojnj.css +2 -2
  67. package/cjs/divider/divider.js.map +1 -1
  68. package/cjs/divider/divider.styles_1xpzh8p.css +2 -2
  69. package/cjs/drawer/drawer.js.map +1 -1
  70. package/cjs/drawer/drawer.styles_94hx3y.css +2 -2
  71. package/cjs/e-signature/e-signature-canvas.js +1 -1
  72. package/cjs/e-signature/e-signature-canvas.js.map +1 -1
  73. package/cjs/e-signature/e-signature.js.map +1 -1
  74. package/cjs/e-signature/e-signature.styles_lukd9f.css +2 -2
  75. package/cjs/error-display/error-display.js.map +1 -1
  76. package/cjs/error-display/error-display.styles_d3tql1.css +2 -2
  77. package/cjs/external/dompurify/dist/purify.es.js +3 -3
  78. package/cjs/external/dompurify/dist/purify.es.js.map +1 -1
  79. package/cjs/feedback-rating/feedback-rating-stars-container.styles_dmi8z9.css +2 -2
  80. package/cjs/feedback-rating/feedback-rating.js.map +1 -1
  81. package/cjs/feedback-rating/feedback-rating.styles_1kdklb6.css +2 -2
  82. package/cjs/file-download/file-download.js.map +1 -1
  83. package/cjs/file-download/file-download.styles_iggk8q.css +2 -2
  84. package/cjs/file-download/file-list-card/file-list-card.styles.js +1 -1
  85. package/cjs/file-download/file-list-card/file-list-card.styles.js.map +1 -1
  86. package/cjs/file-download/file-list-card/{file-list-card.styles_oom8ii.css → file-list-card.styles_18j2gut.css} +3 -3
  87. package/cjs/file-upload/dropzone.styles_1pllsau.css +2 -2
  88. package/cjs/file-upload/file-item-edit.js +1 -1
  89. package/cjs/file-upload/file-item-edit.js.map +1 -1
  90. package/cjs/file-upload/file-item-edit.styles.js +1 -1
  91. package/cjs/file-upload/file-item-edit.styles.js.map +1 -1
  92. package/cjs/file-upload/{file-item-edit.styles_1qbpbxj.css → file-item-edit.styles_19bvztn.css} +6 -5
  93. package/cjs/file-upload/file-list/file-list.js +1 -1
  94. package/cjs/file-upload/file-list/file-list.js.map +1 -1
  95. package/cjs/file-upload/file-list/file-list.styles.js +1 -1
  96. package/cjs/file-upload/file-list/file-list.styles.js.map +1 -1
  97. package/cjs/file-upload/file-list/file-list.styles_1w7so98.css +3 -0
  98. package/cjs/file-upload/file-list-item/file-list-item-thumbnail.styles_1y4si19.css +2 -2
  99. package/cjs/file-upload/file-list-item/file-list-item.js +1 -1
  100. package/cjs/file-upload/file-list-item/file-list-item.js.map +1 -1
  101. package/cjs/file-upload/file-list-item/file-list-item.styles.js +1 -1
  102. package/cjs/file-upload/file-list-item/file-list-item.styles.js.map +1 -1
  103. package/cjs/file-upload/file-list-item/file-list-item.styles_o8000f.css +17 -0
  104. package/cjs/file-upload/file-upload.js +1 -1
  105. package/cjs/file-upload/file-upload.js.map +1 -1
  106. package/cjs/file-upload/file-upload.styles_9ffwcd.css +2 -2
  107. package/cjs/filter/addons/filter-item-checkbox.styles_7degw7.css +2 -2
  108. package/cjs/filter/filter-item-page.styles_17ewfrz.css +1 -1
  109. package/cjs/filter/filter-item.js.map +1 -1
  110. package/cjs/filter/filter-item.styles_cphjnj.css +2 -2
  111. package/cjs/filter/filter-modal.styles_qw3xlg.css +2 -2
  112. package/cjs/filter/filter-sidebar.styles_1otwpjl.css +2 -2
  113. package/cjs/filter/filter.js.map +1 -1
  114. package/cjs/filter/filter.styles_1ykijwm.css +2 -2
  115. package/cjs/footer/footer-download-app.styles_1v1j2us.css +2 -2
  116. package/cjs/footer/footer-resource-addon.styles_1jepb1d.css +2 -2
  117. package/cjs/footer/footer.js +1 -1
  118. package/cjs/footer/footer.js.map +1 -1
  119. package/cjs/footer/footer.styles_1msorhc.css +2 -2
  120. package/cjs/form/form-label-addon.styles_b00z8p.css +1 -1
  121. package/cjs/form/form-label.styles.js +1 -1
  122. package/cjs/form/form-label.styles.js.map +1 -1
  123. package/cjs/form/{form-label.styles_11r0652.css → form-label.styles_1nbe0bm.css} +2 -2
  124. package/cjs/form/form-textarea.styles_3p9qoy.css +2 -2
  125. package/cjs/form/form-wrapper.styles_199rslu.css +1 -1
  126. package/cjs/fullscreen-image-carousel/fullscreen-image-carousel.styles_vc6y5c.css +2 -2
  127. package/cjs/fullscreen-image-carousel/stateful-image.styles_1xe8ypm.css +2 -2
  128. package/cjs/histogram-slider/histogram-slider.styles_wvd4w.css +2 -2
  129. package/cjs/image-button/image-button.styles_6n1qsr.css +2 -2
  130. package/cjs/index.js +1 -1
  131. package/cjs/input/input.styles_1cblor0.css +2 -2
  132. package/cjs/input-group/input-group-list-addon.styles_17iuqtw.css +2 -2
  133. package/cjs/input-group/input-group.styles_bqye6f.css +2 -2
  134. package/cjs/input-range-select/input-range-select.styles_adbrbm.css +2 -2
  135. package/cjs/input-range-slider/input-range-slider.styles_aljl2v.css +2 -2
  136. package/cjs/input-textarea/textarea-counter.styles_1n3wsnv.css +1 -1
  137. package/cjs/input-textarea/textarea.styles_22z4n3.css +2 -2
  138. package/cjs/language-switcher/dropdown-panel.styles_1qsjf8d.css +2 -2
  139. package/cjs/language-switcher/dropdown-variant.styles_1vrdfky.css +2 -2
  140. package/cjs/language-switcher/link-container-variant.styles_1iw6zux.css +2 -2
  141. package/cjs/layout/col-div.styles_16o6mwx.css +1 -1
  142. package/cjs/layout/container.styles_v70ec6.css +2 -2
  143. package/cjs/layout/section.styles_hstcaf.css +1 -1
  144. package/cjs/link-list/link-list.styles_m57vks.css +2 -2
  145. package/cjs/local-nav/local-nav-dropdown/local-nav-dropdown.styles_uhd4xl.css +2 -2
  146. package/cjs/local-nav/local-nav-menu/local-nav-menu.styles_pq19dh.css +2 -2
  147. package/cjs/markup/markup.style_1iu40x9.css +2 -2
  148. package/cjs/masked-input/masked-input.styles_1cm388a.css +2 -2
  149. package/cjs/masthead/masthead.styles_1huzon9.css +2 -2
  150. package/cjs/menu/menu-content.styles_p7ijll.css +2 -2
  151. package/cjs/menu/menu-item.styles_liyed8.css +2 -2
  152. package/cjs/menu/menu-link.styles_hfxoez.css +2 -2
  153. package/cjs/menu/menu-section.styles_g7my4d.css +2 -2
  154. package/cjs/modal/modal-box.styles_y52cts.css +2 -2
  155. package/cjs/modal/modal.styles_1lbblx6.css +2 -2
  156. package/cjs/modal-v2/modal-v2.styles_a8gv5i.css +2 -2
  157. package/cjs/modal-v2/slots/slot-styles_13sd376.css +2 -2
  158. package/cjs/navbar/brand.styles_zcgddp.css +1 -1
  159. package/cjs/navbar/drawer.js +1 -1
  160. package/cjs/navbar/drawer.js.map +1 -1
  161. package/cjs/navbar/drawer.styles_7hnxp5.css +2 -2
  162. package/cjs/navbar/menu.styles_gdpqc.css +2 -2
  163. package/cjs/navbar/navbar-action-buttons.styles_1vpm0nk.css +2 -2
  164. package/cjs/navbar/navbar-items.styles_1i3ltot.css +2 -2
  165. package/cjs/navbar/navbar.js +1 -1
  166. package/cjs/navbar/navbar.js.map +1 -1
  167. package/cjs/navbar/navbar.styles_koy0c7.css +2 -2
  168. package/cjs/notification-banner/notification-banner.styles_uxlysy.css +2 -2
  169. package/cjs/otp-input/otp-input.styles_5sbutl.css +2 -2
  170. package/cjs/otp-verification/contact-input-section.styles_odrjvt.css +2 -2
  171. package/cjs/otp-verification/otp-verification.styles_dg9bm8.css +1 -1
  172. package/cjs/otp-verification/thumbnail/thumbnail.styles_shqylh.css +2 -2
  173. package/cjs/otp-verification/verification-section.styles_x8jj.css +2 -2
  174. package/cjs/overlay/overlay.js +1 -1
  175. package/cjs/overlay/overlay.js.map +1 -1
  176. package/cjs/overlay/overlay.styles_12wym18.css +2 -2
  177. package/cjs/pagination/pagination.styles_6bcgva.css +2 -2
  178. package/cjs/pill/pill.styles_xwrniu.css +2 -2
  179. package/cjs/popover/popover-inline/popover-inline.styles_bkopnt.css +2 -2
  180. package/cjs/popover/popover-trigger.styles_8zokig.css +1 -1
  181. package/cjs/popover/popover.styles_ujnf0h.css +2 -2
  182. package/cjs/progress-indicator/progress-indicator.styles_1c038s4.css +2 -2
  183. package/cjs/radio-button/radio-button.styles_1c4v6v.css +2 -2
  184. package/cjs/schedule/schedule-day-view/schedule-day-view.styles_8ti149.css +2 -2
  185. package/cjs/schedule/schedule-header/schedule-header.js +1 -1
  186. package/cjs/schedule/schedule-header/schedule-header.js.map +1 -1
  187. package/cjs/schedule/schedule-header/schedule-header.styles_1n2u5vj.css +2 -2
  188. package/cjs/schedule/schedule-week-view/schedule-week-view.styles_x7x50m.css +2 -2
  189. package/cjs/schedule/schedule-week-view/time-cell.styles_1sorjz8.css +2 -2
  190. package/cjs/schedule/schedule.styles_fdy5a1.css +2 -2
  191. package/cjs/schedule/shared/with-optional-popover.styles_7mv3p2.css +1 -1
  192. package/cjs/schedule/time-indicator/time-indicator.styles_1eaxyes.css +2 -2
  193. package/cjs/select-histogram/select-histogram.styles_n260dy.css +2 -2
  194. package/cjs/shared/accessibility/index_13g9vp.css +1 -1
  195. package/cjs/shared/clickable-icon/clickable-icon.styles_1v2imml.css +2 -2
  196. package/cjs/shared/component-loading-spinner/component-loading-spinner.styles_15eq02i.css +2 -2
  197. package/cjs/shared/dropdown-list/dropdown-label.styles_mloii0.css +2 -2
  198. package/cjs/shared/dropdown-list/dropdown-list.styles_konwm.css +2 -2
  199. package/cjs/shared/dropdown-list/dropdown-search.styles_1hc1gkh.css +2 -2
  200. package/cjs/shared/dropdown-list/expandable-element.styles_rkkvqr.css +2 -2
  201. package/cjs/shared/dropdown-list/nested-dropdown-list.styles_wdhxoe.css +2 -2
  202. package/cjs/shared/dropdown-wrapper/dropdown-wrapper.styles_15hwwoj.css +2 -2
  203. package/cjs/shared/fade-wrapper/fade-wrapper.styles_16iug7l.css +2 -2
  204. package/cjs/shared/image-placeholder/image-placeholder.styles_44nwil.css +1 -1
  205. package/cjs/shared/input-wrapper/input-wrapper.styles_je6maw.css +2 -2
  206. package/cjs/shared/internal-calendar/calendar-dropdown.styles_wybjai.css +1 -1
  207. package/cjs/shared/internal-calendar/calendar-manager.js +1 -1
  208. package/cjs/shared/internal-calendar/calendar-manager.js.map +1 -1
  209. package/cjs/shared/internal-calendar/calendar-manager.styles.js +1 -1
  210. package/cjs/shared/internal-calendar/calendar-manager.styles.js.map +1 -1
  211. package/cjs/shared/internal-calendar/{calendar-manager.styles_1iuq5zw.css → calendar-manager.styles_1njwkj2.css} +3 -3
  212. package/cjs/shared/internal-calendar/day-cell/day-cell.styles_1t5oqc1.css +2 -2
  213. package/cjs/shared/internal-calendar/internal-calendar-month.styles_14oh57f.css +2 -2
  214. package/cjs/shared/internal-calendar/internal-calendar-year.styles_therlc.css +2 -2
  215. package/cjs/shared/internal-calendar/internal-calendar.styles_gnc3eq.css +1 -1
  216. package/cjs/shared/internal-calendar/standard/standard-calendar-day-view.styles_1bw26au.css +2 -2
  217. package/cjs/shared/progress-bar/progress-bar.styles_125ri7a.css +1 -1
  218. package/cjs/shared/range-input-inner-container/range-input-inner-container.styles_1v61utg.css +2 -2
  219. package/cjs/shared/standalone-date-input/standalone-date-input.styles_157qo89.css +2 -2
  220. package/cjs/shared/time-slot/time-slot.styles_18s0to7.css +2 -2
  221. package/cjs/shared/timepicker-dropdown/timepicker-dropdown.styles_119l6k6.css +2 -2
  222. package/cjs/sidenav/sidenav-drawer-item.styles_1ljnyx2.css +2 -2
  223. package/cjs/sidenav/sidenav-drawer-subitem.styles_2y58kf.css +1 -1
  224. package/cjs/sidenav/sidenav-group.styles_1x604sw.css +2 -2
  225. package/cjs/sidenav/sidenav-item.styles_lqw3kh.css +2 -2
  226. package/cjs/sidenav/sidenav.styles_1vxezie.css +2 -2
  227. package/cjs/singpass-button/singpass-button.styles_1miyex3.css +2 -2
  228. package/cjs/smart-app-banner/smart-app-banner.styles_15u6yv4.css +2 -2
  229. package/cjs/tab/tab-link-chain.styles_49got4.css +2 -2
  230. package/cjs/tab/tab.styles_1najffw.css +1 -1
  231. package/cjs/table/table.styles_1af5ipv.css +2 -2
  232. package/cjs/tag/tag.style_d98c53.css +2 -2
  233. package/cjs/text-list/text-list.styles_w3fvyt.css +2 -2
  234. package/cjs/theme/types.js +1 -1
  235. package/cjs/theme/types.js.map +1 -1
  236. package/cjs/theme/utils/use-design-token-override.js +2 -0
  237. package/cjs/theme/utils/use-design-token-override.js.map +1 -0
  238. package/cjs/time-range-picker/combobox-picker/combobox-picker.styles_7i9vso.css +1 -1
  239. package/cjs/time-range-picker/common.styles_1qwp4xa.css +2 -2
  240. package/cjs/time-slot-bar/time-slot-bar.styles_wigbyd.css +2 -2
  241. package/cjs/time-slot-bar-week/time-slot-bar-week-days.styles_evdvs9.css +2 -2
  242. package/cjs/time-slot-bar-week/time-slot-bar-week.styles_11ybf42.css +1 -1
  243. package/cjs/time-slot-week-view/time-slot-week-days.styles_1h21vyw.css +2 -2
  244. package/cjs/time-slot-week-view/time-slot-week-view.styles_gqgsw2.css +1 -1
  245. package/cjs/timeline/timeline.styles_1jxzik4.css +2 -2
  246. package/cjs/timepicker/timepicker.styles_1jm33yw.css +1 -1
  247. package/cjs/timetable/timetable-header/timetable-header.styles_11gl1h4.css +2 -2
  248. package/cjs/timetable/timetable-row/row-bar.styles_1x0vrsz.css +1 -1
  249. package/cjs/timetable/timetable-row/row-cell.styles_y1dl5j.css +2 -2
  250. package/cjs/timetable/timetable.styles_7rp8kz.css +2 -2
  251. package/cjs/toast/toast.styles_1e0l60w.css +2 -2
  252. package/cjs/toggle/toggle-icon.styles_ba71y.css +2 -2
  253. package/cjs/toggle/toggle.styles_1t5qrye.css +2 -2
  254. package/cjs/typography/typography-text.styles_1734x2k.css +2 -2
  255. package/cjs/typography/typography.styles.js +1 -1
  256. package/cjs/typography/typography.styles.js.map +1 -1
  257. package/cjs/typography/{typography.styles_1155j4c.css → typography.styles_1wd82dn.css} +2 -2
  258. package/cjs/uneditable-section/section-item.styles_mwx8ht.css +2 -2
  259. package/cjs/uneditable-section/uneditable-section.js +1 -1
  260. package/cjs/uneditable-section/uneditable-section.js.map +1 -1
  261. package/cjs/uneditable-section/uneditable-section.styles_aj9zun.css +2 -2
  262. package/cjs/unit-number/unit-number-input.styles_8yizj.css +2 -2
  263. package/countdown-timer/countdown-timer.d.ts +6 -0
  264. package/countdown-timer/countdown-timer.js.map +1 -1
  265. package/countdown-timer/countdown-timer.styles_ipn1b0.css +2 -2
  266. package/countdown-timer/types.d.ts +55 -11
  267. package/dashed-border/dashed-border.d.ts +6 -0
  268. package/dashed-border/dashed-border.js.map +1 -1
  269. package/dashed-border/dashed-border.styles_zszoox.css +2 -2
  270. package/dashed-border/types.d.ts +27 -5
  271. package/data-table/data-table.d.ts +8 -0
  272. package/data-table/data-table.js.map +1 -1
  273. package/data-table/data-table.styles_1iqq1g7.css +2 -2
  274. package/data-table/types.d.ts +58 -12
  275. package/date-input/date-input.d.ts +5 -0
  276. package/date-input/date-input.js.map +1 -1
  277. package/date-input/date-input.styles_1r5kcc7.css +1 -1
  278. package/date-input/types.d.ts +32 -16
  279. package/date-navigator/date-navigator.d.ts +6 -0
  280. package/date-navigator/date-navigator.js.map +1 -1
  281. package/date-navigator/date-navigator.styles_wokh56.css +2 -2
  282. package/date-navigator/types.d.ts +44 -7
  283. package/date-range-input/date-range-input.d.ts +4 -0
  284. package/date-range-input/date-range-input.js.map +1 -1
  285. package/date-range-input/date-range-input.styles_1s7ojnj.css +2 -2
  286. package/date-range-input/types.d.ts +50 -14
  287. package/divider/divider.d.ts +6 -0
  288. package/divider/divider.js.map +1 -1
  289. package/divider/divider.styles_1xpzh8p.css +2 -2
  290. package/divider/types.d.ts +27 -4
  291. package/drawer/drawer.d.ts +7 -0
  292. package/drawer/drawer.js.map +1 -1
  293. package/drawer/drawer.styles_94hx3y.css +2 -2
  294. package/drawer/types.d.ts +16 -4
  295. package/e-signature/e-signature-canvas.js +1 -1
  296. package/e-signature/e-signature-canvas.js.map +1 -1
  297. package/e-signature/e-signature.d.ts +5 -0
  298. package/e-signature/e-signature.js.map +1 -1
  299. package/e-signature/e-signature.styles_lukd9f.css +2 -2
  300. package/e-signature/types.d.ts +23 -1
  301. package/error-display/error-display.d.ts +7 -0
  302. package/error-display/error-display.js.map +1 -1
  303. package/error-display/error-display.styles_d3tql1.css +2 -2
  304. package/error-display/types.d.ts +36 -6
  305. package/external/dompurify/dist/purify.es.js +2 -2
  306. package/external/dompurify/dist/purify.es.js.map +1 -1
  307. package/feedback-rating/feedback-rating-stars-container.styles_dmi8z9.css +2 -2
  308. package/feedback-rating/feedback-rating.d.ts +6 -0
  309. package/feedback-rating/feedback-rating.js.map +1 -1
  310. package/feedback-rating/feedback-rating.styles_1kdklb6.css +2 -2
  311. package/feedback-rating/types.d.ts +29 -0
  312. package/file-download/file-download.d.ts +6 -0
  313. package/file-download/file-download.js.map +1 -1
  314. package/file-download/file-download.styles_iggk8q.css +2 -2
  315. package/file-download/file-list-card/file-list-card.styles.js +1 -1
  316. package/file-download/file-list-card/file-list-card.styles.js.map +1 -1
  317. package/file-download/file-list-card/{file-list-card.styles_oom8ii.css → file-list-card.styles_18j2gut.css} +3 -3
  318. package/file-download/types.d.ts +44 -11
  319. package/file-upload/dropzone.styles_1pllsau.css +2 -2
  320. package/file-upload/file-item-edit.d.ts +4 -1
  321. package/file-upload/file-item-edit.js +1 -1
  322. package/file-upload/file-item-edit.js.map +1 -1
  323. package/file-upload/file-item-edit.styles.d.ts +1 -0
  324. package/file-upload/file-item-edit.styles.js +1 -1
  325. package/file-upload/file-item-edit.styles.js.map +1 -1
  326. package/file-upload/{file-item-edit.styles_1qbpbxj.css → file-item-edit.styles_19bvztn.css} +6 -5
  327. package/file-upload/file-list/file-list.d.ts +3 -0
  328. package/file-upload/file-list/file-list.js +1 -1
  329. package/file-upload/file-list/file-list.js.map +1 -1
  330. package/file-upload/file-list/file-list.styles.js +1 -1
  331. package/file-upload/file-list/file-list.styles.js.map +1 -1
  332. package/file-upload/file-list/file-list.styles_1w7so98.css +3 -0
  333. package/file-upload/file-list-item/file-list-item-thumbnail.styles_1y4si19.css +2 -2
  334. package/file-upload/file-list-item/file-list-item.d.ts +3 -1
  335. package/file-upload/file-list-item/file-list-item.js +1 -1
  336. package/file-upload/file-list-item/file-list-item.js.map +1 -1
  337. package/file-upload/file-list-item/file-list-item.styles.d.ts +3 -0
  338. package/file-upload/file-list-item/file-list-item.styles.js +1 -1
  339. package/file-upload/file-list-item/file-list-item.styles.js.map +1 -1
  340. package/file-upload/file-list-item/file-list-item.styles_o8000f.css +17 -0
  341. package/file-upload/file-upload.d.ts +2 -1
  342. package/file-upload/file-upload.js +1 -1
  343. package/file-upload/file-upload.js.map +1 -1
  344. package/file-upload/file-upload.styles_9ffwcd.css +2 -2
  345. package/file-upload/types.d.ts +125 -20
  346. package/filter/addons/filter-item-checkbox.styles_7degw7.css +2 -2
  347. package/filter/filter-item-page.styles_17ewfrz.css +1 -1
  348. package/filter/filter-item.js.map +1 -1
  349. package/filter/filter-item.styles_cphjnj.css +2 -2
  350. package/filter/filter-modal.styles_qw3xlg.css +2 -2
  351. package/filter/filter-sidebar.styles_1otwpjl.css +2 -2
  352. package/filter/filter.d.ts +21 -0
  353. package/filter/filter.js.map +1 -1
  354. package/filter/filter.styles_1ykijwm.css +2 -2
  355. package/filter/types.d.ts +161 -21
  356. package/footer/footer-download-app.styles_1v1j2us.css +2 -2
  357. package/footer/footer-resource-addon.styles_1jepb1d.css +2 -2
  358. package/footer/footer.d.ts +8 -1
  359. package/footer/footer.js +1 -1
  360. package/footer/footer.js.map +1 -1
  361. package/footer/footer.styles_1msorhc.css +2 -2
  362. package/footer/types.d.ts +55 -4
  363. package/form/form-label-addon.styles_b00z8p.css +1 -1
  364. package/form/form-label.styles.js +1 -1
  365. package/form/form-label.styles.js.map +1 -1
  366. package/form/{form-label.styles_11r0652.css → form-label.styles_1nbe0bm.css} +2 -2
  367. package/form/form-textarea.styles_3p9qoy.css +2 -2
  368. package/form/form-wrapper.styles_199rslu.css +1 -1
  369. package/fullscreen-image-carousel/fullscreen-image-carousel.styles_vc6y5c.css +2 -2
  370. package/fullscreen-image-carousel/stateful-image.styles_1xe8ypm.css +2 -2
  371. package/histogram-slider/histogram-slider.styles_wvd4w.css +2 -2
  372. package/image-button/image-button.styles_6n1qsr.css +2 -2
  373. package/index.d.ts +0 -1
  374. package/index.js +1 -1
  375. package/input/input.styles_1cblor0.css +2 -2
  376. package/input-group/input-group-list-addon.styles_17iuqtw.css +2 -2
  377. package/input-group/input-group.styles_bqye6f.css +2 -2
  378. package/input-range-select/input-range-select.styles_adbrbm.css +2 -2
  379. package/input-range-slider/input-range-slider.styles_aljl2v.css +2 -2
  380. package/input-textarea/textarea-counter.styles_1n3wsnv.css +1 -1
  381. package/input-textarea/textarea.styles_22z4n3.css +2 -2
  382. package/language-switcher/dropdown-panel.styles_1qsjf8d.css +2 -2
  383. package/language-switcher/dropdown-variant.styles_1vrdfky.css +2 -2
  384. package/language-switcher/link-container-variant.styles_1iw6zux.css +2 -2
  385. package/layout/col-div.styles_16o6mwx.css +1 -1
  386. package/layout/container.styles_v70ec6.css +2 -2
  387. package/layout/section.styles_hstcaf.css +1 -1
  388. package/link-list/link-list.styles_m57vks.css +2 -2
  389. package/local-nav/local-nav-dropdown/local-nav-dropdown.styles_uhd4xl.css +2 -2
  390. package/local-nav/local-nav-menu/local-nav-menu.styles_pq19dh.css +2 -2
  391. package/markup/markup.style_1iu40x9.css +2 -2
  392. package/masked-input/masked-input.styles_1cm388a.css +2 -2
  393. package/masthead/masthead.styles_1huzon9.css +2 -2
  394. package/menu/menu-content.styles_p7ijll.css +2 -2
  395. package/menu/menu-item.styles_liyed8.css +2 -2
  396. package/menu/menu-link.styles_hfxoez.css +2 -2
  397. package/menu/menu-section.styles_g7my4d.css +2 -2
  398. package/modal/modal-box.styles_y52cts.css +2 -2
  399. package/modal/modal.styles_1lbblx6.css +2 -2
  400. package/modal-v2/modal-v2.styles_a8gv5i.css +2 -2
  401. package/modal-v2/slots/slot-styles_13sd376.css +2 -2
  402. package/navbar/brand.styles_zcgddp.css +1 -1
  403. package/navbar/drawer.js +1 -1
  404. package/navbar/drawer.js.map +1 -1
  405. package/navbar/drawer.styles_7hnxp5.css +2 -2
  406. package/navbar/menu.styles_gdpqc.css +2 -2
  407. package/navbar/navbar-action-buttons.styles_1vpm0nk.css +2 -2
  408. package/navbar/navbar-items.styles_1i3ltot.css +2 -2
  409. package/navbar/navbar.js +1 -1
  410. package/navbar/navbar.js.map +1 -1
  411. package/navbar/navbar.styles_koy0c7.css +2 -2
  412. package/notification-banner/notification-banner.styles_uxlysy.css +2 -2
  413. package/otp-input/otp-input.styles_5sbutl.css +2 -2
  414. package/otp-verification/contact-input-section.styles_odrjvt.css +2 -2
  415. package/otp-verification/otp-verification.styles_dg9bm8.css +1 -1
  416. package/otp-verification/thumbnail/thumbnail.styles_shqylh.css +2 -2
  417. package/otp-verification/verification-section.styles_x8jj.css +2 -2
  418. package/overlay/overlay.js +1 -1
  419. package/overlay/overlay.js.map +1 -1
  420. package/overlay/overlay.styles_12wym18.css +2 -2
  421. package/overlay/types.d.ts +0 -13
  422. package/package.json +1 -7
  423. package/pagination/pagination.styles_6bcgva.css +2 -2
  424. package/pill/pill.styles_xwrniu.css +2 -2
  425. package/popover/popover-inline/popover-inline.styles_bkopnt.css +2 -2
  426. package/popover/popover-trigger.styles_8zokig.css +1 -1
  427. package/popover/popover.styles_ujnf0h.css +2 -2
  428. package/progress-indicator/progress-indicator.styles_1c038s4.css +2 -2
  429. package/radio-button/radio-button.styles_1c4v6v.css +2 -2
  430. package/schedule/schedule-day-view/schedule-day-view.styles_8ti149.css +2 -2
  431. package/schedule/schedule-header/schedule-header.js +1 -1
  432. package/schedule/schedule-header/schedule-header.js.map +1 -1
  433. package/schedule/schedule-header/schedule-header.styles_1n2u5vj.css +2 -2
  434. package/schedule/schedule-week-view/schedule-week-view.styles_x7x50m.css +2 -2
  435. package/schedule/schedule-week-view/time-cell.styles_1sorjz8.css +2 -2
  436. package/schedule/schedule.styles_fdy5a1.css +2 -2
  437. package/schedule/shared/with-optional-popover.styles_7mv3p2.css +1 -1
  438. package/schedule/time-indicator/time-indicator.styles_1eaxyes.css +2 -2
  439. package/select-histogram/select-histogram.styles_n260dy.css +2 -2
  440. package/shared/accessibility/index_13g9vp.css +1 -1
  441. package/shared/clickable-icon/clickable-icon.styles_1v2imml.css +2 -2
  442. package/shared/component-loading-spinner/component-loading-spinner.styles_15eq02i.css +2 -2
  443. package/shared/dropdown-list/dropdown-label.styles_mloii0.css +2 -2
  444. package/shared/dropdown-list/dropdown-list.styles_konwm.css +2 -2
  445. package/shared/dropdown-list/dropdown-search.styles_1hc1gkh.css +2 -2
  446. package/shared/dropdown-list/expandable-element.styles_rkkvqr.css +2 -2
  447. package/shared/dropdown-list/nested-dropdown-list.styles_wdhxoe.css +2 -2
  448. package/shared/dropdown-wrapper/dropdown-wrapper.styles_15hwwoj.css +2 -2
  449. package/shared/fade-wrapper/fade-wrapper.styles_16iug7l.css +2 -2
  450. package/shared/image-placeholder/image-placeholder.styles_44nwil.css +1 -1
  451. package/shared/input-wrapper/input-wrapper.styles_je6maw.css +2 -2
  452. package/shared/internal-calendar/calendar-dropdown.styles_wybjai.css +1 -1
  453. package/shared/internal-calendar/calendar-manager.js +1 -1
  454. package/shared/internal-calendar/calendar-manager.js.map +1 -1
  455. package/shared/internal-calendar/calendar-manager.styles.js +1 -1
  456. package/shared/internal-calendar/calendar-manager.styles.js.map +1 -1
  457. package/shared/internal-calendar/{calendar-manager.styles_1iuq5zw.css → calendar-manager.styles_1njwkj2.css} +3 -3
  458. package/shared/internal-calendar/day-cell/day-cell.styles_1t5oqc1.css +2 -2
  459. package/shared/internal-calendar/internal-calendar-month.styles_14oh57f.css +2 -2
  460. package/shared/internal-calendar/internal-calendar-year.styles_therlc.css +2 -2
  461. package/shared/internal-calendar/internal-calendar.styles_gnc3eq.css +1 -1
  462. package/shared/internal-calendar/standard/standard-calendar-day-view.styles_1bw26au.css +2 -2
  463. package/shared/progress-bar/progress-bar.styles_125ri7a.css +1 -1
  464. package/shared/range-input-inner-container/range-input-inner-container.styles_1v61utg.css +2 -2
  465. package/shared/standalone-date-input/standalone-date-input.styles_157qo89.css +2 -2
  466. package/shared/time-slot/time-slot.styles_18s0to7.css +2 -2
  467. package/shared/timepicker-dropdown/timepicker-dropdown.styles_119l6k6.css +2 -2
  468. package/sidenav/sidenav-drawer-item.styles_1ljnyx2.css +2 -2
  469. package/sidenav/sidenav-drawer-subitem.styles_2y58kf.css +1 -1
  470. package/sidenav/sidenav-group.styles_1x604sw.css +2 -2
  471. package/sidenav/sidenav-item.styles_lqw3kh.css +2 -2
  472. package/sidenav/sidenav.styles_1vxezie.css +2 -2
  473. package/singpass-button/singpass-button.styles_1miyex3.css +2 -2
  474. package/smart-app-banner/smart-app-banner.styles_15u6yv4.css +2 -2
  475. package/tab/tab-link-chain.styles_49got4.css +2 -2
  476. package/tab/tab.styles_1najffw.css +1 -1
  477. package/table/table.styles_1af5ipv.css +2 -2
  478. package/tag/tag.style_d98c53.css +2 -2
  479. package/text-list/text-list.styles_w3fvyt.css +2 -2
  480. package/theme/styles/a11y-playground.css +3 -0
  481. package/theme/styles/bookingsg.css +7 -4
  482. package/theme/styles/careercompass.css +4 -1
  483. package/theme/styles/ccube.css +3 -0
  484. package/theme/styles/default.css +9 -5
  485. package/theme/styles/imda.css +3 -0
  486. package/theme/styles/lifesg.css +3 -0
  487. package/theme/styles/mylegacy.css +7 -4
  488. package/theme/styles/oneservice.css +52 -0
  489. package/theme/styles/pa.css +3 -0
  490. package/theme/styles/rbs.css +3 -0
  491. package/theme/styles/sgw-digital-lobby.css +5 -2
  492. package/theme/styles/smgs.css +3 -0
  493. package/theme/styles/spf.css +3 -0
  494. package/theme/styles/supportgowhere.css +3 -0
  495. package/theme/types.d.ts +1 -1
  496. package/theme/types.js +1 -1
  497. package/theme/types.js.map +1 -1
  498. package/theme/utils/index.d.ts +1 -0
  499. package/theme/utils/use-design-token-override.d.ts +11 -0
  500. package/theme/utils/use-design-token-override.js +2 -0
  501. package/theme/utils/use-design-token-override.js.map +1 -0
  502. package/time-range-picker/combobox-picker/combobox-picker.styles_7i9vso.css +1 -1
  503. package/time-range-picker/common.styles_1qwp4xa.css +2 -2
  504. package/time-slot-bar/time-slot-bar.styles_wigbyd.css +2 -2
  505. package/time-slot-bar-week/time-slot-bar-week-days.styles_evdvs9.css +2 -2
  506. package/time-slot-bar-week/time-slot-bar-week.styles_11ybf42.css +1 -1
  507. package/time-slot-week-view/time-slot-week-days.styles_1h21vyw.css +2 -2
  508. package/time-slot-week-view/time-slot-week-view.styles_gqgsw2.css +1 -1
  509. package/timeline/timeline.styles_1jxzik4.css +2 -2
  510. package/timepicker/timepicker.styles_1jm33yw.css +1 -1
  511. package/timetable/timetable-header/timetable-header.styles_11gl1h4.css +2 -2
  512. package/timetable/timetable-row/row-bar.styles_1x0vrsz.css +1 -1
  513. package/timetable/timetable-row/row-cell.styles_y1dl5j.css +2 -2
  514. package/timetable/timetable.styles_7rp8kz.css +2 -2
  515. package/toast/toast.styles_1e0l60w.css +2 -2
  516. package/toggle/toggle-icon.styles_ba71y.css +2 -2
  517. package/toggle/toggle.styles_1t5qrye.css +2 -2
  518. package/typography/typography-text.styles_1734x2k.css +2 -2
  519. package/typography/typography.styles.js +1 -1
  520. package/typography/typography.styles.js.map +1 -1
  521. package/typography/{typography.styles_1155j4c.css → typography.styles_1wd82dn.css} +2 -2
  522. package/uneditable-section/index.d.ts +1 -1
  523. package/uneditable-section/section-item.styles_mwx8ht.css +2 -2
  524. package/uneditable-section/uneditable-section.d.ts +2 -1
  525. package/uneditable-section/uneditable-section.js +1 -1
  526. package/uneditable-section/uneditable-section.js.map +1 -1
  527. package/uneditable-section/uneditable-section.styles_aj9zun.css +2 -2
  528. package/unit-number/unit-number-input.styles_8yizj.css +2 -2
  529. package/cjs/example/example.js +0 -2
  530. package/cjs/example/example.js.map +0 -1
  531. package/cjs/example/example_r47nvz.css +0 -1
  532. package/cjs/example/index.js +0 -2
  533. package/cjs/example/index.js.map +0 -1
  534. package/cjs/file-upload/file-list/file-list.styles_1ea12kj.css +0 -3
  535. package/cjs/file-upload/file-list-item/file-list-item.styles_y7my2m.css +0 -14
  536. package/example/example.d.ts +0 -2
  537. package/example/example.js +0 -2
  538. package/example/example.js.map +0 -1
  539. package/example/example_r47nvz.css +0 -1
  540. package/example/index.d.ts +0 -1
  541. package/example/index.js +0 -2
  542. package/example/index.js.map +0 -1
  543. package/example/types.d.ts +0 -3
  544. package/file-upload/file-list/file-list.styles_1ea12kj.css +0 -3
  545. package/file-upload/file-list-item/file-list-item.styles_y7my2m.css +0 -14
@@ -1,19 +1,43 @@
1
+ /** Visual status applied to the box container header, reflected via an icon and accessible label. */
1
2
  export type BoxContainerDisplayState = "default" | "error" | "warning";
3
+ /** Overrides for `data-testid` attributes on internal sub-elements. */
2
4
  export interface BoxContainerSubComponentTestIds {
3
5
  title?: string | undefined;
4
6
  handle?: string | undefined;
5
7
  displayStateIcon?: string | undefined;
6
8
  }
9
+ /** Props for the `BoxContainer` component. */
7
10
  export interface BoxContainerProps {
8
11
  children: JSX.Element | JSX.Element[];
9
12
  title: string | JSX.Element;
13
+ /**
14
+ * When `false`, the container is always expanded and the collapse handle is
15
+ * hidden.
16
+ *
17
+ * @default true
18
+ */
10
19
  collapsible?: boolean | undefined;
20
+ /**
21
+ * Initial expanded state when `collapsible` is `true`.
22
+ *
23
+ * @default false
24
+ */
11
25
  expanded?: boolean | undefined;
26
+ /** Optional element rendered in the header alongside the title, e.g. a link or button. */
12
27
  callToActionComponent?: JSX.Element | undefined;
28
+ /**
29
+ * Renders an inline alert icon next to the title and announces the state to
30
+ * screen readers. Has no effect when set to `"default"`.
31
+ */
13
32
  displayState?: BoxContainerDisplayState | undefined;
14
33
  className?: string | undefined;
15
34
  subComponentTestIds?: BoxContainerSubComponentTestIds | undefined;
16
35
  "data-testid"?: string | undefined;
17
36
  id?: string | undefined;
37
+ /**
38
+ * When `true` (and `collapsible` is also `true`), the entire header row
39
+ * becomes a click target for toggling expand/collapse, not just the chevron
40
+ * button.
41
+ */
18
42
  clickableHeader?: boolean | undefined;
19
43
  }
@@ -1,4 +1,4 @@
1
- .wcpniaz{position:relative;width:100%;z-index:1;margin:var(--fds-spacing-32) 0;}:where(body.fds-breakpoint-xl-max) .wcpniaz{margin:var(--fds-spacing-24) 0;}:where(body.fds-breakpoint-lg-max) .wcpniaz{margin:var(--fds-spacing-16) 0;}
1
+ @layer fds{.wcpniaz{position:relative;width:100%;z-index:1;margin:var(--fds-spacing-32) 0;}:where(body.fds-breakpoint-xl-max) .wcpniaz{margin:var(--fds-spacing-24) 0;}:where(body.fds-breakpoint-lg-max) .wcpniaz{margin:var(--fds-spacing-16) 0;}
2
2
  .c10gatr7{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;width:100%;-webkit-box-flex-wrap:wrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;white-space:nowrap;margin-left:calc(var(--fds-spacing-8) * -1);font-size:var(--fds-font-body-size-md);overflow-x:scroll;overflow-y:hidden;scrollbar-width:none;-ms-overflow-style:none;}.c10gatr7::-webkit-scrollbar{display:none;}:where(body.fds-breakpoint-lg-max) .c10gatr7{-webkit-box-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;}
3
3
  .fbyhxo7{--fds-internal-breadcrumb-fade-backgroundColor:initial;width:var(--fds-spacing-64);height:calc(1lh + var(--fds-spacing-4));position:absolute;top:50%;-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);pointer-events:none;}
4
4
  :where(body.fds-breakpoint-lg-max) .f1xa0lk7{left:calc(var(--fds-spacing-8) * -1);background-image:linear-gradient(
@@ -15,4 +15,4 @@
15
15
  .co9wmrd{height:1em;width:1em;color:var(--fds-colour-icon-subtle);}
16
16
  .spyv6ve{display:inline-block;color:var(--fds-colour-text-subtlest);}
17
17
  .c1mfqdvn{margin:var(--fds-spacing-8)!important;}
18
- .pm022dc{margin:var(--fds-spacing-8)!important;}
18
+ .pm022dc{margin:var(--fds-spacing-8)!important;}}
@@ -1,4 +1,4 @@
1
- .mf6do54{border:var(--fds-border-width-010) var(--fds-border-style-solid) transparent;-webkit-transition:all var(--fds-motion-duration-250) var(--fds-motion-timing-ease-default);transition:all var(--fds-motion-duration-250) var(--fds-motion-timing-ease-default);cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;padding:var(--fds-spacing-8) var(--fds-spacing-16);gap:0.5rem;border-radius:var(--fds-radius-sm);}.mf6do54 svg,.mf6do54 img{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;height:1em;width:1em;}
1
+ @layer fds{.mf6do54{border:var(--fds-border-width-010) var(--fds-border-style-solid) transparent;-webkit-transition:all var(--fds-motion-duration-250) var(--fds-motion-timing-ease-default);transition:all var(--fds-motion-duration-250) var(--fds-motion-timing-ease-default);cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;padding:var(--fds-spacing-8) var(--fds-spacing-16);gap:0.5rem;border-radius:var(--fds-radius-sm);}.mf6do54 svg,.mf6do54 img{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;height:1em;width:1em;}
2
2
  .moaxzdy{-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;}
3
3
  .m1en642a{min-width:4rem;}
4
4
  .m1jxbf2q{background-color:var(--fds-colour-bg-primary);color:var(--fds-colour-text-inverse);}@media (pointer: fine){.m1jxbf2q:hover,.m1jxbf2q:active{background-color:var(--fds-colour-bg-primary-hover);}}
@@ -17,4 +17,4 @@
17
17
  .m1c1mlhm{height:4rem;font-family:var(--fds-font-family-heading);font-variant:var(--fds-font-variant);font-size:var(--fds-font-heading-size-md);font-weight:var(--fds-font-weight-semibold);line-height:var(--fds-font-heading-lh-md);letter-spacing:var(--fds-font-heading-ls-md);}:where(body.fds-breakpoint-xxs-max) .m1c1mlhm{height:auto;}
18
18
  .me78sau{height:4rem;width:4rem;}
19
19
  .s17i3scc{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;}
20
- .s1joklnz{margin-right:0.5rem;}
20
+ .s1joklnz{margin-right:0.5rem;}}
@@ -1,2 +1,2 @@
1
- .wavc298{--fds-internal-calendarDropdown-verticalInset:var(--fds-spacing-24);--fds-internal-calendarDropdown-horizontalInset:var(--fds-spacing-32);--fds-internal-calendarDropdown-headerBottomSpacing:var(--fds-spacing-8);width:41rem;}
2
- .w1incl4u{border:var(--fds-border-width-010) var(--fds-border-style-solid) var(--fds-colour-border);border-radius:var(--fds-radius-lg);overflow:hidden;}
1
+ @layer fds{.wavc298{--fds-internal-calendarDropdown-verticalInset:var(--fds-spacing-24);--fds-internal-calendarDropdown-horizontalInset:var(--fds-spacing-32);--fds-internal-calendarDropdown-headerBottomSpacing:var(--fds-spacing-8);width:41rem;}
2
+ .w1incl4u{border:var(--fds-border-width-010) var(--fds-border-style-solid) var(--fds-colour-border);border-radius:var(--fds-radius-lg);overflow:hidden;}}
@@ -1,3 +1,3 @@
1
- .c13vbbsi{border-radius:var(--fds-radius-md);background:var(--fds-colour-bg);padding:var(--fds-spacing-16) var(--fds-spacing-32);}
1
+ @layer fds{.c13vbbsi{border-radius:var(--fds-radius-md);background:var(--fds-colour-bg);padding:var(--fds-spacing-16) var(--fds-spacing-32);}
2
2
  .c10ivu5q{border:var(--fds-border-width-010) var(--fds-border-style-solid) var(--fds-colour-border);}
3
- .c13s9i3s{box-shadow:var(--fds-shadow-md-subtle);}
3
+ .c13s9i3s{box-shadow:var(--fds-shadow-md-subtle);}}
@@ -1,4 +1,4 @@
1
- .i76s810{-webkit-animation:var(--fds-motion-duration-150) var(--fds-motion-timing-ease-default) checkbox-icon-fade-in-i76s810;animation:var(--fds-motion-duration-150) var(--fds-motion-timing-ease-default) checkbox-icon-fade-in-i76s810;width:100%;height:100%;-webkit-transition:color var(--fds-motion-duration-150) var(--fds-motion-timing-ease-default);transition:color var(--fds-motion-duration-150) var(--fds-motion-timing-ease-default);}@-webkit-keyframes checkbox-icon-fade-in-i76s810{0%{opacity:0;}100%{opacity:1;}}@keyframes checkbox-icon-fade-in-i76s810{0%{opacity:0;}100%{opacity:1;}}
1
+ @layer fds{.i76s810{-webkit-animation:var(--fds-motion-duration-150) var(--fds-motion-timing-ease-default) checkbox-icon-fade-in-i76s810;animation:var(--fds-motion-duration-150) var(--fds-motion-timing-ease-default) checkbox-icon-fade-in-i76s810;width:100%;height:100%;-webkit-transition:color var(--fds-motion-duration-150) var(--fds-motion-timing-ease-default);transition:color var(--fds-motion-duration-150) var(--fds-motion-timing-ease-default);}@-webkit-keyframes checkbox-icon-fade-in-i76s810{0%{opacity:0;}100%{opacity:1;}}@keyframes checkbox-icon-fade-in-i76s810{0%{opacity:0;}100%{opacity:1;}}
2
2
  .ue1dgoy{color:var(--fds-colour-icon-primary-subtlest);}
3
3
  .s8wyls8{color:var(--fds-colour-icon-selected);}
4
4
  .i1k0dk4y{color:var(--fds-colour-icon-disabled-subtle);}
@@ -6,4 +6,4 @@
6
6
  .c1rz5cog{height:1.5rem;width:1.5rem;}
7
7
  .iidy4i6{position:absolute;opacity:0;width:100%;height:100%;cursor:pointer;}
8
8
  @media (pointer: fine){.isykh53:hover+svg{color:var(--fds-colour-icon-hover);}}
9
- .iihjvql{cursor:not-allowed;}
9
+ .iihjvql{cursor:not-allowed;}}
@@ -1,4 +1,4 @@
1
- .c1l63f33{background-color:var(--fds-colour-bg);border-top:var(--fds-border-width-010) var(--fds-border-style-solid) var(--fds-colour-border);}
1
+ @layer fds{.c1l63f33{background-color:var(--fds-colour-bg);border-top:var(--fds-border-width-010) var(--fds-border-style-solid) var(--fds-colour-border);}
2
2
  .c4kcze2{padding-bottom:var(--fds-spacing-16);}
3
3
  .e1cbnvn7{background:transparent;border:none;border-radius:var(--fds-radius-sm);outline:none;text-align:left;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:space-between;-webkit-justify-content:space-between;justify-content:space-between;gap:var(--fds-spacing-48);padding:var(--fds-spacing-16) 0;}.e1cbnvn7:focus-visible{outline:2px solid var(--fds-colour-focus-ring);outline-offset:0;}
4
4
  .e7t4rdi{padding-bottom:var(--fds-spacing-8);}
@@ -9,4 +9,4 @@
9
9
  .i1ifv2g7{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);}
10
10
  .c15k7llx{height:1.25rem;width:1.25rem;color:var(--fds-colour-icon-primary);}
11
11
  .ecqtwmd{overflow:hidden;}
12
- .caja2xa{display:inline-block;padding-right:var(--fds-spacing-64);}:where(body.fds-breakpoint-lg-max) .caja2xa{padding-right:0;}
12
+ .caja2xa{display:inline-block;padding-right:var(--fds-spacing-64);}:where(body.fds-breakpoint-lg-max) .caja2xa{padding-right:0;}}
@@ -1 +1 @@
1
- {"version":3,"file":"accordion.js","sources":["../../../src/accordion/accordion.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport type React from \"react\";\nimport { useEffect, useState } from \"react\";\n\nimport { Button } from \"../button\";\nimport * as styles from \"./accordion.styles\";\nimport { AccordionContext } from \"./accordion-context\";\nimport { AccordionItem } from \"./accordion-item\";\nimport type { AccordionProps } from \"./types\";\n\nconst AccordionBase = ({\n children,\n title,\n enableExpandAll = true,\n initialDisplay = \"expand-all\",\n showTitleInMobile = false,\n id,\n \"data-testid\": testId,\n className,\n headingLevel = 2,\n onExpandCollapseChange,\n}: AccordionProps): JSX.Element => {\n const [expandAll, setExpandAll] = useState<boolean>(\n initialDisplay === \"expand-all\"\n );\n const [hasFirstLoad, setHasFirstLoad] = useState<boolean>(false);\n const [itemState, setItemState] = useState<Record<string, boolean>>({});\n\n useEffect(() => {\n setHasFirstLoad(true);\n }, []);\n\n useEffect(() => {\n if (hasFirstLoad) {\n onExpandCollapseChange?.(expandAll);\n }\n }, [expandAll, hasFirstLoad]);\n\n useEffect(() => {\n if (hasFirstLoad) {\n const itemStates = Object.values(itemState);\n if (itemStates.length > 0) {\n const allExpanded = itemStates.every((state) => state === true);\n const allCollapsed = itemStates.every(\n (state) => state === false\n );\n\n if (allExpanded && !expandAll) {\n setExpandAll(true);\n } else if (allCollapsed && expandAll) {\n setExpandAll(false);\n }\n }\n }\n }, [itemState, expandAll, hasFirstLoad]);\n\n const handleExpandCollapseClick = (event: React.MouseEvent) => {\n event.preventDefault();\n setExpandAll((prevExpandValue) => {\n const expandValue = !prevExpandValue;\n\n const updatedChildState = Object.keys(itemState).reduce(\n (acc, key) => {\n acc[key] = expandValue;\n return acc;\n },\n {} as typeof itemState\n );\n\n setItemState(updatedChildState);\n return expandValue;\n });\n };\n\n const onItemStateChange = (id: string, isExpanded: boolean) => {\n setItemState((prev) => ({ ...prev, [id]: isExpanded }));\n };\n\n const onItemDeregister = (id: string) => {\n setItemState((prev) => {\n const newState = { ...prev };\n delete newState[id];\n return newState;\n });\n };\n\n const renderCollapseExpandAll = () => {\n return (\n <Button\n className={styles.expandCollapseLink}\n data-testid=\"accordion-expand-collapse-button\"\n onClick={handleExpandCollapseClick}\n styleType=\"link\"\n type=\"button\"\n sizeType=\"small\"\n >\n {expandAll ? \"Hide all\" : \"Show all\"}\n </Button>\n );\n };\n\n const renderTitleWrapper = () => {\n if (!title && !enableExpandAll) {\n return null;\n }\n\n return (\n <div\n className={clsx(\n styles.titleWrapper,\n !showTitleInMobile &&\n !enableExpandAll &&\n styles.titleWrapperHidden\n )}\n >\n {title && (\n <h2\n className={clsx(\n styles.title,\n !showTitleInMobile && styles.titleHidden\n )}\n data-testid=\"accordion-title\"\n aria-level={headingLevel}\n >\n {title}\n </h2>\n )}\n {enableExpandAll && renderCollapseExpandAll()}\n </div>\n );\n };\n\n return (\n <AccordionContext.Provider\n value={{\n expandAll,\n itemHeadingLevel: headingLevel\n ? title\n ? headingLevel + 1\n : headingLevel\n : undefined,\n onItemStateChange,\n onItemDeregister,\n itemState,\n }}\n >\n <div\n id={id}\n data-testid={testId}\n className={clsx(styles.accordionWrapper, className)}\n >\n {renderTitleWrapper()}\n {children}\n </div>\n </AccordionContext.Provider>\n );\n};\n\nexport const Accordion = Object.assign(AccordionBase, {\n Item: AccordionItem,\n});\n"],"names":["Accordion","Object","assign","children","title","enableExpandAll","initialDisplay","showTitleInMobile","id","testId","className","headingLevel","onExpandCollapseChange","expandAll","setExpandAll","useState","hasFirstLoad","setHasFirstLoad","itemState","setItemState","useEffect","itemStates","values","length","allExpanded","every","state","allCollapsed","handleExpandCollapseClick","event","preventDefault","prevExpandValue","expandValue","updatedChildState","keys","reduce","acc","key","_jsx","AccordionContext","Provider","value","itemHeadingLevel","undefined","onItemStateChange","isExpanded","prev","onItemDeregister","newState","_jsxs","clsx","styles.accordionWrapper","styles.titleWrapper","styles.titleWrapperHidden","styles.title","styles.titleHidden","Button","styles.expandCollapseLink","onClick","styleType","type","sizeType","Item","AccordionItem"],"mappings":"iTAUA,MAoJaA,EAAYC,OAAOC,QApJV,EAClBC,WACAC,QACAC,mBAAkB,EAClBC,iBAAiB,aACjBC,qBAAoB,EACpBC,KACA,cAAeC,EACfC,YACAC,eAAe,EACfC,6BAEA,MAAOC,EAAWC,GAAgBC,EAAAA,SACX,eAAnBT,IAEGU,EAAcC,GAAmBF,EAAAA,UAAkB,IACnDG,EAAWC,GAAgBJ,EAAAA,SAAkC,CAAA,GAEpEK,EAAAA,WAAU,KACNH,GAAgB,EAAK,GACtB,IAEHG,EAAAA,WAAU,KACFJ,IACAJ,SAAAA,EAAyBC,GAC7B,GACD,CAACA,EAAWG,IAEfI,EAAAA,WAAU,KACN,GAAIJ,EAAc,CACd,MAAMK,EAAapB,OAAOqB,OAAOJ,GACjC,GAAIG,EAAWE,OAAS,EAAG,CACvB,MAAMC,EAAcH,EAAWI,OAAOC,IAAoB,IAAVA,IAC1CC,EAAeN,EAAWI,OAC3BC,IAAoB,IAAVA,IAGXF,IAAgBX,EAChBC,GAAa,GACNa,GAAgBd,GACvBC,GAAa,EAErB,CACJ,IACD,CAACI,EAAWL,EAAWG,IAE1B,MAAMY,EAA6BC,IAC/BA,EAAMC,iBACNhB,GAAciB,IACV,MAAMC,GAAeD,EAEfE,EAAoBhC,OAAOiC,KAAKhB,GAAWiB,QAC7C,CAACC,EAAKC,KACFD,EAAIC,GAAOL,EACJI,IAEX,CAAA,GAIJ,OADAjB,EAAac,GACND,CAAW,GACpB,EA6DN,OACIM,MAACC,EAAAA,iBAAiBC,SAAQ,CACtBC,MAAO,CACH5B,YACA6B,iBAAkB/B,EACZP,EACIO,EAAe,EACfA,OACJgC,EACNC,kBAnEc,CAACpC,EAAYqC,KACnC1B,GAAc2B,GAAS7C,OAAAC,OAAAD,OAAAC,OAAA,GAAM4C,GAAI,CAAEtC,CAACA,GAAKqC,KAAc,EAmE/CE,iBAhEcvC,IACtBW,GAAc2B,IACV,MAAME,EAAQ/C,OAAAC,OAAA,CAAA,EAAQ4C,GAEtB,cADOE,EAASxC,GACTwC,CAAQ,GACjB,EA4DM9B,aACHf,SAED8C,EAAAA,KAAA,MAAA,CACIzC,GAAIA,EAAE,cACOC,EACbC,UAAWwC,EAAAA,QAAKC,mBAAyBzC,GAAUP,SAAA,CA/CtDC,GAAUC,EAKX4C,EAAAA,KAAA,MAAA,CACIvC,UAAWwC,EAAAA,QACPE,EAAAA,cACC7C,IACIF,GACDgD,EAAAA,oBACPlD,SAAA,CAEAC,GACGkC,EAAAA,IAAA,KAAA,CACI5B,UAAWwC,EAAAA,QACPI,EAAAA,OACC/C,GAAqBgD,EAAAA,aACzB,cACW,kBAAiB,aACjB5C,EAAYR,SAEvBC,IAGRC,GAvCLiC,EAAAA,IAACkB,EAAAA,OAAM,CACH9C,UAAW+C,EAAAA,mBAAyB,cACxB,mCACZC,QAAS9B,EACT+B,UAAU,OACVC,KAAK,SACLC,SAAS,iBAERhD,EAAY,WAAa,gBAOvB,KAiDFV,MAEmB,GAIkB,CAClD2D,KAAMC,EAAAA"}
1
+ {"version":3,"file":"accordion.js","sources":["../../../src/accordion/accordion.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport type React from \"react\";\nimport { useEffect, useState } from \"react\";\n\nimport { Button } from \"../button\";\nimport * as styles from \"./accordion.styles\";\nimport { AccordionContext } from \"./accordion-context\";\nimport { AccordionItem } from \"./accordion-item\";\nimport type { AccordionProps } from \"./types\";\n\nconst AccordionBase = ({\n children,\n title,\n enableExpandAll = true,\n initialDisplay = \"expand-all\",\n showTitleInMobile = false,\n id,\n \"data-testid\": testId,\n className,\n headingLevel = 2,\n onExpandCollapseChange,\n}: AccordionProps): JSX.Element => {\n const [expandAll, setExpandAll] = useState<boolean>(\n initialDisplay === \"expand-all\"\n );\n const [hasFirstLoad, setHasFirstLoad] = useState<boolean>(false);\n const [itemState, setItemState] = useState<Record<string, boolean>>({});\n\n useEffect(() => {\n setHasFirstLoad(true);\n }, []);\n\n useEffect(() => {\n if (hasFirstLoad) {\n onExpandCollapseChange?.(expandAll);\n }\n }, [expandAll, hasFirstLoad]);\n\n useEffect(() => {\n if (hasFirstLoad) {\n const itemStates = Object.values(itemState);\n if (itemStates.length > 0) {\n const allExpanded = itemStates.every((state) => state === true);\n const allCollapsed = itemStates.every(\n (state) => state === false\n );\n\n if (allExpanded && !expandAll) {\n setExpandAll(true);\n } else if (allCollapsed && expandAll) {\n setExpandAll(false);\n }\n }\n }\n }, [itemState, expandAll, hasFirstLoad]);\n\n const handleExpandCollapseClick = (event: React.MouseEvent) => {\n event.preventDefault();\n setExpandAll((prevExpandValue) => {\n const expandValue = !prevExpandValue;\n\n const updatedChildState = Object.keys(itemState).reduce(\n (acc, key) => {\n acc[key] = expandValue;\n return acc;\n },\n {} as typeof itemState\n );\n\n setItemState(updatedChildState);\n return expandValue;\n });\n };\n\n const onItemStateChange = (id: string, isExpanded: boolean) => {\n setItemState((prev) => ({ ...prev, [id]: isExpanded }));\n };\n\n const onItemDeregister = (id: string) => {\n setItemState((prev) => {\n const newState = { ...prev };\n delete newState[id];\n return newState;\n });\n };\n\n const renderCollapseExpandAll = () => {\n return (\n <Button\n className={styles.expandCollapseLink}\n data-testid=\"accordion-expand-collapse-button\"\n onClick={handleExpandCollapseClick}\n styleType=\"link\"\n type=\"button\"\n sizeType=\"small\"\n >\n {expandAll ? \"Hide all\" : \"Show all\"}\n </Button>\n );\n };\n\n const renderTitleWrapper = () => {\n if (!title && !enableExpandAll) {\n return null;\n }\n\n return (\n <div\n className={clsx(\n styles.titleWrapper,\n !showTitleInMobile &&\n !enableExpandAll &&\n styles.titleWrapperHidden\n )}\n >\n {title && (\n <h2\n className={clsx(\n styles.title,\n !showTitleInMobile && styles.titleHidden\n )}\n data-testid=\"accordion-title\"\n aria-level={headingLevel}\n >\n {title}\n </h2>\n )}\n {enableExpandAll && renderCollapseExpandAll()}\n </div>\n );\n };\n\n return (\n <AccordionContext.Provider\n value={{\n expandAll,\n itemHeadingLevel: headingLevel\n ? title\n ? headingLevel + 1\n : headingLevel\n : undefined,\n onItemStateChange,\n onItemDeregister,\n itemState,\n }}\n >\n <div\n id={id}\n data-testid={testId}\n className={clsx(styles.accordionWrapper, className)}\n >\n {renderTitleWrapper()}\n {children}\n </div>\n </AccordionContext.Provider>\n );\n};\n\n/**\n * A vertically stacked set of collapsible content panels.\n *\n * Use `Accordion` to organise related content into independently expandable\n * sections with shared expand/collapse state. The container synchronises item\n * states and maintains correct heading-level hierarchy.\n *\n * Sub-components:\n * - `Accordion.Item` — a single collapsible panel with an imperative ref handle.\n */\nexport const Accordion = Object.assign(AccordionBase, {\n /**\n * Renders an individual collapsible section within an `Accordion`.\n *\n * Each item has a clickable header that toggles its content panel. The expanded\n * state can be individually controlled via the `expanded` prop, or left to the\n * parent `Accordion` to manage through its \"Show all\" / \"Hide all\" mechanism.\n * Exposes an imperative ref handle (`AccordionItemHandle`) for programmatic\n * expand/collapse control.\n */\n Item: AccordionItem,\n});\n"],"names":["Accordion","Object","assign","children","title","enableExpandAll","initialDisplay","showTitleInMobile","id","testId","className","headingLevel","onExpandCollapseChange","expandAll","setExpandAll","useState","hasFirstLoad","setHasFirstLoad","itemState","setItemState","useEffect","itemStates","values","length","allExpanded","every","state","allCollapsed","handleExpandCollapseClick","event","preventDefault","prevExpandValue","expandValue","updatedChildState","keys","reduce","acc","key","_jsx","AccordionContext","Provider","value","itemHeadingLevel","undefined","onItemStateChange","isExpanded","prev","onItemDeregister","newState","_jsxs","clsx","styles.accordionWrapper","styles.titleWrapper","styles.titleWrapperHidden","styles.title","styles.titleHidden","Button","styles.expandCollapseLink","onClick","styleType","type","sizeType","Item","AccordionItem"],"mappings":"iTAUA,MA8JaA,EAAYC,OAAOC,QA9JV,EAClBC,WACAC,QACAC,mBAAkB,EAClBC,iBAAiB,aACjBC,qBAAoB,EACpBC,KACA,cAAeC,EACfC,YACAC,eAAe,EACfC,6BAEA,MAAOC,EAAWC,GAAgBC,EAAAA,SACX,eAAnBT,IAEGU,EAAcC,GAAmBF,EAAAA,UAAkB,IACnDG,EAAWC,GAAgBJ,EAAAA,SAAkC,CAAA,GAEpEK,EAAAA,WAAU,KACNH,GAAgB,EAAK,GACtB,IAEHG,EAAAA,WAAU,KACFJ,IACAJ,SAAAA,EAAyBC,GAC7B,GACD,CAACA,EAAWG,IAEfI,EAAAA,WAAU,KACN,GAAIJ,EAAc,CACd,MAAMK,EAAapB,OAAOqB,OAAOJ,GACjC,GAAIG,EAAWE,OAAS,EAAG,CACvB,MAAMC,EAAcH,EAAWI,OAAOC,IAAoB,IAAVA,IAC1CC,EAAeN,EAAWI,OAC3BC,IAAoB,IAAVA,IAGXF,IAAgBX,EAChBC,GAAa,GACNa,GAAgBd,GACvBC,GAAa,EAErB,CACJ,IACD,CAACI,EAAWL,EAAWG,IAE1B,MAAMY,EAA6BC,IAC/BA,EAAMC,iBACNhB,GAAciB,IACV,MAAMC,GAAeD,EAEfE,EAAoBhC,OAAOiC,KAAKhB,GAAWiB,QAC7C,CAACC,EAAKC,KACFD,EAAIC,GAAOL,EACJI,IAEX,CAAA,GAIJ,OADAjB,EAAac,GACND,CAAW,GACpB,EA6DN,OACIM,MAACC,EAAAA,iBAAiBC,SAAQ,CACtBC,MAAO,CACH5B,YACA6B,iBAAkB/B,EACZP,EACIO,EAAe,EACfA,OACJgC,EACNC,kBAnEc,CAACpC,EAAYqC,KACnC1B,GAAc2B,GAAS7C,OAAAC,OAAAD,OAAAC,OAAA,GAAM4C,GAAI,CAAEtC,CAACA,GAAKqC,KAAc,EAmE/CE,iBAhEcvC,IACtBW,GAAc2B,IACV,MAAME,EAAQ/C,OAAAC,OAAA,CAAA,EAAQ4C,GAEtB,cADOE,EAASxC,GACTwC,CAAQ,GACjB,EA4DM9B,aACHf,SAED8C,EAAAA,KAAA,MAAA,CACIzC,GAAIA,EAAE,cACOC,EACbC,UAAWwC,EAAAA,QAAKC,mBAAyBzC,GAAUP,SAAA,CA/CtDC,GAAUC,EAKX4C,EAAAA,KAAA,MAAA,CACIvC,UAAWwC,EAAAA,QACPE,EAAAA,cACC7C,IACIF,GACDgD,EAAAA,oBACPlD,SAAA,CAEAC,GACGkC,EAAAA,IAAA,KAAA,CACI5B,UAAWwC,EAAAA,QACPI,EAAAA,OACC/C,GAAqBgD,EAAAA,aACzB,cACW,kBAAiB,aACjB5C,EAAYR,SAEvBC,IAGRC,GAvCLiC,EAAAA,IAACkB,EAAAA,OAAM,CACH9C,UAAW+C,EAAAA,mBAAyB,cACxB,mCACZC,QAAS9B,EACT+B,UAAU,OACVC,KAAK,SACLC,SAAS,iBAERhD,EAAY,WAAa,gBAOvB,KAiDFV,MAEmB,GAckB,CAUlD2D,KAAMC,EAAAA"}
@@ -1,6 +1,6 @@
1
- .a1tkz57u{width:100%;border-bottom:var(--fds-border-width-010) var(--fds-border-style-solid) var(--fds-colour-border);}
1
+ @layer fds{.a1tkz57u{width:100%;border-bottom:var(--fds-border-width-010) var(--fds-border-style-solid) var(--fds-colour-border);}
2
2
  .txz4s1p{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end;padding-bottom:var(--fds-spacing-16);}
3
3
  :where(body.fds-breakpoint-sm-max) .t1pllc04{display:none;}
4
4
  .texr0v4{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start;-webkit-flex:1;-ms-flex:1;flex:1;font-family:var(--fds-font-family-heading);font-variant:var(--fds-font-variant);font-size:var(--fds-font-heading-size-md);font-weight:var(--fds-font-weight-bold);line-height:var(--fds-font-heading-lh-md);letter-spacing:var(--fds-font-heading-ls-md);color:var(--fds-colour-text);}:where(body.fds-breakpoint-sm-max) .texr0v4{text-align:left;}
5
5
  :where(body.fds-breakpoint-sm-max) .t8054ua{display:none;visibility:hidden;}
6
- .e1e1ok07{margin:calc(var(--fds-spacing-16) * -1);margin-left:0px;white-space:nowrap;}
6
+ .e1e1ok07{margin:calc(var(--fds-spacing-16) * -1);margin-left:0px;white-space:nowrap;}}
@@ -1 +1 @@
1
- {"version":3,"file":"alert.js","sources":["../../../src/alert/alert.tsx"],"sourcesContent":["import { ChevronDownIcon } from \"@lifesg/react-icons\";\nimport { ArrowRightIcon } from \"@lifesg/react-icons/arrow-right\";\nimport { ExclamationCircleFillIcon } from \"@lifesg/react-icons/exclamation-circle-fill\";\nimport { ExclamationTriangleFillIcon } from \"@lifesg/react-icons/exclamation-triangle-fill\";\nimport { ICircleFillIcon } from \"@lifesg/react-icons/i-circle-fill\";\nimport { TickCircleFillIcon } from \"@lifesg/react-icons/tick-circle-fill\";\nimport clsx from \"clsx\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useResizeDetector } from \"react-resize-detector\";\n\nimport { Markup } from \"../markup\";\nimport { inertValue } from \"../shared/accessibility\";\nimport { useApplyStyle } from \"../theme\";\nimport { Typography } from \"../typography\";\nimport { useId } from \"../util\";\nimport * as styles from \"./alert.styles\";\nimport type { AlertProps } from \"./types\";\n\nconst TYPE_CLASS_MAP = {\n error: {\n wrapperTypeClass: styles.wrapperError,\n iconColorClass: styles.alertIconError,\n },\n success: {\n wrapperTypeClass: styles.wrapperSuccess,\n iconColorClass: styles.alertIconSuccess,\n },\n warning: {\n wrapperTypeClass: styles.wrapperWarning,\n iconColorClass: styles.alertIconWarning,\n },\n info: {\n wrapperTypeClass: styles.wrapperInfo,\n iconColorClass: styles.alertIconInfo,\n },\n description: {\n wrapperTypeClass: styles.wrapperDescription,\n iconColorClass: styles.alertIconDescription,\n },\n};\n\nexport const Alert = ({\n type,\n className,\n children,\n actionLink,\n actionLinkIcon,\n sizeType = \"default\",\n showIcon = false,\n customIcon,\n maxCollapsedHeight,\n role,\n ...otherProps\n}: AlertProps): JSX.Element => {\n // =============================================================================\n // CONST, STATE, REF\n // =============================================================================\n const [showHiddenContent, setShowHiddenContent] = useState<boolean>(false);\n const [renderShowMore, setRenderShowMore] = useState<boolean>(false);\n const { height: contentHeight, ref: contentRef } =\n useResizeDetector<HTMLDivElement>();\n const contentId = useId();\n const containerRef = useRef<HTMLDivElement>(null);\n const isCollapsed = isContentOutsideCollapsibleZone();\n\n // =============================================================================\n // HELPERS\n // =============================================================================\n\n const getAlertLabel = () => {\n switch (type) {\n case \"success\":\n return \"Success\";\n case \"warning\":\n return \"Warning\";\n case \"error\":\n return \"Error\";\n case \"info\":\n return \"Information\";\n case \"description\":\n return \"Description\";\n default:\n return \"Alert\";\n }\n };\n\n const setCollapsedState = useCallback(() => {\n setShowHiddenContent(!maxCollapsedHeight);\n setRenderShowMore(isContentOutsideCollapsibleZone());\n }, [maxCollapsedHeight, contentHeight]);\n\n function isContentOutsideCollapsibleZone() {\n if (contentHeight && maxCollapsedHeight) {\n return contentHeight > maxCollapsedHeight;\n }\n return false;\n }\n\n const isInert = () => {\n return !!maxCollapsedHeight && !showHiddenContent;\n };\n\n // =============================================================================\n // EFFECTS\n // =============================================================================\n\n useEffect(() => {\n setCollapsedState();\n }, [maxCollapsedHeight, contentHeight, setCollapsedState]);\n\n useApplyStyle(containerRef, {\n [styles.tokens.maxCollapsedHeight]:\n !showHiddenContent && isCollapsed && maxCollapsedHeight\n ? `${maxCollapsedHeight}px`\n : null,\n });\n\n // =============================================================================\n // RENDER FUNCTIONS\n // =============================================================================\n\n const renderShowMoreButton = () => (\n <button\n className={clsx(\n styles.showMoreButton,\n sizeType === \"small\"\n ? styles.showMoreButtonSmall\n : styles.showMoreButtonDefault\n )}\n type=\"button\"\n aria-expanded={showHiddenContent}\n aria-controls={contentId}\n onClick={() => setShowHiddenContent(!showHiddenContent)}\n >\n Show {showHiddenContent ? \"less\" : \"more\"}\n <ChevronDownIcon\n className={clsx(\n styles.chevronIcon,\n showHiddenContent\n ? styles.chevronIconExpanded\n : styles.chevronIconCollapsed\n )}\n />\n </button>\n );\n\n const renderLinkType = () => {\n if (actionLinkIcon) return actionLinkIcon;\n return <ArrowRightIcon />;\n };\n\n const renderLink = () => {\n if (!actionLink) return null;\n\n return (\n <Typography.LinkSM\n data-testid=\"action-link\"\n className={clsx(\n styles.actionLinkText,\n sizeType === \"small\"\n ? styles.actionLinkTextSmall\n : styles.actionLinkTextDefault\n )}\n underlineStyle=\"none\"\n {...actionLink}\n >\n {actionLink.children}\n {renderLinkType()}\n </Typography.LinkSM>\n );\n };\n\n const renderIcon = () => {\n if (type && customIcon) return customIcon;\n switch (type) {\n case \"success\":\n return <TickCircleFillIcon aria-hidden />;\n case \"warning\":\n return <ExclamationTriangleFillIcon aria-hidden />;\n case \"error\":\n return <ExclamationCircleFillIcon aria-hidden />;\n case \"info\":\n return <ICircleFillIcon aria-hidden />;\n case \"description\":\n return <ICircleFillIcon aria-hidden />;\n default:\n return null;\n }\n };\n\n const renderContent = () => {\n return (\n <div\n id={contentId}\n className={clsx(\n styles.textWrapperContainer,\n showHiddenContent &&\n actionLink &&\n styles.textWrapperContainerShowMoreWithLink,\n !showHiddenContent &&\n isCollapsed &&\n styles.textWrapperContainerCollapsed\n )}\n inert={inertValue(isInert())}\n ref={containerRef}\n >\n <Markup\n ref={contentRef}\n className={styles.textWrapper}\n baseTextSize={sizeType === \"small\" ? \"body-sm\" : \"body-md\"}\n >\n {children}\n </Markup>\n {renderLink()}\n </div>\n );\n };\n\n const {\n wrapperTypeClass = styles.wrapperWarning,\n iconColorClass = styles.alertIconWarning,\n } = TYPE_CLASS_MAP[type] || {};\n\n return (\n <div\n className={clsx(styles.wrapper, wrapperTypeClass, className)}\n aria-label={`${getAlertLabel()}`}\n data-testid={otherProps[\"data-testid\"]}\n role={role}\n >\n {showIcon && (\n <div\n className={clsx(\n styles.alertIconWrapper,\n sizeType === \"small\"\n ? styles.alertIconWrapperSmall\n : styles.alertIconWrapperDefault,\n iconColorClass\n )}\n >\n {renderIcon()}\n </div>\n )}\n {/* \n CSS-BASED TAB ORDER IMPLEMENTATION:\n - DOM order: button → link → content (natural tab order)\n - Visual order: content → button (via CSS order property)\n */}\n <div className={styles.contentContainer}>\n {renderShowMore && renderShowMoreButton()}\n {renderContent()}\n </div>\n </div>\n );\n};\n"],"names":["TYPE_CLASS_MAP","error","wrapperTypeClass","styles.wrapperError","iconColorClass","styles.alertIconError","success","styles.wrapperSuccess","styles.alertIconSuccess","warning","styles.wrapperWarning","styles.alertIconWarning","info","styles.wrapperInfo","styles.alertIconInfo","description","styles.wrapperDescription","styles.alertIconDescription","_a","type","className","children","actionLink","actionLinkIcon","sizeType","showIcon","customIcon","maxCollapsedHeight","role","otherProps","__rest","showHiddenContent","setShowHiddenContent","useState","renderShowMore","setRenderShowMore","height","contentHeight","ref","contentRef","useResizeDetector","contentId","useId","containerRef","useRef","isCollapsed","isContentOutsideCollapsibleZone","setCollapsedState","useCallback","useEffect","useApplyStyle","styles.tokens","_jsxs","clsx","styles.wrapper","getAlertLabel","_jsx","styles.alertIconWrapper","styles.alertIconWrapperSmall","styles.alertIconWrapperDefault","TickCircleFillIcon","ExclamationTriangleFillIcon","ExclamationCircleFillIcon","ICircleFillIcon","renderIcon","styles.contentContainer","styles.showMoreButton","styles.showMoreButtonSmall","styles.showMoreButtonDefault","onClick","ChevronDownIcon","styles.chevronIcon","styles.chevronIconExpanded","styles.chevronIconCollapsed","id","styles.textWrapperContainer","styles.textWrapperContainerShowMoreWithLink","styles.textWrapperContainerCollapsed","inert","inertValue","Markup","styles.textWrapper","baseTextSize","Typography","LinkSM","Object","assign","styles.actionLinkText","styles.actionLinkTextSmall","styles.actionLinkTextDefault","underlineStyle","ArrowRightIcon"],"mappings":"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"}
1
+ {"version":3,"file":"alert.js","sources":["../../../src/alert/alert.tsx"],"sourcesContent":["import { ChevronDownIcon } from \"@lifesg/react-icons\";\nimport { ArrowRightIcon } from \"@lifesg/react-icons/arrow-right\";\nimport { ExclamationCircleFillIcon } from \"@lifesg/react-icons/exclamation-circle-fill\";\nimport { ExclamationTriangleFillIcon } from \"@lifesg/react-icons/exclamation-triangle-fill\";\nimport { ICircleFillIcon } from \"@lifesg/react-icons/i-circle-fill\";\nimport { TickCircleFillIcon } from \"@lifesg/react-icons/tick-circle-fill\";\nimport clsx from \"clsx\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useResizeDetector } from \"react-resize-detector\";\n\nimport { Markup } from \"../markup\";\nimport { inertValue } from \"../shared/accessibility\";\nimport { useApplyStyle } from \"../theme\";\nimport { Typography } from \"../typography\";\nimport { useId } from \"../util\";\nimport * as styles from \"./alert.styles\";\nimport type { AlertProps } from \"./types\";\n\nconst TYPE_CLASS_MAP = {\n error: {\n wrapperTypeClass: styles.wrapperError,\n iconColorClass: styles.alertIconError,\n },\n success: {\n wrapperTypeClass: styles.wrapperSuccess,\n iconColorClass: styles.alertIconSuccess,\n },\n warning: {\n wrapperTypeClass: styles.wrapperWarning,\n iconColorClass: styles.alertIconWarning,\n },\n info: {\n wrapperTypeClass: styles.wrapperInfo,\n iconColorClass: styles.alertIconInfo,\n },\n description: {\n wrapperTypeClass: styles.wrapperDescription,\n iconColorClass: styles.alertIconDescription,\n },\n};\n\n/**\n * Displays an inline contextual banner with a severity-coded message.\n *\n * Use `Alert` to surface feedback, status, or supplementary information without\n * interrupting the user's workflow. Supports five severity tones, an optional\n * icon, a call-to-action link, and a collapsible content area for lengthy\n * messages.\n */\nexport const Alert = ({\n type,\n className,\n children,\n actionLink,\n actionLinkIcon,\n sizeType = \"default\",\n showIcon = false,\n customIcon,\n maxCollapsedHeight,\n role,\n ...otherProps\n}: AlertProps): JSX.Element => {\n // =============================================================================\n // CONST, STATE, REF\n // =============================================================================\n const [showHiddenContent, setShowHiddenContent] = useState<boolean>(false);\n const [renderShowMore, setRenderShowMore] = useState<boolean>(false);\n const { height: contentHeight, ref: contentRef } =\n useResizeDetector<HTMLDivElement>();\n const contentId = useId();\n const containerRef = useRef<HTMLDivElement>(null);\n const isCollapsed = isContentOutsideCollapsibleZone();\n\n // =============================================================================\n // HELPERS\n // =============================================================================\n\n const getAlertLabel = () => {\n switch (type) {\n case \"success\":\n return \"Success\";\n case \"warning\":\n return \"Warning\";\n case \"error\":\n return \"Error\";\n case \"info\":\n return \"Information\";\n case \"description\":\n return \"Description\";\n default:\n return \"Alert\";\n }\n };\n\n const setCollapsedState = useCallback(() => {\n setShowHiddenContent(!maxCollapsedHeight);\n setRenderShowMore(isContentOutsideCollapsibleZone());\n }, [maxCollapsedHeight, contentHeight]);\n\n function isContentOutsideCollapsibleZone() {\n if (contentHeight && maxCollapsedHeight) {\n return contentHeight > maxCollapsedHeight;\n }\n return false;\n }\n\n const isInert = () => {\n return !!maxCollapsedHeight && !showHiddenContent;\n };\n\n // =============================================================================\n // EFFECTS\n // =============================================================================\n\n useEffect(() => {\n setCollapsedState();\n }, [maxCollapsedHeight, contentHeight, setCollapsedState]);\n\n useApplyStyle(containerRef, {\n [styles.tokens.maxCollapsedHeight]:\n !showHiddenContent && isCollapsed && maxCollapsedHeight\n ? `${maxCollapsedHeight}px`\n : null,\n });\n\n // =============================================================================\n // RENDER FUNCTIONS\n // =============================================================================\n\n const renderShowMoreButton = () => (\n <button\n className={clsx(\n styles.showMoreButton,\n sizeType === \"small\"\n ? styles.showMoreButtonSmall\n : styles.showMoreButtonDefault\n )}\n type=\"button\"\n aria-expanded={showHiddenContent}\n aria-controls={contentId}\n onClick={() => setShowHiddenContent(!showHiddenContent)}\n >\n Show {showHiddenContent ? \"less\" : \"more\"}\n <ChevronDownIcon\n className={clsx(\n styles.chevronIcon,\n showHiddenContent\n ? styles.chevronIconExpanded\n : styles.chevronIconCollapsed\n )}\n />\n </button>\n );\n\n const renderLinkType = () => {\n if (actionLinkIcon) return actionLinkIcon;\n return <ArrowRightIcon />;\n };\n\n const renderLink = () => {\n if (!actionLink) return null;\n\n return (\n <Typography.LinkSM\n data-testid=\"action-link\"\n className={clsx(\n styles.actionLinkText,\n sizeType === \"small\"\n ? styles.actionLinkTextSmall\n : styles.actionLinkTextDefault\n )}\n underlineStyle=\"none\"\n {...actionLink}\n >\n {actionLink.children}\n {renderLinkType()}\n </Typography.LinkSM>\n );\n };\n\n const renderIcon = () => {\n if (type && customIcon) return customIcon;\n switch (type) {\n case \"success\":\n return <TickCircleFillIcon aria-hidden />;\n case \"warning\":\n return <ExclamationTriangleFillIcon aria-hidden />;\n case \"error\":\n return <ExclamationCircleFillIcon aria-hidden />;\n case \"info\":\n return <ICircleFillIcon aria-hidden />;\n case \"description\":\n return <ICircleFillIcon aria-hidden />;\n default:\n return null;\n }\n };\n\n const renderContent = () => {\n return (\n <div\n id={contentId}\n className={clsx(\n styles.textWrapperContainer,\n showHiddenContent &&\n actionLink &&\n styles.textWrapperContainerShowMoreWithLink,\n !showHiddenContent &&\n isCollapsed &&\n styles.textWrapperContainerCollapsed\n )}\n inert={inertValue(isInert())}\n ref={containerRef}\n >\n <Markup\n ref={contentRef}\n className={styles.textWrapper}\n baseTextSize={sizeType === \"small\" ? \"body-sm\" : \"body-md\"}\n >\n {children}\n </Markup>\n {renderLink()}\n </div>\n );\n };\n\n const {\n wrapperTypeClass = styles.wrapperWarning,\n iconColorClass = styles.alertIconWarning,\n } = TYPE_CLASS_MAP[type] || {};\n\n return (\n <div\n className={clsx(styles.wrapper, wrapperTypeClass, className)}\n aria-label={`${getAlertLabel()}`}\n data-testid={otherProps[\"data-testid\"]}\n role={role}\n >\n {showIcon && (\n <div\n className={clsx(\n styles.alertIconWrapper,\n sizeType === \"small\"\n ? styles.alertIconWrapperSmall\n : styles.alertIconWrapperDefault,\n iconColorClass\n )}\n >\n {renderIcon()}\n </div>\n )}\n {/* \n CSS-BASED TAB ORDER IMPLEMENTATION:\n - DOM order: button → link → content (natural tab order)\n - Visual order: content → button (via CSS order property)\n */}\n <div className={styles.contentContainer}>\n {renderShowMore && renderShowMoreButton()}\n {renderContent()}\n </div>\n </div>\n );\n};\n"],"names":["TYPE_CLASS_MAP","error","wrapperTypeClass","styles.wrapperError","iconColorClass","styles.alertIconError","success","styles.wrapperSuccess","styles.alertIconSuccess","warning","styles.wrapperWarning","styles.alertIconWarning","info","styles.wrapperInfo","styles.alertIconInfo","description","styles.wrapperDescription","styles.alertIconDescription","_a","type","className","children","actionLink","actionLinkIcon","sizeType","showIcon","customIcon","maxCollapsedHeight","role","otherProps","__rest","showHiddenContent","setShowHiddenContent","useState","renderShowMore","setRenderShowMore","height","contentHeight","ref","contentRef","useResizeDetector","contentId","useId","containerRef","useRef","isCollapsed","isContentOutsideCollapsibleZone","setCollapsedState","useCallback","useEffect","useApplyStyle","styles.tokens","_jsxs","clsx","styles.wrapper","getAlertLabel","_jsx","styles.alertIconWrapper","styles.alertIconWrapperSmall","styles.alertIconWrapperDefault","TickCircleFillIcon","ExclamationTriangleFillIcon","ExclamationCircleFillIcon","ICircleFillIcon","renderIcon","styles.contentContainer","styles.showMoreButton","styles.showMoreButtonSmall","styles.showMoreButtonDefault","onClick","ChevronDownIcon","styles.chevronIcon","styles.chevronIconExpanded","styles.chevronIconCollapsed","id","styles.textWrapperContainer","styles.textWrapperContainerShowMoreWithLink","styles.textWrapperContainerCollapsed","inert","inertValue","Markup","styles.textWrapper","baseTextSize","Typography","LinkSM","Object","assign","styles.actionLinkText","styles.actionLinkTextSmall","styles.actionLinkTextDefault","underlineStyle","ArrowRightIcon"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- .wa04j5f{padding:var(--fds-spacing-8) var(--fds-spacing-16);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;border-left:var(--fds-border-width-020) var(--fds-border-style-solid);}
1
+ @layer fds{.wa04j5f{padding:var(--fds-spacing-8) var(--fds-spacing-16);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;border-left:var(--fds-border-width-020) var(--fds-border-style-solid);}
2
2
  .we966c0{background:var(--fds-colour-bg-error);border-left-color:var(--fds-colour-border-error);}
3
3
  .wiv49ur{background:var(--fds-colour-bg-success);border-left-color:var(--fds-colour-border-success);}
4
4
  .w1rjxx7d{background:var(--fds-colour-bg-warning);border-left-color:var(--fds-colour-border-warning);}
@@ -25,4 +25,4 @@
25
25
  .sxtdaq0{font-family:var(--fds-font-family-body);font-variant:var(--fds-font-variant);font-size:var(--fds-font-body-size-sm);font-weight:var(--fds-font-weight-semibold);line-height:var(--fds-font-body-lh-sm);letter-spacing:var(--fds-font-body-ls-sm);}
26
26
  .c19cf4gt{-webkit-transition:-webkit-transform var(--fds-motion-duration-350) var(--fds-motion-timing-ease-standard);transition:transform var(--fds-motion-duration-350) var(--fds-motion-timing-ease-standard);}
27
27
  .cnxzujv{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);}
28
- .c1u44bt8{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);}
28
+ .c1u44bt8{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);}}
@@ -1,2 +1,2 @@
1
- .c18cuuv6{margin:0 auto;}
2
- .p182s5k4{height:16px;width:64px;}
1
+ @layer fds{.c18cuuv6{margin:0 auto;}
2
+ .p182s5k4{height:16px;width:64px;}}
@@ -1 +1 @@
1
- .v15yka8m{height:16px;width:64px;}
1
+ @layer fds{.v15yka8m{height:16px;width:64px;}}
@@ -1,2 +1,2 @@
1
- .cw28mbd{--fds-internal-loadingDotsSpinner-container-colour:initial;margin:0 auto;}
2
- .pvakuuw{height:200px;width:200px;}
1
+ @layer fds{.cw28mbd{--fds-internal-loadingDotsSpinner-container-colour:initial;margin:0 auto;}
2
+ .pvakuuw{height:200px;width:200px;}}
@@ -1 +1 @@
1
- .v1n5n6pc{height:200px;width:200px;}
1
+ @layer fds{.v1n5n6pc{height:200px;width:200px;}}
@@ -1,2 +1,2 @@
1
- .c1ea41s2{margin:0 auto;padding:var(--fds-spacing-32) var(--fds-spacing-16);}
2
- .p16u2leb{height:200px;width:200px;}
1
+ @layer fds{.c1ea41s2{margin:0 auto;padding:var(--fds-spacing-32) var(--fds-spacing-16);}
2
+ .p16u2leb{height:200px;width:200px;}}
@@ -1 +1 @@
1
- .vlg9767{height:200px;width:200px;}
1
+ @layer fds{.vlg9767{height:200px;width:200px;}}
@@ -1 +1 @@
1
- {"version":3,"file":"avatar.js","sources":["../../../src/avatar/avatar.tsx"],"sourcesContent":["import clsx from \"clsx\";\n\nimport { Typography } from \"../typography\";\nimport * as styles from \"./avatar.styles\";\nimport type { AvatarProps } from \"./types\";\n\nexport const Avatar = ({\n children,\n sizeType = \"default\",\n \"data-testid\": testId = \"avatar\",\n className,\n ...otherProps\n}: AvatarProps): JSX.Element => {\n // =============================================================================\n // RENDER FUNCTIONS\n // =============================================================================\n const renderContent = () => {\n if (!children) {\n return <></>;\n }\n\n if (typeof children === \"string\") {\n const TextComponent =\n sizeType === \"small\" ? Typography.BodySM : Typography.BodyBL;\n return (\n <TextComponent\n weight=\"semibold\"\n className={styles.avatarBaselineText}\n >\n {String.fromCodePoint(\n children.codePointAt(0) ?? 0\n ).toUpperCase()}\n </TextComponent>\n );\n }\n\n return children;\n };\n\n return (\n <div\n {...otherProps}\n data-testid={testId}\n className={clsx(\n styles.avatarDisplay,\n sizeType === \"small\"\n ? styles.avatarDisplaySmall\n : styles.avatarDisplayDefault,\n className\n )}\n >\n {renderContent()}\n </div>\n );\n};\n"],"names":["_a","children","sizeType","testId","className","otherProps","__rest","_jsx","Object","assign","clsx","styles.avatarDisplay","styles.avatarDisplaySmall","styles.avatarDisplayDefault","TextComponent","Typography","BodySM","BodyBL","weight","styles.avatarBaselineText","String","fromCodePoint","codePointAt","toUpperCase","renderContent"],"mappings":"2QAMuBA,IAAA,IAAAC,SACnBA,EAAQC,SACRA,EAAW,UACX,cAAeC,EAAS,SAAQC,UAChCA,GAASJ,EACNK,EAAUC,EAAAA,OAAAN,EALM,mDAiCnB,OACIO,EAAAA,IAAA,MAAAC,OAAAC,OAAA,CAAA,EACQJ,EAAU,CAAA,cACDF,EACbC,UAAWM,EAAAA,QACPC,EAAAA,cACa,UAAbT,EACMU,EAAAA,mBACAC,EAAAA,qBACNT,GACHH,SAjCa,YAClB,IAAKA,EACD,OAAOM,EAAAA,mBAGX,GAAwB,iBAAbN,EAAuB,CAC9B,MAAMa,EACW,UAAbZ,EAAuBa,EAAAA,WAAWC,OAASD,EAAAA,WAAWE,OAC1D,OACIV,MAACO,EAAa,CACVI,OAAO,WACPd,UAAWe,EAAAA,4BAEVC,OAAOC,cACmB,QAAvBrB,EAAAC,EAASqB,YAAY,UAAE,IAAAtB,EAAAA,EAAI,GAC7BuB,eAGd,CAEA,OAAOtB,CAAQ,EAeVuB,KACC"}
1
+ {"version":3,"file":"avatar.js","sources":["../../../src/avatar/avatar.tsx"],"sourcesContent":["import clsx from \"clsx\";\n\nimport { Typography } from \"../typography\";\nimport * as styles from \"./avatar.styles\";\nimport type { AvatarProps } from \"./types\";\n\n/**\n * Displays a circular avatar representing a user or entity.\n *\n * Use when you need a compact visual identity marker in lists, headers, or\n * cards. Accepts a string (rendered as an initial) or a JSX element such as an\n * image or icon.\n */\nexport const Avatar = ({\n children,\n sizeType = \"default\",\n \"data-testid\": testId = \"avatar\",\n className,\n ...otherProps\n}: AvatarProps): JSX.Element => {\n // =============================================================================\n // RENDER FUNCTIONS\n // =============================================================================\n const renderContent = () => {\n if (!children) {\n return <></>;\n }\n\n if (typeof children === \"string\") {\n const TextComponent =\n sizeType === \"small\" ? Typography.BodySM : Typography.BodyBL;\n return (\n <TextComponent\n weight=\"semibold\"\n className={styles.avatarBaselineText}\n >\n {String.fromCodePoint(\n children.codePointAt(0) ?? 0\n ).toUpperCase()}\n </TextComponent>\n );\n }\n\n return children;\n };\n\n return (\n <div\n {...otherProps}\n data-testid={testId}\n className={clsx(\n styles.avatarDisplay,\n sizeType === \"small\"\n ? styles.avatarDisplaySmall\n : styles.avatarDisplayDefault,\n className\n )}\n >\n {renderContent()}\n </div>\n );\n};\n"],"names":["_a","children","sizeType","testId","className","otherProps","__rest","_jsx","Object","assign","clsx","styles.avatarDisplay","styles.avatarDisplaySmall","styles.avatarDisplayDefault","TextComponent","Typography","BodySM","BodyBL","weight","styles.avatarBaselineText","String","fromCodePoint","codePointAt","toUpperCase","renderContent"],"mappings":"2QAauBA,IAAA,IAAAC,SACnBA,EAAQC,SACRA,EAAW,UACX,cAAeC,EAAS,SAAQC,UAChCA,GAASJ,EACNK,EAAUC,EAAAA,OAAAN,EALM,mDAiCnB,OACIO,EAAAA,IAAA,MAAAC,OAAAC,OAAA,CAAA,EACQJ,EAAU,CAAA,cACDF,EACbC,UAAWM,EAAAA,QACPC,EAAAA,cACa,UAAbT,EACMU,EAAAA,mBACAC,EAAAA,qBACNT,GACHH,SAjCa,YAClB,IAAKA,EACD,OAAOM,EAAAA,mBAGX,GAAwB,iBAAbN,EAAuB,CAC9B,MAAMa,EACW,UAAbZ,EAAuBa,EAAAA,WAAWC,OAASD,EAAAA,WAAWE,OAC1D,OACIV,MAACO,EAAa,CACVI,OAAO,WACPd,UAAWe,EAAAA,4BAEVC,OAAOC,cACmB,QAAvBrB,EAAAC,EAASqB,YAAY,UAAE,IAAAtB,EAAAA,EAAI,GAC7BuB,eAGd,CAEA,OAAOtB,CAAQ,EAeVuB,KACC"}
@@ -1,4 +1,4 @@
1
- .a1mqk4w8{border-radius:50%;background-color:var(--fds-colour-bg-primary-subtler);-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}
1
+ @layer fds{.a1mqk4w8{border-radius:50%;background-color:var(--fds-colour-bg-primary-subtler);-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}
2
2
  .a11siwsi{width:2.5rem;height:2.5rem;}
3
3
  .a1m51nni{width:1.5rem;height:1.5rem;}
4
- .a12u9rhz{color:var(--fds-colour-text-primary);}
4
+ .a12u9rhz{color:var(--fds-colour-text-primary);}}
@@ -1 +1 @@
1
- {"version":3,"file":"badge.js","sources":["../../../src/badge/badge.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { useRef } from \"react\";\n\nimport { useApplyStyle } from \"../theme\";\nimport * as styles from \"./badge.styles\";\nimport type { BadgeProps, BadgeVariant } from \"./types\";\n\nfunction getDisplayCount(count: number) {\n if (count <= 999) return count.toString();\n if (count === 1000) return \"1K\";\n return \"1K+\";\n}\nconst variantsToShowCount: Set<BadgeVariant> = new Set([\n \"number\",\n \"number-with-border\",\n \"square-number\",\n]);\n\nexport const Badge = ({\n badgeOffset,\n children,\n className,\n color = \"default\",\n count = 0,\n \"data-testid\": testId = \"badge\",\n variant = \"number\",\n ...otherProps\n}: BadgeProps) => {\n // =============================================================================\n // CONST\n // =============================================================================\n const displayCount = getDisplayCount(count);\n const shouldShowCount = variantsToShowCount.has(variant);\n\n // =============================================================================\n // REFS\n // =============================================================================\n const wrapperRef = useRef<HTMLSpanElement>(null);\n\n useApplyStyle(wrapperRef, {\n [styles.tokens.wrapper.offsetX]: badgeOffset?.[0],\n [styles.tokens.wrapper.offsetY]: badgeOffset?.[1],\n });\n\n // =============================================================================\n // RENDER FUNCTIONS\n // =============================================================================\n return (\n <span className={clsx(children !== undefined && styles.badgeOverlay)}>\n <span\n ref={wrapperRef}\n className={clsx(\n styles.badgeWrapper,\n children !== undefined && styles.badgeWrapperIsOverlay\n )}\n >\n <span\n data-testid={testId}\n data-variant={variant}\n data-color={color}\n className={clsx(styles.badge, className)}\n {...otherProps}\n >\n {shouldShowCount ? displayCount : null}\n </span>\n </span>\n {children}\n </span>\n );\n};\n"],"names":["variantsToShowCount","Set","_a","badgeOffset","children","className","color","count","testId","variant","otherProps","__rest","displayCount","toString","getDisplayCount","shouldShowCount","has","wrapperRef","useRef","useApplyStyle","styles.tokens","wrapper","offsetX","offsetY","_jsxs","clsx","undefined","styles.badgeOverlay","_jsx","ref","styles.badgeWrapper","styles.badgeWrapperIsOverlay","Object","assign","styles.badge"],"mappings":"gkBAYA,MAAMA,EAAyC,IAAIC,IAAI,CACnD,SACA,qBACA,gCAGkBC,IAAA,IAAAC,YAClBA,EAAWC,SACXA,EAAQC,UACRA,EAASC,MACTA,EAAQ,UAASC,MACjBA,EAAQ,EACR,cAAeC,EAAS,QAAOC,QAC/BA,EAAU,UAAQP,EACfQ,EAAUC,SAAAT,EARK,CAAA,cAAA,WAAA,YAAA,QAAA,QAAA,cAAA,YAalB,MAAMU,EAxBV,SAAyBL,GACrB,OAAIA,GAAS,IAAYA,EAAMM,WACjB,MAAVN,EAAuB,KACpB,KACX,CAoByBO,CAAgBP,GAC/BQ,EAAkBf,EAAoBgB,IAAIP,GAK1CQ,EAAaC,EAAAA,OAAwB,MAU3C,OARAC,EAAAA,cAAcF,EAAY,CACtB,CAACG,SAAcC,QAAQC,SAAUnB,aAAW,EAAXA,EAAc,GAC/C,CAACiB,SAAcC,QAAQE,SAAUpB,aAAW,EAAXA,EAAc,KAO/CqB,OAAA,OAAA,CAAMnB,UAAWoB,EAAAA,aAAkBC,IAAbtB,GAA0BuB,EAAAA,wBAC5CC,EAAAA,IAAA,OAAA,CACIC,IAAKZ,EACLZ,UAAWoB,UACPK,EAAAA,kBACaJ,IAAbtB,GAA0B2B,EAAAA,uBAC7B3B,SAEDwB,EAAAA,IAAA,OAAAI,OAAAC,OAAA,CAAA,cACiBzB,EAAM,eACLC,EAAO,aACTH,EACZD,UAAWoB,EAAAA,QAAKS,EAAAA,MAAc7B,IAC1BK,EAAU,CAAAN,SAEbW,EAAkBH,EAAe,UAGzCR,IACE"}
1
+ {"version":3,"file":"badge.js","sources":["../../../src/badge/badge.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { useRef } from \"react\";\n\nimport { useApplyStyle } from \"../theme\";\nimport * as styles from \"./badge.styles\";\nimport type { BadgeProps, BadgeVariant } from \"./types\";\n\nfunction getDisplayCount(count: number) {\n if (count <= 999) return count.toString();\n if (count === 1000) return \"1K\";\n return \"1K+\";\n}\nconst variantsToShowCount: Set<BadgeVariant> = new Set([\n \"number\",\n \"number-with-border\",\n \"square-number\",\n]);\n\n/**\n * Displays a small indicator badge for notifications or status.\n *\n * Use `Badge` to surface counts or status dots on icons, avatars, and\n * navigation items. Renders as an overlay on a child element or as a standalone\n * inline indicator when no child is provided.\n */\nexport const Badge = ({\n badgeOffset,\n children,\n className,\n color = \"default\",\n count = 0,\n \"data-testid\": testId = \"badge\",\n variant = \"number\",\n ...otherProps\n}: BadgeProps) => {\n // =============================================================================\n // CONST\n // =============================================================================\n const displayCount = getDisplayCount(count);\n const shouldShowCount = variantsToShowCount.has(variant);\n\n // =============================================================================\n // REFS\n // =============================================================================\n const wrapperRef = useRef<HTMLSpanElement>(null);\n\n useApplyStyle(wrapperRef, {\n [styles.tokens.wrapper.offsetX]: badgeOffset?.[0],\n [styles.tokens.wrapper.offsetY]: badgeOffset?.[1],\n });\n\n // =============================================================================\n // RENDER FUNCTIONS\n // =============================================================================\n return (\n <span className={clsx(children !== undefined && styles.badgeOverlay)}>\n <span\n ref={wrapperRef}\n className={clsx(\n styles.badgeWrapper,\n children !== undefined && styles.badgeWrapperIsOverlay\n )}\n >\n <span\n data-testid={testId}\n data-variant={variant}\n data-color={color}\n className={clsx(styles.badge, className)}\n {...otherProps}\n >\n {shouldShowCount ? displayCount : null}\n </span>\n </span>\n {children}\n </span>\n );\n};\n"],"names":["variantsToShowCount","Set","_a","badgeOffset","children","className","color","count","testId","variant","otherProps","__rest","displayCount","toString","getDisplayCount","shouldShowCount","has","wrapperRef","useRef","useApplyStyle","styles.tokens","wrapper","offsetX","offsetY","_jsxs","clsx","undefined","styles.badgeOverlay","_jsx","ref","styles.badgeWrapper","styles.badgeWrapperIsOverlay","Object","assign","styles.badge"],"mappings":"gkBAYA,MAAMA,EAAyC,IAAIC,IAAI,CACnD,SACA,qBACA,gCAUkBC,IAAA,IAAAC,YAClBA,EAAWC,SACXA,EAAQC,UACRA,EAASC,MACTA,EAAQ,UAASC,MACjBA,EAAQ,EACR,cAAeC,EAAS,QAAOC,QAC/BA,EAAU,UAAQP,EACfQ,EAAUC,SAAAT,EARK,CAAA,cAAA,WAAA,YAAA,QAAA,QAAA,cAAA,YAalB,MAAMU,EA/BV,SAAyBL,GACrB,OAAIA,GAAS,IAAYA,EAAMM,WACjB,MAAVN,EAAuB,KACpB,KACX,CA2ByBO,CAAgBP,GAC/BQ,EAAkBf,EAAoBgB,IAAIP,GAK1CQ,EAAaC,EAAAA,OAAwB,MAU3C,OARAC,EAAAA,cAAcF,EAAY,CACtB,CAACG,SAAcC,QAAQC,SAAUnB,aAAW,EAAXA,EAAc,GAC/C,CAACiB,SAAcC,QAAQE,SAAUpB,aAAW,EAAXA,EAAc,KAO/CqB,OAAA,OAAA,CAAMnB,UAAWoB,EAAAA,aAAkBC,IAAbtB,GAA0BuB,EAAAA,wBAC5CC,EAAAA,IAAA,OAAA,CACIC,IAAKZ,EACLZ,UAAWoB,UACPK,EAAAA,kBACaJ,IAAbtB,GAA0B2B,EAAAA,uBAC7B3B,SAEDwB,EAAAA,IAAA,OAAAI,OAAAC,OAAA,CAAA,cACiBzB,EAAM,eACLC,EAAO,aACTH,EACZD,UAAWoB,EAAAA,QAAKS,EAAAA,MAAc7B,IAC1BK,EAAU,CAAAN,SAEbW,EAAkBH,EAAe,UAGzCR,IACE"}
@@ -1,4 +1,4 @@
1
- .b12fiya5{position:relative;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;height:-webkit-fit-content;height:-moz-fit-content;height:fit-content;}
1
+ @layer fds{.b12fiya5{position:relative;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;height:-webkit-fit-content;height:-moz-fit-content;height:fit-content;}
2
2
 
3
3
  .bt512pc{position:absolute;top:0;right:0;-webkit-transform:translate(50%, -25%) translate(
4
4
  var(--fds-internal-badge-wrapper-offsetX, 0px),
@@ -13,4 +13,4 @@
13
13
  var(--fds-internal-badge-wrapper-offsetX, 0px),
14
14
  var(--fds-internal-badge-wrapper-offsetY, 0px)
15
15
  );}
16
- .bnm5diy{background-color:var(--fds-colour-bg-primary);color:var(--fds-colour-text-inverse);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;}.bnm5diy[data-variant="number"]{min-width:1.25rem;padding:0.25rem 0.375rem;font-family:var(--fds-font-family-body);font-variant:var(--fds-font-variant);font-size:var(--fds-font-body-size-xs);font-weight:var(--fds-font-weight-bold);line-height:var(--fds-font-body-lh-xs);letter-spacing:var(--fds-font-body-ls-xs);line-height:1;border-radius:var(--fds-radius-full);}.bnm5diy[data-variant="number-with-border"]{min-width:1.25rem;padding:0.25rem 0.375rem;font-family:var(--fds-font-family-body);font-variant:var(--fds-font-variant);font-size:var(--fds-font-body-size-xs);font-weight:var(--fds-font-weight-bold);line-height:var(--fds-font-body-lh-xs);letter-spacing:var(--fds-font-body-ls-xs);line-height:1;border-radius:var(--fds-radius-full);box-shadow:0 0 0 var(--fds-border-width-020) var(--fds-colour-bg);}.bnm5diy[data-variant="dot"]{border-radius:50%;width:0.5rem;height:0.5rem;}.bnm5diy[data-variant="dot-with-border"]{border-radius:50%;width:0.5rem;height:0.5rem;box-shadow:0 0 0 var(--fds-border-width-020) var(--fds-colour-bg);}.bnm5diy[data-variant="square-number"]{min-width:1.25rem;padding:0.25rem 0.375rem;font-family:var(--fds-font-family-body);font-variant:var(--fds-font-variant);font-size:var(--fds-font-body-size-xs);font-weight:var(--fds-font-weight-bold);line-height:var(--fds-font-body-lh-xs);letter-spacing:var(--fds-font-body-ls-xs);line-height:1;border-radius:var(--fds-radius-sm);padding:0.25rem 0.4375rem;}.bnm5diy[data-variant="square-number"][data-color="default"]{background-color:var(--fds-colour-bg-primary-subtler);color:var(--fds-colour-text-primary);}.bnm5diy[data-color="important"]{background-color:var(--fds-colour-icon-error);}
16
+ .bnm5diy{background-color:var(--fds-colour-bg-primary);color:var(--fds-colour-text-inverse);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;}.bnm5diy[data-variant="number"]{min-width:1.25rem;padding:0.25rem 0.375rem;font-family:var(--fds-font-family-body);font-variant:var(--fds-font-variant);font-size:var(--fds-font-body-size-xs);font-weight:var(--fds-font-weight-bold);line-height:var(--fds-font-body-lh-xs);letter-spacing:var(--fds-font-body-ls-xs);line-height:1;border-radius:var(--fds-radius-full);}.bnm5diy[data-variant="number-with-border"]{min-width:1.25rem;padding:0.25rem 0.375rem;font-family:var(--fds-font-family-body);font-variant:var(--fds-font-variant);font-size:var(--fds-font-body-size-xs);font-weight:var(--fds-font-weight-bold);line-height:var(--fds-font-body-lh-xs);letter-spacing:var(--fds-font-body-ls-xs);line-height:1;border-radius:var(--fds-radius-full);box-shadow:0 0 0 var(--fds-border-width-020) var(--fds-colour-bg);}.bnm5diy[data-variant="dot"]{border-radius:50%;width:0.5rem;height:0.5rem;}.bnm5diy[data-variant="dot-with-border"]{border-radius:50%;width:0.5rem;height:0.5rem;box-shadow:0 0 0 var(--fds-border-width-020) var(--fds-colour-bg);}.bnm5diy[data-variant="square-number"]{min-width:1.25rem;padding:0.25rem 0.375rem;font-family:var(--fds-font-family-body);font-variant:var(--fds-font-variant);font-size:var(--fds-font-body-size-xs);font-weight:var(--fds-font-weight-bold);line-height:var(--fds-font-body-lh-xs);letter-spacing:var(--fds-font-body-ls-xs);line-height:1;border-radius:var(--fds-radius-sm);padding:0.25rem 0.4375rem;}.bnm5diy[data-variant="square-number"][data-color="default"]{background-color:var(--fds-colour-bg-primary-subtler);color:var(--fds-colour-text-primary);}.bnm5diy[data-color="important"]{background-color:var(--fds-colour-icon-error);}}
@@ -1 +1 @@
1
- {"version":3,"file":"box-container.js","sources":["../../../src/box-container/box-container.tsx"],"sourcesContent":["import { ChevronDownIcon } from \"@lifesg/react-icons/chevron-down\";\nimport { ExclamationCircleFillIcon } from \"@lifesg/react-icons/exclamation-circle-fill\";\nimport { animated, useSpring } from \"@react-spring/web\";\nimport clsx from \"clsx\";\nimport { useRef, useState } from \"react\";\nimport { useResizeDetector } from \"react-resize-detector\";\n\nimport { inertValue, VisuallyHidden } from \"../shared/accessibility\";\nimport { useMaxWidthMediaQuery } from \"../theme\";\nimport { useId } from \"../util\";\nimport * as styles from \"./box-container.styles\";\nimport type { BoxContainerProps } from \"./types\";\n\nexport const BoxContainer = ({\n children,\n title,\n collapsible = true,\n expanded = false,\n callToActionComponent,\n displayState = \"default\",\n subComponentTestIds,\n clickableHeader,\n className,\n ...otherProps\n}: BoxContainerProps) => {\n // =============================================================================\n // CONST, STATE, REF\n // =============================================================================\n const [showExpanded, setShowExpanded] = useState<boolean>(\n !collapsible ? true : expanded\n );\n const resizeDetector = useResizeDetector();\n const childRef = resizeDetector.ref;\n const isMobile = useMaxWidthMediaQuery(\"sm\");\n const interactiveHeader = clickableHeader && collapsible;\n const internalId = useId();\n const contentId = `${internalId}-content`;\n const headerId = `${internalId}-header`;\n const handleIconRef = useRef<HTMLDivElement>(null);\n\n // =============================================================================\n // EVENT HANDLERS\n // =============================================================================\n const onHandleClick = (event: React.MouseEvent) => {\n // to prevent it triggers twice when click on button as clickableHeader enable\n event.stopPropagation();\n setShowExpanded(!showExpanded);\n };\n\n // =============================================================================\n // RENDER FUNCTIONS\n // =============================================================================\n // React spring animation configuration\n const expandableStyles = useSpring({\n height: showExpanded ? resizeDetector.height : 0,\n });\n\n const renderChildContent = () => {\n if (collapsible) {\n return (\n <animated.div\n className={styles.expandable}\n style={expandableStyles}\n data-testid={\"expandable-container\"}\n id={contentId}\n >\n <div\n className={styles.childContainer}\n ref={childRef}\n inert={inertValue(!showExpanded)}\n >\n {children}\n </div>\n </animated.div>\n );\n }\n\n return (\n <div\n className={styles.nonExpandable}\n data-testid=\"non-expandable-container\"\n >\n <div className={styles.childContainer}>{children}</div>\n </div>\n );\n };\n\n const renderDisplayIcon = () => {\n switch (displayState) {\n case \"error\":\n case \"warning\":\n return (\n <ExclamationCircleFillIcon\n className={clsx(\n styles.alertIcon,\n displayState === \"error\" && styles.alertIconError,\n displayState === \"warning\" &&\n styles.alertIconWarning\n )}\n data-testid={\n subComponentTestIds?.displayStateIcon ||\n `${displayState}-icon`\n }\n aria-label={displayState}\n />\n );\n default:\n return null;\n }\n };\n\n const renderHandleIcon = () => {\n return (\n collapsible && (\n <button\n className={styles.handle}\n onClick={onHandleClick}\n type=\"button\"\n aria-labelledby={headerId}\n aria-controls={contentId}\n aria-disabled={!collapsible} // remains focusable\n aria-expanded={showExpanded}\n data-testid={subComponentTestIds?.handle || \"handle\"}\n >\n <div\n className={clsx(\n styles.handleIconContainer,\n showExpanded\n ? styles.handleIconContainerExpanded\n : styles.handleIconContainerCollapsed\n )}\n ref={handleIconRef}\n aria-hidden\n >\n <ChevronDownIcon className={styles.handleIcon} />\n </div>\n </button>\n )\n );\n };\n\n return (\n <section\n {...otherProps}\n className={clsx(styles.container, className)}\n aria-labelledby={headerId}\n role=\"region\"\n title={typeof title === \"string\" ? title : undefined}\n >\n <div\n className={clsx(\n styles.header,\n interactiveHeader && styles.headerInteractive\n )}\n data-testid=\"header\"\n onClick={interactiveHeader ? onHandleClick : undefined}\n >\n <div\n className={styles.labelWrapper}\n role={\"status\"}\n id={headerId}\n >\n <div\n className={styles.labelText}\n data-testid={subComponentTestIds?.title || \"title\"}\n >\n {title}\n {displayState !== \"default\" && (\n <>\n <VisuallyHidden>{displayState}</VisuallyHidden>\n </>\n )}\n </div>\n {renderDisplayIcon()}\n {isMobile && renderHandleIcon()}\n </div>\n {callToActionComponent && (\n <div\n className={clsx(\n styles.callToActionContainer,\n collapsible &&\n styles.callToActionContainerCollapsible\n )}\n data-testid=\"call-to-action-container\"\n >\n {callToActionComponent}\n </div>\n )}\n\n {!isMobile && renderHandleIcon()}\n </div>\n {renderChildContent()}\n </section>\n );\n};\n"],"names":["_a","children","title","collapsible","expanded","callToActionComponent","displayState","subComponentTestIds","clickableHeader","className","otherProps","__rest","showExpanded","setShowExpanded","useState","resizeDetector","useResizeDetector","childRef","ref","isMobile","useMaxWidthMediaQuery","interactiveHeader","internalId","useId","contentId","headerId","handleIconRef","useRef","onHandleClick","event","stopPropagation","expandableStyles","useSpring","height","renderHandleIcon","_jsx","styles.handle","onClick","type","handle","clsx","styles.handleIconContainer","styles.handleIconContainerExpanded","styles.handleIconContainerCollapsed","ChevronDownIcon","styles.handleIcon","_jsxs","Object","assign","styles.container","role","undefined","styles.header","styles.headerInteractive","styles.labelWrapper","id","styles.labelText","_Fragment","VisuallyHidden","ExclamationCircleFillIcon","styles.alertIcon","styles.alertIconError","styles.alertIconWarning","displayStateIcon","renderDisplayIcon","styles.callToActionContainer","styles.callToActionContainerCollapsible","animated","div","styles.expandable","style","styles.childContainer","inert","inertValue","styles.nonExpandable"],"mappings":"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"}
1
+ {"version":3,"file":"box-container.js","sources":["../../../src/box-container/box-container.tsx"],"sourcesContent":["import { ChevronDownIcon } from \"@lifesg/react-icons/chevron-down\";\nimport { ExclamationCircleFillIcon } from \"@lifesg/react-icons/exclamation-circle-fill\";\nimport { animated, useSpring } from \"@react-spring/web\";\nimport clsx from \"clsx\";\nimport { useRef, useState } from \"react\";\nimport { useResizeDetector } from \"react-resize-detector\";\n\nimport { inertValue, VisuallyHidden } from \"../shared/accessibility\";\nimport { useMaxWidthMediaQuery } from \"../theme\";\nimport { useId } from \"../util\";\nimport * as styles from \"./box-container.styles\";\nimport type { BoxContainerProps } from \"./types\";\n\n/**\n * A titled, collapsible section container that groups related content behind a\n * labelled header.\n *\n * Use `BoxContainer` when you need to visually separate a block of content\n * under a heading and optionally allow users to collapse it. The header supports\n * a call-to-action slot and a visual status indicator.\n */\nexport const BoxContainer = ({\n children,\n title,\n collapsible = true,\n expanded = false,\n callToActionComponent,\n displayState = \"default\",\n subComponentTestIds,\n clickableHeader,\n className,\n ...otherProps\n}: BoxContainerProps) => {\n // =============================================================================\n // CONST, STATE, REF\n // =============================================================================\n const [showExpanded, setShowExpanded] = useState<boolean>(\n !collapsible ? true : expanded\n );\n const resizeDetector = useResizeDetector();\n const childRef = resizeDetector.ref;\n const isMobile = useMaxWidthMediaQuery(\"sm\");\n const interactiveHeader = clickableHeader && collapsible;\n const internalId = useId();\n const contentId = `${internalId}-content`;\n const headerId = `${internalId}-header`;\n const handleIconRef = useRef<HTMLDivElement>(null);\n\n // =============================================================================\n // EVENT HANDLERS\n // =============================================================================\n const onHandleClick = (event: React.MouseEvent) => {\n // to prevent it triggers twice when click on button as clickableHeader enable\n event.stopPropagation();\n setShowExpanded(!showExpanded);\n };\n\n // =============================================================================\n // RENDER FUNCTIONS\n // =============================================================================\n // React spring animation configuration\n const expandableStyles = useSpring({\n height: showExpanded ? resizeDetector.height : 0,\n });\n\n const renderChildContent = () => {\n if (collapsible) {\n return (\n <animated.div\n className={styles.expandable}\n style={expandableStyles}\n data-testid={\"expandable-container\"}\n id={contentId}\n >\n <div\n className={styles.childContainer}\n ref={childRef}\n inert={inertValue(!showExpanded)}\n >\n {children}\n </div>\n </animated.div>\n );\n }\n\n return (\n <div\n className={styles.nonExpandable}\n data-testid=\"non-expandable-container\"\n >\n <div className={styles.childContainer}>{children}</div>\n </div>\n );\n };\n\n const renderDisplayIcon = () => {\n switch (displayState) {\n case \"error\":\n case \"warning\":\n return (\n <ExclamationCircleFillIcon\n className={clsx(\n styles.alertIcon,\n displayState === \"error\" && styles.alertIconError,\n displayState === \"warning\" &&\n styles.alertIconWarning\n )}\n data-testid={\n subComponentTestIds?.displayStateIcon ||\n `${displayState}-icon`\n }\n aria-label={displayState}\n />\n );\n default:\n return null;\n }\n };\n\n const renderHandleIcon = () => {\n return (\n collapsible && (\n <button\n className={styles.handle}\n onClick={onHandleClick}\n type=\"button\"\n aria-labelledby={headerId}\n aria-controls={contentId}\n aria-disabled={!collapsible} // remains focusable\n aria-expanded={showExpanded}\n data-testid={subComponentTestIds?.handle || \"handle\"}\n >\n <div\n className={clsx(\n styles.handleIconContainer,\n showExpanded\n ? styles.handleIconContainerExpanded\n : styles.handleIconContainerCollapsed\n )}\n ref={handleIconRef}\n aria-hidden\n >\n <ChevronDownIcon className={styles.handleIcon} />\n </div>\n </button>\n )\n );\n };\n\n return (\n <section\n {...otherProps}\n className={clsx(styles.container, className)}\n aria-labelledby={headerId}\n role=\"region\"\n title={typeof title === \"string\" ? title : undefined}\n >\n <div\n className={clsx(\n styles.header,\n interactiveHeader && styles.headerInteractive\n )}\n data-testid=\"header\"\n onClick={interactiveHeader ? onHandleClick : undefined}\n >\n <div\n className={styles.labelWrapper}\n role={\"status\"}\n id={headerId}\n >\n <div\n className={styles.labelText}\n data-testid={subComponentTestIds?.title || \"title\"}\n >\n {title}\n {displayState !== \"default\" && (\n <>\n <VisuallyHidden>{displayState}</VisuallyHidden>\n </>\n )}\n </div>\n {renderDisplayIcon()}\n {isMobile && renderHandleIcon()}\n </div>\n {callToActionComponent && (\n <div\n className={clsx(\n styles.callToActionContainer,\n collapsible &&\n styles.callToActionContainerCollapsible\n )}\n data-testid=\"call-to-action-container\"\n >\n {callToActionComponent}\n </div>\n )}\n\n {!isMobile && renderHandleIcon()}\n </div>\n {renderChildContent()}\n </section>\n );\n};\n"],"names":["_a","children","title","collapsible","expanded","callToActionComponent","displayState","subComponentTestIds","clickableHeader","className","otherProps","__rest","showExpanded","setShowExpanded","useState","resizeDetector","useResizeDetector","childRef","ref","isMobile","useMaxWidthMediaQuery","interactiveHeader","internalId","useId","contentId","headerId","handleIconRef","useRef","onHandleClick","event","stopPropagation","expandableStyles","useSpring","height","renderHandleIcon","_jsx","styles.handle","onClick","type","handle","clsx","styles.handleIconContainer","styles.handleIconContainerExpanded","styles.handleIconContainerCollapsed","ChevronDownIcon","styles.handleIcon","_jsxs","Object","assign","styles.container","role","undefined","styles.header","styles.headerInteractive","styles.labelWrapper","id","styles.labelText","_Fragment","VisuallyHidden","ExclamationCircleFillIcon","styles.alertIcon","styles.alertIconError","styles.alertIconWarning","displayStateIcon","renderDisplayIcon","styles.callToActionContainer","styles.callToActionContainerCollapsible","animated","div","styles.expandable","style","styles.childContainer","inert","inertValue","styles.nonExpandable"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- .h3376de{-webkit-transition:var(--fds-motion-duration-250) var(--fds-motion-timing-ease-default);transition:var(--fds-motion-duration-250) var(--fds-motion-timing-ease-default);}
1
+ @layer fds{.h3376de{-webkit-transition:var(--fds-motion-duration-250) var(--fds-motion-timing-ease-default);transition:var(--fds-motion-duration-250) var(--fds-motion-timing-ease-default);}
2
2
  .hjzhcqf{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);}
3
3
  .h1v9raz8{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);}
4
4
  .c12d5ktd{border:var(--fds-border-width-010) var(--fds-border-style-solid) var(--fds-colour-border);border-radius:var(--fds-radius-sm);}
@@ -15,4 +15,4 @@
15
15
  .c1u9hocq{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-left:auto;}:where(body.fds-breakpoint-sm-max) .c1u9hocq{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}
16
16
  .cwzrcxq{margin-right:var(--fds-spacing-40);}:where(body.fds-breakpoint-sm-max) .cwzrcxq{margin-right:0;margin-top:var(--fds-spacing-16);}
17
17
  .hsq8tc7{background:transparent;border:none;cursor:pointer;padding:var(--fds-spacing-16);margin:calc(var(--fds-spacing-16) * -1);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}:where(body.fds-breakpoint-sm-max) .hsq8tc7{margin:calc(var(--fds-spacing-16) * -1) calc(var(--fds-spacing-16) * -1) calc(var(--fds-spacing-16) * -1) 0;margin-left:auto;}
18
- .h97jf81{color:var(--fds-colour-icon);height:var(--fds-font-heading-size-sm);width:var(--fds-font-heading-size-sm);}
18
+ .h97jf81{color:var(--fds-colour-icon);height:var(--fds-font-heading-size-sm);width:var(--fds-font-heading-size-sm);}}
@@ -1,4 +1,4 @@
1
- .wcpniaz{position:relative;width:100%;z-index:1;margin:var(--fds-spacing-32) 0;}:where(body.fds-breakpoint-xl-max) .wcpniaz{margin:var(--fds-spacing-24) 0;}:where(body.fds-breakpoint-lg-max) .wcpniaz{margin:var(--fds-spacing-16) 0;}
1
+ @layer fds{.wcpniaz{position:relative;width:100%;z-index:1;margin:var(--fds-spacing-32) 0;}:where(body.fds-breakpoint-xl-max) .wcpniaz{margin:var(--fds-spacing-24) 0;}:where(body.fds-breakpoint-lg-max) .wcpniaz{margin:var(--fds-spacing-16) 0;}
2
2
  .c10gatr7{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;width:100%;-webkit-box-flex-wrap:wrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;white-space:nowrap;margin-left:calc(var(--fds-spacing-8) * -1);font-size:var(--fds-font-body-size-md);overflow-x:scroll;overflow-y:hidden;scrollbar-width:none;-ms-overflow-style:none;}.c10gatr7::-webkit-scrollbar{display:none;}:where(body.fds-breakpoint-lg-max) .c10gatr7{-webkit-box-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;}
3
3
  .fbyhxo7{--fds-internal-breadcrumb-fade-backgroundColor:initial;width:var(--fds-spacing-64);height:calc(1lh + var(--fds-spacing-4));position:absolute;top:50%;-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);pointer-events:none;}
4
4
  :where(body.fds-breakpoint-lg-max) .f1xa0lk7{left:calc(var(--fds-spacing-8) * -1);background-image:linear-gradient(
@@ -15,4 +15,4 @@
15
15
  .co9wmrd{height:1em;width:1em;color:var(--fds-colour-icon-subtle);}
16
16
  .spyv6ve{display:inline-block;color:var(--fds-colour-text-subtlest);}
17
17
  .c1mfqdvn{margin:var(--fds-spacing-8)!important;}
18
- .pm022dc{margin:var(--fds-spacing-8)!important;}
18
+ .pm022dc{margin:var(--fds-spacing-8)!important;}}
@@ -1,4 +1,4 @@
1
- .mf6do54{border:var(--fds-border-width-010) var(--fds-border-style-solid) transparent;-webkit-transition:all var(--fds-motion-duration-250) var(--fds-motion-timing-ease-default);transition:all var(--fds-motion-duration-250) var(--fds-motion-timing-ease-default);cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;padding:var(--fds-spacing-8) var(--fds-spacing-16);gap:0.5rem;border-radius:var(--fds-radius-sm);}.mf6do54 svg,.mf6do54 img{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;height:1em;width:1em;}
1
+ @layer fds{.mf6do54{border:var(--fds-border-width-010) var(--fds-border-style-solid) transparent;-webkit-transition:all var(--fds-motion-duration-250) var(--fds-motion-timing-ease-default);transition:all var(--fds-motion-duration-250) var(--fds-motion-timing-ease-default);cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;padding:var(--fds-spacing-8) var(--fds-spacing-16);gap:0.5rem;border-radius:var(--fds-radius-sm);}.mf6do54 svg,.mf6do54 img{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;height:1em;width:1em;}
2
2
  .moaxzdy{-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;}
3
3
  .m1en642a{min-width:4rem;}
4
4
  .m1jxbf2q{background-color:var(--fds-colour-bg-primary);color:var(--fds-colour-text-inverse);}@media (pointer: fine){.m1jxbf2q:hover,.m1jxbf2q:active{background-color:var(--fds-colour-bg-primary-hover);}}
@@ -17,4 +17,4 @@
17
17
  .m1c1mlhm{height:4rem;font-family:var(--fds-font-family-heading);font-variant:var(--fds-font-variant);font-size:var(--fds-font-heading-size-md);font-weight:var(--fds-font-weight-semibold);line-height:var(--fds-font-heading-lh-md);letter-spacing:var(--fds-font-heading-ls-md);}:where(body.fds-breakpoint-xxs-max) .m1c1mlhm{height:auto;}
18
18
  .me78sau{height:4rem;width:4rem;}
19
19
  .s17i3scc{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;}
20
- .s1joklnz{margin-right:0.5rem;}
20
+ .s1joklnz{margin-right:0.5rem;}}
@@ -1,2 +1,2 @@
1
- .wavc298{--fds-internal-calendarDropdown-verticalInset:var(--fds-spacing-24);--fds-internal-calendarDropdown-horizontalInset:var(--fds-spacing-32);--fds-internal-calendarDropdown-headerBottomSpacing:var(--fds-spacing-8);width:41rem;}
2
- .w1incl4u{border:var(--fds-border-width-010) var(--fds-border-style-solid) var(--fds-colour-border);border-radius:var(--fds-radius-lg);overflow:hidden;}
1
+ @layer fds{.wavc298{--fds-internal-calendarDropdown-verticalInset:var(--fds-spacing-24);--fds-internal-calendarDropdown-horizontalInset:var(--fds-spacing-32);--fds-internal-calendarDropdown-headerBottomSpacing:var(--fds-spacing-8);width:41rem;}
2
+ .w1incl4u{border:var(--fds-border-width-010) var(--fds-border-style-solid) var(--fds-colour-border);border-radius:var(--fds-radius-lg);overflow:hidden;}}
@@ -1,3 +1,3 @@
1
- .c13vbbsi{border-radius:var(--fds-radius-md);background:var(--fds-colour-bg);padding:var(--fds-spacing-16) var(--fds-spacing-32);}
1
+ @layer fds{.c13vbbsi{border-radius:var(--fds-radius-md);background:var(--fds-colour-bg);padding:var(--fds-spacing-16) var(--fds-spacing-32);}
2
2
  .c10ivu5q{border:var(--fds-border-width-010) var(--fds-border-style-solid) var(--fds-colour-border);}
3
- .c13s9i3s{box-shadow:var(--fds-shadow-md-subtle);}
3
+ .c13s9i3s{box-shadow:var(--fds-shadow-md-subtle);}}
@@ -1,4 +1,4 @@
1
- .i76s810{-webkit-animation:var(--fds-motion-duration-150) var(--fds-motion-timing-ease-default) checkbox-icon-fade-in-i76s810;animation:var(--fds-motion-duration-150) var(--fds-motion-timing-ease-default) checkbox-icon-fade-in-i76s810;width:100%;height:100%;-webkit-transition:color var(--fds-motion-duration-150) var(--fds-motion-timing-ease-default);transition:color var(--fds-motion-duration-150) var(--fds-motion-timing-ease-default);}@-webkit-keyframes checkbox-icon-fade-in-i76s810{0%{opacity:0;}100%{opacity:1;}}@keyframes checkbox-icon-fade-in-i76s810{0%{opacity:0;}100%{opacity:1;}}
1
+ @layer fds{.i76s810{-webkit-animation:var(--fds-motion-duration-150) var(--fds-motion-timing-ease-default) checkbox-icon-fade-in-i76s810;animation:var(--fds-motion-duration-150) var(--fds-motion-timing-ease-default) checkbox-icon-fade-in-i76s810;width:100%;height:100%;-webkit-transition:color var(--fds-motion-duration-150) var(--fds-motion-timing-ease-default);transition:color var(--fds-motion-duration-150) var(--fds-motion-timing-ease-default);}@-webkit-keyframes checkbox-icon-fade-in-i76s810{0%{opacity:0;}100%{opacity:1;}}@keyframes checkbox-icon-fade-in-i76s810{0%{opacity:0;}100%{opacity:1;}}
2
2
  .ue1dgoy{color:var(--fds-colour-icon-primary-subtlest);}
3
3
  .s8wyls8{color:var(--fds-colour-icon-selected);}
4
4
  .i1k0dk4y{color:var(--fds-colour-icon-disabled-subtle);}
@@ -6,4 +6,4 @@
6
6
  .c1rz5cog{height:1.5rem;width:1.5rem;}
7
7
  .iidy4i6{position:absolute;opacity:0;width:100%;height:100%;cursor:pointer;}
8
8
  @media (pointer: fine){.isykh53:hover+svg{color:var(--fds-colour-icon-hover);}}
9
- .iihjvql{cursor:not-allowed;}
9
+ .iihjvql{cursor:not-allowed;}}
@@ -1 +1 @@
1
- {"version":3,"file":"countdown-timer.js","sources":["../../../src/countdown-timer/countdown-timer.tsx"],"sourcesContent":["import { ClockIcon } from \"@lifesg/react-icons\";\nimport clsx from \"clsx\";\nimport throttle from \"lodash/throttle\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { useInView } from \"react-intersection-observer\";\n\nimport { inertValue, VisuallyHidden } from \"../shared/accessibility\";\nimport {\n formatUnitValue,\n useApplyStyle,\n useMaxWidthMediaQuery,\n} from \"../theme\";\nimport { useIsMounted } from \"../util\";\nimport { TimeHelper } from \"../util/time-helper\";\nimport * as styles from \"./countdown-timer.styles\";\nimport type { CountdownTimerProps } from \"./types\";\nimport { useTimer } from \"./use-timer\";\n\nexport const CountdownTimer = ({\n className,\n align = \"right\",\n timer,\n timestamp,\n notifyTimer,\n offset,\n mobileOffset,\n show,\n fixed = true,\n reminderInterval = 120,\n \"data-testid\": testId,\n onFinish,\n onNotify,\n onTick,\n ...otherProps\n}: CountdownTimerProps) => {\n // =============================================================================\n // CONST, STATE, REF\n // =============================================================================\n\n const wrapperRef = useRef<HTMLDivElement>(null);\n const fixedCountdownRef = useRef<HTMLDivElement>(null);\n\n const isNotified = useRef<boolean>(false);\n const [offsetY, setOffsetY] = useState<number>(0);\n const [clientRectRight, setClientRectRight] = useState<number>(0);\n const [clientRectX, setClientRectX] = useState<number>(0);\n const [isPlaying, setIsPlaying] = useState(false);\n const [announcement, setAnnouncement] = useState<string>(\"\");\n\n const isMounted = useIsMounted();\n const [remainingSeconds, initialSeconds] = useTimer(\n timer,\n timestamp,\n isPlaying\n );\n const { ref: stickyRef, inView } = useInView({\n threshold: 1,\n rootMargin: `${offsetY * -1}px 0px 0px 0px`,\n initialInView: true,\n });\n const isVisible = !fixed || inView;\n const warn =\n typeof notifyTimer === \"number\" && remainingSeconds <= notifyTimer;\n\n const isMobile = useMaxWidthMediaQuery(\"sm\");\n\n // =============================================================================\n // EFFECTS\n // =============================================================================\n\n useApplyStyle(fixedCountdownRef, {\n [styles.tokens.fixedCountdown.top]: formatUnitValue(offsetY, \"px\"),\n [styles.tokens.fixedCountdown.left]: formatUnitValue(\n getOffsetLeft(),\n \"px\"\n ),\n [styles.tokens.fixedCountdown.right]: formatUnitValue(\n getOffsetRight(),\n \"px\"\n ),\n });\n\n useEffect(() => {\n setIsPlaying(show);\n }, [show]);\n\n useEffect(() => {\n if (remainingSeconds === 0) {\n performOnFinishHandler();\n } else if (\n typeof notifyTimer === \"number\" &&\n remainingSeconds <= notifyTimer\n ) {\n performOnTickHandler();\n performOnNotifyHandler();\n }\n }, [remainingSeconds]);\n\n useEffect(() => {\n const y = getOffsetY();\n setOffsetY(y);\n }, [isMobile, offset?.top, mobileOffset?.top]);\n\n useEffect(() => {\n if (wrapperRef.current) {\n const handleResize = throttle(handleWindowResize, 300);\n handleWindowResize();\n\n window.addEventListener(\"resize\", handleResize);\n\n return () => {\n window.removeEventListener(\"resize\", handleResize);\n };\n }\n }, [wrapperRef.current]);\n\n // Announcements\n useEffect(() => {\n const timeElapsed = initialSeconds - remainingSeconds;\n if (timeElapsed === 0) return;\n // Polite notification\n if (timeElapsed % reminderInterval === 0) {\n if (\n typeof notifyTimer !== \"number\" ||\n remainingSeconds > notifyTimer\n ) {\n setAnnouncement(getAccessibleTimeText(remainingSeconds));\n }\n }\n\n // Assertive notification\n if (\n typeof notifyTimer === \"number\" &&\n remainingSeconds === notifyTimer\n ) {\n setAnnouncement(getAccessibleTimeText(remainingSeconds));\n }\n }, [remainingSeconds, initialSeconds, reminderInterval, notifyTimer]);\n\n useEffect(() => {\n // reset\n isNotified.current = false;\n }, [initialSeconds, show]);\n\n // =============================================================================\n // EVENT HANDLERS\n // =============================================================================\n const handleWindowResize = () => {\n if (!wrapperRef.current) return;\n\n const clientRect = wrapperRef.current.getBoundingClientRect();\n\n setClientRectX(clientRect.x);\n setClientRectRight(clientRect.right);\n };\n\n const handleOnFocus = () => {\n const focusMessage = getAccessibleTimeText(remainingSeconds);\n setAnnouncement(focusMessage);\n };\n\n // =============================================================================\n // HELPER FUNCTIONS\n // =============================================================================\n\n const performOnTickHandler = () => {\n if (onTick) {\n onTick(remainingSeconds);\n }\n };\n\n const performOnNotifyHandler = () => {\n if (onNotify && !isNotified.current) {\n isNotified.current = true;\n onNotify();\n }\n };\n\n const performOnFinishHandler = () => {\n setIsPlaying(false);\n\n if (onFinish) onFinish();\n };\n\n function getOffsetY() {\n const desktopTop = offset?.top ?? 168;\n const mobileTop = mobileOffset?.top ?? 80;\n const offsetY = isMobile ? mobileTop : desktopTop;\n\n return offsetY;\n }\n\n function getOffsetLeft() {\n if (!isMounted || align !== \"left\") return undefined;\n return offset?.left ?? clientRectX;\n }\n\n function getOffsetRight() {\n if (!isMounted || align !== \"right\") return undefined;\n return (\n offset?.right ??\n Math.floor(document.body.clientWidth - clientRectRight)\n );\n }\n\n const getAccessibleTimeText = (seconds: number): string => {\n const { minutes, seconds: secs } = TimeHelper.toMinutesSeconds(seconds);\n\n const minuteText = minutes === 1 ? \"minute\" : \"minutes\";\n const secondText = secs === 1 ? \"second\" : \"seconds\";\n\n if (minutes > 0 && secs > 0) {\n return `Time left: ${minutes} ${minuteText} and ${secs} ${secondText}`;\n } else if (minutes > 0) {\n return `Time left: ${minutes} ${minuteText}`;\n } else {\n return `Time left: ${secs} ${secondText}`;\n }\n };\n // =============================================================================\n // RENDER FUNCTION\n // =============================================================================\n\n const renderPeriodicAndWarningAnnouncement = () => (\n <VisuallyHidden\n aria-live={\n typeof notifyTimer === \"number\" &&\n remainingSeconds <= notifyTimer\n ? \"assertive\"\n : \"polite\"\n }\n aria-atomic=\"true\"\n >\n {announcement}\n </VisuallyHidden>\n );\n\n const renderTimer = () => {\n const { minutes, seconds } =\n TimeHelper.toMinutesSeconds(remainingSeconds);\n const m = minutes !== 1 ? \"mins\" : \"min\";\n const s = seconds !== 1 ? \"secs\" : \"sec\";\n return (\n <>\n <ClockIcon className={styles.timerIcon} data-warn={!!warn} />\n <div className={styles.timeLeft}>Time left:</div>\n <div\n className={styles.timer}\n aria-label={getAccessibleTimeText(remainingSeconds)}\n >\n {minutes} {m} {String(seconds).padStart(2, \"0\")} {s}\n </div>\n {renderPeriodicAndWarningAnnouncement()}\n </>\n );\n };\n\n const renderInlineCountdown = () => {\n return (\n <div\n data-testid={testId}\n data-id=\"countdown-wrapper\"\n data-warn={!!warn}\n ref={wrapperRef}\n inert={inertValue(!isVisible)}\n className={clsx(\n styles.countdown,\n styles.countdownInline,\n !isVisible && styles.countdownHidden\n )}\n tabIndex={0}\n role=\"timer\"\n aria-label=\"Countdown timer\"\n onFocus={handleOnFocus}\n >\n {renderTimer()}\n </div>\n );\n };\n\n const renderFixedCountdown = () => {\n return (\n <div\n ref={fixedCountdownRef}\n data-testid={testId}\n data-id=\"fixed-countdown-wrapper\"\n data-warn={!!warn}\n className={clsx(styles.countdown, styles.countdownFixed)}\n tabIndex={0}\n role=\"timer\"\n aria-label=\"Countdown timer\"\n onFocus={handleOnFocus}\n >\n {renderTimer()}\n </div>\n );\n };\n\n if (!isPlaying && remainingSeconds !== 0) return <></>;\n\n return (\n <div className={clsx(styles.wrapper, className)} {...otherProps}>\n <div ref={stickyRef}></div>\n {renderInlineCountdown()}\n {wrapperRef.current && !isVisible && renderFixedCountdown()}\n </div>\n );\n};\n"],"names":["_a","className","align","timer","timestamp","notifyTimer","offset","mobileOffset","show","fixed","reminderInterval","testId","onFinish","onNotify","onTick","otherProps","__rest","wrapperRef","useRef","fixedCountdownRef","isNotified","offsetY","setOffsetY","useState","clientRectRight","setClientRectRight","clientRectX","setClientRectX","isPlaying","setIsPlaying","announcement","setAnnouncement","isMounted","useIsMounted","remainingSeconds","initialSeconds","useTimer","ref","stickyRef","inView","useInView","threshold","rootMargin","initialInView","isVisible","warn","isMobile","useMaxWidthMediaQuery","useApplyStyle","styles.tokens","fixedCountdown","top","formatUnitValue","left","getOffsetLeft","right","Math","floor","document","body","clientWidth","getOffsetRight","useEffect","performOnFinishHandler","performOnTickHandler","performOnNotifyHandler","y","desktopTop","mobileTop","_b","getOffsetY","current","handleResize","throttle","handleWindowResize","window","addEventListener","removeEventListener","timeElapsed","getAccessibleTimeText","clientRect","getBoundingClientRect","x","handleOnFocus","focusMessage","seconds","minutes","secs","TimeHelper","toMinutesSeconds","minuteText","secondText","renderTimer","m","s","_jsxs","_Fragment","children","_jsx","ClockIcon","styles.timerIcon","styles.timeLeft","styles.timer","String","padStart","VisuallyHidden","Object","assign","clsx","styles.wrapper","inert","inertValue","styles.countdown","styles.countdownInline","styles.countdownHidden","tabIndex","role","onFocus","styles.countdownFixed"],"mappings":"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"}
1
+ {"version":3,"file":"countdown-timer.js","sources":["../../../src/countdown-timer/countdown-timer.tsx"],"sourcesContent":["import { ClockIcon } from \"@lifesg/react-icons\";\nimport clsx from \"clsx\";\nimport throttle from \"lodash/throttle\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { useInView } from \"react-intersection-observer\";\n\nimport { inertValue, VisuallyHidden } from \"../shared/accessibility\";\nimport {\n formatUnitValue,\n useApplyStyle,\n useMaxWidthMediaQuery,\n} from \"../theme\";\nimport { useIsMounted } from \"../util\";\nimport { TimeHelper } from \"../util/time-helper\";\nimport * as styles from \"./countdown-timer.styles\";\nimport type { CountdownTimerProps } from \"./types\";\nimport { useTimer } from \"./use-timer\";\n\n/**\n * Displays a live countdown of time remaining until a deadline.\n *\n * Use when a time-limited interaction — such as a session timeout or a timed\n * form — needs a persistent visual reminder.\n */\nexport const CountdownTimer = ({\n className,\n align = \"right\",\n timer,\n timestamp,\n notifyTimer,\n offset,\n mobileOffset,\n show,\n fixed = true,\n reminderInterval = 120,\n \"data-testid\": testId,\n onFinish,\n onNotify,\n onTick,\n ...otherProps\n}: CountdownTimerProps) => {\n // =============================================================================\n // CONST, STATE, REF\n // =============================================================================\n\n const wrapperRef = useRef<HTMLDivElement>(null);\n const fixedCountdownRef = useRef<HTMLDivElement>(null);\n\n const isNotified = useRef<boolean>(false);\n const [offsetY, setOffsetY] = useState<number>(0);\n const [clientRectRight, setClientRectRight] = useState<number>(0);\n const [clientRectX, setClientRectX] = useState<number>(0);\n const [isPlaying, setIsPlaying] = useState(false);\n const [announcement, setAnnouncement] = useState<string>(\"\");\n\n const isMounted = useIsMounted();\n const [remainingSeconds, initialSeconds] = useTimer(\n timer,\n timestamp,\n isPlaying\n );\n const { ref: stickyRef, inView } = useInView({\n threshold: 1,\n rootMargin: `${offsetY * -1}px 0px 0px 0px`,\n initialInView: true,\n });\n const isVisible = !fixed || inView;\n const warn =\n typeof notifyTimer === \"number\" && remainingSeconds <= notifyTimer;\n\n const isMobile = useMaxWidthMediaQuery(\"sm\");\n\n // =============================================================================\n // EFFECTS\n // =============================================================================\n\n useApplyStyle(fixedCountdownRef, {\n [styles.tokens.fixedCountdown.top]: formatUnitValue(offsetY, \"px\"),\n [styles.tokens.fixedCountdown.left]: formatUnitValue(\n getOffsetLeft(),\n \"px\"\n ),\n [styles.tokens.fixedCountdown.right]: formatUnitValue(\n getOffsetRight(),\n \"px\"\n ),\n });\n\n useEffect(() => {\n setIsPlaying(show);\n }, [show]);\n\n useEffect(() => {\n if (remainingSeconds === 0) {\n performOnFinishHandler();\n } else if (\n typeof notifyTimer === \"number\" &&\n remainingSeconds <= notifyTimer\n ) {\n performOnTickHandler();\n performOnNotifyHandler();\n }\n }, [remainingSeconds]);\n\n useEffect(() => {\n const y = getOffsetY();\n setOffsetY(y);\n }, [isMobile, offset?.top, mobileOffset?.top]);\n\n useEffect(() => {\n if (wrapperRef.current) {\n const handleResize = throttle(handleWindowResize, 300);\n handleWindowResize();\n\n window.addEventListener(\"resize\", handleResize);\n\n return () => {\n window.removeEventListener(\"resize\", handleResize);\n };\n }\n }, [wrapperRef.current]);\n\n // Announcements\n useEffect(() => {\n const timeElapsed = initialSeconds - remainingSeconds;\n if (timeElapsed === 0) return;\n // Polite notification\n if (timeElapsed % reminderInterval === 0) {\n if (\n typeof notifyTimer !== \"number\" ||\n remainingSeconds > notifyTimer\n ) {\n setAnnouncement(getAccessibleTimeText(remainingSeconds));\n }\n }\n\n // Assertive notification\n if (\n typeof notifyTimer === \"number\" &&\n remainingSeconds === notifyTimer\n ) {\n setAnnouncement(getAccessibleTimeText(remainingSeconds));\n }\n }, [remainingSeconds, initialSeconds, reminderInterval, notifyTimer]);\n\n useEffect(() => {\n // reset\n isNotified.current = false;\n }, [initialSeconds, show]);\n\n // =============================================================================\n // EVENT HANDLERS\n // =============================================================================\n const handleWindowResize = () => {\n if (!wrapperRef.current) return;\n\n const clientRect = wrapperRef.current.getBoundingClientRect();\n\n setClientRectX(clientRect.x);\n setClientRectRight(clientRect.right);\n };\n\n const handleOnFocus = () => {\n const focusMessage = getAccessibleTimeText(remainingSeconds);\n setAnnouncement(focusMessage);\n };\n\n // =============================================================================\n // HELPER FUNCTIONS\n // =============================================================================\n\n const performOnTickHandler = () => {\n if (onTick) {\n onTick(remainingSeconds);\n }\n };\n\n const performOnNotifyHandler = () => {\n if (onNotify && !isNotified.current) {\n isNotified.current = true;\n onNotify();\n }\n };\n\n const performOnFinishHandler = () => {\n setIsPlaying(false);\n\n if (onFinish) onFinish();\n };\n\n function getOffsetY() {\n const desktopTop = offset?.top ?? 168;\n const mobileTop = mobileOffset?.top ?? 80;\n const offsetY = isMobile ? mobileTop : desktopTop;\n\n return offsetY;\n }\n\n function getOffsetLeft() {\n if (!isMounted || align !== \"left\") return undefined;\n return offset?.left ?? clientRectX;\n }\n\n function getOffsetRight() {\n if (!isMounted || align !== \"right\") return undefined;\n return (\n offset?.right ??\n Math.floor(document.body.clientWidth - clientRectRight)\n );\n }\n\n const getAccessibleTimeText = (seconds: number): string => {\n const { minutes, seconds: secs } = TimeHelper.toMinutesSeconds(seconds);\n\n const minuteText = minutes === 1 ? \"minute\" : \"minutes\";\n const secondText = secs === 1 ? \"second\" : \"seconds\";\n\n if (minutes > 0 && secs > 0) {\n return `Time left: ${minutes} ${minuteText} and ${secs} ${secondText}`;\n } else if (minutes > 0) {\n return `Time left: ${minutes} ${minuteText}`;\n } else {\n return `Time left: ${secs} ${secondText}`;\n }\n };\n // =============================================================================\n // RENDER FUNCTION\n // =============================================================================\n\n const renderPeriodicAndWarningAnnouncement = () => (\n <VisuallyHidden\n aria-live={\n typeof notifyTimer === \"number\" &&\n remainingSeconds <= notifyTimer\n ? \"assertive\"\n : \"polite\"\n }\n aria-atomic=\"true\"\n >\n {announcement}\n </VisuallyHidden>\n );\n\n const renderTimer = () => {\n const { minutes, seconds } =\n TimeHelper.toMinutesSeconds(remainingSeconds);\n const m = minutes !== 1 ? \"mins\" : \"min\";\n const s = seconds !== 1 ? \"secs\" : \"sec\";\n return (\n <>\n <ClockIcon className={styles.timerIcon} data-warn={!!warn} />\n <div className={styles.timeLeft}>Time left:</div>\n <div\n className={styles.timer}\n aria-label={getAccessibleTimeText(remainingSeconds)}\n >\n {minutes} {m} {String(seconds).padStart(2, \"0\")} {s}\n </div>\n {renderPeriodicAndWarningAnnouncement()}\n </>\n );\n };\n\n const renderInlineCountdown = () => {\n return (\n <div\n data-testid={testId}\n data-id=\"countdown-wrapper\"\n data-warn={!!warn}\n ref={wrapperRef}\n inert={inertValue(!isVisible)}\n className={clsx(\n styles.countdown,\n styles.countdownInline,\n !isVisible && styles.countdownHidden\n )}\n tabIndex={0}\n role=\"timer\"\n aria-label=\"Countdown timer\"\n onFocus={handleOnFocus}\n >\n {renderTimer()}\n </div>\n );\n };\n\n const renderFixedCountdown = () => {\n return (\n <div\n ref={fixedCountdownRef}\n data-testid={testId}\n data-id=\"fixed-countdown-wrapper\"\n data-warn={!!warn}\n className={clsx(styles.countdown, styles.countdownFixed)}\n tabIndex={0}\n role=\"timer\"\n aria-label=\"Countdown timer\"\n onFocus={handleOnFocus}\n >\n {renderTimer()}\n </div>\n );\n };\n\n if (!isPlaying && remainingSeconds !== 0) return <></>;\n\n return (\n <div className={clsx(styles.wrapper, className)} {...otherProps}>\n <div ref={stickyRef}></div>\n {renderInlineCountdown()}\n {wrapperRef.current && !isVisible && renderFixedCountdown()}\n </div>\n );\n};\n"],"names":["_a","className","align","timer","timestamp","notifyTimer","offset","mobileOffset","show","fixed","reminderInterval","testId","onFinish","onNotify","onTick","otherProps","__rest","wrapperRef","useRef","fixedCountdownRef","isNotified","offsetY","setOffsetY","useState","clientRectRight","setClientRectRight","clientRectX","setClientRectX","isPlaying","setIsPlaying","announcement","setAnnouncement","isMounted","useIsMounted","remainingSeconds","initialSeconds","useTimer","ref","stickyRef","inView","useInView","threshold","rootMargin","initialInView","isVisible","warn","isMobile","useMaxWidthMediaQuery","useApplyStyle","styles.tokens","fixedCountdown","top","formatUnitValue","left","getOffsetLeft","right","Math","floor","document","body","clientWidth","getOffsetRight","useEffect","performOnFinishHandler","performOnTickHandler","performOnNotifyHandler","y","desktopTop","mobileTop","_b","getOffsetY","current","handleResize","throttle","handleWindowResize","window","addEventListener","removeEventListener","timeElapsed","getAccessibleTimeText","clientRect","getBoundingClientRect","x","handleOnFocus","focusMessage","seconds","minutes","secs","TimeHelper","toMinutesSeconds","minuteText","secondText","renderTimer","m","s","_jsxs","_Fragment","children","_jsx","ClockIcon","styles.timerIcon","styles.timeLeft","styles.timer","String","padStart","VisuallyHidden","Object","assign","clsx","styles.wrapper","inert","inertValue","styles.countdown","styles.countdownInline","styles.countdownHidden","tabIndex","role","onFocus","styles.countdownFixed"],"mappings":"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"}