@xaui/native 0.9.1-alpha.11 → 0.9.1-alpha.13

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 (31) hide show
  1. package/dist/{chunk-7XGOXTGT.js → chunk-4O3PXFQ7.js} +15 -31
  2. package/dist/{chunk-3QBT3Q65.cjs → chunk-6N5JXRUZ.cjs} +26 -3
  3. package/dist/chunk-B3EAZ2CC.js +1010 -0
  4. package/dist/{chunk-2FEDC7U5.cjs → chunk-DDYMIWLW.cjs} +41 -57
  5. package/dist/chunk-IVVFYUDW.cjs +1044 -0
  6. package/dist/{chunk-6OHFG32Y.cjs → chunk-MLJ543GP.cjs} +41 -53
  7. package/dist/{chunk-NQ5WWF77.js → chunk-RWLODK55.js} +35 -47
  8. package/dist/{chunk-X2K2FX3W.js → chunk-XJARE6SC.js} +24 -1
  9. package/dist/components/button/index.cjs +4 -4
  10. package/dist/components/button/index.d.cts +162 -13
  11. package/dist/components/button/index.d.ts +162 -13
  12. package/dist/components/button/index.js +3 -3
  13. package/dist/{create-recipe-Dn9kj5Rs.d.ts → create-recipe-3OPwcC6P.d.ts} +81 -21
  14. package/dist/{create-recipe-BjSP0zL_.d.cts → create-recipe-oiLAlJ4u.d.cts} +81 -21
  15. package/dist/index.cjs +28 -8
  16. package/dist/index.d.cts +2 -2
  17. package/dist/index.d.ts +2 -2
  18. package/dist/index.js +32 -12
  19. package/dist/system/index.cjs +24 -4
  20. package/dist/system/index.d.cts +160 -35
  21. package/dist/system/index.d.ts +160 -35
  22. package/dist/system/index.js +31 -11
  23. package/dist/theme/index.cjs +3 -3
  24. package/dist/theme/index.d.cts +19 -8
  25. package/dist/theme/index.d.ts +19 -8
  26. package/dist/theme/index.js +2 -2
  27. package/package.json +1 -1
  28. package/dist/chunk-E2UGZJBT.cjs +0 -959
  29. package/dist/chunk-R4HJCQPI.js +0 -889
  30. /package/dist/{chunk-LMUPNKPH.cjs → chunk-2FOEFUPM.cjs} +0 -0
  31. /package/dist/{chunk-3TIDEII6.js → chunk-TO6DAGFB.js} +0 -0
@@ -2,20 +2,35 @@ import * as react from 'react';
2
2
  import { ReactNode } from 'react';
3
3
  import * as react_native from 'react-native';
4
4
  import { StyleProp, TextStyle, ViewStyle, TextProps, PressableStateCallbackType } from 'react-native';
5
- import { a as IconContextValue, b as IconProps, P as PressableFeedbackProps, f as Recipe, n as SlotStyles } from '../../create-recipe-BjSP0zL_.cjs';
5
+ import { a as IconContextValue, b as IconProps, w as TextStyleProps, P as PressableFeedbackProps, x as ViewStyleProps, g as Recipe, o as SlotStyles, c as AnimationProp } from '../../create-recipe-oiLAlJ4u.cjs';
6
6
  import { S as Size, R as RadiusKey, g as XAUITheme } from '../../theme.type-C9bFJKFm.cjs';
7
7
  import 'react-native-reanimated';
8
8
 
9
9
  type ButtonSlot = 'root' | 'label' | 'icon' | 'spinner';
10
10
  /**
11
- * The ten sanctioned appearances (R7). Emphasis and intention are one flat union, which
12
- * is why there is no `themeColor` beside it: `primary` … `ghost` are the emphasis levels,
13
- * and each intention carries its own `-soft` low-emphasis level rather than one of them
14
- * being special-cased.
11
+ * The seven sanctioned appearances (R7). Emphasis and intention are one flat union, which
12
+ * is why there is no `themeColor` beside it.
13
+ *
14
+ * The emphasis ladder descends by how much of the accent is left: `primary` is the full
15
+ * accent, `secondary` its soft slice, `default` drops the accent for the neutral fill,
16
+ * `tertiary` drops the fill for a border, and `ghost` drops that too. `secondary` is to
17
+ * `primary` exactly what `danger-soft` is to `danger` — the same soft slice of the same
18
+ * family, which is why it needs no rule of its own in the recipe.
19
+ *
20
+ * **`success` and `warning` are deliberately not here.** A button is something you press,
21
+ * and neither of those is an action: a success is an outcome and a warning is a state,
22
+ * both of which a `Chip`, an `Alert` or a `Badge` reports. The theme keeps their tokens —
23
+ * a component that *does* report status reads them — and a button that genuinely needs a
24
+ * green fill passes the raw tint instead: `<Button color={theme.colors.success}>`.
15
25
  */
16
- type ButtonVariant = 'primary' | 'secondary' | 'tertiary' | 'ghost' | 'success' | 'success-soft' | 'warning' | 'warning-soft' | 'danger' | 'danger-soft';
26
+ type ButtonVariant = 'primary' | 'secondary' | 'default' | 'tertiary' | 'ghost' | 'danger' | 'danger-soft';
17
27
  type ButtonSize = Size;
