@govtechsg/sgds-web-component 3.0.0-rc.1 → 3.0.0-rc.2

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 (478) hide show
  1. package/README.md +5 -5
  2. package/base/button.js +1 -1
  3. package/base/form-control-element.d.ts +4 -11
  4. package/base/form-control-element.js +13 -23
  5. package/base/form-control-element.js.map +1 -1
  6. package/components/Accordion/accordion-item.js +1 -1
  7. package/components/Accordion/index.umd.js +7 -19
  8. package/components/Accordion/index.umd.js.map +1 -1
  9. package/components/Accordion/sgds-accordion-item.d.ts +3 -7
  10. package/components/Accordion/sgds-accordion-item.js +6 -18
  11. package/components/Accordion/sgds-accordion-item.js.map +1 -1
  12. package/components/ActionCard/index.umd.js +407 -329
  13. package/components/ActionCard/index.umd.js.map +1 -1
  14. package/components/Alert/alert.js +1 -1
  15. package/components/Alert/index.umd.js +553 -485
  16. package/components/Alert/index.umd.js.map +1 -1
  17. package/components/Alert/sgds-alert.d.ts +2 -2
  18. package/components/Alert/sgds-alert.js +6 -13
  19. package/components/Alert/sgds-alert.js.map +1 -1
  20. package/components/Badge/badge.js +1 -1
  21. package/components/Badge/index.umd.js +8 -9
  22. package/components/Badge/index.umd.js.map +1 -1
  23. package/components/Badge/sgds-badge.d.ts +4 -5
  24. package/components/Badge/sgds-badge.js +5 -6
  25. package/components/Badge/sgds-badge.js.map +1 -1
  26. package/components/Button/index.umd.js +8 -81
  27. package/components/Button/index.umd.js.map +1 -1
  28. package/components/Button/sgds-button.js +1 -1
  29. package/components/Button/sgds-button.js.map +1 -1
  30. package/components/Checkbox/checkbox.js +1 -1
  31. package/components/Checkbox/index.umd.js +541 -475
  32. package/components/Checkbox/index.umd.js.map +1 -1
  33. package/components/Checkbox/sgds-checkbox-group.d.ts +7 -1
  34. package/components/Checkbox/sgds-checkbox-group.js +15 -4
  35. package/components/Checkbox/sgds-checkbox-group.js.map +1 -1
  36. package/components/Checkbox/sgds-checkbox.d.ts +30 -21
  37. package/components/Checkbox/sgds-checkbox.js +77 -60
  38. package/components/Checkbox/sgds-checkbox.js.map +1 -1
  39. package/components/ComboBox/index.umd.js +385 -216
  40. package/components/ComboBox/index.umd.js.map +1 -1
  41. package/components/Datepicker/datepicker-input.d.ts +4 -2
  42. package/components/Datepicker/datepicker-input.js +24 -7
  43. package/components/Datepicker/datepicker-input.js.map +1 -1
  44. package/components/Datepicker/index.umd.js +433 -244
  45. package/components/Datepicker/index.umd.js.map +1 -1
  46. package/components/Datepicker/sgds-datepicker.d.ts +1 -1
  47. package/components/Datepicker/sgds-datepicker.js.map +1 -1
  48. package/components/Drawer/index.umd.js +2 -2
  49. package/components/Drawer/index.umd.js.map +1 -1
  50. package/components/Dropdown/index.umd.js +8 -81
  51. package/components/Dropdown/index.umd.js.map +1 -1
  52. package/components/FileUpload/file-upload.js +1 -1
  53. package/components/FileUpload/index.umd.js +579 -272
  54. package/components/FileUpload/index.umd.js.map +1 -1
  55. package/components/FileUpload/sgds-file-upload.d.ts +42 -30
  56. package/components/FileUpload/sgds-file-upload.js +147 -103
  57. package/components/FileUpload/sgds-file-upload.js.map +1 -1
  58. package/components/Footer/footer-item.js +6 -0
  59. package/components/Footer/footer-item.js.map +1 -0
  60. package/components/Footer/footer.js +1 -1
  61. package/components/Footer/index.d.ts +2 -0
  62. package/components/Footer/index.js +2 -0
  63. package/components/Footer/index.js.map +1 -1
  64. package/components/Footer/index.umd.js +93 -94
  65. package/components/Footer/index.umd.js.map +1 -1
  66. package/components/Footer/sgds-footer-item.d.ts +13 -0
  67. package/components/Footer/sgds-footer-item.js +27 -0
  68. package/components/Footer/sgds-footer-item.js.map +1 -0
  69. package/components/Footer/sgds-footer.d.ts +9 -30
  70. package/components/Footer/sgds-footer.js +65 -90
  71. package/components/Footer/sgds-footer.js.map +1 -1
  72. package/components/Icon/icon.js +6 -0
  73. package/components/Icon/icon.js.map +1 -0
  74. package/components/Icon/index.d.ts +6 -0
  75. package/components/Icon/index.js +4 -0
  76. package/components/Icon/index.js.map +1 -0
  77. package/components/Icon/index.umd.js +4389 -0
  78. package/components/Icon/index.umd.js.map +1 -0
  79. package/components/Icon/sgds-icon.d.ts +21 -0
  80. package/components/Icon/sgds-icon.js +64 -0
  81. package/components/Icon/sgds-icon.js.map +1 -0
  82. package/components/IconButton/icon-button.js +1 -1
  83. package/components/IconButton/index.umd.js +6 -9
  84. package/components/IconButton/index.umd.js.map +1 -1
  85. package/components/IconButton/sgds-icon-button.d.ts +2 -2
  86. package/components/IconButton/sgds-icon-button.js +4 -9
  87. package/components/IconButton/sgds-icon-button.js.map +1 -1
  88. package/components/Input/index.umd.js +1734 -1376
  89. package/components/Input/index.umd.js.map +1 -1
  90. package/components/Input/sgds-input.d.ts +41 -21
  91. package/components/Input/sgds-input.js +103 -66
  92. package/components/Input/sgds-input.js.map +1 -1
  93. package/components/Modal/index.umd.js +2 -2
  94. package/components/Modal/index.umd.js.map +1 -1
  95. package/components/QuantityToggle/index.umd.js +894 -316
  96. package/components/QuantityToggle/index.umd.js.map +1 -1
  97. package/components/QuantityToggle/sgds-quantity-toggle.d.ts +42 -15
  98. package/components/QuantityToggle/sgds-quantity-toggle.js +129 -62
  99. package/components/QuantityToggle/sgds-quantity-toggle.js.map +1 -1
  100. package/components/Radio/index.umd.js +516 -203
  101. package/components/Radio/index.umd.js.map +1 -1
  102. package/components/Radio/sgds-radio-group.d.ts +38 -27
  103. package/components/Radio/sgds-radio-group.js +100 -84
  104. package/components/Radio/sgds-radio-group.js.map +1 -1
  105. package/components/Radio/sgds-radio.js +1 -1
  106. package/components/Radio/sgds-radio.js.map +1 -1
  107. package/components/Stepper/index.umd.js +1 -0
  108. package/components/Stepper/index.umd.js.map +1 -1
  109. package/components/Stepper/sgds-stepper.d.ts +1 -0
  110. package/components/Stepper/sgds-stepper.js +1 -0
  111. package/components/Stepper/sgds-stepper.js.map +1 -1
  112. package/components/Switch/index.umd.js +21 -321
  113. package/components/Switch/index.umd.js.map +1 -1
  114. package/components/Switch/sgds-switch.js +1 -2
  115. package/components/Switch/sgds-switch.js.map +1 -1
  116. package/components/Textarea/index.umd.js +1554 -1336
  117. package/components/Textarea/index.umd.js.map +1 -1
  118. package/components/Textarea/sgds-textarea.d.ts +33 -22
  119. package/components/Textarea/sgds-textarea.js +78 -75
  120. package/components/Textarea/sgds-textarea.js.map +1 -1
  121. package/components/Textarea/textarea.js +1 -1
  122. package/components/Toast/index.umd.js +9 -21
  123. package/components/Toast/index.umd.js.map +1 -1
  124. package/components/Toast/sgds-toast.d.ts +2 -1
  125. package/components/Toast/sgds-toast.js +6 -18
  126. package/components/Toast/sgds-toast.js.map +1 -1
  127. package/components/Toast/toast.js +1 -1
  128. package/components/Tooltip/index.umd.js +14 -14
  129. package/components/Tooltip/index.umd.js.map +1 -1
  130. package/components/Tooltip/sgds-tooltip.d.ts +4 -7
  131. package/components/Tooltip/sgds-tooltip.js +14 -14
  132. package/components/Tooltip/sgds-tooltip.js.map +1 -1
  133. package/components/index.d.ts +1 -0
  134. package/components/index.js +1 -0
  135. package/components/index.js.map +1 -1
  136. package/components/index.umd.js +1318 -1124
  137. package/components/index.umd.js.map +1 -1
  138. package/icons/arrow-bar-down.svg +3 -0
  139. package/icons/arrow-bar-left.svg +3 -0
  140. package/icons/arrow-bar-right.svg +3 -0
  141. package/icons/arrow-bar-up.svg +3 -0
  142. package/icons/arrow-clockwise.svg +3 -0
  143. package/icons/arrow-down.svg +3 -0
  144. package/icons/arrow-left.svg +3 -0
  145. package/icons/arrow-repeat.svg +3 -0
  146. package/icons/arrow-right.svg +3 -0
  147. package/icons/arrow-up.svg +3 -0
  148. package/icons/bank-fill.svg +3 -0
  149. package/icons/bell-slash.svg +3 -0
  150. package/icons/bell.svg +3 -0
  151. package/icons/bi-funnel.svg +3 -0
  152. package/icons/bookmark-fill.svg +3 -0
  153. package/icons/bookmark.svg +3 -0
  154. package/icons/box-arrow-up-right.svg +3 -0
  155. package/icons/box-seam.svg +3 -0
  156. package/icons/building.svg +3 -0
  157. package/icons/calculator.svg +3 -0
  158. package/icons/calendar-check.svg +4 -0
  159. package/icons/calendar-x.svg +4 -0
  160. package/icons/calendar.svg +3 -0
  161. package/icons/camera.svg +3 -0
  162. package/icons/chat-left-text.svg +3 -0
  163. package/icons/check-circle-fill.svg +3 -0
  164. package/icons/check-circle.svg +3 -0
  165. package/icons/check.svg +3 -0
  166. package/icons/chevron-down.svg +3 -0
  167. package/icons/chevron-left.svg +3 -0
  168. package/icons/chevron-right.svg +3 -0
  169. package/icons/chevron-up .svg +3 -0
  170. package/icons/clock.svg +4 -0
  171. package/icons/cloud-check.svg +4 -0
  172. package/icons/cloud-download.svg +3 -0
  173. package/icons/cloud-upload.svg +3 -0
  174. package/icons/cloud.svg +3 -0
  175. package/icons/compass.svg +4 -0
  176. package/icons/cross.svg +3 -0
  177. package/icons/cursor-fill.svg +3 -0
  178. package/icons/cursor.svg +3 -0
  179. package/icons/dash-circle.svg +3 -0
  180. package/icons/dash-square.svg +3 -0
  181. package/icons/dash.svg +3 -0
  182. package/icons/download.svg +3 -0
  183. package/icons/exclamation-circle-fill.svg +3 -0
  184. package/icons/exclamation-circle.svg +4 -0
  185. package/icons/exclamation-triangle-fill.svg +3 -0
  186. package/icons/exclamation-triangle.svg +4 -0
  187. package/icons/exclamation.svg +4 -0
  188. package/icons/eye-fill.svg +3 -0
  189. package/icons/eye-slash-fill.svg +4 -0
  190. package/icons/eye-slash.svg +3 -0
  191. package/icons/eye.svg +3 -0
  192. package/icons/facebook.svg +3 -0
  193. package/icons/file-earmark-text.svg +3 -0
  194. package/icons/file-pdf.svg +4 -0
  195. package/icons/file-plus.svg +4 -0
  196. package/icons/file-text.svg +3 -0
  197. package/icons/file.svg +3 -0
  198. package/icons/files.svg +4 -0
  199. package/icons/folder-check.svg +4 -0
  200. package/icons/folder-minus.svg +4 -0
  201. package/icons/folder-plus.svg +4 -0
  202. package/icons/folder.svg +3 -0
  203. package/icons/gear.svg +3 -0
  204. package/icons/geo-alt.svg +4 -0
  205. package/icons/geo-fill.svg +4 -0
  206. package/icons/geo.svg +4 -0
  207. package/icons/google.svg +3 -0
  208. package/icons/grid-fill.svg +3 -0
  209. package/icons/hand-thumbs-down.svg +3 -0
  210. package/icons/hand-thumbs-up.svg +3 -0
  211. package/icons/hdd.svg +3 -0
  212. package/icons/house-door.svg +3 -0
  213. package/icons/house.svg +3 -0
  214. package/icons/image.svg +3 -0
  215. package/icons/inbox.svg +3 -0
  216. package/icons/info-circle-fill.svg +3 -0
  217. package/icons/info-circle.svg +4 -0
  218. package/icons/instagram.svg +3 -0
  219. package/icons/layers.svg +3 -0
  220. package/icons/layout-text-window-reverse.svg +3 -0
  221. package/icons/layout-text-window.svg +3 -0
  222. package/icons/layout.svg +3 -0
  223. package/icons/link.svg +3 -0
  224. package/icons/linkedin.svg +3 -0
  225. package/icons/list.svg +3 -0
  226. package/icons/lock-fill.svg +3 -0
  227. package/icons/lock.svg +3 -0
  228. package/icons/mail.svg +3 -0
  229. package/icons/map.svg +3 -0
  230. package/icons/paperclip.svg +3 -0
  231. package/icons/pencil.svg +3 -0
  232. package/icons/pending-circle.svg +3 -0
  233. package/icons/person-dash.svg +3 -0
  234. package/icons/person-plus.svg +3 -0
  235. package/icons/person-x.svg +3 -0
  236. package/icons/person.svg +3 -0
  237. package/icons/pin-map-fill.svg +3 -0
  238. package/icons/pin.svg +3 -0
  239. package/icons/placeholder.svg +3 -0
  240. package/icons/plus-circle.svg +3 -0
  241. package/icons/plus-square.svg +3 -0
  242. package/icons/plus.svg +3 -0
  243. package/icons/printer.svg +3 -0
  244. package/icons/question-circle.svg +4 -0
  245. package/icons/save.svg +3 -0
  246. package/icons/search.svg +3 -0
  247. package/icons/share.svg +3 -0
  248. package/icons/slash-circle.svg +3 -0
  249. package/icons/sliders.svg +3 -0
  250. package/icons/speedometer.svg +3 -0
  251. package/icons/star-fill.svg +3 -0
  252. package/icons/star.svg +3 -0
  253. package/icons/stoplights.svg +4 -0
  254. package/icons/telephone.svg +3 -0
  255. package/icons/three-dots-vertical.svg +3 -0
  256. package/icons/three-dots.svg +3 -0
  257. package/icons/toggle-off.svg +3 -0
  258. package/icons/toggle-on.svg +3 -0
  259. package/icons/trash.svg +3 -0
  260. package/icons/twitter-x.svg +3 -0
  261. package/icons/unlock.svg +3 -0
  262. package/icons/upload.svg +3 -0
  263. package/icons/window-dash.svg +4 -0
  264. package/icons/window-desktop.svg +4 -0
  265. package/icons/window-dock.svg +4 -0
  266. package/icons/window-fullscreen.svg +3 -0
  267. package/icons/window-plus.svg +4 -0
  268. package/icons/window-sidebar.svg +3 -0
  269. package/icons/window-split.svg +3 -0
  270. package/icons/window-stack.svg +3 -0
  271. package/icons/window-x.svg +4 -0
  272. package/icons/window.svg +3 -0
  273. package/icons/x-circle-fill.svg +3 -0
  274. package/icons/x-circle.svg +3 -0
  275. package/icons/youtube.svg +3 -0
  276. package/icons/zoom-in.svg +3 -0
  277. package/icons/zoom-out.svg +3 -0
  278. package/index.d.ts +1 -0
  279. package/index.js +1 -0
  280. package/index.js.map +1 -1
  281. package/index.umd.js +1338 -1119
  282. package/index.umd.js.map +1 -1
  283. package/internals/CloseButton/close-button.js +1 -1
  284. package/internals/CloseButton/sgds-close-button.js +1 -1
  285. package/internals/CloseButton/sgds-close-button.js.map +1 -1
  286. package/package.json +1 -1
  287. package/react/base/button.cjs.js +1 -1
  288. package/react/base/button.js +1 -1
  289. package/react/base/form-control-element.cjs.js +13 -23
  290. package/react/base/form-control-element.cjs.js.map +1 -1
  291. package/react/base/form-control-element.js +13 -23
  292. package/react/base/form-control-element.js.map +1 -1
  293. package/react/checkbox/index.cjs.js +2 -0
  294. package/react/checkbox/index.cjs.js.map +1 -1
  295. package/react/checkbox/index.d.ts +2 -0
  296. package/react/checkbox/index.js +2 -0
  297. package/react/checkbox/index.js.map +1 -1
  298. package/react/components/Accordion/accordion-item.cjs.js +1 -1
  299. package/react/components/Accordion/accordion-item.js +1 -1
  300. package/react/components/Accordion/sgds-accordion-item.cjs.js +6 -18
  301. package/react/components/Accordion/sgds-accordion-item.cjs.js.map +1 -1
  302. package/react/components/Accordion/sgds-accordion-item.js +6 -18
  303. package/react/components/Accordion/sgds-accordion-item.js.map +1 -1
  304. package/react/components/Alert/alert.cjs.js +1 -1
  305. package/react/components/Alert/alert.js +1 -1
  306. package/react/components/Alert/sgds-alert.cjs.js +5 -12
  307. package/react/components/Alert/sgds-alert.cjs.js.map +1 -1
  308. package/react/components/Alert/sgds-alert.js +6 -13
  309. package/react/components/Alert/sgds-alert.js.map +1 -1
  310. package/react/components/Badge/badge.cjs.js +1 -1
  311. package/react/components/Badge/badge.js +1 -1
  312. package/react/components/Badge/sgds-badge.cjs.js +5 -6
  313. package/react/components/Badge/sgds-badge.cjs.js.map +1 -1
  314. package/react/components/Badge/sgds-badge.js +5 -6
  315. package/react/components/Badge/sgds-badge.js.map +1 -1
  316. package/react/components/Button/sgds-button.cjs.js +2 -2
  317. package/react/components/Button/sgds-button.cjs.js.map +1 -1
  318. package/react/components/Button/sgds-button.js +1 -1
  319. package/react/components/Button/sgds-button.js.map +1 -1
  320. package/react/components/Checkbox/checkbox.cjs.js +1 -1
  321. package/react/components/Checkbox/checkbox.js +1 -1
  322. package/react/components/Checkbox/sgds-checkbox-group.cjs.js +15 -4
  323. package/react/components/Checkbox/sgds-checkbox-group.cjs.js.map +1 -1
  324. package/react/components/Checkbox/sgds-checkbox-group.js +15 -4
  325. package/react/components/Checkbox/sgds-checkbox-group.js.map +1 -1
  326. package/react/components/Checkbox/sgds-checkbox.cjs.js +77 -60
  327. package/react/components/Checkbox/sgds-checkbox.cjs.js.map +1 -1
  328. package/react/components/Checkbox/sgds-checkbox.js +77 -60
  329. package/react/components/Checkbox/sgds-checkbox.js.map +1 -1
  330. package/react/components/Datepicker/datepicker-input.cjs.js +24 -7
  331. package/react/components/Datepicker/datepicker-input.cjs.js.map +1 -1
  332. package/react/components/Datepicker/datepicker-input.js +24 -7
  333. package/react/components/Datepicker/datepicker-input.js.map +1 -1
  334. package/react/components/Datepicker/sgds-datepicker.cjs.js.map +1 -1
  335. package/react/components/Datepicker/sgds-datepicker.js.map +1 -1
  336. package/react/components/FileUpload/file-upload.cjs.js +1 -1
  337. package/react/components/FileUpload/file-upload.js +1 -1
  338. package/react/components/FileUpload/sgds-file-upload.cjs.js +145 -101
  339. package/react/components/FileUpload/sgds-file-upload.cjs.js.map +1 -1
  340. package/react/components/FileUpload/sgds-file-upload.js +147 -103
  341. package/react/components/FileUpload/sgds-file-upload.js.map +1 -1
  342. package/react/components/Footer/footer-item.cjs.js +11 -0
  343. package/react/components/Footer/footer-item.cjs.js.map +1 -0
  344. package/react/components/Footer/footer-item.js +7 -0
  345. package/react/components/Footer/footer-item.js.map +1 -0
  346. package/react/components/Footer/footer.cjs.js +1 -1
  347. package/react/components/Footer/footer.js +1 -1
  348. package/react/components/Footer/sgds-footer-item.cjs.js +33 -0
  349. package/react/components/Footer/sgds-footer-item.cjs.js.map +1 -0
  350. package/react/components/Footer/sgds-footer-item.js +28 -0
  351. package/react/components/Footer/sgds-footer-item.js.map +1 -0
  352. package/react/components/Footer/sgds-footer.cjs.js +65 -90
  353. package/react/components/Footer/sgds-footer.cjs.js.map +1 -1
  354. package/react/components/Footer/sgds-footer.js +65 -90
  355. package/react/components/Footer/sgds-footer.js.map +1 -1
  356. package/react/components/Icon/icon.cjs.js +11 -0
  357. package/react/components/Icon/icon.cjs.js.map +1 -0
  358. package/react/components/Icon/icon.js +7 -0
  359. package/react/components/Icon/icon.js.map +1 -0
  360. package/react/components/Icon/sgds-icon.cjs.js +70 -0
  361. package/react/components/Icon/sgds-icon.cjs.js.map +1 -0
  362. package/react/components/Icon/sgds-icon.js +65 -0
  363. package/react/components/Icon/sgds-icon.js.map +1 -0
  364. package/react/components/IconButton/icon-button.cjs.js +1 -1
  365. package/react/components/IconButton/icon-button.js +1 -1
  366. package/react/components/IconButton/sgds-icon-button.cjs.js +4 -9
  367. package/react/components/IconButton/sgds-icon-button.cjs.js.map +1 -1
  368. package/react/components/IconButton/sgds-icon-button.js +4 -9
  369. package/react/components/IconButton/sgds-icon-button.js.map +1 -1
  370. package/react/components/Input/sgds-input.cjs.js +101 -64
  371. package/react/components/Input/sgds-input.cjs.js.map +1 -1
  372. package/react/components/Input/sgds-input.js +103 -66
  373. package/react/components/Input/sgds-input.js.map +1 -1
  374. package/react/components/QuantityToggle/sgds-quantity-toggle.cjs.js +128 -61
  375. package/react/components/QuantityToggle/sgds-quantity-toggle.cjs.js.map +1 -1
  376. package/react/components/QuantityToggle/sgds-quantity-toggle.js +129 -62
  377. package/react/components/QuantityToggle/sgds-quantity-toggle.js.map +1 -1
  378. package/react/components/Radio/sgds-radio-group.cjs.js +99 -83
  379. package/react/components/Radio/sgds-radio-group.cjs.js.map +1 -1
  380. package/react/components/Radio/sgds-radio-group.js +100 -84
  381. package/react/components/Radio/sgds-radio-group.js.map +1 -1
  382. package/react/components/Radio/sgds-radio.cjs.js +1 -1
  383. package/react/components/Radio/sgds-radio.cjs.js.map +1 -1
  384. package/react/components/Radio/sgds-radio.js +1 -1
  385. package/react/components/Radio/sgds-radio.js.map +1 -1
  386. package/react/components/Stepper/sgds-stepper.cjs.js +1 -0
  387. package/react/components/Stepper/sgds-stepper.cjs.js.map +1 -1
  388. package/react/components/Stepper/sgds-stepper.js +1 -0
  389. package/react/components/Stepper/sgds-stepper.js.map +1 -1
  390. package/react/components/Switch/sgds-switch.cjs.js +1 -2
  391. package/react/components/Switch/sgds-switch.cjs.js.map +1 -1
  392. package/react/components/Switch/sgds-switch.js +1 -2
  393. package/react/components/Switch/sgds-switch.js.map +1 -1
  394. package/react/components/Textarea/sgds-textarea.cjs.js +76 -73
  395. package/react/components/Textarea/sgds-textarea.cjs.js.map +1 -1
  396. package/react/components/Textarea/sgds-textarea.js +78 -75
  397. package/react/components/Textarea/sgds-textarea.js.map +1 -1
  398. package/react/components/Textarea/textarea.cjs.js +1 -1
  399. package/react/components/Textarea/textarea.js +1 -1
  400. package/react/components/Toast/sgds-toast.cjs.js +6 -18
  401. package/react/components/Toast/sgds-toast.cjs.js.map +1 -1
  402. package/react/components/Toast/sgds-toast.js +6 -18
  403. package/react/components/Toast/sgds-toast.js.map +1 -1
  404. package/react/components/Toast/toast.cjs.js +1 -1
  405. package/react/components/Toast/toast.js +1 -1
  406. package/react/components/Tooltip/sgds-tooltip.cjs.js +14 -14
  407. package/react/components/Tooltip/sgds-tooltip.cjs.js.map +1 -1
  408. package/react/components/Tooltip/sgds-tooltip.js +14 -14
  409. package/react/components/Tooltip/sgds-tooltip.js.map +1 -1
  410. package/react/footer-item/index.cjs.js +39 -0
  411. package/react/footer-item/index.cjs.js.map +1 -0
  412. package/react/footer-item/index.d.ts +3 -0
  413. package/react/footer-item/index.js +15 -0
  414. package/react/footer-item/index.js.map +1 -0
  415. package/react/icon/index.cjs.js +42 -0
  416. package/react/icon/index.cjs.js.map +1 -0
  417. package/react/icon/index.d.ts +6 -0
  418. package/react/icon/index.js +18 -0
  419. package/react/icon/index.js.map +1 -0
  420. package/react/index.cjs.js +64 -60
  421. package/react/index.cjs.js.map +1 -1
  422. package/react/index.d.ts +2 -0
  423. package/react/index.js +2 -0
  424. package/react/index.js.map +1 -1
  425. package/react/input/index.cjs.js +3 -1
  426. package/react/input/index.cjs.js.map +1 -1
  427. package/react/input/index.d.ts +2 -0
  428. package/react/input/index.js +3 -1
  429. package/react/input/index.js.map +1 -1
  430. package/react/internals/CloseButton/close-button.cjs.js +1 -1
  431. package/react/internals/CloseButton/close-button.js +1 -1
  432. package/react/internals/CloseButton/sgds-close-button.cjs.js +1 -1
  433. package/react/internals/CloseButton/sgds-close-button.cjs.js.map +1 -1
  434. package/react/internals/CloseButton/sgds-close-button.js +1 -1
  435. package/react/internals/CloseButton/sgds-close-button.js.map +1 -1
  436. package/react/styles/form-hint.cjs.js +1 -1
  437. package/react/styles/form-hint.js +1 -1
  438. package/react/styles/form-label.cjs.js +1 -1
  439. package/react/styles/form-label.js +1 -1
  440. package/react/utils/formSubmitController.cjs.js +64 -0
  441. package/react/utils/formSubmitController.cjs.js.map +1 -0
  442. package/react/utils/formSubmitController.js +60 -0
  443. package/react/utils/formSubmitController.js.map +1 -0
  444. package/react/utils/inputValidationController.cjs.js +130 -0
  445. package/react/utils/inputValidationController.cjs.js.map +1 -0
  446. package/react/utils/inputValidationController.js +126 -0
  447. package/react/utils/inputValidationController.js.map +1 -0
  448. package/react/utils/validatorMixin.cjs.js +108 -0
  449. package/react/utils/validatorMixin.cjs.js.map +1 -0
  450. package/react/utils/validatorMixin.js +104 -0
  451. package/react/utils/validatorMixin.js.map +1 -0
  452. package/styles/form-hint.js +1 -1
  453. package/styles/form-label.js +1 -1
  454. package/themes/day.css +1 -1
  455. package/themes/night.css +3 -2
  456. package/themes/root.css +1 -0
  457. package/utils/{form.d.ts → formSubmitController.d.ts} +10 -20
  458. package/utils/formSubmitController.js +59 -0
  459. package/utils/formSubmitController.js.map +1 -0
  460. package/utils/inputValidationController.d.ts +70 -0
  461. package/utils/inputValidationController.js +125 -0
  462. package/utils/inputValidationController.js.map +1 -0
  463. package/utils/validatorMixin.d.ts +24 -0
  464. package/utils/validatorMixin.js +103 -0
  465. package/utils/validatorMixin.js.map +1 -0
  466. package/base/form-check-element.d.ts +0 -50
  467. package/base/form-check-element.js +0 -169
  468. package/base/form-check-element.js.map +0 -1
  469. package/react/base/form-check-element.cjs.js +0 -175
  470. package/react/base/form-check-element.cjs.js.map +0 -1
  471. package/react/base/form-check-element.js +0 -170
  472. package/react/base/form-check-element.js.map +0 -1
  473. package/react/utils/form.cjs.js +0 -137
  474. package/react/utils/form.cjs.js.map +0 -1
  475. package/react/utils/form.js +0 -133
  476. package/react/utils/form.js.map +0 -1
  477. package/utils/form.js +0 -132
  478. package/utils/form.js.map +0 -1
