panelui-native 0.7.0 → 0.12.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 (161) hide show
  1. package/README.md +5 -3
  2. package/lib/module/components/attachment/index.js +219 -0
  3. package/lib/module/components/attachment/index.js.map +1 -0
  4. package/lib/module/components/bottom-sheet/index.js +53 -3
  5. package/lib/module/components/bottom-sheet/index.js.map +1 -1
  6. package/lib/module/components/button/index.js +19 -1
  7. package/lib/module/components/button/index.js.map +1 -1
  8. package/lib/module/components/dialog/index.js +6 -2
  9. package/lib/module/components/dialog/index.js.map +1 -1
  10. package/lib/module/components/empty-state/index.js +94 -17
  11. package/lib/module/components/empty-state/index.js.map +1 -1
  12. package/lib/module/components/frame/index.js +128 -15
  13. package/lib/module/components/frame/index.js.map +1 -1
  14. package/lib/module/components/input/index.js +107 -15
  15. package/lib/module/components/input/index.js.map +1 -1
  16. package/lib/module/components/line-chart/index.js +1024 -0
  17. package/lib/module/components/line-chart/index.js.map +1 -0
  18. package/lib/module/components/marker/index.js +190 -0
  19. package/lib/module/components/marker/index.js.map +1 -0
  20. package/lib/module/components/message/index.js +24 -8
  21. package/lib/module/components/message/index.js.map +1 -1
  22. package/lib/module/components/message-scroller/index.js +451 -0
  23. package/lib/module/components/message-scroller/index.js.map +1 -0
  24. package/lib/module/components/popover/index.js +511 -0
  25. package/lib/module/components/popover/index.js.map +1 -0
  26. package/lib/module/components/progress/index.js +52 -2
  27. package/lib/module/components/progress/index.js.map +1 -1
  28. package/lib/module/components/radio-group/index.js +132 -17
  29. package/lib/module/components/radio-group/index.js.map +1 -1
  30. package/lib/module/components/section-rail/index.js +355 -0
  31. package/lib/module/components/section-rail/index.js.map +1 -0
  32. package/lib/module/components/select/index.js +245 -56
  33. package/lib/module/components/select/index.js.map +1 -1
  34. package/lib/module/components/separator/index.js +91 -0
  35. package/lib/module/components/separator/index.js.map +1 -0
  36. package/lib/module/components/slider/index.js +355 -0
  37. package/lib/module/components/slider/index.js.map +1 -0
  38. package/lib/module/components/surface/index.js +21 -2
  39. package/lib/module/components/surface/index.js.map +1 -1
  40. package/lib/module/components/switch/index.js +10 -1
  41. package/lib/module/components/switch/index.js.map +1 -1
  42. package/lib/module/components/tabs/index.js +186 -16
  43. package/lib/module/components/tabs/index.js.map +1 -1
  44. package/lib/module/components/toggle-button/index.js +297 -0
  45. package/lib/module/components/toggle-button/index.js.map +1 -0
  46. package/lib/module/hooks/index.js +1 -0
  47. package/lib/module/hooks/index.js.map +1 -1
  48. package/lib/module/hooks/use-keyboard-avoidance.js +57 -8
  49. package/lib/module/hooks/use-keyboard-avoidance.js.map +1 -1
  50. package/lib/module/hooks/use-scroll-sections.js +89 -0
  51. package/lib/module/hooks/use-scroll-sections.js.map +1 -0
  52. package/lib/module/icons/index.js +69 -0
  53. package/lib/module/icons/index.js.map +1 -1
  54. package/lib/module/index.js +11 -2
  55. package/lib/module/index.js.map +1 -1
  56. package/lib/module/native/index.js.map +1 -1
  57. package/lib/module/primitives/keyboard-avoider.js +2 -0
  58. package/lib/module/primitives/keyboard-avoider.js.map +1 -1
  59. package/lib/module/primitives/scrim.js +72 -0
  60. package/lib/module/primitives/scrim.js.map +1 -0
  61. package/lib/module/utils/haptics.js +57 -0
  62. package/lib/module/utils/haptics.js.map +1 -0
  63. package/lib/typescript/src/components/attachment/index.d.ts +93 -0
  64. package/lib/typescript/src/components/attachment/index.d.ts.map +1 -0
  65. package/lib/typescript/src/components/bottom-sheet/index.d.ts +6 -1
  66. package/lib/typescript/src/components/bottom-sheet/index.d.ts.map +1 -1
  67. package/lib/typescript/src/components/button/index.d.ts +9 -4
  68. package/lib/typescript/src/components/button/index.d.ts.map +1 -1
  69. package/lib/typescript/src/components/dialog/index.d.ts +7 -1
  70. package/lib/typescript/src/components/dialog/index.d.ts.map +1 -1
  71. package/lib/typescript/src/components/empty-state/index.d.ts +152 -2
  72. package/lib/typescript/src/components/empty-state/index.d.ts.map +1 -1
  73. package/lib/typescript/src/components/frame/index.d.ts +47 -7
  74. package/lib/typescript/src/components/frame/index.d.ts.map +1 -1
  75. package/lib/typescript/src/components/input/index.d.ts +113 -2
  76. package/lib/typescript/src/components/input/index.d.ts.map +1 -1
  77. package/lib/typescript/src/components/line-chart/index.d.ts +247 -0
  78. package/lib/typescript/src/components/line-chart/index.d.ts.map +1 -0
  79. package/lib/typescript/src/components/marker/index.d.ts +137 -0
  80. package/lib/typescript/src/components/marker/index.d.ts.map +1 -0
  81. package/lib/typescript/src/components/message/index.d.ts +8 -1
  82. package/lib/typescript/src/components/message/index.d.ts.map +1 -1
  83. package/lib/typescript/src/components/message-scroller/index.d.ts +150 -0
  84. package/lib/typescript/src/components/message-scroller/index.d.ts.map +1 -0
  85. package/lib/typescript/src/components/popover/index.d.ts +136 -0
  86. package/lib/typescript/src/components/popover/index.d.ts.map +1 -0
  87. package/lib/typescript/src/components/progress/index.d.ts +33 -0
  88. package/lib/typescript/src/components/progress/index.d.ts.map +1 -1
  89. package/lib/typescript/src/components/radio-group/index.d.ts +39 -0
  90. package/lib/typescript/src/components/radio-group/index.d.ts.map +1 -1
  91. package/lib/typescript/src/components/section-rail/index.d.ts +115 -0
  92. package/lib/typescript/src/components/section-rail/index.d.ts.map +1 -0
  93. package/lib/typescript/src/components/select/index.d.ts +46 -7
  94. package/lib/typescript/src/components/select/index.d.ts.map +1 -1
  95. package/lib/typescript/src/components/separator/index.d.ts +47 -0
  96. package/lib/typescript/src/components/separator/index.d.ts.map +1 -0
  97. package/lib/typescript/src/components/slider/index.d.ts +203 -0
  98. package/lib/typescript/src/components/slider/index.d.ts.map +1 -0
  99. package/lib/typescript/src/components/surface/index.d.ts +51 -2
  100. package/lib/typescript/src/components/surface/index.d.ts.map +1 -1
  101. package/lib/typescript/src/components/switch/index.d.ts.map +1 -1
  102. package/lib/typescript/src/components/tabs/index.d.ts +46 -4
  103. package/lib/typescript/src/components/tabs/index.d.ts.map +1 -1
  104. package/lib/typescript/src/components/toggle-button/index.d.ts +244 -0
  105. package/lib/typescript/src/components/toggle-button/index.d.ts.map +1 -0
  106. package/lib/typescript/src/hooks/index.d.ts +1 -0
  107. package/lib/typescript/src/hooks/index.d.ts.map +1 -1
  108. package/lib/typescript/src/hooks/use-keyboard-avoidance.d.ts +10 -1
  109. package/lib/typescript/src/hooks/use-keyboard-avoidance.d.ts.map +1 -1
  110. package/lib/typescript/src/hooks/use-scroll-sections.d.ts +31 -0
  111. package/lib/typescript/src/hooks/use-scroll-sections.d.ts.map +1 -0
  112. package/lib/typescript/src/icons/index.d.ts +6 -0
  113. package/lib/typescript/src/icons/index.d.ts.map +1 -1
  114. package/lib/typescript/src/index.d.ts +13 -4
  115. package/lib/typescript/src/index.d.ts.map +1 -1
  116. package/lib/typescript/src/native/index.d.ts +16 -1
  117. package/lib/typescript/src/native/index.d.ts.map +1 -1
  118. package/lib/typescript/src/primitives/keyboard-avoider.d.ts +8 -1
  119. package/lib/typescript/src/primitives/keyboard-avoider.d.ts.map +1 -1
  120. package/lib/typescript/src/primitives/scrim.d.ts +21 -0
  121. package/lib/typescript/src/primitives/scrim.d.ts.map +1 -0
  122. package/lib/typescript/src/utils/haptics.d.ts +12 -0
  123. package/lib/typescript/src/utils/haptics.d.ts.map +1 -0
  124. package/package.json +9 -1
  125. package/src/components/attachment/index.tsx +279 -0
  126. package/src/components/bottom-sheet/index.tsx +58 -2
  127. package/src/components/button/index.tsx +26 -5
  128. package/src/components/dialog/index.tsx +10 -1
  129. package/src/components/empty-state/index.tsx +60 -14
  130. package/src/components/frame/index.tsx +175 -29
  131. package/src/components/input/index.tsx +122 -16
  132. package/src/components/line-chart/index.tsx +1224 -0
  133. package/src/components/marker/index.tsx +194 -0
  134. package/src/components/message/index.tsx +29 -5
  135. package/src/components/message-scroller/index.tsx +574 -0
  136. package/src/components/popover/index.tsx +624 -0
  137. package/src/components/progress/index.tsx +81 -1
  138. package/src/components/radio-group/index.tsx +156 -18
  139. package/src/components/section-rail/index.tsx +459 -0
  140. package/src/components/select/index.tsx +265 -52
  141. package/src/components/separator/index.tsx +97 -0
  142. package/src/components/slider/index.tsx +371 -0
  143. package/src/components/surface/index.tsx +29 -3
  144. package/src/components/switch/index.tsx +8 -1
  145. package/src/components/tabs/index.tsx +208 -28
  146. package/src/components/toggle-button/index.tsx +374 -0
  147. package/src/hooks/index.ts +5 -0
  148. package/src/hooks/use-keyboard-avoidance.ts +73 -7
  149. package/src/hooks/use-scroll-sections.ts +127 -0
  150. package/src/icons/index.tsx +48 -0
  151. package/src/index.ts +97 -6
  152. package/src/native/index.ts +13 -1
  153. package/src/primitives/keyboard-avoider.tsx +9 -1
  154. package/src/primitives/scrim.tsx +95 -0
  155. package/src/utils/haptics.ts +63 -0
  156. package/theme.css +64 -2
  157. package/lib/module/components/inline-select/index.js +0 -284
  158. package/lib/module/components/inline-select/index.js.map +0 -1
  159. package/lib/typescript/src/components/inline-select/index.d.ts +0 -48
  160. package/lib/typescript/src/components/inline-select/index.d.ts.map +0 -1
  161. package/src/components/inline-select/index.tsx +0 -332
