@codecademy/gamut

71.0.071.0.1-alpha.c9e50f.0
~

Modified (14 files)

Index: package/dist/ConnectedForm/ConnectedInputs/ConnectedCheckbox.js
===================================================================
--- package/dist/ConnectedForm/ConnectedInputs/ConnectedCheckbox.js
+++ package/dist/ConnectedForm/ConnectedInputs/ConnectedCheckbox.js
@@ -12,18 +12,20 @@
   'aria-label': ariaLabel,
   multiline,
   name,
   onUpdate,
-  spacing
+  spacing,
+  customValidations
 }) => {
   const {
     isDisabled,
     control,
     validation,
     isRequired
   } = useField({
     name,
-    disabled
+    disabled,
+    customValidations
   });
   return /*#__PURE__*/_jsx(Controller, {
     control: control,
     defaultValue: false,
Index: package/dist/ConnectedForm/ConnectedFormGroup.js
===================================================================
--- package/dist/ConnectedForm/ConnectedFormGroup.js
+++ package/dist/ConnectedForm/ConnectedFormGroup.js
@@ -12,9 +12,9 @@
   target: "e1mlej80",
   label: "ErrorAnchor"
 })(css({
   color: 'feedback-error'
-}), process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Db25uZWN0ZWRGb3JtL0Nvbm5lY3RlZEZvcm1Hcm91cC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBYW9CIiwiZmlsZSI6Ii4uLy4uL3NyYy9Db25uZWN0ZWRGb3JtL0Nvbm5lY3RlZEZvcm1Hcm91cC50c3giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjc3MgfSBmcm9tICdAY29kZWNhZGVteS9nYW11dC1zdHlsZXMnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdAZW1vdGlvbi9zdHlsZWQnO1xuaW1wb3J0IHsgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgeyBGb3JtRXJyb3IsIEZvcm1Hcm91cCwgRm9ybUdyb3VwTGFiZWwsIEZvcm1Hcm91cFByb3BzIH0gZnJvbSAnLi4nO1xuaW1wb3J0IHsgQW5jaG9yIH0gZnJvbSAnLi4vQW5jaG9yJztcbmltcG9ydCB7IE1hcmtkb3duIH0gZnJvbSAnLi4vTWFya2Rvd24nO1xuaW1wb3J0IHsgSW5mb1RpcFN1YkNvbXBvbmVudFByb3BzIH0gZnJvbSAnLi4vVGlwL0luZm9UaXAvdHlwZS11dGlscyc7XG5pbXBvcnQgeyBUZXh0IH0gZnJvbSAnLi4vVHlwb2dyYXBoeSc7XG5pbXBvcnQgeyBDb25uZWN0ZWRGaWVsZCwgRmllbGRQcm9wcywgU3VibWl0Q29udGV4dFByb3BzIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBnZXRFcnJvck1lc3NhZ2UsIHVzZUZpZWxkIH0gZnJvbSAnLi91dGlscyc7XG5cbmNvbnN0IEVycm9yQW5jaG9yID0gc3R5bGVkKEFuY2hvcikoXG4gIGNzcyh7XG4gICAgY29sb3I6ICdmZWVkYmFjay1lcnJvcicsXG4gIH0pXG4pO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbm5lY3RlZEZvcm1Hcm91cEJhc2VQcm9wc1xuICBleHRlbmRzIE9taXQ8XG4gICAgRm9ybUdyb3VwUHJvcHMsXG4gICAgJ2xhYmVsJyB8ICdkaXNhYmxlZCcgfCAnZGVzY3JpcHRpb24nIHwgJ2h0bWxGb3InXG4gID4ge1xuICBjdXN0b21FcnJvcj86IHN0cmluZztcbiAgZXJyb3JUeXBlPzogJ2luaXRpYWwnIHwgJ2Fic29sdXRlJztcbiAgaGlkZUxhYmVsPzogYm9vbGVhbjtcbiAgbmFtZTogc3RyaW5nO1xuICBsYWJlbDogUmVhY3QuUmVhY3ROb2RlO1xuICByZXF1aXJlZD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBJbmZvVGlwIHRvIGRpc3BsYXkgbmV4dCB0byB0aGUgZmllbGQgbGFiZWwuIFRoZSBJbmZvVGlwIGJ1dHRvbiBpc1xuICAgKiBhdXRvbWF0aWNhbGx5IGxhYmVsbGVkIGJ5IHRoZSBmaWVsZCBsYWJlbC4gVG8gb3ZlcnJpZGUgdGhpcyBiZWhhdmlvcixcbiAgICogcHJvdmlkZSBgYXJpYUxhYmVsYCBvciBgYXJpYUxhYmVsbGVkYnlgLlxuICAgKi9cbiAgaW5mb3RpcD86IEluZm9UaXBTdWJDb21wb25lbnRQcm9wcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb25uZWN0ZWRGb3JtR3JvdXBQcm9wczxUIGV4dGVuZHMgQ29ubmVjdGVkRmllbGQ+XG4gIGV4dGVuZHMgU3VibWl0Q29udGV4dFByb3BzLFxuICAgIENvbm5lY3RlZEZvcm1Hcm91cEJhc2VQcm9wcyB7XG4gIC8qKlxuICAgKiBBbiBvYmplY3QgY29uc2lzdGluZyBvZiBhIGBjb21wb25lbnRgIGtleSB0byBzcGVjaWZ5IHdoYXQgQ29ubmVjdGVkRm9ybUlucHV0IHRvIHJlbmRlciAtIHRoZSByZW1haW5pbmcga2V5L3ZhbHVlIHBhaXJzIGFyZSB0aGF0IGNvbXBvbmVudHMgZGVzaXJlZCBwcm9wcy5cbiAgICovXG4gIGZpZWxkOiBPbWl0PFJlYWN0LkNvbXBvbmVudFByb3BzPFQ+LCAnbmFtZScgfCAnZGlzYWJsZWQnPiAmIEZpZWxkUHJvcHM8VD47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBDb25uZWN0ZWRGb3JtR3JvdXA8VCBleHRlbmRzIENvbm5lY3RlZEZpZWxkPih7XG4gIGN1c3RvbUVycm9yLFxuICBjaGlsZHJlbixcbiAgZGlzYWJsZWQgPSBmYWxzZSxcbiAgZXJyb3JUeXBlID0gJ2Fic29sdXRlJyxcbiAgZmllbGQsXG4gIGhpZGVMYWJlbCxcbiAgaWQsXG4gIGxhYmVsLFxuICBuYW1lLFxuICBsYWJlbFNpemUsXG4gIHNwYWNpbmcgPSAnZml0JyxcbiAgaXNTb2xvRmllbGQsXG4gIGluZm90aXAsXG59OiBDb25uZWN0ZWRGb3JtR3JvdXBQcm9wczxUPikge1xuICBjb25zdCB7IGVycm9yLCBpc0ZpcnN0RXJyb3IsIGlzRGlzYWJsZWQsIHNldEVycm9yLCB2YWxpZGF0aW9uIH0gPSB1c2VGaWVsZCh7XG4gICAgbmFtZSxcbiAgICBkaXNhYmxlZCxcbiAgfSk7XG4gIGNvbnN0IHsgY29tcG9uZW50OiBDb21wb25lbnQsIC4uLnJlc3QgfSA9IGZpZWxkO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGN1c3RvbUVycm9yKSB7XG4gICAgICBzZXRFcnJvcihuYW1lLCB7XG4gICAgICAgIHR5cGU6ICdtYW51YWwnLFxuICAgICAgICBtZXNzYWdlOiBjdXN0b21FcnJvcixcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgW2N1c3RvbUVycm9yLCBuYW1lLCBzZXRFcnJvcl0pO1xuXG4gIGNvbnN0IHJlbmRlcmVkTGFiZWwgPSAoXG4gICAgPEZvcm1Hcm91cExhYmVsXG4gICAgICBkaXNhYmxlZD17aXNEaXNhYmxlZH1cbiAgICAgIGh0bWxGb3I9e2lkIHx8IG5hbWV9XG4gICAgICBpbmZvdGlwPXtpbmZvdGlwfVxuICAgICAgaXNTb2xvRmllbGQ9e2lzU29sb0ZpZWxkfVxuICAgICAgcmVxdWlyZWQ9eyEhdmFsaWRhdGlvbj8ucmVxdWlyZWR9XG4gICAgICBzaXplPXtsYWJlbFNpemV9XG4gICAgPlxuICAgICAge2xhYmVsfVxuICAgIDwvRm9ybUdyb3VwTGFiZWw+XG4gICk7XG5cbiAgY29uc3QgdGV4dEVycm9yID0gY3VzdG9tRXJyb3IgfHwgZ2V0RXJyb3JNZXNzYWdlKGVycm9yKTtcbiAgY29uc3Qgc2hvd0Vycm9yID0gISEodGV4dEVycm9yICYmICFoaWRlTGFiZWwpO1xuICBjb25zdCBlcnJvcklkID0gc2hvd0Vycm9yID8gYCR7aWQgfHwgbmFtZX1fZXJyb3JgIDogdW5kZWZpbmVkO1xuXG4gIHJldHVybiAoXG4gICAgPEZvcm1Hcm91cCBzcGFjaW5nPXtoaWRlTGFiZWwgPyAndGlnaHQnIDogc3BhY2luZ30+XG4gICAgICB7aGlkZUxhYmVsID8gPFRleHQgc2NyZWVucmVhZGVyPntyZW5kZXJlZExhYmVsfTwvVGV4dD4gOiByZW5kZXJlZExhYmVsfVxuICAgICAgPENvbXBvbmVudFxuICAgICAgICB7Li4uKHJlc3QgYXMgYW55KX1cbiAgICAgICAgYXJpYS1kZXNjcmliZWRieT17ZXJyb3JJZH1cbiAgICAgICAgYXJpYS1pbnZhbGlkPXtzaG93RXJyb3J9XG4gICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgbmFtZT17bmFtZX1cbiAgICAgIC8+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgICB7c2hvd0Vycm9yICYmIChcbiAgICAgICAgPEZvcm1FcnJvclxuICAgICAgICAgIGFyaWEtbGl2ZT17aXNGaXJzdEVycm9yID8gJ2Fzc2VydGl2ZScgOiAnb2ZmJ31cbiAgICAgICAgICBpZD17ZXJyb3JJZH1cbiAgICAgICAgICByb2xlPXtpc0ZpcnN0RXJyb3IgPyAnYWxlcnQnIDogJ3N0YXR1cyd9XG4gICAgICAgICAgdmFyaWFudD17ZXJyb3JUeXBlfVxuICAgICAgICA+XG4gICAgICAgICAgPE1hcmtkb3duXG4gICAgICAgICAgICBpbmxpbmVcbiAgICAgICAgICAgIG92ZXJyaWRlcz17e1xuICAgICAgICAgICAgICBhOiB7XG4gICAgICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXM6IFsnaHJlZicsICd0YXJnZXQnXSxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6IEVycm9yQW5jaG9yLFxuICAgICAgICAgICAgICAgIHByb2Nlc3NOb2RlOiAoXG4gICAgICAgICAgICAgICAgICBub2RlOiB1bmtub3duLFxuICAgICAgICAgICAgICAgICAgcHJvcHM6IHsgb25DbGljaz86ICgpID0+IHZvaWQgfVxuICAgICAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgeyBrZXk6IGVsZW1lbnRLZXksIC4uLnJlc3QgfSA9XG4gICAgICAgICAgICAgICAgICAgIHByb3BzIGFzIFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBFcnJvckFuY2hvcj4gJiB7XG4gICAgICAgICAgICAgICAgICAgICAga2V5PzogUmVhY3QuS2V5O1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIDxFcnJvckFuY2hvciBrZXk9e2VsZW1lbnRLZXl9IHsuLi5yZXN0fSAvPjtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIHNraXBEZWZhdWx0T3ZlcnJpZGVzPXt7IGE6IHRydWUgfX1cbiAgICAgICAgICAgIHNwYWNpbmc9XCJub25lXCJcbiAgICAgICAgICAgIHRleHQ9e3RleHRFcnJvcn1cbiAgICAgICAgICAvPlxuICAgICAgICA8L0Zvcm1FcnJvcj5cbiAgICAgICl9XG4gICAgPC9Gb3JtR3JvdXA+XG4gICk7XG59XG4iXX0= */");
+}), process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Db25uZWN0ZWRGb3JtL0Nvbm5lY3RlZEZvcm1Hcm91cC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBY29CIiwiZmlsZSI6Ii4uLy4uL3NyYy9Db25uZWN0ZWRGb3JtL0Nvbm5lY3RlZEZvcm1Hcm91cC50c3giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjc3MgfSBmcm9tICdAY29kZWNhZGVteS9nYW11dC1zdHlsZXMnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdAZW1vdGlvbi9zdHlsZWQnO1xuaW1wb3J0IHsgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgUmVnaXN0ZXJPcHRpb25zIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHsgRm9ybUVycm9yLCBGb3JtR3JvdXAsIEZvcm1Hcm91cExhYmVsLCBGb3JtR3JvdXBQcm9wcyB9IGZyb20gJy4uJztcbmltcG9ydCB7IEFuY2hvciB9IGZyb20gJy4uL0FuY2hvcic7XG5pbXBvcnQgeyBNYXJrZG93biB9IGZyb20gJy4uL01hcmtkb3duJztcbmltcG9ydCB7IEluZm9UaXBTdWJDb21wb25lbnRQcm9wcyB9IGZyb20gJy4uL1RpcC9JbmZvVGlwL3R5cGUtdXRpbHMnO1xuaW1wb3J0IHsgVGV4dCB9IGZyb20gJy4uL1R5cG9ncmFwaHknO1xuaW1wb3J0IHsgQ29ubmVjdGVkRmllbGQsIEZpZWxkUHJvcHMsIFN1Ym1pdENvbnRleHRQcm9wcyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgZ2V0RXJyb3JNZXNzYWdlLCB1c2VGaWVsZCB9IGZyb20gJy4vdXRpbHMnO1xuXG5jb25zdCBFcnJvckFuY2hvciA9IHN0eWxlZChBbmNob3IpKFxuICBjc3Moe1xuICAgIGNvbG9yOiAnZmVlZGJhY2stZXJyb3InLFxuICB9KVxuKTtcblxuZXhwb3J0IGludGVyZmFjZSBDb25uZWN0ZWRGb3JtR3JvdXBCYXNlUHJvcHNcbiAgZXh0ZW5kcyBPbWl0PFxuICAgIEZvcm1Hcm91cFByb3BzLFxuICAgICdsYWJlbCcgfCAnZGlzYWJsZWQnIHwgJ2Rlc2NyaXB0aW9uJyB8ICdodG1sRm9yJ1xuICA+IHtcbiAgY3VzdG9tRXJyb3I/OiBzdHJpbmc7XG4gIGVycm9yVHlwZT86ICdpbml0aWFsJyB8ICdhYnNvbHV0ZSc7XG4gIGhpZGVMYWJlbD86IGJvb2xlYW47XG4gIG5hbWU6IHN0cmluZztcbiAgbGFiZWw6IFJlYWN0LlJlYWN0Tm9kZTtcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xuICAvKipcbiAgICogSW5mb1RpcCB0byBkaXNwbGF5IG5leHQgdG8gdGhlIGZpZWxkIGxhYmVsLiBUaGUgSW5mb1RpcCBidXR0b24gaXNcbiAgICogYXV0b21hdGljYWxseSBsYWJlbGxlZCBieSB0aGUgZmllbGQgbGFiZWwuIFRvIG92ZXJyaWRlIHRoaXMgYmVoYXZpb3IsXG4gICAqIHByb3ZpZGUgYGFyaWFMYWJlbGAgb3IgYGFyaWFMYWJlbGxlZGJ5YC5cbiAgICovXG4gIGluZm90aXA/OiBJbmZvVGlwU3ViQ29tcG9uZW50UHJvcHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29ubmVjdGVkRm9ybUdyb3VwUHJvcHM8VCBleHRlbmRzIENvbm5lY3RlZEZpZWxkPlxuICBleHRlbmRzIFN1Ym1pdENvbnRleHRQcm9wcyxcbiAgICBDb25uZWN0ZWRGb3JtR3JvdXBCYXNlUHJvcHMge1xuICAvKipcbiAgICogQW4gb2JqZWN0IGNvbnNpc3Rpbmcgb2YgYSBgY29tcG9uZW50YCBrZXkgdG8gc3BlY2lmeSB3aGF0IENvbm5lY3RlZEZvcm1JbnB1dCB0byByZW5kZXIgLSB0aGUgcmVtYWluaW5nIGtleS92YWx1ZSBwYWlycyBhcmUgdGhhdCBjb21wb25lbnRzIGRlc2lyZWQgcHJvcHMuXG4gICAqL1xuICBmaWVsZDogT21pdDxSZWFjdC5Db21wb25lbnRQcm9wczxUPiwgJ25hbWUnIHwgJ2Rpc2FibGVkJz4gJlxuICAgIEZpZWxkUHJvcHM8VD4gJiB7XG4gICAgICBjdXN0b21WYWxpZGF0aW9ucz86IFJlZ2lzdGVyT3B0aW9ucztcbiAgICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gQ29ubmVjdGVkRm9ybUdyb3VwPFQgZXh0ZW5kcyBDb25uZWN0ZWRGaWVsZD4oe1xuICBjdXN0b21FcnJvcixcbiAgY2hpbGRyZW4sXG4gIGRpc2FibGVkID0gZmFsc2UsXG4gIGVycm9yVHlwZSA9ICdhYnNvbHV0ZScsXG4gIGZpZWxkLFxuICBoaWRlTGFiZWwsXG4gIGlkLFxuICBsYWJlbCxcbiAgbmFtZSxcbiAgbGFiZWxTaXplLFxuICBzcGFjaW5nID0gJ2ZpdCcsXG4gIGlzU29sb0ZpZWxkLFxuICBpbmZvdGlwLFxufTogQ29ubmVjdGVkRm9ybUdyb3VwUHJvcHM8VD4pIHtcbiAgY29uc3QgeyBjb21wb25lbnQ6IENvbXBvbmVudCwgY3VzdG9tVmFsaWRhdGlvbnMsIC4uLnJlc3QgfSA9IGZpZWxkO1xuICBjb25zdCB7IGVycm9yLCBpc0ZpcnN0RXJyb3IsIGlzRGlzYWJsZWQsIHNldEVycm9yLCB2YWxpZGF0aW9uIH0gPSB1c2VGaWVsZCh7XG4gICAgbmFtZSxcbiAgICBkaXNhYmxlZCxcbiAgICBjdXN0b21WYWxpZGF0aW9ucyxcbiAgfSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoY3VzdG9tRXJyb3IpIHtcbiAgICAgIHNldEVycm9yKG5hbWUsIHtcbiAgICAgICAgdHlwZTogJ21hbnVhbCcsXG4gICAgICAgIG1lc3NhZ2U6IGN1c3RvbUVycm9yLFxuICAgICAgfSk7XG4gICAgfVxuICB9LCBbY3VzdG9tRXJyb3IsIG5hbWUsIHNldEVycm9yXSk7XG5cbiAgY29uc3QgcmVuZGVyZWRMYWJlbCA9IChcbiAgICA8Rm9ybUdyb3VwTGFiZWxcbiAgICAgIGRpc2FibGVkPXtpc0Rpc2FibGVkfVxuICAgICAgaHRtbEZvcj17aWQgfHwgbmFtZX1cbiAgICAgIGluZm90aXA9e2luZm90aXB9XG4gICAgICBpc1NvbG9GaWVsZD17aXNTb2xvRmllbGR9XG4gICAgICByZXF1aXJlZD17Qm9vbGVhbih2YWxpZGF0aW9uPy5yZXF1aXJlZCl9XG4gICAgICBzaXplPXtsYWJlbFNpemV9XG4gICAgPlxuICAgICAge2xhYmVsfVxuICAgIDwvRm9ybUdyb3VwTGFiZWw+XG4gICk7XG5cbiAgY29uc3QgdGV4dEVycm9yID0gY3VzdG9tRXJyb3IgfHwgZ2V0RXJyb3JNZXNzYWdlKGVycm9yKTtcbiAgY29uc3Qgc2hvd0Vycm9yID0gISEodGV4dEVycm9yICYmICFoaWRlTGFiZWwpO1xuICBjb25zdCBlcnJvcklkID0gc2hvd0Vycm9yID8gYCR7aWQgfHwgbmFtZX1fZXJyb3JgIDogdW5kZWZpbmVkO1xuXG4gIHJldHVybiAoXG4gICAgPEZvcm1Hcm91cCBzcGFjaW5nPXtoaWRlTGFiZWwgPyAndGlnaHQnIDogc3BhY2luZ30+XG4gICAgICB7aGlkZUxhYmVsID8gPFRleHQgc2NyZWVucmVhZGVyPntyZW5kZXJlZExhYmVsfTwvVGV4dD4gOiByZW5kZXJlZExhYmVsfVxuICAgICAgPENvbXBvbmVudFxuICAgICAgICB7Li4uKHJlc3QgYXMgYW55KX1cbiAgICAgICAgYXJpYS1kZXNjcmliZWRieT17ZXJyb3JJZH1cbiAgICAgICAgYXJpYS1pbnZhbGlkPXtzaG93RXJyb3J9XG4gICAgICAgIGN1c3RvbVZhbGlkYXRpb25zPXtjdXN0b21WYWxpZGF0aW9uc31cbiAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICBuYW1lPXtuYW1lfVxuICAgICAgLz5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICAgIHtzaG93RXJyb3IgJiYgKFxuICAgICAgICA8Rm9ybUVycm9yXG4gICAgICAgICAgYXJpYS1saXZlPXtpc0ZpcnN0RXJyb3IgPyAnYXNzZXJ0aXZlJyA6ICdvZmYnfVxuICAgICAgICAgIGlkPXtlcnJvcklkfVxuICAgICAgICAgIHJvbGU9e2lzRmlyc3RFcnJvciA/ICdhbGVydCcgOiAnc3RhdHVzJ31cbiAgICAgICAgICB2YXJpYW50PXtlcnJvclR5cGV9XG4gICAgICAgID5cbiAgICAgICAgICA8TWFya2Rvd25cbiAgICAgICAgICAgIGlubGluZVxuICAgICAgICAgICAgb3ZlcnJpZGVzPXt7XG4gICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICBhbGxvd2VkQXR0cmlidXRlczogWydocmVmJywgJ3RhcmdldCddLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogRXJyb3JBbmNob3IsXG4gICAgICAgICAgICAgICAgcHJvY2Vzc05vZGU6IChcbiAgICAgICAgICAgICAgICAgIG5vZGU6IHVua25vd24sXG4gICAgICAgICAgICAgICAgICBwcm9wczogeyBvbkNsaWNrPzogKCkgPT4gdm9pZCB9XG4gICAgICAgICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCB7IGtleTogZWxlbWVudEtleSwgLi4ucmVzdCB9ID1cbiAgICAgICAgICAgICAgICAgICAgcHJvcHMgYXMgUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIEVycm9yQW5jaG9yPiAmIHtcbiAgICAgICAgICAgICAgICAgICAgICBrZXk/OiBSZWFjdC5LZXk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICByZXR1cm4gPEVycm9yQW5jaG9yIGtleT17ZWxlbWVudEtleX0gey4uLnJlc3R9IC8+O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgc2tpcERlZmF1bHRPdmVycmlkZXM9e3sgYTogdHJ1ZSB9fVxuICAgICAgICAgICAgc3BhY2luZz1cIm5vbmVcIlxuICAgICAgICAgICAgdGV4dD17dGV4dEVycm9yfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvRm9ybUVycm9yPlxuICAgICAgKX1cbiAgICA8L0Zvcm1Hcm91cD5cbiAgKTtcbn1cbiJdfQ== */");
 export function ConnectedFormGroup({
   customError,
   children,
   disabled = false,
@@ -29,21 +29,23 @@
   isSoloField,
   infotip
 }) {
   const {
+    component: Component,
+    customValidations,
+    ...rest
+  } = field;
+  const {
     error,
     isFirstError,
     isDisabled,
     setError,
     validation
   } = useField({
     name,
-    disabled
+    disabled,
+    customValidations
   });
-  const {
-    component: Component,
-    ...rest
-  } = field;
   useEffect(() => {
     if (customError) {
       setError(name, {
         type: 'manual',
@@ -55,9 +57,9 @@
     disabled: isDisabled,
     htmlFor: id || name,
     infotip: infotip,
     isSoloField: isSoloField,
-    required: !!validation?.required,
+    required: Boolean(validation?.required),
     size: labelSize,
     children: label
   });
   const textError = customError || getErrorMessage(error);
@@ -71,8 +73,9 @@
     }) : renderedLabel, /*#__PURE__*/_jsx(Component, {
       ...rest,
       "aria-describedby": errorId,
       "aria-invalid": showError,
+      customValidations: customValidations,
       disabled: disabled,
       name: name
     }), children, showError && /*#__PURE__*/_jsx(FormError, {
       "aria-live": isFirstError ? 'assertive' : 'off',
Index: package/dist/ConnectedForm/ConnectedInputs/ConnectedInput.js
===================================================================
--- package/dist/ConnectedForm/ConnectedInputs/ConnectedInput.js
+++ package/dist/ConnectedForm/ConnectedInputs/ConnectedInput.js
@@ -4,8 +4,9 @@
 import { jsx as _jsx } from "react/jsx-runtime";
 export const ConnectedInput = ({
   disabled,
   name,
+  customValidations,
   ...rest
 }) => {
   const {
     error,
@@ -13,9 +14,10 @@
     ref,
     isRequired
   } = useField({
     name,
-    disabled
+    disabled,
+    customValidations
   });
   return /*#__PURE__*/_jsx(Input, {
     "aria-required": isRequired,
     disabled: isDisabled,
Index: package/dist/ConnectedForm/ConnectedInputs/ConnectedRadio.js
===================================================================
--- package/dist/ConnectedForm/ConnectedInputs/ConnectedRadio.js
+++ package/dist/ConnectedForm/ConnectedInputs/ConnectedRadio.js
@@ -4,17 +4,19 @@
 import { jsx as _jsx } from "react/jsx-runtime";
 export const ConnectedRadio = ({
   disabled,
   name,
+  customValidations,
   ...rest
 }) => {
   const {
     error,
     isDisabled,
     ref
   } = useField({
     name,
-    disabled
+    disabled,
+    customValidations
   });
   return /*#__PURE__*/_jsx(Radio, {
     disabled: isDisabled,
     error: Boolean(error),
Index: package/dist/ConnectedForm/ConnectedInputs/ConnectedRadioGroup.js
===================================================================
--- package/dist/ConnectedForm/ConnectedInputs/ConnectedRadioGroup.js
+++ package/dist/ConnectedForm/ConnectedInputs/ConnectedRadioGroup.js
@@ -4,15 +4,17 @@
 import { jsx as _jsx } from "react/jsx-runtime";
 export const ConnectedRadioGroup = ({
   name,
   onChange,
+  customValidations,
   ...rest
 }) => {
   const {
     setValue,
     isRequired
   } = useField({
-    name
+    name,
+    customValidations
   });
   return /*#__PURE__*/_jsx(RadioGroup, {
     "aria-required": isRequired,
     htmlForPrefix: name,
Index: package/dist/ConnectedForm/ConnectedInputs/ConnectedRadioGroupInput.js
===================================================================
--- package/dist/ConnectedForm/ConnectedInputs/ConnectedRadioGroupInput.js
+++ package/dist/ConnectedForm/ConnectedInputs/ConnectedRadioGroupInput.js
@@ -4,11 +4,13 @@
 export const ConnectedRadioGroupInput = ({
   name,
   options,
   disabled,
+  customValidations,
   ...rest
 }) => {
   return /*#__PURE__*/_jsx(ConnectedRadioGroup, {
+    customValidations: customValidations,
     name: name,
     ...rest,
     children: options.map(elem => {
       return /*#__PURE__*/_jsx(ConnectedRadio, {
Index: package/dist/ConnectedForm/ConnectedInputs/ConnectedSelect.js
===================================================================
--- package/dist/ConnectedForm/ConnectedInputs/ConnectedSelect.js
+++ package/dist/ConnectedForm/ConnectedInputs/ConnectedSelect.js
@@ -4,8 +4,9 @@
 import { jsx as _jsx } from "react/jsx-runtime";
 export const ConnectedSelect = ({
   disabled,
   name,
+  customValidations,
   ...rest
 }) => {
   const {
     error,
@@ -13,9 +14,10 @@
     ref,
     isRequired
   } = useField({
     name,
-    disabled
+    disabled,
+    customValidations
   });
   return /*#__PURE__*/_jsx(Select, {
     "aria-required": isRequired,
     disabled: isDisabled,
Index: package/dist/ConnectedForm/ConnectedInputs/ConnectedTextArea.js
===================================================================
--- package/dist/ConnectedForm/ConnectedInputs/ConnectedTextArea.js
+++ package/dist/ConnectedForm/ConnectedInputs/ConnectedTextArea.js
@@ -4,8 +4,9 @@
 import { jsx as _jsx } from "react/jsx-runtime";
 export const ConnectedTextArea = ({
   disabled,
   name,
+  customValidations,
   ...rest
 }) => {
   const {
     error,
@@ -13,9 +14,10 @@
     ref,
     isRequired
   } = useField({
     name,
-    disabled
+    disabled,
+    customValidations
   });
   return /*#__PURE__*/_jsx(TextArea, {
     "aria-required": isRequired,
     disabled: isDisabled,
Index: package/dist/ConnectedForm/ConnectedInputs/ConnectedNestedCheckboxes/index.js
===================================================================
--- package/dist/ConnectedForm/ConnectedInputs/ConnectedNestedCheckboxes/index.js
+++ package/dist/ConnectedForm/ConnectedInputs/ConnectedNestedCheckboxes/index.js
@@ -9,9 +9,10 @@
   name,
   options,
   disabled,
   onUpdate,
-  spacing
+  spacing,
+  customValidations
 }) => {
   const {
     isDisabled,
     control,
@@ -20,9 +21,10 @@
     getValues,
     setValue
   } = useField({
     name,
-    disabled
+    disabled,
+    customValidations
   });
   const defaultValue = getValues()[name];
   const flatOptions = useMemo(() => flattenOptions(options), [options]);
   const [hasExpandedInitially, setHasExpandedInitially] = useState(false);
Index: package/dist/ConnectedForm/utils.js
===================================================================
--- package/dist/ConnectedForm/utils.js
+++ package/dist/ConnectedForm/utils.js
@@ -75,9 +75,10 @@
 };
 export const useField = ({
   name,
   disabled,
-  loading
+  loading,
+  customValidations
 }) => {
   // This is fixed in a later react-hook-form version:
   // https://github.com/react-hook-form/react-hook-form/issues/2887
   // eslint-disable-next-line @typescript-eslint/unbound-method
@@ -100,9 +101,13 @@
   } = useSubmitState({
     disabled: disabled || formStateDisabled,
     loading
   });
-  const validation = (validationRules && validationRules[name]) ?? undefined;
+  const formValidation = (validationRules && validationRules[name]) ?? undefined;
+  const validation = formValidation || customValidations ? {
+    ...formValidation,
+    ...customValidations
+  } : undefined;
   const ref = register(name, validation);
   return {
     control,
     error,
@@ -231,14 +236,16 @@
   watchUpdateKeyName,
   disabled,
   loading,
   type,
-  shouldDirtyOnChange
+  shouldDirtyOnChange,
+  customValidations
 }) {
   const useFieldPayload = useField({
     name,
     disabled,
-    loading
+    loading,
+    customValidations
   });
   const defaultValue = type === 'checkbox' ? false : '';
 
   // START - Specific to useDebouncedField - START
Index: package/package.json
===================================================================
--- package/package.json
+++ package/package.json
@@ -1,16 +1,16 @@
 {
   "name": "@codecademy/gamut",
   "description": "Styleguide & Component library for Codecademy",
-  "version": "71.0.0",
+  "version": "71.0.1-alpha.c9e50f.0",
   "author": "Codecademy Engineering <[email protected]>",
   "bin": "./bin/gamut.mjs",
   "dependencies": {
-    "@codecademy/gamut-icons": "9.57.7",
-    "@codecademy/gamut-illustrations": "0.58.13",
-    "@codecademy/gamut-patterns": "0.10.32",
-    "@codecademy/gamut-styles": "20.0.0",
-    "@codecademy/variance": "0.26.1",
+    "@codecademy/gamut-icons": "9.57.8-alpha.c9e50f.0",
+    "@codecademy/gamut-illustrations": "0.58.14-alpha.c9e50f.0",
+    "@codecademy/gamut-patterns": "0.10.33-alpha.c9e50f.0",
+    "@codecademy/gamut-styles": "20.0.1-alpha.c9e50f.0",
+    "@codecademy/variance": "0.26.2-alpha.c9e50f.0",
     "@formatjs/intl-locale": "5.3.1",
     "@react-aria/interactions": "3.25.0",
     "@types/marked": "^4.0.8",
     "@vidstack/react": "^1.12.12",
Index: package/dist/ConnectedForm/ConnectedFormGroup.d.ts
===================================================================
--- package/dist/ConnectedForm/ConnectedFormGroup.d.ts
+++ package/dist/ConnectedForm/ConnectedFormGroup.d.ts
@@ -1,5 +1,6 @@
 import * as React from 'react';
+import { RegisterOptions } from 'react-hook-form';
 import { FormGroupProps } from '..';
 import { InfoTipSubComponentProps } from '../Tip/InfoTip/type-utils';
 import { ConnectedField, FieldProps, SubmitContextProps } from './types';
 export interface ConnectedFormGroupBaseProps extends Omit<FormGroupProps, 'label' | 'disabled' | 'description' | 'htmlFor'> {
@@ -19,7 +20,9 @@
 export interface ConnectedFormGroupProps<T extends ConnectedField> extends SubmitContextProps, ConnectedFormGroupBaseProps {
     /**
      * An object consisting of a `component` key to specify what ConnectedFormInput to render - the remaining key/value pairs are that components desired props.
      */
-    field: Omit<React.ComponentProps<T>, 'name' | 'disabled'> & FieldProps<T>;
+    field: Omit<React.ComponentProps<T>, 'name' | 'disabled'> & FieldProps<T> & {
+        customValidations?: RegisterOptions;
+    };
 }
 export declare function ConnectedFormGroup<T extends ConnectedField>({ customError, children, disabled, errorType, field, hideLabel, id, label, name, labelSize, spacing, isSoloField, infotip, }: ConnectedFormGroupProps<T>): import("react/jsx-runtime").JSX.Element;
Index: package/dist/ConnectedForm/ConnectedInputs/types.d.ts
===================================================================
--- package/dist/ConnectedForm/ConnectedInputs/types.d.ts
+++ package/dist/ConnectedForm/ConnectedInputs/types.d.ts
@@ -1,11 +1,13 @@
 import { ReactNode } from 'react';
+import { RegisterOptions } from 'react-hook-form';
 import { CheckboxLabelUnion, CheckboxProps, InputWrapperProps, RadioGroupProps, RadioProps, SelectProps, TextAreaProps } from '../../Form';
 export interface BaseConnectedFieldProps {
     onUpdate?: (value: boolean) => void;
 }
 export interface ConnectedFieldProps extends BaseConnectedFieldProps {
     name: string;
+    customValidations?: RegisterOptions;
 }
 export interface MinimalCheckboxProps extends Omit<CheckboxProps, 'defaultValue' | 'name' | 'htmlFor' | 'validation' | 'label' | 'aria-label'> {
 }
 export interface BaseConnectedCheckboxProps extends MinimalCheckboxProps, ConnectedFieldProps {
@@ -33,9 +35,9 @@
 }
 export type NestedConnectedCheckboxOption = Omit<MinimalCheckboxProps, 'spacing'> & CheckboxLabelUnion & {
     options?: NestedConnectedCheckboxOption[];
 };
-export interface ConnectedNestedCheckboxesProps extends Pick<BaseConnectedCheckboxProps, 'name' | 'disabled' | 'spacing'> {
+export interface ConnectedNestedCheckboxesProps extends Pick<BaseConnectedCheckboxProps, 'name' | 'disabled' | 'spacing' | 'customValidations'> {
     options: NestedConnectedCheckboxOption[];
     onUpdate?: (values: string[]) => void;
 }
 export {};
Index: package/dist/ConnectedForm/utils.d.ts
===================================================================
--- package/dist/ConnectedForm/utils.d.ts
+++ package/dist/ConnectedForm/utils.d.ts
@@ -63,10 +63,11 @@
     watch: import("react-hook-form").UseFormWatch<import("react-hook-form").FieldValues>;
 };
 interface useFieldProps extends SubmitContextProps {
     name: string;
+    customValidations?: RegisterOptions;
 }
-export declare const useField: ({ name, disabled, loading }: useFieldProps) => {
+export declare const useField: ({ name, disabled, loading, customValidations, }: useFieldProps) => {
     control: import("react-hook-form").Control<import("react-hook-form").FieldValues, any, import("react-hook-form").FieldValues>;
     error: string | FieldError | Merge<FieldError, FieldErrorsImpl<any>> | undefined;
     getValues: import("react-hook-form").UseFormGetValues<import("react-hook-form").FieldValues>;
     isDisabled: boolean;
@@ -111,13 +112,13 @@
  * for something that I think could be modified to make this better
  * but I couldn't get it to work
  */
 type InputTypes = Extract<HTMLInputTypeAttribute, 'number' | 'color' | 'date' | 'datetime-local' | 'time' | 'image' | 'checkbox' | 'text' | 'hidden' | 'password' | 'radio' | 'range' | 'email' | 'search' | 'month' | 'tel' | 'time' | 'url' | 'week'> | 'textarea' | 'select';
-type DebouncedFieldProps<T extends InputTypes> = Omit<GetInitialFormValueProps, 'setLocalValue' | 'defaultValue'> & Pick<useFieldProps, 'loading' | 'disabled' | 'name'> & {
+type DebouncedFieldProps<T extends InputTypes> = Omit<GetInitialFormValueProps, 'setLocalValue' | 'defaultValue'> & Pick<useFieldProps, 'loading' | 'disabled' | 'name' | 'customValidations'> & {
     type: T;
     shouldDirtyOnChange?: boolean;
 };
-export declare function useDebouncedField<T extends InputTypes>({ name, watchUpdateKeyName, disabled, loading, type, shouldDirtyOnChange, }: DebouncedFieldProps<T>): {
+export declare function useDebouncedField<T extends InputTypes>({ name, watchUpdateKeyName, disabled, loading, type, shouldDirtyOnChange, customValidations, }: DebouncedFieldProps<T>): {
     onBlur: () => void;
     onChange: ChangeEventHandler<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>;
     value: T extends "checkbox" ? boolean : string;
     error: string | FieldError | Merge<FieldError, FieldErrorsImpl<any>> | undefined;