@@ -4498,6 +4498,59 @@
4498
4498
  });
4499
4499
  }
4500
4500
 
4501
+ /**
4502
+ * @license
4503
+ * Copyright 2017 Google LLC
4504
+ * SPDX-License-Identifier: BSD-3-Clause
4505
+ */
4506
+ // Note, in the future, we may extend this decorator to support the use case
4507
+ // where the queried element may need to do work to become ready to interact
4508
+ // with (e.g. load some implementation code). If so, we might elect to
4509
+ // add a second argument defining a function that can be run to make the
4510
+ // queried element loaded/updated/ready.
4511
+ /**
4512
+ * A property decorator that converts a class property into a getter that
4513
+ * returns a promise that resolves to the result of a querySelector on the
4514
+ * element's renderRoot done after the element's `updateComplete` promise
4515
+ * resolves. When the queried property may change with element state, this
4516
+ * decorator can be used instead of requiring users to await the
4517
+ * `updateComplete` before accessing the property.
4518
+ *
4519
+ * @param selector A DOMString containing one or more selectors to match.
4520
+ *
4521
+ * See: https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelector
4522
+ *
4523
+ * ```ts
4524
+ * class MyElement {
4525
+ * @queryAsync('#first')
4526
+ * first: Promise<HTMLDivElement>;
4527
+ *
4528
+ * render() {
4529
+ * return html`
4530
+ * <div id="first"></div>
4531
+ * <div id="second"></div>
4532
+ * `;
4533
+ * }
4534
+ * }
4535
+ *
4536
+ * // external usage
4537
+ * async doSomethingWithFirst() {
4538
+ * (await aMyElement.first).doSomething();
4539
+ * }
4540
+ * ```
4541
+ * @category Decorator
4542
+ */
4543
+ function queryAsync(selector) {
4544
+ return ((obj, name) => {
4545
+ return desc(obj, name, {
4546
+ async get() {
4547
+ await this.updateComplete;
4548
+ return this.renderRoot?.querySelector(selector) ?? null;
4549
+ },
4550
+ });
4551
+ });
4552
+ }
4553
+
4501
4554
  /**
4502
4555
  * @license
4503
4556
  * Copyright 2020 Google LLC
@@ -8201,7 +8254,7 @@
8201
8254
  }
8202
8255
  SgdsElement.styles = [css_248z$a];
8203
8256
 
8204
- function genId (componentName = "", elementName = "") {
8257
+ function generateId (componentName = "", elementName = "") {
8205
8258
  return `id-${Math.random().toString().substring(2, 6)}-sgds-${componentName}-${elementName}`;
8206
8259
  }
8207
8260
 
@@ -8223,7 +8276,7 @@
8223
8276
  /** @internal */
