@aws-amplify/ui-react 6.1.13 → 6.2.0

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 (52) hide show
  1. package/dist/{Field-1f747369.js → Field-d47a49dc.js} +12 -23
  2. package/dist/ThemeStyle-b2dce96a.js +91 -0
  3. package/dist/esm/components/Authenticator/ConfirmSignUp/ConfirmSignUp.mjs +2 -2
  4. package/dist/esm/components/Authenticator/FederatedSignIn/FederatedSignInButtons/FederatedSignInButton.mjs +1 -1
  5. package/dist/esm/components/Authenticator/ForceNewPassword/ForceNewPassword.mjs +2 -2
  6. package/dist/esm/components/Authenticator/SignIn/SignIn.mjs +3 -3
  7. package/dist/esm/components/Authenticator/SignUp/SignUp.mjs +2 -2
  8. package/dist/esm/components/Authenticator/VerifyUser/VerifyUser.mjs +2 -2
  9. package/dist/esm/components/Authenticator/shared/ConfirmSignInFooter.mjs +2 -2
  10. package/dist/esm/components/Authenticator/shared/TwoButtonSubmitFooter.mjs +3 -2
  11. package/dist/esm/components/ThemeProvider/ThemeProvider.mjs +3 -5
  12. package/dist/esm/components/ThemeProvider/ThemeStyle.mjs +69 -0
  13. package/dist/esm/helpers/constants.mjs +9 -0
  14. package/dist/esm/primitives/Checkbox/Checkbox.mjs +4 -4
  15. package/dist/esm/primitives/CheckboxField/CheckboxField.mjs +2 -2
  16. package/dist/esm/primitives/HighlightMatch/HighlightMatch.mjs +2 -2
  17. package/dist/esm/primitives/RadioGroupField/RadioGroupField.mjs +13 -5
  18. package/dist/esm/primitives/SelectField/SelectField.mjs +12 -3
  19. package/dist/esm/primitives/SliderField/SliderField.mjs +14 -6
  20. package/dist/esm/primitives/StepperField/StepperField.mjs +12 -3
  21. package/dist/esm/primitives/Tabs/TabsContainer.mjs +4 -1
  22. package/dist/esm/primitives/Tabs/TabsContext.mjs +1 -0
  23. package/dist/esm/primitives/Tabs/TabsItem.mjs +7 -2
  24. package/dist/esm/primitives/Tabs/TabsPanel.mjs +7 -2
  25. package/dist/esm/primitives/Tabs/constants.mjs +4 -0
  26. package/dist/esm/primitives/TextAreaField/TextAreaField.mjs +12 -3
  27. package/dist/esm/primitives/TextField/TextField.mjs +12 -3
  28. package/dist/esm/primitives/utils/createSpaceSeparatedIds.mjs +13 -0
  29. package/dist/esm/primitives/utils/getUniqueComponentId.mjs +3 -0
  30. package/dist/esm/server.mjs +2 -0
  31. package/dist/esm/version.mjs +1 -1
  32. package/dist/index.js +197 -130
  33. package/dist/internal.js +2 -1
  34. package/dist/primitiveWithForwardRef-7e929242.js +36 -0
  35. package/dist/server.js +32 -0
  36. package/dist/types/components/ThemeProvider/ThemeStyle.d.ts +18 -0
  37. package/dist/types/helpers/constants.d.ts +2 -0
  38. package/dist/types/primitives/Tabs/TabsContext.d.ts +1 -0
  39. package/dist/types/primitives/Tabs/constants.d.ts +1 -0
  40. package/dist/types/primitives/shared/responsive/utils.d.ts +1 -1
  41. package/dist/types/primitives/utils/createSpaceSeparatedIds.d.ts +8 -0
  42. package/dist/types/primitives/utils/getUniqueComponentId.d.ts +1 -0
  43. package/dist/types/server.d.ts +2 -0
  44. package/dist/types/version.d.ts +1 -1
  45. package/package.json +10 -5
  46. package/dist/esm/primitives/utils/getTestId.mjs +0 -3
  47. package/dist/types/context/elements/ElementsContext.d.ts +0 -58
  48. package/dist/types/context/elements/defineBaseElement.d.ts +0 -26
  49. package/dist/types/context/elements/index.d.ts +0 -3
  50. package/dist/types/context/elements/types.d.ts +0 -31
  51. package/dist/types/context/elements/withBaseElementProps.d.ts +0 -32
  52. package/dist/types/primitives/utils/getTestId.d.ts +0 -1
