@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,4 +1,4 @@
1
- .sk1h6mz{width:2.75rem;height:2.75rem;color:var(--fds-colour-icon-primary);}
1
+ @layer fds{.sk1h6mz{width:2.75rem;height:2.75rem;color:var(--fds-colour-icon-primary);}
2
2
  .lg72zyg{margin:0 var(--fds-spacing-8);line-height:0;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;cursor:pointer;}
3
3
  .c1w9ub4z{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;margin:var(--fds-spacing-8) var(--fds-spacing-16);border-radius:var(--fds-radius-sm);outline:none;}
4
- .chyiool{outline:var(--fds-border-width-020) var(--fds-border-style-solid) var(--fds-colour-icon-primary);outline-offset:2px;}
4
+ .chyiool{outline:var(--fds-border-width-020) var(--fds-border-style-solid) var(--fds-colour-icon-primary);outline-offset:2px;}}
@@ -1 +1 @@
1
- {"version":3,"file":"feedback-rating.js","sources":["../../../src/feedback-rating/feedback-rating.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { useEffect, useRef, useState } from \"react\";\n\nimport { Button } from \"../button\";\nimport { VisuallyHidden } from \"../shared/accessibility\";\nimport { Typography } from \"../typography\";\nimport { useId } from \"../util\";\nimport * as styles from \"./feedback-rating.styles\";\nimport { FeedbackRatingData } from \"./feedback-rating-data\";\nimport { FeedbackRatingStarsContainer } from \"./feedback-rating-stars-container\";\nimport type { FeedbackRatingProps } from \"./types\";\n\nexport const FeedbackRating = (props: FeedbackRatingProps): JSX.Element => {\n // =========================================================================\n // CONST, STATE, REF\n // =========================================================================\n const {\n imgSrc,\n buttonLabel,\n description,\n rating,\n onRatingChange,\n onSubmit,\n className,\n id,\n \"data-testid\": testId,\n ...otherProps\n } = props;\n const [hasImageError, setHasImageError] = useState(false);\n const imgRef = useRef<HTMLImageElement>(null);\n const internalId = useId();\n const descriptionId = `${internalId}-description`;\n const bannerSrc = imgSrc ?? FeedbackRatingData.IMG;\n const componentDescription =\n description ?? FeedbackRatingData.DEFAULT_DESCRIPTION;\n const resolvedButtonLabel =\n buttonLabel ?? FeedbackRatingData.DEFAULT_BUTTON_LABEL;\n const isSubmitDisabled = !rating;\n\n useEffect(() => {\n setHasImageError(false);\n\n if (imgRef.current?.complete && imgRef.current.naturalWidth === 0) {\n setHasImageError(true);\n }\n }, [bannerSrc]);\n\n const handleImgError = () => {\n setHasImageError(true);\n };\n\n return (\n <div\n role=\"group\"\n aria-labelledby={internalId}\n className={clsx(styles.mainContainer, className)}\n id={id}\n data-testid={testId}\n {...otherProps}\n >\n {bannerSrc && !hasImageError && (\n <img\n ref={imgRef}\n className={styles.image}\n data-testid=\"feedback-banner-image\"\n src={bannerSrc}\n alt=\"\"\n onError={handleImgError}\n />\n )}\n <div className={styles.childContainer}>\n <Typography.HeadingSM as=\"h2\" id={internalId} weight=\"semibold\">\n {componentDescription}\n </Typography.HeadingSM>\n <FeedbackRatingStarsContainer\n ariaLabelledBy={internalId}\n ariaDescribedBy={descriptionId}\n rating={rating}\n onRatingChange={onRatingChange}\n />\n <VisuallyHidden id={descriptionId}>\n Minimum, 1 star. Maximum, 5 stars.\n </VisuallyHidden>\n <Button\n className={styles.submitButton}\n disabled={isSubmitDisabled}\n focusableWhenDisabled\n onClick={onSubmit}\n type=\"button\"\n >\n {resolvedButtonLabel}\n </Button>\n </div>\n </div>\n );\n};\n"],"names":["props","imgSrc","buttonLabel","description","rating","onRatingChange","onSubmit","className","id","testId","otherProps","__rest","hasImageError","setHasImageError","useState","imgRef","useRef","internalId","useId","descriptionId","bannerSrc","FeedbackRatingData","IMG","componentDescription","DEFAULT_DESCRIPTION","resolvedButtonLabel","DEFAULT_BUTTON_LABEL","isSubmitDisabled","useEffect","_a","current","complete","naturalWidth","_jsxs","Object","assign","role","clsx","styles.mainContainer","children","_jsx","ref","styles.image","src","alt","onError","styles.childContainer","Typography","HeadingSM","as","weight","FeedbackRatingStarsContainer","ariaLabelledBy","ariaDescribedBy","VisuallyHidden","Button","styles.submitButton","disabled","focusableWhenDisabled","onClick","type"],"mappings":"qqBAY+BA,IAI3B,MAAMC,OACFA,EAAMC,YACNA,EAAWC,YACXA,EAAWC,OACXA,EAAMC,eACNA,EAAcC,SACdA,EAAQC,UACRA,EAASC,GACTA,EACA,cAAeC,GAEfT,EADGU,EAAUC,EAAAA,OACbX,EAXE,CAAA,SAAA,cAAA,cAAA,SAAA,iBAAA,WAAA,YAAA,KAAA,iBAYCY,EAAeC,GAAoBC,EAAAA,UAAS,GAC7CC,EAASC,EAAAA,OAAyB,MAClCC,EAAaC,EAAAA,QACbC,EAAgB,GAAGF,gBACnBG,EAAYnB,QAAAA,EAAUoB,EAAAA,mBAAmBC,IACzCC,EACFpB,QAAAA,EAAekB,EAAAA,mBAAmBG,oBAChCC,EACFvB,QAAAA,EAAemB,EAAAA,mBAAmBK,qBAChCC,GAAoBvB,EAE1BwB,EAAAA,WAAU,WACNf,GAAiB,YAEbgB,EAAAd,EAAOe,8BAASC,WAA4C,IAAhChB,EAAOe,QAAQE,cAC3CnB,GAAiB,EACrB,GACD,CAACO,IAMJ,OACIa,OAAA,MAAAC,OAAAC,OAAA,CACIC,KAAK,QAAO,kBACKnB,EACjBV,UAAW8B,EAAAA,QAAKC,gBAAsB/B,GACtCC,GAAIA,gBACSC,GACTC,EAAU,CAAA6B,SAAA,CAEbnB,IAAcR,GACX4B,EAAAA,IAAA,MAAA,CACIC,IAAK1B,EACLR,UAAWmC,QAAY,cACX,wBACZC,IAAKvB,EACLwB,IAAI,GACJC,QApBO,KACnBhC,GAAiB,EAAK,IAsBlBoB,OAAA,MAAA,CAAK1B,UAAWuC,EAAAA,eAAqBP,SAAA,CACjCC,EAAAA,IAACO,EAAAA,WAAWC,UAAS,CAACC,GAAG,KAAKzC,GAAIS,EAAYiC,OAAO,WAAUX,SAC1DhB,IAELiB,MAACW,EAAAA,6BAA4B,CACzBC,eAAgBnC,EAChBoC,gBAAiBlC,EACjBf,OAAQA,EACRC,eAAgBA,IAEpBmC,EAAAA,IAACc,EAAAA,eAAc,CAAC9C,GAAIW,EAAaoB,SAAA,uCAGjCC,EAAAA,IAACe,EAAAA,OAAM,CACHhD,UAAWiD,eACXC,SAAU9B,EACV+B,uBAAqB,EACrBC,QAASrD,EACTsD,KAAK,kBAEJnC,UAGP"}
1
+ {"version":3,"file":"feedback-rating.js","sources":["../../../src/feedback-rating/feedback-rating.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { useEffect, useRef, useState } from \"react\";\n\nimport { Button } from \"../button\";\nimport { VisuallyHidden } from \"../shared/accessibility\";\nimport { Typography } from \"../typography\";\nimport { useId } from \"../util\";\nimport * as styles from \"./feedback-rating.styles\";\nimport { FeedbackRatingData } from \"./feedback-rating-data\";\nimport { FeedbackRatingStarsContainer } from \"./feedback-rating-stars-container\";\nimport type { FeedbackRatingProps } from \"./types\";\n\n/**\n * A star-rating widget for collecting user feedback.\n *\n * Use `FeedbackRating` to prompt users for a 1–5 star rating.\n * The submit button remains disabled until a star is selected.\n */\nexport const FeedbackRating = (props: FeedbackRatingProps): JSX.Element => {\n // =========================================================================\n // CONST, STATE, REF\n // =========================================================================\n const {\n imgSrc,\n buttonLabel,\n description,\n rating,\n onRatingChange,\n onSubmit,\n className,\n id,\n \"data-testid\": testId,\n ...otherProps\n } = props;\n const [hasImageError, setHasImageError] = useState(false);\n const imgRef = useRef<HTMLImageElement>(null);\n const internalId = useId();\n const descriptionId = `${internalId}-description`;\n const bannerSrc = imgSrc ?? FeedbackRatingData.IMG;\n const componentDescription =\n description ?? FeedbackRatingData.DEFAULT_DESCRIPTION;\n const resolvedButtonLabel =\n buttonLabel ?? FeedbackRatingData.DEFAULT_BUTTON_LABEL;\n const isSubmitDisabled = !rating;\n\n useEffect(() => {\n setHasImageError(false);\n\n if (imgRef.current?.complete && imgRef.current.naturalWidth === 0) {\n setHasImageError(true);\n }\n }, [bannerSrc]);\n\n const handleImgError = () => {\n setHasImageError(true);\n };\n\n return (\n <div\n role=\"group\"\n aria-labelledby={internalId}\n className={clsx(styles.mainContainer, className)}\n id={id}\n data-testid={testId}\n {...otherProps}\n >\n {bannerSrc && !hasImageError && (\n <img\n ref={imgRef}\n className={styles.image}\n data-testid=\"feedback-banner-image\"\n src={bannerSrc}\n alt=\"\"\n onError={handleImgError}\n />\n )}\n <div className={styles.childContainer}>\n <Typography.HeadingSM as=\"h2\" id={internalId} weight=\"semibold\">\n {componentDescription}\n </Typography.HeadingSM>\n <FeedbackRatingStarsContainer\n ariaLabelledBy={internalId}\n ariaDescribedBy={descriptionId}\n rating={rating}\n onRatingChange={onRatingChange}\n />\n <VisuallyHidden id={descriptionId}>\n Minimum, 1 star. Maximum, 5 stars.\n </VisuallyHidden>\n <Button\n className={styles.submitButton}\n disabled={isSubmitDisabled}\n focusableWhenDisabled\n onClick={onSubmit}\n type=\"button\"\n >\n {resolvedButtonLabel}\n </Button>\n </div>\n </div>\n );\n};\n"],"names":["props","imgSrc","buttonLabel","description","rating","onRatingChange","onSubmit","className","id","testId","otherProps","__rest","hasImageError","setHasImageError","useState","imgRef","useRef","internalId","useId","descriptionId","bannerSrc","FeedbackRatingData","IMG","componentDescription","DEFAULT_DESCRIPTION","resolvedButtonLabel","DEFAULT_BUTTON_LABEL","isSubmitDisabled","useEffect","_a","current","complete","naturalWidth","_jsxs","Object","assign","role","clsx","styles.mainContainer","children","_jsx","ref","styles.image","src","alt","onError","styles.childContainer","Typography","HeadingSM","as","weight","FeedbackRatingStarsContainer","ariaLabelledBy","ariaDescribedBy","VisuallyHidden","Button","styles.submitButton","disabled","focusableWhenDisabled","onClick","type"],"mappings":"qqBAkB+BA,IAI3B,MAAMC,OACFA,EAAMC,YACNA,EAAWC,YACXA,EAAWC,OACXA,EAAMC,eACNA,EAAcC,SACdA,EAAQC,UACRA,EAASC,GACTA,EACA,cAAeC,GAEfT,EADGU,EAAUC,EAAAA,OACbX,EAXE,CAAA,SAAA,cAAA,cAAA,SAAA,iBAAA,WAAA,YAAA,KAAA,iBAYCY,EAAeC,GAAoBC,EAAAA,UAAS,GAC7CC,EAASC,EAAAA,OAAyB,MAClCC,EAAaC,EAAAA,QACbC,EAAgB,GAAGF,gBACnBG,EAAYnB,QAAAA,EAAUoB,EAAAA,mBAAmBC,IACzCC,EACFpB,QAAAA,EAAekB,EAAAA,mBAAmBG,oBAChCC,EACFvB,QAAAA,EAAemB,EAAAA,mBAAmBK,qBAChCC,GAAoBvB,EAE1BwB,EAAAA,WAAU,WACNf,GAAiB,YAEbgB,EAAAd,EAAOe,8BAASC,WAA4C,IAAhChB,EAAOe,QAAQE,cAC3CnB,GAAiB,EACrB,GACD,CAACO,IAMJ,OACIa,OAAA,MAAAC,OAAAC,OAAA,CACIC,KAAK,QAAO,kBACKnB,EACjBV,UAAW8B,EAAAA,QAAKC,gBAAsB/B,GACtCC,GAAIA,gBACSC,GACTC,EAAU,CAAA6B,SAAA,CAEbnB,IAAcR,GACX4B,EAAAA,IAAA,MAAA,CACIC,IAAK1B,EACLR,UAAWmC,QAAY,cACX,wBACZC,IAAKvB,EACLwB,IAAI,GACJC,QApBO,KACnBhC,GAAiB,EAAK,IAsBlBoB,OAAA,MAAA,CAAK1B,UAAWuC,EAAAA,eAAqBP,SAAA,CACjCC,EAAAA,IAACO,EAAAA,WAAWC,UAAS,CAACC,GAAG,KAAKzC,GAAIS,EAAYiC,OAAO,WAAUX,SAC1DhB,IAELiB,MAACW,EAAAA,6BAA4B,CACzBC,eAAgBnC,EAChBoC,gBAAiBlC,EACjBf,OAAQA,EACRC,eAAgBA,IAEpBmC,EAAAA,IAACc,EAAAA,eAAc,CAAC9C,GAAIW,EAAaoB,SAAA,uCAGjCC,EAAAA,IAACe,EAAAA,OAAM,CACHhD,UAAWiD,eACXC,SAAU9B,EACV+B,uBAAqB,EACrBC,QAASrD,EACTsD,KAAK,kBAEJnC,UAGP"}
@@ -1,4 +1,4 @@
1
- .i1kvxt6e{width:9.5rem;height:9.5rem;margin:0 1rem;}:where(body.fds-breakpoint-md-max) .i1kvxt6e{width:5.5rem;height:5.5rem;margin:0;}
1
+ @layer fds{.i1kvxt6e{width:9.5rem;height:9.5rem;margin:0 1rem;}:where(body.fds-breakpoint-md-max) .i1kvxt6e{width:5.5rem;height:5.5rem;margin:0;}
2
2
  .m12gz8bh{border-top:var(--fds-border-width-010) var(--fds-border-style-solid) var(--fds-colour-border);border-bottom:var(--fds-border-width-010) var(--fds-border-style-solid) var(--fds-colour-border);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:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;width:100%;padding:1rem 3rem;}:where(body.fds-breakpoint-md-max) .m12gz8bh{padding:2rem 0 1rem;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}
3
3
  .c2of6av{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:1rem 1rem;width:100%;text-align:center;}:where(body.fds-breakpoint-md-max) .c2of6av{margin:1rem 1.25rem;max-width:calc(100% - 2.5rem);}
4
- .sopm87z{margin-top:1rem;width:100%;}
4
+ .sopm87z{margin-top:1rem;width:100%;}}
@@ -1 +1 @@
1
- {"version":3,"file":"file-download.js","sources":["../../../src/file-download/file-download.tsx"],"sourcesContent":["import clsx from \"clsx\";\n\nimport { DashedBorder } from \"../dashed-border\";\nimport { Markup } from \"../markup\";\nimport { Border, Colour, Radius } from \"../theme\";\nimport * as styles from \"./file-download.styles\";\nimport { FileListCard } from \"./file-list-card\";\nimport type { FileDownloadProps, FileItemDownloadProps } from \"./types\";\n\nexport const FileDownload = ({\n id,\n fileItems,\n title,\n description,\n onDownload,\n \"data-testid\": testId,\n className,\n styleType = \"bordered\",\n}: FileDownloadProps) => {\n // =========================================================================\n // EVENT HANDLERS\n // =========================================================================\n const handleDownloadItem = async (item: FileItemDownloadProps) => {\n if (onDownload) {\n await onDownload(item);\n }\n };\n\n // =========================================================================\n // RENDER FUNCTIONS\n // =========================================================================\n const renderTitle = () => {\n if (!title) {\n return null;\n }\n\n if (typeof title === \"string\") {\n return <p className={styles.title}>{title}</p>;\n }\n\n return (\n <Markup className={styles.titleContainer} baseTextSize=\"heading-xs\">\n {title}\n </Markup>\n );\n };\n\n const renderDescription = () => {\n if (!description) {\n return null;\n }\n\n if (typeof description === \"string\") {\n return <p className={styles.description}>{description}</p>;\n }\n\n return (\n <Markup\n className={styles.descriptionContainer}\n baseTextSize=\"body-md\"\n >\n {description}\n </Markup>\n );\n };\n\n const isBordered = styleType === \"bordered\";\n\n return (\n <DashedBorder\n id={id ? `${id}-file-download` : \"file-download\"}\n className={clsx(\n styles.container,\n isBordered && styles.containerBordered,\n className\n )}\n data-testid={testId}\n enabled={isBordered}\n thickness={Border[\"width-040\"]}\n radius={Radius[\"sm\"]}\n colour={Colour[\"border\"]}\n >\n {(title || description) && (\n <div className={styles.textContainer}>\n {renderTitle()}\n {renderDescription()}\n </div>\n )}\n <ul className={styles.listWrapper}>\n {fileItems &&\n fileItems.length > 0 &&\n fileItems.map((item) => (\n <FileListCard\n key={item.id}\n fileItem={item}\n onDownload={handleDownloadItem}\n />\n ))}\n </ul>\n </DashedBorder>\n );\n};\n"],"names":["id","fileItems","title","description","onDownload","testId","className","styleType","handleDownloadItem","item","__awaiter","isBordered","_jsxs","DashedBorder","clsx","styles.container","styles.containerBordered","enabled","thickness","Border","radius","Radius","colour","Colour","children","styles.textContainer","_jsx","styles.title","Markup","styles.titleContainer","baseTextSize","styles.description","styles.descriptionContainer","styles.listWrapper","length","map","FileListCard","fileItem"],"mappings":"85BAS4B,EACxBA,KACAC,YACAC,QACAC,cACAC,aACA,cAAeC,EACfC,YACAC,YAAY,eAKZ,MAAMC,EAA4BC,GAA+BC,EAAAA,eAAA,OAAA,OAAA,GAAA,YACzDN,UACMA,EAAWK,GAEzB,IAwCME,EAA2B,aAAdJ,EAEnB,OACIK,OAACC,EAAAA,cACGb,GAAIA,EAAK,GAAGA,kBAAqB,gBACjCM,UAAWQ,EAAAA,QACPC,EAAAA,UACAJ,GAAcK,oBACdV,GACH,cACYD,EACbY,QAASN,EACTO,UAAWC,EAAAA,OAAO,aAClBC,OAAQC,EAAAA,OAAW,GACnBC,OAAQC,EAAAA,OAAe,OAACC,SAAA,EAEtBtB,GAASC,IACPS,EAAAA,YAAKN,UAAWmB,EAAAA,wBAnDnBvB,EAIgB,iBAAVA,EACAwB,EAAAA,IAAA,IAAA,CAAGpB,UAAWqB,EAAAA,MAAYH,SAAGtB,IAIpCwB,EAAAA,IAACE,SAAM,CAACtB,UAAWuB,EAAAA,eAAuBC,aAAa,sBAClD5B,IATE,KAeNC,EAIsB,iBAAhBA,EACAuB,EAAAA,IAAA,IAAA,CAAGpB,UAAWyB,EAAAA,YAAkBP,SAAGrB,IAI1CuB,EAAAA,IAACE,SAAM,CACHtB,UAAW0B,EAAAA,qBACXF,aAAa,mBAEZ3B,IAZE,QAuCPuB,EAAAA,UAAIpB,UAAW2B,EAAAA,qBACVhC,GACGA,EAAUiC,OAAS,GACnBjC,EAAUkC,KAAK1B,GACXiB,EAAAA,IAACU,EAAAA,aAAY,CAETC,SAAU5B,EACVL,WAAYI,GAFPC,EAAKT,UAMf"}
1
+ {"version":3,"file":"file-download.js","sources":["../../../src/file-download/file-download.tsx"],"sourcesContent":["import clsx from \"clsx\";\n\nimport { DashedBorder } from \"../dashed-border\";\nimport { Markup } from \"../markup\";\nimport { Border, Colour, Radius } from \"../theme\";\nimport * as styles from \"./file-download.styles\";\nimport { FileListCard } from \"./file-list-card\";\nimport type { FileDownloadProps, FileItemDownloadProps } from \"./types\";\n\n/**\n * Displays a list of downloadable files, optionally grouped under a title and description.\n *\n * Use `FileDownload` to present one or more files that users can download individually.\n * Each file item renders as a card with file metadata and a download trigger.\n */\nexport const FileDownload = ({\n id,\n fileItems,\n title,\n description,\n onDownload,\n \"data-testid\": testId,\n className,\n styleType = \"bordered\",\n}: FileDownloadProps) => {\n // =========================================================================\n // EVENT HANDLERS\n // =========================================================================\n const handleDownloadItem = async (item: FileItemDownloadProps) => {\n if (onDownload) {\n await onDownload(item);\n }\n };\n\n // =========================================================================\n // RENDER FUNCTIONS\n // =========================================================================\n const renderTitle = () => {\n if (!title) {\n return null;\n }\n\n if (typeof title === \"string\") {\n return <p className={styles.title}>{title}</p>;\n }\n\n return (\n <Markup className={styles.titleContainer} baseTextSize=\"heading-xs\">\n {title}\n </Markup>\n );\n };\n\n const renderDescription = () => {\n if (!description) {\n return null;\n }\n\n if (typeof description === \"string\") {\n return <p className={styles.description}>{description}</p>;\n }\n\n return (\n <Markup\n className={styles.descriptionContainer}\n baseTextSize=\"body-md\"\n >\n {description}\n </Markup>\n );\n };\n\n const isBordered = styleType === \"bordered\";\n\n return (\n <DashedBorder\n id={id ? `${id}-file-download` : \"file-download\"}\n className={clsx(\n styles.container,\n isBordered && styles.containerBordered,\n className\n )}\n data-testid={testId}\n enabled={isBordered}\n thickness={Border[\"width-040\"]}\n radius={Radius[\"sm\"]}\n colour={Colour[\"border\"]}\n >\n {(title || description) && (\n <div className={styles.textContainer}>\n {renderTitle()}\n {renderDescription()}\n </div>\n )}\n <ul className={styles.listWrapper}>\n {fileItems &&\n fileItems.length > 0 &&\n fileItems.map((item) => (\n <FileListCard\n key={item.id}\n fileItem={item}\n onDownload={handleDownloadItem}\n />\n ))}\n </ul>\n </DashedBorder>\n );\n};\n"],"names":["id","fileItems","title","description","onDownload","testId","className","styleType","handleDownloadItem","item","__awaiter","isBordered","_jsxs","DashedBorder","clsx","styles.container","styles.containerBordered","enabled","thickness","Border","radius","Radius","colour","Colour","children","styles.textContainer","_jsx","styles.title","Markup","styles.titleContainer","baseTextSize","styles.description","styles.descriptionContainer","styles.listWrapper","length","map","FileListCard","fileItem"],"mappings":"85BAe4B,EACxBA,KACAC,YACAC,QACAC,cACAC,aACA,cAAeC,EACfC,YACAC,YAAY,eAKZ,MAAMC,EAA4BC,GAA+BC,EAAAA,eAAA,OAAA,OAAA,GAAA,YACzDN,UACMA,EAAWK,GAEzB,IAwCME,EAA2B,aAAdJ,EAEnB,OACIK,OAACC,EAAAA,cACGb,GAAIA,EAAK,GAAGA,kBAAqB,gBACjCM,UAAWQ,EAAAA,QACPC,EAAAA,UACAJ,GAAcK,oBACdV,GACH,cACYD,EACbY,QAASN,EACTO,UAAWC,EAAAA,OAAO,aAClBC,OAAQC,EAAAA,OAAW,GACnBC,OAAQC,EAAAA,OAAe,OAACC,SAAA,EAEtBtB,GAASC,IACPS,EAAAA,YAAKN,UAAWmB,EAAAA,wBAnDnBvB,EAIgB,iBAAVA,EACAwB,EAAAA,IAAA,IAAA,CAAGpB,UAAWqB,EAAAA,MAAYH,SAAGtB,IAIpCwB,EAAAA,IAACE,SAAM,CAACtB,UAAWuB,EAAAA,eAAuBC,aAAa,sBAClD5B,IATE,KAeNC,EAIsB,iBAAhBA,EACAuB,EAAAA,IAAA,IAAA,CAAGpB,UAAWyB,EAAAA,YAAkBP,SAAGrB,IAI1CuB,EAAAA,IAACE,SAAM,CACHtB,UAAW0B,EAAAA,qBACXF,aAAa,mBAEZ3B,IAZE,QAuCPuB,EAAAA,UAAIpB,UAAW2B,EAAAA,qBACVhC,GACGA,EAAUiC,OAAS,GACnBjC,EAAUkC,KAAK1B,GACXiB,EAAAA,IAACU,EAAAA,aAAY,CAETC,SAAU5B,EACVL,WAAYI,GAFPC,EAAKT,UAMf"}
@@ -1,8 +1,8 @@
1
- .cjjybuq{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}
1
+ @layer fds{.cjjybuq{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}
2
2
  .c18jz6ma{padding:var(--fds-spacing-32);}:where(body.fds-breakpoint-sm-max) .c18jz6ma{padding:var(--fds-spacing-32) var(--fds-spacing-20);}
3
3
  .t1wreszr{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;margin-bottom:var(--fds-spacing-32);}
4
4
  .t1gdh0v3{font-family:var(--fds-font-family-heading);font-variant:var(--fds-font-variant);font-size:var(--fds-font-heading-size-xs);font-weight:var(--fds-font-weight-regular);line-height:var(--fds-font-heading-lh-xs);letter-spacing:var(--fds-font-heading-ls-xs);color:var(--fds-colour-text);margin-bottom:var(--fds-spacing-8);}
5
5
  .t15acma1{color:var(--fds-colour-text);}
6
6
  .ds68p96{font-family:var(--fds-font-family-body);font-variant:var(--fds-font-variant);font-size:var(--fds-font-body-size-md);font-weight:var(--fds-font-weight-regular);line-height:var(--fds-font-body-lh-md);letter-spacing:var(--fds-font-body-ls-md);color:var(--fds-colour-text-subtler);}
7
7
  .djmu0xz{color:var(--fds-colour-text-subtler);}
8
- .l12vx512{list-style-type:none;}
8
+ .l12vx512{list-style-type:none;}}
@@ -1,2 +1,2 @@
1
- "use strict";require("./file-list-card.styles_oom8ii.css");exports.actionContainer="a1xq0zd",exports.box="b7grm6i",exports.boxError="b1ryf4f4",exports.contentSection="casceiz",exports.contentSectionHasThumbnail="c83cih3",exports.desktopErrorMessage="dga23xt",exports.errorIcon="e4y82lx",exports.extendedNameSection="ethi1vt",exports.fileSizeSection="ff8ofzq",exports.iconButton="i18nltf5",exports.item="ifkrwze",exports.itemNameText="iytzo9z",exports.mobileErrorMessage="m1qdniby",exports.nameSection="n13wqyhg",exports.thumbnail="t4orgj8",exports.thumbnailContainer="tmpqdeo";
1
+ "use strict";require("./file-list-card.styles_18j2gut.css");exports.actionContainer="a1xq0zd",exports.box="b7grm6i",exports.boxError="b1ryf4f4",exports.contentSection="casceiz",exports.contentSectionHasThumbnail="c83cih3",exports.desktopErrorMessage="dga23xt",exports.errorIcon="e4y82lx",exports.extendedNameSection="ethi1vt",exports.fileSizeSection="ff8ofzq",exports.iconButton="i18nltf5",exports.item="ifkrwze",exports.itemNameText="iytzo9z",exports.mobileErrorMessage="m1qdniby",exports.nameSection="n13wqyhg",exports.thumbnail="t4orgj8",exports.thumbnailContainer="tmpqdeo";
2
2
  //# sourceMappingURL=file-list-card.styles.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-list-card.styles.js","sources":["../../../../src/file-download/file-list-card/file-list-card.styles.ts"],"sourcesContent":["import { css } from \"@linaria/core\";\n\nimport { lineClampCss } from \"../../shared/styles\";\nimport { Border, Colour, Font, MediaQuery, Radius, Spacing } from \"../../theme\";\n\n// =============================================================================\n// STYLING\n// =============================================================================\nexport const item = css`\n display: flex;\n align-items: center;\n\n width: 100%;\n border: none;\n\n &:not(:last-child) {\n margin-bottom: ${Spacing[\"spacing-16\"]};\n }\n`;\n\nexport const box = css`\n display: flex;\n align-items: center;\n\n width: 100%;\n padding: ${Spacing[\"spacing-16\"]} ${Spacing[\"spacing-32\"]};\n cursor: pointer;\n\n background: ${Colour[\"bg-primary-subtlest\"]};\n border: ${Border[\"width-010\"]} ${Border[\"solid\"]} ${Colour[\"border\"]};\n border-radius: ${Radius[\"sm\"]};\n\n ${MediaQuery.MaxWidth.lg} {\n padding: ${Spacing[\"spacing-16\"]};\n }\n\n &:hover {\n background: ${Colour[\"bg-hover\"]};\n }\n`;\n\nexport const boxError = css`\n background: ${Colour[\"bg-error\"]};\n border-color: ${Colour[\"border-error\"]};\n\n &:hover {\n background: ${Colour[\"bg-error\"]};\n }\n`;\n\nexport const contentSection = css`\n display: flex;\n flex: 1;\n align-items: center;\n\n ${MediaQuery.MaxWidth.lg} {\n flex-direction: column;\n align-items: flex-start;\n width: 100%;\n }\n`;\n\nexport const contentSectionHasThumbnail = css`\n ${MediaQuery.MaxWidth.lg} {\n flex-direction: row;\n align-items: center;\n }\n`;\n\nexport const nameSection = css`\n display: flex;\n flex: 1;\n flex-direction: column;\n\n width: 100%;\n\n overflow-wrap: break-word;\n word-break: break-all;\n white-space: normal;\n`;\n\nexport const extendedNameSection = css`\n display: flex;\n flex: 1;\n align-items: center;\n\n ${MediaQuery.MaxWidth.lg} {\n flex-direction: column;\n align-items: flex-start;\n width: 100%;\n }\n`;\n\nexport const fileSizeSection = css`\n display: flex;\n justify-content: flex-end;\n\n width: 5rem;\n margin-left: ${Spacing[\"spacing-8\"]};\n\n ${Font[\"body-md-regular\"]}\n color: ${Colour[\"text\"]};\n\n ${MediaQuery.MaxWidth.lg} {\n justify-content: flex-start;\n\n width: 100%;\n margin-left: 0;\n margin-top: ${Spacing[\"spacing-8\"]};\n\n ${lineClampCss(2)}\n }\n`;\n\nexport const itemNameText = css`\n ${Font[\"body-md-regular\"]}\n color: ${Colour[\"text\"]};\n\n ${MediaQuery.MaxWidth.lg} {\n ${lineClampCss(2)}\n }\n`;\n\nexport const errorIcon = css`\n height: 1lh;\n width: 1em;\n flex-shrink: 0;\n color: ${Colour[\"icon-error-strong\"]};\n`;\n\nconst baseErrorMessage = `\n ${Font[\"body-sm-semibold\"]}\n color: ${Colour[\"text-error\"]};\n`;\n\nexport const desktopErrorMessage = css`\n ${baseErrorMessage}\n margin-top: ${Spacing[\"spacing-4\"]};\n display: flex;\n gap: ${Spacing[\"spacing-4\"]};\n\n ${MediaQuery.MaxWidth.lg} {\n display: none;\n visibility: hidden;\n }\n`;\n\nexport const mobileErrorMessage = css`\n ${baseErrorMessage}\n display: none;\n visibility: hidden;\n\n ${MediaQuery.MaxWidth.lg} {\n display: flex;\n gap: ${Spacing[\"spacing-4\"]};\n visibility: visible;\n margin-top: ${Spacing[\"spacing-8\"]};\n }\n`;\n\nexport const actionContainer = css`\n display: flex;\n justify-content: flex-end;\n align-items: center;\n\n margin-left: ${Spacing[\"spacing-32\"]};\n\n ${MediaQuery.MaxWidth.lg} {\n margin-left: ${Spacing[\"spacing-16\"]};\n }\n`;\n\nexport const iconButton = css`\n min-width: unset;\n\n &:not(:last-child) {\n margin-right: ${Spacing[\"spacing-16\"]};\n }\n`;\n\nexport const thumbnailContainer = css`\n width: auto;\n margin-right: ${Spacing[\"spacing-32\"]};\n\n display: flex;\n flex-shrink: 0;\n flex-direction: column;\n justify-content: center;\n\n ${MediaQuery.MaxWidth.lg} {\n margin-right: ${Spacing[\"spacing-16\"]};\n }\n`;\n\nexport const thumbnail = css`\n border-radius: ${Radius[\"sm\"]};\n border: ${Border[\"width-010\"]} ${Border[\"solid\"]} ${Colour[\"border\"]};\n\n width: 96px;\n height: 96px;\n aspect-ratio: 1;\n object-fit: cover;\n\n ${MediaQuery.MaxWidth.lg} {\n width: 64px;\n height: 64px;\n }\n`;\n"],"names":[],"mappings":"+HAgK4B,sBA5IZ,2BAqBK,kCASM,6CAYY,sCAyEP,4BAZV,sCA1CU,kCAYJ,6BA+EL,wBApKN,+BA0GQ,qCAiCM,+BA9EP,6BA6HF,qCAdS"}
