@lifesg/react-design-system 4.0.0-alpha.12 → 4.0.0-alpha.14

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 (323) hide show
  1. package/breadcrumb/breadcrumb.js +1 -1
  2. package/breadcrumb/breadcrumb.js.map +1 -1
  3. package/breadcrumb/breadcrumb.styles.d.ts +0 -8
  4. package/breadcrumb/breadcrumb.styles.js +1 -1
  5. package/breadcrumb/breadcrumb.styles.js.map +1 -1
  6. package/breadcrumb/breadcrumb.styles_1blzn8n.css +7 -0
  7. package/breadcrumb/types.d.ts +2 -13
  8. package/cjs/breadcrumb/breadcrumb.js +1 -1
  9. package/cjs/breadcrumb/breadcrumb.js.map +1 -1
  10. package/cjs/breadcrumb/breadcrumb.styles.js +1 -1
  11. package/cjs/breadcrumb/breadcrumb.styles.js.map +1 -1
  12. package/cjs/breadcrumb/breadcrumb.styles_1blzn8n.css +7 -0
  13. package/cjs/drawer/drawer.js +1 -1
  14. package/cjs/drawer/drawer.js.map +1 -1
  15. package/cjs/drawer/drawer.styles.js +1 -1
  16. package/cjs/drawer/drawer.styles.js.map +1 -1
  17. package/{drawer/drawer.styles_94hx3y.css → cjs/drawer/drawer.styles_a4bwe0.css} +6 -3
  18. package/cjs/external/dompurify/dist/purify.es.js +4 -2
  19. package/cjs/external/dompurify/dist/purify.es.js.map +1 -1
  20. package/cjs/file-upload/file-list/file-list.js +1 -1
  21. package/cjs/file-upload/file-list/file-list.js.map +1 -1
  22. package/cjs/file-upload/file-list/file-list.styles.js +1 -1
  23. package/cjs/file-upload/file-list/file-list.styles.js.map +1 -1
  24. package/cjs/file-upload/file-list/file-list.styles_1xbypnh.css +2 -0
  25. package/cjs/file-upload/file-list-item/file-item-actions.js +2 -0
  26. package/cjs/file-upload/file-list-item/file-item-actions.js.map +1 -0
  27. package/cjs/file-upload/file-list-item/file-item-actions.styles.js +2 -0
  28. package/cjs/file-upload/file-list-item/file-item-actions.styles.js.map +1 -0
  29. package/cjs/file-upload/file-list-item/file-item-actions.styles_1quulgy.css +8 -0
  30. package/cjs/file-upload/file-list-item/file-item-details.js +2 -0
  31. package/cjs/file-upload/file-list-item/file-item-details.js.map +1 -0
  32. package/cjs/file-upload/file-list-item/file-item-details.styles.js +2 -0
  33. package/cjs/file-upload/file-list-item/file-item-details.styles.js.map +1 -0
  34. package/cjs/file-upload/file-list-item/file-item-details.styles_1ce9akx.css +7 -0
  35. package/cjs/file-upload/file-list-item/file-list-item.js +1 -1
  36. package/cjs/file-upload/file-list-item/file-list-item.js.map +1 -1
  37. package/cjs/file-upload/file-list-item/file-list-item.styles.js +1 -1
  38. package/cjs/file-upload/file-list-item/file-list-item.styles.js.map +1 -1
  39. package/cjs/file-upload/file-list-item/file-list-item.styles_x3a500.css +10 -0
  40. package/cjs/file-upload/file-list-item/use-truncated-name.js +2 -0
  41. package/cjs/file-upload/file-list-item/use-truncated-name.js.map +1 -0
  42. package/cjs/local-nav/local-nav-dropdown/local-nav-dropdown.js +1 -1
  43. package/cjs/local-nav/local-nav-dropdown/local-nav-dropdown.js.map +1 -1
  44. package/cjs/local-nav/local-nav-dropdown/local-nav-dropdown.styles.js +1 -1
  45. package/cjs/local-nav/local-nav-dropdown/local-nav-dropdown.styles.js.map +1 -1
  46. package/{local-nav/local-nav-dropdown/local-nav-dropdown.styles_uhd4xl.css → cjs/local-nav/local-nav-dropdown/local-nav-dropdown.styles_kpel1m.css} +9 -6
  47. package/cjs/local-nav/local-nav-menu/local-nav-menu.js +1 -1
  48. package/cjs/local-nav/local-nav-menu/local-nav-menu.js.map +1 -1
  49. package/cjs/local-nav/local-nav-menu/local-nav-menu.styles.js +1 -1
  50. package/cjs/local-nav/local-nav-menu/local-nav-menu.styles.js.map +1 -1
  51. package/cjs/local-nav/local-nav-menu/local-nav-menu.styles_67fcyc.css +8 -0
  52. package/cjs/menu/menu-content.js +1 -1
  53. package/cjs/menu/menu-content.js.map +1 -1
  54. package/cjs/menu/menu-content.styles.js +1 -1
  55. package/cjs/menu/menu-content.styles.js.map +1 -1
  56. package/cjs/menu/menu-content.styles_1r8oxtk.css +5 -0
  57. package/cjs/menu/menu-item.styles.js +1 -1
  58. package/cjs/menu/menu-item.styles.js.map +1 -1
  59. package/cjs/menu/{menu-item.styles_liyed8.css → menu-item.styles_eut2j9.css} +1 -1
  60. package/cjs/menu/menu-link.styles.js +1 -1
  61. package/cjs/menu/menu-link.styles.js.map +1 -1
  62. package/cjs/menu/menu-link.styles_rng7n7.css +2 -0
  63. package/cjs/menu/menu-section.js +1 -1
  64. package/cjs/menu/menu-section.js.map +1 -1
  65. package/cjs/menu/menu-section.styles.js +1 -1
  66. package/cjs/menu/menu-section.styles.js.map +1 -1
  67. package/cjs/menu/menu-section.styles_1n0ppxl.css +5 -0
  68. package/cjs/modal-v2/slots/slot-styles.js +1 -1
  69. package/cjs/modal-v2/slots/slot-styles.js.map +1 -1
  70. package/cjs/modal-v2/slots/{slot-styles_ayb9il.css → slot-styles_ygu6zc.css} +1 -1
  71. package/cjs/navbar/navbar-items.js +1 -1
  72. package/cjs/navbar/navbar-items.js.map +1 -1
  73. package/cjs/notification-banner/notification-banner-hoc.js +1 -1
  74. package/cjs/notification-banner/notification-banner-hoc.js.map +1 -1
  75. package/cjs/pagination/pagination.js +1 -1
  76. package/cjs/pagination/pagination.js.map +1 -1
  77. package/cjs/shared/dropdown-list/dropdown-label.js +1 -1
  78. package/cjs/shared/dropdown-list/dropdown-label.js.map +1 -1
  79. package/cjs/shared/fade-wrapper/fade-wrapper.js +1 -1
  80. package/cjs/shared/fade-wrapper/fade-wrapper.js.map +1 -1
  81. package/cjs/theme/tokens/colour.js +1 -1
  82. package/cjs/theme/tokens/colour.js.map +1 -1
  83. package/cjs/theme/tokens/radius.js +1 -1
  84. package/cjs/theme/tokens/radius.js.map +1 -1
  85. package/codemods/run-codemod.js +8 -2
  86. package/codemods/run-codemod.js.map +1 -1
  87. package/codemods/run-codemod.ts +13 -4
  88. package/drawer/drawer.d.ts +1 -1
  89. package/drawer/drawer.js +1 -1
  90. package/drawer/drawer.js.map +1 -1
  91. package/drawer/drawer.styles.d.ts +3 -0
  92. package/drawer/drawer.styles.js +1 -1
  93. package/drawer/drawer.styles.js.map +1 -1
  94. package/{cjs/drawer/drawer.styles_94hx3y.css → drawer/drawer.styles_a4bwe0.css} +6 -3
  95. package/drawer/types.d.ts +7 -0
  96. package/external/dompurify/dist/purify.es.js +4 -2
  97. package/external/dompurify/dist/purify.es.js.map +1 -1
  98. package/file-upload/file-list/file-list.js +1 -1
  99. package/file-upload/file-list/file-list.js.map +1 -1
  100. package/file-upload/file-list/file-list.styles.d.ts +0 -1
  101. package/file-upload/file-list/file-list.styles.js +1 -1
  102. package/file-upload/file-list/file-list.styles.js.map +1 -1
  103. package/file-upload/file-list/file-list.styles_1xbypnh.css +2 -0
  104. package/file-upload/file-list-item/file-item-actions.d.ts +30 -0
  105. package/file-upload/file-list-item/file-item-actions.js +2 -0
  106. package/file-upload/file-list-item/file-item-actions.js.map +1 -0
  107. package/file-upload/file-list-item/file-item-actions.styles.d.ts +6 -0
  108. package/file-upload/file-list-item/file-item-actions.styles.js +2 -0
  109. package/file-upload/file-list-item/file-item-actions.styles.js.map +1 -0
  110. package/file-upload/file-list-item/file-item-actions.styles_1quulgy.css +8 -0
  111. package/file-upload/file-list-item/file-item-details.d.ts +15 -0
  112. package/file-upload/file-list-item/file-item-details.js +2 -0
  113. package/file-upload/file-list-item/file-item-details.js.map +1 -0
  114. package/file-upload/file-list-item/file-item-details.styles.d.ts +7 -0
  115. package/file-upload/file-list-item/file-item-details.styles.js +2 -0
  116. package/file-upload/file-list-item/file-item-details.styles.js.map +1 -0
  117. package/file-upload/file-list-item/file-item-details.styles_1ce9akx.css +7 -0
  118. package/file-upload/file-list-item/file-list-item.d.ts +1 -7
  119. package/file-upload/file-list-item/file-list-item.js +1 -1
  120. package/file-upload/file-list-item/file-list-item.js.map +1 -1
  121. package/file-upload/file-list-item/file-list-item.styles.d.ts +6 -13
  122. package/file-upload/file-list-item/file-list-item.styles.js +1 -1
  123. package/file-upload/file-list-item/file-list-item.styles.js.map +1 -1
  124. package/file-upload/file-list-item/file-list-item.styles_x3a500.css +10 -0
  125. package/file-upload/file-list-item/types.d.ts +10 -3
  126. package/file-upload/file-list-item/use-truncated-name.d.ts +1 -0
  127. package/file-upload/file-list-item/use-truncated-name.js +2 -0
  128. package/file-upload/file-list-item/use-truncated-name.js.map +1 -0
  129. package/input-group/types.d.ts +4 -1
  130. package/input-select/types.d.ts +1 -0
  131. package/local-nav/local-nav-dropdown/local-nav-dropdown.js +1 -1
  132. package/local-nav/local-nav-dropdown/local-nav-dropdown.js.map +1 -1
  133. package/local-nav/local-nav-dropdown/local-nav-dropdown.styles.d.ts +3 -0
  134. package/local-nav/local-nav-dropdown/local-nav-dropdown.styles.js +1 -1
  135. package/local-nav/local-nav-dropdown/local-nav-dropdown.styles.js.map +1 -1
  136. package/{cjs/local-nav/local-nav-dropdown/local-nav-dropdown.styles_uhd4xl.css → local-nav/local-nav-dropdown/local-nav-dropdown.styles_kpel1m.css} +9 -6
  137. package/local-nav/local-nav-menu/local-nav-menu.js +1 -1
  138. package/local-nav/local-nav-menu/local-nav-menu.js.map +1 -1
  139. package/local-nav/local-nav-menu/local-nav-menu.styles.d.ts +3 -0
  140. package/local-nav/local-nav-menu/local-nav-menu.styles.js +1 -1
  141. package/local-nav/local-nav-menu/local-nav-menu.styles.js.map +1 -1
  142. package/local-nav/local-nav-menu/local-nav-menu.styles_67fcyc.css +8 -0
  143. package/local-nav/types.d.ts +17 -0
  144. package/masked-input/types.d.ts +1 -2
  145. package/menu/menu-content.js +1 -1
  146. package/menu/menu-content.js.map +1 -1
  147. package/menu/menu-content.styles.d.ts +1 -0
  148. package/menu/menu-content.styles.js +1 -1
  149. package/menu/menu-content.styles.js.map +1 -1
  150. package/menu/menu-content.styles_1r8oxtk.css +5 -0
  151. package/menu/menu-item.styles.js +1 -1
  152. package/menu/menu-item.styles.js.map +1 -1
  153. package/menu/{menu-item.styles_liyed8.css → menu-item.styles_eut2j9.css} +1 -1
  154. package/menu/menu-link.styles.js +1 -1
  155. package/menu/menu-link.styles.js.map +1 -1
  156. package/menu/menu-link.styles_rng7n7.css +2 -0
  157. package/menu/menu-section.d.ts +1 -1
  158. package/menu/menu-section.js +1 -1
  159. package/menu/menu-section.js.map +1 -1
  160. package/menu/menu-section.styles.d.ts +7 -0
  161. package/menu/menu-section.styles.js +1 -1
  162. package/menu/menu-section.styles.js.map +1 -1
  163. package/menu/menu-section.styles_1n0ppxl.css +5 -0
  164. package/menu/menu.d.ts +1 -1
  165. package/menu/types.d.ts +10 -2
  166. package/modal-v2/slots/slot-styles.js +1 -1
  167. package/modal-v2/slots/slot-styles.js.map +1 -1
  168. package/modal-v2/slots/{slot-styles_ayb9il.css → slot-styles_ygu6zc.css} +1 -1
  169. package/navbar/navbar-items.js +1 -1
  170. package/navbar/navbar-items.js.map +1 -1
  171. package/navbar/types.d.ts +9 -0
  172. package/notification-banner/notification-banner-hoc.js +1 -1
  173. package/notification-banner/notification-banner-hoc.js.map +1 -1
  174. package/package.json +3 -4
  175. package/pagination/pagination.js +1 -1
  176. package/pagination/pagination.js.map +1 -1
  177. package/pagination/types.d.ts +8 -1
  178. package/scripts/cli.js +18 -0
  179. package/select-histogram/types.d.ts +1 -0
  180. package/shared/dropdown-list/dropdown-label.d.ts +2 -2
  181. package/shared/dropdown-list/dropdown-label.js +1 -1
  182. package/shared/dropdown-list/dropdown-label.js.map +1 -1
  183. package/shared/dropdown-list/types.d.ts +6 -2
  184. package/shared/fade-wrapper/fade-wrapper.js +1 -1
  185. package/shared/fade-wrapper/fade-wrapper.js.map +1 -1
  186. package/shared/fade-wrapper/types.d.ts +1 -0
  187. package/shared/styles/index.d.ts +5 -0
  188. package/skills/fds-build/SKILL.md +167 -0
  189. package/skills/fds-build/catalogue.md +181 -0
  190. package/skills/fds-build/evals/evals.json +519 -0
  191. package/skills/fds-build/resources/components/accordion.md +128 -0
  192. package/skills/fds-build/resources/components/alert.md +54 -0
  193. package/skills/fds-build/resources/components/animation.md +18 -0
  194. package/skills/fds-build/resources/components/avatar.md +10 -0
  195. package/skills/fds-build/resources/components/badge.md +18 -0
  196. package/skills/fds-build/resources/components/box-container.md +61 -0
  197. package/skills/fds-build/resources/components/breadcrumb.md +60 -0
  198. package/skills/fds-build/resources/components/button.md +74 -0
  199. package/skills/fds-build/resources/components/calendar.md +113 -0
  200. package/skills/fds-build/resources/components/card.md +43 -0
  201. package/skills/fds-build/resources/components/checkbox.md +53 -0
  202. package/skills/fds-build/resources/components/countdown-timer.md +20 -0
  203. package/skills/fds-build/resources/components/data-table.md +142 -0
  204. package/skills/fds-build/resources/components/date-navigator.md +25 -0
  205. package/skills/fds-build/resources/components/divider.md +23 -0
  206. package/skills/fds-build/resources/components/drawer.md +78 -0
  207. package/skills/fds-build/resources/components/error-display.md +137 -0
  208. package/skills/fds-build/resources/components/feedback-rating.md +61 -0
  209. package/skills/fds-build/resources/components/file-download.md +54 -0
  210. package/skills/fds-build/resources/components/file-upload.md +105 -0
  211. package/skills/fds-build/resources/components/filter.md +228 -0
  212. package/skills/fds-build/resources/components/footer.md +94 -0
  213. package/skills/fds-build/resources/components/form-date-input.md +85 -0
  214. package/skills/fds-build/resources/components/form-date-range-input.md +146 -0
  215. package/skills/fds-build/resources/components/form-e-signature.md +55 -0
  216. package/skills/fds-build/resources/components/form-input.md +65 -0
  217. package/skills/fds-build/resources/components/form-masked-input.md +69 -0
  218. package/skills/fds-build/resources/components/form-multi-select.md +100 -0
  219. package/skills/fds-build/resources/components/form-nested-multi-select.md +159 -0
  220. package/skills/fds-build/resources/components/form-nested-select.md +151 -0
  221. package/skills/fds-build/resources/components/form-otp-verification.md +175 -0
  222. package/skills/fds-build/resources/components/form-phone-number-input.md +87 -0
  223. package/skills/fds-build/resources/components/form-predictive-text-input.md +108 -0
  224. package/skills/fds-build/resources/components/form-select.md +103 -0
  225. package/skills/fds-build/resources/components/form-slider.md +116 -0
  226. package/skills/fds-build/resources/components/form-textarea.md +116 -0
  227. package/skills/fds-build/resources/components/form-time-range-picker.md +98 -0
  228. package/skills/fds-build/resources/components/form-timepicker.md +77 -0
  229. package/skills/fds-build/resources/components/form-unit-number-input.md +138 -0
  230. package/skills/fds-build/resources/components/fullscreen-image-carousel.md +159 -0
  231. package/skills/fds-build/resources/components/histogram-slider.md +41 -0
  232. package/skills/fds-build/resources/components/icon.md +167 -0
  233. package/skills/fds-build/resources/components/image-button.md +12 -0
  234. package/skills/fds-build/resources/components/input.md +51 -0
  235. package/skills/fds-build/resources/components/language-switcher.md +15 -0
  236. package/skills/fds-build/resources/components/layout.md +156 -0
  237. package/skills/fds-build/resources/components/link-list.md +120 -0
  238. package/skills/fds-build/resources/components/local-nav.md +119 -0
  239. package/skills/fds-build/resources/components/masthead.md +14 -0
  240. package/skills/fds-build/resources/components/menu.md +109 -0
  241. package/skills/fds-build/resources/components/modal.md +150 -0
  242. package/skills/fds-build/resources/components/navbar.md +270 -0
  243. package/skills/fds-build/resources/components/notification-banner.md +106 -0
  244. package/skills/fds-build/resources/components/pagination.md +104 -0
  245. package/skills/fds-build/resources/components/pill.md +55 -0
  246. package/skills/fds-build/resources/components/popover.md +80 -0
  247. package/skills/fds-build/resources/components/progress-indicator.md +47 -0
  248. package/skills/fds-build/resources/components/radio-button.md +66 -0
  249. package/skills/fds-build/resources/components/schedule.md +78 -0
  250. package/skills/fds-build/resources/components/sidenav.md +183 -0
  251. package/skills/fds-build/resources/components/singpass-button.md +14 -0
  252. package/skills/fds-build/resources/components/smart-app-banner.md +28 -0
  253. package/skills/fds-build/resources/components/tab.md +107 -0
  254. package/skills/fds-build/resources/components/table.md +65 -0
  255. package/skills/fds-build/resources/components/tag.md +68 -0
  256. package/skills/fds-build/resources/components/text-list.md +44 -0
  257. package/skills/fds-build/resources/components/time-slot-bar-week.md +66 -0
  258. package/skills/fds-build/resources/components/time-slot-bar.md +57 -0
  259. package/skills/fds-build/resources/components/time-slot-week-view.md +70 -0
  260. package/skills/fds-build/resources/components/timeline.md +69 -0
  261. package/skills/fds-build/resources/components/timetable.md +123 -0
  262. package/skills/fds-build/resources/components/toast.md +72 -0
  263. package/skills/fds-build/resources/components/toggle.md +119 -0
  264. package/skills/fds-build/resources/components/typography.md +86 -0
  265. package/skills/fds-build/resources/components/uneditable-section.md +84 -0
  266. package/skills/fds-build/resources/foundations/layout-composition-patterns.md +53 -0
  267. package/skills/fds-build/resources/foundations/tokens.md +547 -0
  268. package/skills/fds-build/resources/patterns/states.md +300 -0
  269. package/skills/fds-build/resources/setup/setup.md +202 -0
  270. package/skills/fds-build/resources/templates/form.md +427 -0
  271. package/skills/fds-build/resources/templates/listing.md +435 -0
  272. package/theme/styles/a11y-playground.css +52 -40
  273. package/theme/styles/bookingsg.css +52 -40
  274. package/theme/styles/careercompass.css +52 -40
  275. package/theme/styles/ccube.css +52 -40
  276. package/theme/styles/imda.css +52 -40
  277. package/theme/styles/lifesg.css +52 -40
  278. package/theme/styles/mylegacy.css +52 -40
  279. package/theme/styles/oneservice.css +52 -40
  280. package/theme/styles/pa.css +28 -22
  281. package/theme/styles/rbs.css +52 -40
  282. package/theme/styles/sgw-digital-lobby.css +52 -40
  283. package/theme/styles/smgs.css +52 -40
  284. package/theme/styles/spf.css +28 -27
  285. package/theme/styles/sportsg-orange.css +52 -40
  286. package/theme/styles/supportgowhere.css +52 -40
  287. package/theme/styles/tote-board.css +52 -40
  288. package/theme/styles/vica.css +52 -40
  289. package/theme/styles/websg.css +52 -40
  290. package/theme/styles/wise.css +52 -40
  291. package/theme/styles/wogaa.css +52 -40
  292. package/theme/tokens/colour.d.ts +6 -0
  293. package/theme/tokens/colour.js +1 -1
  294. package/theme/tokens/colour.js.map +1 -1
  295. package/theme/tokens/radius.d.ts +3 -0
  296. package/theme/tokens/radius.js +1 -1
  297. package/theme/tokens/radius.js.map +1 -1
  298. package/breadcrumb/breadcrumb.styles_1nl4aua.css +0 -18
  299. package/cjs/breadcrumb/breadcrumb.styles_1nl4aua.css +0 -18
  300. package/cjs/file-upload/file-item-edit.js +0 -2
  301. package/cjs/file-upload/file-item-edit.js.map +0 -1
  302. package/cjs/file-upload/file-item-edit.styles.js +0 -2
  303. package/cjs/file-upload/file-item-edit.styles.js.map +0 -1
  304. package/cjs/file-upload/file-item-edit.styles_19bvztn.css +0 -11
  305. package/cjs/file-upload/file-list/file-list.styles_1w7so98.css +0 -3
  306. package/cjs/file-upload/file-list-item/file-list-item.styles_kgtfke.css +0 -17
  307. package/cjs/local-nav/local-nav-menu/local-nav-menu.styles_pq19dh.css +0 -5
  308. package/cjs/menu/menu-content.styles_p7ijll.css +0 -2
  309. package/cjs/menu/menu-link.styles_hfxoez.css +0 -2
  310. package/cjs/menu/menu-section.styles_g7my4d.css +0 -3
  311. package/file-upload/file-item-edit.d.ts +0 -14
  312. package/file-upload/file-item-edit.js +0 -2
  313. package/file-upload/file-item-edit.js.map +0 -1
  314. package/file-upload/file-item-edit.styles.d.ts +0 -9
  315. package/file-upload/file-item-edit.styles.js +0 -2
  316. package/file-upload/file-item-edit.styles.js.map +0 -1
  317. package/file-upload/file-item-edit.styles_19bvztn.css +0 -11
  318. package/file-upload/file-list/file-list.styles_1w7so98.css +0 -3
  319. package/file-upload/file-list-item/file-list-item.styles_kgtfke.css +0 -17
  320. package/local-nav/local-nav-menu/local-nav-menu.styles_pq19dh.css +0 -5
  321. package/menu/menu-content.styles_p7ijll.css +0 -2
  322. package/menu/menu-link.styles_hfxoez.css +0 -2
  323. package/menu/menu-section.styles_g7my4d.css +0 -3
