@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
@@ -13949,7 +13949,7 @@
13949
13949
  }
13950
13950
  SgdsElement.styles = [css_248z$g];
13951
13951
 
13952
- function genId (componentName = "", elementName = "") {
13952
+ function generateId (componentName = "", elementName = "") {
13953
13953
  return `id-${Math.random().toString().substring(2, 6)}-sgds-${componentName}-${elementName}`;
13954
13954
  }
13955
13955
 
@@ -13971,7 +13971,7 @@
13971
13971
  /** @internal */
13972
13972
  this.bsDropdown = null;
13973
13973
  /** @internal Unique id generated for the dropdown menu */
13974
- this.dropdownMenuId = genId("dropdown-menu", "div");
13974
+ this.dropdownMenuId = generateId("dropdown-menu", "div");
13975
13975
  /** @internal Controls auto-flipping of menu */
13976
13976
  this.noFlip = false;
13977
13977
  /** @internal When true, aligns right edge of menu with right edge of button */
@@ -18769,9 +18769,9 @@
18769
18769
 
18770
18770
  var css_248z$d = 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)}`;
18771
18771
 
18772
- var css_248z$c = css`.form-text{color:var(--sgds-form-color-subtle);font-size:var(--sgds-font-size-1)}`;
18772
+ var css_248z$c = css`.form-text{color:var(--sgds-form-color-subtle);font-size:var(--sgds-font-size-1)}.form-text.disabled{opacity:var(--sgds-opacity-50)}`;
18773
18773
 
18774
- var css_248z$b = 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}`;
18774
+ var css_248z$b = 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}`;
18775
18775
 
18776
18776
  var css_248z$a = 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)}`;
18777
18777
 
@@ -18784,15 +18784,20 @@
18784
18784
  this.hintText = "";
18785
18785
  /** Disables the input. */
18786
18786
  this.disabled = false;
18787
- /** Allows invalidFeedback, invalid and valid styles to be visible with the input */
18788
- this.hasFeedback = false;
18789
- /**Feedback text for error state when validated */
18790
- this.invalidFeedback = "";
18791
18787
  /** Marks the component as invalid. Replace the pseudo :invalid selector for absent in custom elements */
18792
18788
  this.invalid = false;
18793
- /** Makes the input a required field. */
18794
- this.required = false;
18795
- this.labelId = genId("label");
18789
+ this._controlId = generateId("input");
18790
+ this._labelId = generateId("label");
18791
+ }
18792
+ /** Programatically sets the invalid state of the input. Pass in boolean value in the argument */
18793
+ setInvalid(bool) {
18794
+ this.invalid = bool;
18795
+ if (bool) {
18796
+ this.emit("sgds-invalid");
18797
+ }
18798
+ else {
18799
+ this.emit("sgds-valid");
18800
+ }
18796
18801
  }
18797
18802
  }
18798
18803
  FormControlElement.styles = [...SgdsElement.styles, css_248z$d, css_248z$c, css_248z$b, css_248z$a];
@@ -18808,24 +18813,249 @@
18808
18813
  __decorate([
18809
18814
  property({ type: Boolean, reflect: true })
18810
18815
  ], FormControlElement.prototype, "disabled", void 0);
18811
- __decorate([
18812
- property()
18813
- ], FormControlElement.prototype, "min", void 0);
18814
- __decorate([
18815
- property()
18816
- ], FormControlElement.prototype, "max", void 0);
18817
- __decorate([
18818
- property({ type: Boolean, reflect: true })
18819
- ], FormControlElement.prototype, "hasFeedback", void 0);
18820
- __decorate([
18821
- property({ type: String, reflect: true })
18822
- ], FormControlElement.prototype, "invalidFeedback", void 0);
18823
18816
  __decorate([
18824
18817
  property({ type: Boolean, reflect: true })
18825
18818
  ], FormControlElement.prototype, "invalid", void 0);
