@mittwald/flow-react-components 0.2.0-alpha.387 → 0.2.0-alpha.389

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 (28) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/assets/doc-properties.json +19 -0
  3. package/dist/js/components/src/components/Autocomplete/Autocomplete.mjs +3 -14
  4. package/dist/js/components/src/components/Autocomplete/Autocomplete.mjs.map +1 -1
  5. package/dist/js/components/src/components/PasswordCreationField/PasswordCreationField.mjs +19 -5
  6. package/dist/js/components/src/components/PasswordCreationField/PasswordCreationField.mjs.map +1 -1
  7. package/dist/js/components/src/components/PasswordCreationField/components/ComplexityIndicator/ComplexityIndicator.mjs +22 -6
  8. package/dist/js/components/src/components/PasswordCreationField/components/ComplexityIndicator/ComplexityIndicator.mjs.map +1 -1
  9. package/dist/js/components/src/components/PasswordCreationField/lib/getStateFromLatestPolicyValidationResult.mjs +17 -19
  10. package/dist/js/components/src/components/PasswordCreationField/lib/getStateFromLatestPolicyValidationResult.mjs.map +1 -1
  11. package/dist/js/components/src/components/PasswordCreationField/lib/getStatusFromPolicyValidationResult.mjs +3 -3
  12. package/dist/js/components/src/components/PasswordCreationField/lib/getStatusFromPolicyValidationResult.mjs.map +1 -1
  13. package/dist/js/components/src/lib/react/ReactAriaControlledValueFix.mjs +6 -9
  14. package/dist/js/components/src/lib/react/ReactAriaControlledValueFix.mjs.map +1 -1
  15. package/dist/js/components/src/lib/react/emitElementValueChange.mjs +22 -0
  16. package/dist/js/components/src/lib/react/emitElementValueChange.mjs.map +1 -0
  17. package/dist/types/components/Autocomplete/Autocomplete.d.ts.map +1 -1
  18. package/dist/types/components/PasswordCreationField/PasswordCreationField.d.ts.map +1 -1
  19. package/dist/types/components/PasswordCreationField/components/ComplexityIndicator/ComplexityIndicator.d.ts +2 -0
  20. package/dist/types/components/PasswordCreationField/components/ComplexityIndicator/ComplexityIndicator.d.ts.map +1 -1
  21. package/dist/types/components/PasswordCreationField/lib/getStateFromLatestPolicyValidationResult.d.ts +2 -0
  22. package/dist/types/components/PasswordCreationField/lib/getStateFromLatestPolicyValidationResult.d.ts.map +1 -1
  23. package/dist/types/components/PasswordCreationField/lib/getStatusFromPolicyValidationResult.d.ts +3 -0
  24. package/dist/types/components/PasswordCreationField/lib/getStatusFromPolicyValidationResult.d.ts.map +1 -1
  25. package/dist/types/lib/react/ReactAriaControlledValueFix.d.ts.map +1 -1
  26. package/dist/types/lib/react/emitElementValueChange.d.ts +6 -0
  27. package/dist/types/lib/react/emitElementValueChange.d.ts.map +1 -0
  28. package/package.json +4 -4