8224
8277
  this.bsDropdown = null;
8225
8278
  /** @internal Unique id generated for the dropdown menu */
8226
- this.dropdownMenuId = genId("dropdown-menu", "div");
8279
+ this.dropdownMenuId = generateId("dropdown-menu", "div");
8227
8280
  /** @internal Controls auto-flipping of menu */
8228
8281
  this.noFlip = false;
8229
8282
  /** @internal When true, aligns right edge of menu with right edge of button */
@@ -8997,9 +9050,9 @@
8997
9050
 
8998
9051
  var css_248z$8 = css`.invalid-feedback-container{display:flex;gap:var(--sgds-form-gap-sm)}.invalid-feedback{color:var(--sgds-form-danger-color);font-size:var(--sgds-font-size-1);font-weight:var(--sgds-font-weight-regular)}`;
8999
9052
 
9000
- var css_248z$7 = css`.form-text{color:var(--sgds-form-color-subtle);font-size:var(--sgds-font-size-1)}`;
9053
+ var css_248z$7 = css`.form-text{color:var(--sgds-form-color-subtle);font-size:var(--sgds-font-size-1)}.form-text.disabled{opacity:var(--sgds-opacity-50)}`;
9001
9054
 
9002
- var css_248z$6 = css`.form-label{margin-bottom:0}.form-check-label,.form-label{color:var(--sgds-form-color)}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{cursor:not-allowed}`;
9055
+ var css_248z$6 = css`.form-label{color:var(--sgds-form-color);margin-bottom:0}.form-label.disabled{opacity:var(--sgds-opacity-50)}.form-check-label{color:var(--sgds-form-color)}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{cursor:not-allowed}`;
9003
9056
 