18826
- __decorate([
18827
- property({ type: Boolean, reflect: true })
18828
- ], FormControlElement.prototype, "required", void 0);
18819
+
18820
+ // @defaultValue decorator
18821
+ const defaultValue = (propertyName = "value") => (proto, key) => {
18822
+ const ctor = proto.constructor;
18823
+ const attributeChangedCallback = ctor.prototype.attributeChangedCallback;
18824
+ ctor.prototype.attributeChangedCallback = function (name, old, value) {
18825
+ var _a;
18826
+ const options = ctor.getPropertyOptions(propertyName);
18827
+ const attributeName = (typeof options.attribute === "string" ? options.attribute : propertyName).toLowerCase();
18828
+ if (name === attributeName) {
18829
+ const converter = options.converter || defaultConverter;
18830
+ const fromAttribute = typeof converter === "function" ? converter : (_a = converter === null || converter === void 0 ? void 0 : converter.fromAttribute) !== null && _a !== void 0 ? _a : defaultConverter.fromAttribute;
18831
+ const newValue = fromAttribute(value, options.type);
18832
+ if (this[propertyName] !== newValue) {
18833
+ this[key] = newValue;
18834
+ }
18835
+ }
18836
+ attributeChangedCallback.call(this, name, old, value);
18837
+ };
18838
+ };
18839
+
18840
+ /**
18841
+ * SGDS custom form validation methods and behaviours
18842
+ */
18843
+ class InputValidationController {
18844
+ constructor(host, options) {
18845
+ (this.host = host).addController(this);
18846
+ this._internals = this.host.attachInternals();
18847
+ this.options = Object.assign({ setInvalid: (host, value) => {
18848
+ host.invalid = value;
18849
+ }, value: (host) => {
18850
+ return host.value;
18851
+ }, input: (host) => host.input }, options);
18852
+ }
18853
+ hostConnected() {
18854
+ this.host.addEventListener("invalid", e => this.handleInvalid(e));
18855
+ }
18856
+ hostDisconnected() {
18857
+ this.host.removeEventListener("invalid", e => this.handleInvalid(e));
18858
+ }
18859
+ /**
18860
+ * Prevents the native browser error message pop up when reportValidity() called by
18861
+ * associated form or the component's reportValidity during constraint validation
18862
+ * Sets invalid reactive prop to true
18863
+ */
18864
+ handleInvalid(e) {
18865
+ e.preventDefault();
18866
+ this.options.setInvalid(this.host, true);
18867
+ }
18868
+ /**
18869
+ * Sets invalid to false when invoked and
18870
+ * Updates the ValidityState based on new value, but
18871
+ * does not update invalid reactive prop
18872
+ * @param e
18873
+ */
18874
+ handleInput(e) {
18875
+ const input = e.target;
18876
+ this.options.setInvalid(this.host, false);
18877
+ this.validateInput(input);
18878
+ }
18879
+ /**
18880
+ * Validate the input's new value after onChange and
18881
+ * update invalid reactive prop
18882
+ * @param e
18883
+ */
18884
+ handleChange(e) {
18885
+ const input = e.target;
18886
+ this.validateInput(input);
18887
+ this.options.setInvalid(this.host, !this.checkValidity());
18888
+ }
18889
+ get form() {
18890
+ return this._internals.form;
18891
+ }
18892
+ get validity() {
18893
+ return this._internals.validity;
18894
+ }
18895
+ get validationMessage() {
18896
+ return this._internals.validationMessage;
18897
+ }
18898
+ get willValidate() {
18899
+ return this._internals.willValidate;
18900
+ }
18901
+ /**
18902
+ * Checks the validity and updates the invalid reactive prop of form components
18903
+ */
18904
+ updateInvalidState() {
18905
+ this.options.setInvalid(this.host, !this.checkValidity());
18906
+ }
18907
+ /**
18908
+ * Resets the ValidityState of the control
18909
+ */
18910
+ resetValidity() {
18911
+ return this._internals.setValidity({});
18912
+ }
18913
+ /**
18914
+ * Reports the validity
18915
+ */
18916
+ checkValidity() {
18917
+ return this._internals.checkValidity();
18918
+ }
18919
+ /**
18920
+ * Reports the validity with a error popup message
18921
+ */
18922
+ reportValidity() {
18923
+ return this._internals.reportValidity();
18924
+ }
18925
+ /**
18926
+ * Sets the form control value into FormData,
18927
+ * making the value of control accessible via FormData
18928
+ */
18929
+ setFormValue() {
18930
+ const value = this.options.value(this.host);
18931
+ this._internals.setFormValue(value);
18932
+ }
18933
+ /**
18934
+ * Updates the ValidityState of the input in form component at current state
18935
+ */
18936
+ validateInput(input) {
18937
+ /** When the form control is disabled, its always valid */
18938
+ if (this.options.input(this.host).disabled) {
18939
+ return this._internals.setValidity({});
18940
+ }
18941
+ // get the validity of the internal <input>
18942
+ const validState = input.validity;
18943
+ // if the input is invalid, show the correct error
18944
+ if (!validState.valid) {
18945
+ // loop through the error reasons
18946
+ for (const state in validState) {
18947
+ // if there is an error and corresponding attribute holding
18948
+ // the message
18949
+ if (validState[state]) {
18950
+ this.validationError = state.toString();
18951
+ // set the validity error reason and the corresponding
18952
+ // message
18953
+ this._internals.setValidity({ [this.validationError]: true }, input.validationMessage, input);
18954
+ }
18955
+ }
18956
+ }
18957
+ else {
18958
+ this._internals.setValidity({});
18959
+ }
18960
+ }
18961
+ }
18962
+
18963
+ /**
18964
+ * @summary The FormValidationMixin used by the form components
18965
+ * @param superClass
18966
+ * @returns
18967
+ */
18968
+ const SgdsFormValidatorMixin = (superClass) => {
18969
+ class ToBeValidatedElement extends superClass {
18970
+ constructor() {
18971
+ super(...arguments);
18972
+ this._isTouched = false;
18973
+ }
18974
+ connectedCallback() {
18975
+ super.connectedCallback();
18976
+ this.inputValidationController = new InputValidationController(this);
18977
+ }
18978
+ async firstUpdated(changedProperties) {
18979
+ super.firstUpdated(changedProperties);
18980
+ /* Either input or sgds-input. For example, quantity-toggle uses sgds-input */
18981
+ this.input =
18982
+ this.shadowRoot.querySelector("input") || (await this.sgdsInput) || this.shadowRoot.querySelector("textarea");
18983
+ this._mixinValidate(this.input);
18984
+ }
18985
+ /**
18986
+ * Native lifecycle of Form-Associated Custom Element Callbacks
18987
+ */
18988
+ formResetCallback() {
18989
+ if (this._mixinResetFormControl) {
18990
+ this._mixinResetFormControl();
18991
+ }
18992
+ else {
18993
+ this.value = this.defaultValue;
18994
+ this._mixinResetValidity(this.input);
18995
+ }
18996
+ this._mixinSetFormValue();
18997
+ }
18998
+ /**
18999
+ *
19000
+ * Methods use by classes using this mixin
19001
+ */
19002
+ /**
19003
+ * OnChange of form component
19004
+ * 1. Make value of control accessible via FormData
19005
+ * 2. Run change handler
19006
+ */
19007
+ _mixinHandleChange(e) {
19008
+ this._mixinSetFormValue();
19009
+ this.inputValidationController.handleChange(e);
19010
+ }
19011
+ /**
19012
+ * OnChange of form component
19013
+ * 1. Make value of control accessible via FormData
19014
+ * 2. Run input handler
19015
+ */
19016
+ _mixinHandleInputChange(e) {
19017
+ this._mixinSetFormValue();
19018
+ this.inputValidationController.handleInput(e);
19019
+ }
19020
+ /**
19021
+ * During form resetting,
19022
+ * 1. ValidityState is reset
19023
+ * 2. invalid reactive prop is updated after the reset
19024
+ * 3. Revalidates the ValidityState (but do not update invalid prop)
19025
+ * to prepare for the next validity check
19026
+ * 4. Reset touched state to false for a pristine form
19027
+ */
19028
+ _mixinResetValidity(input) {
19029
+ this.inputValidationController.resetValidity();
19030
+ this.inputValidationController.updateInvalidState();
19031
+ this.inputValidationController.validateInput(input);
19032
+ this._isTouched ? (this._isTouched = false) : null;
19033
+ }
19034
+ _mixinValidate(input) {
19035
+ this.inputValidationController.validateInput(input);
19036
+ }
19037
+ _mixinSetFormValue() {
19038
+ this.inputValidationController.setFormValue();
19039
+ }
19040
+ _mixinCheckValidity() {
19041
+ return this.inputValidationController.checkValidity();
19042
+ }
19043
+ _mixinReportValidity() {
19044
+ return this.inputValidationController.reportValidity();
19045
+ }
19046
+ _mixinGetValidity() {
19047
+ return this.inputValidationController.validity;
19048
+ }
19049
+ _mixinGetValidationMessage() {
19050
+ return this.inputValidationController.validationMessage;
19051
+ }
19052
+ }
19053
+ ToBeValidatedElement.formAssociated = true;
19054
+ __decorate([
19055
+ queryAsync("sgds-input")
19056
+ ], ToBeValidatedElement.prototype, "sgdsInput", void 0);
19057
+ return ToBeValidatedElement;
19058
+ };
18829
19059
 