@@ -21,6 +21,9 @@ import { ComponentText } from '../shared/constants.mjs';
21
21
  import { splitPrimitiveProps } from '../utils/splitPrimitiveProps.mjs';
22
22
  import { useStableId } from '../utils/useStableId.mjs';
23
23
  import { primitiveWithForwardRef } from '../utils/primitiveWithForwardRef.mjs';
24
+ import { createSpaceSeparatedIds } from '../utils/createSpaceSeparatedIds.mjs';
25
+ import { DESCRIPTION_SUFFIX, ERROR_SUFFIX } from '../../helpers/constants.mjs';
26
+ import { getUniqueComponentId } from '../utils/getUniqueComponentId.mjs';
24
27
 
25
28
  const DECREASE_ICON = 'decrease-icon';
26
29
  const INCREASE_ICON = 'increase-icon';
@@ -33,8 +36,14 @@ const StepperFieldPrimitive = (props, ref) => {
33
36
  // this is only required in useStepper hook but deconstruct here to remove its existence in rest
34
37
  value: controlledValue, variation, ..._rest } = props;
35
38
  const fieldId = useStableId(id);
36
- const descriptionId = useStableId();
37
- const ariaDescribedBy = descriptiveText ? descriptionId : undefined;
39
+ const stableId = useStableId();
40
+ const descriptionId = descriptiveText
41
+ ? getUniqueComponentId(stableId, DESCRIPTION_SUFFIX)
42
+ : undefined;
43
+ const errorId = hasError
44
+ ? getUniqueComponentId(stableId, ERROR_SUFFIX)
45
+ : undefined;
46
+ const ariaDescribedBy = createSpaceSeparatedIds([errorId, descriptionId]);
38
47
  const { styleProps, rest } = splitPrimitiveProps(_rest);
39
48
  const icons = useIcons('stepperField');
40
49
  const { step, value, inputValue, handleDecrease, handleIncrease, handleOnBlur, handleOnChange, handleOnWheel, setInputValue, shouldDisableDecreaseButton, shouldDisableIncreaseButton, } = useStepper({ ...props, defaultValue, onStepChange });
@@ -49,7 +58,7 @@ const StepperFieldPrimitive = (props, ref) => {
49
58
  React.createElement(FieldDescription, { id: descriptionId, labelHidden: labelHidden, descriptiveText: descriptiveText }),
50
59
  React.createElement(FieldGroup, { outerStartComponent: React.createElement(FieldGroupIconButton, { "aria-controls": fieldId, ariaLabel: `${decreaseButtonLabel} ${value - step}`, className: classNames(ComponentClassName.StepperFieldButtonDecrease, classNameModifier(ComponentClassName.StepperFieldButtonDecrease, variation), classNameModifierByFlag(ComponentClassName.StepperFieldButtonDecrease, 'disabled', shouldDisableDecreaseButton)), "data-invalid": hasError, isDisabled: shouldDisableDecreaseButton, onClick: handleDecrease, size: size }, icons?.remove ?? React.createElement(IconRemove, { "data-testid": DECREASE_ICON })), outerEndComponent: React.createElement(FieldGroupIconButton, { "aria-controls": fieldId, ariaLabel: `${increaseButtonLabel} ${value + step}`, className: classNames(ComponentClassName.StepperFieldButtonIncrease, classNameModifier(ComponentClassName.StepperFieldButtonIncrease, variation), classNameModifierByFlag(ComponentClassName.StepperFieldButtonIncrease, 'disabled', shouldDisableIncreaseButton)), "data-invalid": hasError, isDisabled: shouldDisableIncreaseButton, onClick: handleIncrease, size: size }, icons?.add ?? React.createElement(IconAdd, { "data-testid": INCREASE_ICON })) },
51
60
  React.createElement(Input, { "aria-describedby": ariaDescribedBy, className: ComponentClassName.StepperFieldInput, hasError: hasError, id: fieldId, isDisabled: isDisabled, isReadOnly: isReadOnly, isRequired: isRequired, onBlur: handleOnBlur, onChange: handleOnChange, onWheel: handleOnWheel, ref: ref, size: size, variation: variation, type: "number", value: inputValue, ...inputStyles, ...rest })),
52
- React.createElement(FieldErrorMessage, { hasError: hasError, errorMessage: errorMessage })));
61
+ React.createElement(FieldErrorMessage, { id: errorId, hasError: hasError, errorMessage: errorMessage })));
53
62
  };