@@ -0,0 +1,435 @@
1
+ # Listing Template
2
+
3
+ Pages whose primary goal is finding, scanning, or filtering a collection of records.
4
+
5
+ ## When to use
6
+
7
+ - Search results, service directories, record indexes
8
+ - Transaction histories, application lists
9
+ - Any screen presenting multiple instances of the same entity type
10
+
11
+ Do not use for:
12
+
13
+ - A single record's detail → use `detail.md`
14
+ - A mixed overview with stats and no primary table → use `dashboard.md`
15
+
16
+ ---
17
+
18
+ ## Page anatomy
19
+
20
+ ```
21
+ Navbar
22
+ ──────────────────────────────────────────────────────────
23
+ <main>
24
+ └─ pageWrapper (padding: spacing-32 0; lg: spacing-48)
25
+ └─ Layout.Container type="grid"
26
+ └─ Layout.ColDiv xxsCols={[1, -1]}
27
+ ├─ searchRow (optional)
28
+ └─ twoColumn
29
+ ├─ filterSidebar (278px) — omit for search-only variant
30
+ ├─ Filter
31
+ └─ resultsArea (flex 1)
32
+ ├─ resultCountRow
33
+ ├─ ErrorDisplay type="no-item-found" ← empty state
34
+ ├─ Card list / DataTable
35
+ └─ paginationWrapper (centred)
36
+ ──────────────────────────────────────────────────────────
37
+ Footer
38
+ ```
39
+
40
+ On mobile the `Filter` sidebar automatically collapses into a button that opens a modal.
41
+
42
+ ---
43
+
44
+ ## Required components
45
+
46
+ | Slot | Component | Required |
47
+ | -------------- | ----------------------------------------- | -------- |
48
+ | Navigation | `Navbar` (masthead enabled) | Yes |
49
+ | Results | `Card` list/grid **or** `DataTable` | Yes |
50
+ | Result count | `Typography.BodyMD` — "X result(s) found" | Yes |
51
+ | Footer | `Footer` | Yes |
52
+ | Search bar | `Form.Input` + `Button` | No\* |
53
+ | Filter sidebar | `Filter` (~278px wide) | No\* |
54
+ | Pagination | `Pagination showFirstAndLastNav` | No |
55
+
56
+ \* Search bar and filter sidebar are individually optional but **at least one must be present**.
57
+
58
+ ---
59
+
60
+ ## CSS (ListingPage.module.css)
61
+
62
+ ```css
63
+ .pageWrapper {
64
+ padding: var(--fds-spacing-32) 0;
65
+
66
+ :global(body.fds-breakpoint-lg-min) & {
67
+ padding: var(--fds-spacing-48) 0;
68
+ }
69
+ }
70
+
71
+ .twoColumn {
72
+ display: flex;
73
+ gap: var(--fds-spacing-32);
74
+ align-items: flex-start;
75
+ }
76
+
77
+ .filterSidebar {
78
+ width: 278px;
79
+ flex-shrink: 0;
80
+ }
81
+
82
+ .resultsArea {
83
+ flex: 1;
84
+ min-width: 0;
85
+ display: flex;
86
+ flex-direction: column;
87
+ gap: var(--fds-spacing-16);
88
+ }
89
+
90
+ .searchRow {
91
+ display: flex;
92
+ gap: var(--fds-spacing-16);
93
+ align-items: flex-end;
94
+ margin-bottom: var(--fds-spacing-24);
95
+ }
96
+
97
+ .resultCountRow {
98
+ display: flex;
99
+ justify-content: space-between;
100
+ align-items: center;
101
+ }
102
+
103
+ .cardBody {
104
+ padding: var(--fds-spacing-24);
105
+ }
106
+
107
+ .paginationWrapper {
108
+ display: flex;
109
+ justify-content: center;
110
+ margin-top: var(--fds-spacing-24);
111
+ }
112
+ ```
113
+
114
+ ---
115
+
116
+ ## Rules
117
+
118
+ - Always show result count even when no filters are active — format: "X result(s) found"
119
+ - Always show `ErrorDisplay type="no-item-found"` with contextual copy when results are empty — never an empty container
120
+ - `Pagination` or lazy load — never both on the same list
121
+ - `showFirstAndLastNav` must be set on `Pagination`
122
+ - Filter sidebar width is fixed at ~278px; results area is `flex: 1`
123
+ - Inline action buttons (edit, delete) do not belong on listing cards — those go on the detail screen
124
+ - Changing `keyword`, `filters`, or `sortBy` must reset `page` to `1`
125
+
126
+ ---
127
+
128
+ ## Complete template
129
+
130
+ A single-file listing page with search, side filters, pagination, loading/error/empty states, and API stub wired in. Remove `filterSidebar` / `twoColumn` for search-only variant.
131
+
132
+ ```tsx
133
+ // ListingPage.tsx
134
+ import { useState, useEffect, useMemo } from "react";
135
+ import { Navbar } from "@lifesg/react-design-system/navbar";
136
+ import { Footer } from "@lifesg/react-design-system/footer";
137
+ import { Layout } from "@lifesg/react-design-system/layout";
138
+ import { Typography } from "@lifesg/react-design-system/typography";
139
+ import { Card } from "@lifesg/react-design-system/card";
140
+ import { Filter } from "@lifesg/react-design-system/filter";
141
+ import { RadioButton } from "@lifesg/react-design-system/radio-button";
142
+ import { Pagination } from "@lifesg/react-design-system/pagination";
143
+ import { ErrorDisplay } from "@lifesg/react-design-system/error-display";
144
+ import { Alert } from "@lifesg/react-design-system/alert";
145
+ import { Button } from "@lifesg/react-design-system/button";
146
+ import { Form } from "@lifesg/react-design-system/form";
147
+ import styles from "./ListingPage.module.css";
148
+
149
+ // ─── Types ────────────────────────────────────────────────────────────────────
150
+
151
+ interface Item {
152
+ id: string;
153
+ title: string;
154
+ description: string;
155
+ category: string;
156
+ }
157
+
158
+ interface ListingState {
159
+ keyword: string;
160
+ filters: Record<string, string[]>;
161
+ sortBy: string;
162
+ page: number;
163
+ }
164
+
165
+ // ─── Constants ────────────────────────────────────────────────────────────────
166
+
167
+ const PAGE_SIZE = 10;
168
+
169
+ const SORT_OPTIONS = [
170
+ { label: "Relevance", value: "relevance" },
171
+ { label: "Newest first", value: "newest" },
172
+ ];
173
+
174
+ const CATEGORY_OPTIONS = [
175
+ { label: "Category A", value: "a" },
176
+ { label: "Category B", value: "b" },
177
+ ];
178
+
179
+ // FIXME: replace with real seed data or remove once API is wired up
180
+ const MOCK_ITEMS: Item[] = [];
181
+
182
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
183
+
184
+ function matchesKeyword(item: Item, keyword: string): boolean {
185
+ if (!keyword.trim()) return true;
186
+ const q = keyword.toLowerCase();
187
+ return (
188
+ item.title.toLowerCase().includes(q) ||
189
+ item.description.toLowerCase().includes(q)
190
+ );
191
+ }
192
+
193
+ function matchesFilters(
194
+ item: Item,
195
+ filters: Record<string, string[]>
196
+ ): boolean {
197
+ const cats = filters.category;
198
+ if (!cats || cats.length === 0) return true;
199
+ return cats.includes(item.category);
200
+ }
201
+
202
+ function sortItems(items: Item[], sortBy: string): Item[] {
203
+ if (sortBy === "newest") return [...items].reverse();
204
+ return items;
205
+ }
206
+
207
+ // ─── Component ────────────────────────────────────────────────────────────────
208
+
209
+ export default function ListingPage() {
210
+ const [allItems, setAllItems] = useState<Item[]>(MOCK_ITEMS);
211
+ const [isLoading, setIsLoading] = useState(true);
212
+ const [fetchError, setFetchError] = useState<string | null>(null);
213
+
214
+ const [state, setState] = useState<ListingState>({
215
+ keyword: "",
216
+ filters: {},
217
+ sortBy: "relevance",
218
+ page: 1,
219
+ });
220
+
221
+ useEffect(() => {
222
+ setIsLoading(true);
223
+ setFetchError(null);
224
+ // FIXME: replace with actual API client and URL to fetch data, e.g.:
225
+ // apiClient
226
+ // .get<Item[]>("/api/v1/items")
227
+ // .then(({ data }) => setAllItems(data))
228
+ // .catch((err) => setFetchError(err.message))
229
+ // .finally(() => setIsLoading(false));
230
+ setAllItems(MOCK_ITEMS);
231
+ setIsLoading(false);
232
+ }, []);
233
+
234
+ const results = useMemo(() => {
235
+ let rows = allItems.filter(
236
+ (r) =>
237
+ matchesKeyword(r, state.keyword) &&
238
+ matchesFilters(r, state.filters)
239
+ );
240
+ return sortItems(rows, state.sortBy);
241
+ }, [allItems, state.keyword, state.filters, state.sortBy]);
242
+
243
+ const pageCount = Math.ceil(results.length / PAGE_SIZE);
244
+ const pageRows = results.slice(
245
+ (state.page - 1) * PAGE_SIZE,
246
+ state.page * PAGE_SIZE
247
+ );
248
+
249
+ function handleClear() {
250
+ setState((s) => ({ ...s, filters: {}, page: 1 }));
251
+ }
252
+
253
+ return (
254
+ <>
255
+ <Navbar masthead items={{ desktop: [] }} />
256
+ <main style={{ flex: 1 }}>
257
+ <div className={styles.pageWrapper}>
258
+ <Layout.Container type="grid">
259
+ <Layout.ColDiv xsCols={8} lgCols={12}>
260
+ {/* Search bar */}
261
+ <div className={styles.searchRow}>
262
+ <Form.Input
263
+ label="Search"
264
+ placeholder="Search by keyword"
265
+ value={state.keyword}
266
+ onChange={(e) =>
267
+ setState((s) => ({
268
+ ...s,
269
+ keyword: e.target.value,
270
+ page: 1,
271
+ }))
272
+ }
273
+ />
274
+ <Button
275
+ onClick={() =>
276
+ setState((s) => ({ ...s, page: 1 }))
277
+ }
278
+ >
279
+ Search
280
+ </Button>
281
+ </div>
282
+
283
+ {/* Loading */}
284
+ {isLoading && (
285
+ <Typography.BodyMD>
286
+ Loading...
287
+ </Typography.BodyMD>
288
+ )}
289
+
290
+ {/* Fetch error */}
291
+ {!isLoading && fetchError && (
292
+ <Alert
293
+ type="error"
294
+ actionLink={{
295
+ children: "Try again",
296
+ onClick: () => window.location.reload(),
297
+ }}
298
+ >
299
+ {fetchError}
300
+ </Alert>
301
+ )}
302
+
303
+ {/* Results */}
304
+ {!isLoading && !fetchError && (
305
+ <div className={styles.twoColumn}>
306
+ {/* Filter sidebar — omit for search-only variant */}
307
+ <div className={styles.filterSidebar}>
308
+ <Filter onClear={handleClear}>
309
+ <Filter.Item
310
+ title="Sort by"
311
+ collapsible={false}
312
+ >
313
+ {SORT_OPTIONS.map((opt) => (
314
+ <RadioButton
315
+ key={opt.value}
316
+ checked={
317
+ state.sortBy ===
318
+ opt.value
319
+ }
320
+ onChange={() =>
321
+ setState((s) => ({
322
+ ...s,
323
+ sortBy: opt.value,
324
+ page: 1,
325
+ }))
326
+ }
327
+ >
328
+ {opt.label}
329
+ </RadioButton>
330
+ ))}
331
+ </Filter.Item>
332
+ <Filter.Checkbox
333
+ title="Category"
334
+ options={CATEGORY_OPTIONS}
335
+ selected={
336
+ state.filters.category ?? []
337
+ }
338
+ onChange={(values) =>
339
+ setState((s) => ({
340
+ ...s,
341
+ page: 1,
342
+ filters: {
343
+ ...s.filters,
344
+ category: values,
345
+ },
346
+ }))
347
+ }
348
+ />
349
+ </Filter>
350
+ </div>
351
+
352
+ <div className={styles.resultsArea}>
353
+ {/* Result count */}
354
+ <div className={styles.resultCountRow}>
355
+ <Typography.BodyMD>
356
+ {results.length} result
357
+ {results.length !== 1
358
+ ? "s"
359
+ : ""} found
360
+ </Typography.BodyMD>
361
+ </div>
362
+
363
+ {/* Empty state */}
364
+ {results.length === 0 && (
365
+ <ErrorDisplay
366
+ type="no-item-found"
367
+ title="No results found"
368
+ description="Try adjusting your search or filters."
369
+ actionButton={{
370
+ children: "Clear filters",
371
+ onClick: handleClear,
372
+ }}
373
+ />
374
+ )}
375
+
376
+ {/* Card list */}
377
+ {pageRows.map((item) => (
378
+ <Card key={item.id}>
379
+ <div
380
+ className={styles.cardBody}
381
+ >
382
+ <Typography.HeadingSM>
383
+ {item.title}
384
+ </Typography.HeadingSM>
385
+ <Typography.BodyMD>
386
+ {item.description}
387
+ </Typography.BodyMD>
388
+ </div>
389
+ </Card>
390
+ ))}
391
+
392
+ {/* Pagination */}
393
+ {pageCount > 1 && (
394
+ <div
395
+ className={
396
+ styles.paginationWrapper
397
+ }
398
+ >
399
+ <Pagination
400
+ totalItems={results.length}
401
+ pageSize={PAGE_SIZE}
402
+ activePage={state.page}
403
+ onPageChange={(page) =>
404
+ setState((s) => ({
405
+ ...s,
406
+ page,
407
+ }))
408
+ }
409
+ showFirstAndLastNav
410
+ />
411
+ </div>
412
+ )}
413
+ </div>
414
+ </div>
415
+ )}
416
+ </Layout.ColDiv>
417
+ </Layout.Container>
418
+ </div>
419
+ </main>
420
+ <Footer />
421
+ </>
422
+ );
423
+ }
424
+ ```
425
+
426
+ ---
427
+
428
+ ## Anti-patterns
429
+
430
+ - Do not omit the result count
431
+ - Do not show an empty results area with no state message
432
+ - Do not use `DataTable` for citizen-facing records
433
+ - Do not use pagination AND lazy loading together
434
+ - Do not leave stale `page` values pointing past the end of a newly-filtered result set
435
+ - Do not split filtering and sorting into separate `useEffect` calls — derive from a single `useMemo`
@@ -103,6 +103,9 @@
103
103
  --fds-radius-sm: 4px;