9004
9057
  var css_248z$5 = css`.form-control::placeholder{color:var(--sgds-form-color-subtle);font-family:var(--sgds-font-family-brand);font-weight:var(--sgds-font-weight-light);line-height:var(--sgds-line-height-heading)}`;
9005
9058
 
@@ -9012,15 +9065,20 @@
9012
9065
  this.hintText = "";
9013
9066
  /** Disables the input. */
9014
9067
  this.disabled = false;
9015
- /** Allows invalidFeedback, invalid and valid styles to be visible with the input */
9016
- this.hasFeedback = false;
9017
- /**Feedback text for error state when validated */
9018
- this.invalidFeedback = "";
9019
9068
  /** Marks the component as invalid. Replace the pseudo :invalid selector for absent in custom elements */
9020
9069
  this.invalid = false;
9021
- /** Makes the input a required field. */
9022
- this.required = false;
9023
- this.labelId = genId("label");
9070
+ this._controlId = generateId("input");
9071
+ this._labelId = generateId("label");
9072
+ }
9073
+ /** Programatically sets the invalid state of the input. Pass in boolean value in the argument */
9074
+ setInvalid(bool) {
9075
+ this.invalid = bool;
9076
+ if (bool) {
9077
+ this.emit("sgds-invalid");
9078
+ }
9079
+ else {
9080
+ this.emit("sgds-valid");
9081
+ }
9024
9082
  }