54
63
  /**
55
64
  * [📖 Docs](https://ui.docs.amplify.aws/react/components/stepperfield)
@@ -3,8 +3,10 @@ import { isFunction, classNames, ComponentClassName } from '@aws-amplify/ui';
3
3
  import { primitiveWithForwardRef } from '../utils/primitiveWithForwardRef.mjs';
4
4
  import { View } from '../View/View.mjs';
5
5
  import { TabsContext } from './TabsContext.mjs';
6
+ import { useStableId } from '../utils/useStableId.mjs';
6
7
 
7
8
  const TabsContainerPrimitive = ({ children, defaultValue, className, value: controlledValue, onValueChange, isLazy, ...rest }, ref) => {
9
+ const groupId = useStableId(); // groupId is used to ensure uniqueness between Tab Groups in IDs
8
10
  const isControlled = controlledValue !== undefined;
9
11
  const [localValue, setLocalValue] = React.useState(() => isControlled ? controlledValue : defaultValue);
10
12
  const activeTab = isControlled ? controlledValue : localValue ?? '';
@@ -21,8 +23,9 @@ const TabsContainerPrimitive = ({ children, defaultValue, className, value: cont
21
23
  activeTab,
22
24
  isLazy,
23
25
  setActiveTab,
26
+ groupId,
24
27
  };
25
- }, [activeTab, setActiveTab, isLazy]);
28
+ }, [activeTab, setActiveTab, isLazy, groupId]);
26
29
  return (React.createElement(TabsContext.Provider, { value: _value },
27
30
  React.createElement(View, { ...rest, ref: ref, className: classNames(className, ComponentClassName.Tabs) }, children)));
28
31
  };
@@ -1,6 +1,7 @@
1
1
  import * as React from 'react';
2
2
 
3
3
  const TabsContext = React.createContext({
4
+ groupId: '',
4
5
  activeTab: '',
5
6
  setActiveTab: () => { },
6
7
  });
@@ -3,9 +3,14 @@ import { classNames, ComponentClassName, classNameModifierByFlag, isTypedFunctio
3
3
  import { View } from '../View/View.mjs';
4
4
  import { primitiveWithForwardRef } from '../utils/primitiveWithForwardRef.mjs';
5
5
  import { TabsContext } from './TabsContext.mjs';
6
+ import { WHITESPACE_VALUE } from './constants.mjs';
6
7
 
7
8
  const TabsItemPrimitive = ({ className, value, children, onClick, as = 'button', role = 'tab', ...rest }, ref) => {
8
- const { activeTab, setActiveTab } = React.useContext(TabsContext);
9
+ const { activeTab, setActiveTab, groupId } = React.useContext(TabsContext);
10
+ let idValue = value;
11
+ if (typeof idValue === 'string') {
12
+ idValue = idValue.replace(' ', WHITESPACE_VALUE);
13
+ }
9
14
  const isActive = activeTab === value;
10
15
  const handleOnClick = (e) => {
11
16
  if (isTypedFunction(onClick)) {
@@ -13,7 +18,7 @@ const TabsItemPrimitive = ({ className, value, children, onClick, as = 'button',
13
18
  }
14
19
  setActiveTab(value);
15
20
  };
16
- return (React.createElement(View, { ...rest, role: role, as: as, id: `${value}-tab`, "aria-selected": isActive, "aria-controls": `${value}-panel`, tabIndex: !isActive ? -1 : undefined, className: classNames(ComponentClassName.TabsItem, classNameModifierByFlag(ComponentClassName.TabsItem, 'active', activeTab === value), className), ref: ref, onClick: handleOnClick }, children));
21
+ return (React.createElement(View, { ...rest, role: role, as: as, id: `${groupId}-tab-${idValue}`, "aria-selected": isActive, "aria-controls": `${groupId}-panel-${idValue}`, tabIndex: !isActive ? -1 : undefined, className: classNames(ComponentClassName.TabsItem, classNameModifierByFlag(ComponentClassName.TabsItem, 'active', activeTab === value), className), ref: ref, onClick: handleOnClick }, children));
17
22
  };
18
23
  /**
19
24
  * [📖 Docs](https://ui.docs.amplify.aws/react/components/tabs)
@@ -3,12 +3,17 @@ import { classNames, ComponentClassName, classNameModifierByFlag } from '@aws-am
3
3
  import { View } from '../View/View.mjs';
4
4
  import { primitiveWithForwardRef } from '../utils/primitiveWithForwardRef.mjs';
5
5
  import { TabsContext } from './TabsContext.mjs';
6
+ import { WHITESPACE_VALUE } from './constants.mjs';
6
7
 
7
8
  const TabPanelPrimitive = ({ className, value, children, role = 'tabpanel', ...rest }, ref) => {
8
- const { activeTab, isLazy } = React.useContext(TabsContext);
9
+ const { activeTab, isLazy, groupId } = React.useContext(TabsContext);
9
10
  if (isLazy && activeTab !== value)
10
11
  return null;
11
- return (React.createElement(View, { ...rest, role: role, id: `${value}-panel`, "aria-labelledby": `${value}-tab`, className: classNames(ComponentClassName.TabsPanel, classNameModifierByFlag(ComponentClassName.TabsPanel, 'active', activeTab === value), className), ref: ref }, children));
12
+ let idValue = value;
13
+ if (typeof idValue === 'string') {
14
+ idValue = idValue.replace(' ', WHITESPACE_VALUE);
15
+ }
16
+ return (React.createElement(View, { ...rest, role: role, id: `${groupId}-panel-${idValue}`, "aria-labelledby": `${groupId}-tab-${idValue}`, className: classNames(ComponentClassName.TabsPanel, classNameModifierByFlag(ComponentClassName.TabsPanel, 'active', activeTab === value), className), ref: ref }, children));
12
17
  };
13
18
  /**
14
19
  * [📖 Docs](https://ui.docs.amplify.aws/react/components/tabs)
@@ -0,0 +1,4 @@
1
+ /* WHITESPACE_VALUE is used to fill whitespace present in user-inputed `value` when creating id for TabsItem and TabsPanel */
2
+ const WHITESPACE_VALUE = '-';
3
+
4
+ export { WHITESPACE_VALUE };
@@ -10,6 +10,9 @@ import { splitPrimitiveProps } from '../utils/splitPrimitiveProps.mjs';
10
10
  import { TextArea } from '../TextArea/TextArea.mjs';