104
104
  --fds-radius-md: 8px;
105
105
  --fds-radius-lg: 12px;
106
+ --fds-radius-xl: 16px;
107
+ --fds-radius-xxl: 24px;
108
+ --fds-radius-xxxl: 32px;
106
109
  --fds-radius-full: 9999px;
107
110
  }
108
111
 
@@ -224,6 +227,8 @@
224
227
 
225
228
  --fds-colour-text-primary-strong: var(--fds-colour-primary-40);
226
229
 
230
+ --fds-colour-text-primary-stronger: var(--fds-colour-primary-30);
231
+
227
232
  --fds-colour-text-primary-strongest: var(--fds-colour-primary-20);
228
233
 
229
234
  --fds-colour-text-brand: var(--fds-colour-brand-50);
@@ -360,6 +365,28 @@
360
365
 
361
366
  --fds-colour-bg-strongest: var(--fds-colour-neutral-90);
362
367
 
368
+ --fds-colour-bg-primary: var(--fds-colour-primary-50);
369
+
370
+ --fds-colour-bg-primary-strong: var(--fds-colour-primary-40);
371
+
372
+ --fds-colour-bg-primary-subtle: var(--fds-colour-primary-60);
373
+
374
+ --fds-colour-bg-primary-subtler: var(--fds-colour-primary-95);
375
+
376
+ --fds-colour-bg-primary-subtlest: var(--fds-colour-primary-100);
377
+
378
+ --fds-colour-bg-brand-subtler: var(--fds-colour-brand-95);
379
+
380
+ --fds-colour-bg-brand-subtlest: var(--fds-colour-brand-100);
381
+
382
+ --fds-colour-bg-secondary: var(--fds-colour-secondary-50);
383
+
384
+ --fds-colour-bg-secondary-subtle: var(--fds-colour-secondary-60);
385
+
386
+ --fds-colour-bg-secondary-subtler: var(--fds-colour-secondary-95);
387
+
388
+ --fds-colour-bg-secondary-subtlest: var(--fds-colour-secondary-100);
389
+
363
390
  --fds-colour-bg-hover: var(--fds-colour-primary-95);