9025
9083
  }
9026
9084
  FormControlElement.styles = [...SgdsElement.styles, css_248z$8, css_248z$7, css_248z$6, css_248z$5];
@@ -9036,24 +9094,229 @@
9036
9094
  __decorate([
9037
9095
  property({ type: Boolean, reflect: true })
9038
9096
  ], FormControlElement.prototype, "disabled", void 0);
9039
- __decorate([
9040
- property()
9041
- ], FormControlElement.prototype, "min", void 0);
9042
- __decorate([
9043
- property()
9044
- ], FormControlElement.prototype, "max", void 0);
9045
- __decorate([
9046
- property({ type: Boolean, reflect: true })
9047
- ], FormControlElement.prototype, "hasFeedback", void 0);
9048
- __decorate([
9049
- property({ type: String, reflect: true })
9050
- ], FormControlElement.prototype, "invalidFeedback", void 0);
9051
9097
  __decorate([
9052
9098
  property({ type: Boolean, reflect: true })
9053
9099
  ], FormControlElement.prototype, "invalid", void 0);
9054
- __decorate([
9055
- property({ type: Boolean, reflect: true })
9056
- ], FormControlElement.prototype, "required", void 0);
9100
+
9101
+ /**
9102
+ * SGDS custom form validation methods and behaviours
9103
+ */
9104
+ class InputValidationController {
9105
+ constructor(host, options) {
9106
+ (this.host = host).addController(this);
9107
+ this._internals = this.host.attachInternals();
9108
+ this.options = Object.assign({ setInvalid: (host, value) => {
9109
+ host.invalid = value;
9110
+ }, value: (host) => {
9111
+ return host.value;
9112
+ }, input: (host) => host.input }, options);
9113
+ }
9114
+ hostConnected() {
9115
+ this.host.addEventListener("invalid", e => this.handleInvalid(e));
9116
+ }
9117
+ hostDisconnected() {
9118
+ this.host.removeEventListener("invalid", e => this.handleInvalid(e));
9119
+ }
9120
+ /**
9121
+ * Prevents the native browser error message pop up when reportValidity() called by
9122
+ * associated form or the component's reportValidity during constraint validation
9123
+ * Sets invalid reactive prop to true
9124
+ */
9125
+ handleInvalid(e) {
9126
+ e.preventDefault();
9127
+ this.options.setInvalid(this.host, true);
9128
+ }
9129
+ /**
9130
+ * Sets invalid to false when invoked and
9131
+ * Updates the ValidityState based on new value, but
9132
+ * does not update invalid reactive prop
9133
+ * @param e
9134
+ */
9135
+ handleInput(e) {
9136
+ const input = e.target;
9137
+ this.options.setInvalid(this.host, false);
9138
+ this.validateInput(input);
9139
+ }
9140
+ /**
9141
+ * Validate the input's new value after onChange and
9142
+ * update invalid reactive prop
9143
+ * @param e
9144
+ */
9145
+ handleChange(e) {
9146
+ const input = e.target;
9147
+ this.validateInput(input);
9148
+ this.options.setInvalid(this.host, !this.checkValidity());
9149
+ }
9150
+ get form() {
9151
+ return this._internals.form;
9152
+ }
9153
+ get validity() {
9154
+ return this._internals.validity;
9155
+ }
9156
+ get validationMessage() {
9157
+ return this._internals.validationMessage;
9158
+ }
9159
+ get willValidate() {
9160
+ return this._internals.willValidate;
9161
+ }
9162
+ /**
9163
+ * Checks the validity and updates the invalid reactive prop of form components
9164
+ */
9165
+ updateInvalidState() {
9166
+ this.options.setInvalid(this.host, !this.checkValidity());
9167
+ }
9168
+ /**
9169
+ * Resets the ValidityState of the control
9170
+ */
9171
+ resetValidity() {
9172
+ return this._internals.setValidity({});
9173
+ }
9174
+ /**
9175
+ * Reports the validity
9176
+ */
9177
+ checkValidity() {
9178
+ return this._internals.checkValidity();
9179
+ }
9180
+ /**
9181
+ * Reports the validity with a error popup message
9182
+ */
9183
+ reportValidity() {
9184
+ return this._internals.reportValidity();
9185
+ }
9186
+ /**
9187
+ * Sets the form control value into FormData,
9188
+ * making the value of control accessible via FormData
9189
+ */
9190
+ setFormValue() {
9191
+ const value = this.options.value(this.host);
9192
+ this._internals.setFormValue(value);
9193
+ }
9194
+ /**
9195
+ * Updates the ValidityState of the input in form component at current state
9196
+ */
9197
+ validateInput(input) {
9198
+ /** When the form control is disabled, its always valid */
9199
+ if (this.options.input(this.host).disabled) {
9200
+ return this._internals.setValidity({});
9201
+ }
9202
+ // get the validity of the internal <input>
9203
+ const validState = input.validity;
9204
+ // if the input is invalid, show the correct error
9205
+ if (!validState.valid) {
9206
+ // loop through the error reasons
9207
+ for (const state in validState) {
9208
+ // if there is an error and corresponding attribute holding
9209
+ // the message
9210
+ if (validState[state]) {
9211
+ this.validationError = state.toString();
9212
+ // set the validity error reason and the corresponding
9213
+ // message
9214
+ this._internals.setValidity({ [this.validationError]: true }, input.validationMessage, input);
9215
+ }
9216
+ }
9217
+ }
9218
+ else {
9219
+ this._internals.setValidity({});
9220
+ }
9221
+ }
9222
+ }
9223
+
9224
+ /**
9225
+ * @summary The FormValidationMixin used by the form components
9226
+ * @param superClass
9227
+ * @returns
9228
+ */
9229
+ const SgdsFormValidatorMixin = (superClass) => {
9230
+ class ToBeValidatedElement extends superClass {
9231
+ constructor() {
9232
+ super(...arguments);
9233
+ this._isTouched = false;
9234
+ }
9235
+ connectedCallback() {
9236
+ super.connectedCallback();
9237
+ this.inputValidationController = new InputValidationController(this);
9238
+ }
9239
+ async firstUpdated(changedProperties) {
9240
+ super.firstUpdated(changedProperties);
9241
+ /* Either input or sgds-input. For example, quantity-toggle uses sgds-input */
9242
+ this.input =
9243
+ this.shadowRoot.querySelector("input") || (await this.sgdsInput) || this.shadowRoot.querySelector("textarea");
9244
+ this._mixinValidate(this.input);
9245
+ }
9246
+ /**
9247
+ * Native lifecycle of Form-Associated Custom Element Callbacks
9248
+ */
9249
+ formResetCallback() {
9250
+ if (this._mixinResetFormControl) {
9251
+ this._mixinResetFormControl();
9252
+ }
9253
+ else {
9254
+ this.value = this.defaultValue;
9255
+ this._mixinResetValidity(this.input);
9256
+ }
9257
+ this._mixinSetFormValue();
9258
+ }
9259
+ /**
9260
+ *
9261
+ * Methods use by classes using this mixin
9262
+ */
9263
+ /**
9264
+ * OnChange of form component
9265
+ * 1. Make value of control accessible via FormData
9266
+ * 2. Run change handler
9267
+ */
9268
+ _mixinHandleChange(e) {
9269
+ this._mixinSetFormValue();
9270
+ this.inputValidationController.handleChange(e);
9271
+ }
9272
+ /**
9273
+ * OnChange of form component
9274
+ * 1. Make value of control accessible via FormData
9275
+ * 2. Run input handler
9276
+ */
9277
+ _mixinHandleInputChange(e) {
9278
+ this._mixinSetFormValue();
9279
+ this.inputValidationController.handleInput(e);
9280
+ }
9281
+ /**
9282
+ * During form resetting,
9283
+ * 1. ValidityState is reset
9284
+ * 2. invalid reactive prop is updated after the reset
9285
+ * 3. Revalidates the ValidityState (but do not update invalid prop)
9286
+ * to prepare for the next validity check
9287
+ * 4. Reset touched state to false for a pristine form
9288
+ */
9289
+ _mixinResetValidity(input) {
9290
+ this.inputValidationController.resetValidity();
9291
+ this.inputValidationController.updateInvalidState();
9292
+ this.inputValidationController.validateInput(input);
9293
+ this._isTouched ? (this._isTouched = false) : null;
9294
+ }
9295
+ _mixinValidate(input) {
9296
+ this.inputValidationController.validateInput(input);
9297
+ }
9298
+ _mixinSetFormValue() {
9299
+ this.inputValidationController.setFormValue();
9300
+ }
9301
+ _mixinCheckValidity() {
9302
+ return this.inputValidationController.checkValidity();
9303
+ }
9304
+ _mixinReportValidity() {
9305
+ return this.inputValidationController.reportValidity();
9306
+ }
9307
+ _mixinGetValidity() {
9308
+ return this.inputValidationController.validity;
9309
+ }
9310
+ _mixinGetValidationMessage() {
9311
+ return this.inputValidationController.validationMessage;
9312
+ }
9313
+ }
9314
+ ToBeValidatedElement.formAssociated = true;
9315
+ __decorate([
9316
+ queryAsync("sgds-input")
9317
+ ], ToBeValidatedElement.prototype, "sgdsInput", void 0);
9318
+ return ToBeValidatedElement;
9319
+ };
9057
9320
 