1
+ {"version":3,"file":"file-list-card.styles.js","sources":["../../../../src/file-download/file-list-card/file-list-card.styles.ts"],"sourcesContent":["import { css } from \"@linaria/core\";\n\nimport { lineClampCss } from \"../../shared/styles\";\nimport { Border, Colour, Font, MediaQuery, Radius, Spacing } from \"../../theme\";\n\n// =============================================================================\n// STYLING\n// =============================================================================\nexport const item = css`\n display: flex;\n align-items: center;\n\n width: 100%;\n border: none;\n\n &:not(:last-child) {\n margin-bottom: ${Spacing[\"spacing-16\"]};\n }\n`;\n\nexport const box = css`\n display: flex;\n align-items: center;\n\n width: 100%;\n padding: ${Spacing[\"spacing-16\"]} ${Spacing[\"spacing-32\"]};\n cursor: pointer;\n\n background: ${Colour[\"bg-primary-subtlest\"]};\n border: ${Border[\"width-010\"]} ${Border[\"solid\"]} ${Colour[\"border\"]};\n border-radius: ${Radius[\"sm\"]};\n\n ${MediaQuery.MaxWidth.lg} {\n padding: ${Spacing[\"spacing-16\"]};\n }\n\n &:hover {\n background: ${Colour[\"bg-hover\"]};\n }\n`;\n\nexport const boxError = css`\n background: ${Colour[\"bg-error\"]};\n border-color: ${Colour[\"border-error\"]};\n\n &:hover {\n background: ${Colour[\"bg-error\"]};\n }\n`;\n\nexport const contentSection = css`\n display: flex;\n flex: 1;\n align-items: center;\n\n ${MediaQuery.MaxWidth.lg} {\n flex-direction: column;\n align-items: flex-start;\n width: 100%;\n }\n`;\n\nexport const contentSectionHasThumbnail = css`\n ${MediaQuery.MaxWidth.lg} {\n flex-direction: row;\n align-items: center;\n }\n`;\n\nexport const nameSection = css`\n display: flex;\n flex: 1;\n flex-direction: column;\n\n width: 100%;\n\n overflow-wrap: break-word;\n word-break: break-all;\n white-space: normal;\n`;\n\nexport const extendedNameSection = css`\n display: flex;\n flex: 1;\n align-items: center;\n\n ${MediaQuery.MaxWidth.lg} {\n flex-direction: column;\n align-items: flex-start;\n width: 100%;\n }\n`;\n\nexport const fileSizeSection = css`\n display: flex;\n justify-content: flex-end;\n\n width: 5rem;\n margin-left: ${Spacing[\"spacing-8\"]};\n\n ${Font[\"body-md-regular\"]}\n color: ${Colour[\"text\"]};\n\n ${MediaQuery.MaxWidth.lg} {\n justify-content: flex-start;\n\n width: 100%;\n margin-left: 0;\n margin-top: ${Spacing[\"spacing-8\"]};\n\n ${lineClampCss(2)}\n }\n`;\n\nexport const itemNameText = css`\n ${Font[\"body-md-regular\"]}\n color: ${Colour[\"text\"]};\n\n ${MediaQuery.MaxWidth.lg} {\n ${lineClampCss(2)}\n }\n`;\n\nexport const errorIcon = css`\n height: 1lh;\n width: 1em;\n flex-shrink: 0;\n color: ${Colour[\"icon-error-strong\"]};\n`;\n\nconst baseErrorMessage = `\n ${Font[\"body-sm-semibold\"]}\n color: ${Colour[\"text-error\"]};\n`;\n\nexport const desktopErrorMessage = css`\n ${baseErrorMessage}\n margin-top: ${Spacing[\"spacing-8\"]};\n display: flex;\n gap: ${Spacing[\"spacing-4\"]};\n\n ${MediaQuery.MaxWidth.lg} {\n display: none;\n visibility: hidden;\n }\n`;\n\nexport const mobileErrorMessage = css`\n ${baseErrorMessage}\n display: none;\n visibility: hidden;\n\n ${MediaQuery.MaxWidth.lg} {\n display: flex;\n gap: ${Spacing[\"spacing-4\"]};\n visibility: visible;\n margin-top: ${Spacing[\"spacing-8\"]};\n }\n`;\n\nexport const actionContainer = css`\n display: flex;\n justify-content: flex-end;\n align-items: center;\n\n margin-left: ${Spacing[\"spacing-32\"]};\n\n ${MediaQuery.MaxWidth.lg} {\n margin-left: ${Spacing[\"spacing-16\"]};\n }\n`;\n\nexport const iconButton = css`\n min-width: unset;\n\n &:not(:last-child) {\n margin-right: ${Spacing[\"spacing-16\"]};\n }\n`;\n\nexport const thumbnailContainer = css`\n width: auto;\n margin-right: ${Spacing[\"spacing-32\"]};\n\n display: flex;\n flex-shrink: 0;\n flex-direction: column;\n justify-content: center;\n\n ${MediaQuery.MaxWidth.lg} {\n margin-right: ${Spacing[\"spacing-16\"]};\n }\n`;\n\nexport const thumbnail = css`\n border-radius: ${Radius[\"sm\"]};\n border: ${Border[\"width-010\"]} ${Border[\"solid\"]} ${Colour[\"border\"]};\n\n width: 96px;\n height: 96px;\n aspect-ratio: 1;\n object-fit: cover;\n\n ${MediaQuery.MaxWidth.lg} {\n width: 64px;\n height: 64px;\n }\n`;\n"],"names":[],"mappings":"gIAgK4B,sBA5IZ,2BAqBK,kCASM,6CAYY,sCAyEP,4BAZV,sCA1CU,kCAYJ,6BA+EL,wBApKN,+BA0GQ,qCAiCM,+BA9EP,6BA6HF,qCAdS"}
@@ -1,4 +1,4 @@
1
- .ifkrwze{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;width:100%;border:none;}.ifkrwze:not(:last-child){margin-bottom:var(--fds-spacing-16);}
1
+ @layer fds{.ifkrwze{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;width:100%;border:none;}.ifkrwze:not(:last-child){margin-bottom:var(--fds-spacing-16);}
2
2
  .b7grm6i{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;width:100%;padding:var(--fds-spacing-16) var(--fds-spacing-32);cursor:pointer;background:var(--fds-colour-bg-primary-subtlest);border:var(--fds-border-width-010) var(--fds-border-style-solid) var(--fds-colour-border);border-radius:var(--fds-radius-sm);}:where(body.fds-breakpoint-lg-max) .b7grm6i{padding:var(--fds-spacing-16);}.b7grm6i:hover{background:var(--fds-colour-bg-hover);}
3
3
  .b1ryf4f4{background:var(--fds-colour-bg-error);border-color:var(--fds-colour-border-error);}.b1ryf4f4:hover{background:var(--fds-colour-bg-error);}
4
4
  .casceiz{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}:where(body.fds-breakpoint-lg-max) .casceiz{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:flex-start;-webkit-box-align:flex-start;-ms-flex-align:flex-start;align-items:flex-start;width:100%;}
@@ -8,9 +8,9 @@
8
8
  .ff8ofzq{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end;width:5rem;margin-left:var(--fds-spacing-8);font-family:var(--fds-font-family-body);font-variant:var(--fds-font-variant);font-size:var(--fds-font-body-size-md);font-weight:var(--fds-font-weight-regular);line-height:var(--fds-font-body-lh-md);letter-spacing:var(--fds-font-body-ls-md);color:var(--fds-colour-text);}:where(body.fds-breakpoint-lg-max) .ff8ofzq{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start;width:100%;margin-left:0;margin-top:var(--fds-spacing-8);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;}
9
9
  .iytzo9z{font-family:var(--fds-font-family-body);font-variant:var(--fds-font-variant);font-size:var(--fds-font-body-size-md);font-weight:var(--fds-font-weight-regular);line-height:var(--fds-font-body-lh-md);letter-spacing:var(--fds-font-body-ls-md);color:var(--fds-colour-text);}:where(body.fds-breakpoint-lg-max) .iytzo9z{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;}
10
10
  .e4y82lx{height:1lh;width:1em;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;color:var(--fds-colour-icon-error-strong);}
11
- .dga23xt{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);color:var(--fds-colour-text-error);margin-top:var(--fds-spacing-4);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:var(--fds-spacing-4);}:where(body.fds-breakpoint-lg-max) .dga23xt{display:none;visibility:hidden;}
11
+ .dga23xt{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);color:var(--fds-colour-text-error);margin-top:var(--fds-spacing-8);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:var(--fds-spacing-4);}:where(body.fds-breakpoint-lg-max) .dga23xt{display:none;visibility:hidden;}
12
12
  .m1qdniby{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);color:var(--fds-colour-text-error);display:none;visibility:hidden;}:where(body.fds-breakpoint-lg-max) .m1qdniby{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:var(--fds-spacing-4);visibility:visible;margin-top:var(--fds-spacing-8);}