364
391
 
365
392
  --fds-colour-bg-hover-strong: var(--fds-colour-primary-90);
@@ -430,24 +457,6 @@
430
457
 
431
458
  --fds-colour-bg-inverse-hover: var(--fds-colour-neutral-40);
432
459
 
433
- --fds-colour-bg-primary: var(--fds-colour-primary-50);
434
-
435
- --fds-colour-bg-primary-strong: var(--fds-colour-primary-40);
436
-
437
- --fds-colour-bg-primary-subtle: var(--fds-colour-primary-60);
438
-
439
- --fds-colour-bg-primary-subtler: var(--fds-colour-primary-95);
440
-
441
- --fds-colour-bg-primary-subtlest: var(--fds-colour-primary-100);
442
-
443
- --fds-colour-bg-secondary: var(--fds-colour-secondary-50);
444
-
445
- --fds-colour-bg-secondary-subtle: var(--fds-colour-secondary-60);
446
-
447
- --fds-colour-bg-secondary-subtler: var(--fds-colour-secondary-95);
448
-
449
- --fds-colour-bg-secondary-subtlest: var(--fds-colour-secondary-100);
450
-
451
460
  --fds-colour-bg-available: #6DD0A1;
452
461
 
453
462
  --fds-colour-bg-primary-hover: var(--fds-colour-primary-40);