@@ -0,0 +1,31 @@
1
+ import type { LayoutChangeEvent, NativeScrollEvent, NativeSyntheticEvent, ScrollView } from 'react-native';
2
+ export interface UseScrollSectionsOptions {
3
+ /** Section ids, in the order they appear down the page. */
4
+ ids: string[];
5
+ /**
6
+ * How far down the viewport the reading line sits, in pixels. Larger values
7
+ * switch to the next section later.
8
+ */
9
+ offset?: number;
10
+ /** How close to the bottom counts as "at the bottom", in pixels. */
11
+ endThreshold?: number;
12
+ /** Extra gap left above a section when scrolling to it. */
13
+ scrollPadding?: number;
14
+ }
15
+ export interface UseScrollSectionsResult {
16
+ /** Attach to the ScrollView, so `scrollTo` has something to drive. */
17
+ ref: React.RefObject<ScrollView | null>;
18
+ /** The section being read. */
19
+ active: string | undefined;
20
+ /** Spread onto the ScrollView. */
21
+ scrollProps: {
22
+ onScroll: (event: NativeSyntheticEvent<NativeScrollEvent>) => void;
23
+ scrollEventThrottle: number;
24
+ };
25
+ /** `onLayout` for a section's wrapper: `onLayout={measure(id)}`. */
26
+ measure: (id: string) => (event: LayoutChangeEvent) => void;
27
+ /** Scroll a section to the top. Pass straight to a rail's `onValueChange`. */
28
+ scrollTo: (id: string) => void;
29
+ }
30
+ export declare function useScrollSections({ ids, offset, endThreshold, scrollPadding, }: UseScrollSectionsOptions): UseScrollSectionsResult;
31
+ //# sourceMappingURL=use-scroll-sections.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-scroll-sections.d.ts","sourceRoot":"","sources":["../../../../src/hooks/use-scroll-sections.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,UAAU,EACX,MAAM,cAAc,CAAC;AAEtB,MAAM,WAAW,wBAAwB;IACvC,2DAA2D;IAC3D,GAAG,EAAE,MAAM,EAAE,CAAC;IACd;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2DAA2D;IAC3D,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,uBAAuB;IACtC,sEAAsE;IACtE,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACxC,8BAA8B;IAC9B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,kCAAkC;IAClC,WAAW,EAAE;QACX,QAAQ,EAAE,CAAC,KAAK,EAAE,oBAAoB,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;QACnE,mBAAmB,EAAE,MAAM,CAAC;KAC7B,CAAC;IACF,oEAAoE;IACpE,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC5D,8EAA8E;IAC9E,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AAED,wBAAgB,iBAAiB,CAAC,EAChC,GAAG,EACH,MAAY,EACZ,YAAiB,EACjB,aAAiB,GAClB,EAAE,wBAAwB,GAAG,uBAAuB,CAyDpD"}
@@ -66,4 +66,10 @@ export declare function CardIcon({ size, color, ...props }: IconProps): import("
66
66
  export declare function ReceiptIcon({ size, color, ...props }: IconProps): import("react").JSX.Element;
67
67
  /** Paper plane — sent, submitted, approved-and-forwarded. */
68
68
  export declare function SendIcon({ size, color, ...props }: IconProps): import("react").JSX.Element;
69
+ /** Document with a folded corner — a file attachment. */
70
+ export declare function FileIcon({ size, color, ...props }: IconProps): import("react").JSX.Element;
71
+ /** Framed picture with a sun and a corner peak — an image attachment. */
72
+ export declare function ImageIcon({ size, color, ...props }: IconProps): import("react").JSX.Element;
73
+ /** A paperclip — attaching a file to a composer. */
74
+ export declare function PaperclipIcon({ size, color, ...props }: IconProps): import("react").JSX.Element;
69
75
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/icons/index.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/icons/index.tsx"],"names":[],"mappings":"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"}
@@ -5,16 +5,19 @@ export { Text, type TextProps } from './primitives/text.js';
5
5
  export { KeyboardAvoider, type KeyboardAvoiderProps, } from './primitives/keyboard-avoider.js';
6
6
  export { AnimatedPressable, type AnimatedPressableProps, } from './primitives/animated-pressable.js';
7
7
  export { hasNativeUI } from './native/index.js';
8
+ export { hasHaptics, selectionTick } from './utils/haptics.js';
8
9
  export { Accordion, type AccordionProps, type AccordionItemProps, type AccordionTriggerProps, type AccordionIndicatorProps, type AccordionContentProps, type AccordionVariant, type AccordionSelectionMode, } from './components/accordion/index.js';
9
10
  export { Alert, type AlertProps, type AlertIndicatorProps, } from './components/alert/index.js';
10
11
  export { Avatar, type AvatarProps, type AvatarBadgeProps, } from './components/avatar/index.js';
12
+ export { Attachment, type AttachmentProps, type AttachmentGroupProps, type AttachmentMediaProps, type AttachmentContentProps, type AttachmentTitleProps, type AttachmentDescriptionProps, type AttachmentActionsProps, type AttachmentActionProps, type AttachmentState, } from './components/attachment/index.js';
11
13
  export { Badge, type BadgeProps } from './components/badge/index.js';
12
14
  export { BottomSheet, type BottomSheetProps, type BottomSheetContentProps, } from './components/bottom-sheet/index.js';
13
15
  export { Button, type ButtonProps } from './components/button/index.js';
16
+ export { ToggleButton, ToggleButtonGroup, useToggleButton, type ToggleButtonProps, type ToggleButtonGroupProps, type ToggleButtonLabelProps, type ToggleButtonSize, type ToggleButtonVariant, type ToggleSelectionMode, } from './components/toggle-button/index.js';
14
17
  export { Dialog, type DialogProps, type DialogContentProps, } from './components/dialog/index.js';
15
- export { Frame, type FrameProps } from './components/frame/index.js';
16
- export { InlineSelect, type InlineSelectProps, type InlineSelectItemProps, } from './components/inline-select/index.js';
17
- export { Select, type SelectProps, type SelectItemProps } from './components/select/index.js';
18
+ export { Frame, type FrameProps, type FrameRootProps, type FramePanelProps, type FrameRowProps, type FrameSectionProps, type FrameVariant, } from './components/frame/index.js';
19
+ export { Select, type SelectProps, type SelectItemProps, type SelectPresentation, } from './components/select/index.js';
20
+ export { SectionRail, type SectionRailProps, type SectionRailTriggerProps, type SectionRailBarProps, type SectionRailContentProps, type SectionRailItemProps, type SectionRailPlacement, type SectionRailAlign, } from './components/section-rail/index.js';
18
21
  export { Tabs, type TabsProps, type TabsListProps, type TabsTriggerProps, type TabsContentProps, } from './components/tabs/index.js';
19
22
  export { Card, type CardProps } from './components/card/index.js';
20
23
  export { Checkbox, type CheckboxProps } from './components/checkbox/index.js';
@@ -23,12 +26,18 @@ export { Input, type InputProps } from './components/input/index.js';
23
26
  export { InputGroup, type InputGroupProps, type InputGroupInputProps, type InputGroupDecoratorProps, } from './components/input-group/index.js';
24
27
  export { Item, type ItemProps, type ItemGroupProps, type ItemSeparatorProps, type ItemMediaProps, type ItemContentProps, type ItemTitleProps, type ItemDescriptionProps, type ItemActionsProps, type ItemHeaderProps, type ItemFooterProps, } from './components/item/index.js';
25
28
  export { Label, type LabelProps, type LabelTextProps } from './components/label/index.js';
29
+ export { LineChart, useLineChart, type LineChartProps, type LineChartHandle, type LineChartGridProps, type LineChartLineProps, type LineChartAreaProps, type LineChartSkeletonProps, type LineChartXAxisProps, type LineChartTooltipProps, type LineChartLegendProps, type LineChartDatum, type LineChartStatus, type LineChartCurve, } from './components/line-chart/index.js';
30
+ export { Marker, type MarkerProps, type MarkerIconProps, type MarkerContentProps, } from './components/marker/index.js';
31
+ export { MessageScroller, useMessageScroller, useMessageScrollerVisibility, type MessageScrollerProps, type MessageScrollerViewportProps, type MessageScrollerContentProps, type MessageScrollerItemProps, type MessageScrollerButtonProps, type MessageScrollerPosition, } from './components/message-scroller/index.js';
26
32
  export { Message, type MessageProps, type MessageGroupProps, type MessageAvatarProps, type MessageContentProps, type MessageHeaderProps, type MessageBubbleProps, type MessageBubbleContentProps, type MessageFooterProps, type MessageActionsProps, } from './components/message/index.js';
33
+ export { Popover, type PopoverProps, type PopoverTriggerProps, type PopoverContentProps, type PopoverArrowProps, type PopoverCloseProps, type PopoverPlacement, type PopoverAlign, type PopoverPresentation, } from './components/popover/index.js';
27
34
  export { Progress, type ProgressProps } from './components/progress/index.js';
28
35
  export { RadioGroup, type RadioGroupProps, type RadioGroupItemProps, } from './components/radio-group/index.js';
29
36
  export { ScrollFade, type ScrollFadeProps, } from './components/scroll-fade/index.js';
37
+ export { Separator, type SeparatorProps } from './components/separator/index.js';
30
38
  export { Shimmer, type ShimmerProps } from './components/shimmer/index.js';
31
39
  export { Skeleton, type SkeletonProps } from './components/skeleton/index.js';
40
+ export { Slider, type SliderProps } from './components/slider/index.js';
32
41
  export { Spinner, type SpinnerProps } from './components/spinner/index.js';
33
42
  export { Steps, type StepsProps, type StepsItemProps, type StepsTriggerProps, type StepsIndicatorProps, type StepsSeparatorProps, type StepState, type StepsOrientation, } from './components/steps/index.js';
34
43
  export { Surface, type SurfaceProps } from './components/surface/index.js';
@@ -36,7 +45,7 @@ export { Switch, type SwitchProps } from './components/switch/index.js';
36
45
  export { Timeline, type TimelineProps, type TimelineItemProps, type TimelineIndicatorProps, type TimelineStatProps, type TimelineVariant, type TimelineTone, } from './components/timeline/index.js';
37
46
  export { Toast, ToastViewport, toast, useToast, type ToastProps, type ToastOptions, type ToastItem, type ToastVariant, type ToastPlacement, type ToastHandle, type ToastIndicatorProps, type ToastCloseProps, } from './components/toast/index.js';
38
47
  export { Typography, type TypographyProps, type TypographyType, type TypographyHeadingProps, type TypographyParagraphProps, type TypographyCodeProps, } from './components/typography/index.js';
39
- export { AlertTriangleIcon, AppleIcon, ArrowUpRightIcon, BellIcon, CardIcon, CheckCircleIcon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, FacebookIcon, GoogleIcon, IconColorProvider, InfoIcon, MoonIcon, PackageIcon, PlusSquareIcon, ReceiptIcon, SearchIcon, SendIcon, ShareNodesIcon, ShieldAlertIcon, ShieldCheckIcon, SunIcon, XIcon, useIconColor, type IconProps, } from './icons/index.js';
48
+ export { AlertTriangleIcon, AppleIcon, ArrowUpRightIcon, BellIcon, CardIcon, CheckCircleIcon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, FacebookIcon, FileIcon, GoogleIcon, IconColorProvider, InfoIcon, ImageIcon, MoonIcon, PackageIcon, PaperclipIcon, PlusSquareIcon, ReceiptIcon, SearchIcon, SendIcon, ShareNodesIcon, ShieldAlertIcon, ShieldCheckIcon, SunIcon, XIcon, useIconColor, type IconProps, } from './icons/index.js';
40
49
  export * from './hooks/index.js';
41
50
  export { cn } from './utils/cn.js';
42
51
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,21 @@ import type { ComponentType, ReactNode } from 'react';
2
2
  interface NativeUIModule {
3
3
  Host: ComponentType<{
4
4
  children?: ReactNode;
5
- matchContents?: boolean;
5
+ /**
6
+ * Whether the host resizes itself to the platform content.
7
+ *
8
+ * Every control here gives the host an explicit height instead, and takes
9
+ * its width from ordinary layout. The measurement arrives a frame late and
10
+ * again whenever the platform's content changes, so a host left to work
11
+ * its own size out renders at nothing and then jumps — on first paint, and
12
+ * again on first press. The per-axis form does not help; the answer is not
13
+ * to ask. Only the natively-presented sheet still uses it, where the host
14
+ * is a zero-size anchor rather than the control itself.
15
+ */
16
+ matchContents?: boolean | {
17
+ vertical?: boolean;
18
+ horizontal?: boolean;
19
+ };
6
20
  style?: unknown;
7
21
  [key: string]: unknown;
8
22
  }>;
@@ -18,6 +32,7 @@ interface NativeUIModule {
18
32
  }>;
19
33
  Button: ComponentType<Record<string, unknown>>;
20
34
  Switch: ComponentType<Record<string, unknown>>;
35
+ Slider: ComponentType<Record<string, unknown>>;
21
36
  Picker: ComponentType<Record<string, unknown>> & {
22
37
  Item: ComponentType<Record<string, unknown>>;
23
38
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/native/index.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEtD,UAAU,cAAc;IACtB,IAAI,EAAE,aAAa,CAAC;QAClB,QAAQ,CAAC,EAAE,SAAS,CAAC;QACrB,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC,CAAC;IACH;;;;OAIG;IACH,UAAU,EAAE,aAAa,CAAC;QACxB,QAAQ,CAAC,EAAE,SAAS,CAAC;QACrB,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB,CAAC,CAAC;IACH,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/C,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/C,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG;QAC/C,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;KAC9C,CAAC;IACF,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACrD;AAKD;;;;GAIG;AACH,wBAAgB,WAAW,IAAI,cAAc,GAAG,IAAI,CAgBnD;AAED,gEAAgE;AAChE,wBAAgB,WAAW,IAAI,OAAO,CAErC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/native/index.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEtD,UAAU,cAAc;IACtB,IAAI,EAAE,aAAa,CAAC;QAClB,QAAQ,CAAC,EAAE,SAAS,CAAC;QACrB;;;;;;;;;;WAUG;QACH,aAAa,CAAC,EAAE,OAAO,GAAG;YAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;YAAC,UAAU,CAAC,EAAE,OAAO,CAAA;SAAE,CAAC;QACvE,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC,CAAC;IACH;;;;OAIG;IACH,UAAU,EAAE,aAAa,CAAC;QACxB,QAAQ,CAAC,EAAE,SAAS,CAAC;QACrB,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB,CAAC,CAAC;IACH,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/C,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/C,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/C,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG;QAC/C,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;KAC9C,CAAC;IACF,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACrD;AAKD;;;;GAIG;AACH,wBAAgB,WAAW,IAAI,cAAc,GAAG,IAAI,CAgBnD;AAED,gEAAgE;AAChE,wBAAgB,WAAW,IAAI,OAAO,CAErC"}
@@ -11,11 +11,18 @@ export interface KeyboardAvoiderProps extends ViewProps {
11
11
  className?: string;
12
12
  /** Set false to leave the content where it is. */
13
13
  enabled?: boolean;
14
+ /**
15
+ * Whether this is the element that should get out of the keyboard's way.
16
+ * Defaults to true, which is right for a composer or a toolbar. Pass a
17
+ * field's focus state when wrapping a single field, so the others on the
18
+ * screen stay put.
19
+ */
20
+ active?: boolean;
14
21
  /** Gap to keep between the content's bottom edge and the keyboard. */
15
22
  offset?: number;
16
23
  children?: ReactNode;
17
24
  }
18
- export declare function KeyboardAvoider({ className, enabled, offset, children, style, onLayout, ...props }: KeyboardAvoiderProps): import("react").JSX.Element;
25
+ export declare function KeyboardAvoider({ className, enabled, active, offset, children, style, onLayout, ...props }: KeyboardAvoiderProps): import("react").JSX.Element;
19
26
  export declare namespace KeyboardAvoider {
20
27
  var displayName: string;
21
28
  }
@@ -1 +1 @@
1
- {"version":3,"file":"keyboard-avoider.d.ts","sourceRoot":"","sources":["../../../../src/primitives/keyboard-avoider.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAI9C,MAAM,WAAW,oBAAqB,SAAQ,SAAS;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,wBAAgB,eAAe,CAAC,EAC9B,SAAS,EACT,OAAc,EACd,MAAW,EACX,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,oBAAoB,+BAiBtB;yBAzBe,eAAe"}
1
+ {"version":3,"file":"keyboard-avoider.d.ts","sourceRoot":"","sources":["../../../../src/primitives/keyboard-avoider.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAI9C,MAAM,WAAW,oBAAqB,SAAQ,SAAS;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,wBAAgB,eAAe,CAAC,EAC9B,SAAS,EACT,OAAc,EACd,MAAa,EACb,MAAW,EACX,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,oBAAoB,+BAiBtB;yBA1Be,eAAe"}
@@ -0,0 +1,21 @@
1
+ import { type ViewProps } from 'react-native';
2
+ /** True when a real blur can be drawn — for a caller that wants to know. */
3
+ export declare const hasBlur: boolean;
4
+ export interface ScrimProps extends Omit<ViewProps, 'children'> {
5
+ /** Frost the backdrop instead of dimming it. Falls back to a dim if it can't. */
6
+ blur?: boolean;
7
+ /** Blur strength, 0–100. */
8
+ intensity?: number;
9
+ /** Which way the blur tints. */
10
+ tint?: 'light' | 'dark' | 'default' | 'systemMaterial';
11
+ /**
12
+ * The dim used when not blurring — and when blurring is asked for but
13
+ * unavailable. A popover passes a lighter one than a dialog.
14
+ */
15
+ dimClassName?: string;
16
+ }
17
+ export declare function Scrim({ blur, intensity, tint, dimClassName, style, ...props }: ScrimProps): import("react").JSX.Element;
18
+ export declare namespace Scrim {
19
+ var displayName: string;
20
+ }
21
+ //# sourceMappingURL=scrim.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scrim.d.ts","sourceRoot":"","sources":["../../../../src/primitives/scrim.tsx"],"names":[],"mappings":"AAiBA,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAyBhE,4EAA4E;AAC5E,eAAO,MAAM,OAAO,SAAoB,CAAC;AAEzC,MAAM,WAAW,UAAW,SAAQ,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC;IAC7D,iFAAiF;IACjF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,gBAAgB,CAAC;IACvD;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,KAAK,CAAC,EACpB,IAAY,EACZ,SAAc,EACd,IAAgB,EAChB,YAA4B,EAC5B,KAAK,EACL,GAAG,KAAK,EACT,EAAE,UAAU,+BA0BZ;yBAjCe,KAAK"}
@@ -0,0 +1,12 @@
1
+ /** Whether a haptic will actually be felt. */
2
+ export declare function hasHaptics(): boolean;
3
+ /**
4
+ * The light tick for moving between options — a segmented control, a picker,
5
+ * a section marker. Deliberately not an impact: selection is the lightest of
6
+ * the feedbacks, and anything heavier gets tiring when it fires on scroll.
7
+ *
8
+ * Fire-and-forget. A rejected haptic is not worth an unhandled rejection, and
9
+ * there is nothing useful to do about one.
10
+ */
11
+ export declare function selectionTick(): void;
12
+ //# sourceMappingURL=haptics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"haptics.d.ts","sourceRoot":"","sources":["../../../../src/utils/haptics.ts"],"names":[],"mappings":"AA+CA,8CAA8C;AAC9C,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAEpC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "panelui-native",
3
- "version": "0.7.0",
3
+ "version": "0.12.0",
4
4
  "description": "High-performance React Native UI components for Expo. Semantic design tokens, powered by Uniwind (Tailwind v4) and Reanimated.",
5
5
  "main": "./lib/module/index.js",
6
6
  "module": "./lib/module/index.js",
@@ -65,7 +65,9 @@
65
65
  "peerDependencies": {
66
66
  "@expo/ui": "*",
67
67
  "@react-native-masked-view/masked-view": ">=0.3.0",
68
+ "expo-blur": ">=13.0.0",
68
69
  "expo-clipboard": ">=7.0.0",
70
+ "expo-haptics": ">=13.0.0",
69
71
  "expo-linear-gradient": ">=13.0.0",
70
72
  "react": "*",
71
73
  "react-native": "*",
@@ -102,9 +104,15 @@
102
104
  "@expo/ui": {
103
105
  "optional": true
104
106
  },
107
+ "expo-blur": {
108
+ "optional": true
109
+ },
105
110
  "expo-clipboard": {
106
111
  "optional": true
107
112
  },
113
+ "expo-haptics": {
114
+ "optional": true
115
+ },
108
116
  "react-native-keyboard-controller": {
109
117
  "optional": true
110
118
  }
@@ -0,0 +1,279 @@
1
+ /**
2
+ * Attachment — a file, with its upload life.
3
+ *
4
+ * A file in a chat composer or an upload list is the same row shape `Item`
5
+ * already draws — media, a name, a size, a remove button — so this is that row,
6
+ * not a second one. What it adds is the part `Item` has no opinion on: the
7
+ * file's *state*. A file is picked, then uploading, then processing, then done
8
+ * (or failed), and each of those has to look different or the user cannot tell
9
+ * a stuck upload from a finished one.
10
+ *
11
+ * ```tsx
12
+ * <Attachment state="uploading">
13
+ * <Attachment.Media><FileIcon /></Attachment.Media>
14
+ * <Attachment.Content>
15
+ * <Attachment.Title>report.pdf</Attachment.Title>
16
+ * <Attachment.Description>PDF · 2.4 MB</Attachment.Description>
17
+ * </Attachment.Content>
18
+ * <Attachment.Actions>
19
+ * <Attachment.Action aria-label="Cancel"><XIcon size={14} /></Attachment.Action>
20
+ * </Attachment.Actions>
21
+ * </Attachment>
22
+ * ```
23
+ *
24
+ * While uploading or processing the title shimmers — the same sweep the rest of
25
+ * the library uses for "in progress" — and an optional bar tracks `progress`.
26
+ * A failed file tints its name and description in the destructive colour, which
27
+ * carries the state without relying on an icon nobody reads.
28
+ */
29
+ import { createContext, forwardRef, useContext, type ReactNode } from 'react';
30
+ import { View, type ViewProps } from 'react-native';
31
+ import { tv } from 'tailwind-variants';
32
+ import { useCSSVariable } from 'uniwind';
33
+ import { AnimatedPressable, type AnimatedPressableProps } from '../../primitives/animated-pressable';
34
+ import { Text, type TextProps } from '../../primitives/text';
35
+ import { cn } from '../../utils/cn';
36
+ import { Item } from '../item';
37
+ import { Shimmer } from '../shimmer';
38
+
39
+ export type AttachmentState = 'idle' | 'uploading' | 'processing' | 'error' | 'done';
40
+ type AttachmentSize = 'default' | 'sm' | 'xs';
41
+
42
+ interface AttachmentContextValue {
43
+ state: AttachmentState;
44
+ size: AttachmentSize;
45
+ }
46
+
47
+ const AttachmentContext = createContext<AttachmentContextValue>({
48
+ state: 'done',
49
+ size: 'default',
50
+ });
51
+
52
+ /** True while the file is still moving — the two states that shimmer. */
53
+ function isBusy(state: AttachmentState): boolean {
54
+ return state === 'uploading' || state === 'processing';
55
+ }
56
+
57
+ const rootVariants = tv({
58
+ base: '',
59
+ variants: {
60
+ state: {
61
+ idle: '',
62
+ uploading: '',
63
+ processing: '',
64
+ // The border carries the failure, so it reads at a glance in a list.
65
+ error: 'border border-destructive',
66
+ done: '',
67
+ },
68
+ },
69
+ });
70
+
71
+ export interface AttachmentProps
72
+ extends Omit<AnimatedPressableProps, 'children' | 'disabled'> {
73
+ className?: string;
74
+ /**
75
+ * Where the file is in its life. `uploading`/`processing` shimmer the name;
76
+ * `error` tints the row destructive. Default `done`.
77
+ */
78
+ state?: AttachmentState;
79
+ /** Row density, passed through to the underlying Item. */
80
+ size?: AttachmentSize;
81
+ /** Stack the row into a card — for a horizontal group of thumbnails. */
82
+ orientation?: 'horizontal' | 'vertical';
83
+ /** Upload progress 0–1. Draws a thin bar along the bottom while busy. */
84
+ progress?: number;
85
+ disabled?: boolean;
86
+ children?: ReactNode;
87
+ }
88
+
89
+ const AttachmentRoot = forwardRef<View, AttachmentProps>(
90
+ (
91
+ { className, state = 'done', size = 'default', orientation, progress, children, ...props },
92
+ ref
93
+ ) => {
94
+ const track = useCSSVariable('--color-primary');
95
+
96
+ return (
97
+ <AttachmentContext.Provider value={{ state, size }}>
98
+ <Item
99
+ ref={ref}
100
+ size={size}
101
+ orientation={orientation}
102
+ variant="outline"
103
+ className={cn('overflow-hidden', rootVariants({ state }), className)}
104
+ {...props}
105
+ >
106
+ {children}
107
+
108
+ {/* A determinate bar while busy, if progress is known. Absolute so it
109
+ rides the row's bottom edge without shifting the layout. */}
110
+ {isBusy(state) && progress !== undefined ? (
111
+ <View className="absolute bottom-0 left-0 right-0 h-0.5 bg-muted">
112
+ <View
113
+ style={{
114
+ width: `${Math.min(100, Math.max(0, progress * 100))}%`,
115
+ backgroundColor: typeof track === 'string' ? track : undefined,
116
+ }}
117
+ className="h-full"
118
+ />
119
+ </View>
120
+ ) : null}
121
+ </Item>
122
+ </AttachmentContext.Provider>
123
+ );
124
+ }
125
+ );
126
+ AttachmentRoot.displayName = 'Attachment';
127
+
128
+ export interface AttachmentGroupProps extends ViewProps {
129
+ className?: string;
130
+ orientation?: 'horizontal' | 'vertical';
131
+ children?: ReactNode;
132
+ }
133
+
134
+ /** A row (or column) of attachments — the same stack `Item.Group` provides. */
135
+ const AttachmentGroup = forwardRef<View, AttachmentGroupProps>(
136
+ ({ className, orientation = 'vertical', children, ...props }, ref) => (
137
+ <Item.Group ref={ref} orientation={orientation} className={className} {...props}>
138
+ {children}
139
+ </Item.Group>
140
+ )
141
+ );
142
+ AttachmentGroup.displayName = 'Attachment.Group';
143
+
144
+ export interface AttachmentMediaProps extends ViewProps {
145
+ className?: string;
146
+ /** `icon` frames it in a tile; `image` clips it for a thumbnail. */
147
+ variant?: 'default' | 'icon' | 'image';
148
+ children?: ReactNode;
149
+ }
150
+
151
+ /** Leading slot — a file-type icon tile, or an image thumbnail. */
152
+ const AttachmentMedia = forwardRef<View, AttachmentMediaProps>(
153
+ ({ className, variant = 'icon', children, ...props }, ref) => (
154
+ <Item.Media ref={ref} variant={variant} className={className} {...props}>
155
+ {children}
156
+ </Item.Media>
157
+ )
158
+ );
159
+ AttachmentMedia.displayName = 'Attachment.Media';
160
+
161
+ export interface AttachmentContentProps extends ViewProps {
162
+ className?: string;
163
+ children?: ReactNode;
164
+ }
165
+
166
+ const AttachmentContent = forwardRef<View, AttachmentContentProps>(
167
+ ({ className, children, ...props }, ref) => (
168
+ <Item.Content ref={ref} className={className} {...props}>
169
+ {children}
170
+ </Item.Content>
171
+ )
172
+ );
173
+ AttachmentContent.displayName = 'Attachment.Content';
174
+
175
+ export interface AttachmentTitleProps extends TextProps {
176
+ className?: string;
177
+ children?: ReactNode;
178
+ }
179
+
180
+ /** The file name. Shimmers while the file is uploading or processing. */
181
+ const AttachmentTitle = forwardRef<React.ElementRef<typeof Text>, AttachmentTitleProps>(
182
+ ({ className, children, ...props }, ref) => {
183
+ const { state } = useContext(AttachmentContext);
184
+
185
+ if (isBusy(state)) {
186
+ // Shimmer owns the text so it can mask the sweep to the glyphs.
187
+ return <Shimmer textClassName={cn('text-base font-medium', className)}>{children}</Shimmer>;
188
+ }
189
+
190
+ return (
191
+ <Item.Title
192
+ ref={ref}
193
+ className={cn(state === 'error' && 'text-destructive', className)}
194
+ {...props}
195
+ >
196
+ {children}
197
+ </Item.Title>
198
+ );
199
+ }
200
+ );
201
+ AttachmentTitle.displayName = 'Attachment.Title';
202
+
203
+ export interface AttachmentDescriptionProps extends TextProps {
204
+ className?: string;
205
+ children?: ReactNode;
206
+ }
207
+
208
+ /** File type, size or status. Tints destructive on `error`. */
209
+ const AttachmentDescription = forwardRef<
210
+ React.ElementRef<typeof Text>,
211
+ AttachmentDescriptionProps
212
+ >(({ className, children, ...props }, ref) => {
213
+ const { state } = useContext(AttachmentContext);
214
+
215
+ return (
216
+ <Item.Description
217
+ ref={ref}
218
+ className={cn(state === 'error' && 'text-destructive', className)}
219
+ {...props}
220
+ >
221
+ {children}
222
+ </Item.Description>
223
+ );
224
+ });
225
+ AttachmentDescription.displayName = 'Attachment.Description';
226
+
227
+ export interface AttachmentActionsProps extends ViewProps {
228
+ className?: string;
229
+ children?: ReactNode;
230
+ }
231
+
232
+ const AttachmentActions = forwardRef<View, AttachmentActionsProps>(
233
+ ({ className, children, ...props }, ref) => (
234
+ <Item.Actions ref={ref} className={className} {...props}>
235
+ {children}
236
+ </Item.Actions>
237
+ )
238
+ );
239
+ AttachmentActions.displayName = 'Attachment.Actions';
240
+
241
+ export interface AttachmentActionProps
242
+ extends Omit<AnimatedPressableProps, 'children'> {
243
+ className?: string;
244
+ accessibilityLabel: string;
245
+ children?: ReactNode;
246
+ }
247
+
248
+ /**
249
+ * A single icon button in the actions slot — remove, retry, download. An icon
250
+ * on its own says nothing to a screen reader, so the label is required.
251
+ */
252
+ const AttachmentAction = forwardRef<View, AttachmentActionProps>(
253
+ ({ className, accessibilityLabel, children, ...props }, ref) => (
254
+ <AnimatedPressable
255
+ ref={ref}
256
+ accessibilityRole="button"
257
+ accessibilityLabel={accessibilityLabel}
258
+ hitSlop={8}
259
+ className={cn(
260
+ 'h-8 w-8 items-center justify-center rounded-full active:bg-muted',
261
+ className
262
+ )}
263
+ {...props}
264
+ >
265
+ {children}
266
+ </AnimatedPressable>
267
+ )
268
+ );
269
+ AttachmentAction.displayName = 'Attachment.Action';
270
+
271
+ export const Attachment = Object.assign(AttachmentRoot, {
272
+ Group: AttachmentGroup,
273
+ Media: AttachmentMedia,
274
+ Content: AttachmentContent,
275
+ Title: AttachmentTitle,
276
+ Description: AttachmentDescription,
277
+ Actions: AttachmentActions,
278
+ Action: AttachmentAction,
279
+ });