panelui-native 0.2.0 → 0.5.1

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 (106) hide show
  1. package/README.md +258 -0
  2. package/lib/module/components/accordion/index.js +312 -0
  3. package/lib/module/components/accordion/index.js.map +1 -0
  4. package/lib/module/components/alert/index.js +106 -13
  5. package/lib/module/components/alert/index.js.map +1 -1
  6. package/lib/module/components/avatar/index.js +58 -17
  7. package/lib/module/components/avatar/index.js.map +1 -1
  8. package/lib/module/components/badge/index.js +29 -8
  9. package/lib/module/components/badge/index.js.map +1 -1
  10. package/lib/module/components/button/index.js +87 -26
  11. package/lib/module/components/button/index.js.map +1 -1
  12. package/lib/module/components/checkbox/index.js +59 -18
  13. package/lib/module/components/checkbox/index.js.map +1 -1
  14. package/lib/module/components/empty-state/index.js +178 -0
  15. package/lib/module/components/empty-state/index.js.map +1 -0
  16. package/lib/module/components/frame/index.js +64 -13
  17. package/lib/module/components/frame/index.js.map +1 -1
  18. package/lib/module/components/input-group/index.js +132 -0
  19. package/lib/module/components/input-group/index.js.map +1 -0
  20. package/lib/module/components/label/index.js +117 -0
  21. package/lib/module/components/label/index.js.map +1 -0
  22. package/lib/module/components/progress/index.js +138 -0
  23. package/lib/module/components/progress/index.js.map +1 -0
  24. package/lib/module/components/steps/index.js +354 -0
  25. package/lib/module/components/steps/index.js.map +1 -0
  26. package/lib/module/components/tabs/index.js +9 -3
  27. package/lib/module/components/tabs/index.js.map +1 -1
  28. package/lib/module/components/timeline/index.js +633 -0
  29. package/lib/module/components/timeline/index.js.map +1 -0
  30. package/lib/module/components/toast/index.js +569 -0
  31. package/lib/module/components/toast/index.js.map +1 -0
  32. package/lib/module/components/toast/toast-store.js +81 -0
  33. package/lib/module/components/toast/toast-store.js.map +1 -0
  34. package/lib/module/components/typography/index.js +126 -0
  35. package/lib/module/components/typography/index.js.map +1 -0
  36. package/lib/module/icons/index.js +590 -8
  37. package/lib/module/icons/index.js.map +1 -1
  38. package/lib/module/index.js +11 -2
  39. package/lib/module/index.js.map +1 -1
  40. package/lib/module/providers/panel-ui-provider.js +2 -1
  41. package/lib/module/providers/panel-ui-provider.js.map +1 -1
  42. package/lib/module/theme/use-theme.js +90 -3
  43. package/lib/module/theme/use-theme.js.map +1 -1
  44. package/lib/typescript/src/components/accordion/index.d.ts +56 -0
  45. package/lib/typescript/src/components/accordion/index.d.ts.map +1 -0
  46. package/lib/typescript/src/components/alert/index.d.ts +56 -4
  47. package/lib/typescript/src/components/alert/index.d.ts.map +1 -1
  48. package/lib/typescript/src/components/avatar/index.d.ts +8 -1
  49. package/lib/typescript/src/components/avatar/index.d.ts.map +1 -1
  50. package/lib/typescript/src/components/badge/index.d.ts +38 -0
  51. package/lib/typescript/src/components/badge/index.d.ts.map +1 -1
  52. package/lib/typescript/src/components/button/index.d.ts +57 -0
  53. package/lib/typescript/src/components/button/index.d.ts.map +1 -1
  54. package/lib/typescript/src/components/checkbox/index.d.ts +50 -0
  55. package/lib/typescript/src/components/checkbox/index.d.ts.map +1 -1
  56. package/lib/typescript/src/components/empty-state/index.d.ts +73 -0
  57. package/lib/typescript/src/components/empty-state/index.d.ts.map +1 -0
  58. package/lib/typescript/src/components/frame/index.d.ts +39 -5
  59. package/lib/typescript/src/components/frame/index.d.ts.map +1 -1
  60. package/lib/typescript/src/components/input-group/index.d.ts +34 -0
  61. package/lib/typescript/src/components/input-group/index.d.ts.map +1 -0
  62. package/lib/typescript/src/components/label/index.d.ts +28 -0
  63. package/lib/typescript/src/components/label/index.d.ts.map +1 -0
  64. package/lib/typescript/src/components/progress/index.d.ts +132 -0
  65. package/lib/typescript/src/components/progress/index.d.ts.map +1 -0
  66. package/lib/typescript/src/components/steps/index.d.ts +62 -0
  67. package/lib/typescript/src/components/steps/index.d.ts.map +1 -0
  68. package/lib/typescript/src/components/tabs/index.d.ts.map +1 -1
  69. package/lib/typescript/src/components/timeline/index.d.ts +96 -0
  70. package/lib/typescript/src/components/timeline/index.d.ts.map +1 -0
  71. package/lib/typescript/src/components/toast/index.d.ts +176 -0
  72. package/lib/typescript/src/components/toast/index.d.ts.map +1 -0
  73. package/lib/typescript/src/components/toast/toast-store.d.ts +65 -0
  74. package/lib/typescript/src/components/toast/toast-store.d.ts.map +1 -0
  75. package/lib/typescript/src/components/typography/index.d.ts +77 -0
  76. package/lib/typescript/src/components/typography/index.d.ts.map +1 -0
  77. package/lib/typescript/src/icons/index.d.ts +60 -0
  78. package/lib/typescript/src/icons/index.d.ts.map +1 -1
  79. package/lib/typescript/src/index.d.ts +13 -4
  80. package/lib/typescript/src/index.d.ts.map +1 -1
  81. package/lib/typescript/src/providers/panel-ui-provider.d.ts.map +1 -1
  82. package/lib/typescript/src/theme/use-theme.d.ts +64 -4
  83. package/lib/typescript/src/theme/use-theme.d.ts.map +1 -1
  84. package/package.json +22 -4
  85. package/src/components/accordion/index.tsx +344 -0
  86. package/src/components/alert/index.tsx +102 -16
  87. package/src/components/avatar/index.tsx +68 -20
  88. package/src/components/badge/index.tsx +38 -9
  89. package/src/components/button/index.tsx +102 -19
  90. package/src/components/checkbox/index.tsx +64 -12
  91. package/src/components/empty-state/index.tsx +136 -0
  92. package/src/components/frame/index.tsx +101 -31
  93. package/src/components/input-group/index.tsx +164 -0
  94. package/src/components/label/index.tsx +128 -0
  95. package/src/components/progress/index.tsx +147 -0
  96. package/src/components/steps/index.tsx +343 -0
  97. package/src/components/tabs/index.tsx +10 -2
  98. package/src/components/timeline/index.tsx +456 -0
  99. package/src/components/toast/index.tsx +568 -0
  100. package/src/components/toast/toast-store.ts +120 -0
  101. package/src/components/typography/index.tsx +121 -0
  102. package/src/icons/index.tsx +423 -7
  103. package/src/index.ts +114 -4
  104. package/src/providers/panel-ui-provider.tsx +3 -0
  105. package/src/theme/use-theme.ts +119 -4
  106. package/theme.css +330 -7