@@ -653,12 +662,13 @@
653
662
  /* text */
654
663
  --fds-colour-text: var(--fds-colour-neutral-100);
655
664
  --fds-colour-text-subtle: var(--fds-colour-neutral-80);
656
- --fds-colour-text-subtler: var(--fds-colour-neutral-60);
657
- --fds-colour-text-subtlest: var(--fds-colour-neutral-50);
665
+ --fds-colour-text-subtler: var(--fds-colour-neutral-70);
666
+ --fds-colour-text-subtlest: var(--fds-colour-neutral-60);
658
667
  --fds-colour-text-primary: var(--fds-colour-primary-60);
659
668
  --fds-colour-text-primary-strong: var(--fds-colour-primary-70);
669
+ --fds-colour-text-primary-stronger: var(--fds-colour-primary-80);
660
670
  --fds-colour-text-primary-strongest: var(--fds-colour-primary-90);
661
- --fds-colour-text-brand: var(--fds-colour-brand-50);
671
+ --fds-colour-text-brand: var(--fds-colour-brand-60);
662
672
  --fds-colour-text-secondary: var(--fds-colour-secondary-60);
663
673
  --fds-colour-text-secondary-subtle: var(--fds-colour-secondary-50);
664
674
  --fds-colour-text-hover: var(--fds-colour-primary-70);