18830
19060
  var css_248z$9 = 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}}
18831
19061
 
@@ -18872,156 +19102,6 @@
18872
19102
  property({ reflect: true, type: String })
18873
19103
  ], SgdsSpinner.prototype, "label", void 0);
18874
19104
 
18875
- // @defaultValue decorator
18876
- const defaultValue = (propertyName = "value") => (proto, key) => {
18877
- const ctor = proto.constructor;
18878
- const attributeChangedCallback = ctor.prototype.attributeChangedCallback;
18879
- ctor.prototype.attributeChangedCallback = function (name, old, value) {
18880
- var _a;
18881
- const options = ctor.getPropertyOptions(propertyName);
18882
- const attributeName = (typeof options.attribute === "string" ? options.attribute : propertyName).toLowerCase();
18883
- if (name === attributeName) {
18884
- const converter = options.converter || defaultConverter;
18885
- const fromAttribute = typeof converter === "function" ? converter : (_a = converter === null || converter === void 0 ? void 0 : converter.fromAttribute) !== null && _a !== void 0 ? _a : defaultConverter.fromAttribute;
18886
- const newValue = fromAttribute(value, options.type);
18887
- if (this[propertyName] !== newValue) {
18888
- this[key] = newValue;
18889
- }
18890
- }
18891
- attributeChangedCallback.call(this, name, old, value);
18892
- };
18893
- };
18894
-
18895
- const reportValidityOverloads = new WeakMap();
18896
- class FormSubmitController {
18897
- constructor(host, options) {
18898
- (this.host = host).addController(this);
18899
- this.options = Object.assign({ form: (input) => {
18900
- return input.closest("form");
18901
- }, name: (input) => input.name, value: (input) => input.value, defaultValue: (input) => input.defaultValue, disabled: (input) => input.disabled, reportValidity: (input) => {
18902
- return typeof input.reportValidity === "function" ? input.reportValidity() : true;
18903
- }, setValue: (input, value) => {
18904
- input.value = value;
18905
- } }, options);
18906
- this.handleFormData = this.handleFormData.bind(this);
18907
- this.handleFormSubmit = this.handleFormSubmit.bind(this);
18908
- this.handleFormReset = this.handleFormReset.bind(this);
18909
- this.reportFormValidity = this.reportFormValidity.bind(this);
18910
- }
18911
- hostConnected() {
18912
- this.form = this.options.form(this.host);
18913
- if (this.form) {
18914
- this.form.addEventListener("formdata", this.handleFormData);
18915
- this.form.addEventListener("submit", this.handleFormSubmit);
18916
- this.form.addEventListener("reset", this.handleFormReset);
18917
- // Overload the form's reportValidity() method so it looks at Shoelace form controls
18918
- if (!reportValidityOverloads.has(this.form)) {
18919
- reportValidityOverloads.set(this.form, this.form.reportValidity);
18920
- this.form.reportValidity = () => this.reportFormValidity();
18921
- }
18922
- }
18923
- }
18924
- hostDisconnected() {
18925
- if (this.form) {
18926
- this.form.removeEventListener("formdata", this.handleFormData);
18927
- this.form.removeEventListener("submit", this.handleFormSubmit);
18928
- this.form.removeEventListener("reset", this.handleFormReset);
18929
- // Remove the overload and restore the original method
18930
- if (reportValidityOverloads.has(this.form)) {
18931
- this.form.reportValidity = reportValidityOverloads.get(this.form);
18932
- reportValidityOverloads.delete(this.form);
18933
- }
18934
- this.form = undefined;
18935
- }
18936
- }
18937
- handleFormData(event) {
18938
- const disabled = this.options.disabled(this.host);
18939
- const name = this.options.name(this.host);
18940
- const value = this.options.value(this.host);
18941
- if (!disabled && typeof name === "string" && typeof value !== "undefined") {
18942
- if (Array.isArray(value)) {
18943
- value.forEach(val => {
18944
- event.formData.append(name, val.toString());
18945
- });
18946
- }
18947
- else {
18948
- event.formData.append(name, value.toString());
18949
- }
18950
- }
18951
- }
18952
- handleFormSubmit(event) {
18953
- const disabled = this.options.disabled(this.host);
18954
- const reportValidity = this.options.reportValidity;
18955
- if (this.form && !this.form.noValidate && !disabled && !reportValidity(this.host)) {
18956
- event.preventDefault();
18957
- event.stopImmediatePropagation();
18958
- }
18959
- }
18960
- handleFormReset() {
18961
- this.options.setValue(this.host, this.options.defaultValue(this.host));
18962
- }
18963
- reportFormValidity() {
18964
- //
18965
- // Shoelace form controls work hard to act like regular form controls. They support the Constraint Validation API
18966
- // and its associated methods such as setCustomValidity() and reportValidity(). However, the HTMLFormElement also
18967
- // has a reportValidity() method that will trigger validation on all child controls. Since we're not yet using
18968
- // ElementInternals, we need to overload this method so it looks for any element with the reportValidity() method.
18969
- //
18970
- // We preserve the original method in a WeakMap, but we don't call it from the overload because that would trigger
18971
- // validations in an unexpected order. When the element disconnects, we revert to the original behavior. This won't
18972
- // be necessary once we can use ElementInternals.
18973
- //
18974
- // Note that we're also honoring the form's novalidate attribute.
18975
- //
18976
- if (this.form && !this.form.noValidate) {
18977
- // This seems sloppy, but checking all elements will cover native inputs, Shoelace inputs, and other custom
18978
- // elements that support the constraint validation API.
18979
- const elements = this.form.querySelectorAll("*");
18980
- for (const element of elements) {
18981
- if (typeof element.reportValidity === "function") {
18982
- if (!element.reportValidity()) {
18983
- return false;
18984
- }
18985
- }
18986
- }
18987
- }
18988
- return true;
18989
- }
18990
- doAction(type, invoker) {
18991
- if (this.form) {
18992
- const button = document.createElement("button");
18993
- button.type = type;
18994
- button.style.position = "absolute";
18995
- button.style.width = "0";
18996
- button.style.height = "0";
18997
- button.style.clipPath = "inset(50%)";
18998
- button.style.overflow = "hidden";
18999
- button.style.whiteSpace = "nowrap";
19000
- // Pass form attributes through to the temporary button
19001
- if (invoker) {
19002
- ["formaction", "formmethod", "formnovalidate", "formtarget"].forEach(attr => {
19003
- if (invoker.hasAttribute(attr)) {
19004
- button.setAttribute(attr, invoker.getAttribute(attr));
19005
- }
19006
- });
19007
- }
19008
- this.form.append(button);
19009
- button.click();
19010
- button.remove();
19011
- }
19012
- }
19013
- /** Resets the form, restoring all the control to their default value */
19014
- reset(invoker) {
19015
- this.doAction("reset", invoker);
19016
- }
19017
- /** Submits the form, triggering validation and form data injection. */
19018
- submit(invoker) {
19019
- // Calling form.submit() bypasses the submit event and constraint validation. To prevent this, we can inject a
19020
- // native submit button into the form, "click" it, then remove it to simulate a standard form submission.
19021
- this.doAction("submit", invoker);
19022
- }
19023
- }
19024
-
19025
19105
  var css_248z$7 = 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}`;
19026
19106
 
19027
19107
  /**
@@ -19031,14 +19111,13 @@
19031
19111
  * @event sgds-input - Emitted when the control receives input and its value changes.
19032
19112
  * @event sgds-focus - Emitted when input is in focus.
19033
19113
  * @event sgds-blur - Emitted when input is not in focus.
19114
+ * @event sgds-invalid - Emitted when input is invalid
19115
+ * @event sgds-valid - Emitted when input is valid
19034
19116
  *
19035
19117
  */
19036
- class SgdsInput extends FormControlElement {
19118
+ class SgdsInput extends SgdsFormValidatorMixin(ScopedElementsMixin(FormControlElement)) {
19037
19119
  constructor() {
19038
19120
  super(...arguments);
19039
- /**@internal */
19040
- this.formSubmitController = new FormSubmitController(this);
19041
- /** The type of input which works the same as HTMLInputElement */
19042
19121
  this.type = "text";
19043
19122
  /** The input's placeholder text. */
19044
19123
  this.placeholder = "placeholder";
@@ -19046,16 +19125,17 @@
19046
19125
  this.autofocus = false;
19047
19126
  /** Makes the input readonly. */
19048
19127
  this.readonly = false;
19049
- /**The input's value attribute. */
19050
- this.value = "";
19051
19128
  /**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. */
19052
19129
  this.defaultValue = "";
19053
19130
  /** Marks the component as valid. */
19054
19131
  this.valid = false;
19055
19132
  /** Marks the component as loading. */
19056
19133
  this.loading = false;
19057
- /**@internal */
19058
- this.inputId = genId("input", this.type);
19134
+ /** Makes the input a required field. */
19135
+ this.required = false;
19136
+ /**The input's value attribute. */
19137
+ this.value = "";
19138
+ this._isTouched = false;
19059
19139
  }
19060
19140
  /**@internal */
19061
19141
  static get scopedElements() {
@@ -19071,60 +19151,79 @@
19071
19151
  blur() {
19072
19152
  this.input.blur();
19073
19153
  }
19074
- /** Checks for validity and shows the browser's validation message if the control is invalid. */
19075
- reportValidity() {
19076
- return this.input.reportValidity();
19077
- }
19078
- /** Sets a custom validation message. Pass an empty string to restore validity */
19079
- setCustomValidity(err) {
19080
- return this.input.setCustomValidity(err);
19081
- }
19082
19154
  /** Programatically sets the invalid state of the input. Pass in boolean value in the argument */
19083
19155
  setInvalid(bool) {
19084
19156
  this.invalid = bool;
19157
+ if (bool) {
19158
+ this.emit("sgds-invalid");
19159
+ }
19160
+ else {
19161
+ this.emit("sgds-valid");
19162
+ }
19085
19163
  }
19086
- _handleClick() {
19087
- this.focus();
19164
+ /**
19165
+ * Checks for validity. Under the hood, HTMLFormElement's reportValidity method calls this method to check for component's validity state
19166
+ * 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
19167
+ */
19168
+ reportValidity() {
19169
+ return this._mixinReportValidity();
19088
19170
  }
19089
- _handleChange(event) {
19090
- this.value = this.input.value;
19091
- this.emit(event);
19171
+ /**
19172
+ * Checks for validity without any native error popup message
19173
+ */
19174
+ checkValidity() {
19175
+ return this._mixinCheckValidity();
19176
+ }
19177
+ /**
19178
+ * Returns the ValidityState object
19179
+ */
19180
+ get validity() {
19181
+ return this._mixinGetValidity();
19182
+ }
19183
+ /**
19184
+ * Returns the validation message based on the ValidityState
19185
+ */
19186
+ get validationMessage() {
19187
+ return this._mixinGetValidationMessage();
19092
19188
  }
19093
19189
  _handleFocus() {
19094
19190
  this.emit("sgds-focus");
19095
19191
  }
19096
19192
  _handleBlur() {
19193
+ this._isTouched = true;
19097
19194
  this.emit("sgds-blur");
19098
19195
  }
19099
- _handleKeyDown(event) {
19100
- const hasModifier = event.metaKey || event.ctrlKey || event.shiftKey || event.altKey;
19101
- // Pressing enter when focused on an input should submit the form like a native input, but we wait a tick before
19102
- // submitting to allow users to cancel the keydown event if they need to
19103
- if (event.key === "Enter" && !hasModifier) {
19104
- setTimeout(() => {
19105
- // Prevent submission when enter is click on a submission in an Input Method Editor with isComposing
19106
- if (!event.defaultPrevented && !event.isComposing) {
19107
- this.formSubmitController.submit();
19108
- }
19109
- });
19196
+ _handleClick() {
19197
+ this.focus();
19198
+ }
19199
+ _handleChange(e) {
19200
+ this.value = this.input.value;
19201
+ this.emit("sgds-change");
19202
+ super._mixinHandleChange(e);
19203
+ }
19204
+ _handleInputChange(e) {
19205
+ this.value = this.input.value;
19206
+ this.emit("sgds-input");
19207
+ super._mixinHandleInputChange(e);
19208
+ }
19209
+ /** @internal */
19210
+ _handleIsTouched() {
19211
+ if (this._isTouched) {
19212
+ this.setInvalid(!this._mixinCheckValidity());
19110
19213
  }
19111
19214
  }
19112
19215
  _handleDisabledChange() {
19113
19216
  // Disabled form controls are always valid, so we need to recheck validity when the state changes
19114
- this.input.disabled = this.disabled;
19115
- this.invalid = !this.input.checkValidity();
19116
- }
19117
- _handleValueChange() {
19118
- this.invalid = !this.input.checkValidity();
19217
+ this.setInvalid(false);
19119
19218
  }
19120
19219
  _renderInput() {
19220
+ const wantFeedbackStyle = this.hasFeedback === "both" || this.hasFeedback === "style";
19121
19221
  return html `
