@expokit/cli 0.4.0 → 0.4.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 (92) hide show
  1. package/bin/lib.mjs +1 -1
  2. package/package.json +1 -1
  3. package/registry/_docs/accordion.json +1 -1
  4. package/registry/_docs/avatar.json +6 -6
  5. package/registry/_docs/badge.json +3 -3
  6. package/registry/_docs/bottom-nav.json +6 -6
  7. package/registry/_docs/bottom-sheet.json +3 -3
  8. package/registry/_docs/bullet.json +6 -0
  9. package/registry/_docs/button-3d.json +2 -2
  10. package/registry/_docs/button.json +2 -2
  11. package/registry/_docs/calendar.json +5 -5
  12. package/registry/_docs/card.json +1 -1
  13. package/registry/_docs/chip-group.json +1 -1
  14. package/registry/_docs/confetti.json +3 -3
  15. package/registry/_docs/date-picker.json +4 -4
  16. package/registry/_docs/drawer.json +4 -4
  17. package/registry/_docs/flip-card.json +4 -4
  18. package/registry/_docs/floating-input.json +1 -1
  19. package/registry/_docs/grain.json +2 -2
  20. package/registry/_docs/isometric-bar.json +6 -0
  21. package/registry/_docs/liquidglass-tab.json +1 -1
  22. package/registry/_docs/otp-input.json +1 -1
  23. package/registry/_docs/payment-card.json +3 -3
  24. package/registry/_docs/pixel-bar.json +6 -0
  25. package/registry/_docs/polar-area.json +6 -0
  26. package/registry/_docs/progress-steps.json +4 -4
  27. package/registry/_docs/progress.json +2 -2
  28. package/registry/_docs/radio-group.json +1 -1
  29. package/registry/_docs/search-bar.json +3 -3
  30. package/registry/_docs/segmented-control.json +1 -1
  31. package/registry/_docs/select.json +6 -6
  32. package/registry/_docs/skeleton.json +1 -1
  33. package/registry/_docs/slider.json +6 -6
  34. package/registry/_docs/spinner.json +2 -2
  35. package/registry/_docs/stateful-button.json +1 -1
  36. package/registry/_docs/stepper.json +3 -3
  37. package/registry/_docs/tabs.json +2 -2
  38. package/registry/_docs/text-animation.json +4 -4
  39. package/registry/_docs/textarea.json +1 -1
  40. package/registry/_docs/tilt-card.json +3 -3
  41. package/registry/_docs/time-picker.json +6 -6
  42. package/registry/_docs/timeline-chart.json +6 -0
  43. package/registry/_docs/timeline.json +4 -4
  44. package/registry/_docs/treemap.json +6 -0
  45. package/registry/_docs/waterfall.json +6 -0
  46. package/registry/accordion/files/src/components/ui/accordion.tsx +31 -3
  47. package/registry/action-sheet/files/src/components/ui/action-sheet.tsx +4 -1
  48. package/registry/alert/files/src/components/ui/alert.tsx +5 -2
  49. package/registry/alert/files/src/components/ui/button.tsx +32 -4
  50. package/registry/badge/files/src/components/ui/badge.tsx +2 -2
  51. package/registry/bottom-nav/files/src/components/ui/bottom-nav.tsx +11 -5
  52. package/registry/button/files/src/components/ui/button.tsx +32 -4
  53. package/registry/button-3d/files/src/components/ui/button-3d.tsx +33 -6
  54. package/registry/calendar/files/src/components/ui/calendar.tsx +62 -17
  55. package/registry/card/files/src/components/ui/card.tsx +25 -5
  56. package/registry/checkbox/files/src/components/ui/checkbox.tsx +26 -4
  57. package/registry/chip-group/files/src/components/ui/chip-group.tsx +35 -5
  58. package/registry/coupon/files/src/components/ui/coupon.tsx +45 -21
  59. package/registry/coupon/files/src/components/ui/flip-card.tsx +22 -3
  60. package/registry/coupon/files/src/components/ui/tilt-card.tsx +57 -16
  61. package/registry/date-picker/files/src/components/ui/calendar.tsx +62 -17
  62. package/registry/date-picker/files/src/components/ui/date-picker.tsx +96 -42
  63. package/registry/dialog/files/src/components/ui/dialog.tsx +9 -5
  64. package/registry/drawer/files/src/components/ui/drawer.tsx +8 -4
  65. package/registry/flip-card/files/src/components/ui/flip-card.tsx +22 -3
  66. package/registry/floating-input/files/src/components/ui/floating-input.tsx +75 -26
  67. package/registry/liquidglass-tab/files/src/components/GlassTabBar.tsx +1 -1
  68. package/registry/list-item/files/src/components/ui/list-item.tsx +10 -3
  69. package/registry/otp-input/files/src/components/ui/otp-input.tsx +50 -19
  70. package/registry/password-input/files/src/components/ui/floating-input.tsx +75 -26
  71. package/registry/password-input/files/src/components/ui/password-input.tsx +53 -19
  72. package/registry/payment-card/files/src/components/ui/flip-card.tsx +22 -3
  73. package/registry/payment-card/files/src/components/ui/payment-card.tsx +19 -15
  74. package/registry/payment-card/files/src/components/ui/tilt-card.tsx +57 -16
  75. package/registry/progress/files/src/components/ui/progress.tsx +9 -2
  76. package/registry/progress-steps/files/src/components/ui/progress-steps.tsx +11 -4
  77. package/registry/radio-group/files/src/components/ui/radio-group.tsx +39 -9
  78. package/registry/search-bar/files/src/components/ui/search-bar.tsx +70 -17
  79. package/registry/segmented-control/files/src/components/ui/segmented-control.tsx +37 -9
  80. package/registry/select/files/src/components/ui/select.tsx +158 -83
  81. package/registry/slider/files/src/components/ui/slider.tsx +53 -25
  82. package/registry/stateful-button/files/src/components/ui/stateful-button.tsx +12 -4
  83. package/registry/stepper/files/src/components/ui/stepper.tsx +76 -26
  84. package/registry/switch/files/src/components/ui/switch.tsx +56 -19
  85. package/registry/tabs/files/src/components/ui/tabs.tsx +7 -4
  86. package/registry/text-animation/files/src/components/ui/text-animation.tsx +7 -2
  87. package/registry/textarea/files/src/components/ui/textarea.tsx +104 -36
  88. package/registry/tilt-card/files/src/components/ui/tilt-card.tsx +57 -16
  89. package/registry/time-picker/files/src/components/ui/time-picker.tsx +154 -73
  90. package/registry/timeline/files/src/components/ui/timeline.tsx +9 -4
  91. package/registry/toast/files/src/components/ui/button.tsx +32 -4
  92. package/registry/toast/files/src/components/ui/toast.tsx +15 -6
