panelui-native 0.6.0 → 0.7.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 (133) hide show
  1. package/README.md +1 -1
  2. package/lib/module/components/accordion/index.js +7 -5
  3. package/lib/module/components/accordion/index.js.map +1 -1
  4. package/lib/module/components/alert/index.js +3 -6
  5. package/lib/module/components/alert/index.js.map +1 -1
  6. package/lib/module/components/bottom-sheet/index.js +67 -3
  7. package/lib/module/components/bottom-sheet/index.js.map +1 -1
  8. package/lib/module/components/button/index.js +36 -1
  9. package/lib/module/components/button/index.js.map +1 -1
  10. package/lib/module/components/empty-state/index.js +4 -5
  11. package/lib/module/components/empty-state/index.js.map +1 -1
  12. package/lib/module/components/inline-select/index.js +171 -46
  13. package/lib/module/components/inline-select/index.js.map +1 -1
  14. package/lib/module/components/input/index.js +28 -5
  15. package/lib/module/components/input/index.js.map +1 -1
  16. package/lib/module/components/input-group/index.js +0 -1
  17. package/lib/module/components/input-group/index.js.map +1 -1
  18. package/lib/module/components/item/index.js +359 -0
  19. package/lib/module/components/item/index.js.map +1 -0
  20. package/lib/module/components/label/index.js +5 -3
  21. package/lib/module/components/label/index.js.map +1 -1
  22. package/lib/module/components/message/index.js +318 -0
  23. package/lib/module/components/message/index.js.map +1 -0
  24. package/lib/module/components/scroll-fade/index.js +119 -71
  25. package/lib/module/components/scroll-fade/index.js.map +1 -1
  26. package/lib/module/components/select/index.js +35 -6
  27. package/lib/module/components/select/index.js.map +1 -1
  28. package/lib/module/components/shimmer/index.js +111 -64
  29. package/lib/module/components/shimmer/index.js.map +1 -1
  30. package/lib/module/components/surface/index.js +3 -2
  31. package/lib/module/components/surface/index.js.map +1 -1
  32. package/lib/module/components/switch/index.js +20 -1
  33. package/lib/module/components/switch/index.js.map +1 -1
  34. package/lib/module/components/toast/index.js +7 -8
  35. package/lib/module/components/toast/index.js.map +1 -1
  36. package/lib/module/components/typography/index.js +3 -3
  37. package/lib/module/hooks/index.js +1 -0
  38. package/lib/module/hooks/index.js.map +1 -1
  39. package/lib/module/hooks/use-breakpoint.js +2 -2
  40. package/lib/module/hooks/use-copy-to-clipboard.js +0 -2
  41. package/lib/module/hooks/use-copy-to-clipboard.js.map +1 -1
  42. package/lib/module/hooks/use-keyboard-avoidance.js +120 -0
  43. package/lib/module/hooks/use-keyboard-avoidance.js.map +1 -0
  44. package/lib/module/icons/index.js +4 -4
  45. package/lib/module/index.js +6 -0
  46. package/lib/module/index.js.map +1 -1
  47. package/lib/module/native/index.js +53 -0
  48. package/lib/module/native/index.js.map +1 -0
  49. package/lib/module/primitives/keyboard-avoider.js +40 -0
  50. package/lib/module/primitives/keyboard-avoider.js.map +1 -0
  51. package/lib/module/providers/panel-ui-provider.js +24 -4
  52. package/lib/module/providers/panel-ui-provider.js.map +1 -1
  53. package/lib/module/theme/use-theme.js +1 -1
  54. package/lib/typescript/src/components/accordion/index.d.ts +7 -5
  55. package/lib/typescript/src/components/accordion/index.d.ts.map +1 -1
  56. package/lib/typescript/src/components/alert/index.d.ts +3 -6
  57. package/lib/typescript/src/components/alert/index.d.ts.map +1 -1
  58. package/lib/typescript/src/components/bottom-sheet/index.d.ts +21 -1
  59. package/lib/typescript/src/components/bottom-sheet/index.d.ts.map +1 -1
  60. package/lib/typescript/src/components/button/index.d.ts +11 -0
  61. package/lib/typescript/src/components/button/index.d.ts.map +1 -1
  62. package/lib/typescript/src/components/empty-state/index.d.ts +4 -5
  63. package/lib/typescript/src/components/empty-state/index.d.ts.map +1 -1
  64. package/lib/typescript/src/components/inline-select/index.d.ts +29 -6
  65. package/lib/typescript/src/components/inline-select/index.d.ts.map +1 -1
  66. package/lib/typescript/src/components/input/index.d.ts +13 -0
  67. package/lib/typescript/src/components/input/index.d.ts.map +1 -1
  68. package/lib/typescript/src/components/input-group/index.d.ts +0 -1
  69. package/lib/typescript/src/components/input-group/index.d.ts.map +1 -1
  70. package/lib/typescript/src/components/item/index.d.ts +286 -0
  71. package/lib/typescript/src/components/item/index.d.ts.map +1 -0
  72. package/lib/typescript/src/components/label/index.d.ts +5 -3
  73. package/lib/typescript/src/components/label/index.d.ts.map +1 -1
  74. package/lib/typescript/src/components/message/index.d.ts +170 -0
  75. package/lib/typescript/src/components/message/index.d.ts.map +1 -0
  76. package/lib/typescript/src/components/scroll-fade/index.d.ts +18 -9
  77. package/lib/typescript/src/components/scroll-fade/index.d.ts.map +1 -1
  78. package/lib/typescript/src/components/select/index.d.ts +16 -1
  79. package/lib/typescript/src/components/select/index.d.ts.map +1 -1
  80. package/lib/typescript/src/components/shimmer/index.d.ts +38 -20
  81. package/lib/typescript/src/components/shimmer/index.d.ts.map +1 -1
  82. package/lib/typescript/src/components/surface/index.d.ts.map +1 -1
  83. package/lib/typescript/src/components/switch/index.d.ts +10 -0
  84. package/lib/typescript/src/components/switch/index.d.ts.map +1 -1
  85. package/lib/typescript/src/components/toast/index.d.ts +4 -4
  86. package/lib/typescript/src/components/toast/index.d.ts.map +1 -1
  87. package/lib/typescript/src/hooks/index.d.ts +1 -0
  88. package/lib/typescript/src/hooks/index.d.ts.map +1 -1
  89. package/lib/typescript/src/hooks/use-breakpoint.d.ts +2 -2
  90. package/lib/typescript/src/hooks/use-copy-to-clipboard.d.ts +0 -2
  91. package/lib/typescript/src/hooks/use-copy-to-clipboard.d.ts.map +1 -1
  92. package/lib/typescript/src/hooks/use-keyboard-avoidance.d.ts +20 -0
  93. package/lib/typescript/src/hooks/use-keyboard-avoidance.d.ts.map +1 -0
  94. package/lib/typescript/src/icons/index.d.ts +4 -4
  95. package/lib/typescript/src/index.d.ts +4 -0
  96. package/lib/typescript/src/index.d.ts.map +1 -1
  97. package/lib/typescript/src/native/index.d.ts +35 -0
  98. package/lib/typescript/src/native/index.d.ts.map +1 -0
  99. package/lib/typescript/src/primitives/keyboard-avoider.d.ts +22 -0
  100. package/lib/typescript/src/primitives/keyboard-avoider.d.ts.map +1 -0
  101. package/lib/typescript/src/providers/panel-ui-provider.d.ts +1 -1
  102. package/lib/typescript/src/providers/panel-ui-provider.d.ts.map +1 -1
  103. package/lib/typescript/src/theme/use-theme.d.ts +1 -1
  104. package/package.json +12 -3
  105. package/src/components/accordion/index.tsx +7 -5
  106. package/src/components/alert/index.tsx +3 -6
  107. package/src/components/bottom-sheet/index.tsx +82 -2
  108. package/src/components/button/index.tsx +52 -0
  109. package/src/components/empty-state/index.tsx +4 -5
  110. package/src/components/inline-select/index.tsx +191 -44
  111. package/src/components/input/index.tsx +39 -3
  112. package/src/components/input-group/index.tsx +0 -1
  113. package/src/components/item/index.tsx +387 -0
  114. package/src/components/label/index.tsx +5 -3
  115. package/src/components/message/index.tsx +312 -0
  116. package/src/components/scroll-fade/index.tsx +163 -51
  117. package/src/components/select/index.tsx +54 -9
  118. package/src/components/shimmer/index.tsx +151 -58
  119. package/src/components/surface/index.tsx +3 -2
  120. package/src/components/switch/index.tsx +27 -1
  121. package/src/components/toast/index.tsx +7 -8
  122. package/src/components/typography/index.tsx +3 -3
  123. package/src/hooks/index.ts +5 -0
  124. package/src/hooks/use-breakpoint.ts +2 -2
  125. package/src/hooks/use-copy-to-clipboard.ts +0 -2
  126. package/src/hooks/use-keyboard-avoidance.ts +140 -0
  127. package/src/icons/index.tsx +4 -4
  128. package/src/index.ts +32 -0
  129. package/src/native/index.ts +79 -0
  130. package/src/primitives/keyboard-avoider.tsx +49 -0
  131. package/src/providers/panel-ui-provider.tsx +30 -9
  132. package/src/theme/use-theme.ts +1 -1
  133. package/theme.css +5 -3