@@ -674,13 +684,13 @@
674
684
  --fds-colour-text-info: var(--fds-colour-info-70);
675
685
  --fds-colour-text-inverse: var(--fds-colour-black);
676
686
  /* icon */
677
- --fds-colour-icon: var(--fds-colour-neutral-60);
678
- --fds-colour-icon-subtle: var(--fds-colour-neutral-50);
679
- --fds-colour-icon-strongest: var(--fds-colour-neutral-90);
687
+ --fds-colour-icon: var(--fds-colour-neutral-70);
688
+ --fds-colour-icon-subtle: var(--fds-colour-neutral-60);
689
+ --fds-colour-icon-strongest: var(--fds-colour-neutral-100);
680
690
  --fds-colour-icon-primary: var(--fds-colour-primary-60);
681
691
  --fds-colour-icon-primary-subtle: var(--fds-colour-primary-50);
682
692
  --fds-colour-icon-primary-subtlest: var(--fds-colour-primary-40);
683
- --fds-colour-icon-brand: var(--fds-colour-brand-50);
693
+ --fds-colour-icon-brand: var(--fds-colour-brand-60);
684
694
  --fds-colour-icon-secondary: var(--fds-colour-secondary-60);
685
695
  --fds-colour-icon-secondary-subtle: var(--fds-colour-secondary-50);
