@mittwald/flow-react-components 0.2.0-alpha.896 → 0.2.0-alpha.897

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 (37) hide show
  1. package/AGENTS.md +226 -0
  2. package/CHANGELOG.md +6 -0
  3. package/CLAUDE.md +1 -0
  4. package/dist/assets/doc-properties.json +7002 -7002
  5. package/dist/css/all.css +1 -1
  6. package/dist/js/@mittwald/password-tools-js.mjs +2 -2
  7. package/dist/js/_virtual/_.locale.json@95341064edeb0e38b66d786dbd62955c.mjs +2 -2
  8. package/dist/js/packages/components/src/components/PasswordCreationField/PasswordCreationField.mjs +31 -18
  9. package/dist/js/packages/components/src/components/PasswordCreationField/PasswordCreationField.mjs.map +1 -1
  10. package/dist/js/packages/components/src/components/PasswordCreationField/components/ComplexityIndicator/ComplexityIndicator.mjs +26 -37
  11. package/dist/js/packages/components/src/components/PasswordCreationField/components/ComplexityIndicator/ComplexityIndicator.mjs.map +1 -1
  12. package/dist/js/packages/components/src/components/PasswordCreationField/lib/generateValidationTranslation.mjs +2 -2
  13. package/dist/js/packages/components/src/components/PasswordCreationField/lib/getStateFromLatestPolicyValidationResult.mjs +5 -5
  14. package/dist/js/packages/components/src/components/PasswordCreationField/lib/getStateFromLatestPolicyValidationResult.mjs.map +1 -1
  15. package/dist/js/packages/components/src/components/PasswordCreationField/lib/usePolicyValidationResult.mjs +25 -42
  16. package/dist/js/packages/components/src/components/PasswordCreationField/lib/usePolicyValidationResult.mjs.map +1 -1
  17. package/dist/js/packages/components/src/components/PasswordCreationField/worker/generatePassword.mjs +2 -2
  18. package/dist/js/packages/components/src/integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.mjs +3 -0
  19. package/dist/js/packages/components/src/integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.mjs.map +1 -1
  20. package/dist/js/packages/components/src/integrations/@mittwald/password-tools-js/usePasswordCreationFieldValidation.mjs +3 -3
  21. package/dist/js/packages/components/src/integrations/@mittwald/password-tools-js/usePasswordCreationFieldValidation.mjs.map +1 -1
  22. package/dist/js/packages/design-tokens/dist/json/all-dark.json.mjs +1 -1
  23. package/dist/js/packages/design-tokens/dist/json/all-light.json.mjs +1 -1
  24. package/dist/types/components/PasswordCreationField/PasswordCreationField.d.ts.map +1 -1
  25. package/dist/types/components/PasswordCreationField/components/ComplexityIndicator/ComplexityIndicator.d.ts.map +1 -1
  26. package/dist/types/components/PasswordCreationField/lib/usePolicyValidationResult.d.ts.map +1 -1
  27. package/dist/types/components/PasswordCreationField/stories/Default.stories.d.ts +1 -1
  28. package/dist/types/components/PasswordCreationField/stories/Default.stories.d.ts.map +1 -1
  29. package/dist/types/integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.d.ts +1 -1
  30. package/dist/types/integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.d.ts.map +1 -1
  31. package/dist/types/integrations/@mittwald/password-tools-js/index.d.ts +2 -2
  32. package/dist/types/integrations/@mittwald/password-tools-js/index.d.ts.map +1 -1
  33. package/dist/types/integrations/@mittwald/password-tools-js/usePasswordCreationFieldValidation.d.ts +1 -1
  34. package/dist/types/integrations/@mittwald/password-tools-js/usePasswordCreationFieldValidation.d.ts.map +1 -1
  35. package/dist/types/lib/theming/hooks/useDesignTokens.d.ts +48 -0
  36. package/dist/types/lib/theming/hooks/useDesignTokens.d.ts.map +1 -1
  37. package/package.json +8 -8
@@ -1,8 +1,8 @@
1
1
  "use client"
2
2
  /* */
3
- export { defaultPasswordCreationPolicy } from '../packages/components/src/integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.mjs';
4
- export { generatePasswordCreationFieldValidation, usePasswordCreationFieldValidation } from '../packages/components/src/integrations/@mittwald/password-tools-js/usePasswordCreationFieldValidation.mjs';
5
3
  export { Policy } from '@mittwald/password-tools-js/policy';
6
4
  export { RegexFlags, Rule, RuleType, SequenceType } from '@mittwald/password-tools-js/rules';
7
5
  export { Generator } from '@mittwald/password-tools-js/generator';
6
+ export { defaultPasswordCreationPolicy } from '../packages/components/src/integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.mjs';
7
+ export { generatePasswordCreationFieldValidation, usePasswordCreationFieldValidation } from '../packages/components/src/integrations/@mittwald/password-tools-js/usePasswordCreationFieldValidation.mjs';
8
8
  //# sourceMappingURL=password-tools-js.mjs.map