@@ -0,0 +1,569 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Toast — transient notification.
5
+ *
6
+ * Adapted from: heroui-inc/heroui-native src/components/toast/
7
+ * (the three usage patterns — string, config object, custom component — the
8
+ * Title / Description / Action / Close anatomy, placement, and swipe-to-
9
+ * dismiss). Styled with Coss UI tokens and PanelUI's Alert status palette.
10
+ *
11
+ * The viewport is mounted for you by PanelUIProvider; `useToast()` works
12
+ * anywhere below it.
13
+ */
14
+ import { createContext, useCallback, useContext, useEffect, useMemo, useSyncExternalStore } from 'react';
15
+ import { View } from 'react-native';
16
+ import { Gesture, GestureDetector } from 'react-native-gesture-handler';
17
+ import Animated, { Easing, Extrapolation, FadeInDown, FadeInUp, Keyframe, interpolate, runOnJS, useAnimatedStyle, useSharedValue, withDecay, withSpring, withTiming } from 'react-native-reanimated';
18
+ import { useSafeAreaInsets } from 'react-native-safe-area-context';
19
+ import { tv } from 'tailwind-variants';
20
+ import { useCSSVariable } from 'uniwind';
21
+ import { Portal } from "../../primitives/portal.js";
22
+ import { Text } from "../../primitives/text.js";
23
+ import { cn } from "../../utils/cn.js";
24
+ import { AlertTriangleIcon, CheckCircleIcon, InfoIcon, XIcon } from "../../icons/index.js";
25
+ import { Button } from "../button/index.js";
26
+ import { toast, toastStore } from "./toast-store.js";
27
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
28
+ const SPRING = {
29
+ damping: 20,
30
+ stiffness: 260,
31
+ mass: 0.6
32
+ };
33
+ /** Drag distance past which a release dismisses. */
34
+ const DISMISS_DISTANCE = 50;
35
+ /** Fling speed past which a release dismisses regardless of distance. */
36
+ const DISMISS_VELOCITY = 500;
37
+ /** How far a toast can be dragged away from its edge before it stops moving. */
38
+ const RUBBER_BAND_LIMIT = 40;
39
+ /** How far a toast travels on entry. Short, so the spring has little to settle. */
40
+ const ENTER_OFFSET = 100;
41
+ /** Newest toasts only; older ones fade out rather than stacking off-screen. */
42
+ const MAX_VISIBLE = 3;
43
+ /** How far each toast behind the front one peeks out. */
44
+ const STACK_OFFSET = 10;
45
+ /** Scale of the toast one step back in the deck. */
46
+ const STACK_SCALE_STEP = 0.97;
47
+ /** Gap between the deck and the screen edges, on top of the safe-area inset. */
48
+ const EDGE_INSET = 16;
49
+
50
+ /*
51
+ * Entering/exiting animations, from heroui-inc/heroui-native
52
+ * src/components/toast/toast.animation.ts.
53
+ *
54
+ * `mass(3)` is doing the important work: a heavy spring settles without the
55
+ * visible overshoot a default-mass one gives. `withInitialValues` keeps
56
+ * opacity at 1 so the toast slides rather than fades, and starts it
57
+ * ENTER_OFFSET px away instead of off-screen.
58
+ */
59
+ const enteringTop = FadeInUp.springify().withInitialValues({
60
+ opacity: 1,
61
+ transform: [{
62
+ translateY: -ENTER_OFFSET
63
+ }]
64
+ }).mass(3);
65
+ const enteringBottom = FadeInDown.springify().withInitialValues({
66
+ opacity: 1,
67
+ transform: [{
68
+ translateY: ENTER_OFFSET
69
+ }]
70
+ }).mass(3);
71
+ const exitKeyframe = offset => new Keyframe({
72
+ 0: {
73
+ opacity: 1,
74
+ transform: [{
75
+ translateY: 0
76
+ }, {
77
+ scale: 1
78
+ }]
79
+ },
80
+ 100: {
81
+ opacity: 0.5,
82
+ transform: [{
83
+ translateY: offset
84
+ }, {
85
+ scale: 0.97
86
+ }],
87
+ easing: Easing.bezier(0.4, 0, 1, 1)
88
+ }
89
+ }).duration(150);
90
+ const exitingTop = exitKeyframe(-ENTER_OFFSET);
91
+ const exitingBottom = exitKeyframe(ENTER_OFFSET);
92
+ const toastVariants = tv({
93
+ slots: {
94
+ root: 'w-full flex-row items-start gap-3 rounded-2xl border px-4 py-3.5 shadow-lg',
95
+ indicator: 'pt-px',
96
+ content: 'flex-1 gap-0.5',
97
+ title: 'text-sm font-medium',
98
+ description: 'text-sm text-muted-foreground'
99
+ },
100
+ variants: {
101
+ variant: {
102
+ default: {
103
+ root: 'border-border bg-popover',
104
+ title: 'text-popover-foreground'
105
+ },
106
+ info: {
107
+ root: 'border-info/32 bg-popover',
108
+ title: 'text-info-foreground'
109
+ },
110
+ success: {
111
+ root: 'border-success/32 bg-popover',
112
+ title: 'text-success-foreground'
113
+ },
114
+ warning: {
115
+ root: 'border-warning/32 bg-popover',
116
+ title: 'text-warning-foreground'
117
+ },
118
+ destructive: {
119
+ root: 'border-destructive/32 bg-popover',
120
+ title: 'text-destructive-foreground'
121
+ }
122
+ }
123
+ },
124
+ defaultVariants: {
125
+ variant: 'default'
126
+ }
127
+ });
128
+ const INDICATOR_COLOR_VAR = {
129
+ default: '--color-muted-foreground',
130
+ info: '--color-info-foreground',
131
+ success: '--color-success-foreground',
132
+ warning: '--color-warning-foreground',
133
+ destructive: '--color-destructive-foreground'
134
+ };
135
+ const INDICATOR_ICON = {
136
+ default: InfoIcon,
137
+ info: InfoIcon,
138
+ success: CheckCircleIcon,
139
+ warning: AlertTriangleIcon,
140
+ destructive: AlertTriangleIcon
141
+ };
142
+ const ToastContext = /*#__PURE__*/createContext({
143
+ variant: 'default',
144
+ hide: () => {}
145
+ });
146
+ /**
147
+ * Presentational toast surface. Render it yourself only for custom toasts —
148
+ * `toast.show(...)` builds one for you from a config object.
149
+ */
150
+ const ToastRoot = ({
151
+ className,
152
+ variant = 'default',
153
+ onHide,
154
+ children,
155
+ ...props
156
+ }) => {
157
+ const context = useMemo(() => ({
158
+ variant,
159
+ hide: onHide ?? (() => {})
160
+ }), [variant, onHide]);
161
+ const {
162
+ root
163
+ } = toastVariants({
164
+ variant
165
+ });
166
+ return /*#__PURE__*/_jsx(ToastContext.Provider, {
167
+ value: context,
168
+ children: /*#__PURE__*/_jsx(View, {
169
+ accessibilityRole: "alert",
170
+ accessibilityLiveRegion: "polite",
171
+ className: root({
172
+ className
173
+ }),
174
+ ...props,
175
+ children: children
176
+ })
177
+ });
178
+ };
179
+ ToastRoot.displayName = 'Toast';
180
+ const ToastIndicator = ({
181
+ className,
182
+ iconProps,
183
+ children,
184
+ ...props
185
+ }) => {
186
+ const {
187
+ variant
188
+ } = useContext(ToastContext);
189
+ const {
190
+ indicator
191
+ } = toastVariants({
192
+ variant
193
+ });
194
+ const themeColor = useCSSVariable(INDICATOR_COLOR_VAR[variant]);
195
+ const Icon = INDICATOR_ICON[variant];
196
+ const color = iconProps?.color ?? (typeof themeColor === 'string' ? themeColor : undefined);
197
+ return /*#__PURE__*/_jsx(View, {
198
+ className: indicator({
199
+ className
200
+ }),
201
+ ...props,
202
+ children: children ?? /*#__PURE__*/_jsx(Icon, {
203
+ size: iconProps?.size ?? 18,
204
+ color: color
205
+ })
206
+ });
207
+ };
208
+ ToastIndicator.displayName = 'Toast.Indicator';
209
+ const ToastContent = ({
210
+ className,
211
+ ...props
212
+ }) => {
213
+ const {
214
+ variant
215
+ } = useContext(ToastContext);
216
+ const {
217
+ content
218
+ } = toastVariants({
219
+ variant
220
+ });
221
+ return /*#__PURE__*/_jsx(View, {
222
+ className: content({
223
+ className
224
+ }),
225
+ ...props
226
+ });
227
+ };
228
+ ToastContent.displayName = 'Toast.Content';
229
+ const ToastTitle = ({
230
+ className,
231
+ ...props
232
+ }) => {
233
+ const {
234
+ variant
235
+ } = useContext(ToastContext);
236
+ const {
237
+ title
238
+ } = toastVariants({
239
+ variant
240
+ });
241
+ return /*#__PURE__*/_jsx(Text, {
242
+ className: cn(title(), className),
243
+ ...props
244
+ });
245
+ };
246
+ ToastTitle.displayName = 'Toast.Title';
247
+ const ToastDescription = ({
248
+ className,
249
+ ...props
250
+ }) => {
251
+ const {
252
+ variant
253
+ } = useContext(ToastContext);
254
+ const {
255
+ description
256
+ } = toastVariants({
257
+ variant
258
+ });
259
+ return /*#__PURE__*/_jsx(Text, {
260
+ className: cn(description(), className),
261
+ ...props
262
+ });
263
+ };
264
+ ToastDescription.displayName = 'Toast.Description';
265
+
266
+ /** Trailing action button. Defaults to a subtle variant that reads on the popover surface. */
267
+ const ToastAction = ({
268
+ variant = 'secondary',
269
+ size = 'sm',
270
+ onPress,
271
+ ...props
272
+ }) => {
273
+ const {
274
+ hide
275
+ } = useContext(ToastContext);
276
+ return /*#__PURE__*/_jsx(Button, {
277
+ variant: variant,
278
+ size: size,
279
+ onPress: event => {
280
+ onPress?.(event);
281
+ hide();
282
+ },
283
+ ...props
284
+ });
285
+ };
286
+ ToastAction.displayName = 'Toast.Action';
287
+ const ToastClose = ({
288
+ className,
289
+ ...props
290
+ }) => {
291
+ const {
292
+ hide
293
+ } = useContext(ToastContext);
294
+ const color = useCSSVariable('--color-muted-foreground');
295
+ return /*#__PURE__*/_jsx(View, {
296
+ className: cn('pt-px', className),
297
+ ...props,
298
+ children: /*#__PURE__*/_jsx(Button, {
299
+ variant: "ghost",
300
+ size: "icon",
301
+ accessibilityLabel: "Dismiss notification",
302
+ className: "h-6 w-6 rounded-full",
303
+ onPress: hide,
304
+ children: /*#__PURE__*/_jsx(XIcon, {
305
+ size: 14,
306
+ color: typeof color === 'string' ? color : undefined
307
+ })
308
+ })
309
+ });
310
+ };
311
+ ToastClose.displayName = 'Toast.Close';
312
+ export const Toast = Object.assign(ToastRoot, {
313
+ Indicator: ToastIndicator,
314
+ Content: ToastContent,
315
+ Title: ToastTitle,
316
+ Description: ToastDescription,
317
+ Action: ToastAction,
318
+ Close: ToastClose
319
+ });
320
+
321
+ /* -------------------------------------------------------------------------- */
322
+ /* Viewport */
323
+ /* -------------------------------------------------------------------------- */
324
+
325
+ /**
326
+ * One queued toast.
327
+ *
328
+ * The entering spring is deliberately heavy (`mass(3)`) and travels only
329
+ * ENTER_OFFSET px rather than the full screen height. A default-mass spring
330
+ * across that distance overshoots visibly — it reads as a bounce, and arrives
331
+ * too fast to follow.
332
+ *
333
+ * Swiping is vertical and direction-aware: dragging toward the screen edge the
334
+ * toast came from dismisses it, dragging the other way rubber-bands against a
335
+ * hard limit. Matches heroui-native's toast.animation.ts.
336
+ */
337
+ function ToastSlot({
338
+ item,
339
+ index,
340
+ total,
341
+ frontId,
342
+ heights
343
+ }) {
344
+ const placement = item.placement ?? 'bottom';
345
+ const translateY = useSharedValue(0);
346
+ const scale = useSharedValue(1);
347
+ const hide = useCallback(() => toastStore.hide(item.id), [item.id]);
348
+
349
+ // Drop this toast's measurement when it leaves, so the map cannot grow
350
+ // without bound over a long session.
351
+ useEffect(() => () => {
352
+ heights.modify(value => {
353
+ 'worklet';
354
+
355
+ const next = {
356
+ ...value
357
+ };
358
+ delete next[item.id];
359
+ return next;
360
+ });
361
+ }, [heights, item.id]);
362
+
363
+ /** +1 when a downward drag dismisses (bottom), -1 when an upward one does. */
364
+ const dismissSign = placement === 'top' ? -1 : 1;
365
+ const pan = Gesture.Pan().activeOffsetY([-12, 12]).onBegin(() => {
366
+ scale.value = withTiming(0.995, {
367
+ duration: 120
368
+ });
369
+ }).onChange(event => {
370
+ const next = translateY.value + event.changeY;
371
+ // Toward the edge: follow the finger. Away from it: rubber-band, so the
372
+ // toast never detaches from where it belongs.
373
+ translateY.value = next * dismissSign > 0 ? next : interpolate(Math.abs(next), [0, 400], [0, RUBBER_BAND_LIMIT], Extrapolation.CLAMP) * -dismissSign;
374
+ }).onFinalize(event => {
375
+ scale.value = withTiming(1, {
376
+ duration: 120
377
+ });
378
+ const towardEdge = translateY.value * dismissSign > 0;
379
+ const shouldDismiss = towardEdge && (Math.abs(translateY.value) > DISMISS_DISTANCE || Math.abs(event.velocityY) > DISMISS_VELOCITY);
380
+ if (shouldDismiss) {
381
+ // Carry the flick's momentum instead of stopping dead, clamped so it
382
+ // can only continue toward the edge.
383
+ translateY.value = withDecay({
384
+ velocity: event.velocityY * 1.5,
385
+ clamp: dismissSign > 0 ? [0, Number.POSITIVE_INFINITY] : [Number.NEGATIVE_INFINITY, 0]
386
+ });
387
+ runOnJS(hide)();
388
+ } else {
389
+ translateY.value = withSpring(0, SPRING);
390
+ }
391
+ });
392
+
393
+ /** Older toasts slide away from the edge the stack is pinned to. */
394
+ const stackSign = placement === 'top' ? 1 : -1;
395
+
396
+ /**
397
+ * Stack position plus the gesture transform.
398
+ *
399
+ * The whole deck takes the *newest* toast's height so the cards behind read
400
+ * as a uniform stack rather than a ragged pile — matching heroui-native.
401
+ */
402
+ const stackStyle = useAnimatedStyle(() => {
403
+ // Fall back to this toast's own height until the front one is measured.
404
+ const frontHeight = heights.value[frontId] ?? heights.value[item.id];
405
+
406
+ // Newest sits at 0; each one behind steps back by STACK_OFFSET and shrinks.
407
+ const inputRange = [total - 1, total - 2];
408
+ const offset = interpolate(index, inputRange, [0, STACK_OFFSET * stackSign], {
409
+ extrapolateLeft: Extrapolation.CLAMP
410
+ });
411
+ const stackScale = interpolate(index, inputRange, [1, STACK_SCALE_STEP], {
412
+ extrapolateLeft: Extrapolation.CLAMP
413
+ });
414
+ // Anything past MAX_VISIBLE fades out rather than piling up forever.
415
+ const opacity = interpolate(index, [total - MAX_VISIBLE, total - MAX_VISIBLE - 1], [1, 0], Extrapolation.CLAMP);
416
+ return {
417
+ opacity,
418
+ height: frontHeight,
419
+ transform: [{
420
+ translateY: offset + translateY.value
421
+ }, {
422
+ scale: stackScale * scale.value
423
+ }]
424
+ };
425
+ });
426
+ const handle = {
427
+ id: item.id,
428
+ hide
429
+ };
430
+ const content = item.component ? item.component(handle) : /*#__PURE__*/_jsxs(Toast, {
431
+ variant: item.variant ?? 'default',
432
+ onHide: hide,
433
+ children: [item.icon === null ? null : /*#__PURE__*/_jsx(Toast.Indicator, {
434
+ children: item.icon ?? undefined
435
+ }), /*#__PURE__*/_jsxs(Toast.Content, {
436
+ children: [item.label ? /*#__PURE__*/_jsx(Toast.Title, {
437
+ children: item.label
438
+ }) : null, item.description ? /*#__PURE__*/_jsx(Toast.Description, {
439
+ children: item.description
440
+ }) : null]
441
+ }), item.actionLabel ? /*#__PURE__*/_jsx(Toast.Action, {
442
+ onPress: () => item.onActionPress?.(handle),
443
+ children: item.actionLabel
444
+ }) : null, item.closable ?? !item.actionLabel ? /*#__PURE__*/_jsx(Toast.Close, {}) : null]
445
+ });
446
+ return /*#__PURE__*/_jsxs(Animated.View, {
447
+ entering: placement === 'top' ? enteringTop : enteringBottom,
448
+ exiting: placement === 'top' ? exitingTop : exitingBottom,
449
+ pointerEvents: "box-none"
450
+ // Every toast is pinned to the same edge, so they overlap as a deck.
451
+ // Newest on top. Horizontal inset lives here rather than as padding on
452
+ // the anchor: Yoga positions absolute children against the border box,
453
+ // so padding on the parent would not move them.
454
+ ,
455
+ className: "absolute",
456
+ style: {
457
+ left: EDGE_INSET,
458
+ right: EDGE_INSET,
459
+ [placement === 'top' ? 'top' : 'bottom']: 0,
460
+ zIndex: index
461
+ },
462
+ children: [/*#__PURE__*/_jsx(GestureDetector, {
463
+ gesture: pan,
464
+ children: /*#__PURE__*/_jsx(Animated.View, {
465
+ style: stackStyle,
466
+ children: content
467
+ })
468
+ }), /*#__PURE__*/_jsx(View, {
469
+ pointerEvents: "none",
470
+ accessibilityElementsHidden: true,
471
+ importantForAccessibility: "no-hide-descendants",
472
+ className: "absolute left-0 right-0 opacity-0",
473
+ onLayout: event => {
474
+ const measured = event.nativeEvent.layout.height;
475
+ heights.modify(value => {
476
+ 'worklet';
477
+
478
+ if (value[item.id] === measured) return value;
479
+ return {
480
+ ...value,
481
+ [item.id]: measured
482
+ };
483
+ });
484
+ },
485
+ children: content
486
+ })]
487
+ });
488
+ }
489
+
490
+ /**
491
+ * The deck for one edge of the screen.
492
+ *
493
+ * Toasts are not laid out in flow — each one is absolutely pinned to the same
494
+ * edge and offset by its stack position, so they overlap like a deck of cards
495
+ * with only the newest fully visible.
496
+ */
497
+ function ToastStack({
498
+ items,
499
+ placement
500
+ }) {
501
+ const insets = useSafeAreaInsets();
502
+ // Natural heights, keyed by toast id. Written from the UI thread by each
503
+ // slot's hidden measuring copy.
504
+ const heights = useSharedValue({});
505
+ if (items.length === 0) return null;
506
+
507
+ // Keep a couple beyond MAX_VISIBLE mounted so the ones fading out still
508
+ // animate rather than popping.
509
+ const visible = items.slice(-(MAX_VISIBLE + 1));
510
+ const frontId = visible[visible.length - 1].id;
511
+ return (
512
+ /*#__PURE__*/
513
+ // A zero-height anchor sitting at the safe-area edge. The toasts hang off
514
+ // it — upward for bottom placement, downward for top — so the inset is
515
+ // part of the anchor's position rather than padding, which Yoga would
516
+ // ignore for absolutely positioned children.
517
+ _jsx(View, {
518
+ pointerEvents: "box-none",
519
+ className: "absolute left-0 right-0",
520
+ style: {
521
+ [placement === 'top' ? 'top' : 'bottom']: (placement === 'top' ? insets.top : insets.bottom) + EDGE_INSET,
522
+ height: 0
523
+ },
524
+ children: visible.map((item, index) => /*#__PURE__*/_jsx(ToastSlot, {
525
+ item: item,
526
+ index: index,
527
+ total: visible.length,
528
+ frontId: frontId,
529
+ heights: heights
530
+ }, item.id))
531
+ })
532
+ );
533
+ }
534
+
535
+ /**
536
+ * Renders the toast queue. PanelUIProvider mounts this automatically — you
537
+ * only need it directly if you build your own provider.
538
+ */
539
+ export function ToastViewport() {
540
+ const items = useSyncExternalStore(toastStore.subscribe, toastStore.getSnapshot);
541
+ if (items.length === 0) return null;
542
+ const top = items.filter(item => item.placement === 'top');
543
+ const bottom = items.filter(item => item.placement !== 'top');
544
+ return /*#__PURE__*/_jsxs(Portal, {
545
+ children: [/*#__PURE__*/_jsx(ToastStack, {
546
+ items: top,
547
+ placement: "top"
548
+ }), /*#__PURE__*/_jsx(ToastStack, {
549
+ items: bottom,
550
+ placement: "bottom"
551
+ })]
552
+ });
553
+ }
554
+
555
+ /**
556
+ * Access the toast API.
557
+ *
558
+ * ```tsx
559
+ * const { toast } = useToast();
560
+ * toast.show({ variant: 'success', label: 'Saved' });
561
+ * ```
562
+ */
563
+ export function useToast() {
564
+ return {
565
+ toast
566
+ };
567
+ }
568
+ export { toast };
569
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createContext","useCallback","useContext","useEffect","useMemo","useSyncExternalStore","View","Gesture","GestureDetector","Animated","Easing","Extrapolation","FadeInDown","FadeInUp","Keyframe","interpolate","runOnJS","useAnimatedStyle","useSharedValue","withDecay","withSpring","withTiming","useSafeAreaInsets","tv","useCSSVariable","Portal","Text","cn","AlertTriangleIcon","CheckCircleIcon","InfoIcon","XIcon","Button","toast","toastStore","jsx","_jsx","jsxs","_jsxs","SPRING","damping","stiffness","mass","DISMISS_DISTANCE","DISMISS_VELOCITY","RUBBER_BAND_LIMIT","ENTER_OFFSET","MAX_VISIBLE","STACK_OFFSET","STACK_SCALE_STEP","EDGE_INSET","enteringTop","springify","withInitialValues","opacity","transform","translateY","enteringBottom","exitKeyframe","offset","scale","easing","bezier","duration","exitingTop","exitingBottom","toastVariants","slots","root","indicator","content","title","description","variants","variant","default","info","success","warning","destructive","defaultVariants","INDICATOR_COLOR_VAR","INDICATOR_ICON","ToastContext","hide","ToastRoot","className","onHide","children","props","context","Provider","value","accessibilityRole","accessibilityLiveRegion","displayName","ToastIndicator","iconProps","themeColor","Icon","color","undefined","size","ToastContent","ToastTitle","ToastDescription","ToastAction","onPress","event","ToastClose","accessibilityLabel","Toast","Object","assign","Indicator","Content","Title","Description","Action","Close","ToastSlot","item","index","total","frontId","heights","placement","id","modify","next","dismissSign","pan","Pan","activeOffsetY","onBegin","onChange","changeY","Math","abs","CLAMP","onFinalize","towardEdge","shouldDismiss","velocityY","velocity","clamp","Number","POSITIVE_INFINITY","NEGATIVE_INFINITY","stackSign","stackStyle","frontHeight","inputRange","extrapolateLeft","stackScale","height","handle","component","icon","label","actionLabel","onActionPress","closable","entering","exiting","pointerEvents","style","left","right","zIndex","gesture","accessibilityElementsHidden","importantForAccessibility","onLayout","measured","nativeEvent","layout","ToastStack","items","insets","length","visible","slice","top","bottom","map","ToastViewport","subscribe","getSnapshot","filter","useToast"],"sourceRoot":"../../../../src","sources":["components/toast/index.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Toast queue.
5
+ *
6
+ * A module-level store rather than React state, so `toast.show()` works from
7
+ * anywhere — event handlers, API clients, code outside the component tree —
8
+ * without threading a context through. The viewport subscribes with
9
+ * `useSyncExternalStore`.
10
+ */
11
+
12
+ /** Handle given to action callbacks so they can dismiss their own toast. */
13
+
14
+ const DEFAULT_DURATION = 4000;
15
+ let counter = 0;
16
+ class ToastStore {
17
+ items = [];
18
+ snapshot = this.items;
19
+ listeners = new Set();
20
+ timers = new Map();
21
+ subscribe = listener => {
22
+ this.listeners.add(listener);
23
+ return () => {
24
+ this.listeners.delete(listener);
25
+ };
26
+ };
27
+ getSnapshot = () => this.snapshot;
28
+ show = options => {
29
+ const resolved = typeof options === 'string' ? {
30
+ label: options
31
+ } : options;
32
+ const id = `toast-${++counter}`;
33
+ this.items = [...this.items, {
34
+ ...resolved,
35
+ id
36
+ }];
37
+ this.emit();
38
+ const duration = resolved.duration ?? DEFAULT_DURATION;
39
+ if (duration > 0) {
40
+ this.timers.set(id, setTimeout(() => this.hide(id), duration));
41
+ }
42
+ return id;
43
+ };
44
+ hide = id => {
45
+ const timer = this.timers.get(id);
46
+ if (timer) {
47
+ clearTimeout(timer);
48
+ this.timers.delete(id);
49
+ }
50
+ if (!this.items.some(item => item.id === id)) return;
51
+ this.items = this.items.filter(item => item.id !== id);
52
+ this.emit();
53
+ };
54
+ hideAll = () => {
55
+ this.timers.forEach(clearTimeout);
56
+ this.timers.clear();
57
+ if (this.items.length === 0) return;
58
+ this.items = [];
59
+ this.emit();
60
+ };
61
+ emit() {
62
+ this.snapshot = this.items;
63
+ this.listeners.forEach(listener => listener());
64
+ }
65
+ }
66
+ export const toastStore = new ToastStore();
67
+
68
+ /**
69
+ * Imperative toast API. Also returned from `useToast()`.
70
+ *
71
+ * ```ts
72
+ * toast.show('Saved');
73
+ * toast.show({ variant: 'success', label: 'Deployed', actionLabel: 'View' });
74
+ * ```
75
+ */
76
+ export const toast = {
77
+ show: toastStore.show,
78
+ hide: toastStore.hide,
79
+ hideAll: toastStore.hideAll
80
+ };
81
+ //# sourceMappingURL=toast-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["DEFAULT_DURATION","counter","ToastStore","items","snapshot","listeners","Set","timers","Map","subscribe","listener","add","delete","getSnapshot","show","options","resolved","label","id","emit","duration","set","setTimeout","hide","timer","get","clearTimeout","some","item","filter","hideAll","forEach","clear","length","toastStore","toast"],"sourceRoot":"../../../../src","sources":["components/toast/toast-store.ts"],"mappings":"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","ignoreList":[]}