686
696
  --fds-colour-icon-hover: var(--fds-colour-primary-70);
@@ -690,15 +700,15 @@
690
700
  --fds-colour-icon-disabled-subtle: var(--fds-colour-neutral-50);
691
701
  --fds-colour-icon-selected-disabled: var(--fds-colour-neutral-50);
692
702
  --fds-colour-icon-success: var(--fds-colour-success-60);
693
- --fds-colour-icon-warning: var(--fds-colour-warning-50);
703
+ --fds-colour-icon-warning: var(--fds-colour-warning-70);
694
704
  --fds-colour-icon-error: var(--fds-colour-error-60);
695
705
  --fds-colour-icon-error-strong: var(--fds-colour-error-70);
696
706
  --fds-colour-icon-info: var(--fds-colour-info-60);
697
707
  --fds-colour-icon-inverse: var(--fds-colour-black);
698
708
  --fds-colour-icon-primary-inverse: var(--fds-colour-primary-inverse);
699
709
  /* border - adjusted for dark mode */
700
- --fds-colour-border: var(--fds-colour-neutral-20);
701
- --fds-colour-border-strong: var(--fds-colour-neutral-40);
710
+ --fds-colour-border: var(--fds-colour-neutral-40);
711
+ --fds-colour-border-strong: var(--fds-colour-neutral-50);
702
712
  --fds-colour-border-stronger: var(--fds-colour-neutral-60);
