@govtechsg/sgds-web-component 3.23.0-rc.1 → 3.23.0-rc.3

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 (124) hide show
  1. package/base/select-element.d.ts +4 -0
  2. package/base/select-element.js +6 -0
  3. package/base/select-element.js.map +1 -1
  4. package/components/Checkbox/checkbox-group.js +1 -1
  5. package/components/Checkbox/index.umd.min.js +3 -3
  6. package/components/Checkbox/index.umd.min.js.map +1 -1
  7. package/components/Checkbox/sgds-checkbox-group.d.ts +5 -0
  8. package/components/Checkbox/sgds-checkbox-group.js +10 -0
  9. package/components/Checkbox/sgds-checkbox-group.js.map +1 -1
  10. package/components/Checkbox/sgds-checkbox.d.ts +5 -1
  11. package/components/Checkbox/sgds-checkbox.js +10 -1
  12. package/components/Checkbox/sgds-checkbox.js.map +1 -1
  13. package/components/ComboBox/index.umd.min.js +7 -6
  14. package/components/ComboBox/index.umd.min.js.map +1 -1
  15. package/components/ComboBox/sgds-combo-box.d.ts +11 -0
  16. package/components/ComboBox/sgds-combo-box.js +34 -0
  17. package/components/ComboBox/sgds-combo-box.js.map +1 -1
  18. package/components/Datepicker/index.umd.min.js +1 -1
  19. package/components/Datepicker/index.umd.min.js.map +1 -1
  20. package/components/Drawer/index.umd.min.js +10 -5
  21. package/components/Drawer/index.umd.min.js.map +1 -1
  22. package/components/Drawer/sgds-drawer.js +5 -4
  23. package/components/Drawer/sgds-drawer.js.map +1 -1
  24. package/components/FileUpload/index.umd.min.js +7 -7
  25. package/components/FileUpload/index.umd.min.js.map +1 -1
  26. package/components/Input/index.umd.min.js +2 -2
  27. package/components/Input/index.umd.min.js.map +1 -1
  28. package/components/Input/input.js +1 -1
  29. package/components/Mainnav/index.umd.min.js +3 -1
  30. package/components/Mainnav/index.umd.min.js.map +1 -1
  31. package/components/Mainnav/sgds-mainnav-dropdown.d.ts +4 -0
  32. package/components/Mainnav/sgds-mainnav-dropdown.js +6 -0
  33. package/components/Mainnav/sgds-mainnav-dropdown.js.map +1 -1
  34. package/components/QuantityToggle/index.umd.min.js +2 -2
  35. package/components/QuantityToggle/index.umd.min.js.map +1 -1
  36. package/components/Radio/index.umd.min.js +3 -3
  37. package/components/Radio/index.umd.min.js.map +1 -1
  38. package/components/Radio/sgds-radio-group.d.ts +4 -0
  39. package/components/Radio/sgds-radio-group.js +9 -0
  40. package/components/Radio/sgds-radio-group.js.map +1 -1
  41. package/components/Select/index.umd.min.js +3 -3
  42. package/components/Select/index.umd.min.js.map +1 -1
  43. package/components/Select/sgds-select.d.ts +4 -0
  44. package/components/Select/sgds-select.js +10 -1
  45. package/components/Select/sgds-select.js.map +1 -1
  46. package/components/Switch/index.umd.min.js +1 -1
  47. package/components/Switch/index.umd.min.js.map +1 -1
  48. package/components/Textarea/index.umd.min.js +1 -1
  49. package/components/Textarea/index.umd.min.js.map +1 -1
  50. package/components/index.umd.min.js +80 -77
  51. package/components/index.umd.min.js.map +1 -1
  52. package/custom-elements.json +309 -28
  53. package/index.umd.min.js +83 -80
  54. package/index.umd.min.js.map +1 -1
  55. package/package.json +1 -1
  56. package/react/base/select-element.cjs.js +6 -0
  57. package/react/base/select-element.cjs.js.map +1 -1
  58. package/react/base/select-element.js +6 -0
  59. package/react/base/select-element.js.map +1 -1
  60. package/react/checkbox/index.cjs.js +3 -1
  61. package/react/checkbox/index.cjs.js.map +1 -1
  62. package/react/checkbox/index.js +3 -1
  63. package/react/checkbox/index.js.map +1 -1
  64. package/react/checkbox-group/index.cjs.js +3 -1
  65. package/react/checkbox-group/index.cjs.js.map +1 -1
  66. package/react/checkbox-group/index.js +3 -1
  67. package/react/checkbox-group/index.js.map +1 -1
  68. package/react/combo-box/index.cjs.js +1 -0
  69. package/react/combo-box/index.cjs.js.map +1 -1
  70. package/react/combo-box/index.js +1 -0
  71. package/react/combo-box/index.js.map +1 -1
  72. package/react/components/Checkbox/checkbox-group.cjs.js +1 -1
  73. package/react/components/Checkbox/checkbox-group.js +1 -1
  74. package/react/components/Checkbox/sgds-checkbox-group.cjs.js +10 -0
  75. package/react/components/Checkbox/sgds-checkbox-group.cjs.js.map +1 -1
  76. package/react/components/Checkbox/sgds-checkbox-group.js +10 -0
  77. package/react/components/Checkbox/sgds-checkbox-group.js.map +1 -1
  78. package/react/components/Checkbox/sgds-checkbox.cjs.js +10 -1
  79. package/react/components/Checkbox/sgds-checkbox.cjs.js.map +1 -1
  80. package/react/components/Checkbox/sgds-checkbox.js +10 -1
  81. package/react/components/Checkbox/sgds-checkbox.js.map +1 -1
  82. package/react/components/ComboBox/sgds-combo-box.cjs.js +34 -0
  83. package/react/components/ComboBox/sgds-combo-box.cjs.js.map +1 -1
  84. package/react/components/ComboBox/sgds-combo-box.js +34 -0
  85. package/react/components/ComboBox/sgds-combo-box.js.map +1 -1
  86. package/react/components/Drawer/sgds-drawer.cjs.js +4 -3
  87. package/react/components/Drawer/sgds-drawer.cjs.js.map +1 -1
  88. package/react/components/Drawer/sgds-drawer.js +5 -4
  89. package/react/components/Drawer/sgds-drawer.js.map +1 -1
  90. package/react/components/Input/input.cjs.js +1 -1
  91. package/react/components/Input/input.js +1 -1
  92. package/react/components/Mainnav/sgds-mainnav-dropdown.cjs.js +6 -0
  93. package/react/components/Mainnav/sgds-mainnav-dropdown.cjs.js.map +1 -1
  94. package/react/components/Mainnav/sgds-mainnav-dropdown.js +6 -0
  95. package/react/components/Mainnav/sgds-mainnav-dropdown.js.map +1 -1
  96. package/react/components/Radio/sgds-radio-group.cjs.js +9 -0
  97. package/react/components/Radio/sgds-radio-group.cjs.js.map +1 -1
  98. package/react/components/Radio/sgds-radio-group.js +9 -0
  99. package/react/components/Radio/sgds-radio-group.js.map +1 -1
  100. package/react/components/Select/sgds-select.cjs.js +9 -0
  101. package/react/components/Select/sgds-select.cjs.js.map +1 -1
  102. package/react/components/Select/sgds-select.js +10 -1
  103. package/react/components/Select/sgds-select.js.map +1 -1
  104. package/react/radio-group/index.cjs.js +3 -1
  105. package/react/radio-group/index.cjs.js.map +1 -1
  106. package/react/radio-group/index.js +3 -1
  107. package/react/radio-group/index.js.map +1 -1
  108. package/react/select/index.cjs.js +2 -0
  109. package/react/select/index.cjs.js.map +1 -1
  110. package/react/select/index.js +2 -0
  111. package/react/select/index.js.map +1 -1
  112. package/react/styles/form-label.cjs.js +1 -1
  113. package/react/styles/form-label.js +1 -1
  114. package/react/styles/form-text-control.cjs.js +1 -1
  115. package/react/styles/form-text-control.js +1 -1
  116. package/react/utils/validatorMixin.cjs.js +9 -11
  117. package/react/utils/validatorMixin.cjs.js.map +1 -1
  118. package/react/utils/validatorMixin.js +9 -11
  119. package/react/utils/validatorMixin.js.map +1 -1
  120. package/styles/form-label.js +1 -1
  121. package/styles/form-text-control.js +1 -1
  122. package/types/react.d.ts +30 -3
  123. package/utils/validatorMixin.js +9 -11
  124. package/utils/validatorMixin.js.map +1 -1