9058
9321
  var css_248z$4 = css`:host{--sgds-spinner-bg:var(--sgds-primary-bg);display:inline-flex}:host([variant=neutral]){--sgds-spinner-bg:var(--sgds-neutral-color-emphasis)}.spinner-wrapper{align-items:center;display:flex;flex-direction:column;gap:var(--sgds-gap-2-xs)}.spinner{animation:spinner .75s linear infinite;border-radius:50%;border-right:.25em solid var(--sgds-alternate-bg);border:.25em solid var(--sgds-alternate-bg);border-right-color:var(--sgds-spinner-bg);color:var(--sgds-spinner-color);display:inline-flex;height:var(--sgds-dimension-32);width:var(--sgds-dimension-32)}.spinner-sm{height:var(--sgds-dimension-24);width:var(--sgds-dimension-24)}.spinner-lg{height:var(--sgds-dimension-48);width:var(--sgds-dimension-48)}.spinner-label{font-size:var(--sgds-font-size-1)}@media (prefers-reduced-motion:reduce){.spinner{animation-duration:1.5s}}
9059
9322
 
@@ -9100,136 +9363,6 @@
9100
9363
  property({ reflect: true, type: String })
9101
9364
  ], SgdsSpinner.prototype, "label", void 0);
9102
9365
 
9103
- const reportValidityOverloads = new WeakMap();
9104
- class FormSubmitController {
9105
- constructor(host, options) {
9106
- (this.host = host).addController(this);
9107
- this.options = Object.assign({ form: (input) => {
9108
- return input.closest("form");
9109
- }, name: (input) => input.name, value: (input) => input.value, defaultValue: (input) => input.defaultValue, disabled: (input) => input.disabled, reportValidity: (input) => {
9110
- return typeof input.reportValidity === "function" ? input.reportValidity() : true;
9111
- }, setValue: (input, value) => {
9112
- input.value = value;
9113
- } }, options);
9114
- this.handleFormData = this.handleFormData.bind(this);
9115
- this.handleFormSubmit = this.handleFormSubmit.bind(this);
9116
- this.handleFormReset = this.handleFormReset.bind(this);
9117
- this.reportFormValidity = this.reportFormValidity.bind(this);
9118
- }
9119
- hostConnected() {
9120
- this.form = this.options.form(this.host);
9121
- if (this.form) {
9122
- this.form.addEventListener("formdata", this.handleFormData);
9123
- this.form.addEventListener("submit", this.handleFormSubmit);
9124
- this.form.addEventListener("reset", this.handleFormReset);
9125
- // Overload the form's reportValidity() method so it looks at Shoelace form controls
9126
- if (!reportValidityOverloads.has(this.form)) {
9127
- reportValidityOverloads.set(this.form, this.form.reportValidity);
9128
- this.form.reportValidity = () => this.reportFormValidity();
9129
- }
9130
- }
9131
- }
9132
- hostDisconnected() {
9133
- if (this.form) {
9134
- this.form.removeEventListener("formdata", this.handleFormData);
9135
- this.form.removeEventListener("submit", this.handleFormSubmit);
9136
- this.form.removeEventListener("reset", this.handleFormReset);
9137
- // Remove the overload and restore the original method
9138
- if (reportValidityOverloads.has(this.form)) {
9139
- this.form.reportValidity = reportValidityOverloads.get(this.form);
9140
- reportValidityOverloads.delete(this.form);
9141
- }
9142
- this.form = undefined;
9143
- }
9144
- }
9145
- handleFormData(event) {
9146
- const disabled = this.options.disabled(this.host);
9147
- const name = this.options.name(this.host);
9148
- const value = this.options.value(this.host);
9149
- if (!disabled && typeof name === "string" && typeof value !== "undefined") {
9150
- if (Array.isArray(value)) {
9151
- value.forEach(val => {
9152
- event.formData.append(name, val.toString());
9153
- });
9154
- }
9155
- else {
9156
- event.formData.append(name, value.toString());
9157
- }
9158
- }
9159
- }
9160
- handleFormSubmit(event) {
9161
- const disabled = this.options.disabled(this.host);
9162
- const reportValidity = this.options.reportValidity;
9163
- if (this.form && !this.form.noValidate && !disabled && !reportValidity(this.host)) {
9164
- event.preventDefault();
9165
- event.stopImmediatePropagation();
9166
- }
9167
- }
9168
- handleFormReset() {
9169
- this.options.setValue(this.host, this.options.defaultValue(this.host));
9170
- }
9171
- reportFormValidity() {
9172
- //
9173
- // Shoelace form controls work hard to act like regular form controls. They support the Constraint Validation API
9174
- // and its associated methods such as setCustomValidity() and reportValidity(). However, the HTMLFormElement also
9175
- // has a reportValidity() method that will trigger validation on all child controls. Since we're not yet using
9176
- // ElementInternals, we need to overload this method so it looks for any element with the reportValidity() method.
9177
- //
9178
- // We preserve the original method in a WeakMap, but we don't call it from the overload because that would trigger
9179
- // validations in an unexpected order. When the element disconnects, we revert to the original behavior. This won't
9180
- // be necessary once we can use ElementInternals.
9181
- //
9182
- // Note that we're also honoring the form's novalidate attribute.
9183
- //
9184
- if (this.form && !this.form.noValidate) {
9185
- // This seems sloppy, but checking all elements will cover native inputs, Shoelace inputs, and other custom
9186
- // elements that support the constraint validation API.
9187
- const elements = this.form.querySelectorAll("*");
9188
- for (const element of elements) {
9189
- if (typeof element.reportValidity === "function") {
9190
- if (!element.reportValidity()) {
9191
- return false;
9192
- }
9193
- }
9194
- }
9195
- }
9196
- return true;
9197
- }
9198
- doAction(type, invoker) {
9199
- if (this.form) {
9200
- const button = document.createElement("button");
9201
- button.type = type;
9202
- button.style.position = "absolute";
9203
- button.style.width = "0";
9204
- button.style.height = "0";
9205
- button.style.clipPath = "inset(50%)";
9206
- button.style.overflow = "hidden";
9207
- button.style.whiteSpace = "nowrap";
9208
- // Pass form attributes through to the temporary button
9209
- if (invoker) {
9210
- ["formaction", "formmethod", "formnovalidate", "formtarget"].forEach(attr => {
9211
- if (invoker.hasAttribute(attr)) {
9212
- button.setAttribute(attr, invoker.getAttribute(attr));
9213
- }
9214
- });
9215
- }
9216
- this.form.append(button);
9217
- button.click();
9218
- button.remove();
9219
- }
9220
- }
9221
- /** Resets the form, restoring all the control to their default value */
9222
- reset(invoker) {
9223
- this.doAction("reset", invoker);
9224
- }
9225
- /** Submits the form, triggering validation and form data injection. */
9226
- submit(invoker) {
9227
- // Calling form.submit() bypasses the submit event and constraint validation. To prevent this, we can inject a
9228
- // native submit button into the form, "click" it, then remove it to simulate a standard form submission.
9229
- this.doAction("submit", invoker);
9230
- }
9231
- }
9232
-
9233
9366
  var css_248z$2 = css`.form-control-container{display:flex;flex-direction:column;gap:var(--sgds-form-gap-md)}.form-control-container.disabled{opacity:var(--sgds-opacity-50)}.form-control-group{align-items:center;background-color:var(--sgds-form-bg);border:var(--sgds-form-border-width-default) solid var(--sgds-form-border-color);border-radius:var(--sgds-form-border-radius-md);display:flex;gap:var(--sgds-form-gap-md);height:var(--sgds-dimension-48);justify-content:center;min-width:var(--sgds-dimension-256);padding:0 var(--sgds-form-padding-x);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:-webkit-fill-available;width:-moz-available}.form-control{appearance:none;background-clip:padding-box;background:none;border:none;color:var(--sgds-form-color);display:block;flex-grow:1;font-size:var(--sgds-font-size-2);line-height:var(--sgds-line-height-heading);outline:none;padding:0}.form-control-group>.form-control:focus{z-index:3}@media (prefers-reduced-motion:reduce){.form-control-group{transition:none}}.form-control-group.readonly{border-color:var(--sgds-form-border-color-muted)}.form-control-group:not(.disabled):not(.is-invalid):hover{border:var(--sgds-form-border-width-thick) solid var(--sgds-form-border-color-emphasis)}.form-control-group:not(.disabled):not(.is-invalid):focus,.form-control-group:not(.disabled):not(.is-invalid):focus-within{border:var(--sgds-form-border-width-thick) solid var(--sgds-form-border-color-emphasis);box-shadow:var(--sgds-form-box-shadow-focus);outline:0}.form-control-group.is-invalid{border:var(--sgds-form-border-width-thick) solid var(--sgds-form-danger-border-color)}.form-control-group.disabled{background-color:var(--sgds-form-bg-muted)}:host(.quantity-toggle) input::-webkit-inner-spin-button{appearance:none;margin:0}:host(.quantity-toggle) input{text-align:center}.form-control-icon{align-items:center;display:flex;height:var(--sgds-form-icon-size-lg);justify-content:center;width:var(--sgds-form-icon-size-lg)}.form-control-prefix,.form-control-suffix{color:var(--sgds-form-color-subtle)}.form-control-group.quantity-toggle{padding:0}`;
9234
9367
 
9235
9368
  /**
@@ -9239,14 +9372,13 @@
9239
9372
  * @event sgds-input - Emitted when the control receives input and its value changes.
9240
9373
  * @event sgds-focus - Emitted when input is in focus.
9241
9374
  * @event sgds-blur - Emitted when input is not in focus.
9375
+ * @event sgds-invalid - Emitted when input is invalid
9376
+ * @event sgds-valid - Emitted when input is valid
9242
9377
  *
9243
9378
  */
9244
- class SgdsInput extends FormControlElement {
9379
+ class SgdsInput extends SgdsFormValidatorMixin(ScopedElementsMixin(FormControlElement)) {
9245
9380
  constructor() {
9246
9381
  super(...arguments);
9247
- /**@internal */
9248
- this.formSubmitController = new FormSubmitController(this);
9249
- /** The type of input which works the same as HTMLInputElement */
9250
9382
  this.type = "text";
9251
9383
  /** The input's placeholder text. */
9252
9384
  this.placeholder = "placeholder";
@@ -9254,16 +9386,17 @@
9254
9386
  this.autofocus = false;
9255
9387
  /** Makes the input readonly. */
9256
9388
  this.readonly = false;
9257
- /**The input's value attribute. */
9258
- this.value = "";
9259
9389
  /**Gets or sets the default value used to reset this element. The initial value corresponds to the one originally specified in the HTML that created this element. */
9260
9390
  this.defaultValue = "";
9261
9391
  /** Marks the component as valid. */
9262
9392
  this.valid = false;
9263
9393
  /** Marks the component as loading. */
9264
9394
  this.loading = false;
9265
- /**@internal */
9266
- this.inputId = genId("input", this.type);
9395
+ /** Makes the input a required field. */
9396
+ this.required = false;
9397
+ /**The input's value attribute. */
9398
+ this.value = "";
9399
+ this._isTouched = false;
9267
9400
  }
9268
9401
  /**@internal */
9269
9402
  static get scopedElements() {
@@ -9279,60 +9412,79 @@
9279
9412
  blur() {
9280
9413
  this.input.blur();
9281
9414
  }
9282
- /** Checks for validity and shows the browser's validation message if the control is invalid. */
9283
- reportValidity() {
9284
- return this.input.reportValidity();
9285
- }
9286
- /** Sets a custom validation message. Pass an empty string to restore validity */
9287
- setCustomValidity(err) {
9288
- return this.input.setCustomValidity(err);
9289
- }
9290
9415
  /** Programatically sets the invalid state of the input. Pass in boolean value in the argument */
9291
9416
  setInvalid(bool) {
9292
9417
  this.invalid = bool;
9418
+ if (bool) {
9419
+ this.emit("sgds-invalid");
9420
+ }
9421
+ else {
9422
+ this.emit("sgds-valid");
9423
+ }
9293
9424
  }
9294
- _handleClick() {
9295
- this.focus();
9425
+ /**
9426
+ * Checks for validity. Under the hood, HTMLFormElement's reportValidity method calls this method to check for component's validity state
9427
+ * Note that the native error popup is prevented for SGDS form components by default. Instead the validation message shows up in the feedback container of SgdsInput
9428
+ */
9429
+ reportValidity() {
9430
+ return this._mixinReportValidity();
9296
9431
  }
9297
- _handleChange(event) {
9298
- this.value = this.input.value;
9299
- this.emit(event);
9432
+ /**
9433
+ * Checks for validity without any native error popup message
9434
+ */
9435
+ checkValidity() {
9436
+ return this._mixinCheckValidity();
9437
+ }
9438
+ /**
9439
+ * Returns the ValidityState object
9440
+ */
9441
+ get validity() {
9442
+ return this._mixinGetValidity();
9443
+ }
9444
+ /**
9445
+ * Returns the validation message based on the ValidityState
9446
+ */
9447
+ get validationMessage() {
9448
+ return this._mixinGetValidationMessage();
9300
9449
  }
9301
9450
  _handleFocus() {
9302
9451
  this.emit("sgds-focus");
9303
9452
  }
9304
9453
  _handleBlur() {
9454
+ this._isTouched = true;
9305
9455
  this.emit("sgds-blur");
9306
9456
  }
9307
- _handleKeyDown(event) {
9308
- const hasModifier = event.metaKey || event.ctrlKey || event.shiftKey || event.altKey;
9309
- // Pressing enter when focused on an input should submit the form like a native input, but we wait a tick before
9310
- // submitting to allow users to cancel the keydown event if they need to
9311
- if (event.key === "Enter" && !hasModifier) {
9312
- setTimeout(() => {
9313
- // Prevent submission when enter is click on a submission in an Input Method Editor with isComposing
9314
- if (!event.defaultPrevented && !event.isComposing) {
9315
- this.formSubmitController.submit();
9316
- }
9317
- });
9457
+ _handleClick() {
9458
+ this.focus();
9459
+ }
9460
+ _handleChange(e) {
9461
+ this.value = this.input.value;
9462
+ this.emit("sgds-change");
9463
+ super._mixinHandleChange(e);
9464
+ }
9465
+ _handleInputChange(e) {
9466
+ this.value = this.input.value;
9467
+ this.emit("sgds-input");
9468
+ super._mixinHandleInputChange(e);
9469
+ }
9470
+ /** @internal */
9471
+ _handleIsTouched() {
9472
+ if (this._isTouched) {
9473
+ this.setInvalid(!this._mixinCheckValidity());
9318
9474
  }
9319
9475
  }
9320
9476
  _handleDisabledChange() {
9321
9477
  // Disabled form controls are always valid, so we need to recheck validity when the state changes
9322
- this.input.disabled = this.disabled;
9323
- this.invalid = !this.input.checkValidity();
9324
- }
9325
- _handleValueChange() {
9326
- this.invalid = !this.input.checkValidity();
9478
+ this.setInvalid(false);
9327
9479
  }
9328
9480
  _renderInput() {
9481
+ const wantFeedbackStyle = this.hasFeedback === "both" || this.hasFeedback === "style";
9329
9482
  return html `