@@ -0,0 +1,318 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Message — a chat turn: avatar, bubble, and the metadata around it.
5
+ *
6
+ * The pieces are separate because conversations differ in which ones they
7
+ * need. A support thread wants a sender name and a read receipt; an assistant
8
+ * transcript wants neither, but does want the bubble to carry tool output and
9
+ * actions. Composing them beats a component with a dozen optional props.
10
+ *
11
+ * `align` is the only thing the root decides, and everything downstream reads
12
+ * it from context: which side the row sits on, which way the avatar goes,
13
+ * which corner of the bubble is squared off, and which colour it takes.
14
+ *
15
+ * ```tsx
16
+ * <Message align="end">
17
+ * <Message.Content>
18
+ * <Message.Bubble>
19
+ * <Message.BubbleContent>How can I help?</Message.BubbleContent>
20
+ * </Message.Bubble>
21
+ * </Message.Content>
22
+ * </Message>
23
+ * ```
24
+ */
25
+ import { Children, cloneElement, createContext, forwardRef, isValidElement, useContext } from 'react';
26
+ import { View } from 'react-native';
27
+ import { tv } from 'tailwind-variants';
28
+ import { Text } from "../../primitives/text.js";
29
+ import { cn } from "../../utils/cn.js";
30
+ import { jsx as _jsx } from "react/jsx-runtime";
31
+ const messageVariants = tv({
32
+ slots: {
33
+ root: 'w-full flex-row items-end gap-2',
34
+ avatar: 'shrink-0',
35
+ content: 'max-w-[85%] gap-1',
36
+ header: 'text-xs font-medium text-muted-foreground',
37
+ bubble: 'rounded-2xl px-3.5 py-2.5',
38
+ bubbleContent: 'text-base',
39
+ footer: 'text-xs text-muted-foreground',
40
+ group: 'w-full gap-1'
41
+ },
42
+ variants: {
43
+ align: {
44
+ start: {
45
+ root: 'flex-row justify-start',
46
+ content: 'items-start',
47
+ // A squared corner on the side the message comes from points the
48
+ // bubble back at its sender.
49
+ bubble: 'rounded-bl-md bg-muted',
50
+ bubbleContent: 'text-foreground',
51
+ header: 'text-left',
52
+ footer: 'text-left'
53
+ },
54
+ end: {
55
+ root: 'flex-row-reverse justify-start',
56
+ content: 'items-end',
57
+ bubble: 'rounded-br-md bg-primary',
58
+ bubbleContent: 'text-primary-foreground',
59
+ header: 'text-right',
60
+ footer: 'text-right'
61
+ }
62
+ }
63
+ },
64
+ defaultVariants: {
65
+ align: 'start'
66
+ }
67
+ });
68
+ const MessageContext = /*#__PURE__*/createContext({
69
+ align: 'start',
70
+ stacked: false
71
+ });
72
+
73
+ /** Reads the alignment set by the nearest Message. */
74
+ function useMessageContext() {
75
+ return useContext(MessageContext);
76
+ }
77
+ const GroupContext = /*#__PURE__*/createContext(null);
78
+ const MessageRoot = /*#__PURE__*/forwardRef(({
79
+ className,
80
+ align,
81
+ stacked = false,
82
+ children,
83
+ ...props
84
+ }, ref) => {
85
+ const group = useContext(GroupContext);
86
+ const resolvedAlign = align ?? group?.align ?? 'start';
87
+ const {
88
+ root
89
+ } = messageVariants({
90
+ align: resolvedAlign
91
+ });
92
+ return /*#__PURE__*/_jsx(MessageContext.Provider, {
93
+ value: {
94
+ align: resolvedAlign,
95
+ stacked
96
+ },
97
+ children: /*#__PURE__*/_jsx(View, {
98
+ ref: ref,
99
+ className: root({
100
+ className
101
+ }),
102
+ ...props,
103
+ children: children
104
+ })
105
+ });
106
+ });
107
+ MessageRoot.displayName = 'Message';
108
+ /**
109
+ * Consecutive turns from one sender. Tightens the spacing between them and
110
+ * marks every message after the first as `stacked`, so only the first shows an
111
+ * avatar and the rest stay aligned with it.
112
+ */
113
+ const MessageGroup = /*#__PURE__*/forwardRef(({
114
+ className,
115
+ align = 'start',
116
+ children,
117
+ ...props
118
+ }, ref) => {
119
+ const {
120
+ group
121
+ } = messageVariants({
122
+ align
123
+ });
124
+
125
+ // Every turn after the first is a continuation, so it drops its avatar and
126
+ // sits tight against the one above. A child that sets `stacked` itself
127
+ // wins — grouping is a default, not a rule.
128
+ const stackedChildren = Children.map(children, (child, index) => /*#__PURE__*/isValidElement(child) && child.props.stacked === undefined ? /*#__PURE__*/cloneElement(child, {
129
+ stacked: index > 0
130
+ }) : child);
131
+ return /*#__PURE__*/_jsx(GroupContext.Provider, {
132
+ value: {
133
+ align
134
+ },
135
+ children: /*#__PURE__*/_jsx(View, {
136
+ ref: ref,
137
+ className: group({
138
+ className
139
+ }),
140
+ ...props,
141
+ children: stackedChildren
142
+ })
143
+ });
144
+ });
145
+ MessageGroup.displayName = 'Message.Group';
146
+ /**
147
+ * Slot for the sender's avatar. On a stacked message the slot is rendered but
148
+ * left empty, which keeps the bubbles in a column instead of letting the
149
+ * second one slide under the first one's avatar.
150
+ */
151
+ const MessageAvatar = /*#__PURE__*/forwardRef(({
152
+ className,
153
+ children,
154
+ ...props
155
+ }, ref) => {
156
+ const {
157
+ stacked
158
+ } = useMessageContext();
159
+ const {
160
+ avatar
161
+ } = messageVariants();
162
+ return /*#__PURE__*/_jsx(View, {
163
+ ref: ref,
164
+ className: avatar({
165
+ className
166
+ }),
167
+ ...props,
168
+ children: stacked ? /*#__PURE__*/_jsx(View, {
169
+ className: "opacity-0",
170
+ children: children
171
+ }) : children
172
+ });
173
+ });
174
+ MessageAvatar.displayName = 'Message.Avatar';
175
+ /** Column holding the header, bubble and footer. */
176
+ const MessageContent = /*#__PURE__*/forwardRef(({
177
+ className,
178
+ children,
179
+ ...props
180
+ }, ref) => {
181
+ const {
182
+ align
183
+ } = useMessageContext();
184
+ const {
185
+ content
186
+ } = messageVariants({
187
+ align
188
+ });
189
+ return /*#__PURE__*/_jsx(View, {
190
+ ref: ref,
191
+ className: content({
192
+ className
193
+ }),
194
+ ...props,
195
+ children: children
196
+ });
197
+ });
198
+ MessageContent.displayName = 'Message.Content';
199
+ /** Sender name or timestamp above the bubble. */
200
+ const MessageHeader = /*#__PURE__*/forwardRef(({
201
+ className,
202
+ ...props
203
+ }, ref) => {
204
+ const {
205
+ align
206
+ } = useMessageContext();
207
+ const {
208
+ header
209
+ } = messageVariants({
210
+ align
211
+ });
212
+ return /*#__PURE__*/_jsx(Text, {
213
+ ref: ref,
214
+ size: "xs",
215
+ className: header({
216
+ className
217
+ }),
218
+ ...props
219
+ });
220
+ });
221
+ MessageHeader.displayName = 'Message.Header';
222
+ /** The speech bubble. Takes its colour and squared corner from `align`. */
223
+ const MessageBubble = /*#__PURE__*/forwardRef(({
224
+ className,
225
+ children,
226
+ ...props
227
+ }, ref) => {
228
+ const {
229
+ align
230
+ } = useMessageContext();
231
+ const {
232
+ bubble
233
+ } = messageVariants({
234
+ align
235
+ });
236
+ return /*#__PURE__*/_jsx(View, {
237
+ ref: ref,
238
+ className: bubble({
239
+ className
240
+ }),
241
+ ...props,
242
+ children: children
243
+ });
244
+ });
245
+ MessageBubble.displayName = 'Message.Bubble';
246
+ /** Text inside the bubble, in whichever colour reads against it. */
247
+ const MessageBubbleContent = /*#__PURE__*/forwardRef(({
248
+ className,
249
+ ...props
250
+ }, ref) => {
251
+ const {
252
+ align
253
+ } = useMessageContext();
254
+ const {
255
+ bubbleContent
256
+ } = messageVariants({
257
+ align
258
+ });
259
+ return /*#__PURE__*/_jsx(Text, {
260
+ ref: ref,
261
+ className: bubbleContent({
262
+ className
263
+ }),
264
+ ...props
265
+ });
266
+ });
267
+ MessageBubbleContent.displayName = 'Message.BubbleContent';
268
+ /** Delivery state, timestamp or actions below the bubble. */
269
+ const MessageFooter = /*#__PURE__*/forwardRef(({
270
+ className,
271
+ ...props
272
+ }, ref) => {
273
+ const {
274
+ align
275
+ } = useMessageContext();
276
+ const {
277
+ footer
278
+ } = messageVariants({
279
+ align
280
+ });
281
+ return /*#__PURE__*/_jsx(Text, {
282
+ ref: ref,
283
+ size: "xs",
284
+ className: footer({
285
+ className
286
+ }),
287
+ ...props
288
+ });
289
+ });
290
+ MessageFooter.displayName = 'Message.Footer';
291
+ /** Row of controls under the bubble — copy, retry, feedback. */
292
+ const MessageActions = /*#__PURE__*/forwardRef(({
293
+ className,
294
+ children,
295
+ ...props
296
+ }, ref) => {
297
+ const {
298
+ align
299
+ } = useMessageContext();
300
+ return /*#__PURE__*/_jsx(View, {
301
+ ref: ref,
302
+ className: cn('flex-row items-center gap-1', align === 'end' && 'flex-row-reverse', className),
303
+ ...props,
304
+ children: children
305
+ });
306
+ });
307
+ MessageActions.displayName = 'Message.Actions';
308
+ export const Message = Object.assign(MessageRoot, {
309
+ Group: MessageGroup,
310
+ Avatar: MessageAvatar,
311
+ Content: MessageContent,
312
+ Header: MessageHeader,
313
+ Bubble: MessageBubble,
314
+ BubbleContent: MessageBubbleContent,
315
+ Footer: MessageFooter,
316
+ Actions: MessageActions
317
+ });
318
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Children","cloneElement","createContext","forwardRef","isValidElement","useContext","View","tv","Text","cn","jsx","_jsx","messageVariants","slots","root","avatar","content","header","bubble","bubbleContent","footer","group","variants","align","start","end","defaultVariants","MessageContext","stacked","useMessageContext","GroupContext","MessageRoot","className","children","props","ref","resolvedAlign","Provider","value","displayName","MessageGroup","stackedChildren","map","child","index","undefined","MessageAvatar","MessageContent","MessageHeader","size","MessageBubble","MessageBubbleContent","MessageFooter","MessageActions","Message","Object","assign","Group","Avatar","Content","Header","Bubble","BubbleContent","Footer","Actions"],"sourceRoot":"../../../../src","sources":["components/message/index.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SACEA,QAAQ,EACRC,YAAY,EACZC,aAAa,EACbC,UAAU,EACVC,cAAc,EACdC,UAAU,QAEL,OAAO;AACd,SAASC,IAAI,QAAwB,cAAc;AACnD,SAASC,EAAE,QAA2B,mBAAmB;AACzD,SAASC,IAAI,QAAwB,0BAAuB;AAC5D,SAASC,EAAE,QAAQ,mBAAgB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAEpC,MAAMC,eAAe,GAAGL,EAAE,CAAC;EACzBM,KAAK,EAAE;IACLC,IAAI,EAAE,iCAAiC;IACvCC,MAAM,EAAE,UAAU;IAClBC,OAAO,EAAE,mBAAmB;IAC5BC,MAAM,EAAE,2CAA2C;IACnDC,MAAM,EAAE,2BAA2B;IACnCC,aAAa,EAAE,WAAW;IAC1BC,MAAM,EAAE,+BAA+B;IACvCC,KAAK,EAAE;EACT,CAAC;EACDC,QAAQ,EAAE;IACRC,KAAK,EAAE;MACLC,KAAK,EAAE;QACLV,IAAI,EAAE,wBAAwB;QAC9BE,OAAO,EAAE,aAAa;QACtB;QACA;QACAE,MAAM,EAAE,wBAAwB;QAChCC,aAAa,EAAE,iBAAiB;QAChCF,MAAM,EAAE,WAAW;QACnBG,MAAM,EAAE;MACV,CAAC;MACDK,GAAG,EAAE;QACHX,IAAI,EAAE,gCAAgC;QACtCE,OAAO,EAAE,WAAW;QACpBE,MAAM,EAAE,0BAA0B;QAClCC,aAAa,EAAE,yBAAyB;QACxCF,MAAM,EAAE,YAAY;QACpBG,MAAM,EAAE;MACV;IACF;EACF,CAAC;EACDM,eAAe,EAAE;IACfH,KAAK,EAAE;EACT;AACF,CAAC,CAAC;AAUF,MAAMI,cAAc,gBAAGzB,aAAa,CAAsB;EACxDqB,KAAK,EAAE,OAAO;EACdK,OAAO,EAAE;AACX,CAAC,CAAC;;AAEF;AACA,SAASC,iBAAiBA,CAAA,EAAG;EAC3B,OAAOxB,UAAU,CAACsB,cAAc,CAAC;AACnC;AAEA,MAAMG,YAAY,gBAAG5B,aAAa,CAA0B,IAAI,CAAC;AAoBjE,MAAM6B,WAAW,gBAAG5B,UAAU,CAC5B,CAAC;EAAE6B,SAAS;EAAET,KAAK;EAAEK,OAAO,GAAG,KAAK;EAAEK,QAAQ;EAAE,GAAGC;AAAM,CAAC,EAAEC,GAAG,KAAK;EAClE,MAAMd,KAAK,GAAGhB,UAAU,CAACyB,YAAY,CAAC;EACtC,MAAMM,aAAa,GAAGb,KAAK,IAAIF,KAAK,EAAEE,KAAK,IAAI,OAAO;EACtD,MAAM;IAAET;EAAK,CAAC,GAAGF,eAAe,CAAC;IAAEW,KAAK,EAAEa;EAAc,CAAC,CAAC;EAE1D,oBACEzB,IAAA,CAACgB,cAAc,CAACU,QAAQ;IAACC,KAAK,EAAE;MAAEf,KAAK,EAAEa,aAAa;MAAER;IAAQ,CAAE;IAAAK,QAAA,eAChEtB,IAAA,CAACL,IAAI;MAAC6B,GAAG,EAAEA,GAAI;MAACH,SAAS,EAAElB,IAAI,CAAC;QAAEkB;MAAU,CAAC,CAAE;MAAA,GAAKE,KAAK;MAAAD,QAAA,EACtDA;IAAQ,CACL;EAAC,CACgB,CAAC;AAE9B,CACF,CAAC;AACDF,WAAW,CAACQ,WAAW,GAAG,SAAS;AASnC;AACA;AACA;AACA;AACA;AACA,MAAMC,YAAY,gBAAGrC,UAAU,CAC7B,CAAC;EAAE6B,SAAS;EAAET,KAAK,GAAG,OAAO;EAAEU,QAAQ;EAAE,GAAGC;AAAM,CAAC,EAAEC,GAAG,KAAK;EAC3D,MAAM;IAAEd;EAAM,CAAC,GAAGT,eAAe,CAAC;IAAEW;EAAM,CAAC,CAAC;;EAE5C;EACA;EACA;EACA,MAAMkB,eAAe,GAAGzC,QAAQ,CAAC0C,GAAG,CAACT,QAAQ,EAAE,CAACU,KAAK,EAAEC,KAAK,KAC1D,aAAAxC,cAAc,CAAeuC,KAAK,CAAC,IAAIA,KAAK,CAACT,KAAK,CAACN,OAAO,KAAKiB,SAAS,gBACpE5C,YAAY,CAAC0C,KAAK,EAAE;IAAEf,OAAO,EAAEgB,KAAK,GAAG;EAAE,CAAC,CAAC,GAC3CD,KACN,CAAC;EAED,oBACEhC,IAAA,CAACmB,YAAY,CAACO,QAAQ;IAACC,KAAK,EAAE;MAAEf;IAAM,CAAE;IAAAU,QAAA,eACtCtB,IAAA,CAACL,IAAI;MAAC6B,GAAG,EAAEA,GAAI;MAACH,SAAS,EAAEX,KAAK,CAAC;QAAEW;MAAU,CAAC,CAAE;MAAA,GAAKE,KAAK;MAAAD,QAAA,EACvDQ;IAAe,CACZ;EAAC,CACc,CAAC;AAE5B,CACF,CAAC;AACDD,YAAY,CAACD,WAAW,GAAG,eAAe;AAO1C;AACA;AACA;AACA;AACA;AACA,MAAMO,aAAa,gBAAG3C,UAAU,CAC9B,CAAC;EAAE6B,SAAS;EAAEC,QAAQ;EAAE,GAAGC;AAAM,CAAC,EAAEC,GAAG,KAAK;EAC1C,MAAM;IAAEP;EAAQ,CAAC,GAAGC,iBAAiB,CAAC,CAAC;EACvC,MAAM;IAAEd;EAAO,CAAC,GAAGH,eAAe,CAAC,CAAC;EAEpC,oBACED,IAAA,CAACL,IAAI;IAAC6B,GAAG,EAAEA,GAAI;IAACH,SAAS,EAAEjB,MAAM,CAAC;MAAEiB;IAAU,CAAC,CAAE;IAAA,GAAKE,KAAK;IAAAD,QAAA,EACxDL,OAAO,gBAAGjB,IAAA,CAACL,IAAI;MAAC0B,SAAS,EAAC,WAAW;MAAAC,QAAA,EAAEA;IAAQ,CAAO,CAAC,GAAGA;EAAQ,CAC/D,CAAC;AAEX,CACF,CAAC;AACDa,aAAa,CAACP,WAAW,GAAG,gBAAgB;AAO5C;AACA,MAAMQ,cAAc,gBAAG5C,UAAU,CAC/B,CAAC;EAAE6B,SAAS;EAAEC,QAAQ;EAAE,GAAGC;AAAM,CAAC,EAAEC,GAAG,KAAK;EAC1C,MAAM;IAAEZ;EAAM,CAAC,GAAGM,iBAAiB,CAAC,CAAC;EACrC,MAAM;IAAEb;EAAQ,CAAC,GAAGJ,eAAe,CAAC;IAAEW;EAAM,CAAC,CAAC;EAE9C,oBACEZ,IAAA,CAACL,IAAI;IAAC6B,GAAG,EAAEA,GAAI;IAACH,SAAS,EAAEhB,OAAO,CAAC;MAAEgB;IAAU,CAAC,CAAE;IAAA,GAAKE,KAAK;IAAAD,QAAA,EACzDA;EAAQ,CACL,CAAC;AAEX,CACF,CAAC;AACDc,cAAc,CAACR,WAAW,GAAG,iBAAiB;AAM9C;AACA,MAAMS,aAAa,gBAAG7C,UAAU,CAC9B,CAAC;EAAE6B,SAAS;EAAE,GAAGE;AAAM,CAAC,EAAEC,GAAG,KAAK;EAChC,MAAM;IAAEZ;EAAM,CAAC,GAAGM,iBAAiB,CAAC,CAAC;EACrC,MAAM;IAAEZ;EAAO,CAAC,GAAGL,eAAe,CAAC;IAAEW;EAAM,CAAC,CAAC;EAE7C,oBAAOZ,IAAA,CAACH,IAAI;IAAC2B,GAAG,EAAEA,GAAI;IAACc,IAAI,EAAC,IAAI;IAACjB,SAAS,EAAEf,MAAM,CAAC;MAAEe;IAAU,CAAC,CAAE;IAAA,GAAKE;EAAK,CAAG,CAAC;AAClF,CACF,CAAC;AACDc,aAAa,CAACT,WAAW,GAAG,gBAAgB;AAO5C;AACA,MAAMW,aAAa,gBAAG/C,UAAU,CAC9B,CAAC;EAAE6B,SAAS;EAAEC,QAAQ;EAAE,GAAGC;AAAM,CAAC,EAAEC,GAAG,KAAK;EAC1C,MAAM;IAAEZ;EAAM,CAAC,GAAGM,iBAAiB,CAAC,CAAC;EACrC,MAAM;IAAEX;EAAO,CAAC,GAAGN,eAAe,CAAC;IAAEW;EAAM,CAAC,CAAC;EAE7C,oBACEZ,IAAA,CAACL,IAAI;IAAC6B,GAAG,EAAEA,GAAI;IAACH,SAAS,EAAEd,MAAM,CAAC;MAAEc;IAAU,CAAC,CAAE;IAAA,GAAKE,KAAK;IAAAD,QAAA,EACxDA;EAAQ,CACL,CAAC;AAEX,CACF,CAAC;AACDiB,aAAa,CAACX,WAAW,GAAG,gBAAgB;AAM5C;AACA,MAAMY,oBAAoB,gBAAGhD,UAAU,CAGrC,CAAC;EAAE6B,SAAS;EAAE,GAAGE;AAAM,CAAC,EAAEC,GAAG,KAAK;EAClC,MAAM;IAAEZ;EAAM,CAAC,GAAGM,iBAAiB,CAAC,CAAC;EACrC,MAAM;IAAEV;EAAc,CAAC,GAAGP,eAAe,CAAC;IAAEW;EAAM,CAAC,CAAC;EAEpD,oBAAOZ,IAAA,CAACH,IAAI;IAAC2B,GAAG,EAAEA,GAAI;IAACH,SAAS,EAAEb,aAAa,CAAC;MAAEa;IAAU,CAAC,CAAE;IAAA,GAAKE;EAAK,CAAG,CAAC;AAC/E,CAAC,CAAC;AACFiB,oBAAoB,CAACZ,WAAW,GAAG,uBAAuB;AAM1D;AACA,MAAMa,aAAa,gBAAGjD,UAAU,CAC9B,CAAC;EAAE6B,SAAS;EAAE,GAAGE;AAAM,CAAC,EAAEC,GAAG,KAAK;EAChC,MAAM;IAAEZ;EAAM,CAAC,GAAGM,iBAAiB,CAAC,CAAC;EACrC,MAAM;IAAET;EAAO,CAAC,GAAGR,eAAe,CAAC;IAAEW;EAAM,CAAC,CAAC;EAE7C,oBAAOZ,IAAA,CAACH,IAAI;IAAC2B,GAAG,EAAEA,GAAI;IAACc,IAAI,EAAC,IAAI;IAACjB,SAAS,EAAEZ,MAAM,CAAC;MAAEY;IAAU,CAAC,CAAE;IAAA,GAAKE;EAAK,CAAG,CAAC;AAClF,CACF,CAAC;AACDkB,aAAa,CAACb,WAAW,GAAG,gBAAgB;AAO5C;AACA,MAAMc,cAAc,gBAAGlD,UAAU,CAC/B,CAAC;EAAE6B,SAAS;EAAEC,QAAQ;EAAE,GAAGC;AAAM,CAAC,EAAEC,GAAG,KAAK;EAC1C,MAAM;IAAEZ;EAAM,CAAC,GAAGM,iBAAiB,CAAC,CAAC;EAErC,oBACElB,IAAA,CAACL,IAAI;IACH6B,GAAG,EAAEA,GAAI;IACTH,SAAS,EAAEvB,EAAE,CACX,6BAA6B,EAC7Bc,KAAK,KAAK,KAAK,IAAI,kBAAkB,EACrCS,SACF,CAAE;IAAA,GACEE,KAAK;IAAAD,QAAA,EAERA;EAAQ,CACL,CAAC;AAEX,CACF,CAAC;AACDoB,cAAc,CAACd,WAAW,GAAG,iBAAiB;AAE9C,OAAO,MAAMe,OAAO,GAAGC,MAAM,CAACC,MAAM,CAACzB,WAAW,EAAE;EAChD0B,KAAK,EAAEjB,YAAY;EACnBkB,MAAM,EAAEZ,aAAa;EACrBa,OAAO,EAAEZ,cAAc;EACvBa,MAAM,EAAEZ,aAAa;EACrBa,MAAM,EAAEX,aAAa;EACrBY,aAAa,EAAEX,oBAAoB;EACnCY,MAAM,EAAEX,aAAa;EACrBY,OAAO,EAAEX;AACX,CAAC,CAAC","ignoreList":[]}
@@ -3,14 +3,13 @@
3
3
  /**
4
4
  * ScrollFade — fades the edges of a scroll container.
5
5
  *
6
- * The React Native equivalent of shadcn-ui/ui's `scroll-fade` utility
7
- * (https://ui.shadcn.com/docs/utils/scroll-fade), which is CSS `mask-image`
8
- * driven by a scroll timeline. React Native has neither masks nor scroll
9
- * timelines, so the fades are SVG gradients overlaid on each edge, with their
10
- * opacity following the scroll position.
6
+ * Content that runs past a boundary reads better fading out than being cut
7
+ * off, and the fade doubles as an affordance: an edge that is fading is an
8
+ * edge with more content behind it.
11
9
  *
12
- * Composition follows heroui-native's ScrollShadow: wrap the scrollable and
13
- * let the orientation be inferred from its `horizontal` prop.
10
+ * Scroll position, content size and viewport size are all held in shared
11
+ * values and consumed by `useAnimatedStyle`, so the fades track the scroll on
12
+ * the UI thread without re-rendering React.
14
13
  *
15
14
  * ```tsx
16
15
  * <ScrollFade>
@@ -18,61 +17,101 @@
18
17
  * </ScrollFade>
19
18
  * ```
20
19
  */