@@ -28,7 +28,7 @@ const locales = {"de-DE":{
28
28
  "validation.general.securePassword": "Sehr gut! Dein Passwort ist sicher.",
29
29
  "validation.general.short.unspecified": "Keine spezifischen Anforderungen",
30
30
  "validation.hibp": "{isValid, select, true {Das Passwort ist nicht kompromittiert.} other {Das Passwort ist kompromittiert. Bitte vergib ein neues.}}",
31
- "validation.hibp.short": "{isValid, select, true {Nicht kompromittiert} other {Kompromittiert}}",
31
+ "validation.hibp.short": "{isValid, select, true {Nicht kompromittiert} other {Nicht kompromittiert}}",
32
32
  "validation.length.max": "{max, plural, one {Bitte wähle ein Passwort mit maximal einem Zeichen.} other {Bitte wähle ein Passwort mit maximal {max} Zeichen.}}",
33
33
  "validation.length.max.short": "{max, plural, one {Maximal ein Zeichen} other {Maximal {max} Zeichen}}",
34
34
  "validation.length.min": "{min, plural, one {Bitte wähle ein Passwort mit mindestens einem Zeichen.} other {Bitte wähle ein Passwort mit mindestens {min} Zeichen.}}",
@@ -68,7 +68,7 @@ const locales = {"de-DE":{
68
68
  "validation.general.securePassword": "Awesome! Your password is secure.",
69
69
  "validation.general.short.unspecified": "No specific requirements",
70
70
  "validation.hibp": "{isValid, select, true {The password is not compromised.} other {The password has been compromised. Please set a new one.}}",
71
- "validation.hibp.short": "{isValid, select, true {Not compromised} other {Compromised}}",
71
+ "validation.hibp.short": "{isValid, select, true {Not compromised} other {Not compromised}}",
72
72
  "validation.length.max": "{max, plural, one {Please choose a password with a maximum of one character.} other {Please choose a password with a maximum of {max} characters.}}",
73
73
  "validation.length.max.short": "{max, plural, one {Maximum one character} other {Maximum {max} characters}}",
74
74
  "validation.length.min": "{min, plural, one {Please choose a password with at least one character.} other {Please choose a password with at least {min} characters.}}",
@@ -1,7 +1,7 @@
1
1
  "use client"
2
2
  /* */
3
3
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
4
- import { useState, useMemo, useDeferredValue } from 'react';
4
+ import { useMemo, useState, useRef } from 'react';
5
5
  import { dynamic } from '../../lib/propsContext/dynamicProps/dynamic.mjs';
6
6
  import '../../lib/propsContext/propsContext.mjs';
7
7
  import { PropsContextProvider } from '../../lib/propsContext/components/PropsContextProvider.mjs';
@@ -21,10 +21,10 @@ import { generatePassword } from './worker/generatePassword.mjs';
21
21
  import { TogglePasswordVisibilityButton } from './components/TogglePasswordVisibilityButton/TogglePasswordVisibilityButton.mjs';
22
22
  import { ValidationResultButton } from './components/ValidationResultButton/ValidationResultButton.mjs';
23
23
  import { PasswordGenerateButton } from './components/PasswordGenerateButton/PasswordGenerateButton.mjs';
24
- import { defaultPasswordCreationPolicy } from '../../integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.mjs';
25
24
  import { Policy } from '@mittwald/password-tools-js/policy';
26
25
  import '@mittwald/password-tools-js/rules';
27
26
  import '@mittwald/password-tools-js/generator';
27
+ import { defaultPasswordCreationPolicy } from '../../integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.mjs';
28
28
  import { usePolicyValidationResult } from './lib/usePolicyValidationResult.mjs';
29
29
  import { useFieldComponent } from '../../lib/hooks/useFieldComponent.mjs';
30
30
  import { FieldError } from '../FieldError/FieldError.mjs';
@@ -53,7 +53,6 @@ const PasswordCreationField = flowComponent(
53
53
  fieldProps,
54
54
  fieldPropsContext
55
55
  } = useFieldComponent(props, "PasswordCreationField");
56
- const [isLoading, setIsLoading] = useState(false);
57
56
  const translate = useLocalizedStringFormatter(
58
57
  locales,
59
58
  "PasswordCreationField"
@@ -62,10 +61,9 @@ const PasswordCreationField = flowComponent(
62
61
  () => Policy.fromDeclaration(validationPolicyFromProps),
63
62
  [validationPolicyFromProps]
64
63
  );
65
- const deferredValue = useDeferredValue(value ?? "");
66
64
  const [isPasswordRevealed, setIsPasswordRevealed] = useState(false);
67
65
  const initialPolicyValidationState = {
68
- isValid: true,
66
+ isValid: "indeterminate",
69
67
  complexity: {
70
68
  min: validationPolicy.minComplexity,
71
69
  actual: 4,
@@ -76,16 +74,25 @@ const PasswordCreationField = flowComponent(
76
74
  const [policyValidationResult, setPolicyValidationResult] = useState(
77
75
  initialPolicyValidationState
78
76
  );
77
+ const loadingRef = useRef(null);
79
78
  usePolicyValidationResult(
80
79
  validationPolicy,
81
- deferredValue,
80
+ value ?? "",
82
81
  () => {
83
82
  if (isEmptyValue) {
84
83
  return;
85
84
  }
86
- setIsLoading(() => true);
85
+ loadingRef.current = setTimeout(() => {
86
+ setPolicyValidationResult((r) => ({
87
+ ...r,
88
+ isValid: "indeterminate"
89
+ }));
90
+ }, 150);
87
91
  },
88
92
  ({ password, isValid, results }) => {
93
+ if (loadingRef.current) {
94
+ clearTimeout(loadingRef.current);
95
+ }
89
96
  if (isEmptyValue) {
90
97
  setPolicyValidationResult(() => ({
91
98
  ...results,
@@ -93,7 +100,6 @@ const PasswordCreationField = flowComponent(
93
100
  }));
94
101
  return;
95
102
  }
96
- setIsLoading(() => false);
97
103
  setPolicyValidationResult(() => results);
98
104
  onValidationResult?.({ password, isValid });
99
105
  }
@@ -114,19 +120,25 @@ const PasswordCreationField = flowComponent(
114
120
  );
115
121
  }
116
122
  const isValidFromValidationResult = !isEmptyValue && stateFromValidationResult?.isValid;
117
- const isInvalidFromValidationResult = !isEmptyValue && !stateFromValidationResult?.isValid;
123
+ const isInvalidFromValidationResult = !isEmptyValue && stateFromValidationResult?.isValid === false;
118
124
  const isInvalid = invalidFromProps || isInvalidFromValidationResult;
119
125
  const setOptimisticPolicyValidationResult = (state = {}) => {
120
- setIsLoading(() => false);
121
- setPolicyValidationResult(() => ({
122
- ...initialPolicyValidationState,
123
- ...state,
124
- isValid: true
126
+ setPolicyValidationResult((currentState) => ({
127
+ ...currentState,
128
+ isValid: true,
129
+ ...state
125
130
  }));
126
131
  };
127
132
  const onPasswordGenerateHandler = async () => {
128
133
  const generatedPassword = await generatePassword(validationPolicy);
129
- setOptimisticPolicyValidationResult();
134
+ setOptimisticPolicyValidationResult({
135
+ ...initialPolicyValidationState,
136
+ isValid: true,
137
+ ruleResults: policyValidationResult.ruleResults.map((r) => ({
138
+ ...r,
139
+ isValid: true
140
+ }))
141
+ });
130
142
  setIsPasswordRevealed(true);
131
143
  onChange(generatedPassword);
132
144
  };
@@ -204,7 +216,7 @@ const PasswordCreationField = flowComponent(
204
216
  isRequired,
205
217
  children: [
206
218
  /* @__PURE__ */ jsxs(FieldErrorCaptureContext, { children: [
207
- /* @__PURE__ */ jsx(FieldError, { children: latestValidationErrorText }),
219
+ latestValidationErrorText && /* @__PURE__ */ jsx(FieldError, { children: latestValidationErrorText }),
208
220
  /* @__PURE__ */ jsxs(
209
221
  PropsContextProvider,
210
222
  {
@@ -247,10 +259,11 @@ const PasswordCreationField = flowComponent(
247
259
  ComplexityIndicator,
248
260
  {
249
261
  isEmptyValue,
250
- isLoading,
262
+ isLoading: policyValidationResult.isValid === "indeterminate",
251
263
  policyValidationResult,
252
264
  validationResultState: stateFromValidationResult
253
- }
265
+ },
266
+ value
254
267
  )
255
268
  ]
256
269
  }
@@ -1 +1 @@
1
- {"version":3,"file":"PasswordCreationField.mjs","sources":["../../../../../../../src/components/PasswordCreationField/PasswordCreationField.tsx"],"sourcesContent":["import {\n type PropsWithChildren,\n useState,\n type ClipboardEvent,\n useDeferredValue,\n useMemo,\n} from \"react\";\nimport {\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 clsx from \"clsx\";\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 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 { ValidationResultButton } from \"@/components/PasswordCreationField/components/ValidationResultButton/ValidationResultButton\";\nimport { PasswordGenerateButton } from \"@/components/PasswordCreationField/components/PasswordGenerateButton/PasswordGenerateButton\";\nimport type {\n PolicyValidationResult,\n PolicyGenericDeclaration,\n RuleValidationResult,\n} from \"@/integrations/@mittwald/password-tools-js\";\nimport {\n defaultPasswordCreationPolicy,\n Policy,\n} from \"@/integrations/@mittwald/password-tools-js\";\nimport { usePolicyValidationResult } from \"@/components/PasswordCreationField/lib/usePolicyValidationResult\";\nimport { useFieldComponent } from \"@/lib/hooks/useFieldComponent\";\nimport { FieldError } from \"@/components/FieldError\";\nimport { useControlledHostValueProps } from \"@/lib/remote/useControlledHostValueProps\";\nimport { useLocalizedStringFormatter } from \"@/components/TranslationProvider/useLocalizedStringFormatter\";\nimport { UiComponentTunnelExit } from \"../UiComponentTunnel/UiComponentTunnelExit\";\n\nexport interface PasswordCreationFieldProps\n extends\n 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 extends Omit<\n PolicyValidationResult,\n \"isValid\"\n> {\n isValid: boolean | \"indeterminate\";\n ruleResults: RuleValidationResult[];\n}\n\n/** @flr-generate all */\nexport const PasswordCreationField = flowComponent(\n \"PasswordCreationField\",\n (props) => {\n const {\n children,\n className,\n ref,\n isDisabled,\n onValidationResult,\n isInvalid: invalidFromProps,\n validationPolicy:\n validationPolicyFromProps = defaultPasswordCreationPolicy,\n isRequired,\n value,\n onChange,\n ...rest\n } = useControlledHostValueProps(props);\n\n const {\n FieldErrorView,\n FieldErrorCaptureContext,\n fieldProps,\n fieldPropsContext,\n } = useFieldComponent(props, \"PasswordCreationField\");\n\n const [isLoading, setIsLoading] = useState(false);\n const translate = useLocalizedStringFormatter(\n locales,\n \"PasswordCreationField\",\n );\n\n const validationPolicy = useMemo(\n () => Policy.fromDeclaration(validationPolicyFromProps),\n [validationPolicyFromProps],\n );\n\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 onPasswordGenerateHandler: ActionFn = async () => {\n const generatedPassword = await generatePassword(validationPolicy);\n setOptimisticPolicyValidationResult();\n setIsPasswordRevealed(true);\n onChange(generatedPassword);\n };\n\n const onPasswordPasteHandler = (event: ClipboardEvent) => {\n const pastedValue = event.clipboardData?.getData(\"text\");\n if (typeof pastedValue === \"string\" && 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 ...fieldPropsContext,\n Button: {\n tunnel: {\n id: \"button\",\n component: \"PasswordCreationField\",\n },\n size: \"m\",\n variant: \"plain\",\n color: \"secondary\",\n isDisabled: isDisabled,\n className: styles.button,\n },\n CopyButton: {\n tunnel: {\n id: \"button\",\n component: \"PasswordCreationField\",\n },\n size: \"m\",\n variant: \"plain\",\n color: \"secondary\",\n isDisabled: isDisabled,\n className: styles.button,\n text: value,\n },\n Label: {\n ...fieldPropsContext.Label,\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 };\n\n return (\n <Aria.TextField\n {...rest}\n value={value}\n type={isPasswordRevealed ? \"text\" : \"password\"}\n onChange={onChange}\n onPaste={onPasswordPasteHandler}\n className={clsx(className, fieldProps.className)}\n isDisabled={isDisabled}\n isInvalid={isInvalid}\n isRequired={isRequired}\n >\n <FieldErrorCaptureContext>\n <FieldError>{latestValidationErrorText}</FieldError>\n <PropsContextProvider\n props={propsContext}\n dependencies={[\n isDisabled,\n isRequired,\n value,\n policyValidationResult,\n isEmptyValue,\n ]}\n >\n {children}\n <Aria.Group\n isDisabled={isDisabled}\n className={clsx(styles.inputGroup)}\n >\n <Aria.Input ref={ref} className={styles.input} />\n <Aria.Group className={styles.buttonContainer}>\n <TogglePasswordVisibilityButton\n className={styles.button}\n isVisible={isPasswordRevealed}\n isDisabled={isDisabled}\n onPress={togglePasswordVisibilityHandler}\n />\n <UiComponentTunnelExit\n id=\"button\"\n component=\"PasswordCreationField\"\n />\n </Aria.Group>\n <ComplexityIndicator\n isEmptyValue={isEmptyValue}\n isLoading={isLoading}\n policyValidationResult={policyValidationResult}\n validationResultState={stateFromValidationResult}\n />\n </Aria.Group>\n {isValidFromValidationResult && (\n <FieldDescription>{latestValidationErrorText}</FieldDescription>\n )}\n </PropsContextProvider>\n </FieldErrorCaptureContext>\n <FieldErrorView />\n </Aria.TextField>\n );\n },\n);\n\nexport default PasswordCreationField;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PasswordCreationField.mjs","sources":["../../../../../../../src/components/PasswordCreationField/PasswordCreationField.tsx"],"sourcesContent":["import {\n type PropsWithChildren,\n useState,\n type ClipboardEvent,\n useMemo,\n useRef,\n} from \"react\";\nimport {\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 clsx from \"clsx\";\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 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 { ValidationResultButton } from \"@/components/PasswordCreationField/components/ValidationResultButton/ValidationResultButton\";\nimport { PasswordGenerateButton } from \"@/components/PasswordCreationField/components/PasswordGenerateButton/PasswordGenerateButton\";\nimport type {\n PolicyValidationResult,\n PolicyGenericDeclaration,\n RuleValidationResult,\n} from \"@/integrations/@mittwald/password-tools-js\";\nimport {\n defaultPasswordCreationPolicy,\n Policy,\n} from \"@/integrations/@mittwald/password-tools-js\";\nimport { usePolicyValidationResult } from \"@/components/PasswordCreationField/lib/usePolicyValidationResult\";\nimport { useFieldComponent } from \"@/lib/hooks/useFieldComponent\";\nimport { FieldError } from \"@/components/FieldError\";\nimport { useControlledHostValueProps } from \"@/lib/remote/useControlledHostValueProps\";\nimport { useLocalizedStringFormatter } from \"@/components/TranslationProvider/useLocalizedStringFormatter\";\nimport { UiComponentTunnelExit } from \"../UiComponentTunnel/UiComponentTunnelExit\";\n\nexport interface PasswordCreationFieldProps\n extends\n 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 extends Omit<\n PolicyValidationResult,\n \"isValid\"\n> {\n isValid: boolean | \"indeterminate\";\n ruleResults: RuleValidationResult[];\n}\n\n/** @flr-generate all */\nexport const PasswordCreationField = flowComponent(\n \"PasswordCreationField\",\n (props) => {\n const {\n children,\n className,\n ref,\n isDisabled,\n onValidationResult,\n isInvalid: invalidFromProps,\n validationPolicy:\n validationPolicyFromProps = defaultPasswordCreationPolicy,\n isRequired,\n value,\n onChange,\n ...rest\n } = useControlledHostValueProps(props);\n\n const {\n FieldErrorView,\n FieldErrorCaptureContext,\n fieldProps,\n fieldPropsContext,\n } = useFieldComponent(props, \"PasswordCreationField\");\n\n const translate = useLocalizedStringFormatter(\n locales,\n \"PasswordCreationField\",\n );\n\n const validationPolicy = useMemo(\n () => Policy.fromDeclaration(validationPolicyFromProps),\n [validationPolicyFromProps],\n );\n\n const [isPasswordRevealed, setIsPasswordRevealed] = useState(false);\n const initialPolicyValidationState: ResolvedPolicyValidationResult = {\n isValid: \"indeterminate\",\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\n const loadingRef = useRef<ReturnType<typeof setTimeout>>(null);\n usePolicyValidationResult(\n validationPolicy,\n value ?? \"\",\n () => {\n if (isEmptyValue) {\n return;\n }\n\n loadingRef.current = setTimeout(() => {\n setPolicyValidationResult((r) => ({\n ...r,\n isValid: \"indeterminate\",\n }));\n }, 150);\n },\n ({ password, isValid, results }) => {\n if (loadingRef.current) {\n clearTimeout(loadingRef.current);\n }\n\n if (isEmptyValue) {\n setPolicyValidationResult(() => ({\n ...results,\n isValid: true,\n }));\n return;\n }\n\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\n const isInvalidFromValidationResult =\n !isEmptyValue && stateFromValidationResult?.isValid === false;\n const isInvalid = invalidFromProps || isInvalidFromValidationResult;\n\n const setOptimisticPolicyValidationResult = (\n state: Partial<ResolvedPolicyValidationResult> = {},\n ) => {\n setPolicyValidationResult((currentState) => ({\n ...currentState,\n isValid: true,\n ...state,\n }));\n };\n\n const onPasswordGenerateHandler: ActionFn = async () => {\n const generatedPassword = await generatePassword(validationPolicy);\n setOptimisticPolicyValidationResult({\n ...initialPolicyValidationState,\n isValid: true,\n ruleResults: policyValidationResult.ruleResults.map((r) => ({\n ...r,\n isValid: true,\n })),\n });\n setIsPasswordRevealed(true);\n onChange(generatedPassword);\n };\n\n const onPasswordPasteHandler = (event: ClipboardEvent) => {\n const pastedValue = event.clipboardData?.getData(\"text\");\n if (typeof pastedValue === \"string\" && 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 ...fieldPropsContext,\n Button: {\n tunnel: {\n id: \"button\",\n component: \"PasswordCreationField\",\n },\n size: \"m\",\n variant: \"plain\",\n color: \"secondary\",\n isDisabled: isDisabled,\n className: styles.button,\n },\n CopyButton: {\n tunnel: {\n id: \"button\",\n component: \"PasswordCreationField\",\n },\n size: \"m\",\n variant: \"plain\",\n color: \"secondary\",\n isDisabled: isDisabled,\n className: styles.button,\n text: value,\n },\n Label: {\n ...fieldPropsContext.Label,\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 };\n\n return (\n <Aria.TextField\n {...rest}\n value={value}\n type={isPasswordRevealed ? \"text\" : \"password\"}\n onChange={onChange}\n onPaste={onPasswordPasteHandler}\n className={clsx(className, fieldProps.className)}\n isDisabled={isDisabled}\n isInvalid={isInvalid}\n isRequired={isRequired}\n >\n <FieldErrorCaptureContext>\n {latestValidationErrorText && (\n <FieldError>{latestValidationErrorText}</FieldError>\n )}\n <PropsContextProvider\n props={propsContext}\n dependencies={[\n isDisabled,\n isRequired,\n value,\n policyValidationResult,\n isEmptyValue,\n ]}\n >\n {children}\n <Aria.Group\n isDisabled={isDisabled}\n className={clsx(styles.inputGroup)}\n >\n <Aria.Input ref={ref} className={styles.input} />\n <Aria.Group className={styles.buttonContainer}>\n <TogglePasswordVisibilityButton\n className={styles.button}\n isVisible={isPasswordRevealed}\n isDisabled={isDisabled}\n onPress={togglePasswordVisibilityHandler}\n />\n <UiComponentTunnelExit\n id=\"button\"\n component=\"PasswordCreationField\"\n />\n </Aria.Group>\n <ComplexityIndicator\n key={value}\n isEmptyValue={isEmptyValue}\n isLoading={policyValidationResult.isValid === \"indeterminate\"}\n policyValidationResult={policyValidationResult}\n validationResultState={stateFromValidationResult}\n />\n </Aria.Group>\n {isValidFromValidationResult && (\n <FieldDescription>{latestValidationErrorText}</FieldDescription>\n )}\n </PropsContextProvider>\n </FieldErrorCaptureContext>\n <FieldErrorView />\n </Aria.TextField>\n );\n },\n);\n\nexport default PasswordCreationField;\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoEO,MAAM,qBAAA,GAAwB,aAAA;AAAA,EACnC,uBAAA;AAAA,EACA,CAAC,KAAA,KAAU;AACT,IAAA,MAAM;AAAA,MACJ,QAAA;AAAA,MACA,SAAA;AAAA,MACA,GAAA;AAAA,MACA,UAAA;AAAA,MACA,kBAAA;AAAA,MACA,SAAA,EAAW,gBAAA;AAAA,MACX,kBACE,yBAAA,GAA4B,6BAAA;AAAA,MAC9B,UAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAA;AAAA,MACA,GAAG;AAAA,KACL,GAAI,4BAA4B,KAAK,CAAA;AAErC,IAAA,MAAM;AAAA,MACJ,cAAA;AAAA,MACA,wBAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF,GAAI,iBAAA,CAAkB,KAAA,EAAO,uBAAuB,CAAA;AAEpD,IAAA,MAAM,SAAA,GAAY,2BAAA;AAAA,MAChB,OAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,gBAAA,GAAmB,OAAA;AAAA,MACvB,MAAM,MAAA,CAAO,eAAA,CAAgB,yBAAyB,CAAA;AAAA,MACtD,CAAC,yBAAyB;AAAA,KAC5B;AAEA,IAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAI,SAAS,KAAK,CAAA;AAClE,IAAA,MAAM,4BAAA,GAA+D;AAAA,MACnE,OAAA,EAAS,eAAA;AAAA,MACT,UAAA,EAAY;AAAA,QACV,KAAK,gBAAA,CAAiB,aAAA;AAAA,QACtB,MAAA,EAAQ,CAAA;AAAA,QACR,OAAA,EAAS;AAAA,OACX;AAAA,MACA,aAAa;AAAC,KAChB;AAEA,IAAA,MAAM,CAAC,sBAAA,EAAwB,yBAAyB,CAAA,GAAI,QAAA;AAAA,MAC1D;AAAA,KACF;AAEA,IAAA,MAAM,UAAA,GAAa,OAAsC,IAAI,CAAA;AAC7D,IAAA,yBAAA;AAAA,MACE,gBAAA;AAAA,MACA,KAAA,IAAS,EAAA;AAAA,MACT,MAAM;AACJ,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA;AAAA,QACF;AAEA,QAAA,UAAA,CAAW,OAAA,GAAU,WAAW,MAAM;AACpC,UAAA,yBAAA,CAA0B,CAAC,CAAA,MAAO;AAAA,YAChC,GAAG,CAAA;AAAA,YACH,OAAA,EAAS;AAAA,WACX,CAAE,CAAA;AAAA,QACJ,GAAG,GAAG,CAAA;AAAA,MACR,CAAA;AAAA,MACA,CAAC,EAAE,QAAA,EAAU,OAAA,EAAS,SAAQ,KAAM;AAClC,QAAA,IAAI,WAAW,OAAA,EAAS;AACtB,UAAA,YAAA,CAAa,WAAW,OAAO,CAAA;AAAA,QACjC;AAEA,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,yBAAA,CAA0B,OAAO;AAAA,YAC/B,GAAG,OAAA;AAAA,YACH,OAAA,EAAS;AAAA,WACX,CAAE,CAAA;AACF,UAAA;AAAA,QACF;AAEA,QAAA,yBAAA,CAA0B,MAAM,OAAO,CAAA;AACvC,QAAA,kBAAA,GAAqB,EAAE,QAAA,EAAU,OAAA,EAAS,CAAA;AAAA,MAC5C;AAAA,KACF;AAEA,IAAA,MAAM,eAAe,CAAC,KAAA;AACtB,IAAA,MAAM,yBAAA,GAA4B,wCAAA;AAAA,MAChC,YAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,yBAAA,GAA4B,MAAA;AAChC,IAAA,IAAI,yBAAA,EAA2B;AAC7B,MAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,6BAAA;AAAA,QAC1C;AAAA,OACF;AACA,MAAA,yBAAA,GAA4B,SAAA,CAAU,MAAA;AAAA,QACpC,cAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,2BAAA,GACJ,CAAC,YAAA,IAAgB,yBAAA,EAA2B,OAAA;AAE9C,IAAA,MAAM,6BAAA,GACJ,CAAC,YAAA,IAAgB,yBAAA,EAA2B,OAAA,KAAY,KAAA;AAC1D,IAAA,MAAM,YAAY,gBAAA,IAAoB,6BAAA;AAEtC,IAAA,MAAM,mCAAA,GAAsC,CAC1C,KAAA,GAAiD,EAAC,KAC/C;AACH,MAAA,yBAAA,CAA0B,CAAC,YAAA,MAAkB;AAAA,QAC3C,GAAG,YAAA;AAAA,QACH,OAAA,EAAS,IAAA;AAAA,QACT,GAAG;AAAA,OACL,CAAE,CAAA;AAAA,IACJ,CAAA;AAEA,IAAA,MAAM,4BAAsC,YAAY;AACtD,MAAA,MAAM,iBAAA,GAAoB,MAAM,gBAAA,CAAiB,gBAAgB,CAAA;AACjE,MAAA,mCAAA,CAAoC;AAAA,QAClC,GAAG,4BAAA;AAAA,QACH,OAAA,EAAS,IAAA;AAAA,QACT,WAAA,EAAa,sBAAA,CAAuB,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UAC1D,GAAG,CAAA;AAAA,UACH,OAAA,EAAS;AAAA,SACX,CAAE;AAAA,OACH,CAAA;AACD,MAAA,qBAAA,CAAsB,IAAI,CAAA;AAC1B,MAAA,QAAA,CAAS,iBAAiB,CAAA;AAAA,IAC5B,CAAA;AAEA,IAAA,MAAM,sBAAA,GAAyB,CAAC,KAAA,KAA0B;AACxD,MAAA,MAAM,WAAA,GAAc,KAAA,CAAM,aAAA,EAAe,OAAA,CAAQ,MAAM,CAAA;AACvD,MAAA,IAAI,OAAO,WAAA,KAAgB,QAAA,IAAY,WAAA,KAAgB,KAAA,EAAO;AAC5D,QAAA,mCAAA,CAAoC;AAAA,UAClC,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,kCAAkC,MAAM;AAC5C,MAAA,qBAAA,CAAsB,CAAC,GAAA,KAAQ,CAAC,GAAG,CAAA;AAAA,IACrC,CAAA;AAEA,IAAA,MAAM,YAAA,GAA6B;AAAA,MACjC,GAAG,iBAAA;AAAA,MACH,MAAA,EAAQ;AAAA,QACN,MAAA,EAAQ;AAAA,UACN,EAAA,EAAI,QAAA;AAAA,UACJ,SAAA,EAAW;AAAA,SACb;AAAA,QACA,IAAA,EAAM,GAAA;AAAA,QACN,OAAA,EAAS,OAAA;AAAA,QACT,KAAA,EAAO,WAAA;AAAA,QACP,UAAA;AAAA,QACA,WAAW,MAAA,CAAO;AAAA,OACpB;AAAA,MACA,UAAA,EAAY;AAAA,QACV,MAAA,EAAQ;AAAA,UACN,EAAA,EAAI,QAAA;AAAA,UACJ,SAAA,EAAW;AAAA,SACb;AAAA,QACA,IAAA,EAAM,GAAA;AAAA,QACN,OAAA,EAAS,OAAA;AAAA,QACT,KAAA,EAAO,WAAA;AAAA,QACP,UAAA;AAAA,QACA,WAAW,MAAA,CAAO,MAAA;AAAA,QAClB,IAAA,EAAM;AAAA,OACR;AAAA,MACA,KAAA,EAAO;AAAA,QACL,GAAG,iBAAA,CAAkB,KAAA;AAAA,QACrB,QAAA,EAAU,OAAA,CAAQ,CAAC,UAAA,KAAe;AAChC,UAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,YAAA,UAAA,CAAW,QAAA;AAAA,4BACZ,GAAA;AAAA,cAAC,sBAAA;AAAA,cAAA;AAAA,gBACC,UAAA;AAAA,gBACA,wBAAA,EAA0B;AAAA;AAAA,aAC5B;AAAA,4BACA,GAAA;AAAA,cAAC,sBAAA;AAAA,cAAA;AAAA,gBACC,YAAA;AAAA,gBACA,UAAA;AAAA,gBACA;AAAA;AAAA;AACF,WAAA,EACF,CAAA;AAAA,QAEJ,CAAC;AAAA;AACH,KACF;AAEA,IAAA,uBACE,IAAA;AAAA,MAAC,IAAA,CAAK,SAAA;AAAA,MAAL;AAAA,QACE,GAAG,IAAA;AAAA,QACJ,KAAA;AAAA,QACA,IAAA,EAAM,qBAAqB,MAAA,GAAS,UAAA;AAAA,QACpC,QAAA;AAAA,QACA,OAAA,EAAS,sBAAA;AAAA,QACT,SAAA,EAAW,IAAA,CAAK,SAAA,EAAW,UAAA,CAAW,SAAS,CAAA;AAAA,QAC/C,UAAA;AAAA,QACA,SAAA;AAAA,QACA,UAAA;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,wBAAA,EAAA,EACE,QAAA,EAAA;AAAA,YAAA,yBAAA,oBACC,GAAA,CAAC,cAAY,QAAA,EAAA,yBAAA,EAA0B,CAAA;AAAA,4BAEzC,IAAA;AAAA,cAAC,oBAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAO,YAAA;AAAA,gBACP,YAAA,EAAc;AAAA,kBACZ,UAAA;AAAA,kBACA,UAAA;AAAA,kBACA,KAAA;AAAA,kBACA,sBAAA;AAAA,kBACA;AAAA,iBACF;AAAA,gBAEC,QAAA,EAAA;AAAA,kBAAA,QAAA;AAAA,kCACD,IAAA;AAAA,oBAAC,IAAA,CAAK,KAAA;AAAA,oBAAL;AAAA,sBACC,UAAA;AAAA,sBACA,SAAA,EAAW,IAAA,CAAK,MAAA,CAAO,UAAU,CAAA;AAAA,sBAEjC,QAAA,EAAA;AAAA,wCAAA,GAAA,CAAC,KAAK,KAAA,EAAL,EAAW,GAAA,EAAU,SAAA,EAAW,OAAO,KAAA,EAAO,CAAA;AAAA,6CAC9C,IAAA,CAAK,KAAA,EAAL,EAAW,SAAA,EAAW,OAAO,eAAA,EAC5B,QAAA,EAAA;AAAA,0CAAA,GAAA;AAAA,4BAAC,8BAAA;AAAA,4BAAA;AAAA,8BACC,WAAW,MAAA,CAAO,MAAA;AAAA,8BAClB,SAAA,EAAW,kBAAA;AAAA,8BACX,UAAA;AAAA,8BACA,OAAA,EAAS;AAAA;AAAA,2BACX;AAAA,0CACA,GAAA;AAAA,4BAAC,qBAAA;AAAA,4BAAA;AAAA,8BACC,EAAA,EAAG,QAAA;AAAA,8BACH,SAAA,EAAU;AAAA;AAAA;AACZ,yBAAA,EACF,CAAA;AAAA,wCACA,GAAA;AAAA,0BAAC,mBAAA;AAAA,0BAAA;AAAA,4BAEC,YAAA;AAAA,4BACA,SAAA,EAAW,uBAAuB,OAAA,KAAY,eAAA;AAAA,4BAC9C,sBAAA;AAAA,4BACA,qBAAA,EAAuB;AAAA,2BAAA;AAAA,0BAJlB;AAAA;AAKP;AAAA;AAAA,mBACF;AAAA,kBACC,2BAAA,oBACC,GAAA,CAAC,gBAAA,EAAA,EAAkB,QAAA,EAAA,yBAAA,EAA0B;AAAA;AAAA;AAAA;AAEjD,WAAA,EACF,CAAA;AAAA,8BACC,cAAA,EAAA,EAAe;AAAA;AAAA;AAAA,KAClB;AAAA,EAEJ;AACF;;;;"}
@@ -1,7 +1,7 @@
1
1
  "use client"
2
2
  /* */
3
3
  import { jsx } from 'react/jsx-runtime';
4
- import { useState, useLayoutEffect } from 'react';
4
+ import 'react';
5
5
  import styles from './ComplexityIndicator.module.scss.mjs';
6
6
  import { getStatusFromPolicyValidationResult } from '../../lib/getStatusFromPolicyValidationResult.mjs';
7
7
  import clsx from 'clsx';
@@ -13,45 +13,34 @@ const ComplexityIndicator = (props) => {
13
13
  isLoading,
14
14
  isEmptyValue
15
15
  } = props;
16
+ let complexityVisible;
17
+ let status;
16
18
  const complexityScore = policyValidationResult?.complexity;
17
- const [state, setState] = useState({
18
- percentage: 0,
19
- status: "success",
20
- visible: false
21
- });
22
- useLayoutEffect(() => {
23
- if (isEmptyValue) {
24
- setState({
25
- status: "success",
26
- percentage: 0,
27
- visible: false
28
- });
29
- return;
30
- }
31
- let complexityFulfilledPercentage = 0;
32
- if (policyValidationResult?.isValid === "indeterminate") {
33
- complexityFulfilledPercentage = 100;
34
- } else if (complexityScore && !isEmptyValue) {
35
- complexityFulfilledPercentage = Math.min(
36
- 100 / (complexityScore.min + 1) * (complexityScore.actual + 1),
37
- 100
38
- );
39
- }
40
- const policyValidationStatus = getStatusFromPolicyValidationResult(
19
+ const rulesResults = policyValidationResult?.ruleResults ?? [];
20
+ const complexityFulfilledPercentage = complexityScore ? Math.min(
21
+ 100 / (complexityScore.min + 1) * (complexityScore.actual + 1),
22
+ 100
23
+ ) : 0;
24
+ const validRules = rulesResults.filter((r) => r.isValid).length;
25
+ const rulesFulfilledPercentage = rulesResults.length > 0 ? validRules / rulesResults.length * 100 : 0;
26
+ let totalFulfilledPercentage = Math.round(
27
+ complexityFulfilledPercentage * 0.8 + rulesFulfilledPercentage * 0.2
28
+ );
29
+ if (isEmptyValue) {
30
+ complexityVisible = false;
31
+ totalFulfilledPercentage = 0;
32
+ status = "success";
33
+ } else {
34
+ complexityVisible = true;
35
+ status = getStatusFromPolicyValidationResult(
41
36
  validationResultState?.isValid ?? policyValidationResult.isValid,
42
37
  policyValidationResult
43
38
  );
44
- setState({
45
- status: policyValidationStatus,
46
- percentage: complexityFulfilledPercentage,
47
- visible: true
48
- });
49
- }, [policyValidationResult, isEmptyValue]);
50
- const complexityVisible = state.visible;
51
- const complexityFulfilled = state.percentage === 100;
39
+ }
40
+ const complexityFulfilled = totalFulfilledPercentage === 100;
52
41
  const percentageClassName = clsx(
53
42
  styles.bar,
54
- !isEmptyValue && styles[`bar-background-status-${state.status}`],
43
+ !isEmptyValue && styles[`bar-background-status-${status}`],
55
44
  {
56
45
  [styles.loading]: isLoading,
57
46
  [styles.running]: !complexityFulfilled
@@ -63,8 +52,8 @@ const ComplexityIndicator = (props) => {
63
52
  "aria-hidden": true,
64
53
  "data-container": "complexity",
65
54
  "data-complexity-visible": complexityVisible,
66
- "data-complexity-status": state.status,
67
- "data-complexity-percentage": state.percentage,
55
+ "data-complexity-status": status,
56
+ "data-complexity-percentage": totalFulfilledPercentage,
68
57
  className: clsx(styles.complexityIndicator, {
69
58
  [styles.hide]: !complexityVisible
70
59
  }),
@@ -72,7 +61,7 @@ const ComplexityIndicator = (props) => {
72
61
  "div",
73
62
  {
74
63
  style: {
75
- width: `${state.percentage}%`
64
+ width: `${totalFulfilledPercentage}%`
76
65
  },
77
66
  className: percentageClassName
78
67
  }
@@ -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\";\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":";;;;;;AAkBO,MAAM,mBAAA,GAAoD,CAAC,KAAA,KAAU;AAC1E,EAAA,MAAM;AAAA,IACJ,sBAAA;AAAA,IACA,qBAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF,GAAI,KAAA;AACJ,EAAA,MAAM,kBAAkB,sBAAA,EAAwB,UAAA;AAEhD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,QAAA,CAIvB;AAAA,IACD,UAAA,EAAY,CAAA;AAAA,IACZ,MAAA,EAAQ,SAAA;AAAA,IACR,OAAA,EAAS;AAAA,GACV,CAAA;AAED,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,QAAA,CAAS;AAAA,QACP,MAAA,EAAQ,SAAA;AAAA,QACR,UAAA,EAAY,CAAA;AAAA,QACZ,OAAA,EAAS;AAAA,OACV,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,6BAAA,GAAgC,CAAA;AACpC,IAAA,IAAI,sBAAA,EAAwB,YAAY,eAAA,EAAiB;AACvD,MAAA,6BAAA,GAAgC,GAAA;AAAA,IAClC,CAAA,MAAA,IAAW,eAAA,IAAmB,CAAC,YAAA,EAAc;AAC3C,MAAA,6BAAA,GAAgC,IAAA,CAAK,GAAA;AAAA,QAClC,GAAA,IAAO,eAAA,CAAgB,GAAA,GAAM,CAAA,CAAA,IAAO,gBAAgB,MAAA,GAAS,CAAA,CAAA;AAAA,QAC9D;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,sBAAA,GAAyB,mCAAA;AAAA,MAC7B,qBAAA,EAAuB,WAAW,sBAAA,CAAuB,OAAA;AAAA,MACzD;AAAA,KACF;AAEA,IAAA,QAAA,CAAS;AAAA,MACP,MAAA,EAAQ,sBAAA;AAAA,MACR,UAAA,EAAY,6BAAA;AAAA,MACZ,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,sBAAA,EAAwB,YAAY,CAAC,CAAA;AAEzC,EAAA,MAAM,oBAAoB,KAAA,CAAM,OAAA;AAChC,EAAA,MAAM,mBAAA,GAAsB,MAAM,UAAA,KAAe,GAAA;AAEjD,EAAA,MAAM,mBAAA,GAAsB,IAAA;AAAA,IAC1B,MAAA,CAAO,GAAA;AAAA,IACP,CAAC,YAAA,IAAgB,MAAA,CAAO,CAAA,sBAAA,EAAyB,KAAA,CAAM,MAAM,CAAA,CAAE,CAAA;AAAA,IAC/D;AAAA,MACE,CAAC,MAAA,CAAO,OAAiB,GAAG,SAAA;AAAA,MAC5B,CAAC,MAAA,CAAO,OAAiB,GAAG,CAAC;AAAA;AAC/B,GACF;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAa,IAAA;AAAA,MACb,gBAAA,EAAe,YAAA;AAAA,MACf,yBAAA,EAAyB,iBAAA;AAAA,MACzB,0BAAwB,KAAA,CAAM,MAAA;AAAA,MAC9B,8BAA4B,KAAA,CAAM,UAAA;AAAA,MAClC,SAAA,EAAW,IAAA,CAAK,MAAA,CAAO,mBAAA,EAAqB;AAAA,QAC1C,CAAC,MAAA,CAAO,IAAc,GAAG,CAAC;AAAA,OAC3B,CAAA;AAAA,MAED,QAAA,kBAAA,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO;AAAA,YACL,KAAA,EAAO,CAAA,EAAG,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,WAC5B;AAAA,UACA,SAAA,EAAW;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 } 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\n let complexityVisible;\n let status: ComplexityStatus;\n\n const complexityScore = policyValidationResult?.complexity;\n const rulesResults = policyValidationResult?.ruleResults ?? [];\n\n const complexityFulfilledPercentage = complexityScore\n ? Math.min(\n (100 / (complexityScore.min + 1)) * (complexityScore.actual + 1),\n 100,\n )\n : 0;\n\n const validRules = rulesResults.filter((r) => r.isValid).length;\n const rulesFulfilledPercentage =\n rulesResults.length > 0 ? (validRules / rulesResults.length) * 100 : 0;\n\n let totalFulfilledPercentage = Math.round(\n complexityFulfilledPercentage * 0.8 + rulesFulfilledPercentage * 0.2,\n );\n\n if (isEmptyValue) {\n complexityVisible = false;\n totalFulfilledPercentage = 0;\n status = \"success\";\n } else {\n complexityVisible = true;\n status = getStatusFromPolicyValidationResult(\n validationResultState?.isValid ?? policyValidationResult.isValid,\n policyValidationResult,\n );\n }\n\n const complexityFulfilled = totalFulfilledPercentage === 100;\n\n const percentageClassName = clsx(\n styles.bar,\n !isEmptyValue && styles[`bar-background-status-${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={status}\n data-complexity-percentage={totalFulfilledPercentage}\n className={clsx(styles.complexityIndicator, {\n [styles.hide as string]: !complexityVisible,\n })}\n >\n <div\n style={{\n width: `${totalFulfilledPercentage}%`,\n }}\n className={percentageClassName}\n />\n </div>\n );\n};\n\nexport default ComplexityIndicator;\n"],"names":[],"mappings":";;;;;;AAkBO,MAAM,mBAAA,GAAoD,CAAC,KAAA,KAAU;AAC1E,EAAA,MAAM;AAAA,IACJ,sBAAA;AAAA,IACA,qBAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF,GAAI,KAAA;AAEJ,EAAA,IAAI,iBAAA;AACJ,EAAA,IAAI,MAAA;AAEJ,EAAA,MAAM,kBAAkB,sBAAA,EAAwB,UAAA;AAChD,EAAA,MAAM,YAAA,GAAe,sBAAA,EAAwB,WAAA,IAAe,EAAC;AAE7D,EAAA,MAAM,6BAAA,GAAgC,kBAClC,IAAA,CAAK,GAAA;AAAA,IACF,GAAA,IAAO,eAAA,CAAgB,GAAA,GAAM,CAAA,CAAA,IAAO,gBAAgB,MAAA,GAAS,CAAA,CAAA;AAAA,IAC9D;AAAA,GACF,GACA,CAAA;AAEJ,EAAA,MAAM,aAAa,YAAA,CAAa,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA,CAAE,MAAA;AACzD,EAAA,MAAM,2BACJ,YAAA,CAAa,MAAA,GAAS,IAAK,UAAA,GAAa,YAAA,CAAa,SAAU,GAAA,GAAM,CAAA;AAEvE,EAAA,IAAI,2BAA2B,IAAA,CAAK,KAAA;AAAA,IAClC,6BAAA,GAAgC,MAAM,wBAAA,GAA2B;AAAA,GACnE;AAEA,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,iBAAA,GAAoB,KAAA;AACpB,IAAA,wBAAA,GAA2B,CAAA;AAC3B,IAAA,MAAA,GAAS,SAAA;AAAA,EACX,CAAA,MAAO;AACL,IAAA,iBAAA,GAAoB,IAAA;AACpB,IAAA,MAAA,GAAS,mCAAA;AAAA,MACP,qBAAA,EAAuB,WAAW,sBAAA,CAAuB,OAAA;AAAA,MACzD;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,sBAAsB,wBAAA,KAA6B,GAAA;AAEzD,EAAA,MAAM,mBAAA,GAAsB,IAAA;AAAA,IAC1B,MAAA,CAAO,GAAA;AAAA,IACP,CAAC,YAAA,IAAgB,MAAA,CAAO,CAAA,sBAAA,EAAyB,MAAM,CAAA,CAAE,CAAA;AAAA,IACzD;AAAA,MACE,CAAC,MAAA,CAAO,OAAiB,GAAG,SAAA;AAAA,MAC5B,CAAC,MAAA,CAAO,OAAiB,GAAG,CAAC;AAAA;AAC/B,GACF;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAa,IAAA;AAAA,MACb,gBAAA,EAAe,YAAA;AAAA,MACf,yBAAA,EAAyB,iBAAA;AAAA,MACzB,wBAAA,EAAwB,MAAA;AAAA,MACxB,4BAAA,EAA4B,wBAAA;AAAA,MAC5B,SAAA,EAAW,IAAA,CAAK,MAAA,CAAO,mBAAA,EAAqB;AAAA,QAC1C,CAAC,MAAA,CAAO,IAAc,GAAG,CAAC;AAAA,OAC3B,CAAA;AAAA,MAED,QAAA,kBAAA,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO;AAAA,YACL,KAAA,EAAO,GAAG,wBAAwB,CAAA,CAAA;AAAA,WACpC;AAAA,UACA,SAAA,EAAW;AAAA;AAAA;AACb;AAAA,GACF;AAEJ;;;;"}
@@ -1,10 +1,10 @@
1
1
  "use client"
2
2
  /* */
3
- import '../../../integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.mjs';
4
3
  import '@mittwald/password-tools-js/policy';
5
- import 'react';
6
4
  import { RuleType } from '@mittwald/password-tools-js/rules';
7
5
  import '@mittwald/password-tools-js/generator';
6
+ import '../../../integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.mjs';
7
+ import 'react';
8
8
 
9
9
  const generateTranslationString = (rule, shortVersion = false) => {
10
10
  if (rule.translationKey) {
@@ -1,21 +1,21 @@
1
1
  "use client"
2
2
  /* */
3
- import '../../../integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.mjs';
4
3
  import '@mittwald/password-tools-js/policy';
5
- import 'react';
6
4
  import '@mittwald/password-tools-js/rules';
7
5
  import '@mittwald/password-tools-js/generator';
6
+ import '../../../integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.mjs';
7
+ import 'react';
8
8
 
9
9
  const getStateFromLatestPolicyValidationResult = (isEmptyValue, result) => {
10
+ if (result.isValid === "indeterminate") {
11
+ return void 0;
12
+ }
10
13
  if (result.ruleResults.length >= 1) {
11
14
  const failingRule = result.ruleResults.find((r) => !r.isValid);
12
15
  if (failingRule) {
13
16
  return failingRule;
14
17
  }
15
18
  }
16
- if (result.isValid === "indeterminate") {
17
- return void 0;
18
- }
19
19
  if (!isEmptyValue) {
20
20
  if (result.complexity.actual < result.complexity.min) {
21
21
  return {
@@ -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\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":";;;;;;AAQO,MAAM,wCAAA,GAA2C,CACtD,YAAA,EACA,MAAA,KAC0C;AAC1C,EAAA,IAAI,MAAA,CAAO,WAAA,CAAY,MAAA,IAAU,CAAA,EAAG;AAClC,IAAA,MAAM,WAAA,GAAc,OAAO,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,KAAM,CAAC,EAAE,OAAO,CAAA;AAC7D,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAO,WAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,YAAY,eAAA,EAAiB;AACtC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,IAAI,MAAA,CAAO,UAAA,CAAW,MAAA,GAAS,MAAA,CAAO,WAAW,GAAA,EAAK;AACpD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,UAAA,CAAW,MAAA,KAAW,MAAA,CAAO,WAAW,GAAA,EAAK;AACtD,MAAA,OAAO;AAAA,QACL,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,UAAA,EAAY;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.isValid === \"indeterminate\") {\n return undefined;\n }\n\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 (!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":";;;;;;AAQO,MAAM,wCAAA,GAA2C,CACtD,YAAA,EACA,MAAA,KAC0C;AAC1C,EAAA,IAAI,MAAA,CAAO,YAAY,eAAA,EAAiB;AACtC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,MAAA,CAAO,WAAA,CAAY,MAAA,IAAU,CAAA,EAAG;AAClC,IAAA,MAAM,WAAA,GAAc,OAAO,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,KAAM,CAAC,EAAE,OAAO,CAAA;AAC7D,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAO,WAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,IAAI,MAAA,CAAO,UAAA,CAAW,MAAA,GAAS,MAAA,CAAO,WAAW,GAAA,EAAK;AACpD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,UAAA,CAAW,MAAA,KAAW,MAAA,CAAO,WAAW,GAAA,EAAK;AACtD,MAAA,OAAO;AAAA,QACL,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,UAAA,EAAY;AAAA,GACd;AACF;;;;"}
@@ -1,56 +1,39 @@
1
1
  "use client"
2
2
  /* */
3
3
  import { useRef, useEffect, startTransition } from 'react';
4
- import { isPromise } from 'remeda';
4
+ import { useDebouncedCallback } from 'use-debounce';
5
5
 
6
6
  const usePolicyValidationResult = (validationPolicy, password, onValidationStart, onValidationResult) => {
7
7
  const cache = useRef(null);
8
- useEffect(() => {
8
+ const validatePassword = (pwd) => {
9
9
  onValidationStart?.();
10
- if (cache.current?.password === password) {
11
- onValidationResult?.({
12
- password: cache.current.password,
13
- isValid: Boolean(cache.current.results.isValid),
14
- results: cache.current.results
15
- });
16
- return;
17
- }
18
- validationPolicy.validate(password).then((validationResult) => {
19
- const setValidationResult = (password2, policyValidationResult) => {
20
- const results = policyValidationResult;
21
- const isValid = Boolean(policyValidationResult.isValid);
22
- cache.current = { password: password2, results };
10
+ startTransition(async () => {
11
+ if (cache.current?.password === pwd) {
23
12
  onValidationResult?.({
24
- password: password2,
25
- isValid,
26
- results: policyValidationResult
13
+ password: cache.current.password,
14
+ isValid: Boolean(cache.current.results.isValid),
15
+ results: cache.current.results
27
16
  });
28
- };
29
- startTransition(async () => {
30
- if (!isPromise(validationResult.isValid)) {
31
- return setValidationResult(password, validationResult);
32
- }
33
- void Promise.all([
34
- Promise.resolve(password),
35
- Promise.resolve(validationResult),
36
- ...validationResult.ruleResults
37
- ]).then(
38
- ([
39
- resolvedValue,
40
- resolvedValidationResult,
41
- ...resolvedValidationRuleResults
42
- ]) => {
43
- startTransition(() => {
44
- setValidationResult(resolvedValue, {
45
- complexity: resolvedValidationResult.complexity,
46
- ruleResults: resolvedValidationRuleResults,
47
- isValid: resolvedValidationResult.isValid && resolvedValidationRuleResults.every((r) => r.isValid)
48
- });
49
- });
50
- }
51
- );
17
+ return;
18
+ }
19
+ const validationResult = await validationPolicy.validate(pwd);
20
+ cache.current = { password: pwd, results: validationResult };
21
+ onValidationResult?.({
22
+ password: pwd,
23
+ isValid: validationResult.isValid,
24
+ results: validationResult
52
25
  });
53
26
  });
27
+ };
28
+ const validatePasswordDebounce = useDebouncedCallback(validatePassword, 350, {
29
+ trailing: true
30
+ });
31
+ useEffect(() => {
32
+ if (password) {
33
+ validatePasswordDebounce(password);
34
+ } else {
35
+ validatePassword(password);
36
+ }
54
37
  }, [password, validationPolicy]);
55
38
  };
56
39
 
@@ -1 +1 @@
1
- {"version":3,"file":"usePolicyValidationResult.mjs","sources":["../../../../../../../../src/components/PasswordCreationField/lib/usePolicyValidationResult.ts"],"sourcesContent":["import { startTransition, useEffect, useRef } from \"react\";\nimport type {\n Policy,\n PolicyValidationResult,\n} from \"@/integrations/@mittwald/password-tools-js\";\nimport { isPromise } from \"remeda\";\nimport type { ResolvedPolicyValidationResult } from \"@/components/PasswordCreationField/PasswordCreationField\";\n\nexport const usePolicyValidationResult = (\n validationPolicy: Policy,\n password: string,\n onValidationStart?: () => void,\n onValidationResult?: (data: {\n password: string;\n isValid: boolean;\n results: ResolvedPolicyValidationResult;\n }) => void,\n) => {\n const cache = useRef<{\n password: string;\n results: ResolvedPolicyValidationResult;\n } | null>(null);\n\n useEffect(() => {\n onValidationStart?.();\n\n if (cache.current?.password === password) {\n onValidationResult?.({\n password: cache.current.password,\n isValid: Boolean(cache.current.results.isValid),\n results: cache.current.results,\n });\n return;\n }\n\n validationPolicy.validate(password).then((validationResult) => {\n const setValidationResult = (\n password: string,\n policyValidationResult: PolicyValidationResult,\n ) => {\n const results =\n policyValidationResult as ResolvedPolicyValidationResult;\n const isValid = Boolean(policyValidationResult.isValid);\n\n cache.current = { password, results };\n onValidationResult?.({\n password,\n isValid,\n results: policyValidationResult as ResolvedPolicyValidationResult,\n });\n };\n\n startTransition(async () => {\n if (!isPromise(validationResult.isValid)) {\n return setValidationResult(password, validationResult);\n }\n\n void Promise.all([\n Promise.resolve(password),\n Promise.resolve(validationResult),\n ...validationResult.ruleResults,\n ]).then(\n ([\n resolvedValue,\n resolvedValidationResult,\n ...resolvedValidationRuleResults\n ]) => {\n startTransition(() => {\n setValidationResult(resolvedValue, {\n complexity: resolvedValidationResult.complexity,\n ruleResults: resolvedValidationRuleResults,\n isValid:\n resolvedValidationResult.isValid &&\n resolvedValidationRuleResults.every((r) => r.isValid),\n });\n });\n },\n );\n });\n });\n }, [password, validationPolicy]);\n};\n"],"names":["password"],"mappings":";;;AAQO,MAAM,yBAAA,GAA4B,CACvC,gBAAA,EACA,QAAA,EACA,mBACA,kBAAA,KAKG;AACH,EAAA,MAAM,KAAA,GAAQ,OAGJ,IAAI,CAAA;AAEd,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,iBAAA,IAAoB;AAEpB,IAAA,IAAI,KAAA,CAAM,OAAA,EAAS,QAAA,KAAa,QAAA,EAAU;AACxC,MAAA,kBAAA,GAAqB;AAAA,QACnB,QAAA,EAAU,MAAM,OAAA,CAAQ,QAAA;AAAA,QACxB,OAAA,EAAS,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,QAAQ,OAAO,CAAA;AAAA,QAC9C,OAAA,EAAS,MAAM,OAAA,CAAQ;AAAA,OACxB,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,gBAAA,CAAiB,QAAA,CAAS,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,gBAAA,KAAqB;AAC7D,MAAA,MAAM,mBAAA,GAAsB,CAC1BA,SAAAA,EACA,sBAAA,KACG;AACH,QAAA,MAAM,OAAA,GACJ,sBAAA;AACF,QAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,sBAAA,CAAuB,OAAO,CAAA;AAEtD,QAAA,KAAA,CAAM,OAAA,GAAU,EAAE,QAAA,EAAAA,SAAAA,EAAU,OAAA,EAAQ;AACpC,QAAA,kBAAA,GAAqB;AAAA,UACnB,QAAA,EAAAA,SAAAA;AAAA,UACA,OAAA;AAAA,UACA,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH,CAAA;AAEA,MAAA,eAAA,CAAgB,YAAY;AAC1B,QAAA,IAAI,CAAC,SAAA,CAAU,gBAAA,CAAiB,OAAO,CAAA,EAAG;AACxC,UAAA,OAAO,mBAAA,CAAoB,UAAU,gBAAgB,CAAA;AAAA,QACvD;AAEA,QAAA,KAAK,QAAQ,GAAA,CAAI;AAAA,UACf,OAAA,CAAQ,QAAQ,QAAQ,CAAA;AAAA,UACxB,OAAA,CAAQ,QAAQ,gBAAgB,CAAA;AAAA,UAChC,GAAG,gBAAA,CAAiB;AAAA,SACrB,CAAA,CAAE,IAAA;AAAA,UACD,CAAC;AAAA,YACC,aAAA;AAAA,YACA,wBAAA;AAAA,YACG,GAAA;AAAA,WACL,KAAM;AACJ,YAAA,eAAA,CAAgB,MAAM;AACpB,cAAA,mBAAA,CAAoB,aAAA,EAAe;AAAA,gBACjC,YAAY,wBAAA,CAAyB,UAAA;AAAA,gBACrC,WAAA,EAAa,6BAAA;AAAA,gBACb,OAAA,EACE,yBAAyB,OAAA,IACzB,6BAAA,CAA8B,MAAM,CAAC,CAAA,KAAM,EAAE,OAAO;AAAA,eACvD,CAAA;AAAA,YACH,CAAC,CAAA;AAAA,UACH;AAAA,SACF;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,QAAA,EAAU,gBAAgB,CAAC,CAAA;AACjC;;;;"}
1
+ {"version":3,"file":"usePolicyValidationResult.mjs","sources":["../../../../../../../../src/components/PasswordCreationField/lib/usePolicyValidationResult.ts"],"sourcesContent":["import { startTransition, useEffect, useRef } from \"react\";\nimport type { Policy } from \"@/integrations/@mittwald/password-tools-js\";\nimport type { ResolvedPolicyValidationResult } from \"@/components/PasswordCreationField/PasswordCreationField\";\nimport { useDebouncedCallback } from \"use-debounce\";\n\nexport const usePolicyValidationResult = (\n validationPolicy: Policy,\n password: string,\n onValidationStart?: () => void,\n onValidationResult?: (data: {\n password: string;\n isValid: boolean;\n results: ResolvedPolicyValidationResult;\n }) => void,\n) => {\n const cache = useRef<{\n password: string;\n results: ResolvedPolicyValidationResult;\n } | null>(null);\n\n const validatePassword = (pwd: string) => {\n onValidationStart?.();\n\n startTransition(async () => {\n if (cache.current?.password === pwd) {\n onValidationResult?.({\n password: cache.current.password,\n isValid: Boolean(cache.current.results.isValid),\n results: cache.current.results,\n });\n return;\n }\n\n const validationResult = await validationPolicy.validate(pwd);\n cache.current = { password: pwd, results: validationResult };\n onValidationResult?.({\n password: pwd,\n isValid: validationResult.isValid,\n results: validationResult,\n });\n });\n };\n\n const validatePasswordDebounce = useDebouncedCallback(validatePassword, 350, {\n trailing: true,\n });\n\n useEffect(() => {\n if (password) {\n validatePasswordDebounce(password);\n } else {\n validatePassword(password);\n }\n }, [password, validationPolicy]);\n};\n"],"names":[],"mappings":";;;AAKO,MAAM,yBAAA,GAA4B,CACvC,gBAAA,EACA,QAAA,EACA,mBACA,kBAAA,KAKG;AACH,EAAA,MAAM,KAAA,GAAQ,OAGJ,IAAI,CAAA;AAEd,EAAA,MAAM,gBAAA,GAAmB,CAAC,GAAA,KAAgB;AACxC,IAAA,iBAAA,IAAoB;AAEpB,IAAA,eAAA,CAAgB,YAAY;AAC1B,MAAA,IAAI,KAAA,CAAM,OAAA,EAAS,QAAA,KAAa,GAAA,EAAK;AACnC,QAAA,kBAAA,GAAqB;AAAA,UACnB,QAAA,EAAU,MAAM,OAAA,CAAQ,QAAA;AAAA,UACxB,OAAA,EAAS,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,QAAQ,OAAO,CAAA;AAAA,UAC9C,OAAA,EAAS,MAAM,OAAA,CAAQ;AAAA,SACxB,CAAA;AACD,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,gBAAA,GAAmB,MAAM,gBAAA,CAAiB,QAAA,CAAS,GAAG,CAAA;AAC5D,MAAA,KAAA,CAAM,OAAA,GAAU,EAAE,QAAA,EAAU,GAAA,EAAK,SAAS,gBAAA,EAAiB;AAC3D,MAAA,kBAAA,GAAqB;AAAA,QACnB,QAAA,EAAU,GAAA;AAAA,QACV,SAAS,gBAAA,CAAiB,OAAA;AAAA,QAC1B,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,wBAAA,GAA2B,oBAAA,CAAqB,gBAAA,EAAkB,GAAA,EAAK;AAAA,IAC3E,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,wBAAA,CAAyB,QAAQ,CAAA;AAAA,IACnC,CAAA,MAAO;AACL,MAAA,gBAAA,CAAiB,QAAQ,CAAA;AAAA,IAC3B;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,gBAAgB,CAAC,CAAA;AACjC;;;;"}
@@ -1,10 +1,10 @@
1
1
  "use client"
2
2
  /* */
3
- import '../../../integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.mjs';
4
3
  import '@mittwald/password-tools-js/policy';
5
- import 'react';
6
4
  import '@mittwald/password-tools-js/rules';
7
5
  import { Generator } from '@mittwald/password-tools-js/generator';
6
+ import '../../../integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.mjs';
7
+ import 'react';
8
8
 
9
9
  const generatePassword = async (validationPolicy) => {
10
10
  return new Generator(validationPolicy).generatePassword();
@@ -1,6 +1,9 @@
1
1
  "use client"
2
2
  /* */
3
+ import '@mittwald/password-tools-js/policy';
3
4
  import { RuleType } from '@mittwald/password-tools-js/rules';
5
+ import '@mittwald/password-tools-js/generator';
6
+ import 'react';
4
7
 
5
8
  const defaultPasswordCreationPolicy = {
6
9
  minComplexity: 3,
@@ -1 +1 @@
1
- {"version":3,"file":"defaultPasswordCreationPolicy.mjs","sources":["../../../../../../../../src/integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.ts"],"sourcesContent":["import type { PolicyDeclaration } from \"@mittwald/password-tools-js/policy\";\nimport { RuleType } from \"@mittwald/password-tools-js/rules\";\n\nexport const defaultPasswordCreationPolicy: PolicyDeclaration = {\n minComplexity: 3,\n rules: [\n {\n ruleType: RuleType.length,\n min: 12,\n },\n {\n identifier: \"special\",\n ruleType: RuleType.charPool,\n charPools: [\"special\"],\n },\n {\n identifier: \"numbers\",\n ruleType: RuleType.charPool,\n charPools: [\"numbers\"],\n },\n ],\n};\n"],"names":[],"mappings":";;AAGO,MAAM,6BAAA,GAAmD;AAAA,EAC9D,aAAA,EAAe,CAAA;AAAA,EACf,KAAA,EAAO;AAAA,IACL;AAAA,MACE,UAAU,QAAA,CAAS,MAAA;AAAA,MACnB,GAAA,EAAK;AAAA,KACP;AAAA,IACA;AAAA,MACE,UAAA,EAAY,SAAA;AAAA,MACZ,UAAU,QAAA,CAAS,QAAA;AAAA,MACnB,SAAA,EAAW,CAAC,SAAS;AAAA,KACvB;AAAA,IACA;AAAA,MACE,UAAA,EAAY,SAAA;AAAA,MACZ,UAAU,QAAA,CAAS,QAAA;AAAA,MACnB,SAAA,EAAW,CAAC,SAAS;AAAA;AACvB;AAEJ;;;;"}
1
+ {"version":3,"file":"defaultPasswordCreationPolicy.mjs","sources":["../../../../../../../../src/integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.ts"],"sourcesContent":["import type { PolicyDeclaration } from \".\";\nimport { RuleType } from \".\";\n\nexport const defaultPasswordCreationPolicy: PolicyDeclaration = {\n minComplexity: 3,\n rules: [\n {\n ruleType: RuleType.length,\n min: 12,\n },\n {\n identifier: \"special\",\n ruleType: RuleType.charPool,\n charPools: [\"special\"],\n },\n {\n identifier: \"numbers\",\n ruleType: RuleType.charPool,\n charPools: [\"numbers\"],\n },\n ],\n};\n"],"names":[],"mappings":";;;;;AAGO,MAAM,6BAAA,GAAmD;AAAA,EAC9D,aAAA,EAAe,CAAA;AAAA,EACf,KAAA,EAAO;AAAA,IACL;AAAA,MACE,UAAU,QAAA,CAAS,MAAA;AAAA,MACnB,GAAA,EAAK;AAAA,KACP;AAAA,IACA;AAAA,MACE,UAAA,EAAY,SAAA;AAAA,MACZ,UAAU,QAAA,CAAS,QAAA;AAAA,MACnB,SAAA,EAAW,CAAC,SAAS;AAAA,KACvB;AAAA,IACA;AAAA,MACE,UAAA,EAAY,SAAA;AAAA,MACZ,UAAU,QAAA,CAAS,QAAA;AAAA,MACnB,SAAA,EAAW,CAAC,SAAS;AAAA;AACvB;AAEJ;;;;"}
@@ -1,10 +1,10 @@
1
1
  "use client"
2
2
  /* */
3
3
  import { Policy } from '@mittwald/password-tools-js/policy';
4
- import { defaultPasswordCreationPolicy } from './defaultPasswordCreationPolicy.mjs';
5
- import { useMemo, useRef } from 'react';
6
4
  import '@mittwald/password-tools-js/rules';
7
5
  import '@mittwald/password-tools-js/generator';
6
+ import { defaultPasswordCreationPolicy } from './defaultPasswordCreationPolicy.mjs';
7
+ import { useMemo, useRef } from 'react';
8
8
 
9
9
  const usePasswordCreationFieldValidation = (genericValidationPolicy = defaultPasswordCreationPolicy) => {
10
10
  const validationPolicy = useMemo(
@@ -21,7 +21,7 @@ const usePasswordCreationFieldValidation = (genericValidationPolicy = defaultPas
21
21
  }
22
22
  try {
23
23
  const validationResult = await validationPolicy.validate(value);
24
- const isValid = await validationResult.isValid;
24
+ const isValid = validationResult.isValid;
25
25
  cache.current = {
26
26
  password: value,
27
27
  isValid
@@ -1 +1 @@
1
- {"version":3,"file":"usePasswordCreationFieldValidation.mjs","sources":["../../../../../../../../src/integrations/@mittwald/password-tools-js/usePasswordCreationFieldValidation.ts"],"sourcesContent":["import type { PolicyGenericDeclaration } from \"@mittwald/password-tools-js/policy\";\nimport { Policy } from \"@mittwald/password-tools-js/policy\";\nimport { defaultPasswordCreationPolicy } from \".\";\nimport { useMemo, useRef } from \"react\";\nimport type { Validate } from \"react-hook-form\";\n\nexport const usePasswordCreationFieldValidation = (\n genericValidationPolicy: PolicyGenericDeclaration = defaultPasswordCreationPolicy,\n): Validate<string, unknown> => {\n const validationPolicy = useMemo(\n () => Policy.fromDeclaration(genericValidationPolicy),\n [genericValidationPolicy],\n );\n\n const cache = useRef<{\n password: string;\n isValid: boolean;\n } | null>(null);\n\n return async (value) => {\n if (value === \"\") {\n return;\n }\n\n if (cache.current?.password === value) {\n return cache.current.isValid;\n }\n\n try {\n const validationResult = await validationPolicy.validate(value);\n const isValid = await validationResult.isValid;\n\n cache.current = {\n password: value,\n isValid,\n };\n return isValid;\n } catch (ignoredError) {\n return false;\n }\n };\n};\n\n/** @deprecated Use `usePasswordCreationFieldValidation` instead. */\nexport const generatePasswordCreationFieldValidation =\n usePasswordCreationFieldValidation;\n"],"names":[],"mappings":";;;;;;AAMO,MAAM,kCAAA,GAAqC,CAChD,uBAAA,GAAoD,6BAAA,KACtB;AAC9B,EAAA,MAAM,gBAAA,GAAmB,OAAA;AAAA,IACvB,MAAM,MAAA,CAAO,eAAA,CAAgB,uBAAuB,CAAA;AAAA,IACpD,CAAC,uBAAuB;AAAA,GAC1B;AAEA,EAAA,MAAM,KAAA,GAAQ,OAGJ,IAAI,CAAA;AAEd,EAAA,OAAO,OAAO,KAAA,KAAU;AACtB,IAAA,IAAI,UAAU,EAAA,EAAI;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,OAAA,EAAS,QAAA,KAAa,KAAA,EAAO;AACrC,MAAA,OAAO,MAAM,OAAA,CAAQ,OAAA;AAAA,IACvB;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,gBAAA,GAAmB,MAAM,gBAAA,CAAiB,QAAA,CAAS,KAAK,CAAA;AAC9D,MAAA,MAAM,OAAA,GAAU,MAAM,gBAAA,CAAiB,OAAA;AAEvC,MAAA,KAAA,CAAM,OAAA,GAAU;AAAA,QACd,QAAA,EAAU,KAAA;AAAA,QACV;AAAA,OACF;AACA,MAAA,OAAO,OAAA;AAAA,IACT,SAAS,YAAA,EAAc;AACrB,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA;AACF;AAGO,MAAM,uCAAA,GACX;;;;"}
1
+ {"version":3,"file":"usePasswordCreationFieldValidation.mjs","sources":["../../../../../../../../src/integrations/@mittwald/password-tools-js/usePasswordCreationFieldValidation.ts"],"sourcesContent":["import type { PolicyGenericDeclaration } from \".\";\nimport { defaultPasswordCreationPolicy, Policy } from \".\";\nimport { useMemo, useRef } from \"react\";\nimport type { Validate } from \"react-hook-form\";\n\nexport const usePasswordCreationFieldValidation = (\n genericValidationPolicy: PolicyGenericDeclaration = defaultPasswordCreationPolicy,\n): Validate<string, unknown> => {\n const validationPolicy = useMemo(\n () => Policy.fromDeclaration(genericValidationPolicy),\n [genericValidationPolicy],\n );\n\n const cache = useRef<{\n password: string;\n isValid: boolean;\n } | null>(null);\n\n return async (value) => {\n if (value === \"\") {\n return;\n }\n\n if (cache.current?.password === value) {\n return cache.current.isValid;\n }\n\n try {\n const validationResult = await validationPolicy.validate(value);\n const isValid = validationResult.isValid;\n\n cache.current = {\n password: value,\n isValid,\n };\n return isValid;\n } catch (ignoredError) {\n return false;\n }\n };\n};\n\n/** @deprecated Use `usePasswordCreationFieldValidation` instead. */\nexport const generatePasswordCreationFieldValidation =\n usePasswordCreationFieldValidation;\n"],"names":[],"mappings":";;;;;;AAKO,MAAM,kCAAA,GAAqC,CAChD,uBAAA,GAAoD,6BAAA,KACtB;AAC9B,EAAA,MAAM,gBAAA,GAAmB,OAAA;AAAA,IACvB,MAAM,MAAA,CAAO,eAAA,CAAgB,uBAAuB,CAAA;AAAA,IACpD,CAAC,uBAAuB;AAAA,GAC1B;AAEA,EAAA,MAAM,KAAA,GAAQ,OAGJ,IAAI,CAAA;AAEd,EAAA,OAAO,OAAO,KAAA,KAAU;AACtB,IAAA,IAAI,UAAU,EAAA,EAAI;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,OAAA,EAAS,QAAA,KAAa,KAAA,EAAO;AACrC,MAAA,OAAO,MAAM,OAAA,CAAQ,OAAA;AAAA,IACvB;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,gBAAA,GAAmB,MAAM,gBAAA,CAAiB,QAAA,CAAS,KAAK,CAAA;AAC9D,MAAA,MAAM,UAAU,gBAAA,CAAiB,OAAA;AAEjC,MAAA,KAAA,CAAM,OAAA,GAAU;AAAA,QACd,QAAA,EAAU,KAAA;AAAA,QACV;AAAA,OACF;AACA,MAAA,OAAO,OAAA;AAAA,IACT,SAAS,YAAA,EAAc;AACrB,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA;AACF;AAGO,MAAM,uCAAA,GACX;;;;"}