@butternutbox/pawprint-native 0.0.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. package/.turbo/turbo-build.log +15 -15
  2. package/CHANGELOG.md +30 -0
  3. package/COMPONENT_GUIDELINES.md +111 -4
  4. package/dist/index.cjs +12413 -1459
  5. package/dist/index.cjs.map +1 -1
  6. package/dist/index.d.cts +1111 -13
  7. package/dist/index.d.ts +1111 -13
  8. package/dist/index.js +12365 -1457
  9. package/dist/index.js.map +1 -1
  10. package/package.json +29 -11
  11. package/src/__mocks__/asset-stub.ts +1 -0
  12. package/src/__mocks__/emotion-native.tsx +18 -0
  13. package/src/__mocks__/react-native-gesture-handler.tsx +41 -0
  14. package/src/__mocks__/react-native-reanimated.tsx +79 -0
  15. package/src/__mocks__/react-native-safe-area-context.tsx +6 -0
  16. package/src/__mocks__/react-native-svg.tsx +27 -0
  17. package/src/__mocks__/react-native-worklets.tsx +11 -0
  18. package/src/__mocks__/react-native.tsx +338 -0
  19. package/src/__mocks__/rn-primitives/avatar.tsx +24 -0
  20. package/src/__mocks__/rn-primitives/checkbox.tsx +19 -0
  21. package/src/__mocks__/rn-primitives/select.tsx +116 -0
  22. package/src/__mocks__/rn-primitives/slider.tsx +40 -0
  23. package/src/__mocks__/rn-primitives/slot.tsx +30 -0
  24. package/src/__mocks__/rn-primitives/switch.tsx +24 -0
  25. package/src/__mocks__/rn-primitives/toggle.tsx +16 -0
  26. package/src/components/atoms/Avatar/Avatar.stories.tsx +57 -49
  27. package/src/components/atoms/Avatar/Avatar.test.tsx +269 -0
  28. package/src/components/atoms/Avatar/Avatar.tsx +68 -22
  29. package/src/components/atoms/Avatar/index.ts +1 -6
  30. package/src/components/atoms/Badge/Badge.stories.tsx +5 -29
  31. package/src/components/atoms/Badge/Badge.test.tsx +90 -0
  32. package/src/components/atoms/Button/Button.test.tsx +123 -0
  33. package/src/components/atoms/Button/Button.tsx +1 -1
  34. package/src/components/atoms/CarouselControls/CarouselControls.stories.tsx +217 -0
  35. package/src/components/atoms/CarouselControls/CarouselControls.tsx +127 -0
  36. package/src/components/atoms/CarouselControls/index.ts +2 -0
  37. package/src/components/atoms/Hint/Hint.test.tsx +36 -0
  38. package/src/components/atoms/Icon/Icon.test.tsx +98 -0
  39. package/src/components/atoms/Icon/Icon.tsx +5 -1
  40. package/src/components/atoms/IconButton/IconButton.test.tsx +101 -0
  41. package/src/components/atoms/Illustration/Illustration.stories.tsx +2 -2
  42. package/src/components/atoms/Illustration/Illustration.test.tsx +55 -0
  43. package/src/components/atoms/Illustration/Illustration.tsx +3 -3
  44. package/src/components/atoms/Input/Input.stories.tsx +129 -86
  45. package/src/components/atoms/Input/Input.test.tsx +306 -0
  46. package/src/components/atoms/Input/Input.tsx +9 -1
  47. package/src/components/atoms/Input/InputField.tsx +226 -74
  48. package/src/components/atoms/Link/Link.test.tsx +89 -0
  49. package/src/components/atoms/Link/Link.tsx +7 -6
  50. package/src/components/atoms/Logo/Logo.registry.ts +30 -5
  51. package/src/components/atoms/Logo/Logo.stories.tsx +108 -0
  52. package/src/components/atoms/Logo/Logo.test.tsx +56 -0
  53. package/src/components/atoms/Logo/assets/BCorp.tsx +113 -0
  54. package/src/components/atoms/Logo/assets/ButternutFavicon.tsx +33 -0
  55. package/src/components/atoms/Logo/assets/ButternutPrimary.tsx +294 -0
  56. package/src/components/atoms/Logo/assets/ButternutTabbedBottom.tsx +294 -0
  57. package/src/components/atoms/Logo/assets/ButternutTabbedTop.tsx +294 -0
  58. package/src/components/atoms/Logo/assets/ButternutWordmark.tsx +274 -0
  59. package/src/components/atoms/Logo/assets/PsiBufetFavicon.tsx +45 -0
  60. package/src/components/atoms/Logo/assets/PsiBufetPrimary.tsx +218 -0
  61. package/src/components/atoms/Logo/assets/PsiBufetTabbedBottom.tsx +218 -0
  62. package/src/components/atoms/Logo/assets/PsiBufetTabbedTop.tsx +218 -0
  63. package/src/components/atoms/Logo/assets/PsiBufetWordmark.tsx +195 -0
  64. package/src/components/atoms/Logo/assets/index.ts +11 -0
  65. package/src/components/atoms/NumberInput/NumberInput.stories.tsx +183 -0
  66. package/src/components/atoms/NumberInput/NumberInput.test.tsx +261 -0
  67. package/src/components/atoms/NumberInput/NumberInput.tsx +129 -0
  68. package/src/components/atoms/NumberInput/NumberInputField.tsx +77 -0
  69. package/src/components/atoms/NumberInput/index.ts +4 -0
  70. package/src/components/atoms/Spinner/Spinner.test.tsx +46 -0
  71. package/src/components/atoms/Spinner/Spinner.tsx +14 -5
  72. package/src/components/atoms/Switch/Switch.test.tsx +92 -0
  73. package/src/components/atoms/Switch/Switch.tsx +28 -17
  74. package/src/components/atoms/Tag/Tag.test.tsx +70 -0
  75. package/src/components/atoms/TextArea/TextArea.stories.tsx +303 -0
  76. package/src/components/atoms/TextArea/TextArea.test.tsx +416 -0
  77. package/src/components/atoms/TextArea/TextArea.tsx +171 -0
  78. package/src/components/atoms/TextArea/TextAreaField.tsx +304 -0
  79. package/src/components/atoms/TextArea/TextAreaLabel.tsx +103 -0
  80. package/src/components/atoms/TextArea/index.ts +6 -0
  81. package/src/components/atoms/Typography/Typography.test.tsx +94 -0
  82. package/src/components/atoms/index.ts +3 -0
  83. package/src/components/molecules/Accordion/Accordion.stories.tsx +177 -0
  84. package/src/components/molecules/Accordion/Accordion.test.tsx +185 -0
  85. package/src/components/molecules/Accordion/Accordion.tsx +284 -0
  86. package/src/components/molecules/Accordion/index.ts +6 -0
  87. package/src/components/molecules/Animated/Animated.stories.tsx +254 -0
  88. package/src/components/molecules/Animated/Animated.tsx +283 -0
  89. package/src/components/molecules/Animated/index.ts +10 -0
  90. package/src/components/molecules/ButtonDock/ButtonDock.stories.tsx +44 -25
  91. package/src/components/molecules/ButtonDock/ButtonDock.test.tsx +83 -0
  92. package/src/components/molecules/ButtonDock/ButtonDock.tsx +16 -13
  93. package/src/components/molecules/ButtonGroup/ButtonGroup.stories.tsx +48 -29
  94. package/src/components/molecules/ButtonGroup/ButtonGroup.test.tsx +73 -0
  95. package/src/components/molecules/ButtonGroup/ButtonGroup.tsx +25 -3
  96. package/src/components/molecules/Checkbox/Checkbox.stories.tsx +72 -0
  97. package/src/components/molecules/Checkbox/Checkbox.test.tsx +117 -0
  98. package/src/components/molecules/Checkbox/Checkbox.tsx +101 -95
  99. package/src/components/molecules/CopyField/CopyField.stories.tsx +313 -0
  100. package/src/components/molecules/CopyField/CopyField.test.tsx +431 -0
  101. package/src/components/molecules/CopyField/CopyField.tsx +156 -0
  102. package/src/components/molecules/CopyField/CopyFieldInput.tsx +127 -0
  103. package/src/components/molecules/CopyField/hooks/index.ts +1 -0
  104. package/src/components/molecules/CopyField/hooks/useCopyField.ts +25 -0
  105. package/src/components/molecules/CopyField/index.ts +4 -0
  106. package/src/components/molecules/DatePicker/DatePicker.stories.tsx +298 -0
  107. package/src/components/molecules/DatePicker/DatePicker.test.tsx +201 -0
  108. package/src/components/molecules/DatePicker/DatePicker.tsx +590 -0
  109. package/src/components/molecules/DatePicker/index.ts +2 -0
  110. package/src/components/molecules/Drawer/Drawer.stories.tsx +285 -0
  111. package/src/components/molecules/Drawer/Drawer.test.tsx +180 -0
  112. package/src/components/molecules/Drawer/Drawer.tsx +187 -0
  113. package/src/components/molecules/Drawer/DrawerBody.tsx +80 -0
  114. package/src/components/molecules/Drawer/DrawerClose.tsx +76 -0
  115. package/src/components/molecules/Drawer/DrawerContent.tsx +339 -0
  116. package/src/components/molecules/Drawer/DrawerContext.ts +19 -0
  117. package/src/components/molecules/Drawer/DrawerDescription.tsx +31 -0
  118. package/src/components/molecules/Drawer/DrawerDragContext.ts +11 -0
  119. package/src/components/molecules/Drawer/DrawerFooter.tsx +49 -0
  120. package/src/components/molecules/Drawer/DrawerFooterContext.ts +6 -0
  121. package/src/components/molecules/Drawer/DrawerGrabber.tsx +62 -0
  122. package/src/components/molecules/Drawer/DrawerHeader.tsx +244 -0
  123. package/src/components/molecules/Drawer/DrawerHeaderContext.ts +13 -0
  124. package/src/components/molecules/Drawer/DrawerOverlay.tsx +53 -0
  125. package/src/components/molecules/Drawer/DrawerTitle.tsx +32 -0
  126. package/src/components/molecules/Drawer/index.ts +12 -0
  127. package/src/components/molecules/FilterTab/FilterTab.stories.tsx +210 -0
  128. package/src/components/molecules/FilterTab/FilterTab.tsx +310 -0
  129. package/src/components/molecules/FilterTab/index.ts +2 -0
  130. package/src/components/molecules/MessageCard/MessageCard.stories.tsx +169 -0
  131. package/src/components/molecules/MessageCard/MessageCard.tsx +362 -0
  132. package/src/components/molecules/MessageCard/index.ts +10 -0
  133. package/src/components/molecules/Notification/Notification.stories.tsx +219 -0
  134. package/src/components/molecules/Notification/Notification.tsx +426 -0
  135. package/src/components/molecules/Notification/index.ts +2 -0
  136. package/src/components/molecules/NumberField/NumberField.stories.tsx +231 -0
  137. package/src/components/molecules/NumberField/NumberField.tsx +186 -0
  138. package/src/components/molecules/NumberField/NumberFieldInput.tsx +287 -0
  139. package/src/components/molecules/NumberField/index.ts +2 -0
  140. package/src/components/molecules/PasswordField/PasswordField.stories.tsx +362 -0
  141. package/src/components/molecules/PasswordField/PasswordField.test.tsx +369 -0
  142. package/src/components/molecules/PasswordField/PasswordField.tsx +194 -0
  143. package/src/components/molecules/PasswordField/PasswordFieldError.tsx +53 -0
  144. package/src/components/molecules/PasswordField/PasswordFieldInput.tsx +73 -0
  145. package/src/components/molecules/PasswordField/PasswordFieldRequirements.tsx +95 -0
  146. package/src/components/molecules/PasswordField/hooks/index.ts +2 -0
  147. package/src/components/molecules/PasswordField/hooks/usePasswordField.ts +113 -0
  148. package/src/components/molecules/PasswordField/index.ts +10 -0
  149. package/src/components/molecules/PictureSelector/PictureSelector.stories.tsx +204 -0
  150. package/src/components/molecules/PictureSelector/PictureSelector.tsx +335 -0
  151. package/src/components/molecules/PictureSelector/index.ts +5 -0
  152. package/src/components/molecules/Progress/Progress.stories.tsx +145 -0
  153. package/src/components/molecules/Progress/Progress.tsx +184 -0
  154. package/src/components/molecules/Progress/index.ts +2 -0
  155. package/src/components/molecules/Radio/Radio.test.tsx +104 -0
  156. package/src/components/molecules/Radio/Radio.tsx +1 -2
  157. package/src/components/molecules/SearchField/SearchField.stories.tsx +242 -0
  158. package/src/components/molecules/SearchField/SearchField.test.tsx +318 -0
  159. package/src/components/molecules/SearchField/SearchField.tsx +143 -0
  160. package/src/components/molecules/SearchField/SearchFieldInput.tsx +63 -0
  161. package/src/components/molecules/SearchField/hooks/index.ts +1 -0
  162. package/src/components/molecules/SearchField/hooks/useSearchField.ts +56 -0
  163. package/src/components/molecules/SearchField/index.ts +4 -0
  164. package/src/components/molecules/SegmentedControl/SegmentedControl.stories.tsx +31 -8
  165. package/src/components/molecules/SegmentedControl/SegmentedControl.test.tsx +141 -0
  166. package/src/components/molecules/SegmentedControl/SegmentedControl.tsx +237 -23
  167. package/src/components/molecules/SelectField/SelectField.stories.tsx +320 -0
  168. package/src/components/molecules/SelectField/SelectField.test.tsx +254 -0
  169. package/src/components/molecules/SelectField/SelectField.tsx +236 -0
  170. package/src/components/molecules/SelectField/SelectFieldContent.tsx +85 -0
  171. package/src/components/molecules/SelectField/SelectFieldItem.tsx +133 -0
  172. package/src/components/molecules/SelectField/SelectFieldTrigger.tsx +170 -0
  173. package/src/components/molecules/SelectField/SelectFieldValue.tsx +31 -0
  174. package/src/components/molecules/SelectField/hooks/index.ts +2 -0
  175. package/src/components/molecules/SelectField/hooks/useSelectField.ts +84 -0
  176. package/src/components/molecules/SelectField/index.ts +10 -0
  177. package/src/components/molecules/Slider/Slider.test.tsx +102 -0
  178. package/src/components/molecules/Slider/Slider.tsx +293 -180
  179. package/src/components/molecules/Tooltip/Tooltip.stories.tsx +168 -0
  180. package/src/components/molecules/Tooltip/Tooltip.tsx +326 -0
  181. package/src/components/molecules/Tooltip/index.ts +2 -0
  182. package/src/components/molecules/index.ts +15 -0
  183. package/src/test-utils.tsx +20 -0
  184. package/tsconfig.json +1 -1
  185. package/tsup.config.ts +16 -2
  186. package/vitest.config.ts +114 -0
  187. package/vitest.setup.ts +16 -0