13
13
  .a1xq0zd{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-left:var(--fds-spacing-32);}:where(body.fds-breakpoint-lg-max) .a1xq0zd{margin-left:var(--fds-spacing-16);}
14
14
  .i18nltf5{min-width:unset;}.i18nltf5:not(:last-child){margin-right:var(--fds-spacing-16);}
15
15
  .tmpqdeo{width:auto;margin-right:var(--fds-spacing-32);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;}:where(body.fds-breakpoint-lg-max) .tmpqdeo{margin-right:var(--fds-spacing-16);}
16
- .t4orgj8{border-radius:var(--fds-radius-sm);border:var(--fds-border-width-010) var(--fds-border-style-solid) var(--fds-colour-border);width:96px;height:96px;aspect-ratio:1;object-fit:cover;}:where(body.fds-breakpoint-lg-max) .t4orgj8{width:64px;height:64px;}
16
+ .t4orgj8{border-radius:var(--fds-radius-sm);border:var(--fds-border-width-010) var(--fds-border-style-solid) var(--fds-colour-border);width:96px;height:96px;aspect-ratio:1;object-fit:cover;}:where(body.fds-breakpoint-lg-max) .t4orgj8{width:64px;height:64px;}}
@@ -1,6 +1,6 @@
1
- .c1mdy24p{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}
1
+ @layer fds{.c1mdy24p{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}
2
2
  .c1vk9wvq{padding:var(--fds-spacing-32);}:where(body.fds-breakpoint-md-max) .c1vk9wvq{padding:var(--fds-spacing-32) var(--fds-spacing-20);}
3
3
  .h1ogyved{display:none;}
4
4
  .dtq8bte{position:absolute;top:0;left:0;width:100%;height:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}
5
5
  .ozzxgak{color:var(--fds-colour-text-primary);text-align:center;}
6
- .o1seqaul{color:var(--fds-colour-icon-primary);height:4rem;width:4rem;}
6
+ .o1seqaul{color:var(--fds-colour-icon-primary);height:4rem;width:4rem;}}
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("react/jsx-runtime"),t=require("clsx"),i=require("react"),r=require("../button/button.js"),a=require("../form/index.js"),s=require("../typography/index.js");require("../util/calendar-helper.js"),require("../external/dayjs/dayjs.min.js"),require("../util/simple-id-generator.js");var n=require("../util/string-helper.js");require("@react-aria/live-announcer");var l=require("./file-item-edit.styles.js"),u=require("./file-list-item/file-list-item-thumbnail.js"),o=require("./helper.js");function c(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var d=c(t);exports.FileItemEdit=({fileItem:t,fileDescriptionMaxLength:c,wrapperWidth:m,onSave:h,onCancel:p,onBlur:j})=>{const{id:f,name:x,size:y,type:b,truncateText:g=!0,thumbnailImageDataUrl:v}=t,[q,T]=i.useState(),[B,S]=i.useState(""),N=i.useRef(null),D=i.useRef(null),C=i.useCallback((e=>{if(!g)return e;const t=D&&D.current?D.current.getBoundingClientRect().width:0;return n.StringHelper.truncateOneLine(e,t,t/2,t/2/8,16)}),[g]);i.useEffect((()=>{T(C(x))}),[m,C,x]),i.useEffect((()=>{S(t.description||"")}),[t]);const F=!!v||b===o.FileUploadHelper.PDF_MIME_TYPE;return e.jsxs("li",{"data-testid":`${f}-edit-display`,className:l.item,children:[e.jsxs("div",{className:l.contentSection,children:[F&&e.jsx(u.FileListItemThumbnail,{thumbnailImageDataUrl:v,fileType:b}),e.jsxs("div",{className:l.detailsSection,children:[e.jsxs("div",{ref:D,className:l.nameSection,children:[e.jsx(s.Typography.BodyMD,{className:l.fileNameText,weight:"semibold",children:q}),e.jsx(s.Typography.BodyMD,{children:o.FileUploadHelper.formatFileSizeDisplay(y)})]}),e.jsx(a.Form.Textarea,{ref:N,id:`${f}-description-textarea`,"data-testid":`${f}-textarea`,value:B,maxLength:c,onChange:e=>{S(e.target.value)},onBlur:e=>{j(e.target.value)},rows:3,"aria-label":`Photo description for ${x}`,label:{children:"Photo description",subtitle:"Describe this photo to users who may not be able to see the image."}})]})]}),e.jsxs("div",{className:d.default(l.actionButtonsSection,F&&l.actionButtonsSectionWithThumbnail),children:[e.jsx(r.Button,{"data-testid":`${f}-save-button`,type:"button",sizeType:"small",disabled:0===B.trim().length,onClick:()=>{N.current&&h(N.current.value.trim())},className:l.actionButton,children:"Save"}),e.jsx(r.Button,{type:"button",sizeType:"small",styleType:"secondary","data-testid":`${f}-cancel-button`,onClick:p,className:l.actionButton,children:"Cancel"})]})]})};
1
+ "use strict";var e=require("react/jsx-runtime"),t=require("clsx"),i=require("react"),r=require("../button/button.js"),a=require("../form/index.js"),n=require("../typography/index.js");require("../util/calendar-helper.js"),require("../external/dayjs/dayjs.min.js"),require("../util/simple-id-generator.js");var s=require("../util/string-helper.js");require("@react-aria/live-announcer");var l=require("./file-item-edit.styles.js"),u=require("./file-list-item/file-list-item-thumbnail.js"),o=require("./helper.js");function c(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var d=c(t);exports.FileItemEdit=({fileItem:t,fileDescriptionMaxLength:c,descriptionRequired:m=!0,descriptionLabel:p,wrapperWidth:h,onSave:f,onCancel:j,onBlur:x})=>{const{id:y,name:b,size:g,type:v,truncateText:q=!0,thumbnailImageDataUrl:T}=t,[S,B]=i.useState(),[N,D]=i.useState(""),C=i.useRef(null),F=i.useRef(null),I=i.useCallback((e=>{if(!q)return e;const t=F&&F.current?F.current.getBoundingClientRect().width:0;return s.StringHelper.truncateOneLine(e,t,t/2,t/2/8,16)}),[q]);i.useEffect((()=>{B(I(b))}),[h,I,b]),i.useEffect((()=>{D(t.description||"")}),[t]);const w=!!T||v===o.FileUploadHelper.PDF_MIME_TYPE;return e.jsxs("li",{"data-testid":`${y}-edit-display`,className:l.item,children:[e.jsxs("div",{className:l.contentSection,children:[w&&e.jsx(u.FileListItemThumbnail,{thumbnailImageDataUrl:T,fileType:v}),e.jsxs("div",{className:l.detailsSection,children:[e.jsxs("div",{ref:F,className:l.nameSection,children:[e.jsx(n.Typography.BodyMD,{className:l.fileNameText,weight:"semibold",children:S}),e.jsx(n.Typography.BodyMD,{className:l.fileSizeText,children:o.FileUploadHelper.formatFileSizeDisplay(g)})]}),e.jsx(a.Form.Textarea,{ref:C,id:`${y}-description-textarea`,"data-testid":`${y}-textarea`,value:N,maxLength:c,onChange:e=>{D(e.target.value)},onBlur:e=>{x(e.target.value)},rows:3,label:null!=p?p:{children:"Photo description",subtitle:"Describe this photo to users who may not be able to see the image."}})]})]}),e.jsxs("div",{className:d.default(l.actionButtonsSection,w&&l.actionButtonsSectionWithThumbnail),children:[e.jsx(r.Button,{"data-testid":`${y}-save-button`,type:"button",sizeType:"small",disabled:(()=>{if(!m)return!1;return 0===N.trim().length})(),onClick:()=>{C.current&&f(C.current.value.trim())},className:l.actionButton,children:"Save"}),e.jsx(r.Button,{type:"button",sizeType:"small",styleType:"secondary","data-testid":`${y}-cancel-button`,onClick:j,className:l.actionButton,children:"Cancel"})]})]})};
2
2
  //# sourceMappingURL=file-item-edit.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-item-edit.js","sources":["../../../src/file-upload/file-item-edit.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { Button } from \"../button\";\nimport { Form } from \"../form\";\nimport { Typography } from \"../typography\";\nimport { StringHelper } from \"../util\";\nimport * as styles from \"./file-item-edit.styles\";\nimport { FileListItemThumbnail } from \"./file-list-item/file-list-item-thumbnail\";\nimport { FileUploadHelper } from \"./helper\";\nimport type { FileItemProps } from \"./types\";\n\ninterface Props {\n fileItem: FileItemProps;\n wrapperWidth: number;\n fileDescriptionMaxLength?: number | undefined;\n onSave: (description: string) => void;\n onCancel: () => void;\n onBlur: (value: string) => void;\n}\n\nexport const FileItemEdit = ({\n fileItem,\n fileDescriptionMaxLength,\n wrapperWidth,\n onSave,\n onCancel,\n onBlur,\n}: Props) => {\n // =========================================================================\n // CONST, STATE, REFS\n // =========================================================================\n const {\n id,\n name,\n size,\n type,\n truncateText = true,\n thumbnailImageDataUrl,\n } = fileItem;\n\n const [formattedName, setFormattedName] = useState<string>();\n const [currentDescription, setCurrentDescription] = useState<string>(\"\");\n\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const nameSectionRef = useRef<HTMLDivElement>(null);\n\n // =========================================================================\n // HELPER FUNCTIONS\n // =========================================================================\n const getTruncatedText = useCallback(\n (value: string) => {\n if (!truncateText) return value;\n\n const widthOfElement =\n nameSectionRef && nameSectionRef.current\n ? nameSectionRef.current.getBoundingClientRect().width\n : 0;\n\n return StringHelper.truncateOneLine(\n value,\n widthOfElement,\n widthOfElement / 2,\n widthOfElement / 2 / 8, // Arbitrary\n 16 // Font size\n );\n },\n [truncateText]\n );\n\n // =========================================================================\n // EFFECTS\n // =========================================================================\n useEffect(() => {\n setFormattedName(getTruncatedText(name));\n }, [wrapperWidth, getTruncatedText, name]);\n\n useEffect(() => {\n setCurrentDescription(fileItem.description || \"\");\n }, [fileItem]);\n\n // =========================================================================\n // EVENT HANDLERS\n // =========================================================================\n const handleSave = () => {\n if (textareaRef.current) {\n onSave(textareaRef.current.value.trim());\n }\n };\n\n const handleChange = (event: React.ChangeEvent<HTMLTextAreaElement>) => {\n setCurrentDescription(event.target.value);\n };\n\n const handleBlur = (event: React.FocusEvent<HTMLTextAreaElement>) => {\n onBlur(event.target.value);\n };\n\n const shouldDisableSave = () => {\n const trimmedDescription = currentDescription.trim();\n return trimmedDescription.length === 0;\n };\n\n const shouldShowThumbnail =\n !!thumbnailImageDataUrl || type === FileUploadHelper.PDF_MIME_TYPE;\n\n // =========================================================================\n // RENDER FUNCTIONS\n // =========================================================================\n const renderFileNameAndSize = () => (\n <div ref={nameSectionRef} className={styles.nameSection}>\n <Typography.BodyMD\n className={styles.fileNameText}\n weight=\"semibold\"\n >\n {formattedName}\n </Typography.BodyMD>\n <Typography.BodyMD>\n {FileUploadHelper.formatFileSizeDisplay(size)}\n </Typography.BodyMD>\n </div>\n );\n\n return (\n <li data-testid={`${id}-edit-display`} className={styles.item}>\n <div className={styles.contentSection}>\n {shouldShowThumbnail && (\n <FileListItemThumbnail\n thumbnailImageDataUrl={thumbnailImageDataUrl}\n fileType={type}\n />\n )}\n <div className={styles.detailsSection}>\n {renderFileNameAndSize()}\n <Form.Textarea\n ref={textareaRef}\n id={`${id}-description-textarea`}\n data-testid={`${id}-textarea`}\n value={currentDescription}\n maxLength={fileDescriptionMaxLength}\n onChange={handleChange}\n onBlur={handleBlur}\n rows={3}\n aria-label={`Photo description for ${name}`}\n label={{\n children: \"Photo description\",\n subtitle:\n \"Describe this photo to users who may not be able to see the image.\",\n }}\n />\n </div>\n </div>\n <div\n className={clsx(\n styles.actionButtonsSection,\n shouldShowThumbnail &&\n styles.actionButtonsSectionWithThumbnail\n )}\n >\n <Button\n data-testid={`${id}-save-button`}\n type=\"button\"\n sizeType=\"small\"\n disabled={shouldDisableSave()}\n onClick={handleSave}\n className={styles.actionButton}\n >\n Save\n </Button>\n <Button\n type=\"button\"\n sizeType=\"small\"\n styleType=\"secondary\"\n data-testid={`${id}-cancel-button`}\n onClick={onCancel}\n className={styles.actionButton}\n >\n Cancel\n </Button>\n </div>\n </li>\n );\n};\n"],"names":["fileItem","fileDescriptionMaxLength","wrapperWidth","onSave","onCancel","onBlur","id","name","size","type","truncateText","thumbnailImageDataUrl","formattedName","setFormattedName","useState","currentDescription","setCurrentDescription","textareaRef","useRef","nameSectionRef","getTruncatedText","useCallback","value","widthOfElement","current","getBoundingClientRect","width","StringHelper","truncateOneLine","useEffect","description","shouldShowThumbnail","FileUploadHelper","PDF_MIME_TYPE","_jsxs","className","styles.item","children","styles.contentSection","_jsx","FileListItemThumbnail","fileType","styles.detailsSection","ref","styles.nameSection","Typography","BodyMD","styles.fileNameText","weight","formatFileSizeDisplay","Form","Textarea","maxLength","onChange","event","target","rows","label","subtitle","clsx","styles.actionButtonsSection","styles.actionButtonsSectionWithThumbnail","Button","sizeType","disabled","trim","length","onClick","styles.actionButton","styleType"],"mappings":"ymBAqB4B,EACxBA,WACAC,2BACAC,eACAC,SACAC,WACAC,aAKA,MAAMC,GACFA,EAAEC,KACFA,EAAIC,KACJA,EAAIC,KACJA,EAAIC,aACJA,GAAe,EAAIC,sBACnBA,GACAX,GAEGY,EAAeC,GAAoBC,cACnCC,EAAoBC,GAAyBF,EAAAA,SAAiB,IAE/DG,EAAcC,EAAAA,OAA4B,MAC1CC,EAAiBD,EAAAA,OAAuB,MAKxCE,EAAmBC,eACpBC,IACG,IAAKZ,EAAc,OAAOY,EAE1B,MAAMC,EACFJ,GAAkBA,EAAeK,QAC3BL,EAAeK,QAAQC,wBAAwBC,MAC/C,EAEV,OAAOC,EAAAA,aAAaC,gBAChBN,EACAC,EACAA,EAAiB,EACjBA,EAAiB,EAAI,EACrB,GACH,GAEL,CAACb,IAMLmB,EAAAA,WAAU,KACNhB,EAAiBO,EAAiBb,GAAM,GACzC,CAACL,EAAckB,EAAkBb,IAEpCsB,EAAAA,WAAU,KACNb,EAAsBhB,EAAS8B,aAAe,GAAG,GAClD,CAAC9B,IAKJ,MAmBM+B,IACApB,GAAyBF,IAASuB,EAAAA,iBAAiBC,cAmBzD,OACIC,EAAAA,KAAA,KAAA,CAAA,cAAiB,GAAG5B,iBAAmB6B,UAAWC,EAAAA,KAAWC,SAAA,CACzDH,EAAAA,YAAKC,UAAWG,EAAAA,yBACXP,GACGQ,EAAAA,IAACC,EAAAA,sBAAqB,CAClB7B,sBAAuBA,EACvB8B,SAAUhC,IAGlByB,EAAAA,YAAKC,UAAWO,EAAAA,yBAtBxBR,EAAAA,KAAA,MAAA,CAAKS,IAAKxB,EAAgBgB,UAAWS,EAAAA,YAAkBP,SAAA,CACnDE,EAAAA,IAACM,EAAAA,WAAWC,OAAM,CACdX,UAAWY,EAAAA,aACXC,OAAO,WAAUX,SAEhBzB,IAEL2B,EAAAA,IAACM,EAAAA,WAAWC,OAAM,CAAAT,SACbL,EAAAA,iBAAiBiB,sBAAsBzC,QAgBpC+B,EAAAA,IAACW,EAAAA,KAAKC,UACFR,IAAK1B,EACLX,GAAI,GAAGA,yBAAyB,cACnB,GAAGA,aAChBgB,MAAOP,EACPqC,UAAWnD,EACXoD,SAlDEC,IAClBtC,EAAsBsC,EAAMC,OAAOjC,MAAM,EAkDzBjB,OA/CAiD,IAChBjD,EAAOiD,EAAMC,OAAOjC,MAAM,EA+CVkC,KAAM,EAAC,aACK,yBAAyBjD,IACrCkD,MAAO,CACHpB,SAAU,oBACVqB,SACI,8EAKpBxB,EAAAA,KAAA,MAAA,CACIC,UAAWwB,UACPC,EAAAA,qBACA7B,GACI8B,qCACPxB,SAAA,CAEDE,MAACuB,EAAAA,OAAM,CAAA,cACU,GAAGxD,gBAChBG,KAAK,SACLsD,SAAS,QACTC,SA/DyB,IADVjD,EAAmBkD,OACpBC,OAgEdC,QAhFG,KACXlD,EAAYO,SACZrB,EAAOc,EAAYO,QAAQF,MAAM2C,OACrC,EA8EY9B,UAAWiC,eAAmB/B,SAAA,SAIlCE,EAAAA,IAACuB,EAAAA,OAAM,CACHrD,KAAK,SACLsD,SAAS,QACTM,UAAU,YAAW,cACR,GAAG/D,kBAChB6D,QAAS/D,EACT+B,UAAWiC,EAAAA,aAAmB/B,SAAA,gBAKrC"}
1
+ {"version":3,"file":"file-item-edit.js","sources":["../../../src/file-upload/file-item-edit.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { Button } from \"../button\";\nimport { Form } from \"../form\";\nimport type { FormLabelProps } from \"../form/types\";\nimport { Typography } from \"../typography\";\nimport { StringHelper } from \"../util\";\nimport * as styles from \"./file-item-edit.styles\";\nimport { FileListItemThumbnail } from \"./file-list-item/file-list-item-thumbnail\";\nimport { FileUploadHelper } from \"./helper\";\nimport type { FileItemProps } from \"./types\";\n\ninterface Props {\n fileItem: FileItemProps;\n wrapperWidth: number;\n fileDescriptionMaxLength?: number | undefined;\n descriptionRequired?: boolean | undefined;\n descriptionLabel?: FormLabelProps | undefined;\n onSave: (description: string) => void;\n onCancel: () => void;\n onBlur: (value: string) => void;\n}\n\nexport const FileItemEdit = ({\n fileItem,\n fileDescriptionMaxLength,\n descriptionRequired = true,\n descriptionLabel,\n wrapperWidth,\n onSave,\n onCancel,\n onBlur,\n}: Props) => {\n // =========================================================================\n // CONST, STATE, REFS\n // =========================================================================\n const {\n id,\n name,\n size,\n type,\n truncateText = true,\n thumbnailImageDataUrl,\n } = fileItem;\n\n const [formattedName, setFormattedName] = useState<string>();\n const [currentDescription, setCurrentDescription] = useState<string>(\"\");\n\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const nameSectionRef = useRef<HTMLDivElement>(null);\n\n // =========================================================================\n // HELPER FUNCTIONS\n // =========================================================================\n const getTruncatedText = useCallback(\n (value: string) => {\n if (!truncateText) return value;\n\n const widthOfElement =\n nameSectionRef && nameSectionRef.current\n ? nameSectionRef.current.getBoundingClientRect().width\n : 0;\n\n return StringHelper.truncateOneLine(\n value,\n widthOfElement,\n widthOfElement / 2,\n widthOfElement / 2 / 8, // Arbitrary\n 16 // Font size\n );\n },\n [truncateText]\n );\n\n // =========================================================================\n // EFFECTS\n // =========================================================================\n useEffect(() => {\n setFormattedName(getTruncatedText(name));\n }, [wrapperWidth, getTruncatedText, name]);\n\n useEffect(() => {\n setCurrentDescription(fileItem.description || \"\");\n }, [fileItem]);\n\n // =========================================================================\n // EVENT HANDLERS\n // =========================================================================\n const handleSave = () => {\n if (textareaRef.current) {\n onSave(textareaRef.current.value.trim());\n }\n };\n\n const handleChange = (event: React.ChangeEvent<HTMLTextAreaElement>) => {\n setCurrentDescription(event.target.value);\n };\n\n const handleBlur = (event: React.FocusEvent<HTMLTextAreaElement>) => {\n onBlur(event.target.value);\n };\n\n const shouldDisableSave = () => {\n if (!descriptionRequired) return false;\n const trimmedDescription = currentDescription.trim();\n return trimmedDescription.length === 0;\n };\n\n const shouldShowThumbnail =\n !!thumbnailImageDataUrl || type === FileUploadHelper.PDF_MIME_TYPE;\n\n // =========================================================================\n // RENDER FUNCTIONS\n // =========================================================================\n const renderFileNameAndSize = () => (\n <div ref={nameSectionRef} className={styles.nameSection}>\n <Typography.BodyMD\n className={styles.fileNameText}\n weight=\"semibold\"\n >\n {formattedName}\n </Typography.BodyMD>\n <Typography.BodyMD className={styles.fileSizeText}>\n {FileUploadHelper.formatFileSizeDisplay(size)}\n </Typography.BodyMD>\n </div>\n );\n\n return (\n <li data-testid={`${id}-edit-display`} className={styles.item}>\n <div className={styles.contentSection}>\n {shouldShowThumbnail && (\n <FileListItemThumbnail\n thumbnailImageDataUrl={thumbnailImageDataUrl}\n fileType={type}\n />\n )}\n <div className={styles.detailsSection}>\n {renderFileNameAndSize()}\n <Form.Textarea\n ref={textareaRef}\n id={`${id}-description-textarea`}\n data-testid={`${id}-textarea`}\n value={currentDescription}\n maxLength={fileDescriptionMaxLength}\n onChange={handleChange}\n onBlur={handleBlur}\n rows={3}\n label={\n descriptionLabel ?? {\n children: \"Photo description\",\n subtitle:\n \"Describe this photo to users who may not be able to see the image.\",\n }\n }\n />\n </div>\n </div>\n <div\n className={clsx(\n styles.actionButtonsSection,\n shouldShowThumbnail &&\n styles.actionButtonsSectionWithThumbnail\n )}\n >\n <Button\n data-testid={`${id}-save-button`}\n type=\"button\"\n sizeType=\"small\"\n disabled={shouldDisableSave()}\n onClick={handleSave}\n className={styles.actionButton}\n >\n Save\n </Button>\n <Button\n type=\"button\"\n sizeType=\"small\"\n styleType=\"secondary\"\n data-testid={`${id}-cancel-button`}\n onClick={onCancel}\n className={styles.actionButton}\n >\n Cancel\n </Button>\n </div>\n </li>\n );\n};\n"],"names":["fileItem","fileDescriptionMaxLength","descriptionRequired","descriptionLabel","wrapperWidth","onSave","onCancel","onBlur","id","name","size","type","truncateText","thumbnailImageDataUrl","formattedName","setFormattedName","useState","currentDescription","setCurrentDescription","textareaRef","useRef","nameSectionRef","getTruncatedText","useCallback","value","widthOfElement","current","getBoundingClientRect","width","StringHelper","truncateOneLine","useEffect","description","shouldShowThumbnail","FileUploadHelper","PDF_MIME_TYPE","_jsxs","className","styles.item","children","styles.contentSection","_jsx","FileListItemThumbnail","fileType","styles.detailsSection","ref","styles.nameSection","Typography","BodyMD","styles.fileNameText","weight","styles.fileSizeText","formatFileSizeDisplay","Form","Textarea","maxLength","onChange","event","target","rows","label","subtitle","clsx","styles.actionButtonsSection","styles.actionButtonsSectionWithThumbnail","Button","sizeType","disabled","trim","length","shouldDisableSave","onClick","styles.actionButton","styleType"],"mappings":"ymBAwB4B,EACxBA,WACAC,2BACAC,uBAAsB,EACtBC,mBACAC,eACAC,SACAC,WACAC,aAKA,MAAMC,GACFA,EAAEC,KACFA,EAAIC,KACJA,EAAIC,KACJA,EAAIC,aACJA,GAAe,EAAIC,sBACnBA,GACAb,GAEGc,EAAeC,GAAoBC,cACnCC,EAAoBC,GAAyBF,EAAAA,SAAiB,IAE/DG,EAAcC,EAAAA,OAA4B,MAC1CC,EAAiBD,EAAAA,OAAuB,MAKxCE,EAAmBC,eACpBC,IACG,IAAKZ,EAAc,OAAOY,EAE1B,MAAMC,EACFJ,GAAkBA,EAAeK,QAC3BL,EAAeK,QAAQC,wBAAwBC,MAC/C,EAEV,OAAOC,EAAAA,aAAaC,gBAChBN,EACAC,EACAA,EAAiB,EACjBA,EAAiB,EAAI,EACrB,GACH,GAEL,CAACb,IAMLmB,EAAAA,WAAU,KACNhB,EAAiBO,EAAiBb,GAAM,GACzC,CAACL,EAAckB,EAAkBb,IAEpCsB,EAAAA,WAAU,KACNb,EAAsBlB,EAASgC,aAAe,GAAG,GAClD,CAAChC,IAKJ,MAoBMiC,IACApB,GAAyBF,IAASuB,EAAAA,iBAAiBC,cAmBzD,OACIC,EAAAA,KAAA,KAAA,CAAA,cAAiB,GAAG5B,iBAAmB6B,UAAWC,EAAAA,KAAWC,SAAA,CACzDH,EAAAA,YAAKC,UAAWG,EAAAA,yBACXP,GACGQ,EAAAA,IAACC,EAAAA,uBACG7B,sBAAuBA,EACvB8B,SAAUhC,IAGlByB,EAAAA,KAAA,MAAA,CAAKC,UAAWO,EAAAA,eAAqBL,SAAA,CAtB7CH,EAAAA,KAAA,MAAA,CAAKS,IAAKxB,EAAgBgB,UAAWS,EAAAA,YAAkBP,SAAA,CACnDE,EAAAA,IAACM,EAAAA,WAAWC,OAAM,CACdX,UAAWY,eACXC,OAAO,WAAUX,SAEhBzB,IAEL2B,EAAAA,IAACM,EAAAA,WAAWC,OAAM,CAACX,UAAWc,EAAAA,aAAmBZ,SAC5CL,EAAAA,iBAAiBkB,sBAAsB1C,QAgBpC+B,EAAAA,IAACY,EAAAA,KAAKC,SAAQ,CACVT,IAAK1B,EACLX,GAAI,GAAGA,yBAAyB,cACnB,GAAGA,aAChBgB,MAAOP,EACPsC,UAAWtD,EACXuD,SAnDEC,IAClBvC,EAAsBuC,EAAMC,OAAOlC,MAAM,EAmDzBjB,OAhDAkD,IAChBlD,EAAOkD,EAAMC,OAAOlC,MAAM,EAgDVmC,KAAM,EACNC,MACIzD,QAAAA,EAAoB,CAChBoC,SAAU,oBACVsB,SACI,8EAMxBzB,EAAAA,KAAA,MAAA,CACIC,UAAWyB,UACPC,EAAAA,qBACA9B,GACI+B,qCACPzB,SAAA,CAEDE,MAACwB,EAAAA,OAAM,CAAA,cACU,GAAGzD,gBAChBG,KAAK,SACLuD,SAAS,QACTC,SAnEU,MACtB,IAAKjE,EAAqB,OAAO,EAEjC,OAAqC,IADVe,EAAmBmD,OACpBC,MAAY,EAgEhBC,GACVC,QAlFG,KACXpD,EAAYO,SACZrB,EAAOc,EAAYO,QAAQF,MAAM4C,OACrC,EAgFY/B,UAAWmC,eAAmBjC,SAAA,SAIlCE,EAAAA,IAACwB,EAAAA,OAAM,CACHtD,KAAK,SACLuD,SAAS,QACTO,UAAU,YAAW,cACR,GAAGjE,kBAChB+D,QAASjE,EACT+B,UAAWmC,EAAAA,aAAmBjC,SAAA,gBAKrC"}
@@ -1,2 +1,2 @@
1
- "use strict";require("./file-item-edit.styles_1qbpbxj.css");exports.actionButton="awg16zc",exports.actionButtonsSection="a18dc1yj",exports.actionButtonsSectionWithThumbnail="ajknckh",exports.contentSection="c1i0crev",exports.detailsSection="d4rbbwx",exports.fileNameText="fuau9z6",exports.item="i1432lvs",exports.nameSection="n18lt6ho";
1
+ "use strict";require("./file-item-edit.styles_19bvztn.css");exports.actionButton="aigdfjq",exports.actionButtonsSection="ajknckh",exports.actionButtonsSectionWithThumbnail="awg16zc",exports.contentSection="c1i0crev",exports.detailsSection="d4rbbwx",exports.fileNameText="fuau9z6",exports.fileSizeText="f18dc1yj",exports.item="i1432lvs",exports.nameSection="n18lt6ho";
2
2
  //# sourceMappingURL=file-item-edit.styles.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-item-edit.styles.js","sources":["../../../src/file-upload/file-item-edit.styles.ts"],"sourcesContent":["import { css } from \"@linaria/core\";\n\nimport { Border, Colour, MediaQuery, Spacing } from \"../theme\";\n\nexport const item = css`\n display: flex;\n flex-direction: column;\n padding: ${Spacing[\"spacing-32\"]} 0;\n background: transparent;\n\n &:not(:last-child) {\n border-bottom: ${Border[\"width-010\"]} ${Border.solid} ${Colour.border};\n }\n`;\n\nexport const contentSection = css`\n display: flex;\n align-items: flex-start;\n margin-bottom: ${Spacing[\"spacing-16\"]};\n width: 100%;\n`;\n\nexport const detailsSection = css`\n display: flex;\n flex: 1;\n flex-direction: column;\n`;\n\nexport const nameSection = css`\n width: 100%;\n display: flex;\n justify-content: space-between;\n margin-bottom: ${Spacing[\"spacing-16\"]};\n\n ${MediaQuery.MaxWidth.md} {\n flex-direction: column;\n justify-content: flex-start;\n }\n`;\n\nexport const fileNameText = css`\n display: flex;\n flex: 1;\n margin-right: ${Spacing[\"spacing-16\"]};\n\n ${MediaQuery.MaxWidth.md} {\n margin-right: 0;\n margin-bottom: ${Spacing[\"spacing-8\"]};\n }\n`;\n\nexport const actionButtonsSection = css`\n display: flex;\n\n ${MediaQuery.MaxWidth.md} {\n flex-direction: column;\n }\n`;\n\nexport const actionButtonsSectionWithThumbnail = css`\n margin-left: calc(\n 96px + ${Spacing[\"spacing-32\"]}\n ); // thumbnail width + right margin\n\n ${MediaQuery.MaxWidth.md} {\n margin-left: 0;\n }\n`;\n\nexport const actionButton = css`\n width: 7.5rem;\n\n &:not(:last-of-type) {\n margin-right: ${Spacing[\"spacing-16\"]};\n }\n\n ${MediaQuery.MaxWidth.md} {\n width: 100%;\n\n &:not(:last-of-type) {\n margin-bottom: ${Spacing[\"spacing-16\"]};\n }\n }\n`;\n"],"names":[],"mappings":"4GAqEyB,uCAlBQ,qDAQa,iCA5CnB,kCAOA,+BAkBF,uBApCR,+BAwBO"}
1
+ {"version":3,"file":"file-item-edit.styles.js","sources":["../../../src/file-upload/file-item-edit.styles.ts"],"sourcesContent":["import { css } from \"@linaria/core\";\n\nimport { Border, Colour, MediaQuery, Radius, Spacing } from \"../theme\";\n\nexport const item = css`\n display: flex;\n flex-direction: column;\n padding: ${Spacing[\"spacing-32\"]};\n background: ${Colour[\"bg-primary-subtlest\"]};\n border: ${Border[\"width-010\"]} ${Border.solid} ${Colour.border};\n border-radius: ${Radius[\"sm\"]};\n\n &:not(:last-child) {\n margin-bottom: ${Spacing[\"spacing-16\"]};\n }\n`;\n\nexport const contentSection = css`\n display: flex;\n align-items: flex-start;\n margin-bottom: ${Spacing[\"spacing-16\"]};\n width: 100%;\n`;\n\nexport const detailsSection = css`\n display: flex;\n flex: 1;\n flex-direction: column;\n`;\n\nexport const nameSection = css`\n width: 100%;\n display: flex;\n justify-content: space-between;\n margin-bottom: ${Spacing[\"spacing-16\"]};\n\n ${MediaQuery.MaxWidth.md} {\n flex-direction: column;\n justify-content: flex-start;\n }\n`;\n\nexport const fileNameText = css`\n display: flex;\n flex: 1;\n margin-right: ${Spacing[\"spacing-16\"]};\n\n ${MediaQuery.MaxWidth.md} {\n margin-right: 0;\n margin-bottom: ${Spacing[\"spacing-8\"]};\n }\n`;\n\nexport const fileSizeText = css`\n color: ${Colour[\"text-subtler\"]};\n`;\n\nexport const actionButtonsSection = css`\n display: flex;\n justify-content: flex-end;\n\n ${MediaQuery.MaxWidth.md} {\n flex-direction: column;\n }\n`;\n\nexport const actionButtonsSectionWithThumbnail = css`\n margin-left: calc(\n 96px + ${Spacing[\"spacing-32\"]}\n ); // thumbnail width + right margin\n\n ${MediaQuery.MaxWidth.md} {\n margin-left: 0;\n }\n`;\n\nexport const actionButton = css`\n width: 7.5rem;\n\n &:not(:last-of-type) {\n margin-right: ${Spacing[\"spacing-16\"]};\n }\n\n ${MediaQuery.MaxWidth.md} {\n width: 100%;\n\n &:not(:last-of-type) {\n margin-bottom: ${Spacing[\"spacing-16\"]};\n }\n }\n`;\n"],"names":[],"mappings":"4GA4EyB,uCAnBQ,oDASa,iCAjDnB,kCAOA,+BAkBF,+BAWA,wBAjDR,+BA0BO"}
@@ -1,10 +1,11 @@
1
- .i1432lvs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding:var(--fds-spacing-32) 0;background:transparent;}.i1432lvs:not(:last-child){border-bottom:var(--fds-border-width-010) var(--fds-border-style-solid) var(--fds-colour-border);}
1
+ @layer fds{.i1432lvs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding:var(--fds-spacing-32);background:var(--fds-colour-bg-primary-subtlest);border:var(--fds-border-width-010) var(--fds-border-style-solid) var(--fds-colour-border);border-radius:var(--fds-radius-sm);}.i1432lvs:not(:last-child){margin-bottom:var(--fds-spacing-16);}
2
2
  .c1i0crev{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:flex-start;-webkit-box-align:flex-start;-ms-flex-align:flex-start;align-items:flex-start;margin-bottom:var(--fds-spacing-16);width:100%;}
3
3
  .d4rbbwx{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}
4
4
  .n18lt6ho{width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:space-between;-webkit-justify-content:space-between;justify-content:space-between;margin-bottom:var(--fds-spacing-16);}:where(body.fds-breakpoint-md-max) .n18lt6ho{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start;}
5
5
  .fuau9z6{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:var(--fds-spacing-16);}:where(body.fds-breakpoint-md-max) .fuau9z6{margin-right:0;margin-bottom:var(--fds-spacing-8);}
6
- .a18dc1yj{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}:where(body.fds-breakpoint-md-max) .a18dc1yj{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}
7
- .ajknckh{margin-left:calc(
6
+ .f18dc1yj{color:var(--fds-colour-text-subtler);}
7
+ .ajknckh{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end;}:where(body.fds-breakpoint-md-max) .ajknckh{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}
8
+ .awg16zc{margin-left:calc(
8
9
  96px + var(--fds-spacing-32)
9
- );}:where(body.fds-breakpoint-md-max) .ajknckh{margin-left:0;}
10
- .awg16zc{width:7.5rem;}.awg16zc:not(:last-of-type){margin-right:var(--fds-spacing-16);}:where(body.fds-breakpoint-md-max) .awg16zc{width:100%;}:where(body.fds-breakpoint-md-max) .awg16zc:not(:last-of-type){margin-bottom:var(--fds-spacing-16);}
10
+ );}:where(body.fds-breakpoint-md-max) .awg16zc{margin-left:0;}
11
+ .aigdfjq{width:7.5rem;}.aigdfjq:not(:last-of-type){margin-right:var(--fds-spacing-16);}:where(body.fds-breakpoint-md-max) .aigdfjq{width:100%;}:where(body.fds-breakpoint-md-max) .aigdfjq:not(:last-of-type){margin-bottom:var(--fds-spacing-16);}}
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("react/jsx-runtime"),r=require("../../external/@dnd-kit/core/dist/core.esm.js"),t=require("../../external/@dnd-kit/sortable/dist/sortable.esm.js"),s=require("clsx"),i=require("react"),n=require("../../external/react-resize-detector/build/index.esm.js"),o=require("../../shared/accessibility/index.js"),l=require("../context.js"),a=require("../custom-sensors.js"),d=require("../file-item-edit.js"),u=require("../file-list-item/file-list-item.js"),c=require("../helper.js"),p=require("./file-list.styles.js");function f(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var g=f(s);const m=i.forwardRef((function({fileItems:s=[],editableFileItems:f,fileDescriptionMaxLength:m,sortable:h,disabled:j,readOnly:y,onItemUpdate:b,onItemDelete:v,onSort:x},S){const[I,q]=i.useState({}),{setActiveId:$}=i.useContext(l.FileUploadContext),[M,O]=i.useState(""),C=i.useRef({});i.useImperativeHandle(S,(()=>({focus:()=>{var e;null===(e=F.current)||void 0===e||e.focus()}})));const{width:D=0,ref:F}=n.useResizeDetector(),E=i.useRef({}),w=r.useSensors(r.useSensor(a.MouseSensor,{activationConstraint:{distance:8}}),r.useSensor(r.TouchSensor,{activationConstraint:{delay:150,tolerance:5}}),r.useSensor(r.KeyboardSensor,{coordinateGetter:t.sortableKeyboardCoordinates})),R=e=>{delete E.current[e]};i.useEffect((()=>{const e=K(s);((e,r)=>{const t=Object.keys(e),s=Object.keys(r);if(t.length!==s.length)return!1;for(const t of s)if(e[t]!==r[t])return!1;return!0})(I,e)||q(e)}),[s,f,y]),i.useEffect((()=>{var e;if(!s||0===s.length)return void O("");const r=Date.now(),t=[];for(const i of s){const s=C.current[i.id];if(i.errorMessage)"error"!==(null==s?void 0:s.status)&&(t.push("string"==typeof i.errorMessage?`Error uploading ${i.name}: ${i.errorMessage}`:`Error uploading ${i.name}`),C.current[i.id]={progress:null!==(e=i.progress)&&void 0!==e?e:1,timestamp:r,status:"error"});else if(void 0!==i.progress)if(i.progress>=1)"complete"!==(null==s?void 0:s.status)&&(t.push(`${i.name} upload is complete`),C.current[i.id]={progress:1,timestamp:r,status:"complete"});else if("number"==typeof i.progress&&i.progress<1){(!s||"in-progress"!==s.status)&&(t.push(`Starting upload of ${i.name}`),C.current[i.id]={progress:i.progress,timestamp:r,status:"in-progress"})}}t.length>0&&O(t.join(", "))}),[s]);const k=e=>r=>{T(e.id,"display"),R(e.id);const t=Object.assign(Object.assign({},e),{description:r});b(t)},A=e=>r=>{E.current[e.id]=r},L=e=>()=>{e.description&&0!==e.description.length?T(e.id,"display"):v(e),R(e.id)},W=e=>()=>{T(e.id,"edit")},H=e=>()=>{v(e),F.current&&F.current.focus()},N=e=>{if(x&&s){const{active:r,over:i}=e;if(i&&r.id!==i.id){const e=s.findIndex((e=>e.id===r.id)),n=s.findIndex((e=>e.id===i.id)),o=t.arrayMove(s,e,n);x(o)}}$(void 0)},U=e=>{const{active:r}=e;$(r.id)},z=e=>f&&c.FileUploadHelper.isSupportedImageType(e.type),B=e=>!e.errorMessage&&!y&&!("number"==typeof e.progress&&e.progress<1)&&z(e)&&!e.description,K=e=>{if(!e||0===e.length)return{};const r={};for(const t of e)t.errorMessage?r[t.id]="error":I[t.id]?r[t.id]=I[t.id]:r[t.id]=B(t)?"edit":"display";return r},T=(e,r)=>{q((t=>Object.assign(Object.assign({},t),{[e]:r})))},G=()=>s&&s.length>1&&h&&Object.values(I).every((e=>"display"===e)),V=()=>{if(0===s.length)return"No files uploaded";const e=s.filter((e=>!(null==e?void 0:e.errorMessage)&&(1===e.progress||void 0===e.progress))).length,r=s.filter((e=>"number"==typeof e.progress&&e.progress<1)).length,t=s.filter((e=>e.errorMessage)).length;if(0===e&&0===r&&0===t)return"File list";const i=[e>0?`${e} completed files`:"",r>0?`${r} file in progress`:"",t>0?`${t} ${t>1?"files":"file"} with error`:""].filter(Boolean);return`${y?"Read-only file list":"File list"}. ${i.join(", ")}`},J=()=>{const r=((e,r)=>{if(!e||0===e.length)return[];const t=[];for(const s of e)if("edit"===r[s.id]){const e=t[t.length-1];Array.isArray(e)?e.push(s):t.push([s])}else t.push(s);return t})(s,I);return 0===r.length?null:r.map(((r,t)=>Array.isArray(r)?((r,t)=>{const s=r.map((r=>{const t=Object.assign({},r);return void 0!==E.current[r.id]&&(t.description=E.current[r.id]),e.jsx(d.FileItemEdit,{fileItem:t,wrapperWidth:D,fileDescriptionMaxLength:m,onSave:k(r),onCancel:L(r),onBlur:A(r)},r.id)}));return e.jsx("li",{className:p.editableItemsContainer,children:e.jsx("ul",{children:s})},`editable-${t}`)})(r,t):e.jsx(u.FileListItem,{fileItem:r,editable:z(r),wrapperWidth:D,sortable:G(),disabled:j,readOnly:y,onDelete:H(r),onEditClick:W(r)},r.id)))},P=()=>e.jsxs(e.Fragment,{children:[e.jsx(o.VisuallyHidden,{"aria-live":"polite","aria-atomic":"true",children:M}),e.jsx("ul",{tabIndex:-1,className:g.default(p.listWrapper,y&&p.listWrapperReadOnly),ref:F,"aria-label":V(),children:J()})]});return j||y||!G()?P():e.jsx(r.DndContext,{sensors:w,onDragEnd:N,onDragStart:U,children:e.jsx(t.SortableContext,{items:s,strategy:t.verticalListSortingStrategy,children:P()})})}));exports.FileList=m;
1
+ "use strict";var e=require("react/jsx-runtime"),r=require("../../external/@dnd-kit/core/dist/core.esm.js"),t=require("../../external/@dnd-kit/sortable/dist/sortable.esm.js"),s=require("clsx"),i=require("react"),n=require("../../external/react-resize-detector/build/index.esm.js"),o=require("../../shared/accessibility/index.js"),l=require("../context.js"),a=require("../custom-sensors.js"),d=require("../file-item-edit.js"),c=require("../file-list-item/file-list-item.js"),u=require("../helper.js"),p=require("./file-list.styles.js");function f(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var g=f(s);const m=i.forwardRef((function({fileItems:s=[],editableFileItems:f,fileDescriptionMaxLength:m,descriptionRequired:h,descriptionLabel:b,sortable:j,disabled:y,readOnly:v,onItemUpdate:x,onItemDelete:S,onSort:q},I){const[$,M]=i.useState({}),{setActiveId:O}=i.useContext(l.FileUploadContext),[C,D]=i.useState(""),F=i.useRef({});i.useImperativeHandle(I,(()=>({focus:()=>{var e;null===(e=R.current)||void 0===e||e.focus()}})));const{width:L=0,ref:R}=n.useResizeDetector(),E=i.useRef({}),w=r.useSensors(r.useSensor(a.MouseSensor,{activationConstraint:{distance:8}}),r.useSensor(r.TouchSensor,{activationConstraint:{delay:150,tolerance:5}}),r.useSensor(r.KeyboardSensor,{coordinateGetter:t.sortableKeyboardCoordinates})),k=e=>{delete E.current[e]};i.useEffect((()=>{const e=G(s);((e,r)=>{const t=Object.keys(e),s=Object.keys(r);if(t.length!==s.length)return!1;for(const t of s)if(e[t]!==r[t])return!1;return!0})($,e)||M(e)}),[s,f,v]),i.useEffect((()=>{var e;if(!s||0===s.length)return void D("");const r=Date.now(),t=[];for(const i of s){const s=F.current[i.id];if(i.errorMessage)"error"!==(null==s?void 0:s.status)&&(t.push("string"==typeof i.errorMessage?`Error uploading ${i.name}: ${i.errorMessage}`:`Error uploading ${i.name}`),F.current[i.id]={progress:null!==(e=i.progress)&&void 0!==e?e:1,timestamp:r,status:"error"});else if(void 0!==i.progress)if(i.progress>=1)"complete"!==(null==s?void 0:s.status)&&(t.push(`${i.name} upload is complete`),F.current[i.id]={progress:1,timestamp:r,status:"complete"});else if("number"==typeof i.progress&&i.progress<1){(!s||"in-progress"!==s.status)&&(t.push(`Starting upload of ${i.name}`),F.current[i.id]={progress:i.progress,timestamp:r,status:"in-progress"})}}t.length>0&&D(t.join(", "))}),[s]);const A=e=>r=>{V(e.id,"display"),k(e.id);const t=Object.assign(Object.assign({},e),{description:r});x(t)},W=e=>r=>{E.current[e.id]=r},H=e=>()=>{e.description&&0!==e.description.length?V(e.id,"display"):S(e),k(e.id)},N=e=>()=>{V(e.id,"edit")},U=e=>()=>{S(e),R.current&&R.current.focus()},z=e=>{if(q&&s){const{active:r,over:i}=e;if(i&&r.id!==i.id){const e=s.findIndex((e=>e.id===r.id)),n=s.findIndex((e=>e.id===i.id)),o=t.arrayMove(s,e,n);q(o)}}O(void 0)},B=e=>{const{active:r}=e;O(r.id)},K=e=>f&&u.FileUploadHelper.isSupportedImageType(e.type),T=e=>!e.errorMessage&&!v&&!("number"==typeof e.progress&&e.progress<1)&&K(e)&&!e.description,G=e=>{if(!e||0===e.length)return{};const r={};for(const t of e)t.errorMessage?r[t.id]="error":$[t.id]?r[t.id]=$[t.id]:r[t.id]=T(t)?"edit":"display";return r},V=(e,r)=>{M((t=>Object.assign(Object.assign({},t),{[e]:r})))},J=()=>s&&s.length>1&&j&&Object.values($).every((e=>"display"===e)),P=()=>{if(0===s.length)return"No files uploaded";const e=s.filter((e=>!(null==e?void 0:e.errorMessage)&&(1===e.progress||void 0===e.progress))).length,r=s.filter((e=>"number"==typeof e.progress&&e.progress<1)).length,t=s.filter((e=>e.errorMessage)).length;if(0===e&&0===r&&0===t)return"File list";const i=[e>0?`${e} completed files`:"",r>0?`${r} file in progress`:"",t>0?`${t} ${t>1?"files":"file"} with error`:""].filter(Boolean);return`${v?"Read-only file list":"File list"}. ${i.join(", ")}`},Q=()=>{const r=((e,r)=>{if(!e||0===e.length)return[];const t=[];for(const s of e)if("edit"===r[s.id]){const e=t[t.length-1];Array.isArray(e)?e.push(s):t.push([s])}else t.push(s);return t})(s,$);return 0===r.length?null:r.map(((r,t)=>Array.isArray(r)?((r,t)=>{const s=r.map((r=>{const t=Object.assign({},r);return void 0!==E.current[r.id]&&(t.description=E.current[r.id]),e.jsx(d.FileItemEdit,{fileItem:t,wrapperWidth:L,fileDescriptionMaxLength:m,descriptionRequired:h,descriptionLabel:b,onSave:A(r),onCancel:H(r),onBlur:W(r)},r.id)}));return e.jsx("li",{className:p.editableItemsContainer,children:e.jsx("ul",{children:s})},`editable-${t}`)})(r,t):e.jsx(c.FileListItem,{fileItem:r,editable:K(r),wrapperWidth:L,sortable:J(),disabled:y,readOnly:v,descriptionLabel:b,onDelete:U(r),onEditClick:N(r)},r.id)))},X=()=>e.jsxs(e.Fragment,{children:[e.jsx(o.VisuallyHidden,{"aria-live":"polite","aria-atomic":"true",children:C}),e.jsx("ul",{tabIndex:-1,className:g.default(p.listWrapper,v&&p.listWrapperReadOnly),ref:R,"aria-label":P(),children:Q()})]});return y||v||!J()?X():e.jsx(r.DndContext,{sensors:w,onDragEnd:z,onDragStart:B,children:e.jsx(t.SortableContext,{items:s,strategy:t.verticalListSortingStrategy,children:X()})})}));exports.FileList=m;
2
2
  //# sourceMappingURL=file-list.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-list.js","sources":["../../../../src/file-upload/file-list/file-list.tsx"],"sourcesContent":["import type { DragEndEvent, DragStartEvent } from \"@dnd-kit/core\";\nimport {\n DndContext,\n KeyboardSensor,\n TouchSensor,\n useSensor,\n useSensors,\n} from \"@dnd-kit/core\";\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n verticalListSortingStrategy,\n} from \"@dnd-kit/sortable\";\nimport clsx from \"clsx\";\nimport type React from \"react\";\nimport {\n forwardRef,\n useContext,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from \"react\";\nimport { useResizeDetector } from \"react-resize-detector\";\n\nimport { VisuallyHidden } from \"../../shared/accessibility\";\nimport { FileUploadContext } from \"../context\";\nimport { MouseSensor } from \"../custom-sensors\";\nimport { FileItemEdit } from \"../file-item-edit\";\nimport { FileListItem } from \"../file-list-item\";\nimport { FileUploadHelper } from \"../helper\";\nimport type { FileItemProps } from \"../types\";\nimport * as styles from \"./file-list.styles\";\n\n// =============================================================================\n// INTERFACES\n// =============================================================================\ntype RenderMode = \"edit\" | \"display\" | \"error\";\n\ntype FileItemRenderModes = Record<string, RenderMode>;\ntype FileEditedDescriptions = Record<string, string>;\n\ntype RenderItem = FileItemProps | FileItemProps[];\n\ninterface Props {\n fileItems: FileItemProps[] | undefined;\n editableFileItems: boolean;\n fileDescriptionMaxLength?: number | undefined;\n sortable?: boolean | undefined;\n disabled?: boolean | undefined;\n readOnly?: boolean | undefined;\n onItemUpdate: (item: FileItemProps) => void;\n onItemDelete: (item: FileItemProps) => void;\n onSort?: ((reorderedFileItems: FileItemProps[]) => void) | undefined;\n}\n\ntype AnnouncementProgress = Record<\n string,\n {\n progress: number;\n timestamp: number;\n status: \"in-progress\" | \"complete\" | \"error\";\n }\n>;\n\nexport interface FileListRef {\n focus: () => void;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\nfunction Component(\n {\n fileItems = [],\n editableFileItems,\n fileDescriptionMaxLength,\n sortable,\n disabled,\n readOnly,\n onItemUpdate,\n onItemDelete,\n onSort,\n }: Props,\n ref: React.Ref<FileListRef>\n) {\n // =========================================================================\n // CONST, STATE, REFS\n // =========================================================================\n const [renderModes, setRenderModes] = useState<FileItemRenderModes>({});\n const { setActiveId } = useContext(FileUploadContext);\n\n // Progress announcement state (for aria-live) - announces start and completion only\n const [progressAnnouncement, setProgressAnnouncement] = useState(\"\");\n const lastAnnouncedRef = useRef<AnnouncementProgress>({});\n\n useImperativeHandle(ref, () => ({\n focus: () => {\n wrapperRef.current?.focus();\n },\n }));\n const { width: wrapperWidth = 0, ref: wrapperRef } = useResizeDetector();\n\n // Keep track of edited description without re-rendering\n const descriptionsValueRef = useRef<FileEditedDescriptions>({});\n\n /**\n * As the default drag sensors interfere with click events\n * on the file items, we'll need to configure the sensor to\n * only activate the drag if the mouse moves a certain distance\n */\n const sensors = useSensors(\n useSensor(MouseSensor, {\n activationConstraint: {\n distance: 8, // mouse drag of 8px then activate the drag event\n },\n }),\n useSensor(TouchSensor, {\n activationConstraint: {\n delay: 150,\n tolerance: 5,\n },\n }),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n })\n );\n\n // =========================================================================\n // REF METHODS\n // =========================================================================\n const removeDescription = (itemId: string) => {\n delete descriptionsValueRef.current[itemId];\n };\n\n const shallowCompareRenderModes = (\n prev: FileItemRenderModes,\n next: FileItemRenderModes\n ) => {\n const prevKeys = Object.keys(prev);\n const nextKeys = Object.keys(next);\n if (prevKeys.length !== nextKeys.length) {\n return false;\n }\n for (const k of nextKeys) {\n if (prev[k] !== next[k]) {\n return false;\n }\n }\n return true;\n };\n\n // =========================================================================\n // EFFECTS\n // =========================================================================\n useEffect(() => {\n const nextModes = getItemsRenderMode(fileItems);\n const prevModes = renderModes;\n // We perform shallowCompare to avoid infinite re-render loop\n if (shallowCompareRenderModes(prevModes, nextModes)) {\n return;\n }\n setRenderModes(nextModes);\n }, [fileItems, editableFileItems, readOnly]);\n\n // Progress announcements only at start and completion\n useEffect(() => {\n if (!fileItems || fileItems.length === 0) {\n setProgressAnnouncement(\"\");\n return;\n }\n const now = Date.now();\n const messages: string[] = [];\n\n for (const item of fileItems) {\n const fileStatus = lastAnnouncedRef.current[item.id];\n\n if (item.errorMessage) {\n if (fileStatus?.status !== \"error\") {\n messages.push(\n typeof item.errorMessage === \"string\"\n ? `Error uploading ${item.name}: ${item.errorMessage}`\n : `Error uploading ${item.name}`\n );\n lastAnnouncedRef.current[item.id] = {\n progress: item.progress ?? 1,\n timestamp: now,\n status: \"error\",\n };\n }\n continue;\n }\n\n if (item.progress === undefined) {\n continue;\n }\n\n if (item.progress >= 1) {\n if (fileStatus?.status !== \"complete\") {\n messages.push(`${item.name} upload is complete`);\n lastAnnouncedRef.current[item.id] = {\n progress: 1,\n timestamp: now,\n status: \"complete\",\n };\n }\n continue;\n }\n\n // In progress - only announce start, not progress updates\n if (typeof item.progress === \"number\" && item.progress < 1) {\n // Only announce when starting upload (no previous status or status was not in-progress)\n const shouldAnnounce =\n !fileStatus || fileStatus.status !== \"in-progress\";\n\n if (shouldAnnounce) {\n messages.push(`Starting upload of ${item.name}`);\n lastAnnouncedRef.current[item.id] = {\n progress: item.progress,\n timestamp: now,\n status: \"in-progress\",\n };\n }\n }\n }\n\n if (messages.length > 0) {\n // Update aria-live region once with aggregated message\n setProgressAnnouncement(messages.join(\", \"));\n }\n }, [fileItems]);\n\n // =========================================================================\n // EVENT HANDLERS\n // =========================================================================\n const handleSaveEdit = (item: FileItemProps) => (description: string) => {\n updateRenderModes(item.id, \"display\");\n removeDescription(item.id);\n\n const updatedItem = { ...item, description };\n onItemUpdate(updatedItem);\n };\n\n const handleBlurEdit = (item: FileItemProps) => (value: string) => {\n descriptionsValueRef.current[item.id] = value;\n };\n\n const handleCancel = (item: FileItemProps) => () => {\n if (!item.description || item.description.length === 0) {\n // New addition\n onItemDelete(item);\n } else {\n updateRenderModes(item.id, \"display\");\n }\n removeDescription(item.id);\n };\n\n const handleInitiateEdit = (item: FileItemProps) => () => {\n updateRenderModes(item.id, \"edit\");\n };\n\n const handleDelete = (item: FileItemProps) => () => {\n onItemDelete(item);\n if (wrapperRef.current) {\n wrapperRef.current.focus();\n }\n };\n\n const handleDragEnd = (event: DragEndEvent) => {\n if (onSort && fileItems) {\n const { active, over } = event;\n\n if (over && active.id !== over.id) {\n const oldIndex = fileItems.findIndex(\n (item) => item.id === active.id\n );\n const newIndex = fileItems.findIndex(\n (item) => item.id === over.id\n );\n\n const updatedFileItems = arrayMove(\n fileItems,\n oldIndex,\n newIndex\n );\n\n onSort(updatedFileItems);\n }\n }\n\n setActiveId(undefined);\n };\n\n const handleDragStart = (event: DragStartEvent) => {\n const { active } = event;\n setActiveId(active.id as string);\n };\n\n // =========================================================================\n // HELPER FUNCTIONS\n // =========================================================================\n const checkEditable = (item: FileItemProps) => {\n return (\n editableFileItems &&\n FileUploadHelper.isSupportedImageType(item.type)\n );\n };\n\n const shouldRenderEditMode = (item: FileItemProps) => {\n return (\n !item.errorMessage &&\n !readOnly &&\n !(typeof item.progress === \"number\" && item.progress < 1) &&\n checkEditable(item) &&\n !item.description\n );\n };\n\n const getItemsRenderMode = (\n fileItems: FileItemProps[] | undefined\n ): FileItemRenderModes => {\n if (!fileItems || fileItems.length === 0) return {};\n\n const newRenderModes: FileItemRenderModes = {};\n\n for (const item of fileItems) {\n if (item.errorMessage) {\n newRenderModes[item.id] = \"error\";\n } else if (!renderModes[item.id]) {\n newRenderModes[item.id] = shouldRenderEditMode(item)\n ? \"edit\"\n : \"display\";\n } else {\n newRenderModes[item.id] = renderModes[item.id];\n }\n }\n\n return newRenderModes;\n };\n\n const updateRenderModes = (itemId: string, mode: RenderMode) => {\n setRenderModes((prevRenderModes) => {\n return {\n ...prevRenderModes,\n [itemId]: mode,\n };\n });\n };\n\n /**\n * Due to a UI requirement, we will render the items\n * with edit modes as a group\n */\n const getArrangedItems = (\n fileItems: FileItemProps[] | undefined,\n renderModes: FileItemRenderModes\n ) => {\n if (!fileItems || fileItems.length === 0) return [];\n\n const arrangedItems: RenderItem[] = [];\n\n for (const fileItem of fileItems) {\n if (renderModes[fileItem.id] === \"edit\") {\n const previousElement = arrangedItems[arrangedItems.length - 1];\n if (Array.isArray(previousElement)) {\n previousElement.push(fileItem);\n } else {\n arrangedItems.push([fileItem]);\n }\n } else {\n arrangedItems.push(fileItem);\n }\n }\n\n return arrangedItems;\n };\n\n const areAllItemsInDisplayViews = () => {\n return Object.values(renderModes).every((mode) => mode === \"display\");\n };\n\n const shouldEnableSort = () => {\n return (\n fileItems &&\n fileItems.length > 1 &&\n sortable &&\n areAllItemsInDisplayViews()\n );\n };\n\n /**\n * If there are no files, return \"No files uploaded\".\n * If readOnly is true, return \"Read-only file list\".\n * If there are files, return a summary of the file statuses.\n * For example, \"File list. 2 completed files, 1 file in progress, 1 file with error\".\n *\n * @returns aria label\n */\n const getWrapperAriaLabel = () => {\n if (fileItems.length === 0) {\n return \"No files uploaded\";\n }\n const completedCount = fileItems.filter(\n (item) =>\n !item?.errorMessage &&\n (item.progress === 1 || item.progress === undefined)\n ).length;\n const inProgressCount = fileItems.filter(\n (item) => typeof item.progress === \"number\" && item.progress < 1\n ).length;\n const errorCount = fileItems.filter((item) => item.errorMessage).length;\n if (completedCount === 0 && inProgressCount === 0 && errorCount === 0) {\n return `File list`;\n }\n const completedText =\n completedCount > 0 ? `${completedCount} completed files` : \"\";\n const inProgressText =\n inProgressCount > 0 ? `${inProgressCount} file in progress` : \"\";\n const errorText =\n errorCount > 0\n ? `${errorCount} ${\n errorCount > 1 ? \"files\" : \"file\"\n } with error`\n : \"\";\n const parts = [completedText, inProgressText, errorText].filter(\n Boolean\n );\n const prefix = readOnly ? \"Read-only file list\" : \"File list\";\n return `${prefix}. ${parts.join(\", \")}`;\n };\n\n // =========================================================================\n // RENDER FUNCTIONS\n // =========================================================================\n const renderItemsInEditMode = (\n fileItems: FileItemProps[],\n keyToUse: number\n ) => {\n const itemsToRender = fileItems.map((item) => {\n const updatedFileItem = { ...item };\n if (descriptionsValueRef.current[item.id] !== undefined) {\n updatedFileItem.description =\n descriptionsValueRef.current[item.id];\n }\n\n return (\n <FileItemEdit\n key={item.id}\n fileItem={updatedFileItem}\n wrapperWidth={wrapperWidth}\n fileDescriptionMaxLength={fileDescriptionMaxLength}\n onSave={handleSaveEdit(item)}\n onCancel={handleCancel(item)}\n onBlur={handleBlurEdit(item)}\n />\n );\n });\n\n return (\n <li\n key={`editable-${keyToUse}`}\n className={styles.editableItemsContainer}\n >\n <ul>{itemsToRender}</ul>\n </li>\n );\n };\n\n const renderItems = () => {\n const arrangedItems = getArrangedItems(fileItems, renderModes);\n\n if (arrangedItems.length === 0) return null;\n\n return arrangedItems.map((item, index) => {\n if (Array.isArray(item)) {\n return renderItemsInEditMode(item, index);\n } else {\n return (\n <FileListItem\n key={item.id}\n fileItem={item}\n editable={checkEditable(item)}\n wrapperWidth={wrapperWidth}\n sortable={shouldEnableSort()}\n disabled={disabled}\n readOnly={readOnly}\n onDelete={handleDelete(item)}\n onEditClick={handleInitiateEdit(item)}\n />\n );\n }\n });\n };\n\n /**\n * Renders the progress status of each file upload.\n * In progress: 25% complete for uploading filename.pdf\n * Complete: filename.pdf upload is complete\n * Error: Error uploading filename.pdf: error message\n *\n * @returns A visually hidden element announcing the progress status.\n */\n const renderProgressStatus = () => (\n <VisuallyHidden aria-live=\"polite\" aria-atomic=\"true\">\n {progressAnnouncement}\n </VisuallyHidden>\n );\n\n const renderItemsWithWrapper = () => {\n return (\n <>\n {renderProgressStatus()}\n <ul\n tabIndex={-1}\n className={clsx(\n styles.listWrapper,\n readOnly && styles.listWrapperReadOnly\n )}\n ref={wrapperRef}\n aria-label={getWrapperAriaLabel()}\n >\n {renderItems()}\n </ul>\n </>\n );\n };\n\n if (disabled || readOnly || !shouldEnableSort()) {\n return renderItemsWithWrapper();\n } else {\n return (\n <DndContext\n sensors={sensors}\n onDragEnd={handleDragEnd}\n onDragStart={handleDragStart}\n >\n <SortableContext\n items={fileItems}\n strategy={verticalListSortingStrategy}\n >\n {renderItemsWithWrapper()}\n </SortableContext>\n </DndContext>\n );\n }\n}\n\nexport const FileList = forwardRef<FileListRef, Props>(Component);\n"],"names":["FileList","forwardRef","fileItems","editableFileItems","fileDescriptionMaxLength","sortable","disabled","readOnly","onItemUpdate","onItemDelete","onSort","ref","renderModes","setRenderModes","useState","setActiveId","useContext","FileUploadContext","progressAnnouncement","setProgressAnnouncement","lastAnnouncedRef","useRef","useImperativeHandle","focus","_a","wrapperRef","current","width","wrapperWidth","useResizeDetector","descriptionsValueRef","sensors","useSensors","useSensor","MouseSensor","activationConstraint","distance","TouchSensor","delay","tolerance","KeyboardSensor","coordinateGetter","sortableKeyboardCoordinates","removeDescription","itemId","useEffect","nextModes","getItemsRenderMode","prev","next","prevKeys","Object","keys","nextKeys","length","k","shallowCompareRenderModes","now","Date","messages","item","fileStatus","id","errorMessage","status","push","name","progress","timestamp","undefined","join","handleSaveEdit","description","updateRenderModes","updatedItem","assign","handleBlurEdit","value","handleCancel","handleInitiateEdit","handleDelete","handleDragEnd","event","active","over","oldIndex","findIndex","newIndex","updatedFileItems","arrayMove","handleDragStart","checkEditable","FileUploadHelper","isSupportedImageType","type","shouldRenderEditMode","newRenderModes","mode","prevRenderModes","shouldEnableSort","values","every","getWrapperAriaLabel","completedCount","filter","inProgressCount","errorCount","parts","Boolean","renderItems","arrangedItems","fileItem","previousElement","Array","isArray","getArrangedItems","map","index","keyToUse","itemsToRender","updatedFileItem","_jsx","FileItemEdit","onSave","onCancel","onBlur","className","styles.editableItemsContainer","children","renderItemsInEditMode","FileListItem","editable","onDelete","onEditClick","renderItemsWithWrapper","_jsxs","_Fragment","VisuallyHidden","tabIndex","clsx","styles.listWrapper","styles.listWrapperReadOnly","DndContext","onDragEnd","onDragStart","SortableContext","items","strategy","verticalListSortingStrategy"],"mappings":"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"}
1
+ {"version":3,"file":"file-list.js","sources":["../../../../src/file-upload/file-list/file-list.tsx"],"sourcesContent":["import type { DragEndEvent, DragStartEvent } from \"@dnd-kit/core\";\nimport {\n DndContext,\n KeyboardSensor,\n TouchSensor,\n useSensor,\n useSensors,\n} from \"@dnd-kit/core\";\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n verticalListSortingStrategy,\n} from \"@dnd-kit/sortable\";\nimport clsx from \"clsx\";\nimport type React from \"react\";\nimport {\n forwardRef,\n useContext,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from \"react\";\nimport { useResizeDetector } from \"react-resize-detector\";\n\nimport type { FormLabelProps } from \"../../form/types\";\nimport { VisuallyHidden } from \"../../shared/accessibility\";\nimport { FileUploadContext } from \"../context\";\nimport { MouseSensor } from \"../custom-sensors\";\nimport { FileItemEdit } from \"../file-item-edit\";\nimport { FileListItem } from \"../file-list-item\";\nimport { FileUploadHelper } from \"../helper\";\nimport type { FileItemProps } from \"../types\";\nimport * as styles from \"./file-list.styles\";\n\n// =============================================================================\n// INTERFACES\n// =============================================================================\ntype RenderMode = \"edit\" | \"display\" | \"error\";\n\ntype FileItemRenderModes = Record<string, RenderMode>;\ntype FileEditedDescriptions = Record<string, string>;\n\ntype RenderItem = FileItemProps | FileItemProps[];\n\ninterface Props {\n fileItems: FileItemProps[] | undefined;\n editableFileItems: boolean;\n fileDescriptionMaxLength?: number | undefined;\n descriptionRequired?: boolean | undefined;\n descriptionLabel?: FormLabelProps | undefined;\n sortable?: boolean | undefined;\n disabled?: boolean | undefined;\n readOnly?: boolean | undefined;\n onItemUpdate: (item: FileItemProps) => void;\n onItemDelete: (item: FileItemProps) => void;\n onSort?: ((reorderedFileItems: FileItemProps[]) => void) | undefined;\n}\n\ntype AnnouncementProgress = Record<\n string,\n {\n progress: number;\n timestamp: number;\n status: \"in-progress\" | \"complete\" | \"error\";\n }\n>;\n\nexport interface FileListRef {\n focus: () => void;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\nfunction Component(\n {\n fileItems = [],\n editableFileItems,\n fileDescriptionMaxLength,\n descriptionRequired,\n descriptionLabel,\n sortable,\n disabled,\n readOnly,\n onItemUpdate,\n onItemDelete,\n onSort,\n }: Props,\n ref: React.Ref<FileListRef>\n) {\n // =========================================================================\n // CONST, STATE, REFS\n // =========================================================================\n const [renderModes, setRenderModes] = useState<FileItemRenderModes>({});\n const { setActiveId } = useContext(FileUploadContext);\n\n // Progress announcement state (for aria-live) - announces start and completion only\n const [progressAnnouncement, setProgressAnnouncement] = useState(\"\");\n const lastAnnouncedRef = useRef<AnnouncementProgress>({});\n\n useImperativeHandle(ref, () => ({\n focus: () => {\n wrapperRef.current?.focus();\n },\n }));\n const { width: wrapperWidth = 0, ref: wrapperRef } = useResizeDetector();\n\n // Keep track of edited description without re-rendering\n const descriptionsValueRef = useRef<FileEditedDescriptions>({});\n\n /**\n * As the default drag sensors interfere with click events\n * on the file items, we'll need to configure the sensor to\n * only activate the drag if the mouse moves a certain distance\n */\n const sensors = useSensors(\n useSensor(MouseSensor, {\n activationConstraint: {\n distance: 8, // mouse drag of 8px then activate the drag event\n },\n }),\n useSensor(TouchSensor, {\n activationConstraint: {\n delay: 150,\n tolerance: 5,\n },\n }),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n })\n );\n\n // =========================================================================\n // REF METHODS\n // =========================================================================\n const removeDescription = (itemId: string) => {\n delete descriptionsValueRef.current[itemId];\n };\n\n const shallowCompareRenderModes = (\n prev: FileItemRenderModes,\n next: FileItemRenderModes\n ) => {\n const prevKeys = Object.keys(prev);\n const nextKeys = Object.keys(next);\n if (prevKeys.length !== nextKeys.length) {\n return false;\n }\n for (const k of nextKeys) {\n if (prev[k] !== next[k]) {\n return false;\n }\n }\n return true;\n };\n\n // =========================================================================\n // EFFECTS\n // =========================================================================\n useEffect(() => {\n const nextModes = getItemsRenderMode(fileItems);\n const prevModes = renderModes;\n // We perform shallowCompare to avoid infinite re-render loop\n if (shallowCompareRenderModes(prevModes, nextModes)) {\n return;\n }\n setRenderModes(nextModes);\n }, [fileItems, editableFileItems, readOnly]);\n\n // Progress announcements only at start and completion\n useEffect(() => {\n if (!fileItems || fileItems.length === 0) {\n setProgressAnnouncement(\"\");\n return;\n }\n const now = Date.now();\n const messages: string[] = [];\n\n for (const item of fileItems) {\n const fileStatus = lastAnnouncedRef.current[item.id];\n\n if (item.errorMessage) {\n if (fileStatus?.status !== \"error\") {\n messages.push(\n typeof item.errorMessage === \"string\"\n ? `Error uploading ${item.name}: ${item.errorMessage}`\n : `Error uploading ${item.name}`\n );\n lastAnnouncedRef.current[item.id] = {\n progress: item.progress ?? 1,\n timestamp: now,\n status: \"error\",\n };\n }\n continue;\n }\n\n if (item.progress === undefined) {\n continue;\n }\n\n if (item.progress >= 1) {\n if (fileStatus?.status !== \"complete\") {\n messages.push(`${item.name} upload is complete`);\n lastAnnouncedRef.current[item.id] = {\n progress: 1,\n timestamp: now,\n status: \"complete\",\n };\n }\n continue;\n }\n\n // In progress - only announce start, not progress updates\n if (typeof item.progress === \"number\" && item.progress < 1) {\n // Only announce when starting upload (no previous status or status was not in-progress)\n const shouldAnnounce =\n !fileStatus || fileStatus.status !== \"in-progress\";\n\n if (shouldAnnounce) {\n messages.push(`Starting upload of ${item.name}`);\n lastAnnouncedRef.current[item.id] = {\n progress: item.progress,\n timestamp: now,\n status: \"in-progress\",\n };\n }\n }\n }\n\n if (messages.length > 0) {\n // Update aria-live region once with aggregated message\n setProgressAnnouncement(messages.join(\", \"));\n }\n }, [fileItems]);\n\n // =========================================================================\n // EVENT HANDLERS\n // =========================================================================\n const handleSaveEdit = (item: FileItemProps) => (description: string) => {\n updateRenderModes(item.id, \"display\");\n removeDescription(item.id);\n\n const updatedItem = { ...item, description };\n onItemUpdate(updatedItem);\n };\n\n const handleBlurEdit = (item: FileItemProps) => (value: string) => {\n descriptionsValueRef.current[item.id] = value;\n };\n\n const handleCancel = (item: FileItemProps) => () => {\n if (!item.description || item.description.length === 0) {\n // New addition\n onItemDelete(item);\n } else {\n updateRenderModes(item.id, \"display\");\n }\n removeDescription(item.id);\n };\n\n const handleInitiateEdit = (item: FileItemProps) => () => {\n updateRenderModes(item.id, \"edit\");\n };\n\n const handleDelete = (item: FileItemProps) => () => {\n onItemDelete(item);\n if (wrapperRef.current) {\n wrapperRef.current.focus();\n }\n };\n\n const handleDragEnd = (event: DragEndEvent) => {\n if (onSort && fileItems) {\n const { active, over } = event;\n\n if (over && active.id !== over.id) {\n const oldIndex = fileItems.findIndex(\n (item) => item.id === active.id\n );\n const newIndex = fileItems.findIndex(\n (item) => item.id === over.id\n );\n\n const updatedFileItems = arrayMove(\n fileItems,\n oldIndex,\n newIndex\n );\n\n onSort(updatedFileItems);\n }\n }\n\n setActiveId(undefined);\n };\n\n const handleDragStart = (event: DragStartEvent) => {\n const { active } = event;\n setActiveId(active.id as string);\n };\n\n // =========================================================================\n // HELPER FUNCTIONS\n // =========================================================================\n const checkEditable = (item: FileItemProps) => {\n return (\n editableFileItems &&\n FileUploadHelper.isSupportedImageType(item.type)\n );\n };\n\n const shouldRenderEditMode = (item: FileItemProps) => {\n return (\n !item.errorMessage &&\n !readOnly &&\n !(typeof item.progress === \"number\" && item.progress < 1) &&\n checkEditable(item) &&\n !item.description\n );\n };\n\n const getItemsRenderMode = (\n fileItems: FileItemProps[] | undefined\n ): FileItemRenderModes => {\n if (!fileItems || fileItems.length === 0) return {};\n\n const newRenderModes: FileItemRenderModes = {};\n\n for (const item of fileItems) {\n if (item.errorMessage) {\n newRenderModes[item.id] = \"error\";\n } else if (!renderModes[item.id]) {\n newRenderModes[item.id] = shouldRenderEditMode(item)\n ? \"edit\"\n : \"display\";\n } else {\n newRenderModes[item.id] = renderModes[item.id];\n }\n }\n\n return newRenderModes;\n };\n\n const updateRenderModes = (itemId: string, mode: RenderMode) => {\n setRenderModes((prevRenderModes) => {\n return {\n ...prevRenderModes,\n [itemId]: mode,\n };\n });\n };\n\n /**\n * Due to a UI requirement, we will render the items\n * with edit modes as a group\n */\n const getArrangedItems = (\n fileItems: FileItemProps[] | undefined,\n renderModes: FileItemRenderModes\n ) => {\n if (!fileItems || fileItems.length === 0) return [];\n\n const arrangedItems: RenderItem[] = [];\n\n for (const fileItem of fileItems) {\n if (renderModes[fileItem.id] === \"edit\") {\n const previousElement = arrangedItems[arrangedItems.length - 1];\n if (Array.isArray(previousElement)) {\n previousElement.push(fileItem);\n } else {\n arrangedItems.push([fileItem]);\n }\n } else {\n arrangedItems.push(fileItem);\n }\n }\n\n return arrangedItems;\n };\n\n const areAllItemsInDisplayViews = () => {\n return Object.values(renderModes).every((mode) => mode === \"display\");\n };\n\n const shouldEnableSort = () => {\n return (\n fileItems &&\n fileItems.length > 1 &&\n sortable &&\n areAllItemsInDisplayViews()\n );\n };\n\n /**\n * If there are no files, return \"No files uploaded\".\n * If readOnly is true, return \"Read-only file list\".\n * If there are files, return a summary of the file statuses.\n * For example, \"File list. 2 completed files, 1 file in progress, 1 file with error\".\n *\n * @returns aria label\n */\n const getWrapperAriaLabel = () => {\n if (fileItems.length === 0) {\n return \"No files uploaded\";\n }\n const completedCount = fileItems.filter(\n (item) =>\n !item?.errorMessage &&\n (item.progress === 1 || item.progress === undefined)\n ).length;\n const inProgressCount = fileItems.filter(\n (item) => typeof item.progress === \"number\" && item.progress < 1\n ).length;\n const errorCount = fileItems.filter((item) => item.errorMessage).length;\n if (completedCount === 0 && inProgressCount === 0 && errorCount === 0) {\n return `File list`;\n }\n const completedText =\n completedCount > 0 ? `${completedCount} completed files` : \"\";\n const inProgressText =\n inProgressCount > 0 ? `${inProgressCount} file in progress` : \"\";\n const errorText =\n errorCount > 0\n ? `${errorCount} ${\n errorCount > 1 ? \"files\" : \"file\"\n } with error`\n : \"\";\n const parts = [completedText, inProgressText, errorText].filter(\n Boolean\n );\n const prefix = readOnly ? \"Read-only file list\" : \"File list\";\n return `${prefix}. ${parts.join(\", \")}`;\n };\n\n // =========================================================================\n // RENDER FUNCTIONS\n // =========================================================================\n const renderItemsInEditMode = (\n fileItems: FileItemProps[],\n keyToUse: number\n ) => {\n const itemsToRender = fileItems.map((item) => {\n const updatedFileItem = { ...item };\n if (descriptionsValueRef.current[item.id] !== undefined) {\n updatedFileItem.description =\n descriptionsValueRef.current[item.id];\n }\n\n return (\n <FileItemEdit\n key={item.id}\n fileItem={updatedFileItem}\n wrapperWidth={wrapperWidth}\n fileDescriptionMaxLength={fileDescriptionMaxLength}\n descriptionRequired={descriptionRequired}\n descriptionLabel={descriptionLabel}\n onSave={handleSaveEdit(item)}\n onCancel={handleCancel(item)}\n onBlur={handleBlurEdit(item)}\n />\n );\n });\n\n return (\n <li\n key={`editable-${keyToUse}`}\n className={styles.editableItemsContainer}\n >\n <ul>{itemsToRender}</ul>\n </li>\n );\n };\n\n const renderItems = () => {\n const arrangedItems = getArrangedItems(fileItems, renderModes);\n\n if (arrangedItems.length === 0) return null;\n\n return arrangedItems.map((item, index) => {\n if (Array.isArray(item)) {\n return renderItemsInEditMode(item, index);\n } else {\n return (\n <FileListItem\n key={item.id}\n fileItem={item}\n editable={checkEditable(item)}\n wrapperWidth={wrapperWidth}\n sortable={shouldEnableSort()}\n disabled={disabled}\n readOnly={readOnly}\n descriptionLabel={descriptionLabel}\n onDelete={handleDelete(item)}\n onEditClick={handleInitiateEdit(item)}\n />\n );\n }\n });\n };\n\n /**\n * Renders the progress status of each file upload.\n * In progress: 25% complete for uploading filename.pdf\n * Complete: filename.pdf upload is complete\n * Error: Error uploading filename.pdf: error message\n *\n * @returns A visually hidden element announcing the progress status.\n */\n const renderProgressStatus = () => (\n <VisuallyHidden aria-live=\"polite\" aria-atomic=\"true\">\n {progressAnnouncement}\n </VisuallyHidden>\n );\n\n const renderItemsWithWrapper = () => {\n return (\n <>\n {renderProgressStatus()}\n <ul\n tabIndex={-1}\n className={clsx(\n styles.listWrapper,\n readOnly && styles.listWrapperReadOnly\n )}\n ref={wrapperRef}\n aria-label={getWrapperAriaLabel()}\n >\n {renderItems()}\n </ul>\n </>\n );\n };\n\n if (disabled || readOnly || !shouldEnableSort()) {\n return renderItemsWithWrapper();\n } else {\n return (\n <DndContext\n sensors={sensors}\n onDragEnd={handleDragEnd}\n onDragStart={handleDragStart}\n >\n <SortableContext\n items={fileItems}\n strategy={verticalListSortingStrategy}\n >\n {renderItemsWithWrapper()}\n </SortableContext>\n </DndContext>\n );\n }\n}\n\nexport const FileList = forwardRef<FileListRef, Props>(Component);\n"],"names":["FileList","forwardRef","fileItems","editableFileItems","fileDescriptionMaxLength","descriptionRequired","descriptionLabel","sortable","disabled","readOnly","onItemUpdate","onItemDelete","onSort","ref","renderModes","setRenderModes","useState","setActiveId","useContext","FileUploadContext","progressAnnouncement","setProgressAnnouncement","lastAnnouncedRef","useRef","useImperativeHandle","focus","_a","wrapperRef","current","width","wrapperWidth","useResizeDetector","descriptionsValueRef","sensors","useSensors","useSensor","MouseSensor","activationConstraint","distance","TouchSensor","delay","tolerance","KeyboardSensor","coordinateGetter","sortableKeyboardCoordinates","removeDescription","itemId","useEffect","nextModes","getItemsRenderMode","prev","next","prevKeys","Object","keys","nextKeys","length","k","shallowCompareRenderModes","now","Date","messages","item","fileStatus","id","errorMessage","status","push","name","progress","timestamp","undefined","join","handleSaveEdit","description","updateRenderModes","updatedItem","assign","handleBlurEdit","value","handleCancel","handleInitiateEdit","handleDelete","handleDragEnd","event","active","over","oldIndex","findIndex","newIndex","updatedFileItems","arrayMove","handleDragStart","checkEditable","FileUploadHelper","isSupportedImageType","type","shouldRenderEditMode","newRenderModes","mode","prevRenderModes","shouldEnableSort","values","every","getWrapperAriaLabel","completedCount","filter","inProgressCount","errorCount","parts","Boolean","renderItems","arrangedItems","fileItem","previousElement","Array","isArray","getArrangedItems","map","index","keyToUse","itemsToRender","updatedFileItem","_jsx","FileItemEdit","onSave","onCancel","onBlur","className","styles.editableItemsContainer","children","renderItemsInEditMode","FileListItem","editable","onDelete","onEditClick","renderItemsWithWrapper","_jsxs","_Fragment","VisuallyHidden","tabIndex","clsx","styles.listWrapper","styles.listWrapperReadOnly","DndContext","onDragEnd","onDragStart","SortableContext","items","strategy","verticalListSortingStrategy"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";require("./file-list.styles_1ea12kj.css");exports.editableItemsContainer="e1y5148f",exports.listWrapper="l14goqmf",exports.listWrapperReadOnly="l1spcgo1";
1
+ "use strict";require("./file-list.styles_1w7so98.css");exports.editableItemsContainer="e1y5148f",exports.listWrapper="l14goqmf",exports.listWrapperReadOnly="l1spcgo1";
2
2
  //# sourceMappingURL=file-list.styles.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-list.styles.js","sources":["../../../../src/file-upload/file-list/file-list.styles.ts"],"sourcesContent":["import { css } from \"@linaria/core\";\n\nimport { Border, Colour, Spacing } from \"../../theme\";\n\nexport const listWrapper = css`\n list-style-type: none;\n margin-bottom: ${Spacing[\"spacing-32\"]};\n`;\n\nexport const listWrapperReadOnly = css`\n margin-bottom: 0;\n`;\n\nexport const editableItemsContainer = css`\n border-top: ${Border[\"width-010\"]} ${Border.solid} ${Colour.border};\n border-bottom: ${Border[\"width-010\"]} ${Border.solid} ${Colour.border};\n\n &:not(:last-child) {\n margin-bottom: ${Spacing[\"spacing-32\"]};\n }\n\n &:not(:first-child) {\n margin-top: ${Spacing[\"spacing-32\"]};\n }\n\n ul {\n list-style-type: none;\n }\n`;\n"],"names":[],"mappings":"2HAamC,+BATX,uCAKQ"}
1
+ {"version":3,"file":"file-list.styles.js","sources":["../../../../src/file-upload/file-list/file-list.styles.ts"],"sourcesContent":["import { css } from \"@linaria/core\";\n\nimport { Spacing } from \"../../theme\";\n\nexport const listWrapper = css`\n list-style-type: none;\n margin-bottom: ${Spacing[\"spacing-32\"]};\n`;\n\nexport const listWrapperReadOnly = css`\n margin-bottom: 0;\n`;\n\nexport const editableItemsContainer = css`\n &:not(:last-child) {\n margin-bottom: ${Spacing[\"spacing-16\"]};\n }\n\n ul {\n list-style-type: none;\n }\n`;\n"],"names":[],"mappings":"2HAamC,+BATX,uCAKQ"}
@@ -0,0 +1,3 @@
1
+ @layer fds{.l14goqmf{list-style-type:none;margin-bottom:var(--fds-spacing-32);}
2
+ .l1spcgo1{margin-bottom:0;}
3
+ .e1y5148f:not(:last-child){margin-bottom:var(--fds-spacing-16);}.e1y5148f ul{list-style-type:none;}}
@@ -1,4 +1,4 @@
1
- .c1hu6y7h{width:auto;margin-right:var(--fds-spacing-32);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;}
1
+ @layer fds{.c1hu6y7h{width:auto;margin-right:var(--fds-spacing-32);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;}
2
2
  .t18h6q7y{width:96px;height:96px;aspect-ratio:1;border-radius:var(--fds-radius-sm);border:var(--fds-border-width-010) var(--fds-border-style-solid) var(--fds-colour-border);object-fit:cover;}:where(body.fds-breakpoint-md-max) .t18h6q7y{width:64px;height:64px;}
3
3
  .t1w2z01d{border:none;}
4
- .r5e5ep6{width:100%;height:1.625rem;margin-top:var(--fds-spacing-8);border:none;background:transparent;cursor:pointer;font-family:var(--fds-font-family-body);font-variant:var(--fds-font-variant);font-size:var(--fds-font-body-size-md);font-weight:var(--fds-font-weight-semibold);line-height:var(--fds-font-body-lh-md);letter-spacing:var(--fds-font-body-ls-md);color:var(--fds-colour-text-primary);}.r5e5ep6:hover{color:var(--fds-colour-text-hover);}
4
+ .r5e5ep6{width:100%;height:1.625rem;margin-top:var(--fds-spacing-8);border:none;background:transparent;cursor:pointer;font-family:var(--fds-font-family-body);font-variant:var(--fds-font-variant);font-size:var(--fds-font-body-size-md);font-weight:var(--fds-font-weight-semibold);line-height:var(--fds-font-body-lh-md);letter-spacing:var(--fds-font-body-ls-md);color:var(--fds-colour-text-primary);}.r5e5ep6:hover{color:var(--fds-colour-text-hover);}}
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("react/jsx-runtime"),i=require("../../external/@dnd-kit/sortable/dist/sortable.esm.js"),t=require("../../external/@dnd-kit/utilities/dist/utilities.esm.js"),a=require("@lifesg/react-icons/bin"),s=require("@lifesg/react-icons/drag-handle"),r=require("@lifesg/react-icons/exclamation-circle-fill"),l=require("@lifesg/react-icons/pencil"),n=require("react"),d=require("../../button/button.js"),o=require("../../shared/progress-bar/progress-bar.js"),c=require("../../typography/index.js");require("../../util/calendar-helper.js"),require("../../external/dayjs/dayjs.min.js"),require("../../util/simple-id-generator.js");var m=require("../../util/string-helper.js");require("@react-aria/live-announcer");var u=require("../context.js"),h=require("../helper.js"),x=require("./file-list-item.styles.js"),p=require("./file-list-item-thumbnail.js");const b=n.memo((({fileItem:b,editable:j,sortable:g,wrapperWidth:y,disabled:f,readOnly:N,onDelete:v,onEditClick:S})=>{const{id:T,name:q,size:B,description:I,progress:D=1,errorMessage:F,thumbnailImageDataUrl:C,truncateText:M=!0}=b,[z,$]=n.useState(),{activeId:k}=n.useContext(u.FileUploadContext),{attributes:E,listeners:w,setNodeRef:H,transform:O,transition:P}=i.useSortable({id:T}),U=n.useRef(null),L={transform:t.CSS.Translate.toString(O),transition:P},R=Object.assign(Object.assign({style:L},E),w),K=D<1,_=h.FileUploadHelper.formatFileSizeDisplay(B),W=k?k===T?"self":"others":"none",Y=n.useCallback((e=>{if(!M)return e;const i=U&&U.current?U.current.getBoundingClientRect().width:0;return m.StringHelper.truncateOneLine(e,i,i/2,i/2/8,16)}),[M]);n.useEffect((()=>{$(Y(q))}),[y,Y,q]);const A=()=>{v()},G=()=>{S&&S()},J=e=>{g&&e.stopPropagation()},Q=()=>f||!!k,V=()=>!!g&&!N,X=()=>e.jsxs(e.Fragment,{children:[e.jsx(c.Typography.BodyMD,{weight:I?"semibold":"regular",children:z}),I&&e.jsx(c.Typography.BodyMD,{className:x.itemDescriptionText,children:I})]});return e.jsxs("li",Object.assign({id:T,ref:H,className:x.item,"data-item-state":Q()&&"none"===W?"disabled":V()&&"self"===W?"sortable-active":V()?"sortable":void 0,"data-testid":`${T}-item`},V()?R:{},{children:[V()&&e.jsx(s.DragHandleIcon,{"data-testid":`${T}-drag-handle`,className:x.dragHandleIcon,"data-drag-handle-state":"self"===W?"active":Q()?"disabled":void 0}),e.jsxs("div",{className:x.box,"data-box-state":"self"===W?"focused":Q()?"disabled":F?"error":void 0,"data-stack-mobile":!F&&(K||j),children:[(()=>{let i;const t=!!C||b.type===h.FileUploadHelper.PDF_MIME_TYPE;return i=F?e.jsxs(e.Fragment,{children:[e.jsxs("div",{ref:U,className:x.nameSection,children:[X(),F&&e.jsxs(c.Typography.BodySM,{className:x.desktopErrorMessage,weight:"semibold",children:[e.jsx(r.ExclamationCircleFillIcon,{className:x.errorIcon,"aria-hidden":!0}),F]})]}),e.jsx("div",{className:x.fileSizeSection,"data-mobile-visibility":K?"hidden":"expand",children:e.jsx(c.Typography.BodyMD,{className:x.fileSizeText,children:_})}),F&&e.jsxs(c.Typography.BodySM,{className:x.mobileErrorMessage,weight:"semibold",children:[e.jsx(r.ExclamationCircleFillIcon,{className:x.errorIcon,"aria-hidden":!0}),F]})]}):t?(i=>e.jsxs(e.Fragment,{children:[e.jsx(p.FileListItemThumbnail,{thumbnailImageDataUrl:i,fileType:b.type,"data-testid":`${T}-thumbnail`}),e.jsxs("div",{className:x.extendedNameSection,children:[e.jsx("div",{ref:U,className:x.nameSection,children:X()}),e.jsx("div",{className:x.fileSizeSection,"data-mobile-visibility":K?"hidden":"expand",children:e.jsx(c.Typography.BodyMD,{className:x.fileSizeText,children:_})})]})]}))(C||""):e.jsxs(e.Fragment,{children:[e.jsx("div",{ref:U,className:x.nameSection,children:X()}),e.jsx("div",{className:x.fileSizeSection,"data-mobile-visibility":K?"hidden":"expand",children:e.jsx(c.Typography.BodyMD,{className:x.fileSizeText,children:_})})]}),e.jsx("div",{className:x.contentSection,"data-has-thumbnail":t,children:i})})(),!N&&(()=>{let i;return i=F?e.jsx(d.Button,{"data-testid":`${T}-error-delete-button`,"data-no-dnd":"true",type:"button",styleType:"light",sizeType:"small","aria-label":`delete ${q}, error: ${F}`,onClick:A,className:x.iconButton,icon:e.jsx(a.BinIcon,{"aria-hidden":!0})}):K?e.jsx(o.ProgressBar,{progress:D,"data-testid":`${T}-progress-bar`}):e.jsxs(e.Fragment,{children:[j&&e.jsx(d.Button,{"data-testid":`${T}-edit-button`,"data-no-dnd":"true",type:"button",styleType:"light",sizeType:"small","aria-label":`edit ${q}`,disabled:Q(),onClick:G,onKeyDown:J,icon:e.jsx(l.PencilIcon,{"aria-hidden":!0}),className:x.iconButton},"edit"),e.jsx(d.Button,{"data-testid":`${T}-delete-button`,"data-no-dnd":"true",type:"button",styleType:"light",sizeType:"small","aria-label":`delete ${q}`,disabled:Q(),onClick:A,onKeyDown:J,icon:e.jsx(a.BinIcon,{"aria-hidden":!0}),className:x.iconButton},"delete")]}),e.jsx("div",{className:x.actionContainer,"data-mobile-layout":!F&&K?"loading":!F&&j?"editable":void 0,children:i})})()]})]}))}));exports.FileListItem=b;
1
+ "use strict";var e=require("react/jsx-runtime"),i=require("../../external/@dnd-kit/sortable/dist/sortable.esm.js"),t=require("../../external/@dnd-kit/utilities/dist/utilities.esm.js"),a=require("@lifesg/react-icons/bin"),s=require("@lifesg/react-icons/drag-handle"),r=require("@lifesg/react-icons/exclamation-circle-fill"),n=require("@lifesg/react-icons/pencil"),l=require("react"),d=require("../../button/button.js"),o=require("../../shared/progress-bar/progress-bar.js"),c=require("../../typography/index.js");require("../../util/calendar-helper.js"),require("../../external/dayjs/dayjs.min.js"),require("../../util/simple-id-generator.js");var u=require("../../util/string-helper.js");require("@react-aria/live-announcer");var m=require("../context.js"),p=require("../helper.js"),h=require("./file-list-item.styles.js"),y=require("./file-list-item-thumbnail.js");const x=l.memo((({fileItem:x,editable:b,sortable:j,wrapperWidth:g,disabled:T,readOnly:f,descriptionLabel:N,onDelete:v,onEditClick:B})=>{const{id:D,name:q,size:F,description:I,progress:M=1,errorMessage:S,thumbnailImageDataUrl:C,truncateText:$=!0}=x,[k,z]=l.useState(),{activeId:w}=l.useContext(m.FileUploadContext),{attributes:E,listeners:P,setNodeRef:H,transform:L,transition:U}=i.useSortable({id:D}),O=l.useRef(null),K={transform:t.CSS.Translate.toString(L),transition:U},_=Object.assign(Object.assign({style:K},E),P),R=M<1,Y=p.FileUploadHelper.formatFileSizeDisplay(F),A=!!I&&!!b,W=w?w===D?"self":"others":"none",G=l.useCallback((e=>{if(!$)return e;const i=O&&O.current?O.current.getBoundingClientRect().width:0;return u.StringHelper.truncateOneLine(e,i,i/2,i/2/8,16)}),[$]);l.useEffect((()=>{z(G(q))}),[g,G,q]);const J=()=>{v()},Q=()=>{B&&B()},V=e=>{j&&e.stopPropagation()},X=()=>T||!!w,Z=()=>!!j&&!f,ee=()=>{var i;return e.jsxs(e.Fragment,{children:[e.jsx(c.Typography.BodyMD,{weight:I?"semibold":"regular",children:k}),I&&e.jsxs(e.Fragment,{children:[e.jsx(c.Typography.BodyMD,{className:h.itemDescriptionLabel,children:null!==(i=null==N?void 0:N.children)&&void 0!==i?i:"Photo description"}),e.jsx(c.Typography.BodyMD,{className:h.itemDescriptionText,children:I})]})]})};return e.jsxs("li",Object.assign({id:D,ref:H,className:h.item,"data-item-state":X()&&"none"===W?"disabled":Z()&&"self"===W?"sortable-active":Z()?"sortable":void 0,"data-testid":`${D}-item`},Z()?_:{},{children:[Z()&&e.jsx(s.DragHandleIcon,{"data-testid":`${D}-drag-handle`,className:h.dragHandleIcon,"data-drag-handle-state":"self"===W?"active":X()?"disabled":void 0}),e.jsxs("div",{className:h.box,"data-box-state":"self"===W?"focused":X()?"disabled":S?"error":void 0,"data-stack-mobile":!S&&(R||b),children:[(()=>{const i=!!C||x.type===p.FileUploadHelper.PDF_MIME_TYPE,t=S?e.jsxs(e.Fragment,{children:[e.jsxs("div",{ref:O,className:h.nameSection,children:[ee(),S&&e.jsxs(c.Typography.BodySM,{className:h.desktopErrorMessage,weight:"semibold",children:[e.jsx(r.ExclamationCircleFillIcon,{className:h.errorIcon,"aria-hidden":!0}),S]})]}),e.jsx("div",{className:h.fileSizeSection,"data-mobile-visibility":R?"hidden":"expand",children:e.jsx(c.Typography.BodyMD,{className:h.fileSizeText,children:Y})}),S&&e.jsxs(c.Typography.BodySM,{className:h.mobileErrorMessage,weight:"semibold",children:[e.jsx(r.ExclamationCircleFillIcon,{className:h.errorIcon,"aria-hidden":!0}),S]})]}):(i=>{const t=i||x.type===p.FileUploadHelper.PDF_MIME_TYPE?e.jsx(y.FileListItemThumbnail,{thumbnailImageDataUrl:i||"",fileType:x.type,"data-testid":`${D}-thumbnail`}):null;return A?e.jsxs(e.Fragment,{children:[t,e.jsxs("div",{ref:O,className:h.extendedNameSection,children:[e.jsx(c.Typography.BodyMD,{weight:"semibold",children:k}),e.jsx(c.Typography.BodyMD,{className:h.itemDescriptionLabel,children:null!==(s=null==N?void 0:N.children)&&void 0!==s?s:"Photo description"}),e.jsx(c.Typography.BodyMD,{className:h.itemDescriptionText,children:I}),e.jsx(c.Typography.BodyMD,{className:h.descriptionFileSizeText,children:Y}),!f&&A&&e.jsxs("div",{className:h.inlineActionContainer,children:[e.jsx(d.Button,{"data-testid":`${D}-edit-button`,"data-no-dnd":"true",type:"button",styleType:"light",sizeType:"small","aria-label":`edit ${q}`,disabled:X(),onClick:Q,onKeyDown:V,icon:e.jsx(n.PencilIcon,{"aria-hidden":!0}),className:h.iconButton},"edit"),e.jsx(d.Button,{"data-testid":`${D}-delete-button`,"data-no-dnd":"true",type:"button",styleType:"light",sizeType:"small","aria-label":`delete ${q}`,disabled:X(),onClick:J,onKeyDown:V,icon:e.jsx(a.BinIcon,{"aria-hidden":!0}),className:h.iconButton},"delete")]})]})]}):e.jsxs(e.Fragment,{children:[t,e.jsxs("div",{ref:O,className:h.nameSection,children:[ee(),!R&&e.jsx(c.Typography.BodyMD,{className:h.descriptionFileSizeText,children:Y})]})]});var s})(C);return e.jsx("div",{className:h.contentSection,"data-has-thumbnail":i,children:t})})(),!f&&!A&&(()=>{let i;return i=S?e.jsx(d.Button,{"data-testid":`${D}-error-delete-button`,"data-no-dnd":"true",type:"button",styleType:"light",sizeType:"small","aria-label":`delete ${q}, error: ${S}`,onClick:J,className:h.iconButton,icon:e.jsx(a.BinIcon,{"aria-hidden":!0})}):R?e.jsx(o.ProgressBar,{progress:M,"data-testid":`${D}-progress-bar`}):e.jsxs(e.Fragment,{children:[b&&e.jsx(d.Button,{"data-testid":`${D}-edit-button`,"data-no-dnd":"true",type:"button",styleType:"light",sizeType:"small","aria-label":`edit ${q}`,disabled:X(),onClick:Q,onKeyDown:V,icon:e.jsx(n.PencilIcon,{"aria-hidden":!0}),className:h.iconButton},"edit"),e.jsx(d.Button,{"data-testid":`${D}-delete-button`,"data-no-dnd":"true",type:"button",styleType:"light",sizeType:"small","aria-label":`delete ${q}`,disabled:X(),onClick:J,onKeyDown:V,icon:e.jsx(a.BinIcon,{"aria-hidden":!0}),className:h.iconButton},"delete")]}),e.jsx("div",{className:h.actionContainer,"data-mobile-layout":!S&&R?"loading":!S&&b?"editable":void 0,children:i})})()]})]}))}));exports.FileListItem=x;
2
2
  //# sourceMappingURL=file-list-item.js.map