21
- import { Children, cloneElement, isValidElement, useState } from 'react';
22
- import { View } from 'react-native';
23
- import Svg, { Defs, LinearGradient, Rect, Stop } from 'react-native-svg';
20
+ import { Children, isValidElement, useMemo } from 'react';
21
+ import { StyleSheet, View } from 'react-native';
22
+ import { LinearGradient } from 'expo-linear-gradient';
23
+ import Animated, { useAnimatedScrollHandler, useAnimatedStyle, useComposedEventHandler, useDerivedValue, useSharedValue } from 'react-native-reanimated';
24
24
  import { useCSSVariable } from 'uniwind';
25
25
 
26
26
  /** Past this many pixels from an edge, that edge's fade is fully shown. */
27
27
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
28
- const FADE_IN_DISTANCE = 24;
28
+ const DEFAULT_FADE_IN_DISTANCE = 24;
29
29
  export function ScrollFade({
30
30
  className,
31
31
  size = 48,
32
32
  edges = 'both',
33
+ orientation,
33
34
  color,
35
+ fadeInDistance = DEFAULT_FADE_IN_DISTANCE,
36
+ enabled = true,
34
37
  children,
35
38
  ...props
36
39
  }) {
37
- const [startOpacity, setStartOpacity] = useState(0);
38
- const [endOpacity, setEndOpacity] = useState(0);
40
+ const offset = useSharedValue(0);
41
+ const contentLength = useSharedValue(0);
42
+ const viewportLength = useSharedValue(0);
39
43
  const themeBackground = useCSSVariable('--color-background');
40
44
  const fadeColor = color ?? (typeof themeBackground === 'string' ? themeBackground : '#000000');
41
45
  const child = Children.only(children);
42
- const horizontal = /*#__PURE__*/isValidElement(child) ? !!child.props.horizontal : false;
43
- const handleScroll = event => {
44
- const {
45
- contentOffset,
46
- contentSize,
47
- layoutMeasurement
48
- } = event.nativeEvent;
49
- const offset = horizontal ? contentOffset.x : contentOffset.y;
50
- const total = horizontal ? contentSize.width : contentSize.height;
51
- const visible = horizontal ? layoutMeasurement.width : layoutMeasurement.height;
52
- const remaining = total - visible - offset;
46
+ const horizontal = orientation !== undefined ? orientation === 'horizontal' : /*#__PURE__*/isValidElement(child) && !!child.props.horizontal;
47
+
48
+ // Reanimated can only drive a scroll handler on an animated component, and
49
+ // `Animated.ScrollView` is not necessarily what was passed in — the child may
50
+ // be a FlatList, a SectionList or a custom scrollable. Keyed on the element
51
+ // *type*, not the element: rebuilding the wrapper would remount the list.
52
+ const childType = /*#__PURE__*/isValidElement(child) ? child.type : null;
53
+ const AnimatedScrollable = useMemo(() => childType ? Animated.createAnimatedComponent(childType) : null, [childType]);
54
+ const scrollHandler = useAnimatedScrollHandler({
55
+ onScroll: event => {
56
+ const {
57
+ contentOffset,
58
+ contentSize,
59
+ layoutMeasurement
60
+ } = event;
61
+ offset.value = horizontal ? contentOffset.x : contentOffset.y;
62
+ contentLength.value = horizontal ? contentSize.width : contentSize.height;
63
+ viewportLength.value = horizontal ? layoutMeasurement.width : layoutMeasurement.height;
64
+ }
65
+ });
53
66
 
54
- // Each edge fades in over the first FADE_IN_DISTANCE px of travel, so an
55
- // edge with nothing past it shows nothing.
56
- setStartOpacity(Math.min(offset / FADE_IN_DISTANCE, 1));
57
- setEndOpacity(Math.min(Math.max(remaining, 0) / FADE_IN_DISTANCE, 1));
58
- child.props.onScroll?.(event);
67
+ // A consumer `onScroll` is composed rather than dropped — but because the
68
+ // child is now an animated component it has to be an animated handler too.
69
+ const onScroll = useComposedEventHandler([scrollHandler, child.props.onScroll ?? null]);
70
+
71
+ // Measured up front as well as on scroll, so an end edge with content behind
72
+ // it fades from the first frame rather than waiting for a scroll event.
73
+ const onLayout = event => {
74
+ const {
75
+ width,
76
+ height
77
+ } = event.nativeEvent.layout;
78
+ viewportLength.value = horizontal ? width : height;
79
+ child.props.onLayout?.(event);
80
+ };
81
+ const onContentSizeChange = (width, height) => {
82
+ contentLength.value = horizontal ? width : height;
83
+ child.props.onContentSizeChange?.(width, height);
59
84
  };
60
- const scrollable = /*#__PURE__*/isValidElement(child) ? /*#__PURE__*/cloneElement(child, {
61
- onScroll: handleScroll,
85
+ const startOpacity = useDerivedValue(() => Math.min(offset.value / fadeInDistance, 1));
86
+ const endOpacity = useDerivedValue(() => {
87
+ // Nothing to fade towards when the content fits inside the viewport.
88
+ const remaining = contentLength.value - viewportLength.value - offset.value;
89
+ return Math.min(Math.max(remaining, 0) / fadeInDistance, 1);
90
+ });
91
+ const scrollable = AnimatedScrollable && /*#__PURE__*/isValidElement(child) ? /*#__PURE__*/_jsx(AnimatedScrollable, {
92
+ ...child.props,
93
+ onScroll: onScroll,
94
+ onLayout: onLayout,
95
+ onContentSizeChange: onContentSizeChange,
62
96
  scrollEventThrottle: child.props.scrollEventThrottle ?? 16
63
97
  }) : child;
64
- const showStart = edges !== 'end';
65
- const showEnd = edges !== 'start';
98
+ if (!enabled || edges === 'none') {
99
+ return /*#__PURE__*/_jsx(View, {
100
+ ...props,
101
+ className: className,
102
+ children: scrollable
103
+ });
104
+ }
66
105
  return /*#__PURE__*/_jsxs(View, {
67
106
  ...props,
68
107
  className: className,
69
- children: [scrollable, showStart ? /*#__PURE__*/_jsx(Fade, {
108
+ children: [scrollable, edges !== 'end' ? /*#__PURE__*/_jsx(Fade, {
70
109
  color: fadeColor,
71
110
  size: size,
72
111
  horizontal: horizontal,
73
112
  opacity: startOpacity,
74
113
  edge: "start"
75
- }) : null, showEnd ? /*#__PURE__*/_jsx(Fade, {
114
+ }) : null, edges !== 'start' ? /*#__PURE__*/_jsx(Fade, {
76
115
  color: fadeColor,
77
116
  size: size,
78
117
  horizontal: horizontal,
@@ -92,7 +131,6 @@ function Fade({
92
131
  edge
93
132
  }) {
94
133
  const isStart = edge === 'start';
95
- const id = `scroll-fade-${edge}-${horizontal ? 'x' : 'y'}`;
96
134
  const position = horizontal ? {
97
135
  top: 0,
98
136
  bottom: 0,
@@ -112,45 +150,55 @@ function Fade({
112
150
  bottom: 0
113
151
  })
114
152
  };
153
+ const style = useAnimatedStyle(() => ({
154
+ opacity: opacity.value
155
+ }));
115
156
 
116
- // The gradient runs from the screen edge inwards, so it is reversed on the
157
+ // The gradient runs from the edge inwards, so its stops are reversed on the
117
158
  // end edge.
118
- const [x2, y2] = horizontal ? [1, 0] : [0, 1];
119
- return /*#__PURE__*/_jsx(View, {
159
+ const colors = isStart ? [withAlpha(color, 1), withAlpha(color, 0)] : [withAlpha(color, 0), withAlpha(color, 1)];
160
+ return /*#__PURE__*/_jsx(Animated.View, {
120
161
  pointerEvents: "none",
121
- style: {
122
- position: 'absolute',
123
- opacity,
124
- ...position
125
- },
126
- children: /*#__PURE__*/_jsxs(Svg, {
127
- width: "100%",
128
- height: "100%",
129
- children: [/*#__PURE__*/_jsx(Defs, {
130
- children: /*#__PURE__*/_jsxs(LinearGradient, {
131
- id: id,
132
- x1: "0",
133
- y1: "0",
134
- x2: String(x2),
135
- y2: String(y2),
136
- children: [/*#__PURE__*/_jsx(Stop, {
137
- offset: "0",
138
- stopColor: color,
139
- stopOpacity: isStart ? 1 : 0
140
- }), /*#__PURE__*/_jsx(Stop, {
141
- offset: "1",
142
- stopColor: color,
143
- stopOpacity: isStart ? 0 : 1
144
- })]
145
- })
146
- }), /*#__PURE__*/_jsx(Rect, {
147
- x: "0",
148
- y: "0",
149
- width: "100%",
150
- height: "100%",
151
- fill: `url(#${id})`
152
- })]
162
+ style: [{
163
+ position: 'absolute'
164
+ }, position, style],
165
+ children: /*#__PURE__*/_jsx(LinearGradient, {
166
+ colors: colors,
167
+ start: {
168
+ x: 0,
169
+ y: 0
170
+ },
171
+ end: horizontal ? {
172
+ x: 1,
173
+ y: 0
174
+ } : {
175
+ x: 0,
176
+ y: 1
177
+ },
178
+ style: StyleSheet.absoluteFill
153
179
  })
154
180
  });
155
181
  }
182
+
183
+ /**
184
+ * Gradients need a transparent stop of the *same* colour — `transparent` is
185
+ * black at zero alpha on Android, which shows as a grey smear.
186
+ */
187
+ function withAlpha(color, alpha) {
188
+ if (color.startsWith('#')) {
189
+ const hex = color.slice(1);
190
+ const full = hex.length === 3 ? hex.split('').map(c => c + c).join('') : hex.slice(0, 6);
191
+ const r = parseInt(full.slice(0, 2), 16);
192
+ const g = parseInt(full.slice(2, 4), 16);
193
+ const b = parseInt(full.slice(4, 6), 16);
194
+ if (Number.isNaN(r + g + b)) return color;
195
+ return `rgba(${r}, ${g}, ${b}, ${alpha})`;
196
+ }
197
+ const channels = color.match(/rgba?\(([^)]+)\)/)?.[1];
198
+ if (channels) {
199
+ const [r, g, b] = channels.split(',').map(part => part.trim());
200
+ return `rgba(${r}, ${g}, ${b}, ${alpha})`;
201
+ }
202
+ return color;
203
+ }
156
204
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Children","cloneElement","isValidElement","useState","View","Svg","Defs","LinearGradient","Rect","Stop","useCSSVariable","jsx","_jsx","jsxs","_jsxs","FADE_IN_DISTANCE","ScrollFade","className","size","edges","color","children","props","startOpacity","setStartOpacity","endOpacity","setEndOpacity","themeBackground","fadeColor","child","only","horizontal","handleScroll","event","contentOffset","contentSize","layoutMeasurement","nativeEvent","offset","x","y","total","width","height","visible","remaining","Math","min","max","onScroll","scrollable","scrollEventThrottle","showStart","showEnd","Fade","opacity","edge","displayName","isStart","id","position","top","bottom","left","right","x2","y2","pointerEvents","style","x1","y1","String","stopColor","stopOpacity","fill"],"sourceRoot":"../../../../src","sources":["components/scroll-fade/index.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Children","isValidElement","useMemo","StyleSheet","View","LinearGradient","Animated","useAnimatedScrollHandler","useAnimatedStyle","useComposedEventHandler","useDerivedValue","useSharedValue","useCSSVariable","jsx","_jsx","jsxs","_jsxs","DEFAULT_FADE_IN_DISTANCE","ScrollFade","className","size","edges","orientation","color","fadeInDistance","enabled","children","props","offset","contentLength","viewportLength","themeBackground","fadeColor","child","only","horizontal","undefined","childType","type","AnimatedScrollable","createAnimatedComponent","scrollHandler","onScroll","event","contentOffset","contentSize","layoutMeasurement","value","x","y","width","height","onLayout","nativeEvent","layout","onContentSizeChange","startOpacity","Math","min","endOpacity","remaining","max","scrollable","scrollEventThrottle","Fade","opacity","edge","displayName","isStart","position","top","bottom","left","right","style","colors","withAlpha","pointerEvents","start","end","absoluteFill","alpha","startsWith","hex","slice","full","length","split","map","c","join","r","parseInt","g","b","Number","isNaN","channels","match","part","trim"],"sourceRoot":"../../../../src","sources":["components/scroll-fade/index.tsx"],"mappings":"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","ignoreList":[]}