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

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.
@@ -1,5 +1,5 @@
1
- import { Icon, PressableFeedback, childrenToString, createRecipe, createSlotContext } from "./chunk-R4HJCQPI.js";
2
- import { useXAUITheme } from "./chunk-X2K2FX3W.js";
1
+ import { Icon, PressableFeedback, childrenToString, createRecipe, createSlotContext, useStyleProps } from "./chunk-KLHHV4RU.js";
2
+ import { useXAUITheme } from "./chunk-EMXBFHIP.js";
3
3
 
4
4
  // src/components/button/button.context.ts
5
5
  var [ButtonProvider, useButton] = createSlotContext("Button");
@@ -30,15 +30,16 @@ var ButtonLabel = forwardRef(function ButtonLabel2({
30
30
  children,
31
31
  style,
32
32
  numberOfLines = 1,
33
- ...rest
33
+ ...props
34
34
  }, ref) {
35
35
  const {
36
36
  labelStyle
37
37
  } = useButton();
38
+ const [styleProps, rest] = useStyleProps(props);
38
39
  return /* @__PURE__ */jsx2(Text, {
39
40
  ref,
40
41
  numberOfLines,
41
- style: [labelStyle, style],
42
+ style: [labelStyle, styleProps, style],
42
43
  ...rest,
43
44
  children
44
45
  });
@@ -53,23 +54,26 @@ import { jsx as jsx3 } from "react/jsx-runtime";
53
54
  var ROTATION_DURATION = 800;
54
55
  function ButtonSpinner({
55
56
  style,
56
- animation = true
57
+ animation = true,
58
+ ...props
57
59
  }) {
58
60
  const {
59
61
  spinnerStyle
60
62
  } = useButton();
63
+ const [styleProps] = useStyleProps(props);
64
+ const ringStyle = [spinnerStyle, styleProps, style];
61
65
  if (!animation) return /* @__PURE__ */jsx3(View, {
62
- style: [spinnerStyle, style]
66
+ style: ringStyle
63
67
  });
64
68
  return /* @__PURE__ */jsx3(SpinningRing, {
65
- style: [spinnerStyle, style]
69
+ style: ringStyle
66
70
  });
67
71
  }
68
72
  ButtonSpinner.displayName = "XAUI.Button.Spinner";
69
- const _worklet_1014689086859_init_data = {
70
- code: "function chunkNQ5WWF77Js1(){const{angle}=this.__closure;return{transform:[{rotate:angle.value+\"deg\"}]};}",
71
- location: "/home/runner/work/xaui/xaui/packages/native/dist/chunk-NQ5WWF77.js",
72
- sourceMap: "{\"version\":3,\"names\":[\"chunkNQ5WWF77Js1\",\"angle\",\"__closure\",\"transform\",\"rotate\",\"value\"],\"sources\":[\"/home/runner/work/xaui/xaui/packages/native/dist/chunk-NQ5WWF77.js\"],\"mappings\":\"AAsEyC,SAAAA,gBAAMA,CAAA,QAAAC,KAAA,OAAAC,SAAA,CAE3C,MAAO,CAAEC,SAAS,CAAE,CAAC,CAAEC,MAAM,CAAKH,KAAK,CAACI,KAAK,MAAM,CAAC,CAAE,CAAC,CACzD\",\"ignoreList\":[]}"
73
+ const _worklet_17512781929349_init_data = {
74
+ code: "function chunkSKVKAJ5YJs1(){const{angle}=this.__closure;return{transform:[{rotate:angle.value+\"deg\"}]};}",
75
+ location: "/home/runner/work/xaui/xaui/packages/native/dist/chunk-SKVKAJ5Y.js",
76
+ sourceMap: "{\"version\":3,\"names\":[\"chunkSKVKAJ5YJs1\",\"angle\",\"__closure\",\"transform\",\"rotate\",\"value\"],\"sources\":[\"/home/runner/work/xaui/xaui/packages/native/dist/chunk-SKVKAJ5Y.js\"],\"mappings\":\"AA0EyC,SAAAA,gBAAMA,CAAA,QAAAC,KAAA,OAAAC,SAAA,CAE3C,MAAO,CAAEC,SAAS,CAAE,CAAC,CAAEC,MAAM,CAAKH,KAAK,CAACI,KAAK,MAAM,CAAC,CAAE,CAAC,CACzD\",\"ignoreList\":[]}"
73
77
  };
74
78
  function SpinningRing({
75
79
  style
@@ -82,28 +86,28 @@ function SpinningRing({
82
86
  }), -1, false);
83
87
  return () => cancelAnimation(angle);
84
88
  }, [angle]);
85
- const animatedStyle = useAnimatedStyle(function chunkNQ5WWF77Js1Factory({
86
- _worklet_1014689086859_init_data,
89
+ const animatedStyle = useAnimatedStyle(function chunkSKVKAJ5YJs1Factory({
90
+ _worklet_17512781929349_init_data,
87
91
  angle
88
92
  }) {
89
93
  const _e = [new global.Error(), -2, -27];
90
- const chunkNQ5WWF77Js1 = function () {
94
+ const chunkSKVKAJ5YJs1 = function () {
91
95
  return {
92
96
  transform: [{
93
97
  rotate: `${angle.value}deg`
94
98
  }]
95
99
  };
96
100
  };
97
- chunkNQ5WWF77Js1.__closure = {
101
+ chunkSKVKAJ5YJs1.__closure = {
98
102
  angle
99
103
  };
100
- chunkNQ5WWF77Js1.__workletHash = 1014689086859;
101
- chunkNQ5WWF77Js1.__pluginVersion = "0.7.4";
102
- chunkNQ5WWF77Js1.__initData = _worklet_1014689086859_init_data;
103
- chunkNQ5WWF77Js1.__stackDetails = _e;
104
- return chunkNQ5WWF77Js1;
104
+ chunkSKVKAJ5YJs1.__workletHash = 17512781929349;
105
+ chunkSKVKAJ5YJs1.__pluginVersion = "0.7.4";
106
+ chunkSKVKAJ5YJs1.__initData = _worklet_17512781929349_init_data;
107
+ chunkSKVKAJ5YJs1.__stackDetails = _e;
108
+ return chunkSKVKAJ5YJs1;
105
109
  }({
106
- _worklet_1014689086859_init_data,
110
+ _worklet_17512781929349_init_data,
107
111
  angle
108
112
  }), [angle]);
109
113
  return /* @__PURE__ */jsx3(Animated.View, {
@@ -410,17 +414,15 @@ var ButtonRoot = forwardRef2(function Button({
410
414
  isLoading = false,
411
415
  isIconOnly = false,
412
416
  asChild = false,
413
- // `scale` and not `scale-highlight`: the recipe's `pressed` state already paints the
414
- // variant's own pressed colour, and a neutral wash on top would darken it twice.
415
- feedbackVariant = "scale",
416
417
  accessibilityRole = "button",
417
418
  accessibilityState,
418
419
  style,
419
420
  onPressIn,
420
421
  onPressOut,
421
- ...rest
422
+ ...props
422
423
  }, ref) {
423
424
  const theme = useXAUITheme();
425
+ const [styleProps, rest] = useStyleProps(props);
424
426
  const [isPressed, press] = usePressState({
425
427
  onPressIn,
426
428
  onPressOut
@@ -461,7 +463,7 @@ var ButtonRoot = forwardRef2(function Button({
461
463
  isLoading
462
464
  };
463
465
  }, [styles, tint, isDisabled, isLoading]);
464
- const rootStyle = [styles.root, tint?.root, typeof style === "function" ? style({
466
+ const rootStyle = [styles.root, tint?.root, styleProps, typeof style === "function" ? style({
465
467
  pressed: isPressed
466
468
  }) : style];
467
469
  const text = childrenToString(children);
@@ -476,7 +478,6 @@ var ButtonRoot = forwardRef2(function Button({
476
478
  isPressed,
477
479
  isDisabled: isDisabled || isLoading,
478
480
  asChild,
479
- feedbackVariant,
480
481
  accessibilityRole,
481
482
  accessibilityState: {
482
483
  disabled: isDisabled,
@@ -2,11 +2,11 @@
2
2
 
3
3
 
4
4
 
5
- var _chunk6OHFG32Ycjs = require('../../chunk-6OHFG32Y.cjs');
6
- require('../../chunk-E2UGZJBT.cjs');
7
- require('../../chunk-3QBT3Q65.cjs');
5
+ var _chunkCTULMYVIcjs = require('../../chunk-CTULMYVI.cjs');
6
+ require('../../chunk-GZIOB63O.cjs');
7
+ require('../../chunk-FDUI4IAM.cjs');
8
8
 
9
9
 
10
10
 
11
11
 
12
- exports.Button = _chunk6OHFG32Ycjs.Button; exports.buttonRecipe = _chunk6OHFG32Ycjs.buttonRecipe; exports.useButton = _chunk6OHFG32Ycjs.useButton;
12
+ exports.Button = _chunkCTULMYVIcjs.Button; exports.buttonRecipe = _chunkCTULMYVIcjs.buttonRecipe; exports.useButton = _chunkCTULMYVIcjs.useButton;
@@ -2,7 +2,7 @@ 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
 
@@ -15,7 +15,12 @@ type ButtonSlot = 'root' | 'label' | 'icon' | 'spinner';
15
15
  */
16
16
  type ButtonVariant = 'primary' | 'secondary' | 'tertiary' | 'ghost' | 'success' | 'success-soft' | 'warning' | 'warning-soft' | 'danger' | 'danger-soft';
17
17
  type ButtonSize = Size;
18
- type ButtonProps = Omit<PressableFeedbackProps, 'isPressed' | 'isDisabled' | 'style' | 'children'> & {
18
+ /**
19
+ * What the `Button` itself understands. R14 — a name in here is the component's, so the
20
+ * style prop that shares it is not exposed: `size` is the control's scale and never
21
+ * `ViewStyle`'s, and `color` is R7's tint rather than `TextStyle`'s.
22
+ */
23
+ type ButtonOwnProps = {
19
24
  variant?: ButtonVariant;
20
25
  /** Height, padding, gap, radius and type. Never width. */
21
26
  size?: ButtonSize;
@@ -37,19 +42,34 @@ type ButtonProps = Omit<PressableFeedbackProps, 'isPressed' | 'isDisabled' | 'st
37
42
  style?: StyleProp<ViewStyle> | ((state: PressableStateCallbackType) => StyleProp<ViewStyle>);
38
43
  children?: ReactNode;
39
44
  };
40
- type ButtonLabelProps = TextProps & {
45
+ type ButtonBehaviourProps = Omit<PressableFeedbackProps, 'isPressed' | 'isDisabled' | 'style' | 'children'>;
46
+ /**
47
+ * R14 — the button's own props, the press behaviour it forwards, and every `ViewStyle`
48
+ * key the two do not already claim. `height` therefore beats the height `size` chose and
49
+ * `width="100%"` is what replaced `fullWidth`, both because the style props resolve after
50
+ * the recipe. That is the escape hatch, not the normal path.
51
+ */
52
+ type ButtonProps = ButtonOwnProps & ButtonBehaviourProps & Omit<ViewStyleProps, keyof ButtonOwnProps | keyof ButtonBehaviourProps>;
53
+ /** `Text`'s own props win over the `TextStyle` keys of the same name (R14). */
54
+ type ButtonLabelProps = TextProps & Omit<TextStyleProps, keyof TextProps> & {
41
55
  children?: ReactNode;
42
56
  };
43
57
  /**
44
58
  * `Icon`'s three forms, plus the `style` every slot carries (R2). `size` and `color`
45
59
  * default to what the root resolved; passing either wins over it.
60
+ *
61
+ * No style props (R14), deliberately: two of the three forms have no view of our own to
62
+ * style — `as` hands its props to a third-party component and the children form clones
63
+ * the caller's element — so a `padding` here would apply in one form out of three. `size`
64
+ * and `color` are the escape hatch, as they already are for `style`.
46
65
  */
47
66
  type ButtonIconProps = IconProps;
48
- type ButtonSpinnerProps = {
67
+ type ButtonSpinnerOwnProps = {
49
68
  style?: StyleProp<ViewStyle>;
50
69
  /** `false` stops the rotation. The ring stays, so the button does not change size. */
51
70
  animation?: boolean;
52
71
  };
72
+ type ButtonSpinnerProps = ButtonSpinnerOwnProps & Omit<ViewStyleProps, keyof ButtonSpinnerOwnProps>;
53
73
  /**
54
74
  * R5 — resolved styles, not props for a slot to resolve a second time. Each entry is the
55
75
  * cached `StyleSheet` reference with the uncached tint pass layered over it, so a slot
@@ -95,7 +115,7 @@ declare namespace ButtonIcon {
95
115
  * and its variant with nothing to pass. P3 extracts it into the standalone `Spinner`, and
96
116
  * this slot becomes its call site.
97
117
  */
98
- declare function ButtonSpinner({ style, animation }: ButtonSpinnerProps): react.JSX.Element;
118
+ declare function ButtonSpinner({ style, animation, ...props }: ButtonSpinnerProps): react.JSX.Element;
99
119
  declare namespace ButtonSpinner {
100
120
  var displayName: string;
101
121
  }
@@ -171,7 +191,126 @@ declare const buttonRecipe: Recipe<"label" | "root" | "icon" | "spinner", Button
171
191
  };
172
192
  }>;
173
193
 
174
- declare const Button: react.ForwardRefExoticComponent<Omit<PressableFeedbackProps, "style" | "children" | "isPressed" | "isDisabled"> & {
194
+ declare const Button: react.ForwardRefExoticComponent<{
195
+ variant?: ButtonVariant;
196
+ size?: ButtonSize;
197
+ radius?: RadiusKey;
198
+ color?: string;
199
+ isDisabled?: boolean;
200
+ isLoading?: boolean;
201
+ isIconOnly?: boolean;
202
+ style?: react_native.StyleProp<react_native.ViewStyle> | ((state: react_native.PressableStateCallbackType) => react_native.StyleProp<react_native.ViewStyle>);
203
+ children?: react.ReactNode;
204
+ } & {
205
+ id?: string | undefined | undefined;
206
+ onLayout?: ((event: react_native.LayoutChangeEvent) => void) | undefined | undefined;
207
+ testID?: string | undefined | undefined;
208
+ nativeID?: string | undefined | undefined;
209
+ accessible?: boolean | undefined | undefined;
210
+ accessibilityActions?: readonly Readonly<{
211
+ name: react_native.AccessibilityActionName | string;
212
+ label?: string | undefined;
213
+ }>[] | undefined;
214
+ accessibilityLabel?: string | undefined | undefined;
215
+ 'aria-label'?: string | undefined | undefined;
216
+ accessibilityRole?: react_native.AccessibilityRole | undefined;
217
+ accessibilityState?: react_native.AccessibilityState | undefined;
218
+ 'aria-busy'?: boolean | undefined | undefined;
219
+ 'aria-checked'?: boolean | "mixed" | undefined | undefined;
220
+ 'aria-disabled'?: boolean | undefined | undefined;
221
+ 'aria-expanded'?: boolean | undefined | undefined;
222
+ 'aria-selected'?: boolean | undefined | undefined;
223
+ accessibilityHint?: string | undefined | undefined;
224
+ accessibilityValue?: react_native.AccessibilityValue | undefined;
225
+ 'aria-valuemax'?: number | undefined;
226
+ 'aria-valuemin'?: number | undefined;
227
+ 'aria-valuenow'?: number | undefined;
228
+ 'aria-valuetext'?: string | undefined;
229
+ onAccessibilityAction?: ((event: react_native.AccessibilityActionEvent) => void) | undefined | undefined;
230
+ importantForAccessibility?: ("auto" | "yes" | "no" | "no-hide-descendants") | undefined | undefined;
231
+ 'aria-hidden'?: boolean | undefined | undefined;
232
+ 'aria-modal'?: boolean | undefined | undefined;
233
+ role?: react_native.Role | undefined;
234
+ accessibilityLabelledBy?: string | string[] | undefined | undefined;
235
+ 'aria-labelledby'?: string | undefined | undefined;
236
+ accessibilityLiveRegion?: "none" | "polite" | "assertive" | undefined | undefined;
237
+ 'aria-live'?: ("polite" | "assertive" | "off") | undefined | undefined;
238
+ screenReaderFocusable?: boolean | undefined | undefined;
239
+ accessibilityElementsHidden?: boolean | undefined | undefined;
240
+ accessibilityViewIsModal?: boolean | undefined | undefined;
241
+ onAccessibilityEscape?: (() => void) | undefined | undefined;
242
+ onAccessibilityTap?: (() => void) | undefined | undefined;
243
+ onMagicTap?: (() => void) | undefined | undefined;
244
+ accessibilityIgnoresInvertColors?: boolean | undefined | undefined;
245
+ accessibilityLanguage?: string | undefined | undefined;
246
+ accessibilityShowsLargeContentViewer?: boolean | undefined | undefined;
247
+ accessibilityLargeContentTitle?: string | undefined | undefined;
248
+ accessibilityRespondsToUserInteraction?: boolean | undefined | undefined;
249
+ hitSlop?: number | react_native.Insets | null | undefined;
250
+ needsOffscreenAlphaCompositing?: boolean | undefined | undefined;
251
+ pointerEvents?: "box-none" | "none" | "box-only" | "auto" | undefined | undefined;
252
+ removeClippedSubviews?: boolean | undefined | undefined;
253
+ collapsable?: boolean | undefined | undefined;
254
+ collapsableChildren?: boolean | undefined | undefined;
255
+ onBlur?: null | ((event: react_native.NativeSyntheticEvent<react_native.TargetedEvent>) => void) | undefined | undefined;
256
+ onFocus?: null | ((event: react_native.NativeSyntheticEvent<react_native.TargetedEvent>) => void) | undefined | undefined;
257
+ renderToHardwareTextureAndroid?: boolean | undefined | undefined;
258
+ focusable?: boolean | undefined | undefined;
259
+ tabIndex?: 0 | -1 | undefined | undefined;
260
+ shouldRasterizeIOS?: boolean | undefined | undefined;
261
+ isTVSelectable?: boolean | undefined | undefined;
262
+ hasTVPreferredFocus?: boolean | undefined | undefined;
263
+ tvParallaxShiftDistanceX?: number | undefined | undefined;
264
+ tvParallaxShiftDistanceY?: number | undefined | undefined;
265
+ tvParallaxTiltAngle?: number | undefined | undefined;
266
+ tvParallaxMagnification?: number | undefined | undefined;
267
+ onStartShouldSetResponder?: ((event: react_native.GestureResponderEvent) => boolean) | undefined | undefined;
268
+ onMoveShouldSetResponder?: ((event: react_native.GestureResponderEvent) => boolean) | undefined | undefined;
269
+ onResponderEnd?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
270
+ onResponderGrant?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
271
+ onResponderReject?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
272
+ onResponderMove?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
273
+ onResponderRelease?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
274
+ onResponderStart?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
275
+ onResponderTerminationRequest?: ((event: react_native.GestureResponderEvent) => boolean) | undefined | undefined;
276
+ onResponderTerminate?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
277
+ onStartShouldSetResponderCapture?: ((event: react_native.GestureResponderEvent) => boolean) | undefined | undefined;
278
+ onMoveShouldSetResponderCapture?: ((event: react_native.GestureResponderEvent) => boolean) | undefined | undefined;
279
+ onTouchStart?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
280
+ onTouchMove?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
281
+ onTouchEnd?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
282
+ onTouchCancel?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
283
+ onTouchEndCapture?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
284
+ onPointerEnter?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
285
+ onPointerEnterCapture?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
286
+ onPointerLeave?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
287
+ onPointerLeaveCapture?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
288
+ onPointerMove?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
289
+ onPointerMoveCapture?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
290
+ onPointerCancel?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
291
+ onPointerCancelCapture?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
292
+ onPointerDown?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
293
+ onPointerDownCapture?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
294
+ onPointerUp?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
295
+ onPointerUpCapture?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
296
+ onHoverIn?: null | ((event: react_native.MouseEvent) => void) | undefined | undefined;
297
+ onHoverOut?: null | ((event: react_native.MouseEvent) => void) | undefined | undefined;
298
+ onPress?: null | ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
299
+ onPressIn?: null | ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
300
+ onPressOut?: null | ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
301
+ onLongPress?: null | ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
302
+ cancelable?: null | boolean | undefined | undefined;
303
+ delayHoverIn?: number | null | undefined | undefined;
304
+ delayHoverOut?: number | null | undefined | undefined;
305
+ delayLongPress?: null | number | undefined | undefined;
306
+ pressRetentionOffset?: number | react_native.Insets | null | undefined;
307
+ android_disableSound?: null | boolean | undefined | undefined;
308
+ android_ripple?: react_native.PressableAndroidRippleConfig | null | undefined;
309
+ testOnly_pressed?: null | boolean | undefined | undefined;
310
+ unstable_pressDelay?: number | undefined | undefined;
311
+ asChild?: boolean | undefined;
312
+ animation?: AnimationProp | undefined;
313
+ } & 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
314
  variant?: ButtonVariant;
176
315
  size?: ButtonSize;
177
316
  radius?: RadiusKey;
@@ -181,8 +320,8 @@ declare const Button: react.ForwardRefExoticComponent<Omit<PressableFeedbackProp
181
320
  isIconOnly?: boolean;
182
321
  style?: react_native.StyleProp<react_native.ViewStyle> | ((state: react_native.PressableStateCallbackType) => react_native.StyleProp<react_native.ViewStyle>);
183
322
  children?: react.ReactNode;
184
- } & react.RefAttributes<react_native.View>> & {
185
- Label: react.ForwardRefExoticComponent<react_native.TextProps & {
323
+ }> & react.RefAttributes<react_native.View>> & {
324
+ Label: react.ForwardRefExoticComponent<react_native.TextProps & Omit<TextStyleProps, keyof react_native.TextProps> & {
186
325
  children?: react.ReactNode;
187
326
  } & react.RefAttributes<react_native.Text>>;
188
327
  Icon: typeof ButtonIcon;
@@ -2,7 +2,7 @@ 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
 
@@ -15,7 +15,12 @@ type ButtonSlot = 'root' | 'label' | 'icon' | 'spinner';
15
15
  */
16
16
  type ButtonVariant = 'primary' | 'secondary' | 'tertiary' | 'ghost' | 'success' | 'success-soft' | 'warning' | 'warning-soft' | 'danger' | 'danger-soft';
17
17
  type ButtonSize = Size;
18
- type ButtonProps = Omit<PressableFeedbackProps, 'isPressed' | 'isDisabled' | 'style' | 'children'> & {
18
+ /**
19
+ * What the `Button` itself understands. R14 — a name in here is the component's, so the
20
+ * style prop that shares it is not exposed: `size` is the control's scale and never
21
+ * `ViewStyle`'s, and `color` is R7's tint rather than `TextStyle`'s.
22
+ */
23
+ type ButtonOwnProps = {
19
24
  variant?: ButtonVariant;
20
25
  /** Height, padding, gap, radius and type. Never width. */
21
26
  size?: ButtonSize;
@@ -37,19 +42,34 @@ type ButtonProps = Omit<PressableFeedbackProps, 'isPressed' | 'isDisabled' | 'st
37
42
  style?: StyleProp<ViewStyle> | ((state: PressableStateCallbackType) => StyleProp<ViewStyle>);
38
43
  children?: ReactNode;
39
44
  };
40
- type ButtonLabelProps = TextProps & {
45
+ type ButtonBehaviourProps = Omit<PressableFeedbackProps, 'isPressed' | 'isDisabled' | 'style' | 'children'>;
46
+ /**
47
+ * R14 — the button's own props, the press behaviour it forwards, and every `ViewStyle`
48
+ * key the two do not already claim. `height` therefore beats the height `size` chose and
49
+ * `width="100%"` is what replaced `fullWidth`, both because the style props resolve after
50
+ * the recipe. That is the escape hatch, not the normal path.
51
+ */
52
+ type ButtonProps = ButtonOwnProps & ButtonBehaviourProps & Omit<ViewStyleProps, keyof ButtonOwnProps | keyof ButtonBehaviourProps>;
53
+ /** `Text`'s own props win over the `TextStyle` keys of the same name (R14). */
54
+ type ButtonLabelProps = TextProps & Omit<TextStyleProps, keyof TextProps> & {
41
55
  children?: ReactNode;
42
56
  };
43
57
  /**
44
58
  * `Icon`'s three forms, plus the `style` every slot carries (R2). `size` and `color`
45
59
  * default to what the root resolved; passing either wins over it.
60
+ *
61
+ * No style props (R14), deliberately: two of the three forms have no view of our own to
62
+ * style — `as` hands its props to a third-party component and the children form clones
63
+ * the caller's element — so a `padding` here would apply in one form out of three. `size`
64
+ * and `color` are the escape hatch, as they already are for `style`.
46
65
  */
47
66
  type ButtonIconProps = IconProps;
48
- type ButtonSpinnerProps = {
67
+ type ButtonSpinnerOwnProps = {
49
68
  style?: StyleProp<ViewStyle>;
50
69
  /** `false` stops the rotation. The ring stays, so the button does not change size. */
51
70
  animation?: boolean;
52
71
  };
72
+ type ButtonSpinnerProps = ButtonSpinnerOwnProps & Omit<ViewStyleProps, keyof ButtonSpinnerOwnProps>;
53
73
  /**
54
74
  * R5 — resolved styles, not props for a slot to resolve a second time. Each entry is the
55
75
  * cached `StyleSheet` reference with the uncached tint pass layered over it, so a slot
@@ -95,7 +115,7 @@ declare namespace ButtonIcon {
95
115
  * and its variant with nothing to pass. P3 extracts it into the standalone `Spinner`, and
96
116
  * this slot becomes its call site.
97
117
  */
98
- declare function ButtonSpinner({ style, animation }: ButtonSpinnerProps): react.JSX.Element;
118
+ declare function ButtonSpinner({ style, animation, ...props }: ButtonSpinnerProps): react.JSX.Element;
99
119
  declare namespace ButtonSpinner {
100
120
  var displayName: string;
101
121
  }
@@ -171,7 +191,126 @@ declare const buttonRecipe: Recipe<"label" | "root" | "icon" | "spinner", Button
171
191
  };
172
192
  }>;
173
193
 
174
- declare const Button: react.ForwardRefExoticComponent<Omit<PressableFeedbackProps, "style" | "children" | "isPressed" | "isDisabled"> & {
194
+ declare const Button: react.ForwardRefExoticComponent<{
195
+ variant?: ButtonVariant;
196
+ size?: ButtonSize;
197
+ radius?: RadiusKey;
198
+ color?: string;
199
+ isDisabled?: boolean;
200
+ isLoading?: boolean;
201
+ isIconOnly?: boolean;
202
+ style?: react_native.StyleProp<react_native.ViewStyle> | ((state: react_native.PressableStateCallbackType) => react_native.StyleProp<react_native.ViewStyle>);
203
+ children?: react.ReactNode;
204
+ } & {
205
+ id?: string | undefined | undefined;
206
+ onLayout?: ((event: react_native.LayoutChangeEvent) => void) | undefined | undefined;
207
+ testID?: string | undefined | undefined;
208
+ nativeID?: string | undefined | undefined;
209
+ accessible?: boolean | undefined | undefined;
210
+ accessibilityActions?: readonly Readonly<{
211
+ name: react_native.AccessibilityActionName | string;
212
+ label?: string | undefined;
213
+ }>[] | undefined;
214
+ accessibilityLabel?: string | undefined | undefined;
215
+ 'aria-label'?: string | undefined | undefined;
216
+ accessibilityRole?: react_native.AccessibilityRole | undefined;
217
+ accessibilityState?: react_native.AccessibilityState | undefined;
218
+ 'aria-busy'?: boolean | undefined | undefined;
219
+ 'aria-checked'?: boolean | "mixed" | undefined | undefined;
220
+ 'aria-disabled'?: boolean | undefined | undefined;
221
+ 'aria-expanded'?: boolean | undefined | undefined;
222
+ 'aria-selected'?: boolean | undefined | undefined;
223
+ accessibilityHint?: string | undefined | undefined;
224
+ accessibilityValue?: react_native.AccessibilityValue | undefined;
225
+ 'aria-valuemax'?: number | undefined;
226
+ 'aria-valuemin'?: number | undefined;
227
+ 'aria-valuenow'?: number | undefined;
228
+ 'aria-valuetext'?: string | undefined;
229
+ onAccessibilityAction?: ((event: react_native.AccessibilityActionEvent) => void) | undefined | undefined;
230
+ importantForAccessibility?: ("auto" | "yes" | "no" | "no-hide-descendants") | undefined | undefined;
231
+ 'aria-hidden'?: boolean | undefined | undefined;
232
+ 'aria-modal'?: boolean | undefined | undefined;
233
+ role?: react_native.Role | undefined;
234
+ accessibilityLabelledBy?: string | string[] | undefined | undefined;
235
+ 'aria-labelledby'?: string | undefined | undefined;
236
+ accessibilityLiveRegion?: "none" | "polite" | "assertive" | undefined | undefined;
237
+ 'aria-live'?: ("polite" | "assertive" | "off") | undefined | undefined;
238
+ screenReaderFocusable?: boolean | undefined | undefined;
239
+ accessibilityElementsHidden?: boolean | undefined | undefined;
240
+ accessibilityViewIsModal?: boolean | undefined | undefined;
241
+ onAccessibilityEscape?: (() => void) | undefined | undefined;
242
+ onAccessibilityTap?: (() => void) | undefined | undefined;
243
+ onMagicTap?: (() => void) | undefined | undefined;
244
+ accessibilityIgnoresInvertColors?: boolean | undefined | undefined;
245
+ accessibilityLanguage?: string | undefined | undefined;
246
+ accessibilityShowsLargeContentViewer?: boolean | undefined | undefined;
247
+ accessibilityLargeContentTitle?: string | undefined | undefined;
248
+ accessibilityRespondsToUserInteraction?: boolean | undefined | undefined;
249
+ hitSlop?: number | react_native.Insets | null | undefined;
250
+ needsOffscreenAlphaCompositing?: boolean | undefined | undefined;
251
+ pointerEvents?: "box-none" | "none" | "box-only" | "auto" | undefined | undefined;
252
+ removeClippedSubviews?: boolean | undefined | undefined;
253
+ collapsable?: boolean | undefined | undefined;
254
+ collapsableChildren?: boolean | undefined | undefined;
255
+ onBlur?: null | ((event: react_native.NativeSyntheticEvent<react_native.TargetedEvent>) => void) | undefined | undefined;
256
+ onFocus?: null | ((event: react_native.NativeSyntheticEvent<react_native.TargetedEvent>) => void) | undefined | undefined;
257
+ renderToHardwareTextureAndroid?: boolean | undefined | undefined;
258
+ focusable?: boolean | undefined | undefined;
259
+ tabIndex?: 0 | -1 | undefined | undefined;
260
+ shouldRasterizeIOS?: boolean | undefined | undefined;
261
+ isTVSelectable?: boolean | undefined | undefined;
262
+ hasTVPreferredFocus?: boolean | undefined | undefined;
263
+ tvParallaxShiftDistanceX?: number | undefined | undefined;
264
+ tvParallaxShiftDistanceY?: number | undefined | undefined;
265
+ tvParallaxTiltAngle?: number | undefined | undefined;
266
+ tvParallaxMagnification?: number | undefined | undefined;
267
+ onStartShouldSetResponder?: ((event: react_native.GestureResponderEvent) => boolean) | undefined | undefined;
268
+ onMoveShouldSetResponder?: ((event: react_native.GestureResponderEvent) => boolean) | undefined | undefined;
269
+ onResponderEnd?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
270
+ onResponderGrant?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
271
+ onResponderReject?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
272
+ onResponderMove?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
273
+ onResponderRelease?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
274
+ onResponderStart?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
275
+ onResponderTerminationRequest?: ((event: react_native.GestureResponderEvent) => boolean) | undefined | undefined;
276
+ onResponderTerminate?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
277
+ onStartShouldSetResponderCapture?: ((event: react_native.GestureResponderEvent) => boolean) | undefined | undefined;
278
+ onMoveShouldSetResponderCapture?: ((event: react_native.GestureResponderEvent) => boolean) | undefined | undefined;
279
+ onTouchStart?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
280
+ onTouchMove?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
281
+ onTouchEnd?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
282
+ onTouchCancel?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
283
+ onTouchEndCapture?: ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
284
+ onPointerEnter?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
285
+ onPointerEnterCapture?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
286
+ onPointerLeave?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
287
+ onPointerLeaveCapture?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
288
+ onPointerMove?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
289
+ onPointerMoveCapture?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
290
+ onPointerCancel?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
291
+ onPointerCancelCapture?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
292
+ onPointerDown?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
293
+ onPointerDownCapture?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
294
+ onPointerUp?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
295
+ onPointerUpCapture?: ((event: react_native.PointerEvent) => void) | undefined | undefined;
296
+ onHoverIn?: null | ((event: react_native.MouseEvent) => void) | undefined | undefined;
297
+ onHoverOut?: null | ((event: react_native.MouseEvent) => void) | undefined | undefined;
298
+ onPress?: null | ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
299
+ onPressIn?: null | ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
300
+ onPressOut?: null | ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
301
+ onLongPress?: null | ((event: react_native.GestureResponderEvent) => void) | undefined | undefined;
302
+ cancelable?: null | boolean | undefined | undefined;
303
+ delayHoverIn?: number | null | undefined | undefined;
304
+ delayHoverOut?: number | null | undefined | undefined;
305
+ delayLongPress?: null | number | undefined | undefined;
306
+ pressRetentionOffset?: number | react_native.Insets | null | undefined;
307
+ android_disableSound?: null | boolean | undefined | undefined;
308
+ android_ripple?: react_native.PressableAndroidRippleConfig | null | undefined;
309
+ testOnly_pressed?: null | boolean | undefined | undefined;
310
+ unstable_pressDelay?: number | undefined | undefined;
311
+ asChild?: boolean | undefined;
312
+ animation?: AnimationProp | undefined;
313
+ } & 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
314
  variant?: ButtonVariant;
176
315
  size?: ButtonSize;
177
316
  radius?: RadiusKey;
@@ -181,8 +320,8 @@ declare const Button: react.ForwardRefExoticComponent<Omit<PressableFeedbackProp
181
320
  isIconOnly?: boolean;
182
321
  style?: react_native.StyleProp<react_native.ViewStyle> | ((state: react_native.PressableStateCallbackType) => react_native.StyleProp<react_native.ViewStyle>);
183
322
  children?: react.ReactNode;
184
- } & react.RefAttributes<react_native.View>> & {
185
- Label: react.ForwardRefExoticComponent<react_native.TextProps & {
323
+ }> & react.RefAttributes<react_native.View>> & {
324
+ Label: react.ForwardRefExoticComponent<react_native.TextProps & Omit<TextStyleProps, keyof react_native.TextProps> & {
186
325
  children?: react.ReactNode;
187
326
  } & react.RefAttributes<react_native.Text>>;
188
327
  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-SKVKAJ5Y.js";
6
+ import "../../chunk-KLHHV4RU.js";
7
+ import "../../chunk-EMXBFHIP.js";
8
8
  export {
9
9
  Button,
10
10
  buttonRecipe,