9330
9483
  <div
9331
9484
  class="form-control-group ${classMap({
9332
9485
  disabled: this.disabled,
9333
9486
  readonly: this.readonly,
9334
- "is-invalid": this.invalid && this.hasFeedback,
9335
- "quantity-toggle": this.classList.contains("quantity-toggle")
9487
+ "is-invalid": this.invalid && wantFeedbackStyle
9336
9488
  })}"
9337
9489
  @click=${this._handleClick}
9338
9490
  >
@@ -9341,7 +9493,7 @@
9341
9493
  <input
9342
9494
  class="form-control"
9343
9495
  type=${this.type}
9344
- id=${this.inputId}
9496
+ id=${this._controlId}
9345
9497
  name=${ifDefined(this.name)}
9346
9498
  placeholder=${ifDefined(this.placeholder)}
9347
9499
  aria-invalid=${this.invalid ? "true" : "false"}
@@ -9356,15 +9508,14 @@
9356
9508
  min=${ifDefined(this.min)}
9357
9509
  max=${ifDefined(this.max)}
9358
9510
  step=${ifDefined(this.step)}
9359
- @input=${() => this._handleChange("sgds-input")}
9360
- @change=${() => this._handleChange("sgds-change")}
9361
- @keydown=${this._handleKeyDown}
9511
+ @input=${(e) => this._handleInputChange(e)}
9512
+ @change=${(e) => this._handleChange(e)}
9362
9513
  @invalid=${() => this.setInvalid(true)}