19122
19222
  <div
19123
19223
  class="form-control-group ${classMap({
19124
19224
  disabled: this.disabled,
19125
19225
  readonly: this.readonly,
19126
- "is-invalid": this.invalid && this.hasFeedback,
19127
- "quantity-toggle": this.classList.contains("quantity-toggle")
19226
+ "is-invalid": this.invalid && wantFeedbackStyle
19128
19227
  })}"
19129
19228
  @click=${this._handleClick}
19130
19229
  >
@@ -19133,7 +19232,7 @@
19133
19232
  <input
19134
19233
  class="form-control"
19135
19234
  type=${this.type}
19136
- id=${this.inputId}
19235
+ id=${this._controlId}
19137
19236
  name=${ifDefined(this.name)}
19138
19237
  placeholder=${ifDefined(this.placeholder)}
19139
19238
  aria-invalid=${this.invalid ? "true" : "false"}
@@ -19148,15 +19247,14 @@
19148
19247
  min=${ifDefined(this.min)}
19149
19248
  max=${ifDefined(this.max)}
19150
19249
  step=${ifDefined(this.step)}
19151
- @input=${() => this._handleChange("sgds-input")}
19152
- @change=${() => this._handleChange("sgds-change")}
19153
- @keydown=${this._handleKeyDown}
19250
+ @input=${(e) => this._handleInputChange(e)}
19251
+ @change=${(e) => this._handleChange(e)}
19154
19252
  @invalid=${() => this.setInvalid(true)}
