@utilitywarehouse/hearth-react-native 0.28.0 → 0.28.1

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 (36) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/.turbo/turbo-lint.log +11 -11
  3. package/CHANGELOG.md +6 -0
  4. package/build/components/Select/Select.d.ts +1 -1
  5. package/build/components/Select/Select.js +4 -4
  6. package/build/components/Select/Select.props.d.ts +4 -0
  7. package/build/components/Select/SelectOption.d.ts +1 -1
  8. package/build/components/Select/SelectOption.js +2 -2
  9. package/build/components/VerificationInput/VerificationInput.js +3 -3
  10. package/docs/all-components.mdx +2 -2
  11. package/docs/changelog.mdx +172 -1
  12. package/docs/components/AllComponents.web.tsx +65 -125
  13. package/docs/components/NextPrevPage.tsx +28 -44
  14. package/docs/components/index.ts +1 -0
  15. package/docs/getting-started.mdx +3 -3
  16. package/docs/hooks.mdx +2 -2
  17. package/docs/introduction.mdx +1 -1
  18. package/docs/layout-components.docs.mdx +11 -2
  19. package/docs/styling.mdx +3 -3
  20. package/package.json +2 -2
  21. package/scripts/copyChangelog.js +8 -1
  22. package/src/components/Banner/Banner.docs.mdx +2 -1
  23. package/src/components/Center/Center.docs.mdx +6 -5
  24. package/src/components/Checkbox/Checkbox.docs.mdx +2 -1
  25. package/src/components/CurrencyInput/CurrencyInput.docs.mdx +2 -1
  26. package/src/components/HighlightBanner/HighlightBanner.docs.mdx +2 -1
  27. package/src/components/Input/Input.docs.mdx +2 -1
  28. package/src/components/Menu/Menu.docs.mdx +2 -1
  29. package/src/components/Modal/Modal.docs.mdx +2 -1
  30. package/src/components/Radio/Radio.docs.mdx +2 -1
  31. package/src/components/Select/Select.docs.mdx +2 -1
  32. package/src/components/Select/Select.props.ts +4 -0
  33. package/src/components/Select/Select.tsx +5 -1
  34. package/src/components/Select/SelectOption.tsx +2 -0
  35. package/src/components/Switch/Switch.docs.mdx +3 -2
  36. package/src/components/VerificationInput/VerificationInput.tsx +3 -0
@@ -1,4 +1,4 @@
1
1
 
2
- > @utilitywarehouse/hearth-react-native@0.28.0 build /home/runner/work/hearth/hearth/packages/react-native
2
+ > @utilitywarehouse/hearth-react-native@0.28.1 build /home/runner/work/hearth/hearth/packages/react-native
3
3
  > tsc
4
4
 
@@ -1,5 +1,5 @@
1
1
 
2
- > @utilitywarehouse/hearth-react-native@0.28.0 lint /home/runner/work/hearth/hearth/packages/react-native
2
+ > @utilitywarehouse/hearth-react-native@0.28.1 lint /home/runner/work/hearth/hearth/packages/react-native
3
3
  > TIMING=1 eslint .
4
4
 
5
5
 
@@ -56,13 +56,13 @@
56
56
 
57
57
  Rule | Time (ms) | Relative
58
58
  :---------------------------------|----------:|--------:
59
- @typescript-eslint/no-unused-vars | 1525.743 | 62.8%
60
- react-hooks/exhaustive-deps | 120.190 | 4.9%
61
- no-global-assign | 94.322 | 3.9%
62
- react-hooks/rules-of-hooks | 73.690 | 3.0%
63
- no-unexpected-multiline | 49.929 | 2.1%
64
- @typescript-eslint/ban-ts-comment | 44.011 | 1.8%
65
- no-loss-of-precision | 35.100 | 1.4%
66
- no-misleading-character-class | 32.579 | 1.3%
67
- no-useless-escape | 32.193 | 1.3%
68
- no-control-regex | 21.498 | 0.9%
59
+ @typescript-eslint/no-unused-vars | 1518.708 | 59.0%
60
+ react-hooks/exhaustive-deps | 172.321 | 6.7%
61
+ react-hooks/rules-of-hooks | 93.331 | 3.6%
62
+ no-global-assign | 85.496 | 3.3%
63
+ @typescript-eslint/ban-ts-comment | 43.023 | 1.7%
64
+ no-misleading-character-class | 42.707 | 1.7%
65
+ no-fallthrough | 37.056 | 1.4%
66
+ no-unexpected-multiline | 36.705 | 1.4%
67
+ no-regex-spaces | 31.518 | 1.2%
68
+ no-control-regex | 28.945 | 1.1%
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @utilitywarehouse/hearth-react-native
2
2
 