18
- type ButtonProps = Omit<PressableFeedbackProps, 'isPressed' | 'isDisabled' | 'style' | 'children'> & {
28
+ /**
29
+ * What the `Button` itself understands. R14 — a name in here is the component's, so the
30
+ * style prop that shares it is not exposed: `size` is the control's scale and never
31
+ * `ViewStyle`'s, and `color` is R7's tint rather than `TextStyle`'s.
32
+ */
33
+ type ButtonOwnProps = {
19
34
  variant?: ButtonVariant;
20
35
  /** Height, padding, gap, radius and type. Never width. */
21
36
  size?: ButtonSize;
@@ -37,19 +52,34 @@ type ButtonProps = Omit<PressableFeedbackProps, 'isPressed' | 'isDisabled' | 'st
37
52
  style?: StyleProp<ViewStyle> | ((state: PressableStateCallbackType) => StyleProp<ViewStyle>);
38
53
  children?: ReactNode;
39
54
  };
40
- type ButtonLabelProps = TextProps & {
55
+ type ButtonBehaviourProps = Omit<PressableFeedbackProps, 'isPressed' | 'isDisabled' | 'style' | 'children'>;
56
+ /**
57
+ * R14 — the button's own props, the press behaviour it forwards, and every `ViewStyle`
58
+ * key the two do not already claim. `height` therefore beats the height `size` chose and
59
+ * `width="100%"` is what replaced `fullWidth`, both because the style props resolve after
60
+ * the recipe. That is the escape hatch, not the normal path.
61
+ */
62
+ type ButtonProps = ButtonOwnProps & ButtonBehaviourProps & Omit<ViewStyleProps, keyof ButtonOwnProps | keyof ButtonBehaviourProps>;
63
+ /** `Text`'s own props win over the `TextStyle` keys of the same name (R14). */
64
+ type ButtonLabelProps = TextProps & Omit<TextStyleProps, keyof TextProps> & {
41
65
  children?: ReactNode;
42
66
  };
43
67
  /**
44
68
  * `Icon`'s three forms, plus the `style` every slot carries (R2). `size` and `color`
45
69
  * default to what the root resolved; passing either wins over it.
70
+ *
71
+ * No style props (R14), deliberately: two of the three forms have no view of our own to
72
+ * style — `as` hands its props to a third-party component and the children form clones
73
+ * the caller's element — so a `padding` here would apply in one form out of three. `size`
74
+ * and `color` are the escape hatch, as they already are for `style`.
46
75
  */
47
76
  type ButtonIconProps = IconProps;
48
- type ButtonSpinnerProps = {
77
+ type ButtonSpinnerOwnProps = {
49
78
  style?: StyleProp<ViewStyle>;
50
79
  /** `false` stops the rotation. The ring stays, so the button does not change size. */
51
80
  animation?: boolean;
52
81
  };
82
+ type ButtonSpinnerProps = ButtonSpinnerOwnProps & Omit<ViewStyleProps, keyof ButtonSpinnerOwnProps>;
53
83
  /**
54
84
  * R5 — resolved styles, not props for a slot to resolve a second time. Each entry is the
55
85
  * cached `StyleSheet` reference with the uncached tint pass layered over it, so a slot
@@ -95,7 +125,7 @@ declare namespace ButtonIcon {
95
125
  * and its variant with nothing to pass. P3 extracts it into the standalone `Spinner`, and
96
126
  * this slot becomes its call site.
97
127
  */
98
- declare function ButtonSpinner({ style, animation }: ButtonSpinnerProps): react.JSX.Element;
128
+ declare function ButtonSpinner({ style, animation, ...props }: ButtonSpinnerProps): react.JSX.Element;
99
129
  declare namespace ButtonSpinner {
100
130
  var displayName: string;
101
131
  }
@@ -171,7 +201,126 @@ declare const buttonRecipe: Recipe<"label" | "root" | "icon" | "spinner", Button
171
201
  };
172
202
  }>;
173
203
 
174
- declare const Button: react.ForwardRefExoticComponent<Omit<PressableFeedbackProps, "style" | "children" | "isPressed" | "isDisabled"> & {
204
+ declare const Button: react.ForwardRefExoticComponent<{
205
+ variant?: ButtonVariant;
206
+ size?: ButtonSize;
207
+ radius?: RadiusKey;
208
+ color?: string;
209
+ isDisabled?: boolean;
210
+ isLoading?: boolean;
211
+ isIconOnly?: boolean;
212
+ style?: react_native.StyleProp<react_native.ViewStyle> | ((state: react_native.PressableStateCallbackType) => react_native.StyleProp<react_native.ViewStyle>);
213
+ children?: react.ReactNode;
214
+ } & {
215
+ id?: string | undefined | undefined;
216
+ onLayout?: ((event: react_native.LayoutChangeEvent) => void) | undefined | undefined;
217
+ testID?: string | undefined | undefined;
218
+ nativeID?: string | undefined | undefined;
219
+ accessible?: boolean | undefined | undefined;
220
+ accessibilityActions?: readonly Readonly<{
221
+ name: react_native.AccessibilityActionName | string;
222
+ label?: string | undefined;
223
+ }>[] | undefined;
224
+ accessibilityLabel?: string | undefined | undefined;
225
+ 'aria-label'?: string | undefined | undefined;
226
+ accessibilityRole?: react_native.AccessibilityRole | undefined;
227
+ accessibilityState?: react_native.AccessibilityState | undefined;
228
+ 'aria-busy'?: boolean | undefined | undefined;
229
+ 'aria-checked'?: boolean | "mixed" | undefined | undefined;
230
+ 'aria-disabled'?: boolean | undefined | undefined;
231
+ 'aria-expanded'?: boolean | undefined | undefined;
232
+ 'aria-selected'?: boolean | undefined | undefined;
233
+ accessibilityHint?: string | undefined | undefined;
234
+ accessibilityValue?: react_native.AccessibilityValue | undefined;
235
+ 'aria-valuemax'?: number | undefined;
236
+ 'aria-valuemin'?: number | undefined;
237
+ 'aria-valuenow'?: number | undefined;
238
+ 'aria-valuetext'?: string | undefined;
239
+ onAccessibilityAction?: ((event: react_native.AccessibilityActionEvent) => void) | undefined | undefined;
240
+ importantForAccessibility?: ("auto" | "yes" | "no" | "no-hide-descendants") | undefined | undefined;
241
+ 'aria-hidden'?: boolean | undefined | undefined;
242
+ 'aria-modal'?: boolean | undefined | undefined;
243
+ role?: react_native.Role | undefined;
244
+ accessibilityLabelledBy?: string | string[] | undefined | undefined;
245
+ 'aria-labelledby'?: string | undefined | undefined;
246
+ accessibilityLiveRegion?: "none" | "polite" | "assertive" | undefined | undefined;
247
+ 'aria-live'?: ("polite" | "assertive" | "off") | undefined | undefined;
248
+ screenReaderFocusable?: boolean | undefined | undefined;
249
+ accessibilityElementsHidden?: boolean | undefined | undefined;
250
+ accessibilityViewIsModal?: boolean | undefined | undefined;
251
+ onAccessibilityEscape?: (() => void) | undefined | undefined;
252
+ onAccessibilityTap?: (() => void) | undefined | undefined;
253
+ onMagicTap?: (() => void) | undefined | undefined;
254
+ accessibilityIgnoresInvertColors?: boolean | undefined | undefined;
255
+ accessibilityLanguage?: string | undefined | undefined;
256
+ accessibilityShowsLargeContentViewer?: boolean | undefined | undefined;
257
+ accessibilityLargeContentTitle?: string | undefined | undefined;
258
+ accessibilityRespondsToUserInteraction?: boolean | undefined | undefined;
259
+ hitSlop?: number | react_native.Insets | null | undefined;
260
+ needsOffscreenAlphaCompositing?: boolean | undefined | undefined;
261
+ pointerEvents?: "box-none" | "none" | "box-only" | "auto" | undefined | undefined;
262
+ removeClippedSubviews?: boolean | undefined | undefined;
263
+ collapsable?: boolean | undefined | undefined;
264
+ collapsableChildren?: boolean | undefined | undefined;
265
+ onBlur?: null | ((event: react_native.NativeSyntheticEvent<react_native.TargetedEvent>) => void) | undefined | undefined;
266
+ onFocus?: null | ((event: react_native.NativeSyntheticEvent<react_native.TargetedEvent>) => void) | undefined | undefined;
267
+ renderToHardwareTextureAndroid?: boolean | undefined | undefined;
268
+ focusable?: boolean | undefined | undefined;
269
+ tabIndex?: 0 | -1 | undefined | undefined;
270
+ shouldRasterizeIOS?: boolean | undefined | undefined;
271
+ isTVSelectable?: boolean | undefined | undefined;
272
+ hasTVPreferredFocus?: boolean | undefined | undefined;
273
+ tvParallaxShiftDistanceX?: number | undefined | undefined;
274
+ tvParallaxShiftDistanceY?: number | undefined | undefined;
275
+ tvParallaxTiltAngle?: number | undefined | undefined;
276
+ tvParallaxMagnification?: number | undefined | undefined;
277
+ onStartShouldSetResponder?: ((event: react_native.GestureResponderEvent) => boolean) | undefined | undefined;
278
+ onMoveShouldSetResponder?: ((event: react_native.GestureResponderEvent) => boolean) | undefined | undefined;
279
+ onResponderEnd?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
280
+ onResponderGrant?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
281
+ onResponderReject?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
282
+ onResponderMove?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
283
+ onResponderRelease?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
284
+ onResponderStart?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
285
+ onResponderTerminationRequest?: ((event: react_native.GestureResponderEvent) => boolean) | undefined | undefined;
286
+ onResponderTerminate?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
287
+ onStartShouldSetResponderCapture?: ((event: react_native.GestureResponderEvent) => boolean) | undefined | undefined;
288
+ onMoveShouldSetResponderCapture?: ((event: react_native.GestureResponderEvent) => boolean) | undefined | undefined;
289
+ onTouchStart?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
290
+ onTouchMove?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
291
+ onTouchEnd?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
292
+ onTouchCancel?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
293
+ onTouchEndCapture?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
294
+ onPointerEnter?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
295
+ onPointerEnterCapture?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
296
+ onPointerLeave?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
297
+ onPointerLeaveCapture?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
298
+ onPointerMove?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
299
+ onPointerMoveCapture?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
300
+ onPointerCancel?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
301
+ onPointerCancelCapture?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
302
+ onPointerDown?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
303
+ onPointerDownCapture?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
304
+ onPointerUp?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
305
+ onPointerUpCapture?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
306
+ onHoverIn?: null | ((event: react_native.MouseEvent) => void) | undefined | undefined;
307
+ onHoverOut?: null | ((event: react_native.MouseEvent) => void) | undefined | undefined;
308
+ onPress?: null | ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
309
+ onPressIn?: null | ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
310
+ onPressOut?: null | ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
311
+ onLongPress?: null | ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
312
+ cancelable?: null | boolean | undefined | undefined;
313
+ delayHoverIn?: number | null | undefined | undefined;
314
+ delayHoverOut?: number | null | undefined | undefined;
315
+ delayLongPress?: null | number | undefined | undefined;
316
+ pressRetentionOffset?: number | react_native.Insets | null | undefined;
317
+ android_disableSound?: null | boolean | undefined | undefined;
318
+ android_ripple?: react_native.PressableAndroidRippleConfig | null | undefined;
319
+ testOnly_pressed?: null | boolean | undefined | undefined;
320
+ unstable_pressDelay?: number | undefined | undefined;
321
+ asChild?: boolean | undefined;
322
+ animation?: AnimationProp | undefined;
323
+ } & Omit<ViewStyleProps, "id" | "onLayout" | "testID" | "nativeID" | "accessible" | "accessibilityActions" | "accessibilityLabel" | "aria-label" | "accessibilityRole" | "accessibilityState" | "aria-busy" | "aria-checked" | "aria-disabled" | "aria-expanded" | "aria-selected" | "accessibilityHint" | "accessibilityValue" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "onAccessibilityAction" | "importantForAccessibility" | "aria-hidden" | "aria-modal" | "role" | "accessibilityLabelledBy" | "aria-labelledby" | "accessibilityLiveRegion" | "aria-live" | "screenReaderFocusable" | "accessibilityElementsHidden" | "accessibilityViewIsModal" | "onAccessibilityEscape" | "onAccessibilityTap" | "onMagicTap" | "accessibilityIgnoresInvertColors" | "accessibilityLanguage" | "accessibilityShowsLargeContentViewer" | "accessibilityLargeContentTitle" | "accessibilityRespondsToUserInteraction" | "hitSlop" | "needsOffscreenAlphaCompositing" | "pointerEvents" | "removeClippedSubviews" | "collapsable" | "collapsableChildren" | "onBlur" | "onFocus" | "renderToHardwareTextureAndroid" | "focusable" | "tabIndex" | "shouldRasterizeIOS" | "isTVSelectable" | "hasTVPreferredFocus" | "tvParallaxShiftDistanceX" | "tvParallaxShiftDistanceY" | "tvParallaxTiltAngle" | "tvParallaxMagnification" | "onStartShouldSetResponder" | "onMoveShouldSetResponder" | "onResponderEnd" | "onResponderGrant" | "onResponderReject" | "onResponderMove" | "onResponderRelease" | "onResponderStart" | "onResponderTerminationRequest" | "onResponderTerminate" | "onStartShouldSetResponderCapture" | "onMoveShouldSetResponderCapture" | "onTouchStart" | "onTouchMove" | "onTouchEnd" | "onTouchCancel" | "onTouchEndCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerUp" | "onPointerUpCapture" | "onHoverIn" | "onHoverOut" | "onPress" | "onPressIn" | "onPressOut" | "onLongPress" | "cancelable" | "delayHoverIn" | "delayHoverOut" | "delayLongPress" | "pressRetentionOffset" | "android_disableSound" | "android_ripple" | "testOnly_pressed" | "unstable_pressDelay" | "asChild" | "animation" | keyof {
175
324
  variant?: ButtonVariant;
176
325
  size?: ButtonSize;
177
326
  radius?: RadiusKey;
@@ -181,8 +330,8 @@ declare const Button: react.ForwardRefExoticComponent<Omit<PressableFeedbackProp
181
330
  isIconOnly?: boolean;
182
331
  style?: react_native.StyleProp<react_native.ViewStyle> | ((state: react_native.PressableStateCallbackType) => react_native.StyleProp<react_native.ViewStyle>);
183
332
  children?: react.ReactNode;
184
- } & react.RefAttributes<react_native.View>> & {
185
- Label: react.ForwardRefExoticComponent<react_native.TextProps & {
333
+ }> & react.RefAttributes<react_native.View>> & {
334
+ Label: react.ForwardRefExoticComponent<react_native.TextProps & Omit<TextStyleProps, keyof react_native.TextProps> & {
186
335
  children?: react.ReactNode;
187
336
  } & react.RefAttributes<react_native.Text>>;
188
337
  Icon: typeof ButtonIcon;
@@ -2,20 +2,35 @@ import * as react from 'react';
2
2
  import { ReactNode } from 'react';
3
3
  import * as react_native from 'react-native';
4
4
  import { StyleProp, TextStyle, ViewStyle, TextProps, PressableStateCallbackType } from 'react-native';
5
- import { a as IconContextValue, b as IconProps, P as PressableFeedbackProps, f as Recipe, n as SlotStyles } from '../../create-recipe-Dn9kj5Rs.js';
5
+ import { a as IconContextValue, b as IconProps, w as TextStyleProps, P as PressableFeedbackProps, x as ViewStyleProps, g as Recipe, o as SlotStyles, c as AnimationProp } from '../../create-recipe-3OPwcC6P.js';
6
6
  import { S as Size, R as RadiusKey, g as XAUITheme } from '../../theme.type-C9bFJKFm.js';
7
7
  import 'react-native-reanimated';
8
8
 
9
9
  type ButtonSlot = 'root' | 'label' | 'icon' | 'spinner';
10
10
  /**
11
- * The ten sanctioned appearances (R7). Emphasis and intention are one flat union, which
12
- * is why there is no `themeColor` beside it: `primary` … `ghost` are the emphasis levels,
13
- * and each intention carries its own `-soft` low-emphasis level rather than one of them
14
- * being special-cased.
11
+ * The seven sanctioned appearances (R7). Emphasis and intention are one flat union, which
12
+ * is why there is no `themeColor` beside it.
13
+ *
14
+ * The emphasis ladder descends by how much of the accent is left: `primary` is the full
15
+ * accent, `secondary` its soft slice, `default` drops the accent for the neutral fill,
16
+ * `tertiary` drops the fill for a border, and `ghost` drops that too. `secondary` is to
17
+ * `primary` exactly what `danger-soft` is to `danger` — the same soft slice of the same
18
+ * family, which is why it needs no rule of its own in the recipe.
19
+ *
20
+ * **`success` and `warning` are deliberately not here.** A button is something you press,
21
+ * and neither of those is an action: a success is an outcome and a warning is a state,
22
+ * both of which a `Chip`, an `Alert` or a `Badge` reports. The theme keeps their tokens —
23
+ * a component that *does* report status reads them — and a button that genuinely needs a
24
+ * green fill passes the raw tint instead: `<Button color={theme.colors.success}>`.
15
25
  */
16
- type ButtonVariant = 'primary' | 'secondary' | 'tertiary' | 'ghost' | 'success' | 'success-soft' | 'warning' | 'warning-soft' | 'danger' | 'danger-soft';
26
+ type ButtonVariant = 'primary' | 'secondary' | 'default' | 'tertiary' | 'ghost' | 'danger' | 'danger-soft';
17
27
  type ButtonSize = Size;
18
- type ButtonProps = Omit<PressableFeedbackProps, 'isPressed' | 'isDisabled' | 'style' | 'children'> & {
28
+ /**
29
+ * What the `Button` itself understands. R14 — a name in here is the component's, so the
30
+ * style prop that shares it is not exposed: `size` is the control's scale and never
31
+ * `ViewStyle`'s, and `color` is R7's tint rather than `TextStyle`'s.
32
+ */
33
+ type ButtonOwnProps = {
19
34
  variant?: ButtonVariant;
20
35
  /** Height, padding, gap, radius and type. Never width. */
21
36
  size?: ButtonSize;
@@ -37,19 +52,34 @@ type ButtonProps = Omit<PressableFeedbackProps, 'isPressed' | 'isDisabled' | 'st
37
52
  style?: StyleProp<ViewStyle> | ((state: PressableStateCallbackType) => StyleProp<ViewStyle>);
38
53
  children?: ReactNode;
39
54
  };
40
- type ButtonLabelProps = TextProps & {
55
+ type ButtonBehaviourProps = Omit<PressableFeedbackProps, 'isPressed' | 'isDisabled' | 'style' | 'children'>;
56
+ /**
57
+ * R14 — the button's own props, the press behaviour it forwards, and every `ViewStyle`
58
+ * key the two do not already claim. `height` therefore beats the height `size` chose and
59
+ * `width="100%"` is what replaced `fullWidth`, both because the style props resolve after
60
+ * the recipe. That is the escape hatch, not the normal path.
61
+ */
62
+ type ButtonProps = ButtonOwnProps & ButtonBehaviourProps & Omit<ViewStyleProps, keyof ButtonOwnProps | keyof ButtonBehaviourProps>;
63
+ /** `Text`'s own props win over the `TextStyle` keys of the same name (R14). */
64
+ type ButtonLabelProps = TextProps & Omit<TextStyleProps, keyof TextProps> & {
41
65
  children?: ReactNode;
42
66
  };
43
67
  /**
44
68
  * `Icon`'s three forms, plus the `style` every slot carries (R2). `size` and `color`
45
69
  * default to what the root resolved; passing either wins over it.
70
+ *
71
+ * No style props (R14), deliberately: two of the three forms have no view of our own to
72
+ * style — `as` hands its props to a third-party component and the children form clones
73
+ * the caller's element — so a `padding` here would apply in one form out of three. `size`
74
+ * and `color` are the escape hatch, as they already are for `style`.
46
75
  */
47
76
  type ButtonIconProps = IconProps;
48
- type ButtonSpinnerProps = {
77
+ type ButtonSpinnerOwnProps = {
49
78
  style?: StyleProp<ViewStyle>;
50
79
  /** `false` stops the rotation. The ring stays, so the button does not change size. */
51
80
  animation?: boolean;
52
81
  };
82
+ type ButtonSpinnerProps = ButtonSpinnerOwnProps & Omit<ViewStyleProps, keyof ButtonSpinnerOwnProps>;
53
83
  /**
54
84
  * R5 — resolved styles, not props for a slot to resolve a second time. Each entry is the
55
85
  * cached `StyleSheet` reference with the uncached tint pass layered over it, so a slot
@@ -95,7 +125,7 @@ declare namespace ButtonIcon {
95
125
  * and its variant with nothing to pass. P3 extracts it into the standalone `Spinner`, and
96
126
  * this slot becomes its call site.
97
127
  */
98
- declare function ButtonSpinner({ style, animation }: ButtonSpinnerProps): react.JSX.Element;
128
+ declare function ButtonSpinner({ style, animation, ...props }: ButtonSpinnerProps): react.JSX.Element;
99
129
  declare namespace ButtonSpinner {
100
130
  var displayName: string;
101
131
  }
@@ -171,7 +201,126 @@ declare const buttonRecipe: Recipe<"label" | "root" | "icon" | "spinner", Button
171
201
  };
172
202
  }>;
173
203
 
174
- declare const Button: react.ForwardRefExoticComponent<Omit<PressableFeedbackProps, "style" | "children" | "isPressed" | "isDisabled"> & {
204
+ declare const Button: react.ForwardRefExoticComponent<{
205
+ variant?: ButtonVariant;
206
+ size?: ButtonSize;
207
+ radius?: RadiusKey;
208
+ color?: string;
209
+ isDisabled?: boolean;
210
+ isLoading?: boolean;
211
+ isIconOnly?: boolean;
212
+ style?: react_native.StyleProp<react_native.ViewStyle> | ((state: react_native.PressableStateCallbackType) => react_native.StyleProp<react_native.ViewStyle>);
213
+ children?: react.ReactNode;
214
+ } & {
215
+ id?: string | undefined | undefined;
216
+ onLayout?: ((event: react_native.LayoutChangeEvent) => void) | undefined | undefined;
217
+ testID?: string | undefined | undefined;
218
+ nativeID?: string | undefined | undefined;
219
+ accessible?: boolean | undefined | undefined;
220
+ accessibilityActions?: readonly Readonly<{
221
+ name: react_native.AccessibilityActionName | string;
222
+ label?: string | undefined;
223
+ }>[] | undefined;
224
+ accessibilityLabel?: string | undefined | undefined;
225
+ 'aria-label'?: string | undefined | undefined;
226
+ accessibilityRole?: react_native.AccessibilityRole | undefined;
227
+ accessibilityState?: react_native.AccessibilityState | undefined;
228
+ 'aria-busy'?: boolean | undefined | undefined;
229
+ 'aria-checked'?: boolean | "mixed" | undefined | undefined;
230
+ 'aria-disabled'?: boolean | undefined | undefined;
231
+ 'aria-expanded'?: boolean | undefined | undefined;
232
+ 'aria-selected'?: boolean | undefined | undefined;
233
+ accessibilityHint?: string | undefined | undefined;
234
+ accessibilityValue?: react_native.AccessibilityValue | undefined;
235
+ 'aria-valuemax'?: number | undefined;
236
+ 'aria-valuemin'?: number | undefined;
237
+ 'aria-valuenow'?: number | undefined;
238
+ 'aria-valuetext'?: string | undefined;
239
+ onAccessibilityAction?: ((event: react_native.AccessibilityActionEvent) => void) | undefined | undefined;
240
+ importantForAccessibility?: ("auto" | "yes" | "no" | "no-hide-descendants") | undefined | undefined;
241
+ 'aria-hidden'?: boolean | undefined | undefined;
242
+ 'aria-modal'?: boolean | undefined | undefined;
243
+ role?: react_native.Role | undefined;
244
+ accessibilityLabelledBy?: string | string[] | undefined | undefined;
245
+ 'aria-labelledby'?: string | undefined | undefined;
246
+ accessibilityLiveRegion?: "none" | "polite" | "assertive" | undefined | undefined;
247
+ 'aria-live'?: ("polite" | "assertive" | "off") | undefined | undefined;
248
+ screenReaderFocusable?: boolean | undefined | undefined;
249
+ accessibilityElementsHidden?: boolean | undefined | undefined;
250
+ accessibilityViewIsModal?: boolean | undefined | undefined;
251
+ onAccessibilityEscape?: (() => void) | undefined | undefined;
252
+ onAccessibilityTap?: (() => void) | undefined | undefined;
253
+ onMagicTap?: (() => void) | undefined | undefined;
254
+ accessibilityIgnoresInvertColors?: boolean | undefined | undefined;
255
+ accessibilityLanguage?: string | undefined | undefined;
256
+ accessibilityShowsLargeContentViewer?: boolean | undefined | undefined;
257
+ accessibilityLargeContentTitle?: string | undefined | undefined;
258
+ accessibilityRespondsToUserInteraction?: boolean | undefined | undefined;
259
+ hitSlop?: number | react_native.Insets | null | undefined;
260
+ needsOffscreenAlphaCompositing?: boolean | undefined | undefined;
261
+ pointerEvents?: "box-none" | "none" | "box-only" | "auto" | undefined | undefined;
262
+ removeClippedSubviews?: boolean | undefined | undefined;
263
+ collapsable?: boolean | undefined | undefined;
264
+ collapsableChildren?: boolean | undefined | undefined;
265
+ onBlur?: null | ((event: react_native.NativeSyntheticEvent<react_native.TargetedEvent>) => void) | undefined | undefined;
266
+ onFocus?: null | ((event: react_native.NativeSyntheticEvent<react_native.TargetedEvent>) => void) | undefined | undefined;
267
+ renderToHardwareTextureAndroid?: boolean | undefined | undefined;
268
+ focusable?: boolean | undefined | undefined;
269
+ tabIndex?: 0 | -1 | undefined | undefined;
270
+ shouldRasterizeIOS?: boolean | undefined | undefined;
271
+ isTVSelectable?: boolean | undefined | undefined;
272
+ hasTVPreferredFocus?: boolean | undefined | undefined;
273
+ tvParallaxShiftDistanceX?: number | undefined | undefined;
274
+ tvParallaxShiftDistanceY?: number | undefined | undefined;
275
+ tvParallaxTiltAngle?: number | undefined | undefined;
276
+ tvParallaxMagnification?: number | undefined | undefined;
277
+ onStartShouldSetResponder?: ((event: react_native.GestureResponderEvent) => boolean) | undefined | undefined;
278
+ onMoveShouldSetResponder?: ((event: react_native.GestureResponderEvent) => boolean) | undefined | undefined;
279
+ onResponderEnd?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
280
+ onResponderGrant?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
281
+ onResponderReject?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
282
+ onResponderMove?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
283
+ onResponderRelease?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
284
+ onResponderStart?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
285
+ onResponderTerminationRequest?: ((event: react_native.GestureResponderEvent) => boolean) | undefined | undefined;
286
+ onResponderTerminate?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
287
+ onStartShouldSetResponderCapture?: ((event: react_native.GestureResponderEvent) => boolean) | undefined | undefined;
288
+ onMoveShouldSetResponderCapture?: ((event: react_native.GestureResponderEvent) => boolean) | undefined | undefined;
289
+ onTouchStart?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
290
+ onTouchMove?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
291
+ onTouchEnd?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
292
+ onTouchCancel?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
293
+ onTouchEndCapture?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
294
+ onPointerEnter?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
295
+ onPointerEnterCapture?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
296
+ onPointerLeave?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
297
+ onPointerLeaveCapture?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
298
+ onPointerMove?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
299
+ onPointerMoveCapture?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
300
+ onPointerCancel?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
301
+ onPointerCancelCapture?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
302
+ onPointerDown?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
303
+ onPointerDownCapture?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
304
+ onPointerUp?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
305
+ onPointerUpCapture?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
306
+ onHoverIn?: null | ((event: react_native.MouseEvent) => void) | undefined | undefined;
307
+ onHoverOut?: null | ((event: react_native.MouseEvent) => void) | undefined | undefined;
308
+ onPress?: null | ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
309
+ onPressIn?: null | ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
310
+ onPressOut?: null | ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
311
+ onLongPress?: null | ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
312
+ cancelable?: null | boolean | undefined | undefined;
313
+ delayHoverIn?: number | null | undefined | undefined;
314
+ delayHoverOut?: number | null | undefined | undefined;
315
+ delayLongPress?: null | number | undefined | undefined;
316
+ pressRetentionOffset?: number | react_native.Insets | null | undefined;
317
+ android_disableSound?: null | boolean | undefined | undefined;
318
+ android_ripple?: react_native.PressableAndroidRippleConfig | null | undefined;
319
+ testOnly_pressed?: null | boolean | undefined | undefined;
320
+ unstable_pressDelay?: number | undefined | undefined;
321
+ asChild?: boolean | undefined;
322
+ animation?: AnimationProp | undefined;
323
+ } & Omit<ViewStyleProps, "id" | "onLayout" | "testID" | "nativeID" | "accessible" | "accessibilityActions" | "accessibilityLabel" | "aria-label" | "accessibilityRole" | "accessibilityState" | "aria-busy" | "aria-checked" | "aria-disabled" | "aria-expanded" | "aria-selected" | "accessibilityHint" | "accessibilityValue" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "onAccessibilityAction" | "importantForAccessibility" | "aria-hidden" | "aria-modal" | "role" | "accessibilityLabelledBy" | "aria-labelledby" | "accessibilityLiveRegion" | "aria-live" | "screenReaderFocusable" | "accessibilityElementsHidden" | "accessibilityViewIsModal" | "onAccessibilityEscape" | "onAccessibilityTap" | "onMagicTap" | "accessibilityIgnoresInvertColors" | "accessibilityLanguage" | "accessibilityShowsLargeContentViewer" | "accessibilityLargeContentTitle" | "accessibilityRespondsToUserInteraction" | "hitSlop" | "needsOffscreenAlphaCompositing" | "pointerEvents" | "removeClippedSubviews" | "collapsable" | "collapsableChildren" | "onBlur" | "onFocus" | "renderToHardwareTextureAndroid" | "focusable" | "tabIndex" | "shouldRasterizeIOS" | "isTVSelectable" | "hasTVPreferredFocus" | "tvParallaxShiftDistanceX" | "tvParallaxShiftDistanceY" | "tvParallaxTiltAngle" | "tvParallaxMagnification" | "onStartShouldSetResponder" | "onMoveShouldSetResponder" | "onResponderEnd" | "onResponderGrant" | "onResponderReject" | "onResponderMove" | "onResponderRelease" | "onResponderStart" | "onResponderTerminationRequest" | "onResponderTerminate" | "onStartShouldSetResponderCapture" | "onMoveShouldSetResponderCapture" | "onTouchStart" | "onTouchMove" | "onTouchEnd" | "onTouchCancel" | "onTouchEndCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerUp" | "onPointerUpCapture" | "onHoverIn" | "onHoverOut" | "onPress" | "onPressIn" | "onPressOut" | "onLongPress" | "cancelable" | "delayHoverIn" | "delayHoverOut" | "delayLongPress" | "pressRetentionOffset" | "android_disableSound" | "android_ripple" | "testOnly_pressed" | "unstable_pressDelay" | "asChild" | "animation" | keyof {
175
324
  variant?: ButtonVariant;
176
325
  size?: ButtonSize;
177
326
  radius?: RadiusKey;
@@ -181,8 +330,8 @@ declare const Button: react.ForwardRefExoticComponent<Omit<PressableFeedbackProp
181
330
  isIconOnly?: boolean;
182
331
  style?: react_native.StyleProp<react_native.ViewStyle> | ((state: react_native.PressableStateCallbackType) => react_native.StyleProp<react_native.ViewStyle>);
183
332
  children?: react.ReactNode;
184
- } & react.RefAttributes<react_native.View>> & {
185
- Label: react.ForwardRefExoticComponent<react_native.TextProps & {
333
+ }> & react.RefAttributes<react_native.View>> & {
334
+ Label: react.ForwardRefExoticComponent<react_native.TextProps & Omit<TextStyleProps, keyof react_native.TextProps> & {
186
335
  children?: react.ReactNode;
187
336
  } & react.RefAttributes<react_native.Text>>;
188
337
  Icon: typeof ButtonIcon;
@@ -2,9 +2,9 @@ import {
2
2
  Button,
3
3
  buttonRecipe,
4
4
  useButton
5
- } from "../../chunk-NQ5WWF77.js";
6
- import "../../chunk-R4HJCQPI.js";
7
- import "../../chunk-X2K2FX3W.js";
5
+ } from "../../chunk-RWLODK55.js";
6
+ import "../../chunk-B3EAZ2CC.js";
7
+ import "../../chunk-XJARE6SC.js";
8
8
  export {
9
9
  Button,
10
10
  buttonRecipe,
@@ -38,13 +38,6 @@ type IconContextValue = {
38
38
  color?: string;
39
39
  };
40
40
 
41
- /**
42
- * What the root does under the finger. `scale-highlight` and `scale-ripple` mount their
43
- * overlay themselves; `scale` mounts none, which is what a root picks when it renders its
44
- * own `<PressableFeedback.Highlight>` to style it (R1: no prop reaches into another
45
- * component's insides).
46
- */
47
- type FeedbackVariant = 'scale-highlight' | 'scale-ripple' | 'scale' | 'none';
48
41
  type AnimationConfig = {
49
42
  scale?: boolean;
50
43
  highlight?: boolean;
@@ -77,10 +70,13 @@ type PressableFeedbackProps = Omit<PressableProps, 'style' | 'children' | 'disab
77
70
  * touch feedback of every `asChild` control.
78
71
  */
79
72
  asChild?: boolean;
80
- feedbackVariant?: FeedbackVariant;
81
73
  animation?: AnimationProp;
82
74
  style?: StyleProp<ViewStyle>;
83
75
  /**
76
+ * The overlays are children, not a prop — `<PressableFeedback.Highlight />` or
77
+ * `<PressableFeedback.Ripple />`, in any order: the root paints them under everything
78
+ * else wherever they sit. The scale is the root's own and needs nothing rendered.
79
+ *
84
80
  * `Pressable`'s function form is dropped on purpose. It exists to hand the press state
85
81
  * to children; here the root above already owns that state and this publishes it
86
82
  * through context, so the function form would be a second, quieter source of truth.
@@ -99,29 +95,93 @@ type SlotAnimation = boolean | {
99
95
  /** How far the overlay goes at full press, 0 to 1. */
100
96
  opacity?: number;
101
97
  };
98
+ /** One ripple wave. Two of them, so a rapid double tap does not cut the one in flight. */
99
+ type RippleWave = {
100
+ /** `0 → 1` as the circle opens. */
101
+ expand: SharedValue<number>;
102
+ /** `0 → 1` as the ink arrives, on its own curve. */
103
+ alpha: SharedValue<number>;
104
+ /** Where the finger landed, in the root's coordinates. */
105
+ origin: SharedValue<{
106
+ x: number;
107
+ y: number;
108
+ }>;
109
+ };
110
+ /**
111
+ * The corner keys an overlay copies off the root. The `Left`/`Right` forms are absent
112
+ * rather than forgotten: R13 bans them, because RN mirrors only the logical ones under RTL.
113
+ */
114
+ type RadiusStyle = Pick<ViewStyle, 'borderRadius' | 'borderStartStartRadius' | 'borderStartEndRadius' | 'borderEndStartRadius' | 'borderEndEndRadius'>;
102
115
  type FeedbackContext = {
116
+ /**
117
+ * The overlay's ink, resolved by the root from its own background.
118
+ *
119
+ * A wash or a wave has to contrast with what it sits on, and only the root knows that —
120
+ * it flattens its own `style` and reads `backgroundColor`, then takes the contrasting
121
+ * side the same way a tint does. Black ink at 10% on a saturated fill is close to
122
+ * invisible, which is the one thing a press indicator cannot be.
123
+ */
124
+ ink: string;
125
+ /**
126
+ * The root's own corners, so an overlay rounds itself to match. `corners` and not
127
+ * `radius`: the ripple already has a radius, and it is a length in points rather than a
128
+ * shape.
129
+ *
130
+ * An absolute fill has square corners and every control here is rounded, so without this
131
+ * both the wash and the wave paint outside the surface at each corner. The overlay
132
+ * carries the clip rather than the root: clipping the root would also cut a child that
133
+ * legitimately overflows — a badge on a button's corner — and that child has nothing to
134
+ * do with the press.
135
+ */
136
+ corners: RadiusStyle;
103
137
  isPressed: boolean;
104
138
  animation: ResolvedAnimation;
105
139
  /** Absent on the static branch, where nothing animates and no worklet is mounted. */
106
140
  progress?: SharedValue<number>;
107
- /**
108
- * Bumped on every press-in. The ripple starts from this rather than from a `useEffect`
109
- * on `isPressed`: a one-shot driven by a boolean depends on React re-rendering between
110
- * the two touch events, and starting it from the event that carries the coordinates is
111
- * both simpler and impossible to miss.
112
- */
113
- pressCount?: SharedValue<number>;
114
- /** Where the finger landed, and how big the root is — the ripple needs both. */
115
- origin?: SharedValue<{
116
- x: number;
117
- y: number;
118
- }>;
141
+ /** How big the root is — what the scale coefficient is computed from. */
119
142
  size?: SharedValue<{
120
143
  width: number;
121
144
  height: number;
122
145
  }>;
146
+ /**
147
+ * The two ripple waves, driven by the **root**.
148
+ *
149
+ * They belong to the root because the root is the touch surface. An overlay carrying its
150
+ * own handlers only hears touches that land on *it* — and it is a sibling of the label,
151
+ * not its parent, so pressing the text of a button would do nothing. Touches bubble to
152
+ * the `Pressable`, which is why the handlers live there and the waves are published down.
153
+ */
154
+ waves?: readonly [RippleWave, RippleWave];
123
155
  };
124
156
 
157
+ /**
158
+ * R13 — React Native mirrors a layout under RTL through the Start/End properties and only
159
+ * those. A props API is exactly where someone writes `paddingLeft` without thinking, so
160
+ * the type removes the temptation instead of leaving it to a review.
161
+ */
162
+ type DirectionalStyleKey = 'left' | 'right' | 'paddingLeft' | 'paddingRight' | 'marginLeft' | 'marginRight' | 'borderLeftWidth' | 'borderRightWidth' | 'borderLeftColor' | 'borderRightColor' | 'borderTopLeftRadius' | 'borderTopRightRadius' | 'borderBottomLeftRadius' | 'borderBottomRightRadius';
163
+ /**
164
+ * `pointerEvents` is a style key *and* a `View` prop. R14 says the component's own prop
165
+ * wins, so it stays the prop it has always been and is not exposed twice — the one name
166
+ * where the two vocabularies collide.
167
+ */
168
+ type ComponentOwnedStyleKey = 'pointerEvents';
169
+ /**
170
+ * The style keys of a node, exposed as props (R14). Not a maintained list: it derives
171
+ * from the React Native type, minus what R13 forbids.
172
+ *
173
+ * ```ts
174
+ * type CardProps = ViewStyleProps & { variant?: CardVariant }
175
+ * ```
176
+ */
177
+ type StyleProps<Style> = Omit<Style, DirectionalStyleKey | ComponentOwnedStyleKey>;
178
+ /** A root, or any slot that renders a view. */
179
+ type ViewStyleProps = StyleProps<ViewStyle>;
180
+ /** A text slot — `color`, `fontSize`, `letterSpacing`… */
181
+ type TextStyleProps = StyleProps<TextStyle>;
182
+ /** An image slot — `resizeMode`, `tintColor`… */
183
+ type ImageStyleProps = StyleProps<ImageStyle>;
184
+
125
185
  /**
126
186
  * A slot is a view or a text node, and a recipe writes one object per slot, so the two
127
187
  * RN style shapes are merged rather than discriminated per slot.
@@ -207,4 +267,4 @@ type Recipe<Slot extends string, Variant extends string, A extends Axes<Slot>> =
207
267
  */
208
268
  declare function createRecipe<Slot extends string, Variant extends string, const A extends Axes<Slot>>(config: RecipeConfig<Slot, Variant, A>): Recipe<Slot, Variant, A>;
209
269
 
210
- export { type AnimationConfig as A, type CompoundVariant as C, type FeedbackContext as F, type IconComponentProps as I, type PressableFeedbackProps as P, type ResolvedAnimation as R, type SlotAnimation as S, type TintArgs as T, type VariantColors as V, type IconContextValue as a, type IconProps as b, type AnimationProp as c, type FeedbackVariant as d, createRecipe as e, type Recipe as f, type ResolveArgs as g, type Axes as h, type RecipeConfig as i, type ResolvedSelection as j, type ResolvedStyles as k, type Selection as l, type SlotStyle as m, type SlotStyles as n, type StateName as o, type States as p, type StyleFn as q, type VariantRole as r, type VariantTokens as s };
270
+ export { type AnimationConfig as A, type CompoundVariant as C, type DirectionalStyleKey as D, type FeedbackContext as F, type IconComponentProps as I, type PressableFeedbackProps as P, type RadiusStyle as R, type SlotAnimation as S, type TintArgs as T, type VariantColors as V, type IconContextValue as a, type IconProps as b, type AnimationProp as c, type ResolvedAnimation as d, type RippleWave as e, createRecipe as f, type Recipe as g, type ResolveArgs as h, type Axes as i, type RecipeConfig as j, type ResolvedSelection as k, type ResolvedStyles as l, type Selection as m, type SlotStyle as n, type SlotStyles as o, type StateName as p, type States as q, type StyleFn as r, type VariantRole as s, type VariantTokens as t, type ImageStyleProps as u, type StyleProps as v, type TextStyleProps as w, type ViewStyleProps as x };