package/types/react.d.ts CHANGED
@@ -289,9 +289,10 @@ export interface SgdsCheckboxGroupProps extends SgdsBaseProps {
289
289
  hintText?: string;
290
290
  /** Makes the checkbox group a required field. Only available for when multiselect is true */
291
291
  required?: boolean;
292
+ /** Disables native and sgds validation for the checkbox group. */
293
+ noValidate?: boolean;
292
294
  /** Consolidates the values of its child checked checkboxes into a single string with semi-colon delimiter. Only available when required is true */
293
295
  value?: string;
294
- defaultValue?: string;
295
296
  /** Returns the ValidityState object */
296
297
  validity?: ValidityState;
297
298
  /** Returns the validation message based on the ValidityState */
@@ -304,6 +305,10 @@ export interface SgdsCheckboxGroupProps extends SgdsBaseProps {
304
305
  invalid?: boolean;
305
306
  "onsgds-change"?: SgdsEventHandler;
306
307
  onSgdsChange?: SgdsEventHandler;
308
+ "onsgds-invalid"?: SgdsEventHandler;
309
+ onSgdsInvalid?: SgdsEventHandler;
310
+ "onsgds-valid"?: SgdsEventHandler;
311
+ onSgdsValid?: SgdsEventHandler;
307
312
  }
308
313
 
309
314
  // ── Checkbox ─────────────────────────────────────────────────────────────
@@ -315,12 +320,12 @@ export interface SgdsCheckboxProps extends SgdsBaseProps {
315
320
  checked?: boolean;
316
321
  /** Allows invalidFeedback, invalid and valid styles to be visible with the input */
317
322
  hasFeedback?: "style" | "text" | "both";
318
- /** 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. */
319
- defaultChecked?: boolean;
320
323
  /** Marks the checkbox input as indeterminate , with indeterminate logo */
321
324
  indeterminate?: boolean;
322
325
  /** Makes the checkbox a required field. */
323
326
  required?: boolean;
327
+ /** Disables native and sgds validation for the checkbox. */
328
+ noValidate?: boolean;
324
329
  /** Feedback text for error state when validated */
325
330
  invalidFeedback?: string;
326
331
  /** Returns the ValidityState object */
@@ -347,6 +352,10 @@ export interface SgdsCheckboxProps extends SgdsBaseProps {
347
352
  onSgdsCheck?: SgdsEventHandler;
348
353
  "onsgds-uncheck"?: SgdsEventHandler;
349
354
  onSgdsUncheck?: SgdsEventHandler;
355
+ "onsgds-invalid"?: SgdsEventHandler;
356
+ onSgdsInvalid?: SgdsEventHandler;
357
+ "onsgds-valid"?: SgdsEventHandler;
358
+ onSgdsValid?: SgdsEventHandler;
350
359
  }
351
360
 
352
361
  // ── CloseButton ─────────────────────────────────────────────────────────────
@@ -384,6 +393,8 @@ export interface SgdsComboBoxProps extends SgdsBaseProps {
384
393
  async?: boolean;
385
394
  /** When filtering remotely and there are no results, set this to true to enable no options feedback on the menu. Applicable for async combo box only. */
386
395
  emptyMenuAsync?: boolean;
396
+ /** Number of pixels from the bottom of the menu at which the sgds-scroll-end event fires. */
397
+ scrollBottomOffset?: number;
387
398
  /** The function used to filter the menu list, given the user's input value. */
388
399
  filterFunction?: (inputValue: string, item: SgdsComboBoxOptionData) => boolean;
389
400
  /** The input's label */
@@ -446,6 +457,8 @@ value: string;
446
457
  onSgdsInvalid?: SgdsEventHandler;
447
458
  "onsgds-valid"?: SgdsEventHandler;
448
459
  onSgdsValid?: SgdsEventHandler;
460
+ "onsgds-scroll-end"?: SgdsEventHandler;
461
+ onSgdsScrollEnd?: SgdsEventHandler;
449
462
  "onsgds-show"?: SgdsEventHandler;
450
463
  onSgdsShow?: SgdsEventHandler;
451
464
  "onsgds-after-show"?: SgdsEventHandler;
@@ -905,6 +918,8 @@ export interface SgdsMainnavDropdownProps extends SgdsBaseProps {
905
918
  active?: boolean;
906
919
  /** When true, applies active styles on the dropdown button */
907
920
  disabled?: boolean;
921
+ /** Accessible label for the dropdown's toggle button. Forwarded to the button's aria-label attribute. */
922
+ ariaLabel?: string;
908
923
  }
909
924
 
910
925
  // ── MainnavItem ─────────────────────────────────────────────────────────────
@@ -1067,6 +1082,8 @@ export interface SgdsRadioGroupProps extends SgdsBaseProps {
1067
1082
  hasFeedback?: boolean;
1068
1083
  /** Makes the input as a required field. */
1069
1084
  required?: boolean;
1085
+ /** Disables native and sgds validation for the radio group. */
1086
+ noValidate?: boolean;
1070
1087
  /** Automatically focuses the selected radio input in the group when it becomes checked. */
1071
1088
  autofocus?: boolean;
1072
1089
  /** Returns the ValidityState object */
@@ -1085,6 +1102,10 @@ export interface SgdsRadioGroupProps extends SgdsBaseProps {
1085
1102
  invalid?: boolean;
1086
1103
  "onsgds-change"?: (event: CustomEvent<ISgdsRadioGroupChangeEventDetail>) => void;
1087
1104
  onSgdsChange?: (event: CustomEvent<ISgdsRadioGroupChangeEventDetail>) => void;
1105
+ "onsgds-invalid"?: SgdsEventHandler;
1106
+ onSgdsInvalid?: SgdsEventHandler;
1107
+ "onsgds-valid"?: SgdsEventHandler;
1108
+ onSgdsValid?: SgdsEventHandler;
1088
1109
  }
1089
1110
 
1090
1111
  // ── Radio ─────────────────────────────────────────────────────────────
@@ -1118,6 +1139,8 @@ export interface SgdsSelectOptionProps extends SgdsBaseProps {
1118
1139
  // ── Select ─────────────────────────────────────────────────────────────
1119
1140
 
1120
1141
  export interface SgdsSelectProps extends SgdsBaseProps {
1142
+ /** Disables native and sgds validation for the select. */
1143
+ noValidate?: boolean;
1121
1144
  /** The input's label */
1122
1145
  label?: string;
1123
1146
  /** The input's hint text below the label */
@@ -1172,6 +1195,10 @@ value: string;
1172
1195
  onSgdsFocus?: SgdsEventHandler;
1173
1196
  "onsgds-blur"?: SgdsEventHandler;
1174
1197
  onSgdsBlur?: SgdsEventHandler;
1198
+ "onsgds-invalid"?: SgdsEventHandler;
1199
+ onSgdsInvalid?: SgdsEventHandler;
1200
+ "onsgds-valid"?: SgdsEventHandler;
1201
+ onSgdsValid?: SgdsEventHandler;
1175
1202
  "onsgds-show"?: SgdsEventHandler;
1176
1203
  onSgdsShow?: SgdsEventHandler;
1177
1204
  "onsgds-after-show"?: SgdsEventHandler;
@@ -19,9 +19,7 @@ const SgdsFormValidatorMixin = (superClass) => {
19
19
  connectedCallback() {
20
20
  var _a;
21
21
  super.connectedCallback();
22
- if (this._mixinShouldSkipSgdsValidation())
23
- return;
24
- /** Idempotency guarantee */
22
+ /** Idempotency guarantee — always create so reset can clear validity even with noValidate */
25
23
  (_a = this.inputValidationController) !== null && _a !== void 0 ? _a : (this.inputValidationController = new InputValidationController(this));
26
24
  }
27
25
  async firstUpdated(changedProperties) {
@@ -78,19 +76,19 @@ const SgdsFormValidatorMixin = (superClass) => {
78
76
  }
79
77
  /**
80
78
  * During form resetting,
81
- * 1. ValidityState is reset
82
- * 2. invalid reactive prop is updated after the reset
83
- * 3. Revalidates the ValidityState (but do not update invalid prop)
84
- * to prepare for the next validity check
85
- * 4. Reset touched state to false for a pristine form
79
+ * 1. ValidityState is reset (always, regardless of noValidate)
80
+ * 2. invalid reactive prop is updated after the reset (always)
81
+ * 3. Reset touched state to false for a pristine form (always)
82
+ * 4. Revalidates the ValidityState (but do not update invalid prop)
83
+ * to prepare for the next validity check (skipped when noValidate)
86
84
  */
87
85
  _mixinResetValidity(input) {
88
- if (this._mixinShouldSkipSgdsValidation())
89
- return;
90
86
  this.inputValidationController.resetValidity();
91
87
  this.inputValidationController.updateInvalidState();
92
- this.inputValidationController.validateInput(input);
93
88
  this._isTouched ? (this._isTouched = false) : null;
89
+ if (this._mixinShouldSkipSgdsValidation())
90
+ return;
91
+ this.inputValidationController.validateInput(input);
94
92
  }
95
93
  _mixinValidate(input) {
96
94
  if (this._mixinShouldSkipSgdsValidation())
@@ -1 +1 @@
1
- {"version":3,"file":"validatorMixin.js","sources":["../../src/utils/validatorMixin.ts"],"sourcesContent":["import { LitElement, PropertyValueMap } from \"lit\";\nimport { queryAsync } from \"lit/decorators.js\";\nimport { SgdsInput } from \"../components\";\nimport { InputValidationController } from \"./inputValidationController\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Constructor<T> = new (...args: any[]) => T;\n\n/**\n * @summary The FormValidationMixin used by the form components\n * @param superClass\n * @returns\n */\nexport const SgdsFormValidatorMixin = <T extends Constructor<LitElement>>(superClass: T) => {\n class ToBeValidatedElement extends superClass {\n static formAssociated = true;\n inputValidationController: InputValidationController;\n input: HTMLInputElement | SgdsInput | HTMLTextAreaElement;\n private _isTouched = false;\n private _internals: ElementInternals;\n @queryAsync(\"sgds-input\") sgdsInput: Promise<SgdsInput>;\n @queryAsync(\"sgds-datepicker-input\") sgdsDatepickerInput: Promise<SgdsInput>;\n\n // TypeScript requires mixin constructors to have rest parameter of type any[]\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n constructor(...args: any[]) {\n super(...args);\n this._internals = this.attachInternals();\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n\n if (this._mixinShouldSkipSgdsValidation()) return;\n\n /** Idempotency guarantee */\n this.inputValidationController ??= new InputValidationController(this);\n }\n async firstUpdated(changedProperties: PropertyValueMap<this>) {\n super.firstUpdated(changedProperties);\n\n /* Either input or sgds-input. For example, quantity-toggle uses sgds-input */\n this.input =\n this.shadowRoot.querySelector(\"input\") ||\n (await this.sgdsInput) ||\n this.shadowRoot.querySelector(\"textarea\") ||\n (await this.sgdsDatepickerInput);\n\n this._mixinSetFormValue();\n\n if (this._mixinShouldSkipSgdsValidation()) return;\n\n this._mixinValidate(this.input);\n }\n\n /**\n * Native lifecycle of Form-Associated Custom Element Callbacks\n */\n formResetCallback() {\n if (this._mixinResetFormControl) {\n this._mixinResetFormControl();\n } else {\n this.value = this.defaultValue;\n this._mixinResetValidity(this.input);\n }\n this._mixinSetFormValue();\n }\n /**\n *\n * Methods use by classes using this mixin\n */\n\n /**\n * OnChange of form component\n * 1. Make value of control accessible via FormData\n * 2. Run change handler\n */\n _mixinHandleChange(e: Event): void {\n this._mixinSetFormValue();\n if (this._mixinShouldSkipSgdsValidation()) return;\n this.inputValidationController.handleChange(e);\n }\n /**\n * OnChange of form component\n * 1. Make value of control accessible via FormData\n * 2. Run input handler\n */\n _mixinHandleInputChange(e: Event): void {\n this._mixinSetFormValue();\n if (this._mixinShouldSkipSgdsValidation()) return;\n this.inputValidationController.handleInput(e);\n }\n /**\n * During form resetting,\n * 1. ValidityState is reset\n * 2. invalid reactive prop is updated after the reset\n * 3. Revalidates the ValidityState (but do not update invalid prop)\n * to prepare for the next validity check\n * 4. Reset touched state to false for a pristine form\n */\n _mixinResetValidity(input: HTMLInputElement | SgdsInput | HTMLTextAreaElement) {\n if (this._mixinShouldSkipSgdsValidation()) return;\n this.inputValidationController.resetValidity();\n this.inputValidationController.updateInvalidState();\n this.inputValidationController.validateInput(input);\n this._isTouched ? (this._isTouched = false) : null;\n }\n\n _mixinValidate(input: HTMLInputElement | SgdsInput | HTMLTextAreaElement) {\n if (this._mixinShouldSkipSgdsValidation()) return;\n this.inputValidationController.validateInput(input);\n }\n _mixinSetFormValue() {\n const value = this.value as string | FormData | File;\n this._internals.setFormValue(value);\n }\n _mixinCheckValidity(): boolean {\n if (this._mixinShouldSkipSgdsValidation()) return true;\n return this.inputValidationController.checkValidity();\n }\n _mixinReportValidity(): boolean {\n if (this._mixinShouldSkipSgdsValidation()) return true;\n return this.inputValidationController.reportValidity();\n }\n _mixinGetValidity(): ValidityState {\n return this._internals.validity;\n }\n _mixinGetValidationMessage(): string {\n return this._internals.validationMessage;\n }\n _mixinSetValidity(flags?: ValidityStateFlags, message?: string, anchor?: HTMLElement): void {\n if (this._mixinShouldSkipSgdsValidation()) return;\n return this.inputValidationController.setValidity(flags, message, anchor);\n }\n // Only check for noValidate prop\n _mixinShouldSkipSgdsValidation() {\n const form = this.closest(\"form\");\n\n return form?.noValidate || this.noValidate;\n }\n\n /** DECLARED INSTANCE METHODS AND PROPERTIES*/\n\n /**\n * Resets a form control to its initial state\n */\n declare _mixinResetFormControl: () => void;\n declare value: string;\n declare defaultValue: string;\n declare defaultChecked: boolean;\n declare noValidate: boolean;\n }\n\n return ToBeValidatedElement as Constructor<ToBeValidatedElementInterface> & T;\n};\n\nexport declare class ToBeValidatedElementInterface {\n inputValidationController: InputValidationController;\n input: HTMLInputElement;\n _mixinHandleChange(e: Event): void;\n _mixinHandleInputChange(e: Event): void;\n _mixinResetValidity(input: HTMLInputElement | SgdsInput): void;\n _mixinValidate(input: HTMLInputElement | SgdsInput): void;\n _mixinSetFormValue(): void;\n _mixinCheckValidity(): boolean;\n _mixinReportValidity(): boolean;\n _mixinSetValidity(flags?: ValidityStateFlags, message?: string, anchor?: HTMLElement): void;\n _mixinGetValidity(): ValidityState;\n _mixinGetValidationMessage(): string;\n _mixinShouldSkipSgdsValidation(): boolean;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validatorMixin.js","sources":["../../src/utils/validatorMixin.ts"],"sourcesContent":["import { LitElement, PropertyValueMap } from \"lit\";\nimport { queryAsync } from \"lit/decorators.js\";\nimport { SgdsInput } from \"../components\";\nimport { InputValidationController } from \"./inputValidationController\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Constructor<T> = new (...args: any[]) => T;\n\n/**\n * @summary The FormValidationMixin used by the form components\n * @param superClass\n * @returns\n */\nexport const SgdsFormValidatorMixin = <T extends Constructor<LitElement>>(superClass: T) => {\n class ToBeValidatedElement extends superClass {\n static formAssociated = true;\n inputValidationController: InputValidationController;\n input: HTMLInputElement | SgdsInput | HTMLTextAreaElement;\n private _isTouched = false;\n private _internals: ElementInternals;\n @queryAsync(\"sgds-input\") sgdsInput: Promise<SgdsInput>;\n @queryAsync(\"sgds-datepicker-input\") sgdsDatepickerInput: Promise<SgdsInput>;\n\n // TypeScript requires mixin constructors to have rest parameter of type any[]\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n constructor(...args: any[]) {\n super(...args);\n this._internals = this.attachInternals();\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n\n /** Idempotency guarantee — always create so reset can clear validity even with noValidate */\n this.inputValidationController ??= new InputValidationController(this);\n }\n async firstUpdated(changedProperties: PropertyValueMap<this>) {\n super.firstUpdated(changedProperties);\n\n /* Either input or sgds-input. For example, quantity-toggle uses sgds-input */\n this.input =\n this.shadowRoot.querySelector(\"input\") ||\n (await this.sgdsInput) ||\n this.shadowRoot.querySelector(\"textarea\") ||\n (await this.sgdsDatepickerInput);\n\n this._mixinSetFormValue();\n\n if (this._mixinShouldSkipSgdsValidation()) return;\n\n this._mixinValidate(this.input);\n }\n\n /**\n * Native lifecycle of Form-Associated Custom Element Callbacks\n */\n formResetCallback() {\n if (this._mixinResetFormControl) {\n this._mixinResetFormControl();\n } else {\n this.value = this.defaultValue;\n this._mixinResetValidity(this.input);\n }\n this._mixinSetFormValue();\n }\n /**\n *\n * Methods use by classes using this mixin\n */\n\n /**\n * OnChange of form component\n * 1. Make value of control accessible via FormData\n * 2. Run change handler\n */\n _mixinHandleChange(e: Event): void {\n this._mixinSetFormValue();\n if (this._mixinShouldSkipSgdsValidation()) return;\n this.inputValidationController.handleChange(e);\n }\n /**\n * OnChange of form component\n * 1. Make value of control accessible via FormData\n * 2. Run input handler\n */\n _mixinHandleInputChange(e: Event): void {\n this._mixinSetFormValue();\n if (this._mixinShouldSkipSgdsValidation()) return;\n this.inputValidationController.handleInput(e);\n }\n /**\n * During form resetting,\n * 1. ValidityState is reset (always, regardless of noValidate)\n * 2. invalid reactive prop is updated after the reset (always)\n * 3. Reset touched state to false for a pristine form (always)\n * 4. Revalidates the ValidityState (but do not update invalid prop)\n * to prepare for the next validity check (skipped when noValidate)\n */\n _mixinResetValidity(input: HTMLInputElement | SgdsInput | HTMLTextAreaElement) {\n this.inputValidationController.resetValidity();\n this.inputValidationController.updateInvalidState();\n this._isTouched ? (this._isTouched = false) : null;\n if (this._mixinShouldSkipSgdsValidation()) return;\n this.inputValidationController.validateInput(input);\n }\n\n _mixinValidate(input: HTMLInputElement | SgdsInput | HTMLTextAreaElement) {\n if (this._mixinShouldSkipSgdsValidation()) return;\n this.inputValidationController.validateInput(input);\n }\n _mixinSetFormValue() {\n const value = this.value as string | FormData | File;\n this._internals.setFormValue(value);\n }\n _mixinCheckValidity(): boolean {\n if (this._mixinShouldSkipSgdsValidation()) return true;\n return this.inputValidationController.checkValidity();\n }\n _mixinReportValidity(): boolean {\n if (this._mixinShouldSkipSgdsValidation()) return true;\n return this.inputValidationController.reportValidity();\n }\n _mixinGetValidity(): ValidityState {\n return this._internals.validity;\n }\n _mixinGetValidationMessage(): string {\n return this._internals.validationMessage;\n }\n _mixinSetValidity(flags?: ValidityStateFlags, message?: string, anchor?: HTMLElement): void {\n if (this._mixinShouldSkipSgdsValidation()) return;\n return this.inputValidationController.setValidity(flags, message, anchor);\n }\n // Only check for noValidate prop\n _mixinShouldSkipSgdsValidation() {\n const form = this.closest(\"form\");\n\n return form?.noValidate || this.noValidate;\n }\n\n /** DECLARED INSTANCE METHODS AND PROPERTIES*/\n\n /**\n * Resets a form control to its initial state\n */\n declare _mixinResetFormControl: () => void;\n declare value: string;\n declare defaultValue: string;\n declare defaultChecked: boolean;\n declare noValidate: boolean;\n }\n\n return ToBeValidatedElement as Constructor<ToBeValidatedElementInterface> & T;\n};\n\nexport declare class ToBeValidatedElementInterface {\n inputValidationController: InputValidationController;\n input: HTMLInputElement;\n _mixinHandleChange(e: Event): void;\n _mixinHandleInputChange(e: Event): void;\n _mixinResetValidity(input: HTMLInputElement | SgdsInput): void;\n _mixinValidate(input: HTMLInputElement | SgdsInput): void;\n _mixinSetFormValue(): void;\n _mixinCheckValidity(): boolean;\n _mixinReportValidity(): boolean;\n _mixinSetValidity(flags?: ValidityStateFlags, message?: string, anchor?: HTMLElement): void;\n _mixinGetValidity(): ValidityState;\n _mixinGetValidationMessage(): string;\n _mixinShouldSkipSgdsValidation(): boolean;\n}\n"],"names":[],"mappings":"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"}