3
+ ## 0.28.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [#1018](https://github.com/utilitywarehouse/hearth/pull/1018) [`1c5e02e`](https://github.com/utilitywarehouse/hearth/commit/1c5e02ea4b61329e7c55e52f9aa4ae44abc0da23) Thanks [@fillyD](https://github.com/fillyD)! - 🐛 [FIX]: Adds missing `testID` to `Select`, `SelectOption` and `VerificationInput` component
8
+
3
9
  ## 0.28.0
4
10
 
5
11
  ### Minor Changes
@@ -1,6 +1,6 @@
1
1
  import SelectProps from './Select.props';
2
2
  declare const Select: {
3
- ({ options, value, onValueChange, label, labelVariant, placeholder, disabled, leadingIcon: LeadingIcon, validationStatus, helperText, helperIcon, invalidText, validText, required, children, bottomSheetProps, menuHeading, readonly, emptyText, listProps, searchable, searchPlaceholder, ...rest }: SelectProps): import("react/jsx-runtime").JSX.Element;
3
+ ({ options, value, onValueChange, label, labelVariant, placeholder, disabled, leadingIcon: LeadingIcon, validationStatus, helperText, helperIcon, invalidText, validText, required, children, bottomSheetProps, menuHeading, readonly, emptyText, listProps, searchable, searchPlaceholder, testID, ...rest }: SelectProps): import("react/jsx-runtime").JSX.Element;
4
4
  displayName: string;
5
5
  };
6
6
  export default Select;
@@ -12,7 +12,7 @@ import { Input } from '../Input';
12
12
  import { SelectContext } from './Select.context';
13
13
  import SelectOption from './SelectOption';
14
14
  import { SafeAreaView } from '../SafeAreaView';