19155
19253
  @focus=${this._handleFocus}
19156
19254
  @blur=${this._handleBlur}
19157
- aria-describedby=${ifDefined(this.invalid && this.hasFeedback ? `${this.inputId}-invalid` : undefined)}
19158
- aria-labelledby="${this.labelId} ${this.inputId}Help ${this.invalid && this.hasFeedback
19159
- ? `${this.inputId}-invalid`
19255
+ aria-describedby=${ifDefined(this.invalid && this.hasFeedback ? `${this._controlId}-invalid` : undefined)}
19256
+ aria-labelledby="${this._labelId} ${this._controlId}Help ${this.invalid && this.hasFeedback
19257
+ ? `${this._controlId}-invalid`
19160
19258
  : ""}"
19161
19259
  />
19162
19260
  ${this.loading ? html `<sgds-spinner size="sm"></sgds-spinner>` : nothing}
@@ -19173,7 +19271,8 @@
19173
19271
  `;
19174
19272
  }
19175
19273
  _renderFeedback() {
19176
- return this.invalid && this.hasFeedback
19274
+ const wantFeedbackText = this.hasFeedback === "both" || this.hasFeedback === "text";
19275
+ return this.invalid && wantFeedbackText
19177
19276
  ? html ` <div class="invalid-feedback-container">