@@ -1,5 +1,6 @@
1
1
  import React, { createContext, useContext, useEffect, useMemo, useRef, useState, type ComponentRef } from 'react';
2
2
  import {
3
+ AccessibilityInfo,
3
4
  Animated,
4
5
  Easing,
5
6
  Image,
@@ -92,7 +93,8 @@ export interface TiltState {
92
93
  height: number;
93
94
  }
94
95
 
95
- const Ctx = createContext<TiltState | null>(null);
96
+ // `reduce` (Reduce Motion) rides along privately so layers stay flat too; useTilt still returns a TiltState.
97
+ const Ctx = createContext<(TiltState & { reduce: boolean }) | null>(null);
96
98
 
97
99
  /** The surrounding TiltCard's live tilt (null outside one) — for your own layers and effects. */
98
100
  export function useTilt() {
@@ -105,6 +107,8 @@ const PAINT = 96;
105
107
 
106
108
  // Six colour cycles across the paint, so a couple of bands cross the card like real foil. Cool
107
109
  // pinks, violets and cyans stay clean when blended over dark cards (yellow and green turn olive).
110
+ const SMOOTH = Easing.bezier(0.32, 0.72, 0, 1);
111
+
108
112
  const HOLO = Array.from({ length: 37 }, (_, i) => ['#ff6bd6', '#b38cff', '#6fb6ff', '#5ff0ff', '#a7ffe0', '#ffc2ef'][i % 6]);
109
113
 
110
114
  function GlarePaint({ variant }: { variant: 'soft' | 'sharp' }) {
@@ -256,6 +260,7 @@ export function TiltCard({
256
260
  accessibilityLabel,
257
261
  style,
258
262
  }: TiltCardProps) {
263
+ const reduce = useReduceMotion();
259
264
  const [size, setSize] = useState({ w: 0, h: 0 });
260
265
  const sizeRef = useRef(size);
261
266
  sizeRef.current = size;
@@ -270,11 +275,13 @@ export function TiltCard({
270
275
  const viewRef = useRef<ComponentRef<typeof View>>(null);
271
276
  const disabledRef = useRef(disabled);
272
277
  disabledRef.current = disabled;
278
+ const reduceRef = useRef(reduce);
279
+ reduceRef.current = reduce;
273
280
 
274
281
  // Idle sway: a slow figure-eight while nobody is touching.
275
282
  const idleLoop = useRef<Animated.CompositeAnimation | null>(null);
276
283
  const startIdle = () => {
277
- if (!idle) return;
284
+ if (!idle || reduce) return;
278
285
  const ease = Easing.inOut(Easing.sin);
279
286
  const leg = (v: Animated.Value, to: number, ms: number) =>
280
287
  Animated.timing(v, {
@@ -292,10 +299,15 @@ export function TiltCard({
292
299
  idleLoop.current.start();
293
300
  };
294
301
  useEffect(() => {
302
+ // Reduce Motion: no sway; settle where it stopped back at rest.
303
+ if (reduce && !touching.current) {
304
+ tx.setValue(0);
305
+ ty.setValue(0);
306
+ }
295
307
  startIdle();
296
308
  return () => idleLoop.current?.stop();
297
309
  // eslint-disable-next-line react-hooks/exhaustive-deps
298
- }, [idle]);
310
+ }, [idle, reduce]);
299
311
 
300
312
  const aim = (pageX: number, pageY: number) => {
301
313
  const { w, h } = sizeRef.current;
@@ -307,6 +319,12 @@ export function TiltCard({
307
319
  const release = (tapped: boolean) => {
308
320
  touching.current = false;
309
321
  if (tapped && !moved.current) onPressRef.current?.();
322
+ if (reduce) {
323
+ // The card never leaves flat, so only the light has to settle: a short ease, no spring.
324
+ const settle = (v: Animated.Value) => Animated.timing(v, { toValue: 0, duration: 150, easing: SMOOTH, useNativeDriver: true });
325
+ Animated.parallel([settle(tx), settle(ty), settle(press)]).start();
326
+ return;
327
+ }
310
328
  Animated.parallel([
311
329
  Animated.spring(tx, {
312
330
  toValue: 0,
@@ -355,11 +373,15 @@ export function TiltCard({
355
373
  if (typeof px === 'number' && typeof py === 'number') origin.current = { x: px, y: py };
356
374
  });
357
375
  aim(pageX, pageY);
358
- Animated.spring(press, {
359
- toValue: 1,
360
- ...motion.snappy,
361
- useNativeDriver: true,
362
- }).start();
376
+ if (reduceRef.current) {
377
+ Animated.timing(press, { toValue: 1, duration: 150, easing: SMOOTH, useNativeDriver: true }).start();
378
+ } else {
379
+ Animated.spring(press, {
380
+ toValue: 1,
381
+ ...motion.snappy,
382
+ useNativeDriver: true,
383
+ }).start();
384
+ }
363
385
  },
364
386
  onPanResponderMove: (e, g) => {
365
387
  if (Math.abs(g.dx) + Math.abs(g.dy) > 6) moved.current = true;
@@ -380,21 +402,24 @@ export function TiltCard({
380
402
  if (width !== size.w || height !== size.h) setSize({ w: width, h: height });
381
403
  };
382
404
 
405
+ // Reduce Motion keeps the card flat and still: no tilt, lift or parallax. The reflection (light,
406
+ // not movement of the content) still follows the finger.
407
+ const tilt = reduce ? 0 : maxTilt;
383
408
  const rotateY = tx.interpolate({
384
409
  inputRange: [-1, 1],
385
- outputRange: [`${-maxTilt}deg`, `${maxTilt}deg`],
410
+ outputRange: [`${-tilt}deg`, `${tilt}deg`],
386
411
  });
387
412
  const rotateX = ty.interpolate({
388
413
  inputRange: [-1, 1],
389
- outputRange: [`${maxTilt}deg`, `${-maxTilt}deg`],
414
+ outputRange: [`${tilt}deg`, `${-tilt}deg`],
390
415
  });
391
416
  const scale = press.interpolate({
392
417
  inputRange: [0, 1],
393
- outputRange: [1, pressScale],
418
+ outputRange: [1, reduce ? 1 : pressScale],
394
419
  });
395
420
 
396
- const ctx = useMemo(() => ({ tx, ty, press, width: size.w, height: size.h }), [tx, ty, press, size.w, size.h]);
397
- const drift = Math.min(10, size.w * 0.03);
421
+ const ctx = useMemo(() => ({ tx, ty, press, width: size.w, height: size.h, reduce }), [tx, ty, press, size.w, size.h, reduce]);
422
+ const drift = reduce ? 0 : Math.min(10, size.w * 0.03);
398
423
  // The plate sits well inside the outline — far enough that it never shows through a notch or a
399
424
  // see-through corner, even at full tilt; the shadow offset does the downward shift.
400
425
  const body = shadowRect ?? { x: 0, y: 0, width: size.w, height: size.h };
@@ -433,7 +458,7 @@ export function TiltCard({
433
458
  {
434
459
  scale: press.interpolate({
435
460
  inputRange: [0, 1],
436
- outputRange: [1, 1.035],
461
+ outputRange: [1, reduce ? 1 : 1.035],
437
462
  }),
438
463
  },
439
464
  { scaleX: shadowScaleX ?? 1 },
@@ -516,7 +541,7 @@ export function TiltCard({
516
541
  export function TiltLayer({ children, depth = 0.5, style }: TiltLayerProps) {
517
542
  const ctx = useContext(Ctx);
518
543
  if (!ctx) throw new Error('TiltLayer must be inside TiltCard');
519
- const d = depth * 14;
544
+ const d = ctx.reduce ? 0 : depth * 14;
520
545
  return (
521
546
  <Animated.View
522
547
  pointerEvents="box-none"
@@ -539,7 +564,7 @@ export function TiltLayer({ children, depth = 0.5, style }: TiltLayerProps) {
539
564
  {
540
565
  scale: ctx.press.interpolate({
541
566
  inputRange: [0, 1],
542
- outputRange: [1, 1 + Math.max(0, depth) * 0.035],
567
+ outputRange: [1, ctx.reduce ? 1 : 1 + Math.max(0, depth) * 0.035],
543
568
  }),
544
569
  },
545
570
  ],
@@ -616,6 +641,22 @@ export function TiltFoil({ children, radius = 8, base = '#d7dbe2', style }: Tilt
616
641
  );
617
642
  }
618
643
 
644
+ function useReduceMotion() {
645
+ const [reduce, setReduce] = useState(false);
646
+ useEffect(() => {
647
+ let alive = true;
648
+ AccessibilityInfo.isReduceMotionEnabled()
649
+ .then((r) => alive && setReduce(r))
650
+ .catch(() => {});
651
+ const sub = AccessibilityInfo.addEventListener('reduceMotionChanged', setReduce);
652
+ return () => {
653
+ alive = false;
654
+ sub.remove();
655
+ };
656
+ }, []);
657
+ return reduce;
658
+ }
659
+
619
660
  const styles = StyleSheet.create({
620
661
  plate: {
621
662
  position: 'absolute',