703
713
  --fds-colour-border-primary: var(--fds-colour-primary-60);
704
714
  --fds-colour-border-primary-strong: var(--fds-colour-primary-70);
@@ -724,7 +734,18 @@
724
734
  --fds-colour-bg: var(--fds-colour-black);
725
735
  --fds-colour-bg-strong: var(--fds-colour-neutral-10);
726
736
  --fds-colour-bg-stronger: var(--fds-colour-neutral-20);
727
- --fds-colour-bg-strongest: var(--fds-colour-neutral-20);
737
+ --fds-colour-bg-strongest: var(--fds-colour-neutral-30);
738
+ --fds-colour-bg-primary: var(--fds-colour-primary-60);
739
+ --fds-colour-bg-primary-strong: var(--fds-colour-primary-70);
740
+ --fds-colour-bg-primary-subtle: var(--fds-colour-primary-50);
741
+ --fds-colour-bg-primary-subtler: var(--fds-colour-primary-20);
742
+ --fds-colour-bg-primary-subtlest: var(--fds-colour-primary-10);
743
+ --fds-colour-bg-brand-subtler: var(--fds-colour-brand-20);
744
+ --fds-colour-bg-brand-subtlest: var(--fds-colour-brand-10);
745
+ --fds-colour-bg-secondary: var(--fds-colour-secondary-60);
746
+ --fds-colour-bg-secondary-subtle: var(--fds-colour-secondary-50);
747
+ --fds-colour-bg-secondary-subtler: var(--fds-colour-secondary-20);
748
+ --fds-colour-bg-secondary-subtlest: var(--fds-colour-secondary-10);
728
749
  --fds-colour-bg-hover: var(--fds-colour-primary-20);
729
750
  --fds-colour-bg-hover-strong: var(--fds-colour-primary-20);
730
751
  --fds-colour-bg-hover-subtle: var(--fds-colour-primary-10);
@@ -745,8 +766,8 @@
745
766
  --fds-colour-bg-success-strong-hover: var(--fds-colour-success-70);
746
767
  --fds-colour-bg-warning: var(--fds-colour-warning-10);
747
768
  --fds-colour-bg-warning-hover: var(--fds-colour-warning-20);
748
- --fds-colour-bg-warning-strong: var(--fds-colour-warning-60);
749
- --fds-colour-bg-warning-strong-hover: var(--fds-colour-warning-70);
769
+ --fds-colour-bg-warning-strong: var(--fds-colour-warning-70);
770
+ --fds-colour-bg-warning-strong-hover: var(--fds-colour-warning-80);
750
771
  --fds-colour-bg-info: var(--fds-colour-info-10);
751
772
  --fds-colour-bg-info-hover: var(--fds-colour-info-20);
752
773
  --fds-colour-bg-info-strong: var(--fds-colour-info-60);
@@ -760,16 +781,7 @@
760
781
  --fds-colour-bg-inverse-subtler: var(--fds-colour-neutral-60);
761
782
  --fds-colour-bg-inverse-subtlest: var(--fds-colour-neutral-50);
762
783
  --fds-colour-bg-inverse-hover: var(--fds-colour-neutral-70);
763
- --fds-colour-bg-primary: var(--fds-colour-primary-60);
764
- --fds-colour-bg-primary-strong: var(--fds-colour-primary-70);
765
- --fds-colour-bg-primary-subtle: var(--fds-colour-primary-50);
766
- --fds-colour-bg-primary-subtler: var(--fds-colour-primary-20);
767
- --fds-colour-bg-primary-subtlest: var(--fds-colour-primary-10);
768
784
  --fds-colour-bg-available: #185339;
769
- --fds-colour-bg-secondary: var(--fds-colour-secondary-60);
770
- --fds-colour-bg-secondary-subtle: var(--fds-colour-secondary-50);
771
- --fds-colour-bg-secondary-subtler: var(--fds-colour-secondary-20);
772
- --fds-colour-bg-secondary-subtlest: var(--fds-colour-secondary-10);
773
785
  --fds-colour-bg-primary-hover: var(--fds-colour-primary-70);
774
786
  --fds-colour-bg-primary-strong-hover: var(--fds-colour-primary-80);
775
787
  --fds-colour-bg-primary-subtlest-hover: var(--fds-colour-primary-20);