19178
19277
  <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none">
19179
19278
  <path
@@ -19181,15 +19280,17 @@
19181
19280
  fill="#B90000"
19182
19281
  />
19183
19282
  </svg>
19184
- <div id="${this.inputId}-invalid" class="invalid-feedback">${this.invalidFeedback}</div>
19283
+ <div id="${this._controlId}-invalid" class="invalid-feedback">
19284
+ ${this.invalidFeedback ? this.invalidFeedback : this.input.validationMessage}
19285
+ </div>
19185
19286
  </div>`
19186
19287
  : html `${this._renderHintText()}`;
19187
19288
  }
19188
19289
  _renderLabel() {
19189
19290
  const labelTemplate = html `
19190
19291
  <label
19191
- for=${this.inputId}
19192
- id=${this.labelId}
19292
+ for=${this._controlId}
19293
+ id=${this._labelId}
19193
19294
  class=${classMap({
19194
19295
  "form-label": true,
19195
19296
  required: this.required
@@ -19200,7 +19301,7 @@
19200
19301
  return this.label && labelTemplate;
19201
19302
  }
19202
19303
  _renderHintText() {
19203
- const hintTextTemplate = html ` <div id="${this.inputId}Help" class="form-text">${this.hintText}</div> `;
19304
+ const hintTextTemplate = html ` <div id="${this._controlId}Help" class="form-text">${this.hintText}</div> `;
19204
19305
  return this.hintText && hintTextTemplate;
19205
19306
  }
19206
19307
  render() {
@@ -19215,10 +19316,7 @@
19215
19316
  `;
19216
19317
  }
19217
19318
  }
19218
- SgdsInput.styles = [...FormControlElement.styles, css_248z$7];
19219
- __decorate([
19220
- query("input.form-control")
19221
- ], SgdsInput.prototype, "input", void 0);
19319
+ SgdsInput.styles = [...FormControlElement.styles, css_248z$a, css_248z$7];
19222
19320
  __decorate([
19223
19321
  property({ reflect: true })
19224
19322
  ], SgdsInput.prototype, "type", void 0);
@@ -19237,6 +19335,12 @@
19237
19335
  __decorate([
19238
19336
  property({ type: Number, reflect: true })
19239
19337
  ], SgdsInput.prototype, "maxlength", void 0);
19338
+ __decorate([
19339
+ property()
19340
+ ], SgdsInput.prototype, "min", void 0);
19341
+ __decorate([
19342
+ property()
19343
+ ], SgdsInput.prototype, "max", void 0);
19240
19344
  __decorate([
19241
19345
  property({ type: String, reflect: true })
19242
19346
  ], SgdsInput.prototype, "placeholder", void 0);
@@ -19253,8 +19357,11 @@
19253
19357
  property()
19254
19358
  ], SgdsInput.prototype, "step", void 0);
19255
19359
  __decorate([
19256
- property({ reflect: true })
19257
- ], SgdsInput.prototype, "value", void 0);
19360
+ property({ type: String, reflect: true })
19361
+ ], SgdsInput.prototype, "hasFeedback", void 0);
19362
+ __decorate([
19363
+ property({ type: String, reflect: true })
19364
+ ], SgdsInput.prototype, "invalidFeedback", void 0);
19258
19365
  __decorate([
19259
19366
  defaultValue()
19260
19367
  ], SgdsInput.prototype, "defaultValue", void 0);
@@ -19264,12 +19371,21 @@
19264
19371
  __decorate([
19265
19372
  property({ type: Boolean, reflect: true })
19266
19373
  ], SgdsInput.prototype, "loading", void 0);
19374
+ __decorate([
19375
+ property({ type: Boolean, reflect: true })
19376
+ ], SgdsInput.prototype, "required", void 0);
19377
+ __decorate([
19378
+ property({ reflect: true })
19379
+ ], SgdsInput.prototype, "value", void 0);
19380
+ __decorate([
19381
+ state()
19382
+ ], SgdsInput.prototype, "_isTouched", void 0);
19383
+ __decorate([
19384
+ watch("_isTouched", { waitUntilFirstUpdate: true })
19385
+ ], SgdsInput.prototype, "_handleIsTouched", null);
19267
19386
  __decorate([
19268
19387
  watch("disabled", { waitUntilFirstUpdate: true })
19269
19388
  ], SgdsInput.prototype, "_handleDisabledChange", null);
19270
- __decorate([
19271
- watch("value", { waitUntilFirstUpdate: true })
19272
- ], SgdsInput.prototype, "_handleValueChange", null);
19273
19389
 
19274
19390
  var css_248z$6 = css`.input-container{display:flex;flex-direction:row;width:-webkit-fill-available;width:-moz-available}.form-control-group{border-radius:var(--sgds-form-border-radius-md) 0 0 var(--sgds-form-border-radius-md)}.input-feedback{display:flex;flex-direction:column;width:-webkit-fill-available;width:-moz-available}`;
19275
19391
 
@@ -19306,15 +19422,28 @@
19306
19422
  }
19307
19423
  };
19308
19424
  this.type = "text";
19309
- this.hasFeedback = true;
19310
- this._handleValueChange = () => null;
19425
+ this.hasFeedback = "both";
19426
+ // this._handleChange = () => null;
19427
+ // this._handleInputChange = () => null
19428
+ }
19429
+ // connectedCallback(): void {
19430
+ // super.connectedCallback();
19431
+ // this.addEventListener("sgds-change", this._validateInput);
19432
+ // }
19433
+ async _handleChange(e) {
19434
+ this.value = this.input.value;
19435
+ this.emit("sgds-change");
19436
+ super._mixinHandleChange(e);
19437
+ await this._validateInput();
19311
19438
  }
19312
- connectedCallback() {
19313
- super.connectedCallback();
19314
- this.addEventListener("sgds-change", this._validateInput);
19439
+ /** @internal */
19440
+ _handleIsTouched() {
19441
+ if (this._isTouched && this.required) {
19442
+ this.invalid = true;
19443
+ }
19315
19444
  }
19316
- async firstUpdated(changes) {
19317
- super.firstUpdated(changes);
19445
+ async firstUpdated(changedProperties) {
19446
+ super.firstUpdated(changedProperties);
19318
19447
  this._applyInputMask(this.dateFormat);
19319
19448
  }
19320
19449
  async _applyInputMask(dateFormat) {
@@ -19411,8 +19540,11 @@
19411
19540
  __decorate([
19412
19541
  queryAsync("input")
19413
19542
  ], DatepickerInput.prototype, "shadowInput", void 0);
19543
+ __decorate([
19544
+ watch("_isTouched", { waitUntilFirstUpdate: true })
19545
+ ], DatepickerInput.prototype, "_handleIsTouched", null);
19414
19546
 
19415
- var css_248z$5 = css`:host{--sgds-btn-font-weight:var(--sgds-font-weight-regular);--sgds-btn-bg:var(--sgds-primary-bg);--sgds-btn-hover-bg:var(--sgds-primary-bg-emphasis);--sgds-btn-border-radius:var(--sgds-border-radius-md)}:host([variant=primary]){--sgds-btn-bg:var(--sgds-primary-bg);--sgds-btn-color:var(--sgds-default-color-on-dark)}:host([variant=outline]){--sgds-btn-bg:var(--sgds-default-bg-transparent);--sgds-btn-hover-bg:var(--sgds-primary-bg-translucent);--sgds-btn-color:var(--sgds-primary-color);--sgds-btn-border-width:var(--sgds-border-width-1);--sgds-btn-border-color:var(--sgds-primary-border-color)}:host([variant=ghost]){--sgds-btn-bg:var(--sgds-default-bg-transparent);--sgds-btn-hover-bg:var(--sgds-primary-bg-translucent);--sgds-btn-color:var(--sgds-primary-color)}:host([variant=danger]){--sgds-btn-bg:var(--sgds-danger-bg);--sgds-btn-hover-bg:var(--sgds-danger-bg-emphasis);--sgds-btn-color:var(--sgds-default-color-on-dark)}.btn{align-items:center;background-color:var(--sgds-btn-bg);border:1px solid var(--sgds-default-border-color-transparent);border-radius:var(--sgds-btn-border-radius);color:var(--sgds-default-color-on-dark);cursor:pointer;display:inline-flex;font-size:var(--sgds-font-size-2);font-weight:var(--sgds-btn-font-weight);gap:var(--sgds-gap-2-xs);height:var(--sgds-dimension-48);justify-content:center;line-height:var(--sgds-line-height-md);min-width:var(--sgds-dimension-96);padding:0 var(--sgds-padding-lg);text-align:center;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;user-select:none;vertical-align:middle}.btn-ghost,.btn-outline,.btn-primary{color:var(--sgds-btn-color)}.btn-outline{border:var(--sgds-btn-border-width) solid var(--sgds-btn-border-color)}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn.active,.btn:hover{background-color:var(--sgds-btn-hover-bg)}.btn:focus,.btn:focus-visible{background-color:var(--sgds-btn-hover-bg);border-color:transparent;box-shadow:var(--sgds-box-shadow-focus);outline:0}.btn.disabled,.btn:disabled{color:var(--sgds-btn-color);opacity:var(--sgds-opacity-50);pointer-events:none}.btn-lg{font-size:var(--sgds-font-size-3);height:var(--sgds-dimension-56);min-width:var(--sgds-dimension-112);padding:0 var(--sgds-padding-xl)}.btn-sm{font-size:var(--sgds-font-size-1);height:var(--sgds-dimension-40);min-width:var(--sgds-dimension-80);padding:0 var(--sgds-padding-md)}`;
19547
+ var css_248z$5 = css`:host{--sgds-btn-font-weight:var(--sgds-font-weight-regular);--sgds-btn-bg:var(--sgds-primary-bg);--sgds-btn-hover-bg:var(--sgds-primary-bg-emphasis);--sgds-btn-border-radius:var(--sgds-border-radius-md)}:host([variant=primary]){--sgds-btn-bg:var(--sgds-primary-bg);--sgds-btn-color:var(--sgds-default-color-on-dark)}:host([variant=outline]){--sgds-btn-bg:var(--sgds-default-bg-transparent);--sgds-btn-hover-bg:var(--sgds-primary-bg-translucent);--sgds-btn-color:var(--sgds-primary-color);--sgds-btn-border-width:var(--sgds-border-width-1);--sgds-btn-border-color:var(--sgds-primary-border-color)}:host([variant=ghost]){--sgds-btn-bg:var(--sgds-default-bg-transparent);--sgds-btn-hover-bg:var(--sgds-primary-bg-translucent);--sgds-btn-color:var(--sgds-primary-color)}:host([variant=danger]){--sgds-btn-bg:var(--sgds-danger-bg);--sgds-btn-hover-bg:var(--sgds-danger-bg-emphasis);--sgds-btn-color:var(--sgds-default-color-on-dark)}.btn{align-items:center;background-color:var(--sgds-btn-bg);border:1px solid var(--sgds-default-border-color-transparent);border-radius:var(--sgds-btn-border-radius);color:var(--sgds-default-color-on-dark);cursor:pointer;display:inline-flex;font-size:var(--sgds-font-size-2);font-weight:var(--sgds-btn-font-weight);gap:var(--sgds-gap-2-xs);height:var(--sgds-dimension-48);justify-content:center;line-height:var(--sgds-line-height-md);min-width:var(--sgds-dimension-96);padding:0 var(--sgds-padding-lg);text-align:center;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;user-select:none;vertical-align:middle}.btn-ghost,.btn-outline,.btn-primary{color:var(--sgds-btn-color)}.btn-outline{border:var(--sgds-btn-border-width) solid var(--sgds-btn-border-color)}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn.active,.btn:hover{background-color:var(--sgds-btn-hover-bg)}.btn:focus,.btn:focus-visible{background-color:var(--sgds-btn-hover-bg);border-color:transparent;box-shadow:var(--sgds-box-shadow-focus);outline:0}.btn.disabled,.btn:disabled{color:var(--sgds-btn-color);opacity:var(--sgds-opacity-50);pointer-events:none}.btn-lg{font-size:var(--sgds-font-size-3);height:var(--sgds-dimension-56);min-width:var(--sgds-dimension-112);padding:0 var(--sgds-padding-xl)}.btn-sm{font-size:var(--sgds-font-size-1);height:var(--sgds-dimension-40);min-width:var(--sgds-dimension-80);padding:0 var(--sgds-padding-md)}.btn slot::slotted(*){color:var(--sgds-btn-color)}`;
19416
19548
 
19417
19549
  class ButtonElement extends SgdsElement {
19418
19550
  constructor() {
@@ -19485,6 +19617,63 @@
19485
19617
 
19486
19618
  var css_248z$4 = css`a[target=_blank]:after{background-color:currentColor;content:"/";display:inline-block;margin:0 .125rem;-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-box-arrow-up-right"><path fill-rule="evenodd" d="M8.636 3.5a.5.5 0 0 0-.5-.5H1.5A1.5 1.5 0 0 0 0 4.5v10A1.5 1.5 0 0 0 1.5 16h10a1.5 1.5 0 0 0 1.5-1.5V7.864a.5.5 0 0 0-1 0V14.5a.5.5 0 0 1-.5.5h-10a.5.5 0 0 1-.5-.5v-10a.5.5 0 0 1 .5-.5h6.636a.5.5 0 0 0 .5-.5z"/><path fill-rule="evenodd" d="M16 .5a.5.5 0 0 0-.5-.5h-5a.5.5 0 0 0 0 1h3.793L6.146 9.146a.5.5 0 1 0 .708.708L15 1.707V5.5a.5.5 0 0 0 1 0v-5z"/></svg>');mask-image:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-box-arrow-up-right"><path fill-rule="evenodd" d="M8.636 3.5a.5.5 0 0 0-.5-.5H1.5A1.5 1.5 0 0 0 0 4.5v10A1.5 1.5 0 0 0 1.5 16h10a1.5 1.5 0 0 0 1.5-1.5V7.864a.5.5 0 0 0-1 0V14.5a.5.5 0 0 1-.5.5h-10a.5.5 0 0 1-.5-.5v-10a.5.5 0 0 1 .5-.5h6.636a.5.5 0 0 0 .5-.5z"/><path fill-rule="evenodd" d="M16 .5a.5.5 0 0 0-.5-.5h-5a.5.5 0 0 0 0 1h3.793L6.146 9.146a.5.5 0 1 0 .708.708L15 1.707V5.5a.5.5 0 0 0 1 0v-5z"/></svg>');-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;mask-size:73%;-webkit-mask-size:73%;padding:0 .45em}`;
19487
19619
 
19620
+ /**
19621
+ * A controller to help with form submission
19622
+ */
19623
+ class FormSubmitController {
19624
+ constructor(host, options) {
19625
+ (this.host = host).addController(this);
19626
+ this.options = Object.assign({ form: (input) => {
19627
+ return input.closest("form");
19628
+ } }, options);
19629
+ }
19630
+ hostConnected() {
19631
+ this.form = this.options.form(this.host);
19632
+ }
19633
+ hostDisconnected() {
19634
+ if (this.form) {
19635
+ this.form = undefined;
19636
+ }
19637
+ }
19638
+ /**
19639
+ * Creates a temporary native HTML button that can participate in form and invoke form submits and reset
19640
+ * Button is removed once action is performed
19641
+ */
19642
+ doAction(type, invoker) {
19643
+ if (this.form) {
19644
+ const button = document.createElement("button");
19645
+ button.type = type;
19646
+ button.style.position = "absolute";
19647
+ button.style.width = "0";
19648
+ button.style.height = "0";
19649
+ button.style.clipPath = "inset(50%)";
19650
+ button.style.overflow = "hidden";
19651
+ button.style.whiteSpace = "nowrap";
19652
+ // Pass form attributes through to the temporary button
19653
+ if (invoker) {
19654
+ ["formaction", "formmethod", "formnovalidate", "formtarget"].forEach(attr => {
19655
+ if (invoker.hasAttribute(attr)) {
19656
+ button.setAttribute(attr, invoker.getAttribute(attr));
19657
+ }
19658
+ });
19659
+ }
19660
+ this.form.append(button);
19661
+ button.click();
19662
+ button.remove();
19663
+ }
19664
+ }
19665
+ /** Resets the form, restoring all the control to their default value */
19666
+ reset(invoker) {
19667
+ this.doAction("reset", invoker);
19668
+ }
19669
+ /** Submits the form, triggering validation and form data injection. */
19670
+ submit(invoker) {
19671
+ // Calling form.submit() bypasses the submit event and constraint validation. To prevent this, we can inject a
19672
+ // native submit button into the form, "click" it, then remove it to simulate a standard form submission.
19673
+ this.doAction("submit", invoker);
19674
+ }
19675
+ }
19676
+
19488
19677
  var css_248z$3 = css`:host{display:inline-flex}.btn.full-width,:host([fullWidth]){max-width:var(--sgds-dimension-320);width:100%}.btn.full-width.has-left-icon{justify-content:flex-start}.btn.full-width.has-right-icon{justify-content:space-between}.btn.full-width.has-left-icon.has-right-icon{justify-content:center}.btn span{padding:0 var(--sgds-padding-2-xs)}`;
19489
19678
 
19490
19679
  /**