package/CHANGELOG.md CHANGED
@@ -3,6 +3,16 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [0.2.0-alpha.389](https://github.com/mittwald/flow/compare/0.2.0-alpha.388...0.2.0-alpha.389) (2025-08-07)
7
+
8
+ **Note:** Version bump only for package @mittwald/flow-react-components
9
+
10
+ # [0.2.0-alpha.388](https://github.com/mittwald/flow/compare/0.2.0-alpha.387...0.2.0-alpha.388) (2025-08-07)
11
+
12
+ ### Bug Fixes
13
+
14
+ * **TextField:** fixes missing onChange when a controlled input value changes from something to empty ([#1827](https://github.com/mittwald/flow/issues/1827)) ([a8d12ba](https://github.com/mittwald/flow/commit/a8d12ba9230fe3670e8dab33bd5d3855f66ac96f))
15
+
6
16
  # [0.2.0-alpha.387](https://github.com/mittwald/flow/compare/0.2.0-alpha.386...0.2.0-alpha.387) (2025-08-06)
7
17
 
8
18
  **Note:** Version bump only for package @mittwald/flow-react-components
@@ -288664,6 +288664,25 @@
288664
288664
  "name": "boolean"
288665
288665
  }
288666
288666
  },
288667
+ "validationResultState": {
288668
+ "defaultValue": null,
288669
+ "description": "",
288670
+ "name": "validationResultState",
288671
+ "parent": {
288672
+ "fileName": "components/src/components/PasswordCreationField/components/ComplexityIndicator/ComplexityIndicator.tsx",
288673
+ "name": "ComplexityIndicatorProps"
288674
+ },
288675
+ "declarations": [
288676
+ {
288677
+ "fileName": "components/src/components/PasswordCreationField/components/ComplexityIndicator/ComplexityIndicator.tsx",
288678
+ "name": "ComplexityIndicatorProps"
288679
+ }
288680
+ ],
288681
+ "required": true,
288682
+ "type": {
288683
+ "name": "StateFromLatestPolicyValidationResult"
288684
+ }
288685
+ },
288667
288686
  "policyValidationResult": {
288668
288687
  "defaultValue": null,
288669
288688
  "description": "",
@@ -15,6 +15,7 @@ import locales from '../../../../_virtual/_.locale.json@48bdcfec6dd32df5dc9f6fa2
15
15
  import { Text } from '../Text/Text.mjs';
16
16
  import styles from './Autocomplete.module.scss.mjs';
17
17
  import { useLocalizedStringFormatter, useFocusWithin, UNSAFE_PortalProvider } from 'react-aria';
18
+ import { emitElementValueChange } from '../../lib/react/emitElementValueChange.mjs';
18
19
 
19
20
  const Autocomplete = flowComponent("Autocomplete", (props) => {
20
21
  const { children, ...rest } = props;
@@ -46,13 +47,7 @@ const Autocomplete = flowComponent("Autocomplete", (props) => {
46
47
  onAction: (key) => {
47
48
  const input = triggerRef.current;
48
49
  if (input) {
49
- const nativeInputValueSetter = Object.getOwnPropertyDescriptor(
50
- Object.getPrototypeOf(input),
51
- "value"
52
- )?.set;
53
- nativeInputValueSetter?.call(input, String(key));
54
- const event = new Event("change", { bubbles: true });
55
- input.dispatchEvent(event);
50
+ emitElementValueChange(input, String(key));
56
51
  }
57
52
  },
58
53
  triggerRef
@@ -76,13 +71,7 @@ const Autocomplete = flowComponent("Autocomplete", (props) => {
76
71
  const handleOptionAction = (key) => {
77
72
  const inputElement = triggerRef.current;
78
73
  if (inputElement) {
79
- const nativeInputValueSetter = Object.getOwnPropertyDescriptor(
80
- window.HTMLInputElement.prototype,
81
- "value"
82
- )?.set;
83
- nativeInputValueSetter?.call(inputElement, String(key));
84
- const event = new Event("change", { bubbles: true });
85
- inputElement.dispatchEvent(event);
74
+ emitElementValueChange(inputElement, String(key));
86
75
  }
87
76
  controller.close();
88
77
  };
@@ -1 +1 @@
1
- {"version":3,"file":"Autocomplete.mjs","sources":["../../../../../../src/components/Autocomplete/Autocomplete.tsx"],"sourcesContent":["import { useRef, type PropsWithChildren } from \"react\";\nimport type { PropsWithClassName } from \"@/lib/types/props\";\nimport { type PropsContext, PropsContextProvider } from \"@/lib/propsContext\";\nimport * as Aria from \"react-aria-components\";\nimport { useOverlayController } from \"@/lib/controller\";\nimport {\n flowComponent,\n type FlowComponentProps,\n} from \"@/lib/componentFactory/flowComponent\";\nimport type { SearchFieldProps } from \"@/components/SearchField\";\nimport type { TextFieldProps } from \"@/components/TextField\";\nimport Options from \"@/components/Options\";\nimport { TunnelExit } from \"@mittwald/react-tunnel\";\nimport locales from \"./locales/*.locale.json\";\nimport Text from \"@/components/Text\";\nimport styles from \"./Autocomplete.module.scss\";\nimport {\n UNSAFE_PortalProvider,\n useFocusWithin,\n useLocalizedStringFormatter,\n} from \"react-aria\";\nexport interface AutocompleteProps\n extends PropsWithChildren,\n PropsWithClassName,\n FlowComponentProps,\n Omit<Aria.AutocompleteProps, \"children\" | \"onInputChange\" | \"inputValue\"> {}\n\n/** @flr-generate all */\nexport const Autocomplete = flowComponent(\"Autocomplete\", (props) => {\n const { children, ...rest } = props;\n\n const { contains } = Aria.useFilter({ sensitivity: \"base\" });\n const stringFormatter = useLocalizedStringFormatter(locales);\n const container = useRef(null);\n const triggerRef = useRef<HTMLInputElement>(null);\n\n const controller = useOverlayController(\"Popover\", {\n reuseControllerFromContext: false,\n });\n\n const focusWithin = useFocusWithin({\n onBlurWithin: controller.close,\n });\n\n const inputProps: SearchFieldProps & TextFieldProps = {\n onKeyDown: (e) => {\n if (e.key === \"Enter\" && controller.isOpen) {\n e.preventDefault();\n }\n },\n ref: triggerRef,\n };\n\n const renderEmptyState = () => (\n <Text className={styles.empty}>\n {stringFormatter.format(\"autocomplete.empty\")}\n </Text>\n );\n\n const propsContext: PropsContext = {\n ContextMenu: {\n placement: \"bottom start\",\n controller,\n isNonModal: true,\n renderEmptyState: () => (\n <Text className={styles.empty}>\n {stringFormatter.format(\"autocomplete.empty\")}\n </Text>\n ),\n onAction: (key) => {\n const input = triggerRef.current;\n if (input) {\n const nativeInputValueSetter = Object.getOwnPropertyDescriptor(\n Object.getPrototypeOf(input),\n \"value\",\n )?.set;\n nativeInputValueSetter?.call(input, String(key));\n const event = new Event(\"change\", { bubbles: true });\n input.dispatchEvent(event);\n }\n },\n triggerRef,\n },\n SearchField: inputProps,\n TextField: inputProps,\n Option: {\n tunnelId: \"options\",\n },\n Popover: {\n className: styles.popover,\n },\n };\n\n const handleOnInputChange = (value: string) => {\n if (!value) {\n controller.close();\n } else if (!controller.isOpen) {\n controller.open();\n }\n };\n\n const handleOptionAction = (key: Aria.Key) => {\n const inputElement = triggerRef.current;\n if (inputElement) {\n // Set value on input element and trigger change event\n const nativeInputValueSetter = Object.getOwnPropertyDescriptor(\n window.HTMLInputElement.prototype,\n \"value\",\n )?.set;\n nativeInputValueSetter?.call(inputElement, String(key));\n const event = new Event(\"change\", { bubbles: true });\n inputElement.dispatchEvent(event);\n }\n controller.close();\n };\n\n return (\n <PropsContextProvider props={propsContext} mergeInParentContext>\n <div {...focusWithin.focusWithinProps} ref={container}>\n <UNSAFE_PortalProvider getContainer={() => container.current}>\n <Aria.Autocomplete\n onInputChange={handleOnInputChange}\n filter={contains}\n disableAutoFocusFirst\n {...rest}\n >\n {children}\n <Options\n onAction={handleOptionAction}\n triggerRef={triggerRef}\n controller={controller}\n renderEmptyState={renderEmptyState}\n isNonModal\n placement=\"bottom start\"\n >\n <TunnelExit id=\"options\" />\n </Options>\n </Aria.Autocomplete>\n </UNSAFE_PortalProvider>\n </div>\n </PropsContextProvider>\n );\n});\n\nexport default Autocomplete;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Autocomplete.mjs","sources":["../../../../../../src/components/Autocomplete/Autocomplete.tsx"],"sourcesContent":["import { useRef, type PropsWithChildren } from \"react\";\nimport type { PropsWithClassName } from \"@/lib/types/props\";\nimport { type PropsContext, PropsContextProvider } from \"@/lib/propsContext\";\nimport * as Aria from \"react-aria-components\";\nimport { useOverlayController } from \"@/lib/controller\";\nimport {\n flowComponent,\n type FlowComponentProps,\n} from \"@/lib/componentFactory/flowComponent\";\nimport type { SearchFieldProps } from \"@/components/SearchField\";\nimport type { TextFieldProps } from \"@/components/TextField\";\nimport Options from \"@/components/Options\";\nimport { TunnelExit } from \"@mittwald/react-tunnel\";\nimport locales from \"./locales/*.locale.json\";\nimport Text from \"@/components/Text\";\nimport styles from \"./Autocomplete.module.scss\";\nimport {\n UNSAFE_PortalProvider,\n useFocusWithin,\n useLocalizedStringFormatter,\n} from \"react-aria\";\nimport { emitElementValueChange } from \"@/lib/react/emitElementValueChange\";\nexport interface AutocompleteProps\n extends PropsWithChildren,\n PropsWithClassName,\n FlowComponentProps,\n Omit<Aria.AutocompleteProps, \"children\" | \"onInputChange\" | \"inputValue\"> {}\n\n/** @flr-generate all */\nexport const Autocomplete = flowComponent(\"Autocomplete\", (props) => {\n const { children, ...rest } = props;\n\n const { contains } = Aria.useFilter({ sensitivity: \"base\" });\n const stringFormatter = useLocalizedStringFormatter(locales);\n const container = useRef(null);\n const triggerRef = useRef<HTMLInputElement>(null);\n\n const controller = useOverlayController(\"Popover\", {\n reuseControllerFromContext: false,\n });\n\n const focusWithin = useFocusWithin({\n onBlurWithin: controller.close,\n });\n\n const inputProps: SearchFieldProps & TextFieldProps = {\n onKeyDown: (e) => {\n if (e.key === \"Enter\" && controller.isOpen) {\n e.preventDefault();\n }\n },\n ref: triggerRef,\n };\n\n const renderEmptyState = () => (\n <Text className={styles.empty}>\n {stringFormatter.format(\"autocomplete.empty\")}\n </Text>\n );\n\n const propsContext: PropsContext = {\n ContextMenu: {\n placement: \"bottom start\",\n controller,\n isNonModal: true,\n renderEmptyState: () => (\n <Text className={styles.empty}>\n {stringFormatter.format(\"autocomplete.empty\")}\n </Text>\n ),\n onAction: (key) => {\n const input = triggerRef.current;\n if (input) {\n emitElementValueChange(input, String(key));\n }\n },\n triggerRef,\n },\n SearchField: inputProps,\n TextField: inputProps,\n Option: {\n tunnelId: \"options\",\n },\n Popover: {\n className: styles.popover,\n },\n };\n\n const handleOnInputChange = (value: string) => {\n if (!value) {\n controller.close();\n } else if (!controller.isOpen) {\n controller.open();\n }\n };\n\n const handleOptionAction = (key: Aria.Key) => {\n const inputElement = triggerRef.current;\n if (inputElement) {\n // Set value on input element and trigger change event\n emitElementValueChange(inputElement, String(key));\n }\n controller.close();\n };\n\n return (\n <PropsContextProvider props={propsContext} mergeInParentContext>\n <div {...focusWithin.focusWithinProps} ref={container}>\n <UNSAFE_PortalProvider getContainer={() => container.current}>\n <Aria.Autocomplete\n onInputChange={handleOnInputChange}\n filter={contains}\n disableAutoFocusFirst\n {...rest}\n >\n {children}\n <Options\n onAction={handleOptionAction}\n triggerRef={triggerRef}\n controller={controller}\n renderEmptyState={renderEmptyState}\n isNonModal\n placement=\"bottom start\"\n >\n <TunnelExit id=\"options\" />\n </Options>\n </Aria.Autocomplete>\n </UNSAFE_PortalProvider>\n </div>\n </PropsContextProvider>\n );\n});\n\nexport default Autocomplete;\n"],"names":[],"mappings":"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"}
@@ -65,7 +65,7 @@ const PasswordCreationField = flowComponent(
65
65
  const deferredValue = useDeferredValue(value);
66
66
  const [isPasswordRevealed, setIsPasswordRevealed] = useState(false);
67
67
  const initialPolicyValidationState = {
68
- isValid: false,
68
+ isValid: true,
69
69
  complexity: {
70
70
  min: validationPolicy.minComplexity,
71
71
  actual: 4,
@@ -79,14 +79,28 @@ const PasswordCreationField = flowComponent(
79
79
  usePolicyValidationResult(
80
80
  validationPolicy,
81
81
  deferredValue,
82
- () => setIsLoading(() => true),
82
+ () => {
83
+ if (isEmptyValue) {
84
+ return;
85
+ }
86
+ setIsLoading(() => true);
87
+ },
83
88
  ({ password, isValid, results }) => {
89
+ if (isEmptyValue) {
90
+ setPolicyValidationResult(() => ({
91
+ ...results,
92
+ isValid: true
93
+ }));
94
+ return;
95
+ }
84
96
  setIsLoading(() => false);
85
97
  setPolicyValidationResult(() => results);
86
98
  onValidationResult?.({ password, isValid });
87
99
  }
88
100
  );
101
+ const isEmptyValue = !value;
89
102
  const stateFromValidationResult = getStateFromLatestPolicyValidationResult(
103
+ isEmptyValue,
90
104
  policyValidationResult
91
105
  );
92
106
  let latestValidationErrorText = void 0;
@@ -99,7 +113,6 @@ const PasswordCreationField = flowComponent(
99
113
  translationValues
100
114
  );
101
115
  }
102
- const isEmptyValue = !value;
103
116
  const isValidFromValidationResult = !isEmptyValue && stateFromValidationResult?.isValid;
104
117
  const isInvalidFromValidationResult = !isEmptyValue && !stateFromValidationResult?.isValid;
105
118
  const isInvalid = invalidFromProps || isInvalidFromValidationResult;
@@ -108,7 +121,7 @@ const PasswordCreationField = flowComponent(
108
121
  setPolicyValidationResult(() => ({
109
122
  ...initialPolicyValidationState,
110
123
  ...state,
111
- isValid: state.isValid ?? true
124
+ isValid: true
112
125
  }));
113
126
  };
114
127
  const onChangeHandler = (value2) => {
@@ -237,7 +250,8 @@ const PasswordCreationField = flowComponent(
237
250
  {
238
251
  isEmptyValue,
239
252
  isLoading,
240
- policyValidationResult
253
+ policyValidationResult,
254
+ validationResultState: stateFromValidationResult
241
255
  }
242
256
  )
243
257
  ]
@@ -1 +1 @@
1
- {"version":3,"file":"PasswordCreationField.mjs","sources":["../../../../../../src/components/PasswordCreationField/PasswordCreationField.tsx"],"sourcesContent":["import React, {\n type PropsWithChildren,\n useState,\n type ClipboardEvent,\n useDeferredValue,\n useMemo,\n} from \"react\";\nimport {\n ClearPropsContext,\n dynamic,\n type PropsContext,\n PropsContextProvider,\n} from \"@/lib/propsContext\";\nimport {\n flowComponent,\n type FlowComponentProps,\n} from \"@/lib/componentFactory/flowComponent\";\nimport styles from \"./PasswordCreationField.module.scss\";\nimport * as Aria from \"react-aria-components\";\nimport formFieldStyles from \"@/components/FormField/FormField.module.scss\";\nimport clsx from \"clsx\";\nimport { TunnelExit, TunnelProvider } from \"@mittwald/react-tunnel\";\nimport { type ActionFn } from \"@/components/Action\";\nimport getStateFromLatestPolicyValidationResult from \"@/components/PasswordCreationField/lib/getStateFromLatestPolicyValidationResult\";\nimport locales from \"./locales/*.locale.json\";\nimport generateValidationTranslation from \"@/components/PasswordCreationField/lib/generateValidationTranslation\";\nimport { FieldError } from \"@/components/FieldError\";\nimport FieldDescription from \"@/components/FieldDescription\";\nimport ComplexityIndicator from \"@/components/PasswordCreationField/components/ComplexityIndicator/ComplexityIndicator\";\nimport { generatePassword } from \"@/components/PasswordCreationField/worker/generatePassword\";\nimport TogglePasswordVisibilityButton from \"@/components/PasswordCreationField/components/TogglePasswordVisibilityButton/TogglePasswordVisibilityButton\";\nimport { defaultPasswordCreationPolicy } from \"@/components/PasswordCreationField/defaultPasswordCreationPolicy\";\nimport { FieldErrorContext } from \"react-aria-components\";\nimport { Wrap } from \"@/components/Wrap\";\nimport { ReactAriaControlledValueFix } from \"@/lib/react/ReactAriaControlledValueFix\";\nimport { ValidationResultButton } from \"@/components/PasswordCreationField/components/ValidationResultButton/ValidationResultButton\";\nimport { PasswordGenerateButton } from \"@/components/PasswordCreationField/components/PasswordGenerateButton/PasswordGenerateButton\";\nimport { useLocalizedContextStringFormatter } from \"@/components/TranslationProvider/useLocalizedContextStringFormatter\";\nimport type {\n PolicyValidationResult,\n PolicyGenericDeclaration,\n RuleValidationResult,\n} from \"@/integrations/@mittwald/password-tools-js\";\nimport { Policy } from \"@/integrations/@mittwald/password-tools-js\";\nimport { usePolicyValidationResult } from \"@/components/PasswordCreationField/lib/usePolicyValidationResult\";\n\nexport interface PasswordCreationFieldProps\n extends PropsWithChildren<\n Omit<Aria.TextFieldProps, \"children\" | \"value\" | \"defaultValue\"> &\n Partial<Pick<Aria.FieldErrorRenderProps, \"validationErrors\">>\n >,\n FlowComponentProps<HTMLInputElement> {\n value?: string;\n onValidationResult?: (result: { password: string; isValid: boolean }) => void;\n defaultValue?: string;\n placeholder?: string;\n validationPolicy?: PolicyGenericDeclaration;\n}\n\nexport interface ResolvedPolicyValidationResult\n extends Omit<PolicyValidationResult, \"isValid\"> {\n isValid: boolean | \"indeterminate\";\n ruleResults: RuleValidationResult[];\n}\n\n/**\n * @flr-generate all\n * @flr-clear-props-context\n */\nexport const PasswordCreationField = flowComponent(\n \"PasswordCreationField\",\n (props) => {\n const {\n children,\n className,\n ref,\n isDisabled,\n onChange: onChangeFromProps,\n onValidationResult,\n isInvalid: invalidFromProps,\n validationPolicy:\n validationPolicyFromProps = defaultPasswordCreationPolicy,\n isRequired,\n value: valueFromProps,\n defaultValue,\n ...rest\n } = props;\n\n const [isLoading, setIsLoading] = useState(false);\n const translate = useLocalizedContextStringFormatter(locales);\n const validationPolicy = useMemo(\n () => Policy.fromDeclaration(validationPolicyFromProps),\n [validationPolicyFromProps],\n );\n\n const isControlled = typeof valueFromProps !== \"undefined\";\n const hasDefaultValue = typeof defaultValue !== \"undefined\";\n const [internalValue, setInternalValue] = useState(\n hasDefaultValue ? defaultValue : \"\",\n );\n const value = isControlled ? valueFromProps : internalValue;\n const deferredValue = useDeferredValue(value);\n\n const [isPasswordRevealed, setIsPasswordRevealed] = useState(false);\n const initialPolicyValidationState: ResolvedPolicyValidationResult = {\n isValid: false,\n complexity: {\n min: validationPolicy.minComplexity,\n actual: 4,\n warning: null,\n },\n ruleResults: [],\n };\n\n const [policyValidationResult, setPolicyValidationResult] = useState(\n initialPolicyValidationState,\n );\n usePolicyValidationResult(\n validationPolicy,\n deferredValue,\n () => setIsLoading(() => true),\n ({ password, isValid, results }) => {\n setIsLoading(() => false);\n setPolicyValidationResult(() => results);\n onValidationResult?.({ password, isValid });\n },\n );\n\n const stateFromValidationResult = getStateFromLatestPolicyValidationResult(\n policyValidationResult,\n );\n let latestValidationErrorText = undefined;\n if (stateFromValidationResult) {\n const [translationKey, translationValues] = generateValidationTranslation(\n stateFromValidationResult,\n );\n latestValidationErrorText = translate.format(\n translationKey,\n translationValues,\n );\n }\n\n const isEmptyValue = !value;\n const isValidFromValidationResult =\n !isEmptyValue && stateFromValidationResult?.isValid;\n const isInvalidFromValidationResult =\n !isEmptyValue && !stateFromValidationResult?.isValid;\n const isInvalid = invalidFromProps || isInvalidFromValidationResult;\n\n const setOptimisticPolicyValidationResult = (\n state: Partial<ResolvedPolicyValidationResult> = {},\n ) => {\n setIsLoading(() => false);\n setPolicyValidationResult(() => ({\n ...initialPolicyValidationState,\n ...state,\n isValid: state.isValid ?? true,\n }));\n };\n\n const onChangeHandler = (value: string) => {\n if (onChangeFromProps) {\n onChangeFromProps(value);\n }\n\n if (!isControlled) {\n setInternalValue(() => value);\n }\n };\n\n const onPasswordGenerateHandler: ActionFn = async () => {\n const generatedPassword = await generatePassword(validationPolicy);\n setOptimisticPolicyValidationResult();\n setIsPasswordRevealed(true);\n onChangeHandler(generatedPassword);\n };\n\n const onPasswordPasteHandler = (event: ClipboardEvent) => {\n const pastedValue = event.clipboardData.getData(\"text\");\n if (pastedValue !== value) {\n setOptimisticPolicyValidationResult({\n isValid: \"indeterminate\",\n });\n }\n };\n\n const togglePasswordVisibilityHandler = () => {\n setIsPasswordRevealed((old) => !old);\n };\n\n const propsContext: PropsContext = {\n Button: {\n tunnelId: \"button\",\n size: \"m\",\n variant: \"plain\",\n color: \"secondary\",\n isDisabled: isDisabled,\n className: styles.button,\n },\n CopyButton: {\n tunnelId: \"button\",\n size: \"m\",\n variant: \"plain\",\n color: \"secondary\",\n isDisabled: isDisabled,\n className: styles.button,\n text: value,\n },\n Label: {\n className: formFieldStyles.label,\n tunnelId: \"label\",\n optional: !isRequired,\n isDisabled: isDisabled,\n children: dynamic((localProps) => {\n return (\n <>\n {localProps.children}\n <PasswordGenerateButton\n isDisabled={isDisabled}\n onGeneratePasswordAction={onPasswordGenerateHandler}\n />\n <ValidationResultButton\n isEmptyValue={isEmptyValue}\n isDisabled={isDisabled}\n policyValidationResult={policyValidationResult}\n />\n </>\n );\n }),\n },\n FieldDescription: {\n className: formFieldStyles.fieldDescription,\n },\n FieldError: {\n className: formFieldStyles.customFieldError,\n children: dynamic(() => {\n if (latestValidationErrorText) {\n return latestValidationErrorText;\n }\n }),\n },\n };\n\n return (\n <ClearPropsContext>\n <TunnelProvider>\n <Aria.TextField\n {...rest}\n value={value}\n type={isPasswordRevealed ? \"text\" : \"password\"}\n onChange={onChangeHandler}\n onPaste={onPasswordPasteHandler}\n className={clsx(className, formFieldStyles.formField)}\n isDisabled={isDisabled}\n isInvalid={isInvalid}\n isRequired={isRequired}\n >\n <TunnelExit id=\"label\" />\n <Aria.Group\n isDisabled={isDisabled}\n className={clsx(styles.inputGroup)}\n >\n <ReactAriaControlledValueFix\n inputContext={Aria.InputContext}\n props={{ ...props, value }}\n >\n <Aria.Input ref={ref} className={styles.input} />\n </ReactAriaControlledValueFix>\n <Aria.Group className={styles.buttonContainer}>\n <TogglePasswordVisibilityButton\n className={styles.button}\n isVisible={isPasswordRevealed}\n isDisabled={isDisabled}\n onPress={togglePasswordVisibilityHandler}\n />\n <TunnelExit id=\"button\" />\n </Aria.Group>\n <ComplexityIndicator\n isEmptyValue={isEmptyValue}\n isLoading={isLoading}\n policyValidationResult={policyValidationResult}\n />\n </Aria.Group>\n <PropsContextProvider props={propsContext}>\n {isValidFromValidationResult && (\n <FieldDescription>{latestValidationErrorText}</FieldDescription>\n )}\n {isInvalidFromValidationResult &&\n policyValidationResult.isValid !== \"indeterminate\" && (\n <FieldError>{latestValidationErrorText}</FieldError>\n )}\n <Wrap if={isInvalidFromValidationResult}>\n <FieldErrorContext.Provider\n value={{\n isInvalid: false,\n validationErrors: [],\n validationDetails: {\n customError: false,\n valid: true,\n typeMismatch: false,\n stepMismatch: false,\n valueMissing: false,\n tooShort: false,\n tooLong: false,\n rangeUnderflow: false,\n patternMismatch: false,\n badInput: false,\n rangeOverflow: false,\n },\n }}\n >\n {children}\n </FieldErrorContext.Provider>\n </Wrap>\n </PropsContextProvider>\n </Aria.TextField>\n </TunnelProvider>\n </ClearPropsContext>\n );\n },\n);\n\nexport default PasswordCreationField;\n"],"names":["value"],"mappings":"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"}
1
+ {"version":3,"file":"PasswordCreationField.mjs","sources":["../../../../../../src/components/PasswordCreationField/PasswordCreationField.tsx"],"sourcesContent":["import React, {\n type PropsWithChildren,\n useState,\n type ClipboardEvent,\n useDeferredValue,\n useMemo,\n} from \"react\";\nimport {\n ClearPropsContext,\n dynamic,\n type PropsContext,\n PropsContextProvider,\n} from \"@/lib/propsContext\";\nimport {\n flowComponent,\n type FlowComponentProps,\n} from \"@/lib/componentFactory/flowComponent\";\nimport styles from \"./PasswordCreationField.module.scss\";\nimport * as Aria from \"react-aria-components\";\nimport formFieldStyles from \"@/components/FormField/FormField.module.scss\";\nimport clsx from \"clsx\";\nimport { TunnelExit, TunnelProvider } from \"@mittwald/react-tunnel\";\nimport { type ActionFn } from \"@/components/Action\";\nimport getStateFromLatestPolicyValidationResult from \"@/components/PasswordCreationField/lib/getStateFromLatestPolicyValidationResult\";\nimport locales from \"./locales/*.locale.json\";\nimport generateValidationTranslation from \"@/components/PasswordCreationField/lib/generateValidationTranslation\";\nimport { FieldError } from \"@/components/FieldError\";\nimport FieldDescription from \"@/components/FieldDescription\";\nimport ComplexityIndicator from \"@/components/PasswordCreationField/components/ComplexityIndicator/ComplexityIndicator\";\nimport { generatePassword } from \"@/components/PasswordCreationField/worker/generatePassword\";\nimport TogglePasswordVisibilityButton from \"@/components/PasswordCreationField/components/TogglePasswordVisibilityButton/TogglePasswordVisibilityButton\";\nimport { defaultPasswordCreationPolicy } from \"@/components/PasswordCreationField/defaultPasswordCreationPolicy\";\nimport { FieldErrorContext } from \"react-aria-components\";\nimport { Wrap } from \"@/components/Wrap\";\nimport { ReactAriaControlledValueFix } from \"@/lib/react/ReactAriaControlledValueFix\";\nimport { ValidationResultButton } from \"@/components/PasswordCreationField/components/ValidationResultButton/ValidationResultButton\";\nimport { PasswordGenerateButton } from \"@/components/PasswordCreationField/components/PasswordGenerateButton/PasswordGenerateButton\";\nimport { useLocalizedContextStringFormatter } from \"@/components/TranslationProvider/useLocalizedContextStringFormatter\";\nimport type {\n PolicyValidationResult,\n PolicyGenericDeclaration,\n RuleValidationResult,\n} from \"@/integrations/@mittwald/password-tools-js\";\nimport { Policy } from \"@/integrations/@mittwald/password-tools-js\";\nimport { usePolicyValidationResult } from \"@/components/PasswordCreationField/lib/usePolicyValidationResult\";\n\nexport interface PasswordCreationFieldProps\n extends PropsWithChildren<\n Omit<Aria.TextFieldProps, \"children\" | \"value\" | \"defaultValue\"> &\n Partial<Pick<Aria.FieldErrorRenderProps, \"validationErrors\">>\n >,\n FlowComponentProps<HTMLInputElement> {\n value?: string;\n onValidationResult?: (result: { password: string; isValid: boolean }) => void;\n defaultValue?: string;\n placeholder?: string;\n validationPolicy?: PolicyGenericDeclaration;\n}\n\nexport interface ResolvedPolicyValidationResult\n extends Omit<PolicyValidationResult, \"isValid\"> {\n isValid: boolean | \"indeterminate\";\n ruleResults: RuleValidationResult[];\n}\n\n/**\n * @flr-generate all\n * @flr-clear-props-context\n */\nexport const PasswordCreationField = flowComponent(\n \"PasswordCreationField\",\n (props) => {\n const {\n children,\n className,\n ref,\n isDisabled,\n onChange: onChangeFromProps,\n onValidationResult,\n isInvalid: invalidFromProps,\n validationPolicy:\n validationPolicyFromProps = defaultPasswordCreationPolicy,\n isRequired,\n value: valueFromProps,\n defaultValue,\n ...rest\n } = props;\n\n const [isLoading, setIsLoading] = useState(false);\n const translate = useLocalizedContextStringFormatter(locales);\n const validationPolicy = useMemo(\n () => Policy.fromDeclaration(validationPolicyFromProps),\n [validationPolicyFromProps],\n );\n\n const isControlled = typeof valueFromProps !== \"undefined\";\n const hasDefaultValue = typeof defaultValue !== \"undefined\";\n const [internalValue, setInternalValue] = useState(\n hasDefaultValue ? defaultValue : \"\",\n );\n const value = isControlled ? valueFromProps : internalValue;\n const deferredValue = useDeferredValue(value);\n\n const [isPasswordRevealed, setIsPasswordRevealed] = useState(false);\n const initialPolicyValidationState: ResolvedPolicyValidationResult = {\n isValid: true,\n complexity: {\n min: validationPolicy.minComplexity,\n actual: 4,\n warning: null,\n },\n ruleResults: [],\n };\n\n const [policyValidationResult, setPolicyValidationResult] = useState(\n initialPolicyValidationState,\n );\n usePolicyValidationResult(\n validationPolicy,\n deferredValue,\n () => {\n if (isEmptyValue) {\n return;\n }\n\n setIsLoading(() => true);\n },\n ({ password, isValid, results }) => {\n if (isEmptyValue) {\n setPolicyValidationResult(() => ({\n ...results,\n isValid: true,\n }));\n return;\n }\n\n setIsLoading(() => false);\n setPolicyValidationResult(() => results);\n onValidationResult?.({ password, isValid });\n },\n );\n\n const isEmptyValue = !value;\n const stateFromValidationResult = getStateFromLatestPolicyValidationResult(\n isEmptyValue,\n policyValidationResult,\n );\n let latestValidationErrorText = undefined;\n if (stateFromValidationResult) {\n const [translationKey, translationValues] = generateValidationTranslation(\n stateFromValidationResult,\n );\n latestValidationErrorText = translate.format(\n translationKey,\n translationValues,\n );\n }\n\n const isValidFromValidationResult =\n !isEmptyValue && stateFromValidationResult?.isValid;\n const isInvalidFromValidationResult =\n !isEmptyValue && !stateFromValidationResult?.isValid;\n const isInvalid = invalidFromProps || isInvalidFromValidationResult;\n\n const setOptimisticPolicyValidationResult = (\n state: Partial<ResolvedPolicyValidationResult> = {},\n ) => {\n setIsLoading(() => false);\n setPolicyValidationResult(() => ({\n ...initialPolicyValidationState,\n ...state,\n isValid: true,\n }));\n };\n\n const onChangeHandler = (value: string) => {\n if (onChangeFromProps) {\n onChangeFromProps(value);\n }\n\n if (!isControlled) {\n setInternalValue(() => value);\n }\n };\n\n const onPasswordGenerateHandler: ActionFn = async () => {\n const generatedPassword = await generatePassword(validationPolicy);\n setOptimisticPolicyValidationResult();\n setIsPasswordRevealed(true);\n onChangeHandler(generatedPassword);\n };\n\n const onPasswordPasteHandler = (event: ClipboardEvent) => {\n const pastedValue = event.clipboardData.getData(\"text\");\n if (pastedValue !== value) {\n setOptimisticPolicyValidationResult({\n isValid: \"indeterminate\",\n });\n }\n };\n\n const togglePasswordVisibilityHandler = () => {\n setIsPasswordRevealed((old) => !old);\n };\n\n const propsContext: PropsContext = {\n Button: {\n tunnelId: \"button\",\n size: \"m\",\n variant: \"plain\",\n color: \"secondary\",\n isDisabled: isDisabled,\n className: styles.button,\n },\n CopyButton: {\n tunnelId: \"button\",\n size: \"m\",\n variant: \"plain\",\n color: \"secondary\",\n isDisabled: isDisabled,\n className: styles.button,\n text: value,\n },\n Label: {\n className: formFieldStyles.label,\n tunnelId: \"label\",\n optional: !isRequired,\n isDisabled: isDisabled,\n children: dynamic((localProps) => {\n return (\n <>\n {localProps.children}\n <PasswordGenerateButton\n isDisabled={isDisabled}\n onGeneratePasswordAction={onPasswordGenerateHandler}\n />\n <ValidationResultButton\n isEmptyValue={isEmptyValue}\n isDisabled={isDisabled}\n policyValidationResult={policyValidationResult}\n />\n </>\n );\n }),\n },\n FieldDescription: {\n className: formFieldStyles.fieldDescription,\n },\n FieldError: {\n className: formFieldStyles.customFieldError,\n children: dynamic(() => {\n if (latestValidationErrorText) {\n return latestValidationErrorText;\n }\n }),\n },\n };\n\n return (\n <ClearPropsContext>\n <TunnelProvider>\n <Aria.TextField\n {...rest}\n value={value}\n type={isPasswordRevealed ? \"text\" : \"password\"}\n onChange={onChangeHandler}\n onPaste={onPasswordPasteHandler}\n className={clsx(className, formFieldStyles.formField)}\n isDisabled={isDisabled}\n isInvalid={isInvalid}\n isRequired={isRequired}\n >\n <TunnelExit id=\"label\" />\n <Aria.Group\n isDisabled={isDisabled}\n className={clsx(styles.inputGroup)}\n >\n <ReactAriaControlledValueFix\n inputContext={Aria.InputContext}\n props={{ ...props, value }}\n >\n <Aria.Input ref={ref} className={styles.input} />\n </ReactAriaControlledValueFix>\n <Aria.Group className={styles.buttonContainer}>\n <TogglePasswordVisibilityButton\n className={styles.button}\n isVisible={isPasswordRevealed}\n isDisabled={isDisabled}\n onPress={togglePasswordVisibilityHandler}\n />\n <TunnelExit id=\"button\" />\n </Aria.Group>\n <ComplexityIndicator\n isEmptyValue={isEmptyValue}\n isLoading={isLoading}\n policyValidationResult={policyValidationResult}\n validationResultState={stateFromValidationResult}\n />\n </Aria.Group>\n <PropsContextProvider props={propsContext}>\n {isValidFromValidationResult && (\n <FieldDescription>{latestValidationErrorText}</FieldDescription>\n )}\n {isInvalidFromValidationResult &&\n policyValidationResult.isValid !== \"indeterminate\" && (\n <FieldError>{latestValidationErrorText}</FieldError>\n )}\n <Wrap if={isInvalidFromValidationResult}>\n <FieldErrorContext.Provider\n value={{\n isInvalid: false,\n validationErrors: [],\n validationDetails: {\n customError: false,\n valid: true,\n typeMismatch: false,\n stepMismatch: false,\n valueMissing: false,\n tooShort: false,\n tooLong: false,\n rangeUnderflow: false,\n patternMismatch: false,\n badInput: false,\n rangeOverflow: false,\n },\n }}\n >\n {children}\n </FieldErrorContext.Provider>\n </Wrap>\n </PropsContextProvider>\n </Aria.TextField>\n </TunnelProvider>\n </ClearPropsContext>\n );\n },\n);\n\nexport default PasswordCreationField;\n"],"names":["value"],"mappings":"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"}
@@ -7,14 +7,28 @@ import { getStatusFromPolicyValidationResult } from '../../lib/getStatusFromPoli
7
7
  import clsx from 'clsx';
8
8
 
9
9
  const ComplexityIndicator = (props) => {
10
- const { policyValidationResult, isLoading, isEmptyValue } = props;
10
+ const {
11
+ policyValidationResult,
12
+ validationResultState,
13
+ isLoading,
14
+ isEmptyValue
15
+ } = props;
11
16
  const complexityScore = policyValidationResult?.complexity;
12
17
  const [state, setState] = useState({
13
18
  percentage: 0,
14
- status: "success"
19
+ status: "success",
20
+ visible: false
15
21
  });
16
22
  useLayoutEffect(() => {
17
- let complexityFulfilledPercentage = -1;
23
+ if (isEmptyValue) {
24
+ setState({
25
+ status: "success",
26
+ percentage: 0,
27
+ visible: false
28
+ });
29
+ return;
30
+ }
31
+ let complexityFulfilledPercentage = 0;
18
32
  if (policyValidationResult?.isValid === "indeterminate") {
19
33
  complexityFulfilledPercentage = 100;
20
34
  } else if (complexityScore && !isEmptyValue) {
@@ -24,18 +38,20 @@ const ComplexityIndicator = (props) => {
24
38
  );
25
39
  }
26
40
  const policyValidationStatus = getStatusFromPolicyValidationResult(
41
+ validationResultState?.isValid ?? policyValidationResult.isValid,
27
42
  policyValidationResult
28
43
  );
29
44
  setState({
30
45
  status: policyValidationStatus,
31
- percentage: complexityFulfilledPercentage
46
+ percentage: complexityFulfilledPercentage,
47
+ visible: true
32
48
  });
33
49
  }, [policyValidationResult, isEmptyValue]);
34
- const complexityVisible = state.percentage !== -1;
50
+ const complexityVisible = state.visible;
35
51
  const complexityFulfilled = state.percentage === 100;
36
52
  const percentageClassName = clsx(
37
53
  styles.bar,
38
- styles[`bar-background-status-${state.status}`],
54
+ !isEmptyValue && styles[`bar-background-status-${state.status}`],
39
55
  {
40
56
  [styles.loading]: isLoading,
41
57
  [styles.running]: !complexityFulfilled
@@ -1 +1 @@
1
- {"version":3,"file":"ComplexityIndicator.mjs","sources":["../../../../../../../../src/components/PasswordCreationField/components/ComplexityIndicator/ComplexityIndicator.tsx"],"sourcesContent":["import React, { type FC, useLayoutEffect, useState } from \"react\";\nimport styles from \"./ComplexityIndicator.module.scss\";\nimport { getStatusFromPolicyValidationResult } from \"@/components/PasswordCreationField/lib/getStatusFromPolicyValidationResult\";\nimport clsx from \"clsx\";\nimport type { ResolvedPolicyValidationResult } from \"@/components/PasswordCreationField/PasswordCreationField\";\nimport { type Status } from \"@/lib/types/props\";\n\nexport type ComplexityStatus = Exclude<Status, \"info\"> | \"indeterminate\";\n\nexport interface ComplexityIndicatorProps {\n isLoading: boolean;\n isEmptyValue: boolean;\n policyValidationResult: ResolvedPolicyValidationResult;\n}\n\n/** @internal */\nexport const ComplexityIndicator: FC<ComplexityIndicatorProps> = (props) => {\n const { policyValidationResult, isLoading, isEmptyValue } = props;\n const complexityScore = policyValidationResult?.complexity;\n\n const [state, setState] = useState<{\n status: ComplexityStatus;\n percentage: number;\n }>({\n percentage: 0,\n status: \"success\",\n });\n\n useLayoutEffect(() => {\n let complexityFulfilledPercentage = -1;\n if (policyValidationResult?.isValid === \"indeterminate\") {\n complexityFulfilledPercentage = 100;\n } else if (complexityScore && !isEmptyValue) {\n complexityFulfilledPercentage = Math.min(\n (100 / (complexityScore.min + 1)) * (complexityScore.actual + 1),\n 100,\n );\n }\n\n const policyValidationStatus = getStatusFromPolicyValidationResult(\n policyValidationResult,\n );\n\n setState({\n status: policyValidationStatus,\n percentage: complexityFulfilledPercentage,\n });\n }, [policyValidationResult, isEmptyValue]);\n\n const complexityVisible = state.percentage !== -1;\n const complexityFulfilled = state.percentage === 100;\n\n const percentageClassName = clsx(\n styles.bar,\n styles[`bar-background-status-${state.status}`],\n {\n [styles.loading as string]: isLoading,\n [styles.running as string]: !complexityFulfilled,\n },\n );\n\n return (\n <div\n aria-hidden={true}\n data-container=\"complexity\"\n data-complexity-visible={complexityVisible}\n data-complexity-status={state.status}\n data-complexity-percentage={state.percentage}\n className={clsx(styles.complexityIndicator, {\n [styles.hide as string]: !complexityVisible,\n })}\n >\n <div\n style={{\n width: `${state.percentage}%`,\n }}\n className={percentageClassName}\n />\n </div>\n );\n};\n\nexport default ComplexityIndicator;\n"],"names":[],"mappings":";;;;;;AAgBa,MAAA,mBAAA,GAAoD,CAAC,KAAU,KAAA;AAC1E,EAAA,MAAM,EAAE,sBAAA,EAAwB,SAAW,EAAA,YAAA,EAAiB,GAAA,KAAA;AAC5D,EAAA,MAAM,kBAAkB,sBAAwB,EAAA,UAAA;AAEhD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,QAGvB,CAAA;AAAA,IACD,UAAY,EAAA,CAAA;AAAA,IACZ,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,IAAI,6BAAgC,GAAA,EAAA;AACpC,IAAI,IAAA,sBAAA,EAAwB,YAAY,eAAiB,EAAA;AACvD,MAAgC,6BAAA,GAAA,GAAA;AAAA,KAClC,MAAA,IAAW,eAAmB,IAAA,CAAC,YAAc,EAAA;AAC3C,MAAA,6BAAA,GAAgC,IAAK,CAAA,GAAA;AAAA,QAClC,GAAO,IAAA,eAAA,CAAgB,GAAM,GAAA,CAAA,CAAA,IAAO,gBAAgB,MAAS,GAAA,CAAA,CAAA;AAAA,QAC9D;AAAA,OACF;AAAA;AAGF,IAAA,MAAM,sBAAyB,GAAA,mCAAA;AAAA,MAC7B;AAAA,KACF;AAEA,IAAS,QAAA,CAAA;AAAA,MACP,MAAQ,EAAA,sBAAA;AAAA,MACR,UAAY,EAAA;AAAA,KACb,CAAA;AAAA,GACA,EAAA,CAAC,sBAAwB,EAAA,YAAY,CAAC,CAAA;AAEzC,EAAM,MAAA,iBAAA,GAAoB,MAAM,UAAe,KAAA,EAAA;AAC/C,EAAM,MAAA,mBAAA,GAAsB,MAAM,UAAe,KAAA,GAAA;AAEjD,EAAA,MAAM,mBAAsB,GAAA,IAAA;AAAA,IAC1B,MAAO,CAAA,GAAA;AAAA,IACP,MAAO,CAAA,CAAA,sBAAA,EAAyB,KAAM,CAAA,MAAM,CAAE,CAAA,CAAA;AAAA,IAC9C;AAAA,MACE,CAAC,MAAO,CAAA,OAAiB,GAAG,SAAA;AAAA,MAC5B,CAAC,MAAA,CAAO,OAAiB,GAAG,CAAC;AAAA;AAC/B,GACF;AAEA,EACE,uBAAA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAa,EAAA,IAAA;AAAA,MACb,gBAAe,EAAA,YAAA;AAAA,MACf,yBAAyB,EAAA,iBAAA;AAAA,MACzB,0BAAwB,KAAM,CAAA,MAAA;AAAA,MAC9B,8BAA4B,KAAM,CAAA,UAAA;AAAA,MAClC,SAAA,EAAW,IAAK,CAAA,MAAA,CAAO,mBAAqB,EAAA;AAAA,QAC1C,CAAC,MAAA,CAAO,IAAc,GAAG,CAAC;AAAA,OAC3B,CAAA;AAAA,MAED,QAAA,kBAAA,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,KAAO,EAAA;AAAA,YACL,KAAA,EAAO,CAAG,EAAA,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,WAC5B;AAAA,UACA,SAAW,EAAA;AAAA;AAAA;AACb;AAAA,GACF;AAEJ;;;;"}
1
+ {"version":3,"file":"ComplexityIndicator.mjs","sources":["../../../../../../../../src/components/PasswordCreationField/components/ComplexityIndicator/ComplexityIndicator.tsx"],"sourcesContent":["import React, { type FC, useLayoutEffect, useState } from \"react\";\nimport styles from \"./ComplexityIndicator.module.scss\";\nimport { getStatusFromPolicyValidationResult } from \"@/components/PasswordCreationField/lib/getStatusFromPolicyValidationResult\";\nimport clsx from \"clsx\";\nimport type { ResolvedPolicyValidationResult } from \"@/components/PasswordCreationField/PasswordCreationField\";\nimport { type Status } from \"@/lib/types/props\";\nimport type { StateFromLatestPolicyValidationResult } from \"@/components/PasswordCreationField/lib/getStateFromLatestPolicyValidationResult\";\n\nexport type ComplexityStatus = Exclude<Status, \"info\"> | \"indeterminate\";\n\nexport interface ComplexityIndicatorProps {\n isLoading: boolean;\n isEmptyValue: boolean;\n validationResultState: StateFromLatestPolicyValidationResult;\n policyValidationResult: ResolvedPolicyValidationResult;\n}\n\n/** @internal */\nexport const ComplexityIndicator: FC<ComplexityIndicatorProps> = (props) => {\n const {\n policyValidationResult,\n validationResultState,\n isLoading,\n isEmptyValue,\n } = props;\n const complexityScore = policyValidationResult?.complexity;\n\n const [state, setState] = useState<{\n status: ComplexityStatus;\n percentage: number;\n visible: boolean;\n }>({\n percentage: 0,\n status: \"success\",\n visible: false,\n });\n\n useLayoutEffect(() => {\n if (isEmptyValue) {\n setState({\n status: \"success\",\n percentage: 0,\n visible: false,\n });\n return;\n }\n\n let complexityFulfilledPercentage = 0;\n if (policyValidationResult?.isValid === \"indeterminate\") {\n complexityFulfilledPercentage = 100;\n } else if (complexityScore && !isEmptyValue) {\n complexityFulfilledPercentage = Math.min(\n (100 / (complexityScore.min + 1)) * (complexityScore.actual + 1),\n 100,\n );\n }\n\n const policyValidationStatus = getStatusFromPolicyValidationResult(\n validationResultState?.isValid ?? policyValidationResult.isValid,\n policyValidationResult,\n );\n\n setState({\n status: policyValidationStatus,\n percentage: complexityFulfilledPercentage,\n visible: true,\n });\n }, [policyValidationResult, isEmptyValue]);\n\n const complexityVisible = state.visible;\n const complexityFulfilled = state.percentage === 100;\n\n const percentageClassName = clsx(\n styles.bar,\n !isEmptyValue && styles[`bar-background-status-${state.status}`],\n {\n [styles.loading as string]: isLoading,\n [styles.running as string]: !complexityFulfilled,\n },\n );\n\n return (\n <div\n aria-hidden={true}\n data-container=\"complexity\"\n data-complexity-visible={complexityVisible}\n data-complexity-status={state.status}\n data-complexity-percentage={state.percentage}\n className={clsx(styles.complexityIndicator, {\n [styles.hide as string]: !complexityVisible,\n })}\n >\n <div\n style={{\n width: `${state.percentage}%`,\n }}\n className={percentageClassName}\n />\n </div>\n );\n};\n\nexport default ComplexityIndicator;\n"],"names":[],"mappings":";;;;;;AAkBa,MAAA,mBAAA,GAAoD,CAAC,KAAU,KAAA;AAC1E,EAAM,MAAA;AAAA,IACJ,sBAAA;AAAA,IACA,qBAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACE,GAAA,KAAA;AACJ,EAAA,MAAM,kBAAkB,sBAAwB,EAAA,UAAA;AAEhD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,QAIvB,CAAA;AAAA,IACD,UAAY,EAAA,CAAA;AAAA,IACZ,MAAQ,EAAA,SAAA;AAAA,IACR,OAAS,EAAA;AAAA,GACV,CAAA;AAED,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,IAAI,YAAc,EAAA;AAChB,MAAS,QAAA,CAAA;AAAA,QACP,MAAQ,EAAA,SAAA;AAAA,QACR,UAAY,EAAA,CAAA;AAAA,QACZ,OAAS,EAAA;AAAA,OACV,CAAA;AACD,MAAA;AAAA;AAGF,IAAA,IAAI,6BAAgC,GAAA,CAAA;AACpC,IAAI,IAAA,sBAAA,EAAwB,YAAY,eAAiB,EAAA;AACvD,MAAgC,6BAAA,GAAA,GAAA;AAAA,KAClC,MAAA,IAAW,eAAmB,IAAA,CAAC,YAAc,EAAA;AAC3C,MAAA,6BAAA,GAAgC,IAAK,CAAA,GAAA;AAAA,QAClC,GAAO,IAAA,eAAA,CAAgB,GAAM,GAAA,CAAA,CAAA,IAAO,gBAAgB,MAAS,GAAA,CAAA,CAAA;AAAA,QAC9D;AAAA,OACF;AAAA;AAGF,IAAA,MAAM,sBAAyB,GAAA,mCAAA;AAAA,MAC7B,qBAAA,EAAuB,WAAW,sBAAuB,CAAA,OAAA;AAAA,MACzD;AAAA,KACF;AAEA,IAAS,QAAA,CAAA;AAAA,MACP,MAAQ,EAAA,sBAAA;AAAA,MACR,UAAY,EAAA,6BAAA;AAAA,MACZ,OAAS,EAAA;AAAA,KACV,CAAA;AAAA,GACA,EAAA,CAAC,sBAAwB,EAAA,YAAY,CAAC,CAAA;AAEzC,EAAA,MAAM,oBAAoB,KAAM,CAAA,OAAA;AAChC,EAAM,MAAA,mBAAA,GAAsB,MAAM,UAAe,KAAA,GAAA;AAEjD,EAAA,MAAM,mBAAsB,GAAA,IAAA;AAAA,IAC1B,MAAO,CAAA,GAAA;AAAA,IACP,CAAC,YAAgB,IAAA,MAAA,CAAO,CAAyB,sBAAA,EAAA,KAAA,CAAM,MAAM,CAAE,CAAA,CAAA;AAAA,IAC/D;AAAA,MACE,CAAC,MAAO,CAAA,OAAiB,GAAG,SAAA;AAAA,MAC5B,CAAC,MAAA,CAAO,OAAiB,GAAG,CAAC;AAAA;AAC/B,GACF;AAEA,EACE,uBAAA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAa,EAAA,IAAA;AAAA,MACb,gBAAe,EAAA,YAAA;AAAA,MACf,yBAAyB,EAAA,iBAAA;AAAA,MACzB,0BAAwB,KAAM,CAAA,MAAA;AAAA,MAC9B,8BAA4B,KAAM,CAAA,UAAA;AAAA,MAClC,SAAA,EAAW,IAAK,CAAA,MAAA,CAAO,mBAAqB,EAAA;AAAA,QAC1C,CAAC,MAAA,CAAO,IAAc,GAAG,CAAC;AAAA,OAC3B,CAAA;AAAA,MAED,QAAA,kBAAA,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,KAAO,EAAA;AAAA,YACL,KAAA,EAAO,CAAG,EAAA,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,WAC5B;AAAA,UACA,SAAW,EAAA;AAAA;AAAA;AACb;AAAA,GACF;AAEJ;;;;"}
@@ -4,31 +4,29 @@ import '@mittwald/password-tools-js/policy';
4
4
  import '@mittwald/password-tools-js/rules';
5
5
  import '@mittwald/password-tools-js/generator';
6
6
 
7
- const getStateFromLatestPolicyValidationResult = (result) => {
8
- if (!result.isValid && result.ruleResults.length >= 1) {
7
+ const getStateFromLatestPolicyValidationResult = (isEmptyValue, result) => {
8
+ if (result.ruleResults.length >= 1) {
9
9
  const failingRule = result.ruleResults.find((r) => !r.isValid);
10
- if (!failingRule) {
11
- return {
12
- isValid: false,
13
- identifier: "failingComplexity"
14
- };
10
+ if (failingRule) {
11
+ return failingRule;
15
12
  }
16
- return failingRule;
17
13
  }
18
14
  if (result.isValid === "indeterminate") {
19
15
  return void 0;
20
16
  }
21
- if (result.complexity.actual < result.complexity.min) {
22
- return {
23
- isValid: false,
24
- identifier: "failingComplexity"
25
- };
26
- }
27
- if (result.complexity.actual === result.complexity.min) {
28
- return {
29
- isValid: result.isValid,
30
- identifier: "optimizeComplexity"
31
- };
17
+ if (!isEmptyValue) {
18
+ if (result.complexity.actual < result.complexity.min) {
19
+ return {
20
+ isValid: false,
21
+ identifier: "failingComplexity"
22
+ };
23
+ }
24
+ if (result.complexity.actual === result.complexity.min) {
25
+ return {
26
+ isValid: result.isValid,
27
+ identifier: "optimizeComplexity"
28
+ };
29
+ }
32
30
  }
33
31
  return {
34
32
  isValid: true,
@@ -1 +1 @@
1
- {"version":3,"file":"getStateFromLatestPolicyValidationResult.mjs","sources":["../../../../../../../src/components/PasswordCreationField/lib/getStateFromLatestPolicyValidationResult.ts"],"sourcesContent":["import { type RuleValidationResult } from \"@/integrations/@mittwald/password-tools-js\";\nimport type { ResolvedPolicyValidationResult } from \"@/components/PasswordCreationField/PasswordCreationField\";\n\n/** @internal */\nexport const getStateFromLatestPolicyValidationResult = (\n result: ResolvedPolicyValidationResult,\n): undefined | Partial<RuleValidationResult> => {\n if (!result.isValid && result.ruleResults.length >= 1) {\n const failingRule = result.ruleResults.find((r) => !r.isValid);\n if (!failingRule) {\n return {\n isValid: false,\n identifier: \"failingComplexity\",\n };\n }\n\n return failingRule;\n }\n\n if (result.isValid === \"indeterminate\") {\n return undefined;\n }\n\n if (result.complexity.actual < result.complexity.min) {\n return {\n isValid: false,\n identifier: \"failingComplexity\",\n };\n }\n\n if (result.complexity.actual === result.complexity.min) {\n return {\n isValid: result.isValid,\n identifier: \"optimizeComplexity\",\n };\n }\n return {\n isValid: true,\n identifier: \"securePassword\",\n };\n};\n\nexport default getStateFromLatestPolicyValidationResult;\n"],"names":[],"mappings":";;;;AAIa,MAAA,wCAAA,GAA2C,CACtD,MAC8C,KAAA;AAC9C,EAAA,IAAI,CAAC,MAAO,CAAA,OAAA,IAAW,MAAO,CAAA,WAAA,CAAY,UAAU,CAAG,EAAA;AACrD,IAAM,MAAA,WAAA,GAAc,OAAO,WAAY,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAC,EAAE,OAAO,CAAA;AAC7D,IAAA,IAAI,CAAC,WAAa,EAAA;AAChB,MAAO,OAAA;AAAA,QACL,OAAS,EAAA,KAAA;AAAA,QACT,UAAY,EAAA;AAAA,OACd;AAAA;AAGF,IAAO,OAAA,WAAA;AAAA;AAGT,EAAI,IAAA,MAAA,CAAO,YAAY,eAAiB,EAAA;AACtC,IAAO,OAAA,MAAA;AAAA;AAGT,EAAA,IAAI,MAAO,CAAA,UAAA,CAAW,MAAS,GAAA,MAAA,CAAO,WAAW,GAAK,EAAA;AACpD,IAAO,OAAA;AAAA,MACL,OAAS,EAAA,KAAA;AAAA,MACT,UAAY,EAAA;AAAA,KACd;AAAA;AAGF,EAAA,IAAI,MAAO,CAAA,UAAA,CAAW,MAAW,KAAA,MAAA,CAAO,WAAW,GAAK,EAAA;AACtD,IAAO,OAAA;AAAA,MACL,SAAS,MAAO,CAAA,OAAA;AAAA,MAChB,UAAY,EAAA;AAAA,KACd;AAAA;AAEF,EAAO,OAAA;AAAA,IACL,OAAS,EAAA,IAAA;AAAA,IACT,UAAY,EAAA;AAAA,GACd;AACF;;;;"}
1
+ {"version":3,"file":"getStateFromLatestPolicyValidationResult.mjs","sources":["../../../../../../../src/components/PasswordCreationField/lib/getStateFromLatestPolicyValidationResult.ts"],"sourcesContent":["import { type RuleValidationResult } from \"@/integrations/@mittwald/password-tools-js\";\nimport type { ResolvedPolicyValidationResult } from \"@/components/PasswordCreationField/PasswordCreationField\";\n\nexport type StateFromLatestPolicyValidationResult =\n | undefined\n | Partial<RuleValidationResult>;\n\n/** @internal */\nexport const getStateFromLatestPolicyValidationResult = (\n isEmptyValue: boolean,\n result: ResolvedPolicyValidationResult,\n): StateFromLatestPolicyValidationResult => {\n if (result.ruleResults.length >= 1) {\n const failingRule = result.ruleResults.find((r) => !r.isValid);\n if (failingRule) {\n return failingRule;\n }\n }\n\n if (result.isValid === \"indeterminate\") {\n return undefined;\n }\n\n if (!isEmptyValue) {\n if (result.complexity.actual < result.complexity.min) {\n return {\n isValid: false,\n identifier: \"failingComplexity\",\n };\n }\n\n if (result.complexity.actual === result.complexity.min) {\n return {\n isValid: result.isValid,\n identifier: \"optimizeComplexity\",\n };\n }\n }\n\n return {\n isValid: true,\n identifier: \"securePassword\",\n };\n};\n\nexport default getStateFromLatestPolicyValidationResult;\n"],"names":[],"mappings":";;;;AAQa,MAAA,wCAAA,GAA2C,CACtD,YAAA,EACA,MAC0C,KAAA;AAC1C,EAAI,IAAA,MAAA,CAAO,WAAY,CAAA,MAAA,IAAU,CAAG,EAAA;AAClC,IAAM,MAAA,WAAA,GAAc,OAAO,WAAY,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAC,EAAE,OAAO,CAAA;AAC7D,IAAA,IAAI,WAAa,EAAA;AACf,MAAO,OAAA,WAAA;AAAA;AACT;AAGF,EAAI,IAAA,MAAA,CAAO,YAAY,eAAiB,EAAA;AACtC,IAAO,OAAA,MAAA;AAAA;AAGT,EAAA,IAAI,CAAC,YAAc,EAAA;AACjB,IAAA,IAAI,MAAO,CAAA,UAAA,CAAW,MAAS,GAAA,MAAA,CAAO,WAAW,GAAK,EAAA;AACpD,MAAO,OAAA;AAAA,QACL,OAAS,EAAA,KAAA;AAAA,QACT,UAAY,EAAA;AAAA,OACd;AAAA;AAGF,IAAA,IAAI,MAAO,CAAA,UAAA,CAAW,MAAW,KAAA,MAAA,CAAO,WAAW,GAAK,EAAA;AACtD,MAAO,OAAA;AAAA,QACL,SAAS,MAAO,CAAA,OAAA;AAAA,QAChB,UAAY,EAAA;AAAA,OACd;AAAA;AACF;AAGF,EAAO,OAAA;AAAA,IACL,OAAS,EAAA,IAAA;AAAA,IACT,UAAY,EAAA;AAAA,GACd;AACF;;;;"}
@@ -1,12 +1,12 @@
1
1
  "use client"
2
2
  /* */
3
- const getStatusFromPolicyValidationResult = (result) => {
4
- if (result.isValid === true) {
3
+ const getStatusFromPolicyValidationResult = (isValid, result) => {
4
+ if (isValid === true) {
5
5
  if (result.complexity && result.complexity.actual === result.complexity.min && result.complexity.min !== 4) {
6
6
  return "warning";
7
7
  }
8
8
  return "success";
9
- } else if (result.isValid === "indeterminate") {
9
+ } else if (isValid === "indeterminate") {
10
10
  return "indeterminate";
11
11
  }
12
12
  return "danger";
@@ -1 +1 @@
1
- {"version":3,"file":"getStatusFromPolicyValidationResult.mjs","sources":["../../../../../../../src/components/PasswordCreationField/lib/getStatusFromPolicyValidationResult.ts"],"sourcesContent":["import type { ResolvedPolicyValidationResult } from \"@/components/PasswordCreationField/PasswordCreationField\";\nimport type { ComplexityStatus } from \"@/components/PasswordCreationField/components/ComplexityIndicator/ComplexityIndicator\";\n\n/**\n * @param result\n * @internal\n */\nexport const getStatusFromPolicyValidationResult = (\n result: ResolvedPolicyValidationResult,\n): ComplexityStatus => {\n if (result.isValid === true) {\n if (\n result.complexity &&\n result.complexity.actual === result.complexity.min &&\n result.complexity.min !== 4\n ) {\n return \"warning\";\n }\n\n return \"success\";\n } else if (result.isValid === \"indeterminate\") {\n return \"indeterminate\";\n }\n\n return \"danger\";\n};\n\nexport default getStatusFromPolicyValidationResult;\n"],"names":[],"mappings":"AAOa,MAAA,mCAAA,GAAsC,CACjD,MACqB,KAAA;AACrB,EAAI,IAAA,MAAA,CAAO,YAAY,IAAM,EAAA;AAC3B,IACE,IAAA,MAAA,CAAO,UACP,IAAA,MAAA,CAAO,UAAW,CAAA,MAAA,KAAW,MAAO,CAAA,UAAA,CAAW,GAC/C,IAAA,MAAA,CAAO,UAAW,CAAA,GAAA,KAAQ,CAC1B,EAAA;AACA,MAAO,OAAA,SAAA;AAAA;AAGT,IAAO,OAAA,SAAA;AAAA,GACT,MAAA,IAAW,MAAO,CAAA,OAAA,KAAY,eAAiB,EAAA;AAC7C,IAAO,OAAA,eAAA;AAAA;AAGT,EAAO,OAAA,QAAA;AACT;;;;"}
1
+ {"version":3,"file":"getStatusFromPolicyValidationResult.mjs","sources":["../../../../../../../src/components/PasswordCreationField/lib/getStatusFromPolicyValidationResult.ts"],"sourcesContent":["import type { ResolvedPolicyValidationResult } from \"@/components/PasswordCreationField/PasswordCreationField\";\nimport type { ComplexityStatus } from \"@/components/PasswordCreationField/components/ComplexityIndicator/ComplexityIndicator\";\n\nexport const getStatusFromPolicyValidationResult = (\n isValid: ResolvedPolicyValidationResult[\"isValid\"],\n result: ResolvedPolicyValidationResult,\n): ComplexityStatus => {\n if (isValid === true) {\n if (\n result.complexity &&\n result.complexity.actual === result.complexity.min &&\n result.complexity.min !== 4\n ) {\n return \"warning\";\n }\n\n return \"success\";\n } else if (isValid === \"indeterminate\") {\n return \"indeterminate\";\n }\n\n return \"danger\";\n};\n\nexport default getStatusFromPolicyValidationResult;\n"],"names":[],"mappings":"AAGa,MAAA,mCAAA,GAAsC,CACjD,OAAA,EACA,MACqB,KAAA;AACrB,EAAA,IAAI,YAAY,IAAM,EAAA;AACpB,IACE,IAAA,MAAA,CAAO,UACP,IAAA,MAAA,CAAO,UAAW,CAAA,MAAA,KAAW,MAAO,CAAA,UAAA,CAAW,GAC/C,IAAA,MAAA,CAAO,UAAW,CAAA,GAAA,KAAQ,CAC1B,EAAA;AACA,MAAO,OAAA,SAAA;AAAA;AAGT,IAAO,OAAA,SAAA;AAAA,GACT,MAAA,IAAW,YAAY,eAAiB,EAAA;AACtC,IAAO,OAAA,eAAA;AAAA;AAGT,EAAO,OAAA,QAAA;AACT;;;;"}
@@ -3,6 +3,7 @@
3
3
  import { jsx } from 'react/jsx-runtime';
4
4
  import * as Aria from 'react-aria-components';
5
5
  import { Children, isValidElement, useLayoutEffect } from 'react';
6
+ import { emitElementValueChange } from './emitElementValueChange.mjs';
6
7
 
7
8
  const ReactAriaControlledValueFix = (props) => {
8
9
  const { inputContext: context, children } = props;
@@ -20,15 +21,11 @@ const ReactAriaControlledValueFix = (props) => {
20
21
  const element = contextRef.current;
21
22
  if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {
22
23
  const newValue = String(contextProps.value ?? "");
23
- try {
24
- const nativeInputValueSetter = Object.getOwnPropertyDescriptor(
25
- Object.getPrototypeOf(element),
26
- "value"
27
- )?.set;
28
- nativeInputValueSetter?.call(element, newValue);
29
- } catch (ignoredError) {
30
- element.value = newValue;
31
- }
24
+ emitElementValueChange(
25
+ element,
26
+ newValue,
27
+ new Event("input", { bubbles: true })
28
+ );
32
29
  }
33
30
  }, [contextProps.value]);
34
31
  const uncontrolledContextProps = {
@@ -1 +1 @@
1
- {"version":3,"file":"ReactAriaControlledValueFix.mjs","sources":["../../../../../../src/lib/react/ReactAriaControlledValueFix.tsx"],"sourcesContent":["import * as Aria from \"react-aria-components\";\nimport {\n Children,\n isValidElement,\n type Context,\n type FC,\n type ForwardedRef,\n type PropsWithChildren,\n useLayoutEffect,\n} from \"react\";\n\nexport interface ReactAriaControlledValueFixProps extends PropsWithChildren {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n inputContext: Context<any>;\n props: unknown;\n}\n\ninterface ChildProps {\n [key: string]: unknown;\n ref: ForwardedRef<Element>;\n}\n\n/**\n * React Aria (accidentally?!) enforces controlled inputs by always setting the\n * value prop on Inputs and TextAreas with its context props API. This component\n * also uses this API to only unset the value prop. Furthermore setting an input\n * value is finally done by directly on the DOM element.\n *\n * https://github.com/adobe/react-spectrum/blob/main/packages/%40react-aria/textfield/src/useTextField.ts#L182\n * https://github.com/adobe/react-spectrum/blob/main/packages/%40react-aria/numberfield/src/useNumberField.ts#L206\n */\nexport const ReactAriaControlledValueFix: FC<\n ReactAriaControlledValueFixProps\n> = (props) => {\n const { inputContext: context, children } = props;\n\n const child = Children.only(children);\n if (!isValidElement<ChildProps>(child)) {\n throw new Error(\"Expected valid element\");\n }\n\n const { ref, ...inputProps } = child.props;\n const [contextProps, contextRef] = Aria.useContextProps(\n inputProps,\n ref,\n context,\n );\n\n useLayoutEffect(() => {\n const element = contextRef.current;\n\n if (\n element instanceof HTMLInputElement ||\n element instanceof HTMLTextAreaElement\n ) {\n const newValue = String(contextProps.value ?? \"\");\n try {\n const nativeInputValueSetter = Object.getOwnPropertyDescriptor(\n Object.getPrototypeOf(element),\n \"value\",\n )?.set;\n nativeInputValueSetter?.call(element, newValue);\n } catch (ignoredError) {\n element.value = newValue;\n }\n }\n }, [contextProps.value]);\n\n const uncontrolledContextProps = {\n ...contextProps,\n value: undefined,\n ref: contextRef,\n };\n\n return (\n <Aria.Provider values={[[context, uncontrolledContextProps]]}>\n {child}\n </Aria.Provider>\n );\n};\n"],"names":[],"mappings":";;;;AA+Ba,MAAA,2BAAA,GAET,CAAC,KAAU,KAAA;AACb,EAAA,MAAM,EAAE,YAAA,EAAc,OAAS,EAAA,QAAA,EAAa,GAAA,KAAA;AAE5C,EAAM,MAAA,KAAA,GAAQ,QAAS,CAAA,IAAA,CAAK,QAAQ,CAAA;AACpC,EAAI,IAAA,CAAC,cAA2B,CAAA,KAAK,CAAG,EAAA;AACtC,IAAM,MAAA,IAAI,MAAM,wBAAwB,CAAA;AAAA;AAG1C,EAAA,MAAM,EAAE,GAAA,EAAK,GAAG,UAAA,KAAe,KAAM,CAAA,KAAA;AACrC,EAAA,MAAM,CAAC,YAAA,EAAc,UAAU,CAAA,GAAI,IAAK,CAAA,eAAA;AAAA,IACtC,UAAA;AAAA,IACA,GAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,MAAM,UAAU,UAAW,CAAA,OAAA;AAE3B,IACE,IAAA,OAAA,YAAmB,gBACnB,IAAA,OAAA,YAAmB,mBACnB,EAAA;AACA,MAAA,MAAM,QAAW,GAAA,MAAA,CAAO,YAAa,CAAA,KAAA,IAAS,EAAE,CAAA;AAChD,MAAI,IAAA;AACF,QAAA,MAAM,yBAAyB,MAAO,CAAA,wBAAA;AAAA,UACpC,MAAA,CAAO,eAAe,OAAO,CAAA;AAAA,UAC7B;AAAA,SACC,EAAA,GAAA;AACH,QAAwB,sBAAA,EAAA,IAAA,CAAK,SAAS,QAAQ,CAAA;AAAA,eACvC,YAAc,EAAA;AACrB,QAAA,OAAA,CAAQ,KAAQ,GAAA,QAAA;AAAA;AAClB;AACF,GACC,EAAA,CAAC,YAAa,CAAA,KAAK,CAAC,CAAA;AAEvB,EAAA,MAAM,wBAA2B,GAAA;AAAA,IAC/B,GAAG,YAAA;AAAA,IACH,KAAO,EAAA,MAAA;AAAA,IACP,GAAK,EAAA;AAAA,GACP;AAEA,EACE,uBAAA,GAAA,CAAC,IAAK,CAAA,QAAA,EAAL,EAAc,MAAA,EAAQ,CAAC,CAAC,OAAS,EAAA,wBAAwB,CAAC,CAAA,EACxD,QACH,EAAA,KAAA,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"ReactAriaControlledValueFix.mjs","sources":["../../../../../../src/lib/react/ReactAriaControlledValueFix.tsx"],"sourcesContent":["import * as Aria from \"react-aria-components\";\nimport {\n Children,\n isValidElement,\n type Context,\n type FC,\n type ForwardedRef,\n type PropsWithChildren,\n useLayoutEffect,\n} from \"react\";\nimport { emitElementValueChange } from \"@/lib/react/emitElementValueChange\";\n\nexport interface ReactAriaControlledValueFixProps extends PropsWithChildren {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n inputContext: Context<any>;\n props: unknown;\n}\n\ninterface ChildProps {\n [key: string]: unknown;\n ref: ForwardedRef<Element>;\n}\n\n/**\n * React Aria (accidentally?!) enforces controlled inputs by always setting the\n * value prop on Inputs and TextAreas with its context props API. This component\n * also uses this API to only unset the value prop. Furthermore setting an input\n * value is finally done by directly on the DOM element.\n *\n * https://github.com/adobe/react-spectrum/blob/main/packages/%40react-aria/textfield/src/useTextField.ts#L182\n * https://github.com/adobe/react-spectrum/blob/main/packages/%40react-aria/numberfield/src/useNumberField.ts#L206\n */\nexport const ReactAriaControlledValueFix: FC<\n ReactAriaControlledValueFixProps\n> = (props) => {\n const { inputContext: context, children } = props;\n\n const child = Children.only(children);\n if (!isValidElement<ChildProps>(child)) {\n throw new Error(\"Expected valid element\");\n }\n\n const { ref, ...inputProps } = child.props;\n const [contextProps, contextRef] = Aria.useContextProps(\n inputProps,\n ref,\n context,\n );\n\n useLayoutEffect(() => {\n const element = contextRef.current;\n\n if (\n element instanceof HTMLInputElement ||\n element instanceof HTMLTextAreaElement\n ) {\n const newValue = String(contextProps.value ?? \"\");\n emitElementValueChange(\n element,\n newValue,\n new Event(\"input\", { bubbles: true }),\n );\n }\n }, [contextProps.value]);\n\n const uncontrolledContextProps = {\n ...contextProps,\n value: undefined,\n ref: contextRef,\n };\n\n return (\n <Aria.Provider values={[[context, uncontrolledContextProps]]}>\n {child}\n </Aria.Provider>\n );\n};\n"],"names":[],"mappings":";;;;;AAgCa,MAAA,2BAAA,GAET,CAAC,KAAU,KAAA;AACb,EAAA,MAAM,EAAE,YAAA,EAAc,OAAS,EAAA,QAAA,EAAa,GAAA,KAAA;AAE5C,EAAM,MAAA,KAAA,GAAQ,QAAS,CAAA,IAAA,CAAK,QAAQ,CAAA;AACpC,EAAI,IAAA,CAAC,cAA2B,CAAA,KAAK,CAAG,EAAA;AACtC,IAAM,MAAA,IAAI,MAAM,wBAAwB,CAAA;AAAA;AAG1C,EAAA,MAAM,EAAE,GAAA,EAAK,GAAG,UAAA,KAAe,KAAM,CAAA,KAAA;AACrC,EAAA,MAAM,CAAC,YAAA,EAAc,UAAU,CAAA,GAAI,IAAK,CAAA,eAAA;AAAA,IACtC,UAAA;AAAA,IACA,GAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,MAAM,UAAU,UAAW,CAAA,OAAA;AAE3B,IACE,IAAA,OAAA,YAAmB,gBACnB,IAAA,OAAA,YAAmB,mBACnB,EAAA;AACA,MAAA,MAAM,QAAW,GAAA,MAAA,CAAO,YAAa,CAAA,KAAA,IAAS,EAAE,CAAA;AAChD,MAAA,sBAAA;AAAA,QACE,OAAA;AAAA,QACA,QAAA;AAAA,QACA,IAAI,KAAM,CAAA,OAAA,EAAS,EAAE,OAAA,EAAS,MAAM;AAAA,OACtC;AAAA;AACF,GACC,EAAA,CAAC,YAAa,CAAA,KAAK,CAAC,CAAA;AAEvB,EAAA,MAAM,wBAA2B,GAAA;AAAA,IAC/B,GAAG,YAAA;AAAA,IACH,KAAO,EAAA,MAAA;AAAA,IACP,GAAK,EAAA;AAAA,GACP;AAEA,EACE,uBAAA,GAAA,CAAC,IAAK,CAAA,QAAA,EAAL,EAAc,MAAA,EAAQ,CAAC,CAAC,OAAS,EAAA,wBAAwB,CAAC,CAAA,EACxD,QACH,EAAA,KAAA,EAAA,CAAA;AAEJ;;;;"}
@@ -0,0 +1,22 @@
1
+ "use client"
2
+ /* */
3
+ const emitElementValueChange = (element, value, event = new Event("change", { bubbles: true })) => {
4
+ try {
5
+ const nativeInputValueSetter = Object.getOwnPropertyDescriptor(
6
+ Object.getPrototypeOf(element),
7
+ "value"
8
+ )?.set;
9
+ nativeInputValueSetter?.call(element, value);
10
+ element.dispatchEvent(event);
11
+ } catch (ignoredError) {
12
+ if ("value" in element) {
13
+ element.value = value;
14
+ element.dispatchEvent(event);
15
+ } else {
16
+ throw Error("could not emit value update for element");
17
+ }
18
+ }
19
+ };
20
+
21
+ export { emitElementValueChange };
22
+ //# sourceMappingURL=emitElementValueChange.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitElementValueChange.mjs","sources":["../../../../../../src/lib/react/emitElementValueChange.ts"],"sourcesContent":["/**\n * Triggers a Value Update for an Element that also fires the React onChange\n * routine\n */\nexport const emitElementValueChange = (\n element: HTMLElement,\n value: string,\n event: Event = new Event(\"change\", { bubbles: true }),\n) => {\n try {\n const nativeInputValueSetter = Object.getOwnPropertyDescriptor(\n Object.getPrototypeOf(element),\n \"value\",\n )?.set;\n nativeInputValueSetter?.call(element, value);\n element.dispatchEvent(event);\n } catch (ignoredError) {\n if (\"value\" in element) {\n element.value = value;\n element.dispatchEvent(event);\n } else {\n throw Error(\"could not emit value update for element\");\n }\n }\n};\n"],"names":[],"mappings":"AAIO,MAAM,sBAAyB,GAAA,CACpC,OACA,EAAA,KAAA,EACA,KAAe,GAAA,IAAI,KAAM,CAAA,QAAA,EAAU,EAAE,OAAA,EAAS,IAAK,EAAC,CACjD,KAAA;AACH,EAAI,IAAA;AACF,IAAA,MAAM,yBAAyB,MAAO,CAAA,wBAAA;AAAA,MACpC,MAAA,CAAO,eAAe,OAAO,CAAA;AAAA,MAC7B;AAAA,KACC,EAAA,GAAA;AACH,IAAwB,sBAAA,EAAA,IAAA,CAAK,SAAS,KAAK,CAAA;AAC3C,IAAA,OAAA,CAAQ,cAAc,KAAK,CAAA;AAAA,WACpB,YAAc,EAAA;AACrB,IAAA,IAAI,WAAW,OAAS,EAAA;AACtB,MAAA,OAAA,CAAQ,KAAQ,GAAA,KAAA;AAChB,MAAA,OAAA,CAAQ,cAAc,KAAK,CAAA;AAAA,KACtB,MAAA;AACL,MAAA,MAAM,MAAM,yCAAyC,CAAA;AAAA;AACvD;AAEJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"Autocomplete.d.ts","sourceRoot":"","sources":["../../../../src/components/Autocomplete/Autocomplete.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,OAAO,KAAK,IAAI,MAAM,uBAAuB,CAAC;AAE9C,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,sCAAsC,CAAC;AAa9C,MAAM,WAAW,iBACf,SAAQ,iBAAiB,EACvB,kBAAkB,EAClB,kBAAkB,EAClB,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,UAAU,GAAG,eAAe,GAAG,YAAY,CAAC;CAAG;AAEhF,wBAAwB;AACxB,eAAO,MAAM,YAAY,sGAkHvB,CAAC;AAEH,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"Autocomplete.d.ts","sourceRoot":"","sources":["../../../../src/components/Autocomplete/Autocomplete.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,OAAO,KAAK,IAAI,MAAM,uBAAuB,CAAC;AAE9C,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,sCAAsC,CAAC;AAc9C,MAAM,WAAW,iBACf,SAAQ,iBAAiB,EACvB,kBAAkB,EAClB,kBAAkB,EAClB,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,UAAU,GAAG,eAAe,GAAG,YAAY,CAAC;CAAG;AAEhF,wBAAwB;AACxB,eAAO,MAAM,YAAY,sGAsGvB,CAAC;AAEH,eAAe,YAAY,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"PasswordCreationField.d.ts","sourceRoot":"","sources":["../../../../src/components/PasswordCreationField/PasswordCreationField.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EACZ,KAAK,iBAAiB,EAKvB,MAAM,OAAO,CAAC;AAOf,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,sCAAsC,CAAC;AAE9C,OAAO,KAAK,IAAI,MAAM,uBAAuB,CAAC;AAoB9C,OAAO,KAAK,EACV,sBAAsB,EACtB,wBAAwB,EACxB,oBAAoB,EACrB,MAAM,4CAA4C,CAAC;AAIpD,MAAM,WAAW,0BACf,SAAQ,iBAAiB,CACrB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,UAAU,GAAG,OAAO,GAAG,cAAc,CAAC,GAC9D,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,kBAAkB,CAAC,CAAC,CAChE,EACD,kBAAkB,CAAC,gBAAgB,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IAC9E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,wBAAwB,CAAC;CAC7C;AAED,MAAM,WAAW,8BACf,SAAQ,IAAI,CAAC,sBAAsB,EAAE,SAAS,CAAC;IAC/C,OAAO,EAAE,OAAO,GAAG,eAAe,CAAC;IACnC,WAAW,EAAE,oBAAoB,EAAE,CAAC;CACrC;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,6FA2PjC,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
1
+ {"version":3,"file":"PasswordCreationField.d.ts","sourceRoot":"","sources":["../../../../src/components/PasswordCreationField/PasswordCreationField.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EACZ,KAAK,iBAAiB,EAKvB,MAAM,OAAO,CAAC;AAOf,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,sCAAsC,CAAC;AAE9C,OAAO,KAAK,IAAI,MAAM,uBAAuB,CAAC;AAoB9C,OAAO,KAAK,EACV,sBAAsB,EACtB,wBAAwB,EACxB,oBAAoB,EACrB,MAAM,4CAA4C,CAAC;AAIpD,MAAM,WAAW,0BACf,SAAQ,iBAAiB,CACrB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,UAAU,GAAG,OAAO,GAAG,cAAc,CAAC,GAC9D,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,kBAAkB,CAAC,CAAC,CAChE,EACD,kBAAkB,CAAC,gBAAgB,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IAC9E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,wBAAwB,CAAC;CAC7C;AAED,MAAM,WAAW,8BACf,SAAQ,IAAI,CAAC,sBAAsB,EAAE,SAAS,CAAC;IAC/C,OAAO,EAAE,OAAO,GAAG,eAAe,CAAC;IACnC,WAAW,EAAE,oBAAoB,EAAE,CAAC;CACrC;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,6FA2QjC,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
@@ -1,9 +1,11 @@
1
1
  import { ResolvedPolicyValidationResult } from '../../PasswordCreationField';
2
2
  import { Status } from '../../../../lib/types/props';
3
+ import { StateFromLatestPolicyValidationResult } from '../../lib/getStateFromLatestPolicyValidationResult';
3
4
  export type ComplexityStatus = Exclude<Status, "info"> | "indeterminate";
4
5
  export interface ComplexityIndicatorProps {
5
6
  isLoading: boolean;
6
7
  isEmptyValue: boolean;
8
+ validationResultState: StateFromLatestPolicyValidationResult;
7
9
  policyValidationResult: ResolvedPolicyValidationResult;
8
10
  }
9
11
  export default ComplexityIndicator;
@@ -1 +1 @@
1
- {"version":3,"file":"ComplexityIndicator.d.ts","sourceRoot":"","sources":["../../../../../../src/components/PasswordCreationField/components/ComplexityIndicator/ComplexityIndicator.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,0DAA0D,CAAC;AAC/G,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,eAAe,CAAC;AAEzE,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,sBAAsB,EAAE,8BAA8B,CAAC;CACxD;AAqED,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"ComplexityIndicator.d.ts","sourceRoot":"","sources":["../../../../../../src/components/PasswordCreationField/components/ComplexityIndicator/ComplexityIndicator.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,0DAA0D,CAAC;AAC/G,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,qCAAqC,EAAE,MAAM,iFAAiF,CAAC;AAE7I,MAAM,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,eAAe,CAAC;AAEzE,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,qBAAqB,EAAE,qCAAqC,CAAC;IAC7D,sBAAsB,EAAE,8BAA8B,CAAC;CACxD;AAuFD,eAAe,mBAAmB,CAAC"}
@@ -1,2 +1,4 @@
1
+ import { RuleValidationResult } from '../../../integrations/@mittwald/password-tools-js';
2
+ export type StateFromLatestPolicyValidationResult = undefined | Partial<RuleValidationResult>;
1
3
  export default getStateFromLatestPolicyValidationResult;
2
4
  //# sourceMappingURL=getStateFromLatestPolicyValidationResult.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getStateFromLatestPolicyValidationResult.d.ts","sourceRoot":"","sources":["../../../../../src/components/PasswordCreationField/lib/getStateFromLatestPolicyValidationResult.ts"],"names":[],"mappings":"AA0CA,eAAe,wCAAwC,CAAC"}
1
+ {"version":3,"file":"getStateFromLatestPolicyValidationResult.d.ts","sourceRoot":"","sources":["../../../../../src/components/PasswordCreationField/lib/getStateFromLatestPolicyValidationResult.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAGvF,MAAM,MAAM,qCAAqC,GAC7C,SAAS,GACT,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAwClC,eAAe,wCAAwC,CAAC"}
@@ -1,2 +1,5 @@
1
+ import { ResolvedPolicyValidationResult } from '../PasswordCreationField';
2
+ import { ComplexityStatus } from '../components/ComplexityIndicator/ComplexityIndicator';
3
+ export declare const getStatusFromPolicyValidationResult: (isValid: ResolvedPolicyValidationResult["isValid"], result: ResolvedPolicyValidationResult) => ComplexityStatus;
1
4
  export default getStatusFromPolicyValidationResult;
2
5
  //# sourceMappingURL=getStatusFromPolicyValidationResult.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getStatusFromPolicyValidationResult.d.ts","sourceRoot":"","sources":["../../../../../src/components/PasswordCreationField/lib/getStatusFromPolicyValidationResult.ts"],"names":[],"mappings":"AA2BA,eAAe,mCAAmC,CAAC"}
1
+ {"version":3,"file":"getStatusFromPolicyValidationResult.d.ts","sourceRoot":"","sources":["../../../../../src/components/PasswordCreationField/lib/getStatusFromPolicyValidationResult.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,0DAA0D,CAAC;AAC/G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uFAAuF,CAAC;AAE9H,eAAO,MAAM,mCAAmC,GAC9C,SAAS,8BAA8B,CAAC,SAAS,CAAC,EAClD,QAAQ,8BAA8B,KACrC,gBAgBF,CAAC;AAEF,eAAe,mCAAmC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ReactAriaControlledValueFix.d.ts","sourceRoot":"","sources":["../../../../src/lib/react/ReactAriaControlledValueFix.tsx"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,OAAO,EACZ,KAAK,EAAE,EAEP,KAAK,iBAAiB,EAEvB,MAAM,OAAO,CAAC;AAEf,MAAM,WAAW,gCAAiC,SAAQ,iBAAiB;IAEzE,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3B,KAAK,EAAE,OAAO,CAAC;CAChB;AAOD;;;;;;;;GAQG;AACH,eAAO,MAAM,2BAA2B,EAAE,EAAE,CAC1C,gCAAgC,CA+CjC,CAAC"}
1
+ {"version":3,"file":"ReactAriaControlledValueFix.d.ts","sourceRoot":"","sources":["../../../../src/lib/react/ReactAriaControlledValueFix.tsx"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,OAAO,EACZ,KAAK,EAAE,EAEP,KAAK,iBAAiB,EAEvB,MAAM,OAAO,CAAC;AAGf,MAAM,WAAW,gCAAiC,SAAQ,iBAAiB;IAEzE,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3B,KAAK,EAAE,OAAO,CAAC;CAChB;AAOD;;;;;;;;GAQG;AACH,eAAO,MAAM,2BAA2B,EAAE,EAAE,CAC1C,gCAAgC,CA2CjC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Triggers a Value Update for an Element that also fires the React onChange
3
+ * routine
4
+ */
5
+ export declare const emitElementValueChange: (element: HTMLElement, value: string, event?: Event) => void;
6
+ //# sourceMappingURL=emitElementValueChange.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitElementValueChange.d.ts","sourceRoot":"","sources":["../../../../src/lib/react/emitElementValueChange.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,sBAAsB,GACjC,SAAS,WAAW,EACpB,OAAO,MAAM,EACb,QAAO,KAA8C,SAiBtD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mittwald/flow-react-components",
3
- "version": "0.2.0-alpha.387",
3
+ "version": "0.2.0-alpha.389",
4
4
  "type": "module",
5
5
  "description": "A React implementation of Flow, mittwald’s design system",
6
6
  "homepage": "https://mittwald.github.io/flow",
@@ -58,7 +58,7 @@
58
58
  "@chakra-ui/live-region": "^2.1.0",
59
59
  "@internationalized/string-compiler": "^3.2.6",
60
60
  "@mittwald/password-tools-js": "3.0.0-alpha.14",
61
- "@mittwald/react-tunnel": "0.2.0-alpha.387",
61
+ "@mittwald/react-tunnel": "0.2.0-alpha.389",
62
62
  "@mittwald/react-use-promise": "^3.0.4",
63
63
  "@react-aria/form": "^3.1.0",
64
64
  "@react-aria/utils": "^3.30.0",
@@ -99,7 +99,7 @@
99
99
  "@faker-js/faker": "^9.9.0",
100
100
  "@internationalized/date": "^3.8.2",
101
101
  "@mittwald/flow-core": "",
102
- "@mittwald/flow-design-tokens": "0.2.0-alpha.387",
102
+ "@mittwald/flow-design-tokens": "0.2.0-alpha.389",
103
103
  "@mittwald/react-use-promise": "^3.0.4",
104
104
  "@mittwald/remote-dom-react": "1.2.2-mittwald.3",
105
105
  "@mittwald/typescript-config": "",
@@ -175,5 +175,5 @@
175
175
  "optional": true
176
176
  }
177
177
  },
178
- "gitHead": "e03afa3662a636239aca77e635d5cda6e2ec71f9"
178
+ "gitHead": "0460848cc85ad7c7d1c3afb6674cf729b1a8aa8f"
179
179
  }