11
11
  import { useStableId } from '../utils/useStableId.mjs';
12
12
  import { primitiveWithForwardRef } from '../utils/primitiveWithForwardRef.mjs';
13
+ import { createSpaceSeparatedIds } from '../utils/createSpaceSeparatedIds.mjs';
14
+ import { DESCRIPTION_SUFFIX, ERROR_SUFFIX } from '../../helpers/constants.mjs';
15
+ import { getUniqueComponentId } from '../utils/getUniqueComponentId.mjs';
13
16
 
14
17
  const DEFAULT_ROW_COUNT = 3;
15
18
  const TextAreaFieldPrimitive = (props, ref) => {
@@ -18,14 +21,20 @@ const TextAreaFieldPrimitive = (props, ref) => {
18
21
  // it should go on the textarea element and not the wrapper div.
19
22
  resize, ..._rest } = props;
20
23
  const fieldId = useStableId(id);
21
- const descriptionId = useStableId();
22
- const ariaDescribedBy = descriptiveText ? descriptionId : undefined;
24
+ const stableId = useStableId();
25
+ const descriptionId = descriptiveText
26
+ ? getUniqueComponentId(stableId, DESCRIPTION_SUFFIX)
27
+ : undefined;
28
+ const errorId = hasError
29
+ ? getUniqueComponentId(stableId, ERROR_SUFFIX)
30
+ : undefined;
31
+ const ariaDescribedBy = createSpaceSeparatedIds([errorId, descriptionId]);
23
32
  const { styleProps, rest } = splitPrimitiveProps(_rest);
24
33
  return (React.createElement(Flex, { className: classNames(ComponentClassName.Field, classNameModifier(ComponentClassName.Field, size), ComponentClassName.TextAreaField, className), testId: testId, ...styleProps },
25
34
  React.createElement(Label, { htmlFor: fieldId, visuallyHidden: labelHidden }, label),
26
35
  React.createElement(FieldDescription, { id: descriptionId, labelHidden: labelHidden, descriptiveText: descriptiveText }),
27
36
  React.createElement(TextArea, { "aria-describedby": ariaDescribedBy, hasError: hasError, id: fieldId, ref: ref, rows: rows ?? DEFAULT_ROW_COUNT, size: size, resize: resize, ...rest, ...inputStyles }),
28
- React.createElement(FieldErrorMessage, { hasError: hasError, errorMessage: errorMessage })));
37
+ React.createElement(FieldErrorMessage, { id: errorId, hasError: hasError, errorMessage: errorMessage })));
29
38
  };