15
- const Select = ({ options = [], value, onValueChange, label, labelVariant = 'body', placeholder = 'Select an option', disabled = false, leadingIcon: LeadingIcon, validationStatus = 'initial', helperText, helperIcon, invalidText, validText, required = true, children, bottomSheetProps, menuHeading, readonly = false, emptyText = 'No options available', listProps, searchable = false, searchPlaceholder = 'Search', ...rest }) => {
15
+ const Select = ({ options = [], value, onValueChange, label, labelVariant = 'body', placeholder = 'Select an option', disabled = false, leadingIcon: LeadingIcon, validationStatus = 'initial', helperText, helperIcon, invalidText, validText, required = true, children, bottomSheetProps, menuHeading, readonly = false, emptyText = 'No options available', listProps, searchable = false, searchPlaceholder = 'Search', testID, ...rest }) => {
16
16
  const formFieldContext = useFormFieldContext();
17
17
  const validationStatusFromContext = formFieldContext?.validationStatus ?? validationStatus;
18
18
  const isRequired = formFieldContext?.required ?? required;
@@ -65,9 +65,9 @@ const Select = ({ options = [], value, onValueChange, label, labelVariant = 'bod
65
65
  setIsOpen(false);
66
66
  setSearch('');
67
67
  }, []);
68
- const renderSelectOption = useCallback(({ item }) => (_jsx(SelectOption, { label: item.label, value: item.value, disabled: item.disabled, leadingIcon: item.leadingIcon, trailingIcon: item.trailingIcon })), []);
68
+ const renderSelectOption = useCallback(({ item }) => (_jsx(SelectOption, { label: item.label, value: item.value, disabled: item.disabled, leadingIcon: item.leadingIcon, trailingIcon: item.trailingIcon, testID: testID ? `${testID}-option-${item.label}` : undefined })), [testID]);
69
69
  const renderEmptyComponent = useCallback(() => (_jsx(BottomSheetView, { style: styles.emptyContainer, children: _jsx(DetailText, { children: emptyText }) })), [emptyText]);
70
- return (_jsxs(View, { ...rest, style: [styles.container, rest.style], children: [_jsx(FormField, { label: label, labelVariant: labelVariant, helperText: helperText, helperIcon: helperIcon, validationStatus: validationStatusFromContext, required: isRequired, disabled: isDisabled, readonly: isReadonly, invalidText: invalidText, validText: validText, children: _jsxs(Pressable, { onPress: openBottomSheet, disabled: isDisabled || isReadonly, style: ({ pressed }) => [
70
+ return (_jsxs(View, { ...rest, style: [styles.container, rest.style], children: [_jsx(FormField, { label: label, labelVariant: labelVariant, helperText: helperText, helperIcon: helperIcon, validationStatus: validationStatusFromContext, required: isRequired, disabled: isDisabled, readonly: isReadonly, invalidText: invalidText, validText: validText, children: _jsxs(Pressable, { onPress: openBottomSheet, disabled: isDisabled || isReadonly, testID: testID, style: ({ pressed }) => [
71
71
  styles.selectContainer,
72
72
  styles.pressedContainer(pressed || isOpen),
73
73
  ], children: [!!LeadingIcon && (_jsx(View, { children: (() => {
@@ -77,7 +77,7 @@ const Select = ({ options = [], value, onValueChange, label, labelVariant = 'bod
77
77
  selectedValue: value,
78
78
  onValueChange,
79
79
  close: closeBottomSheet,
80
- }, children: _jsxs(SafeAreaView, { edges: ['top'], style: { flex: 1 }, children: [menuHeading && (_jsx(View, { style: styles.headingContainer, children: _jsx(DetailText, { size: "lg", children: menuHeading }) })), searchable && (_jsx(View, { style: styles.searchContainer, children: _jsx(Input, { placeholder: searchPlaceholder, value: search, inBottomSheet: true, onChangeText: setSearch, type: "search" }) })), children ? (_jsx(BottomSheetScrollView, { children: children })) : (_jsx(BottomSheetFlatList, { data: filteredOptions, keyExtractor: (option) => option.value, renderItem: renderSelectOption, ListEmptyComponent: renderEmptyComponent, ...listProps }))] }) }) })] }));
80
+ }, children: _jsxs(SafeAreaView, { edges: ['top'], style: { flex: 1 }, children: [menuHeading && (_jsx(View, { style: styles.headingContainer, children: _jsx(DetailText, { size: "lg", children: menuHeading }) })), searchable && (_jsx(View, { style: styles.searchContainer, children: _jsx(Input, { placeholder: searchPlaceholder, value: search, inBottomSheet: true, onChangeText: setSearch, type: "search", testID: testID ? `${testID}-search` : undefined }) })), children ? (_jsx(BottomSheetScrollView, { children: children })) : (_jsx(BottomSheetFlatList, { data: filteredOptions, keyExtractor: (option) => option.value, renderItem: renderSelectOption, ListEmptyComponent: renderEmptyComponent, ...listProps }))] }) }) })] }));
81
81
  };
82
82
  const styles = StyleSheet.create(theme => ({
83
83
  container: {
@@ -148,5 +148,9 @@ export interface SelectOptionProps {
148
148
  * Callback when this option is selected
149
149
  */
150
150
  onPress?: (value: string) => void;
151
+ /**
152
+ * Test ID for testing
153
+ */
154
+ testID?: string;
151
155
  }
152
156
  export default SelectProps;
@@ -1,6 +1,6 @@
1
1
  import { SelectOptionProps } from './Select.props';
2
2
  declare const SelectOption: {
3
- ({ label, value, leadingIcon: LeftIcon, trailingIcon: RightIcon, selected, disabled, onPress, }: SelectOptionProps): import("react/jsx-runtime").JSX.Element;
3
+ ({ label, value, leadingIcon: LeftIcon, trailingIcon: RightIcon, selected, disabled, onPress, testID, }: SelectOptionProps): import("react/jsx-runtime").JSX.Element;
4
4
  displayName: string;
5
5
  };
6
6
  export default SelectOption;
@@ -5,7 +5,7 @@ import { StyleSheet } from 'react-native-unistyles';
5
5
  import { BodyText } from '../BodyText';
6
6
  import { Icon } from '../Icon';
7
7
  import { useSelectContext } from './Select.context';
8
- const SelectOption = ({ label, value, leadingIcon: LeftIcon, trailingIcon: RightIcon, selected, disabled, onPress, }) => {
8
+ const SelectOption = ({ label, value, leadingIcon: LeftIcon, trailingIcon: RightIcon, selected, disabled, onPress, testID, }) => {
9
9
  const { selectedValue, onValueChange, close } = useSelectContext();
10
10
  const isSelected = selected !== undefined ? selected : selectedValue === value;
11
11
  styles.useVariants({ disabled });
@@ -22,7 +22,7 @@ const SelectOption = ({ label, value, leadingIcon: LeftIcon, trailingIcon: Right
22
22
  close();
23
23
  }
24
24
  };
25
- return (_jsxs(Pressable, { onPress: handlePress, disabled: disabled, style: ({ pressed }) => [styles.container, pressed && styles.pressed], children: [!!LeftIcon && (_jsx(View, { children: _jsx(Icon, { as: LeftIcon, style: styles.icon }) })), _jsx(View, { style: styles.labelContainer, children: _jsx(BodyText, { children: label }) }), isSelected && (_jsx(View, { children: _jsx(Icon, { as: TickSmallIcon, style: styles.icon }) })), !!RightIcon && !isSelected && (_jsx(View, { children: _jsx(Icon, { as: RightIcon, style: styles.icon }) }))] }));
25
+ return (_jsxs(Pressable, { onPress: handlePress, disabled: disabled, testID: testID, style: ({ pressed }) => [styles.container, pressed && styles.pressed], children: [!!LeftIcon && (_jsx(View, { children: _jsx(Icon, { as: LeftIcon, style: styles.icon }) })), _jsx(View, { style: styles.labelContainer, children: _jsx(BodyText, { children: label }) }), isSelected && (_jsx(View, { children: _jsx(Icon, { as: TickSmallIcon, style: styles.icon }) })), !!RightIcon && !isSelected && (_jsx(View, { children: _jsx(Icon, { as: RightIcon, style: styles.icon }) }))] }));
26
26
  };
27
27
  const styles = StyleSheet.create(theme => ({
28
28
  container: {
@@ -5,7 +5,7 @@ import { StyleSheet } from 'react-native-unistyles';
5
5
  import { FormField } from '../FormField';
6
6
  import { getNextIndexFromValueChange } from './VerificationInput.utils';
7
7
  import { VerificationInputSlot } from './VerificationInputSlot';
8
- const VerificationInput = forwardRef(({ value = '', onChangeText, label, labelVariant = 'body', helperText, helperIcon, validationStatus = 'initial', validText, invalidText, disabled = false, readonly = false, secureTextEntry = false, autoFocus = false, style, ...props }, ref) => {
8
+ const VerificationInput = forwardRef(({ value = '', onChangeText, label, labelVariant = 'body', helperText, helperIcon, validationStatus = 'initial', validText, invalidText, disabled = false, readonly = false, secureTextEntry = false, autoFocus = false, style, testID, ...props }, ref) => {
9
9
  const length = 6;
10
10
  const inputRef = useRef(null);
11
11
  const latestValueRef = useRef(value);
@@ -160,7 +160,7 @@ const VerificationInput = forwardRef(({ value = '', onChangeText, label, labelVa
160
160
  latestSelectionRef.current = nextSelection;
161
161
  setSelection(nextSelection);
162
162
  setFocusedIndex(Math.min(nextSelection.start, length - 1));
163
- }, onFocus: handleFocus, onBlur: handleBlur, selection: selection, keyboardType: "number-pad", textContentType: "oneTimeCode", autoComplete: "sms-otp", secureTextEntry: secureTextEntry, maxLength: length, caretHidden: true, style: styles.hiddenInput }), slots.map(index => {
163
+ }, onFocus: handleFocus, onBlur: handleBlur, selection: selection, keyboardType: "number-pad", textContentType: "oneTimeCode", autoComplete: "sms-otp", secureTextEntry: secureTextEntry, maxLength: length, caretHidden: true, style: styles.hiddenInput, testID: testID }), slots.map(index => {
164
164
  const char = displayValue[index] || '';
165
165
  const isActive = focusedIndex === index;
166
166
  const displayChar = secureTextEntry && char ? '*' : char;
@@ -168,7 +168,7 @@ const VerificationInput = forwardRef(({ value = '', onChangeText, label, labelVa
168
168
  pendingFocusIndexRef.current = index;
169
169
  inputRef.current?.focus();
170
170
  setSelectionIndex(index);
171
- } }, index));
171
+ }, testID: testID ? `${testID}-${index}` : undefined }, index));
172
172
  })] }) }));
173
173
  });
174
174
  const styles = StyleSheet.create(theme => ({
@@ -12,8 +12,8 @@ This page showcases all the components available in the Hearth React Native libr
12
12
  <AllComponents />
13
13
 
14
14
  <NextPrevPage
15
- prevLink="/?path=/docs/layout-components--docs"
15
+ prevLink="layout-components"
16
16
  prevTitle="Layout Components"
17
- nextLink="/?path=/docs/components-accordion--docs"
17
+ nextLink="components-accordion"
18
18
  nextTitle="Accordion"
19
19
  />
@@ -1,5 +1,5 @@
1
1
  import { Meta } from '@storybook/addon-docs/blocks';
2
- import { BackToTopButton } from './components';
2
+ import { BackToTopButton, NextPrevPage } from './components';
3
3
 
4
4
  <Meta title="Changelog" />
5
5
  <BackToTopButton />
@@ -9,6 +9,170 @@ import { BackToTopButton } from './components';
9
9
  The changelog for the Hearth React Native library. Here you can find all the changes, improvements, and bug fixes for each version.
10
10
 
11
11
 
12
+ ## 0.28.0
13
+
14
+ ### Minor Changes
15
+
16
+ - [#1014](https://github.com/utilitywarehouse/hearth/pull/1014) [`c10ff82`](https://github.com/utilitywarehouse/hearth/commit/c10ff82243265217acd95f687d48d803b3c7a4bd) Thanks [@jordmccord](https://github.com/jordmccord)! - 🌟 [FEATURE]: Add `Combobox` and `SafeAreaView` to the React Native library
17
+
18
+ The React Native package now includes a `Combobox` component for searchable selection in a bottom sheet, plus a `SafeAreaView` primitive that applies Unistyles runtime insets only when a view actually overlaps a screen edge. `Combobox` supports the built-in options API for fixed lists, controlled search values for dynamic results, and custom bottom sheet content for cases where you need to bring your own `BottomSheetFlatList` or bespoke option layout. `Modal` now uses `SafeAreaView` in its full-screen navigation modal path so content like search inputs no longer sits behind the dynamic island on iOS.
19
+
20
+ **Components affected**:
21
+ - `Combobox`
22
+ - `ComboboxOption`
23
+ - `SafeAreaView`
24
+ - `Modal`
25
+
26
+ **Developer changes**:
27
+
28
+ Import the new components from `@utilitywarehouse/hearth-react-native` and choose the API that fits your layout. Use `options` for straightforward searchable lists, render custom sheet content when you need virtualised or dynamic results, and wrap full-screen content in `SafeAreaView` when it should only pick up edge insets if it actually touches that edge.
29
+
30
+ - [`8e37595`](https://github.com/utilitywarehouse/hearth/commit/8e375958559357ce5c1703505fa7438887d9e18e) Thanks [@jordmccord](https://github.com/jordmccord)! - 🌟 [FEATURE]: Add `Pagination` component
31
+
32
+ The package now includes a `Pagination` component for moving between pages of content. It supports numbered pagination, a condensed layout for smaller spaces, optional skip buttons for jumping to the first and last page, and controlled page state so it can be wired into lists, tables, or other paged views.
33
+
34
+ **Components affected**:
35
+ - `Pagination`
36
+
37
+ **Developer changes**:
38
+
39
+ Import `Pagination` from `@utilitywarehouse/hearth-react-native` and control the current page in your screen or feature state.
40
+
41
+ ```tsx
42
+ import { useState } from 'react';
43
+ import { Pagination } from '@utilitywarehouse/hearth-react-native';
44
+
45
+ const MyComponent = () => {
46
+ const [page, setPage] = useState(1);
47
+
48
+ return <Pagination currentPage={page} onPageChange={setPage} totalPages={10} />;
49
+ };
50
+ ```
51
+
52
+ - [`8e37595`](https://github.com/utilitywarehouse/hearth/commit/8e375958559357ce5c1703505fa7438887d9e18e) Thanks [@jordmccord](https://github.com/jordmccord)! - 🌟 [FEATURE]: Add `Table` component
53
+
54
+ The package now includes a composable `Table` API for presenting structured data with headers, rows, cells, optional card-style containers, horizontal scrolling for narrow viewports, configurable column widths, and pagination support through `TablePagination`. Header cells support trailing actions such as sort controls, and the API is split into smaller building blocks so layouts can be assembled to fit different datasets.
55
+
56
+ **Components affected**:
57
+ - `Table`
58
+ - `TableHeader`
59
+ - `TableHeaderCell`
60
+ - `TableBody`
61
+ - `TableRow`
62
+ - `TableCell`
63
+ - `TablePagination`
64
+
65
+ **Developer changes**:
66
+
67
+ Import the table primitives from `@utilitywarehouse/hearth-react-native` and compose them to match your data shape. Add `columnWidths` when you need fixed or weighted columns, and pass `pagination` when rows should be paged.
68
+
69
+ ```tsx
70
+ import {
71
+ Table,
72
+ TableBody,
73
+ TableCell,
74
+ TableHeader,
75
+ TableHeaderCell,
76
+ TableRow,
77
+ } from '@utilitywarehouse/hearth-react-native';
78
+
79
+ const MyComponent = () => (
80
+ <Table columnWidths={[180, '2fr', '1fr']} container="subtle">
81
+ <TableHeader color="purple">
82
+ <TableHeaderCell>Name</TableHeaderCell>
83
+ <TableHeaderCell>Email</TableHeaderCell>
84
+ <TableHeaderCell>Status</TableHeaderCell>
85
+ </TableHeader>
86
+ <TableBody>
87
+ <TableRow>
88
+ <TableHeaderCell row>Alex Morgan</TableHeaderCell>
89
+ <TableCell>alex@example.com</TableCell>
90
+ <TableCell>Active</TableCell>
91
+ </TableRow>
92
+ </TableBody>
93
+ </Table>
94
+ );
95
+ ```
96
+
97
+ - [#1016](https://github.com/utilitywarehouse/hearth/pull/1016) [`33baa9e`](https://github.com/utilitywarehouse/hearth/commit/33baa9e8edb091bbd1d17c9a3838352a7f1b87ea) Thanks [@jordmccord](https://github.com/jordmccord)! - 🌟 [FEATURE]: Adds `Timeline` and `TimelineItem`
98
+
99
+ The package now includes `Timeline` and `TimelineItem` components for showing a sequence of static stops or progress steps. The new API supports labelled items, optional helper text, progress states for complete or active steps, and custom content within an item when you need to show extra context or actions.
100
+
101
+ **Components affected**:
102
+ - `Timeline`
103
+ - `TimelineItem`
104
+
105
+ **Developer changes**:
106
+
107
+ Import `Timeline` and `TimelineItem` from `@utilitywarehouse/hearth-react-native`. Use `variant="static"` for simple ordered events, or `variant="progress"` with item `state` values to communicate step progress.
108
+
109
+ ```tsx
110
+ import { Timeline, TimelineItem } from '@utilitywarehouse/hearth-react-native';
111
+
112
+ const MyComponent = () => (
113
+ <Timeline variant="progress">
114
+ <TimelineItem label="Ordered" helperText="We have received your order" state="complete" />
115
+ <TimelineItem label="Packed" helperText="Your items are ready" state="complete" />
116
+ <TimelineItem label="Out for delivery" helperText="Arriving today" state="active" />
117
+ <TimelineItem label="Delivered" helperText="Pending" state="incomplete" />
118
+ </Timeline>
119
+ );
120
+ ```
121
+
122
+ ## 0.27.3
123
+
124
+ ### Patch Changes
125
+
126
+ - [#1006](https://github.com/utilitywarehouse/hearth/pull/1006) [`1996112`](https://github.com/utilitywarehouse/hearth/commit/1996112864146e86972ef6b9b07a8be5a72b552f) Thanks [@jordmccord](https://github.com/jordmccord)! - 🐛 [FIX]: Make `paddingNone` remove horizontal padding for ghost buttons in `md` size
127
+
128
+ Fixed an issue where setting `paddingNone` on a ghost button did not remove horizontal padding when using `md` size. The prop now removes horizontal padding for both `sm` and `md` ghost buttons.
129
+
130
+ **Components affected**:
131
+ - `Button`
132
+
133
+ **Developer changes**:
134
+
135
+ No changes required.
136
+
137
+ - [#1012](https://github.com/utilitywarehouse/hearth/pull/1012) [`4fda116`](https://github.com/utilitywarehouse/hearth/commit/4fda116c2a1bec383df7e630180ab57166ab9da4) Thanks [@jordmccord](https://github.com/jordmccord)! - 🐛 [FIX]: Prevent outlines from being clipped for scrollable children in `Modal`
138
+
139
+ Fixed an issue in in-nav modals where child components with outlines could be visually clipped at the horizontal edges when content was scrollable.
140
+
141
+ **Components affected**:
142
+ - `Modal`
143
+
144
+ **Developer changes**:
145
+
146
+ No changes required.
147
+
148
+ - [#1012](https://github.com/utilitywarehouse/hearth/pull/1012) [`4fda116`](https://github.com/utilitywarehouse/hearth/commit/4fda116c2a1bec383df7e630180ab57166ab9da4) Thanks [@jordmccord](https://github.com/jordmccord)! - 💅 [ENHANCEMENT]: Update horizontal padding values for scrollable in-nav `Modal` content
149
+
150
+ Adjusted horizontal padding behaviour in scrollable in-nav modals to preserve child outlines while keeping visual spacing consistent.
151
+
152
+ **Components affected**:
153
+ - `Modal`
154
+
155
+ **Developer changes**:
156
+
157
+ No changes required.
158
+
159
+ - [#1009](https://github.com/utilitywarehouse/hearth/pull/1009) [`3d65ef2`](https://github.com/utilitywarehouse/hearth/commit/3d65ef2f8f7701b128a9c679f1910cd3d0f5c0c3) Thanks [@fillyD](https://github.com/fillyD)! - 🐛 [FIX]: testID for `List` component
160
+
161
+ ## 0.27.2
162
+
163
+ ### Patch Changes
164
+
165
+ - [#1003](https://github.com/utilitywarehouse/hearth/pull/1003) [`cdb95ea`](https://github.com/utilitywarehouse/hearth/commit/cdb95eabb279adaf348487ae3fb4a20e600e039e) Thanks [@jordmccord](https://github.com/jordmccord)! - 🐛 [FIX]: Correct `VerificationInput` focus progression after editing an empty slot
166
+
167
+ Fixed an issue where entering a value after selecting an empty verification slot could move focus to the wrong slot. Focus now moves to the slot immediately after the one that was actually updated.
168
+
169
+ **Components affected**:
170
+ - `VerificationInput`
171
+
172
+ **Developer changes**:
173
+
174
+ No changes required.
175
+
12
176
  ## 0.27.1
13
177
 
14
178
  ### Patch Changes
@@ -1255,3 +1419,10 @@ The changelog for the Hearth React Native library. Here you can find all the cha
1255
1419
 
1256
1420
  - [`f6366c4`](https://github.com/utilitywarehouse/hearth/commit/f6366c4da2676c535dca90be570d6e6bae5a0349) Thanks [@jordmccord](https://github.com/jordmccord)! - Initial Release 🎉
1257
1421
 
1422
+
1423
+ <NextPrevPage
1424
+ prevLink="getting-started"
1425
+ prevTitle="Getting Started"
1426
+ nextLink="styling"
1427
+ nextTitle="Styling"
1428
+ />