package/dist/index.d.ts CHANGED
@@ -7,7 +7,13 @@ import { FontSource } from 'expo-font';
7
7
  import React from 'react';
8
8
  import * as _emotion_react from '@emotion/react';
9
9
  import { Theme } from '@emotion/react';
10
- import { View, TextProps, Text, ViewProps, PressableProps, TextInputProps, TextInput } from 'react-native';
10
+ import * as react_native from 'react-native';
11
+ import { View, ViewProps, TextProps, Text, PressableProps, TextInputProps, TextInput, ImageSourcePropType, ScrollViewProps } from 'react-native';
12
+ import * as react_native_reanimated from 'react-native-reanimated';
13
+ import { FadeIn, FadeOut, FadeInUp, FadeOutUp, FadeInDown, FadeOutDown, ComplexAnimationBuilder, BaseAnimationBuilder, EntryExitAnimationFunction, FadeInRight, FadeOutRight, FadeInLeft, FadeOutLeft } from 'react-native-reanimated';
14
+ import * as react_jsx_runtime from 'react/jsx-runtime';
15
+ import { Option } from '@rn-primitives/select';
16
+ import { Locale } from 'date-fns';
11
17
 
12
18
  declare module "@emotion/react" {
13
19
  interface Theme {
@@ -62,18 +68,74 @@ declare const createPawprintTheme: (brand?: BrandName, theme?: ThemeName) => The
62
68
  declare const theme: _butternutbox_pawprint_tokens.Tokens;
63
69
 
64
70
  type AvatarSize = "sm" | "md" | "lg";
65
- type AvatarBorder = "none" | "sm" | "md";
66
71
  type AvatarFallbackType = "string" | "image";
67
- interface AvatarProps {
72
+ type SmallAvatarProps = {
73
+ size?: "sm";
74
+ border?: "none" | "sm";
75
+ };
76
+ type MediumLargeAvatarProps = {
77
+ size?: "md" | "lg";
78
+ border?: "none" | "md";
79
+ };
80
+ type BaseAvatarProps = {
68
81
  src?: string;
69
82
  alt: string;
70
- size?: AvatarSize;
71
- border?: AvatarBorder;
72
83
  fallbackType?: AvatarFallbackType;
73
84
  fallbackString?: string;
74
- }
85
+ };
86
+ type AvatarProps = BaseAvatarProps & (SmallAvatarProps | MediumLargeAvatarProps);
75
87
  declare const Avatar: React.ForwardRefExoticComponent<AvatarProps & React.RefAttributes<View>>;
76
88
 
89
+ type CarouselControlsProps = {
90
+ /**
91
+ * Total number of carousel items. Renders one dot per item (max 5 visible
92
+ * for 6–7 items via a sliding window).
93
+ */
94
+ count: number;
95
+ /**
96
+ * Zero-based index of the currently active item.
97
+ */
98
+ activeIndex: number;
99
+ /**
100
+ * Show a white pill background behind the dots. Defaults to `true`.
101
+ *
102
+ * Set to `false` when placing controls on a light surface where the
103
+ * background pill would clash with the page background.
104
+ */
105
+ showBackground?: boolean;
106
+ } & ViewProps;
107
+ /**
108
+ * Carousel position indicator — a row of dots where the active dot is
109
+ * highlighted and inactive dots are shown at reduced opacity.
110
+ *
111
+ * For 6–7 item carousels a 5-dot sliding window is used with diminishing
112
+ * dot sizes to indicate proximity to the active item.
113
+ *
114
+ * @example
115
+ * ```tsx
116
+ * <CarouselControls count={4} activeIndex={currentIndex} />
117
+ * <CarouselControls count={4} activeIndex={currentIndex} showBackground={false} />
118
+ * ```
119
+ */
120
+ declare const CarouselControls: React.ForwardRefExoticComponent<{
121
+ /**
122
+ * Total number of carousel items. Renders one dot per item (max 5 visible
123
+ * for 6–7 items via a sliding window).
124
+ */
125
+ count: number;
126
+ /**
127
+ * Zero-based index of the currently active item.
128
+ */
129
+ activeIndex: number;
130
+ /**
131
+ * Show a white pill background behind the dots. Defaults to `true`.
132
+ *
133
+ * Set to `false` when placing controls on a light surface where the
134
+ * background pill would clash with the page background.
135
+ */
136
+ showBackground?: boolean;
137
+ } & ViewProps & React.RefAttributes<View>>;
138
+
77
139
  type BodySize = "xs" | "sm" | "md" | "lg";
78
140
  type HeadingSize = "2xs" | "xs" | "sm" | "md" | "lg" | "xl";
79
141
  type DisplaySize = "md" | "lg";
@@ -177,6 +239,7 @@ type IconOwnProps = {
177
239
  icon: PawprintIcon;
178
240
  size?: IconSize;
179
241
  colour?: IconColour;
242
+ customColour?: string;
180
243
  "aria-label"?: string;
181
244
  };
182
245
  type IconProps = IconOwnProps & Omit<ViewProps, keyof IconOwnProps>;
@@ -329,13 +392,13 @@ type IconButtonProps = IconButtonOwnProps & Omit<PressableProps, keyof IconButto
329
392
  */
330
393
  declare const IconButton: React.ForwardRefExoticComponent<IconButtonOwnProps & Omit<PressableProps, "children" | keyof IconButtonOwnProps> & React.RefAttributes<View>>;
331
394
 
332
- type IllustrationSize = "sm" | "lg";
333
- type PawprintIllustration = React.ComponentType<{
395
+ type IllustrationSize = "sm" | "lg" | "xl";
396
+ type PawprintIllustration$2 = React.ComponentType<{
334
397
  width?: number;
335
398
  height?: number;
336
399
  }>;
337
400
  type IllustrationOwnProps = {
338
- illustration: PawprintIllustration;
401
+ illustration: PawprintIllustration$2;
339
402
  size?: IllustrationSize;
340
403
  "aria-label"?: string;
341
404
  };
@@ -352,7 +415,7 @@ type IllustrationProps = IllustrationOwnProps & Omit<ViewProps, keyof Illustrati
352
415
  * ```
353
416
  *
354
417
  * @param illustration - **(required)** Illustration component
355
- * @param size - *(optional)* Size variant: sm (default), lg
418
+ * @param size - *(optional)* Size variant: sm (default), lg, xl
356
419
  * @param aria-label - *(optional)* Accessible label
357
420
  */
358
421
  declare const Illustration: React.ForwardRefExoticComponent<IllustrationOwnProps & Omit<ViewProps, keyof IllustrationOwnProps> & React.RefAttributes<View>>;
@@ -361,7 +424,11 @@ type InputState = "default" | "error" | "success";
361
424
  type InputFieldOwnProps = {
362
425
  leadingIcon?: React.ReactNode;
363
426
  trailingIcon?: React.ReactNode;
427
+ actionIcon?: React.ReactNode;
364
428
  state?: InputState;
429
+ hideStateIcons?: boolean;
430
+ containerWidth?: number;
431
+ containerHeight?: number;
365
432
  };
366
433
  type InputFieldProps = InputFieldOwnProps & Omit<TextInputProps, keyof InputFieldOwnProps>;
367
434
  /**
@@ -369,7 +436,9 @@ type InputFieldProps = InputFieldOwnProps & Omit<TextInputProps, keyof InputFiel
369
436
  *
370
437
  * @param {React.ReactNode} [leadingIcon] - Icon to display before the input
371
438
  * @param {React.ReactNode} [trailingIcon] - Icon to display after the input
439
+ * @param {React.ReactNode} [actionIcon] - Interactive icon at the rightmost position (e.g. clear button, password toggle)
372
440
  * @param {InputState} [state] - Visual state of the input (default, error, success)
441
+ * @param {boolean} [hideStateIcons] - Hide automatic error/success icons
373
442
  */
374
443
  declare const InputField: React.ForwardRefExoticComponent<InputFieldOwnProps & Omit<TextInputProps, keyof InputFieldOwnProps> & React.RefAttributes<TextInput>>;
375
444
 
@@ -419,16 +488,17 @@ type InputOwnProps = {
419
488
  error?: string;
420
489
  state?: InputState;
421
490
  optionalText?: string;
491
+ onValueChange?: (value: string) => void;
422
492
  };
423
493
  type InputProps = InputOwnProps & Omit<InputFieldProps, keyof InputOwnProps> & Omit<ViewProps, keyof InputOwnProps>;
424
- declare const StyledRoot: _emotion_native.StyledComponent<ViewProps & {
494
+ declare const StyledRoot$6: _emotion_native.StyledComponent<ViewProps & {
425
495
  theme?: _emotion_react.Theme;
426
496
  as?: React.ElementType;
427
497
  }, {}, {
428
498
  ref?: React.Ref<View> | undefined;
429
499
  }>;
430
500
  type InputComponent = React.ForwardRefExoticComponent<InputProps & React.RefAttributes<View>> & {
431
- Root: typeof StyledRoot;
501
+ Root: typeof StyledRoot$6;
432
502
  Label: typeof InputLabel;
433
503
  Field: typeof InputField;
434
504
  Description: typeof InputDescription;
@@ -495,6 +565,36 @@ type LogoSvgComponent = React.ComponentType<{
495
565
  declare function resolveLogo(brand: LogoBrand, variant: LogoVariant): LogoSvgComponent | undefined;
496
566
  declare function registerLogo(brand: LogoBrand, variant: LogoVariant, component: LogoSvgComponent): void;
497
567
 
568
+ type NumberInputFieldOwnProps = {
569
+ fieldText?: string;
570
+ };
571
+ type NumberInputFieldProps = NumberInputFieldOwnProps & Omit<InputFieldProps, keyof NumberInputFieldOwnProps>;
572
+ /**
573
+ * Field component for NumberInput.
574
+ * Renders a centered number input sized to `numberField.size.large.height`.
575
+ * When fieldText is provided, wraps input + text in a horizontal group.
576
+ */
577
+ declare const NumberInputField: React.ForwardRefExoticComponent<NumberInputFieldOwnProps & Omit<InputFieldProps, "fieldText"> & React.RefAttributes<TextInput>>;
578
+
579
+ type NumberInputOwnProps = Pick<InputProps, "label" | "description" | "error" | "state" | "optionalText" | "onValueChange"> & {
580
+ fieldText?: string;
581
+ };
582
+ type NumberInputProps = NumberInputOwnProps & Omit<InputFieldProps, keyof NumberInputOwnProps> & Omit<ViewProps, keyof NumberInputOwnProps>;
583
+ declare const StyledRoot$5: _emotion_native.StyledComponent<ViewProps & {
584
+ theme?: _emotion_react.Theme;
585
+ as?: React.ElementType;
586
+ }, {}, {
587
+ ref?: React.Ref<View> | undefined;
588
+ }>;
589
+ type NumberInputComponent = React.ForwardRefExoticComponent<NumberInputProps & React.RefAttributes<View>> & {
590
+ Root: typeof StyledRoot$5;
591
+ Label: typeof InputLabel;
592
+ Field: typeof NumberInputField;
593
+ Description: typeof InputDescription;
594
+ Error: typeof InputError;
595
+ };
596
+ declare const NumberInput: NumberInputComponent;
597
+
498
598
  type SpinnerSize = "sm" | "md" | "lg";
499
599
  type SpinnerVariant = "dark" | "light";
500
600
  type SpinnerOwnProps = {
@@ -564,6 +664,282 @@ type TagProps = TagOwnProps & Omit<ViewProps, keyof TagOwnProps>;
564
664
  */
565
665
  declare const Tag: React.ForwardRefExoticComponent<TagOwnProps & Omit<ViewProps, keyof TagOwnProps> & React.RefAttributes<View>>;
566
666
 
667
+ type TextAreaFieldOwnProps = {
668
+ leadingIcon?: React.ReactNode;
669
+ trailingIcon?: React.ReactNode;
670
+ state?: InputState;
671
+ hideStateIcons?: boolean;
672
+ rows?: number;
673
+ };
674
+ type TextAreaFieldProps = TextAreaFieldOwnProps & Omit<TextInputProps, keyof TextAreaFieldOwnProps>;
675
+ /**
676
+ * TextAreaField component - Multi-line text input field with icons and visual states.
677
+ *
678
+ * @param {React.ReactNode} [leadingIcon] - Icon to display at the start of the textarea (top-left, should be 24px)
679
+ * @param {React.ReactNode} [trailingIcon] - Icon to display at the end of the textarea (top-right, overrides automatic state icons)
680
+ * @param {InputState} [state] - Visual state of the textarea (default, error, success)
681
+ * @param {boolean} [hideStateIcons] - Hide automatic error/success icons
682
+ * @param {number} [rows=2] - Number of visible text rows (used to calculate minHeight)
683
+ */
684
+ declare const TextAreaField: React.ForwardRefExoticComponent<TextAreaFieldOwnProps & Omit<TextInputProps, keyof TextAreaFieldOwnProps> & React.RefAttributes<TextInput>>;
685
+
686
+ type TextAreaLabelOwnProps = {
687
+ optionalText?: string;
688
+ state?: InputState;
689
+ children: React.ReactNode;
690
+ maxLength?: number;
691
+ currentLength?: number;
692
+ };
693
+ type TextAreaLabelProps = TextAreaLabelOwnProps;
694
+ declare const TextAreaLabel: React.ForwardRefExoticComponent<TextAreaLabelOwnProps & React.RefAttributes<View>>;
695
+
696
+ type TextAreaOwnProps = {
697
+ label?: string;
698
+ description?: string;
699
+ error?: string;
700
+ state?: InputState;
701
+ optionalText?: string;
702
+ onValueChange?: (value: string) => void;
703
+ };
704
+ type TextAreaProps = TextAreaOwnProps & Omit<TextAreaFieldProps, keyof TextAreaOwnProps> & Omit<ViewProps, keyof TextAreaOwnProps>;
705
+ declare const StyledRoot$4: _emotion_native.StyledComponent<ViewProps & {
706
+ theme?: _emotion_react.Theme;
707
+ as?: React.ElementType;
708
+ }, {}, {
709
+ ref?: React.Ref<View> | undefined;
710
+ }>;
711
+ type TextAreaComponent = React.ForwardRefExoticComponent<TextAreaProps & React.RefAttributes<View>> & {
712
+ Root: typeof StyledRoot$4;
713
+ Label: typeof TextAreaLabel;
714
+ Field: typeof TextAreaField;
715
+ Description: typeof InputDescription;
716
+ Error: typeof InputError;
717
+ };
718
+ declare const TextArea: TextAreaComponent;
719
+
720
+ type AccordionSize = "small" | "large";
721
+ type AccordionRootOwnProps = {
722
+ size?: AccordionSize;
723
+ multiple?: boolean;
724
+ defaultValue?: string[];
725
+ value?: string[];
726
+ onValueChange?: (value: string[]) => void;
727
+ disabled?: boolean;
728
+ children: React.ReactNode;
729
+ };
730
+ type AccordionProps = AccordionRootOwnProps & Omit<ViewProps, keyof AccordionRootOwnProps>;
731
+ type AccordionItemOwnProps = {
732
+ title: string;
733
+ children: React.ReactNode;
734
+ value?: string;
735
+ disabled?: boolean;
736
+ };
737
+ type AccordionItemProps = AccordionItemOwnProps & Omit<ViewProps, keyof AccordionItemOwnProps>;
738
+ declare const Accordion: React.ForwardRefExoticComponent<AccordionRootOwnProps & Omit<ViewProps, keyof AccordionRootOwnProps> & React.RefAttributes<View>> & {
739
+ Item: React.ForwardRefExoticComponent<AccordionItemOwnProps & Omit<ViewProps, keyof AccordionItemOwnProps> & React.RefAttributes<View>>;
740
+ };
741
+
742
+ declare class SubtleScaleIn extends ComplexAnimationBuilder {
743
+ static presetName: string;
744
+ static createInstance<T extends typeof BaseAnimationBuilder>(this: T): InstanceType<T>;
745
+ build: () => EntryExitAnimationFunction;
746
+ }
747
+ declare const fadeAnimation: {
748
+ readonly entering: typeof FadeIn;
749
+ readonly exiting: typeof FadeOut;
750
+ };
751
+ declare const fadeUpAnimation: {
752
+ readonly entering: typeof FadeInDown;
753
+ readonly exiting: typeof FadeOutDown;
754
+ };
755
+ declare const fadeDownAnimation: {
756
+ readonly entering: typeof FadeInUp;
757
+ readonly exiting: typeof FadeOutUp;
758
+ };
759
+ declare const slideInAnimation: {
760
+ readonly entering: typeof FadeInRight;
761
+ readonly exiting: typeof FadeOutRight;
762
+ };
763
+ declare const slideOutAnimation: {
764
+ readonly entering: typeof FadeInLeft;
765
+ readonly exiting: typeof FadeOutLeft;
766
+ };
767
+ declare const DURATIONS: {
768
+ readonly fade: 200;
769
+ readonly scale: 150;
770
+ readonly fadeUp: 200;
771
+ readonly fadeDown: 200;
772
+ readonly slideIn: 250;
773
+ readonly slideOut: 250;
774
+ };
775
+ declare const scaleAnimation: {
776
+ readonly entering: typeof SubtleScaleIn;
777
+ readonly exiting: react_native_reanimated.ReanimatedKeyframe;
778
+ };
779
+ type AnimatedVariant = keyof typeof DURATIONS;
780
+ type AnimatedProps = {
781
+ /**
782
+ * Animation preset. Defaults to `"fade"`.
783
+ *
784
+ * | Preset | Motion |
785
+ * |-------------|-------------------------------------------|
786
+ * | `fade` | opacity |
787
+ * | `fadeUp` | opacity + enter from below |
788
+ * | `fadeDown` | opacity + enter from above |
789
+ * | `scale` | opacity + subtle scale 0.85↔1 |
790
+ * | `slideIn` | opacity + enter from right |
791
+ * | `slideOut` | opacity + enter from left |
792
+ */
793
+ variant?: AnimatedVariant;
794
+ /**
795
+ * Delay in seconds before the entering animation starts. Useful for
796
+ * sequencing elements without a full stagger setup. Ignored when
797
+ * `prefers-reduced-motion` is active.
798
+ *
799
+ * @example
800
+ * ```tsx
801
+ * <Animated variant="fadeUp" delay={0}>First</Animated>
802
+ * <Animated variant="fadeUp" delay={0.08}>Second</Animated>
803
+ * <Animated variant="fadeUp" delay={0.16}>Third</Animated>
804
+ * ```
805
+ */
806
+ delay?: number;
807
+ } & ViewProps;
808
+ /**
809
+ * Reanimated wrapper that applies a named animation preset to its children.
810
+ *
811
+ * Exit animations run automatically when the component unmounts — no wrapper
812
+ * component needed (unlike `AnimatePresence` on web).
813
+ *
814
+ * Respects the OS reduce-motion setting automatically — Reanimated builders
815
+ * default to `ReduceMotion.System` so no extra hook is needed.
816
+ *
817
+ * Export `*Animation` objects (e.g. `fadeUpAnimation`) for applying presets
818
+ * directly on `Reanimated.View` in custom stagger patterns:
819
+ *
820
+ * ```tsx
821
+ * <Reanimated.View entering={fadeUpAnimation.entering.duration(200).delay(80)}>
822
+ * <Item />
823
+ * </Reanimated.View>
824
+ * ```
825
+ *
826
+ * @example
827
+ * ```tsx
828
+ * // Enter animation
829
+ * <Animated variant="fadeUp"><Card /></Animated>
830
+ *
831
+ * // Enter + exit — condition the render and Reanimated handles both
832
+ * {visible && <Animated variant="slideIn"><Panel /></Animated>}
833
+ *
834
+ * // Sequenced elements
835
+ * <Animated variant="fadeUp" delay={0}>Title</Animated>
836
+ * <Animated variant="fadeUp" delay={0.1}>Subtitle</Animated>
837
+ * ```
838
+ */
839
+ declare const Animated: React.ForwardRefExoticComponent<{
840
+ /**
841
+ * Animation preset. Defaults to `"fade"`.
842
+ *
843
+ * | Preset | Motion |
844
+ * |-------------|-------------------------------------------|
845
+ * | `fade` | opacity |
846
+ * | `fadeUp` | opacity + enter from below |
847
+ * | `fadeDown` | opacity + enter from above |
848
+ * | `scale` | opacity + subtle scale 0.85↔1 |
849
+ * | `slideIn` | opacity + enter from right |
850
+ * | `slideOut` | opacity + enter from left |
851
+ */
852
+ variant?: AnimatedVariant;
853
+ /**
854
+ * Delay in seconds before the entering animation starts. Useful for
855
+ * sequencing elements without a full stagger setup. Ignored when
856
+ * `prefers-reduced-motion` is active.
857
+ *
858
+ * @example
859
+ * ```tsx
860
+ * <Animated variant="fadeUp" delay={0}>First</Animated>
861
+ * <Animated variant="fadeUp" delay={0.08}>Second</Animated>
862
+ * <Animated variant="fadeUp" delay={0.16}>Third</Animated>
863
+ * ```
864
+ */
865
+ delay?: number;
866
+ } & ViewProps & React.RefAttributes<View>>;
867
+
868
+ type DrawerHeaderVariant = "titleAndText" | "image" | "fullBleed";
869
+
870
+ type DrawerContentProps = Omit<ViewProps, "style">;
871
+
872
+ type DrawerOverlayProps = {
873
+ accessible?: boolean;
874
+ };
875
+
876
+ type DrawerRootOwnProps = {
877
+ open?: boolean;
878
+ defaultOpen?: boolean;
879
+ onOpenChange?: (open: boolean) => void;
880
+ children: React.ReactNode;
881
+ };
882
+ type DrawerProps = DrawerRootOwnProps & Omit<ViewProps, keyof DrawerRootOwnProps>;
883
+ type DrawerTriggerProps = {
884
+ children: React.ReactElement;
885
+ };
886
+ type DrawerPortalProps = {
887
+ children: React.ReactNode;
888
+ };
889
+ declare const Drawer: React.ForwardRefExoticComponent<DrawerRootOwnProps & Omit<ViewProps, keyof DrawerRootOwnProps> & React.RefAttributes<View>> & {
890
+ Root: React.ForwardRefExoticComponent<DrawerRootOwnProps & Omit<ViewProps, keyof DrawerRootOwnProps> & React.RefAttributes<View>>;
891
+ Trigger: React.ForwardRefExoticComponent<DrawerTriggerProps & React.RefAttributes<View>>;
892
+ Portal: {
893
+ ({ children }: DrawerPortalProps): react_jsx_runtime.JSX.Element | null;
894
+ displayName: string;
895
+ };
896
+ Overlay: React.ForwardRefExoticComponent<DrawerOverlayProps & React.RefAttributes<View>>;
897
+ Content: React.ForwardRefExoticComponent<DrawerContentProps & React.RefAttributes<View>>;
898
+ Grabber: React.ForwardRefExoticComponent<ViewProps & React.RefAttributes<View>>;
899
+ Header: React.ForwardRefExoticComponent<{
900
+ variant?: DrawerHeaderVariant;
901
+ imageSource?: react_native.ImageSourcePropType;
902
+ } & Omit<ViewProps, keyof {
903
+ variant?: DrawerHeaderVariant;
904
+ imageSource?: react_native.ImageSourcePropType;
905
+ }> & React.RefAttributes<View>>;
906
+ Title: React.ForwardRefExoticComponent<{
907
+ children: React.ReactNode;
908
+ } & Omit<ViewProps, "children"> & React.RefAttributes<View>>;
909
+ Description: React.ForwardRefExoticComponent<{
910
+ children: React.ReactNode;
911
+ } & Omit<ViewProps, "children"> & React.RefAttributes<View>>;
912
+ Close: React.ForwardRefExoticComponent<{
913
+ "aria-label"?: string;
914
+ } & Omit<ViewProps, "children"> & React.RefAttributes<View>>;
915
+ Body: React.ForwardRefExoticComponent<react_native.ScrollViewProps & React.RefAttributes<react_native.ScrollView>>;
916
+ Footer: React.ForwardRefExoticComponent<ViewProps & React.RefAttributes<View>>;
917
+ };
918
+
919
+ type DrawerGrabberProps = ViewProps;
920
+
921
+ type DrawerHeaderOwnProps = {
922
+ variant?: DrawerHeaderVariant;
923
+ imageSource?: ImageSourcePropType;
924
+ };
925
+ type DrawerHeaderProps = DrawerHeaderOwnProps & Omit<ViewProps, keyof DrawerHeaderOwnProps>;
926
+
927
+ type DrawerTitleProps = {
928
+ children: React.ReactNode;
929
+ } & Omit<ViewProps, "children">;
930
+
931
+ type DrawerDescriptionProps = {
932
+ children: React.ReactNode;
933
+ } & Omit<ViewProps, "children">;
934
+
935
+ type DrawerCloseProps = {
936
+ "aria-label"?: string;
937
+ } & Omit<ViewProps, "children">;
938
+
939
+ type DrawerBodyProps = ScrollViewProps;
940
+
941
+ type DrawerFooterProps = ViewProps;
942
+
567
943
  type ButtonDockVariant = "stacked" | "inline";
568
944
  type ButtonDockOwnProps = {
569
945
  variant?: ButtonDockVariant;
@@ -666,6 +1042,288 @@ type CheckboxGroupProps = CheckboxGroupOwnProps & Omit<ViewProps, keyof Checkbox
666
1042
  */
667
1043
  declare const CheckboxGroup: React.ForwardRefExoticComponent<CheckboxGroupOwnProps & Omit<ViewProps, keyof CheckboxGroupOwnProps> & React.RefAttributes<View>>;
668
1044
 
1045
+ type CopyFieldInputOwnProps = {
1046
+ onCopy?: (value: string) => void;
1047
+ onValueChange?: (value: string) => void;
1048
+ copyButtonLabel?: string;
1049
+ };
1050
+ declare const CopyFieldInput: React.ForwardRefExoticComponent<CopyFieldInputOwnProps & Omit<InputFieldProps, keyof CopyFieldInputOwnProps> & React.RefAttributes<TextInput>>;
1051
+
1052
+ declare const StyledRoot$3: _emotion_native.StyledComponent<ViewProps & {
1053
+ theme?: _emotion_react.Theme;
1054
+ as?: React.ElementType;
1055
+ }, {}, {
1056
+ ref?: React.Ref<View> | undefined;
1057
+ }>;
1058
+ type CopyFieldOwnProps = {
1059
+ label?: string;
1060
+ description?: string;
1061
+ error?: string;
1062
+ state?: InputState;
1063
+ optionalText?: string;
1064
+ onCopy?: (value: string) => void;
1065
+ onValueChange?: (value: string) => void;
1066
+ copyButtonLabel?: string;
1067
+ };
1068
+ type CopyFieldProps = CopyFieldOwnProps & Omit<InputFieldProps, keyof CopyFieldOwnProps> & Omit<ViewProps, keyof CopyFieldOwnProps>;
1069
+ type CopyFieldComponent = React.ForwardRefExoticComponent<CopyFieldProps & React.RefAttributes<View>> & {
1070
+ Root: typeof StyledRoot$3;
1071
+ Label: typeof InputLabel;
1072
+ Field: typeof CopyFieldInput;
1073
+ Description: typeof InputDescription;
1074
+ Error: typeof InputError;
1075
+ };
1076
+ declare const CopyField: CopyFieldComponent;
1077
+
1078
+ type UseCopyFieldOptions = {
1079
+ initialValue?: string;
1080
+ onCopy?: (value: string) => void;
1081
+ };
1082
+ declare const useCopyField: (options?: UseCopyFieldOptions) => {
1083
+ value: string;
1084
+ onValueChange: (newValue: string) => void;
1085
+ onCopy: (copiedValue: string) => void;
1086
+ };
1087
+
1088
+ type FilterTabSize = "sm" | "lg";
1089
+ type FilterTabRootOwnProps = {
1090
+ size?: FilterTabSize;
1091
+ multiple?: boolean;
1092
+ value?: string[];
1093
+ defaultValue?: string[];
1094
+ onValueChange?: (value: string[]) => void;
1095
+ children: React.ReactNode;
1096
+ };
1097
+ type FilterTabProps = FilterTabRootOwnProps & Omit<ViewProps, keyof FilterTabRootOwnProps>;
1098
+ type FilterTabItemOwnProps = {
1099
+ value: string;
1100
+ label?: string;
1101
+ icon?: PawprintIcon;
1102
+ leadingIcon?: PawprintIcon;
1103
+ trailingIcon?: PawprintIcon;
1104
+ disabled?: boolean;
1105
+ };
1106
+ type FilterTabItemProps = FilterTabItemOwnProps & Omit<PressableProps, keyof FilterTabItemOwnProps | "children">;
1107
+ declare const FilterTab: React.ForwardRefExoticComponent<FilterTabRootOwnProps & Omit<ViewProps, keyof FilterTabRootOwnProps> & React.RefAttributes<View>> & {
1108
+ Item: React.ForwardRefExoticComponent<FilterTabItemOwnProps & Omit<PressableProps, "children" | keyof FilterTabItemOwnProps> & React.RefAttributes<View>>;
1109
+ };
1110
+
1111
+ type NumberFieldSize$1 = "sm" | "lg";
1112
+ type NumberFieldInputOwnProps = {
1113
+ fieldSize?: NumberFieldSize$1;
1114
+ state?: "default" | "error" | "success";
1115
+ onIncrement?: () => void;
1116
+ onDecrement?: () => void;
1117
+ showIncrementButton?: boolean;
1118
+ showDecrementButton?: boolean;
1119
+ disabled?: boolean;
1120
+ incrementDisabled?: boolean;
1121
+ decrementDisabled?: boolean;
1122
+ min?: number;
1123
+ max?: number;
1124
+ };
1125
+ type NumberFieldInputProps = NumberFieldInputOwnProps & Omit<TextInputProps, keyof NumberFieldInputOwnProps>;
1126
+
1127
+ type NumberFieldSize = "sm" | "lg";
1128
+ type NumberFieldState = "default" | "error" | "success";
1129
+ type NumberFieldOwnProps = {
1130
+ label?: string;
1131
+ smallLabel?: string;
1132
+ description?: string;
1133
+ error?: string;
1134
+ state?: NumberFieldState;
1135
+ size?: NumberFieldSize;
1136
+ disabled?: boolean;
1137
+ onIncrement?: () => void;
1138
+ onDecrement?: () => void;
1139
+ showIncrementButton?: boolean;
1140
+ showDecrementButton?: boolean;
1141
+ incrementDisabled?: boolean;
1142
+ decrementDisabled?: boolean;
1143
+ min?: number;
1144
+ max?: number;
1145
+ };
1146
+ type NumberFieldProps = NumberFieldOwnProps & Omit<NumberFieldInputProps, keyof NumberFieldOwnProps | "fieldSize"> & Omit<ViewProps, keyof NumberFieldOwnProps>;
1147
+ /**
1148
+ * Number field component for collecting numeric data with increment/decrement
1149
+ * buttons and an optional side text label.
1150
+ * Built on React Native TextInput with design system styling.
1151
+ *
1152
+ * @param {"sm" | "lg"} [size="lg"] - Size variant controlling typography and spacing.
1153
+ * @param {string} [label] - Primary label text above the field.
1154
+ * @param {string} [smallLabel] - Secondary label text displayed below the primary label.
1155
+ * @param {string} [description] - Help text displayed below the field.
1156
+ * @param {string} [error] - Error message displayed when state is "error".
1157
+ * @param {"default" | "error" | "success"} [state="default"] - Visual state of the field.
1158
+ * @param {boolean} [disabled=false] - Whether the entire field (input + buttons) is disabled.
1159
+ * @param {() => void} [onIncrement] - Called when the + button is pressed.
1160
+ * @param {() => void} [onDecrement] - Called when the - button is pressed.
1161
+ * @param {boolean} [showIncrementButton=true] - Whether to show the + button.
1162
+ * @param {boolean} [showDecrementButton=true] - Whether to show the - button.
1163
+ * @param {boolean} [incrementDisabled=false] - Whether the + button is independently disabled.
1164
+ * @param {boolean} [decrementDisabled=false] - Whether the - button is independently disabled.
1165
+ * @param {number} [min] - Minimum allowed value. Clamps on blur and disables decrement at min.
1166
+ * @param {number} [max] - Maximum allowed value. Clamps on blur and disables increment at max.
1167
+ *
1168
+ * @example
1169
+ * ```tsx
1170
+ * import { NumberField } from "@butternutbox/pawprint-native"
1171
+ *
1172
+ * <NumberField
1173
+ * label="Weight"
1174
+ * size="lg"
1175
+ * defaultValue="0"
1176
+ * onIncrement={() => setValue(v => v + 1)}
1177
+ * onDecrement={() => setValue(v => v - 1)}
1178
+ * />
1179
+ * ```
1180
+ *
1181
+ * Note: Unlike the web version, this component does not support a compound component API.
1182
+ */
1183
+ declare const NumberField: React.ForwardRefExoticComponent<NumberFieldOwnProps & Omit<NumberFieldInputProps, "fieldSize" | keyof NumberFieldOwnProps> & Omit<ViewProps, keyof NumberFieldOwnProps> & React.RefAttributes<View>>;
1184
+
1185
+ /**
1186
+ * Input field component for PasswordField.
1187
+ * Wraps InputField with password visibility toggle.
1188
+ *
1189
+ * @param onValueChange - Value change handler
1190
+ * @param value - Controlled value
1191
+ * @param state - Visual state of the input
1192
+ * @param editable - Controls whether the input is editable
1193
+ */
1194
+ declare const PasswordFieldInput: React.ForwardRefExoticComponent<Omit<PasswordFieldProps, "error" | "label" | "description" | "optionalText" | "requirements" | "showRequirements"> & React.RefAttributes<TextInput>>;
1195
+
1196
+ /**
1197
+ * Error message component for PasswordField.
1198
+ * Displays the error text with a RemoveCircle icon to match the design system
1199
+ * password validation styling.
1200
+ *
1201
+ * @param children - Error message text
1202
+ */
1203
+ declare const PasswordFieldError: React.ForwardRefExoticComponent<{
1204
+ children?: React.ReactNode;
1205
+ } & ViewProps & React.RefAttributes<View>>;
1206
+
1207
+ type PasswordRequirement = {
1208
+ text: string;
1209
+ satisfied: boolean;
1210
+ };
1211
+ type PasswordFieldRequirementsOwnProps = {
1212
+ requirements: string[] | PasswordRequirement[];
1213
+ children?: never;
1214
+ };
1215
+ type PasswordFieldRequirementsProps = PasswordFieldRequirementsOwnProps & Omit<ViewProps, keyof PasswordFieldRequirementsOwnProps>;
1216
+ /**
1217
+ * Requirements list component for PasswordField.
1218
+ * Displays a list of password requirements with validation icons.
1219
+ *
1220
+ * @param requirements - Array of requirement strings or objects with text and satisfied status
1221
+ */
1222
+ declare const PasswordFieldRequirements: React.ForwardRefExoticComponent<PasswordFieldRequirementsOwnProps & Omit<ViewProps, keyof PasswordFieldRequirementsOwnProps> & React.RefAttributes<View>>;
1223
+
1224
+ declare const StyledRoot$2: _emotion_native.StyledComponent<ViewProps & {
1225
+ theme?: _emotion_react.Theme;
1226
+ as?: React.ElementType;
1227
+ }, {}, {
1228
+ ref?: React.Ref<View> | undefined;
1229
+ }>;
1230
+ type PasswordFieldOwnProps = {
1231
+ label?: string;
1232
+ description?: string;
1233
+ error?: string | string[];
1234
+ state?: InputState;
1235
+ optionalText?: string;
1236
+ requirements?: string[] | PasswordRequirement[];
1237
+ showRequirements?: boolean;
1238
+ onValueChange?: (value: string) => void;
1239
+ };
1240
+ type PasswordFieldProps = PasswordFieldOwnProps & Omit<InputFieldProps, keyof PasswordFieldOwnProps> & Omit<ViewProps, keyof PasswordFieldOwnProps>;
1241
+ type PasswordFieldComponent = React.ForwardRefExoticComponent<PasswordFieldProps & React.RefAttributes<View>> & {
1242
+ Root: typeof StyledRoot$2;
1243
+ Label: typeof InputLabel;
1244
+ Field: typeof PasswordFieldInput;
1245
+ Description: typeof InputDescription;
1246
+ Requirements: typeof PasswordFieldRequirements;
1247
+ Error: typeof PasswordFieldError;
1248
+ };
1249
+ declare const PasswordField: PasswordFieldComponent;
1250
+
1251
+ type PasswordValidationRule = {
1252
+ test: (value: string) => boolean;
1253
+ message: string;
1254
+ };
1255
+ type UsePasswordFieldOptions = {
1256
+ initialValue?: string;
1257
+ onValueChange?: (value: string) => void;
1258
+ validationRules?: PasswordValidationRule[];
1259
+ autoShowRequirements?: boolean;
1260
+ };
1261
+ type UsePasswordFieldReturn = Pick<PasswordFieldProps, "value" | "onValueChange" | "state" | "requirements" | "showRequirements">;
1262
+ /**
1263
+ * Hook for managing PasswordField state with built-in validation.
1264
+ * Handles value, validation state, and requirements automatically.
1265
+ *
1266
+ * @example
1267
+ * ```tsx
1268
+ * // Simple usage without validation
1269
+ * const passwordProps = usePasswordField()
1270
+ * <PasswordField {...passwordProps} label="Password" />
1271
+ *
1272
+ * // With validation rules
1273
+ * const passwordProps = usePasswordField({
1274
+ * validationRules: [
1275
+ * { test: (v) => v.length >= 8, message: "At least 8 characters" },
1276
+ * { test: (v) => /[A-Z]/.test(v), message: "One uppercase letter" },
1277
+ * { test: (v) => /[a-z]/.test(v), message: "One lowercase letter" },
1278
+ * { test: (v) => /\d/.test(v), message: "One number" }
1279
+ * ]
1280
+ * })
1281
+ * <PasswordField {...passwordProps} label="Create Password" />
1282
+ * ```
1283
+ *
1284
+ * @param {string} [initialValue=""] - Initial password value
1285
+ * @param {(value: string) => void} [onValueChange] - Optional callback called after value changes
1286
+ * @param {PasswordValidationRule[]} [validationRules] - Array of validation rules
1287
+ * @param {boolean} [autoShowRequirements] - Whether to auto-show requirements (default: true when rules provided)
1288
+ */
1289
+ declare function usePasswordField({ initialValue, onValueChange: onValueChangeCallback, validationRules, autoShowRequirements }?: UsePasswordFieldOptions): UsePasswordFieldReturn;
1290
+
1291
+ type ProgressSize = "sm" | "lg";
1292
+ type ProgressColour = "primary" | "secondary";
1293
+ type ProgressOwnProps = {
1294
+ value?: number;
1295
+ max?: number;
1296
+ size?: ProgressSize;
1297
+ colour?: ProgressColour;
1298
+ label?: React.ReactNode;
1299
+ description?: React.ReactNode;
1300
+ getValueLabel?: (value: number, max: number) => string;
1301
+ };
1302
+ type ProgressProps = ProgressOwnProps & Omit<ViewProps, keyof ProgressOwnProps>;
1303
+ /**
1304
+ * A horizontal progress bar that visualises the completion of a determinate
1305
+ * task. Supports an optional label (top-left) and description (top-right),
1306
+ * two sizes, and two indicator colours.
1307
+ *
1308
+ * Wraps `@rn-primitives/progress` for accessibility.
1309
+ *
1310
+ * @param {number} [value=0] - Current progress value (0 to `max`). Clamped.
1311
+ * @param {number} [max=100] - Maximum value representing 100% completion.
1312
+ * @param {"sm" | "lg"} [size="sm"] - Track height: sm (8px) or lg (16px).
1313
+ * @param {"primary" | "secondary"} [colour="primary"] - Indicator fill colour.
1314
+ * @param {React.ReactNode} [label] - Label rendered in the top-left above the track.
1315
+ * @param {React.ReactNode} [description] - Helper text rendered in the top-right above the track.
1316
+ * @param {(value: number, max: number) => string} [getValueLabel] - Accessible value label.
1317
+ *
1318
+ * @example
1319
+ * ```tsx
1320
+ * import { Progress } from "@butternutbox/pawprint-native"
1321
+ *
1322
+ * <Progress label="Box capacity" description="14/14" value={100} />
1323
+ * ```
1324
+ */
1325
+ declare const Progress: React.ForwardRefExoticComponent<ProgressOwnProps & Omit<ViewProps, keyof ProgressOwnProps> & React.RefAttributes<View>>;
1326
+
669
1327
  type RadioOwnProps = {
670
1328
  value: string;
671
1329
  variant?: "standalone" | "tile";
@@ -709,6 +1367,60 @@ type RadioGroupComponent = React.ForwardRefExoticComponent<RadioGroupProps & Rea
709
1367
  };
710
1368
  declare const RadioGroup: RadioGroupComponent;
711
1369
 
1370
+ declare const SearchFieldInput: React.ForwardRefExoticComponent<Omit<SearchFieldProps, "error" | "label" | "description" | "optionalText"> & React.RefAttributes<TextInput>>;
1371
+
1372
+ declare const StyledRoot$1: _emotion_native.StyledComponent<ViewProps & {
1373
+ theme?: _emotion_react.Theme;
1374
+ as?: React.ElementType;
1375
+ }, {}, {
1376
+ ref?: React.Ref<View> | undefined;
1377
+ }>;
1378
+ type SearchFieldOwnProps = {
1379
+ label?: string;
1380
+ description?: string;
1381
+ error?: string;
1382
+ state?: InputState;
1383
+ optionalText?: string;
1384
+ onClear?: () => void;
1385
+ onValueChange?: (value: string) => void;
1386
+ };
1387
+ type SearchFieldProps = SearchFieldOwnProps & Omit<InputFieldProps, keyof SearchFieldOwnProps> & Omit<ViewProps, keyof SearchFieldOwnProps>;
1388
+ type SearchFieldComponent = React.ForwardRefExoticComponent<SearchFieldProps & React.RefAttributes<View>> & {
1389
+ Root: typeof StyledRoot$1;
1390
+ Label: typeof InputLabel;
1391
+ Field: typeof SearchFieldInput;
1392
+ Description: typeof InputDescription;
1393
+ Error: typeof InputError;
1394
+ };
1395
+ declare const SearchField: SearchFieldComponent;
1396
+
1397
+ type UseSearchFieldOptions = {
1398
+ initialValue?: string;
1399
+ onValueChange?: (value: string) => void;
1400
+ onClear?: () => void;
1401
+ };
1402
+ type UseSearchFieldReturn = Pick<SearchFieldProps, "value" | "onValueChange" | "onClear">;
1403
+ /**
1404
+ * Hook for managing SearchField state with optional additional callbacks.
1405
+ * Handles the common pattern of controlled SearchField with value/onValueChange/onClear.
1406
+ *
1407
+ * @example
1408
+ * ```tsx
1409
+ * const searchProps = useSearchField({
1410
+ * initialValue: "",
1411
+ * onValueChange: (value) => triggerSearch(value),
1412
+ * onClear: () => resetResults()
1413
+ * })
1414
+ *
1415
+ * <SearchField {...searchProps} placeholder="Search..." />
1416
+ * ```
1417
+ *
1418
+ * @param {string} [initialValue=""] - Initial search value
1419
+ * @param {(value: string) => void} [onValueChange] - Optional callback called after value changes
1420
+ * @param {() => void} [onClear] - Optional callback called after clearing (in addition to clearing the value)
1421
+ */
1422
+ declare function useSearchField({ initialValue, onValueChange: onValueChangeCallback, onClear: onClearCallback }?: UseSearchFieldOptions): UseSearchFieldReturn;
1423
+
712
1424
  type SegmentedControlLayout = "fixed" | "intrinsic";
713
1425
  type SegmentedControlOption = {
714
1426
  value: string;
@@ -739,6 +1451,103 @@ type SegmentedControlComponent = React.ForwardRefExoticComponent<SegmentedContro
739
1451
  };
740
1452
  declare const SegmentedControl: SegmentedControlComponent;
741
1453
 
1454
+ type SelectFieldTriggerOwnProps = {
1455
+ state?: InputState;
1456
+ leadingIcon?: React.ReactNode;
1457
+ children?: React.ReactNode;
1458
+ isOpen?: boolean;
1459
+ };
1460
+ type SelectFieldTriggerProps = SelectFieldTriggerOwnProps & Omit<PressableProps, keyof SelectFieldTriggerOwnProps>;
1461
+ declare const SelectFieldTrigger: React.ForwardRefExoticComponent<SelectFieldTriggerOwnProps & Omit<PressableProps, keyof SelectFieldTriggerOwnProps> & React.RefAttributes<View>>;
1462
+
1463
+ declare const SelectFieldValue: React.ForwardRefExoticComponent<{
1464
+ placeholder?: string;
1465
+ } & Omit<TextProps, "children"> & React.RefAttributes<Text>>;
1466
+
1467
+ declare const SelectFieldContent: React.ForwardRefExoticComponent<{
1468
+ children?: React.ReactNode;
1469
+ } & Omit<ViewProps, "children"> & React.RefAttributes<View>>;
1470
+
1471
+ type SelectFieldItemOwnProps = {
1472
+ value: string;
1473
+ leadingIcon?: React.ReactNode;
1474
+ hintText?: string;
1475
+ disabled?: boolean;
1476
+ isSelected?: boolean;
1477
+ };
1478
+ type SelectFieldItemProps = SelectFieldItemOwnProps & Omit<PressableProps, keyof SelectFieldItemOwnProps>;
1479
+ declare const SelectFieldItem: React.ForwardRefExoticComponent<SelectFieldItemOwnProps & Omit<PressableProps, keyof SelectFieldItemOwnProps> & React.RefAttributes<View>>;
1480
+
1481
+ declare const StyledRoot: _emotion_native.StyledComponent<ViewProps & {
1482
+ theme?: _emotion_react.Theme;
1483
+ as?: React.ElementType;
1484
+ }, {}, {
1485
+ ref?: React.Ref<View> | undefined;
1486
+ }>;
1487
+ type SelectFieldOwnProps<Value = Option | string> = {
1488
+ label?: string;
1489
+ description?: string;
1490
+ error?: string;
1491
+ state?: InputState;
1492
+ optionalText?: string;
1493
+ placeholder?: string;
1494
+ leadingIcon?: React.ReactNode;
1495
+ value?: Value | null;
1496
+ defaultValue?: Value | null;
1497
+ onValueChange?: (value: Value | null) => void;
1498
+ children?: React.ReactNode;
1499
+ disabled?: boolean;
1500
+ };
1501
+ type SelectFieldProps<Value = Option> = SelectFieldOwnProps<Value> & Omit<ViewProps, keyof SelectFieldOwnProps<Value>>;
1502
+ type SelectFieldComponent = React.ForwardRefExoticComponent<SelectFieldProps<Option | string> & React.RefAttributes<View>> & {
1503
+ Root: typeof StyledRoot;
1504
+ Label: typeof InputLabel;
1505
+ Trigger: typeof SelectFieldTrigger;
1506
+ Value: typeof SelectFieldValue;
1507
+ Content: typeof SelectFieldContent;
1508
+ Item: typeof SelectFieldItem;
1509
+ Description: typeof InputDescription;
1510
+ Error: typeof InputError;
1511
+ };
1512
+ declare const SelectField: SelectFieldComponent;
1513
+
1514
+ type SelectValidationRule<T = string | Option> = {
1515
+ test: (value: T | null) => boolean;
1516
+ message: string;
1517
+ };
1518
+ type SelectOptions<T = string | Option> = {
1519
+ initialValue?: T | null;
1520
+ onValueChange?: (value: T | null) => void;
1521
+ validationRule?: SelectValidationRule<T>;
1522
+ };
1523
+ type SelectReturn<T = string | Option> = {
1524
+ value: T | null;
1525
+ onValueChange: (value: T | null) => void;
1526
+ state?: InputState;
1527
+ error?: string;
1528
+ };
1529
+ /**
1530
+ * Hook for managing SelectField state with built-in validation.
1531
+ * Handles value, validation state, and error message automatically.
1532
+ *
1533
+ * @example
1534
+ * ```tsx
1535
+ * // Simple usage without validation
1536
+ * const selectProps = useSelectField()
1537
+ * <SelectField {...selectProps} label="Country" />
1538
+ *
1539
+ * // With validation rule
1540
+ * const selectProps = useSelectField({
1541
+ * validationRule: {
1542
+ * test: (v) => v !== null,
1543
+ * message: "Please select an option"
1544
+ * }
1545
+ * })
1546
+ * <SelectField {...selectProps} label="Category" />
1547
+ * ```
1548
+ */
1549
+ declare function useSelectField<T = string | Option>(options?: SelectOptions<T>): SelectReturn<T>;
1550
+
742
1551
  type SliderOwnProps = {
743
1552
  value?: number;
744
1553
  defaultValue?: number;
@@ -777,4 +1586,293 @@ type SliderProps = SliderOwnProps & Omit<ViewProps, keyof SliderOwnProps>;
777
1586
  */
778
1587
  declare const Slider: React.ForwardRefExoticComponent<SliderOwnProps & Omit<ViewProps, keyof SliderOwnProps> & React.RefAttributes<View>>;
779
1588
 
780
- export { Avatar, type AvatarBorder, type AvatarFallbackType, type AvatarProps, type AvatarSize, BRAND_FONTS, Badge, type BadgeProps, Button, type ButtonColour, ButtonDock, type ButtonDockProps, type ButtonDockVariant, ButtonGroup, type ButtonGroupLayout, type ButtonGroupProps, type ButtonProps, type ButtonSize, type ButtonVariant, Checkbox, CheckboxGroup, type CheckboxGroupProps, type CheckboxProps, type CheckboxVariant, Hint, type HintProps, Icon, IconButton, type IconButtonColour, type IconButtonProps, type IconButtonSize, type IconButtonVariant, type IconCategory, type IconColour, type IconProps, type IconSize, Illustration, type IllustrationProps, type IllustrationSize, Input, InputDescription, type InputDescriptionProps, InputError, type InputErrorProps, InputField, type InputFieldProps, InputLabel, type InputLabelProps, type InputProps, Link, type LinkProps, type LinkSize, type LinkWeight, Logo, type LogoBrand, type LogoProps, type LogoSvgComponent, type LogoVariant, type PawprintIcon, type PawprintIllustration, PawprintProvider, type PawprintProviderProps, Radio, RadioGroup, type RadioGroupProps, type RadioOwnProps, type RadioProps, SegmentedControl, type SegmentedControlItemProps, type SegmentedControlProps, Slider, type SliderProps, Spinner, type SpinnerProps, type SpinnerSize, type SpinnerVariant, Switch, type SwitchProps, Tag, type TagProps, ThemeProvider, Typography, type TypographyProps, createPawprintTheme, registerLogo, resolveFont, resolveLogo, theme, usePawprint };
1589
+ type NotificationType = "error" | "success" | "warning" | "info";
1590
+ type NotificationSize = "sm" | "lg";
1591
+ type BaseProps = {
1592
+ type?: NotificationType;
1593
+ showIcon?: boolean;
1594
+ children: React.ReactNode;
1595
+ };
1596
+ type InlineVariantProps = BaseProps & {
1597
+ variant?: "inline";
1598
+ title?: string;
1599
+ onClose?: () => void;
1600
+ size?: never;
1601
+ link?: never;
1602
+ };
1603
+ type ToastVariantProps = BaseProps & {
1604
+ variant: "toast";
1605
+ onClose?: () => void;
1606
+ link?: {
1607
+ label: string;
1608
+ href?: string;
1609
+ onPress?: () => void;
1610
+ };
1611
+ title?: never;
1612
+ size?: never;
1613
+ };
1614
+ type SystemVariantProps = BaseProps & {
1615
+ variant: "system";
1616
+ size?: NotificationSize;
1617
+ title?: never;
1618
+ onClose?: never;
1619
+ link?: never;
1620
+ };
1621
+ type NotificationOwnProps = InlineVariantProps | ToastVariantProps | SystemVariantProps;
1622
+ type NotificationProps = NotificationOwnProps & Omit<ViewProps, keyof NotificationOwnProps>;
1623
+ /**
1624
+ * Displays contextual feedback messages to users. Supports three layout
1625
+ * variants — inline (within content flow), toast (floating overlay), and
1626
+ * system (full-width banner) — each with four severity types.
1627
+ *
1628
+ * Note: Unlike the web version, toast link uses `onPress` callback instead
1629
+ * of `href` for navigation. The `href` prop is also available and opens
1630
+ * the URL via `Linking`.
1631
+ *
1632
+ * @param {"inline" | "toast" | "system"} [variant="inline"] - Layout variant.
1633
+ * @param {"error" | "success" | "warning" | "info"} [type="error"] - Severity type controlling colours and icon.
1634
+ * @param {boolean} [showIcon=true] - Whether to show the status icon.
1635
+ * @param {string} [title] - Optional headline (inline variant only).
1636
+ * @param {() => void} [onClose] - Close callback (inline and toast variants).
1637
+ * @param {{ label: string; href?: string; onPress?: () => void }} [link] - Optional action link (toast variant only).
1638
+ * @param {"sm" | "lg"} [size="sm"] - Size variant (system variant only).
1639
+ * @param {React.ReactNode} children - The notification body text.
1640
+ *
1641
+ * @example
1642
+ * ```tsx
1643
+ * import { Notification } from "@butternutbox/pawprint-native"
1644
+ *
1645
+ * <Notification type="success" title="Order confirmed">
1646
+ * Your order has been placed successfully.
1647
+ * </Notification>
1648
+ * ```
1649
+ */
1650
+ declare const Notification: React.ForwardRefExoticComponent<NotificationProps & React.RefAttributes<View>>;
1651
+
1652
+ type TooltipAlignment = "left" | "middle" | "right";
1653
+ type TooltipPosition = "top" | "bottom";
1654
+ type TooltipOwnProps = {
1655
+ text: string;
1656
+ alignment?: TooltipAlignment;
1657
+ position?: TooltipPosition;
1658
+ /**
1659
+ * Trigger element. When provided the component manages its own open/close
1660
+ * state (press-to-toggle, animated). Omit for static rendering (docs stories).
1661
+ *
1662
+ * Requires a <PortalHost /> at the application root.
1663
+ */
1664
+ children?: React.ReactNode;
1665
+ };
1666
+ type TooltipProps = TooltipOwnProps & Omit<ViewProps, keyof TooltipOwnProps>;
1667
+ declare const Tooltip: React.ForwardRefExoticComponent<TooltipOwnProps & Omit<ViewProps, keyof TooltipOwnProps> & React.RefAttributes<View>>;
1668
+
1669
+ type PawprintIllustration$1 = React.ComponentType<{
1670
+ width?: number;
1671
+ height?: number;
1672
+ }>;
1673
+ type InsightVariant = "standalone" | "supporting";
1674
+ type MessageCardInsightOwnProps = {
1675
+ variant?: InsightVariant;
1676
+ icon?: PawprintIcon;
1677
+ illustration?: PawprintIllustration$1;
1678
+ title?: string;
1679
+ children: React.ReactNode;
1680
+ };
1681
+ type MessageCardInsightProps = MessageCardInsightOwnProps & Omit<ViewProps, keyof MessageCardInsightOwnProps>;
1682
+ /**
1683
+ * Yellow highlight card for bite-sized USPs and trust signals.
1684
+ *
1685
+ * @param {"standalone" | "supporting"} [variant="standalone"] - `supporting`
1686
+ * renders a flat top edge when attached to a related element above.
1687
+ * @param {PawprintIcon} [icon] - Optional core icon. Ignored when
1688
+ * `illustration` is provided.
1689
+ * @param {PawprintIllustration} [illustration] - Optional illustration; takes
1690
+ * precedence over `icon`.
1691
+ * @param {string} [title] - Optional headline. Renders above the body copy
1692
+ * in both `standalone` and `supporting` variants.
1693
+ * @param {React.ReactNode} children - Body copy.
1694
+ */
1695
+ declare const MessageCardInsight: React.ForwardRefExoticComponent<MessageCardInsightOwnProps & Omit<ViewProps, keyof MessageCardInsightOwnProps> & React.RefAttributes<View>>;
1696
+ type BannerColourScheme = "primary" | "secondary";
1697
+ type MessageCardBannerMedia = {
1698
+ type: "image";
1699
+ source: ImageSourcePropType;
1700
+ alt?: string;
1701
+ } | {
1702
+ type: "illustration";
1703
+ illustration: PawprintIllustration$1;
1704
+ };
1705
+ type MessageCardBannerOwnProps = {
1706
+ colourScheme?: BannerColourScheme;
1707
+ media?: MessageCardBannerMedia;
1708
+ title?: string;
1709
+ children: React.ReactNode;
1710
+ linkLabel?: string;
1711
+ linkHref?: string;
1712
+ onLinkPress?: () => void;
1713
+ };
1714
+ type MessageCardBannerProps = MessageCardBannerOwnProps & Omit<ViewProps, keyof MessageCardBannerOwnProps>;
1715
+ /**
1716
+ * Horizontal card with an image or illustration, title, body copy and an
1717
+ * optional link CTA.
1718
+ *
1719
+ * @param {"primary" | "secondary"} [colourScheme="primary"] - Background
1720
+ * scheme. `primary` is saturated yellow; `secondary` is a lighter cream.
1721
+ * @param {MessageCardBannerMedia} [media] - Tagged slot accepting either
1722
+ * `{ type: "image", source, alt }` or `{ type: "illustration", illustration }`.
1723
+ * @param {string} [title] - Optional headline.
1724
+ * @param {React.ReactNode} children - Body copy.
1725
+ * @param {string} [linkLabel] - CTA label. When provided with `linkHref` or
1726
+ * `onLinkPress`, renders a link row.
1727
+ * @param {string} [linkHref] - URL opened via `Linking` when pressed.
1728
+ * @param {() => void} [onLinkPress] - Callback when the CTA is pressed.
1729
+ */
1730
+ declare const MessageCardBanner: React.ForwardRefExoticComponent<MessageCardBannerOwnProps & Omit<ViewProps, keyof MessageCardBannerOwnProps> & React.RefAttributes<View>>;
1731
+ /**
1732
+ * Compound component exposing two sub-components:
1733
+ *
1734
+ * - `MessageCard.Insight` — yellow trust-signal card
1735
+ * - `MessageCard.Banner` — horizontal image/illustration + copy + optional CTA
1736
+ */
1737
+ declare const MessageCard: {
1738
+ Insight: React.ForwardRefExoticComponent<MessageCardInsightOwnProps & Omit<ViewProps, keyof MessageCardInsightOwnProps> & React.RefAttributes<View>>;
1739
+ Banner: React.ForwardRefExoticComponent<MessageCardBannerOwnProps & Omit<ViewProps, keyof MessageCardBannerOwnProps> & React.RefAttributes<View>>;
1740
+ };
1741
+
1742
+ /**
1743
+ * Visual state for a calendar date cell.
1744
+ *
1745
+ * - `previous` — Dates before today. Non-interactive, shown in muted text.
1746
+ * - `current` — Today's date. Bold + underlined, no indicator fill.
1747
+ * - `default` — A future date with no scheduled delivery. Plain text.
1748
+ * - `nextBox` — The next scheduled box delivery date. Filled dark indicator.
1749
+ * When selected (`selectedDate` matches): dashed-border indicator.
1750
+ * When disabled (`isDateDisabled` returns true): shown at reduced opacity (undeliverable — e.g. bank holiday).
1751
+ * - `futureBox` — A future recurring delivery slot (cadence-based, typically weekly).
1752
+ * Beige indicator by default.
1753
+ * When selected: dashed-border indicator (projected future delivery after user's chosen date).
1754
+ * When disabled: shown at reduced opacity (undeliverable — e.g. bank holiday).
1755
+ */
1756
+ type DateItemState = "default" | "previous" | "current" | "nextBox" | "futureBox";
1757
+ type DatePickerOwnProps = {
1758
+ year: number;
1759
+ month: number;
1760
+ selectedDate?: Date | null;
1761
+ selectedDates?: Date[];
1762
+ onDateSelect?: (date: Date) => void;
1763
+ onPrevMonth?: () => void;
1764
+ onNextMonth?: () => void;
1765
+ onMonthChange?: (year: number, month: number) => void;
1766
+ showWeekHeader?: boolean;
1767
+ showPrevControl?: boolean;
1768
+ showNextControl?: boolean;
1769
+ locale?: Locale;
1770
+ monthLabel?: string;
1771
+ weekDayLabels?: [string, string, string, string, string, string, string];
1772
+ getDateState?: (date: Date) => DateItemState;
1773
+ isDateDisabled?: (date: Date) => boolean;
1774
+ minDate?: Date;
1775
+ maxDate?: Date;
1776
+ };
1777
+ type DatePickerProps = DatePickerOwnProps & Omit<ViewProps, keyof DatePickerOwnProps>;
1778
+ /**
1779
+ * A controlled calendar date-picker showing a single month grid.
1780
+ *
1781
+ * Supports date states: default, previous, current, nextBox, futureBox.
1782
+ * Prev/next month navigation and the week-day header are optional.
1783
+ *
1784
+ * Note: Unlike the web version, there is no hover state (not available on mobile).
1785
+ *
1786
+ * @param {number} year - Full year (e.g. 2026).
1787
+ * @param {number} month - Zero-based month index (0–11).
1788
+ * @param {Date | null} [selectedDate] - Currently selected date.
1789
+ * @param {(date: Date) => void} [onDateSelect] - Called when the user selects a date.
1790
+ * @param {() => void} [onPrevMonth] - Called when the prev-month control is pressed.
1791
+ * @param {() => void} [onNextMonth] - Called when the next-month control is pressed.
1792
+ * @param {(year: number, month: number) => void} [onMonthChange] - Called with the new year and month (0-based) whenever the month changes via prev/next.
1793
+ * @param {boolean} [showWeekHeader=true] - Show the Mon–Sun column headers.
1794
+ * @param {boolean} [showPrevControl=true] - Show the left chevron control.
1795
+ * @param {boolean} [showNextControl=true] - Show the right chevron control.
1796
+ * @param {string} [monthLabel] - Override the month/year label (defaults to Intl formatting).
1797
+ * @param {[string,string,string,string,string,string,string]} [weekDayLabels] - Day-column labels Mon→Sun.
1798
+ * @param {(date: Date) => DateItemState} [getDateState] - Returns the visual state for a date.
1799
+ * Defaults to: past="previous", today="current", future="default".
1800
+ * @param {(date: Date) => boolean} [isDateDisabled] - Returns true to disable a date.
1801
+ * @param {Date} [minDate] - Dates before this (exclusive of time) will be disabled.
1802
+ * @param {Date} [maxDate] - Dates after this (exclusive of time) will be disabled.
1803
+ *
1804
+ * @example
1805
+ * ```tsx
1806
+ * import { DatePicker } from "@butternutbox/pawprint-native"
1807
+ *
1808
+ * const [month, setMonth] = React.useState(new Date().getMonth())
1809
+ * const [year, setYear] = React.useState(new Date().getFullYear())
1810
+ * const [selected, setSelected] = React.useState<Date | null>(null)
1811
+ *
1812
+ * <DatePicker
1813
+ * year={year}
1814
+ * month={month}
1815
+ * selectedDate={selected}
1816
+ * onDateSelect={setSelected}
1817
+ * onPrevMonth={() => setMonth(m => m === 0 ? (setYear(y => y - 1), 11) : m - 1)}
1818
+ * onNextMonth={() => setMonth(m => m === 11 ? (setYear(y => y + 1), 0) : m + 1)}
1819
+ * />
1820
+ * ```
1821
+ */
1822
+ declare const DatePicker: React.ForwardRefExoticComponent<DatePickerOwnProps & Omit<ViewProps, keyof DatePickerOwnProps> & React.RefAttributes<View>>;
1823
+
1824
+ type PawprintIllustration = React.ComponentType<{
1825
+ width?: number;
1826
+ height?: number;
1827
+ }>;
1828
+ type PictureSelectorItem = {
1829
+ value: string;
1830
+ illustration?: PawprintIllustration;
1831
+ disabled?: boolean;
1832
+ ariaLabel?: string;
1833
+ insightTitle?: string;
1834
+ insightDescription?: React.ReactNode;
1835
+ };
1836
+ type PictureSelectorOwnProps = {
1837
+ label?: string;
1838
+ items: PictureSelectorItem[];
1839
+ value?: string;
1840
+ defaultValue?: string;
1841
+ onValueChange?: (value: string) => void;
1842
+ /** Optional fixed card width (px). Defaults to `100%` (fluid). */
1843
+ itemWidth?: number;
1844
+ /** Card aspect ratio (width / height). Defaults to `1` (square). */
1845
+ itemAspectRatio?: number;
1846
+ /** Optional floor on each card's width (px). No default. */
1847
+ itemMinWidth?: number;
1848
+ /** Optional floor on each card's height (px). No default. */
1849
+ itemMinHeight?: number;
1850
+ };
1851
+ type PictureSelectorProps = PictureSelectorOwnProps & Omit<ViewProps, keyof PictureSelectorOwnProps>;
1852
+ /**
1853
+ * A horizontal group of image/illustration buttons where one is selectable at
1854
+ * a time. When the selected item has `insightTitle`/`insightDescription`, a
1855
+ * `MessageCard.Insight` (standalone variant) renders below the row with a
1856
+ * pointer beneath the selected button linking the two. The pointer moves with
1857
+ * the selection.
1858
+ *
1859
+ * By default each card fills the width of its flex item (`width: 100%`)
1860
+ * and is square (`aspectRatio: 1`). Override with `itemWidth` for a fixed
1861
+ * width, `itemAspectRatio` for a non-square shape, and `itemMinWidth` /
1862
+ * `itemMinHeight` for per-dim minimum floors.
1863
+ *
1864
+ * @param {string} [label] - Optional headline above the row.
1865
+ * @param {PictureSelectorItem[]} items - 3 or 4 items to choose between.
1866
+ * @param {string} [value] - Controlled selected value.
1867
+ * @param {string} [defaultValue] - Uncontrolled initial selected value.
1868
+ * @param {(value: string) => void} [onValueChange] - Fires when selection changes.
1869
+ * @param {number} [itemWidth] - Fixed card width (px). Defaults to `100%`.
1870
+ * @param {number} [itemAspectRatio=1] - Card aspect ratio (width / height).
1871
+ * @param {number} [itemMinWidth] - Optional override for the card's min-width.
1872
+ * Defaults to `pictureButton.size.minWidth` (80px).
1873
+ * @param {number} [itemMinHeight] - Optional override for the card's min-height.
1874
+ * Defaults to `pictureButton.size.minHeight` (120px).
1875
+ */
1876
+ declare const PictureSelector: React.ForwardRefExoticComponent<PictureSelectorOwnProps & Omit<ViewProps, keyof PictureSelectorOwnProps> & React.RefAttributes<View>>;
1877
+
1878
+ export { Accordion, type AccordionItemProps, type AccordionProps, type AccordionSize, Animated, type AnimatedProps, type AnimatedVariant, Avatar, type AvatarFallbackType, type AvatarProps, type AvatarSize, BRAND_FONTS, Badge, type BadgeProps, Button, type ButtonColour, ButtonDock, type ButtonDockProps, type ButtonDockVariant, ButtonGroup, type ButtonGroupLayout, type ButtonGroupProps, type ButtonProps, type ButtonSize, type ButtonVariant, CarouselControls, type CarouselControlsProps, Checkbox, CheckboxGroup, type CheckboxGroupProps, type CheckboxProps, type CheckboxVariant, CopyField, CopyFieldInput, type CopyFieldProps, type DateItemState, DatePicker, type DatePickerProps, Drawer, type DrawerBodyProps, type DrawerCloseProps, type DrawerContentProps, type DrawerDescriptionProps, type DrawerFooterProps, type DrawerGrabberProps, type DrawerHeaderProps, type DrawerHeaderVariant, type DrawerOverlayProps, type DrawerProps, type DrawerTitleProps, type DrawerTriggerProps, FilterTab, type FilterTabItemProps, type FilterTabProps, Hint, type HintProps, Icon, IconButton, type IconButtonColour, type IconButtonProps, type IconButtonSize, type IconButtonVariant, type IconCategory, type IconColour, type IconProps, type IconSize, Illustration, type IllustrationProps, type IllustrationSize, Input, InputDescription, type InputDescriptionProps, InputError, type InputErrorProps, InputField, type InputFieldProps, InputLabel, type InputLabelProps, type InputProps, Link, type LinkProps, type LinkSize, type LinkWeight, Logo, type LogoBrand, type LogoProps, type LogoSvgComponent, type LogoVariant, MessageCard, MessageCardBanner, type MessageCardBannerMedia, type MessageCardBannerProps, MessageCardInsight, type MessageCardInsightProps, Notification, type NotificationProps, NumberField, type NumberFieldProps, NumberInput, NumberInputField, type NumberInputFieldProps, type NumberInputProps, PasswordField, PasswordFieldInput, type PasswordFieldProps, PasswordFieldRequirements, type PasswordFieldRequirementsProps, type PasswordRequirement, type PasswordValidationRule, type PawprintIcon, type PawprintIllustration$2 as PawprintIllustration, PawprintProvider, type PawprintProviderProps, PictureSelector, type PictureSelectorItem, type PictureSelectorProps, Progress, type ProgressProps, Radio, RadioGroup, type RadioGroupProps, type RadioOwnProps, type RadioProps, SearchField, SearchFieldInput, type SearchFieldProps, SegmentedControl, type SegmentedControlItemProps, type SegmentedControlProps, SelectField, SelectFieldContent, SelectFieldItem, type SelectFieldItemProps, type SelectFieldProps, SelectFieldTrigger, type SelectFieldTriggerProps, SelectFieldValue, type SelectValidationRule, Slider, type SliderProps, Spinner, type SpinnerProps, type SpinnerSize, type SpinnerVariant, Switch, type SwitchProps, Tag, type TagProps, TextArea, TextAreaField, type TextAreaFieldProps, TextAreaLabel, type TextAreaLabelProps, type TextAreaProps, ThemeProvider, Tooltip, type TooltipProps, Typography, type TypographyProps, createPawprintTheme, fadeAnimation, fadeDownAnimation, fadeUpAnimation, registerLogo, resolveFont, resolveLogo, scaleAnimation, slideInAnimation, slideOutAnimation, theme, useCopyField, usePasswordField, usePawprint, useSearchField, useSelectField };