30
39
  /**
31
40
  * [📖 Docs](https://ui.docs.amplify.aws/react/components/textareafield)
@@ -11,19 +11,28 @@ import { Label } from '../Label/Label.mjs';
11
11
  import { splitPrimitiveProps } from '../utils/splitPrimitiveProps.mjs';
12
12
  import { useStableId } from '../utils/useStableId.mjs';
13
13
  import { primitiveWithForwardRef } from '../utils/primitiveWithForwardRef.mjs';
14
+ import { createSpaceSeparatedIds } from '../utils/createSpaceSeparatedIds.mjs';
15
+ import { DESCRIPTION_SUFFIX, ERROR_SUFFIX } from '../../helpers/constants.mjs';
16
+ import { getUniqueComponentId } from '../utils/getUniqueComponentId.mjs';
14
17
 
15
18
  const TextFieldPrimitive = (props, ref) => {
16
19
  const { className, descriptiveText, errorMessage, hasError = false, id, innerEndComponent, innerStartComponent, label, labelHidden = false, outerEndComponent, outerStartComponent, size, testId, variation, inputStyles, ..._rest } = props;
17
20
  const fieldId = useStableId(id);
18
- const descriptionId = useStableId();
19
- const ariaDescribedBy = descriptiveText ? descriptionId : undefined;
21
+ const stableId = useStableId();
22
+ const descriptionId = descriptiveText
23
+ ? getUniqueComponentId(stableId, DESCRIPTION_SUFFIX)
24
+ : undefined;
25
+ const errorId = hasError
26
+ ? getUniqueComponentId(stableId, ERROR_SUFFIX)
27
+ : undefined;
28
+ const ariaDescribedBy = createSpaceSeparatedIds([errorId, descriptionId]);
20
29
  const { styleProps, rest } = splitPrimitiveProps(_rest);
21
30
  return (React.createElement(Flex, { className: classNames(ComponentClassName.Field, classNameModifier(ComponentClassName.Field, size), ComponentClassName.TextField, className), testId: testId, ...styleProps },
22
31
  React.createElement(Label, { htmlFor: fieldId, visuallyHidden: labelHidden }, label),
23
32
  React.createElement(FieldDescription, { id: descriptionId, labelHidden: labelHidden, descriptiveText: descriptiveText }),
24
33
  React.createElement(FieldGroup, { outerStartComponent: outerStartComponent, outerEndComponent: outerEndComponent, innerStartComponent: innerStartComponent, innerEndComponent: innerEndComponent, variation: variation },
25
34
  React.createElement(Input, { "aria-describedby": ariaDescribedBy, hasError: hasError, id: fieldId, ref: ref, size: size, variation: variation, ...inputStyles, ...rest })),
26
- React.createElement(FieldErrorMessage, { hasError: hasError, errorMessage: errorMessage })));
35
+ React.createElement(FieldErrorMessage, { id: errorId, hasError: hasError, errorMessage: errorMessage })));
27
36
  };
28
37
  /**
29
38
  * [📖 Docs](https://ui.docs.amplify.aws/react/components/textfield)
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Joins an array of strings and undefined values into a single string with spaces as separators.
3
+ * If all elements are undefined, returns undefined.
4
+ *
5
+ * @param {(string | undefined)[]} ids - An array of strings or undefined values.
6
+ * @returns {string | undefined} A single string with space-separated IDs, or undefined if all elements are undefined.
7
+ */
8
+ const createSpaceSeparatedIds = (ids) => {
9
+ const joinedIds = ids.filter((id) => id !== undefined).join(' ');
10
+ return joinedIds.length > 0 ? joinedIds : undefined;
11
+ };
12
+
13
+ export { createSpaceSeparatedIds };
@@ -0,0 +1,3 @@
1
+ const getUniqueComponentId = (id, suffix) => (id && suffix ? `${id}-${suffix}` : undefined);
2
+
3
+ export { getUniqueComponentId };
@@ -0,0 +1,2 @@
1
+ export { ThemeStyle } from './components/ThemeProvider/ThemeStyle.mjs';
2
+ export { createComponentClasses, createTheme, defaultDarkModeOverride, defaultTheme, defineComponentTheme } from '@aws-amplify/ui';
@@ -1,3 +1,3 @@
1
- const VERSION = '6.1.13';
1
+ const VERSION = '6.2.0';
2
2
 
3
3
  export { VERSION };