9363
9514
  @focus=${this._handleFocus}
9364
9515
  @blur=${this._handleBlur}
9365
- aria-describedby=${ifDefined(this.invalid && this.hasFeedback ? `${this.inputId}-invalid` : undefined)}
9366
- aria-labelledby="${this.labelId} ${this.inputId}Help ${this.invalid && this.hasFeedback
9367
- ? `${this.inputId}-invalid`
9516
+ aria-describedby=${ifDefined(this.invalid && this.hasFeedback ? `${this._controlId}-invalid` : undefined)}
9517
+ aria-labelledby="${this._labelId} ${this._controlId}Help ${this.invalid && this.hasFeedback
9518
+ ? `${this._controlId}-invalid`
9368
9519
  : ""}"
9369
9520
  />
9370
9521
  ${this.loading ? html `<sgds-spinner size="sm"></sgds-spinner>` : nothing}
@@ -9381,7 +9532,8 @@
9381
9532
  `;
9382
9533
  }
9383
9534
  _renderFeedback() {
9384
- return this.invalid && this.hasFeedback
9535
+ const wantFeedbackText = this.hasFeedback === "both" || this.hasFeedback === "text";
9536
+ return this.invalid && wantFeedbackText
9385
9537
  ? html ` <div class="invalid-feedback-container">
9386
9538
  <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none">
9387
9539
  <path
@@ -9389,15 +9541,17 @@
9389
9541
  fill="#B90000"
9390
9542
  />
9391
9543
  </svg>
9392
- <div id="${this.inputId}-invalid" class="invalid-feedback">${this.invalidFeedback}</div>
9544
+ <div id="${this._controlId}-invalid" class="invalid-feedback">
9545
+ ${this.invalidFeedback ? this.invalidFeedback : this.input.validationMessage}
9546
+ </div>
9393
9547
  </div>`
9394
9548
  : html `${this._renderHintText()}`;
9395
9549
  }
9396
9550
  _renderLabel() {
9397
9551
  const labelTemplate = html `
9398
9552
  <label
9399
- for=${this.inputId}
9400
- id=${this.labelId}
9553
+ for=${this._controlId}
9554
+ id=${this._labelId}
9401
9555
  class=${classMap({
9402
9556
  "form-label": true,
9403
9557
  required: this.required
@@ -9408,7 +9562,7 @@
9408
9562
  return this.label && labelTemplate;
9409
9563
  }
9410
9564
  _renderHintText() {
9411
- const hintTextTemplate = html ` <div id="${this.inputId}Help" class="form-text">${this.hintText}</div> `;
9565
+ const hintTextTemplate = html ` <div id="${this._controlId}Help" class="form-text">${this.hintText}</div> `;
9412
9566
  return this.hintText && hintTextTemplate;
9413
9567
  }
9414
9568
  render() {
@@ -9423,10 +9577,7 @@
9423
9577
  `;
9424
9578
  }
9425
9579
  }
9426
- SgdsInput.styles = [...FormControlElement.styles, css_248z$2];
9427
- __decorate([
9428
- query("input.form-control")
9429
- ], SgdsInput.prototype, "input", void 0);
9580
+ SgdsInput.styles = [...FormControlElement.styles, css_248z$5, css_248z$2];
9430
9581
  __decorate([
9431
9582
  property({ reflect: true })
9432
9583
  ], SgdsInput.prototype, "type", void 0);
@@ -9445,6 +9596,12 @@
9445
9596
  __decorate([
9446
9597
  property({ type: Number, reflect: true })
9447
9598
  ], SgdsInput.prototype, "maxlength", void 0);
9599
+ __decorate([
9600
+ property()
9601
+ ], SgdsInput.prototype, "min", void 0);
9602
+ __decorate([
9603
+ property()
9604
+ ], SgdsInput.prototype, "max", void 0);
9448
9605
  __decorate([
9449
9606
  property({ type: String, reflect: true })
9450
9607
  ], SgdsInput.prototype, "placeholder", void 0);
@@ -9461,8 +9618,11 @@
9461
9618
  property()
9462
9619
  ], SgdsInput.prototype, "step", void 0);
9463
9620
  __decorate([
9464
- property({ reflect: true })
9465
- ], SgdsInput.prototype, "value", void 0);
9621
+ property({ type: String, reflect: true })
9622
+ ], SgdsInput.prototype, "hasFeedback", void 0);
9623
+ __decorate([
9624
+ property({ type: String, reflect: true })
9625
+ ], SgdsInput.prototype, "invalidFeedback", void 0);
9466
9626
  __decorate([
9467
9627
  defaultValue()
9468
9628
  ], SgdsInput.prototype, "defaultValue", void 0);
@@ -9472,12 +9632,21 @@
9472
9632
  __decorate([
9473
9633
  property({ type: Boolean, reflect: true })
9474
9634
  ], SgdsInput.prototype, "loading", void 0);
9635
+ __decorate([
9636
+ property({ type: Boolean, reflect: true })
9637
+ ], SgdsInput.prototype, "required", void 0);
9638
+ __decorate([
9639
+ property({ reflect: true })
9640
+ ], SgdsInput.prototype, "value", void 0);
9641
+ __decorate([
9642
+ state()
9643
+ ], SgdsInput.prototype, "_isTouched", void 0);
9644
+ __decorate([
9645
+ watch("_isTouched", { waitUntilFirstUpdate: true })
9646
+ ], SgdsInput.prototype, "_handleIsTouched", null);
9475
9647
  __decorate([
9476
9648
  watch("disabled", { waitUntilFirstUpdate: true })
9477
9649
  ], SgdsInput.prototype, "_handleDisabledChange", null);
9478
- __decorate([
9479
- watch("value", { waitUntilFirstUpdate: true })
9480
- ], SgdsInput.prototype, "_handleValueChange", null);
9481
9650
 
9482
9651
  var css_248z$1 = css`.sgds.combobox .form-control-icon{align-items:center;display:flex;font-size:1rem;height:3rem;justify-content:center;position:absolute;width:3rem;z-index:4}.sgds.combobox{align-items:stretch;display:flex;flex-wrap:wrap;justify-content:flex-end;position:relative;width:-webkit-fill-available;width:-moz-available}.sgds.combobox .dropdown-toggle{width:100%}.sgds.combobox>.dropdown-menu{min-width:100%}.form-control-icon{bottom:0}`;
9483
9652