@lmb-it/kitsconcerto-native 0.1.244 → 0.1.246

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 (130) hide show
  1. package/components/ActionCard/index.cjs +10 -0
  2. package/components/ActionCard/index.cjs.map +1 -0
  3. package/components/ActionCard/index.js +6 -0
  4. package/components/ActionCard/index.js.map +1 -0
  5. package/components/BarChart/index.cjs +10 -0
  6. package/components/BarChart/index.cjs.map +1 -0
  7. package/components/BarChart/index.js +6 -0
  8. package/components/BarChart/index.js.map +1 -0
  9. package/components/Delta/index.cjs +10 -0
  10. package/components/Delta/index.cjs.map +1 -0
  11. package/components/Delta/index.js +6 -0
  12. package/components/Delta/index.js.map +1 -0
  13. package/components/Donut/index.cjs +10 -0
  14. package/components/Donut/index.cjs.map +1 -0
  15. package/components/Donut/index.js +6 -0
  16. package/components/Donut/index.js.map +1 -0
  17. package/components/Gauge/index.cjs +10 -0
  18. package/components/Gauge/index.cjs.map +1 -0
  19. package/components/Gauge/index.js +6 -0
  20. package/components/Gauge/index.js.map +1 -0
  21. package/components/GroupedBars/index.cjs +10 -0
  22. package/components/GroupedBars/index.cjs.map +1 -0
  23. package/components/GroupedBars/index.js +6 -0
  24. package/components/GroupedBars/index.js.map +1 -0
  25. package/components/Legend/index.cjs +10 -0
  26. package/components/Legend/index.cjs.map +1 -0
  27. package/components/Legend/index.js +6 -0
  28. package/components/Legend/index.js.map +1 -0
  29. package/components/LineChart/index.cjs +10 -0
  30. package/components/LineChart/index.cjs.map +1 -0
  31. package/components/LineChart/index.js +6 -0
  32. package/components/LineChart/index.js.map +1 -0
  33. package/components/MapTile/index.cjs +10 -0
  34. package/components/MapTile/index.cjs.map +1 -0
  35. package/components/MapTile/index.js +6 -0
  36. package/components/MapTile/index.js.map +1 -0
  37. package/components/MetricCard/index.cjs +10 -0
  38. package/components/MetricCard/index.cjs.map +1 -0
  39. package/components/MetricCard/index.js +6 -0
  40. package/components/MetricCard/index.js.map +1 -0
  41. package/components/Radar/index.cjs +10 -0
  42. package/components/Radar/index.cjs.map +1 -0
  43. package/components/Radar/index.js +6 -0
  44. package/components/Radar/index.js.map +1 -0
  45. package/components/RankedList/index.cjs +10 -0
  46. package/components/RankedList/index.cjs.map +1 -0
  47. package/components/RankedList/index.js +6 -0
  48. package/components/RankedList/index.js.map +1 -0
  49. package/components/Rise/index.cjs +12 -0
  50. package/components/Rise/index.cjs.map +1 -0
  51. package/components/Rise/index.js +8 -0
  52. package/components/Rise/index.js.map +1 -0
  53. package/components/Sparkline/index.cjs +10 -0
  54. package/components/Sparkline/index.cjs.map +1 -0
  55. package/components/Sparkline/index.js +6 -0
  56. package/components/Sparkline/index.js.map +1 -0
  57. package/components/StackedBars/index.cjs +10 -0
  58. package/components/StackedBars/index.cjs.map +1 -0
  59. package/components/StackedBars/index.js +6 -0
  60. package/components/StackedBars/index.js.map +1 -0
  61. package/components/StatusCard/index.cjs +10 -0
  62. package/components/StatusCard/index.cjs.map +1 -0
  63. package/components/StatusCard/index.js +6 -0
  64. package/components/StatusCard/index.js.map +1 -0
  65. package/components/Tip/index.cjs +10 -0
  66. package/components/Tip/index.cjs.map +1 -0
  67. package/components/Tip/index.js +6 -0
  68. package/components/Tip/index.js.map +1 -0
  69. package/components/WidgetPanel/index.cjs +10 -0
  70. package/components/WidgetPanel/index.cjs.map +1 -0
  71. package/components/WidgetPanel/index.js +6 -0
  72. package/components/WidgetPanel/index.js.map +1 -0
  73. package/components/overlay/Toast/index.cjs +40 -6
  74. package/components/overlay/Toast/index.cjs.map +1 -1
  75. package/components/overlay/Toast/index.js +40 -6
  76. package/components/overlay/Toast/index.js.map +1 -1
  77. package/hooks/useCountUp.cjs +49 -0
  78. package/hooks/useCountUp.cjs.map +1 -0
  79. package/hooks/useCountUp.js +44 -0
  80. package/hooks/useCountUp.js.map +1 -0
  81. package/hooks/useEnter.cjs +25 -0
  82. package/hooks/useEnter.cjs.map +1 -0
  83. package/hooks/useEnter.js +20 -0
  84. package/hooks/useEnter.js.map +1 -0
  85. package/hooks/useMeasuredWidth.cjs +14 -0
  86. package/hooks/useMeasuredWidth.cjs.map +1 -0
  87. package/hooks/useMeasuredWidth.js +9 -0
  88. package/hooks/useMeasuredWidth.js.map +1 -0
  89. package/hooks/useReducedMotion/context.cjs +10 -0
  90. package/hooks/useReducedMotion/context.cjs.map +1 -0
  91. package/hooks/useReducedMotion/context.js +7 -0
  92. package/hooks/useReducedMotion/context.js.map +1 -0
  93. package/hooks/useReducedMotion/index.cjs +13 -0
  94. package/hooks/useReducedMotion/index.cjs.map +1 -0
  95. package/hooks/useReducedMotion/index.js +11 -0
  96. package/hooks/useReducedMotion/index.js.map +1 -0
  97. package/index.cjs +200 -140
  98. package/index.cjs.map +1 -1
  99. package/index.d.ts +624 -3
  100. package/index.js +30 -0
  101. package/index.js.map +1 -1
  102. package/motion/index.cjs +53 -0
  103. package/motion/index.cjs.map +1 -0
  104. package/motion/index.js +51 -0
  105. package/motion/index.js.map +1 -0
  106. package/package.json +1 -1
  107. package/primitives/AccentEdge/index.cjs +10 -0
  108. package/primitives/AccentEdge/index.cjs.map +1 -0
  109. package/primitives/AccentEdge/index.js +6 -0
  110. package/primitives/AccentEdge/index.js.map +1 -0
  111. package/primitives/DotGrid/index.cjs +10 -0
  112. package/primitives/DotGrid/index.cjs.map +1 -0
  113. package/primitives/DotGrid/index.js +6 -0
  114. package/primitives/DotGrid/index.js.map +1 -0
  115. package/primitives/Striped/index.cjs +10 -0
  116. package/primitives/Striped/index.cjs.map +1 -0
  117. package/primitives/Striped/index.js +6 -0
  118. package/primitives/Striped/index.js.map +1 -0
  119. package/primitives/Wash/index.cjs +10 -0
  120. package/primitives/Wash/index.cjs.map +1 -0
  121. package/primitives/Wash/index.js +6 -0
  122. package/primitives/Wash/index.js.map +1 -0
  123. package/utils/Color.cjs +8 -0
  124. package/utils/Color.cjs.map +1 -0
  125. package/utils/Color.js +6 -0
  126. package/utils/Color.js.map +1 -0
  127. package/utils/Number.cjs +8 -0
  128. package/utils/Number.cjs.map +1 -0
  129. package/utils/Number.js +6 -0
  130. package/utils/Number.js.map +1 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../../../src/components/overlay/Toast/index.native.tsx"],"sourcesContent":["import React, {\n type Ref,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from \"react\";\nimport {Platform, Pressable, StyleSheet, ActivityIndicator, View} from \"react-native\";\nimport Animated, {\n FadeInUp,\n FadeInDown,\n FadeOutUp,\n FadeOutDown,\n Layout,\n useAnimatedKeyboard,\n useAnimatedStyle,\n} from \"react-native-reanimated\";\nimport {useSafeAreaInsets} from \"react-native-safe-area-context\";\nimport {Text} from \"../../../_compat\";\nimport type {\n IKitsToastRef,\n IToastFunction,\n IToastParams,\n ToastPosition,\n ToastSeverity,\n ToastSize,\n} from \"@lmb-it/kitsconcerto-types\";\nimport {useKitsTheme} from \"../../../contexts/Theme\";\nimport {overlayAnimations as anim} from \"../../../animations\";\n\ninterface ToastItem {\n id: number;\n severity: ToastSeverity;\n summary: string;\n body?: string;\n position: ToastPosition;\n size: ToastSize;\n sticky?: boolean;\n onPress?: () => void;\n}\n\nlet toastIdCounter = 0;\nconst LIFE = 3000;\n\nconst SIZE_CONFIG: Record<ToastSize, { paddingV: number; paddingH: number; summarySize: number; bodySize: number; accentWidth: number; closeSize: number; minW: number }> = {\n sm: {paddingV: 8, paddingH: 10, summarySize: 12, bodySize: 10, accentWidth: 3, closeSize: 14, minW: 200},\n md: {paddingV: 12, paddingH: 14, summarySize: 14, bodySize: 12, accentWidth: 4, closeSize: 16, minW: 280},\n lg: {paddingV: 16, paddingH: 18, summarySize: 16, bodySize: 14, accentWidth: 5, closeSize: 18, minW: 320},\n};\n\nconst KitsToast = ({ref}: { ref?: Ref<IKitsToastRef> }) => {\n const [toasts, setToasts] = useState<ToastItem[]>([]);\n const timersRef = useRef<Map<number, ReturnType<typeof setTimeout>>>(new Map());\n const {resolveToken} = useKitsTheme();\n const insets = useSafeAreaInsets();\n\n // Keyboard avoidance for BOTTOM-positioned toasts, driven on the UI thread so\n // the lift tracks the keyboard's own curve instead of snapping on a JS event.\n const keyboard = useAnimatedKeyboard();\n const keyboardOffsetStyle = useAnimatedStyle(() => {\n // Android ships `windowSoftInputMode=\"adjustResize\"`: the window (and with\n // it this absoluteFill host) is already resized to sit above the keyboard,\n // so the toast clears it for free. Adding the keyboard height here would\n // double-compensate and launch the toast into the middle of the screen.\n if (Platform.OS === \"android\") return {transform: [{translateY: 0}]};\n const h = keyboard.height.value;\n return {transform: [{translateY: h > 0 ? -(h + anim.toast.keyboardGap) : 0}]};\n });\n\n const severityColors: Record<string, string> = {\n success: resolveToken('green.500'),\n info: resolveToken('blue.500'),\n warn: resolveToken('yellow.500'),\n error: resolveToken('red.500'),\n loading: resolveToken('blue.500'),\n brand: resolveToken('primary'),\n };\n\n const surfaceColor = resolveToken('surface-card');\n const textColor = resolveToken('text');\n const borderColor = resolveToken('border');\n\n const removeToast = useCallback((id: number) => {\n const timer = timersRef.current.get(id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(id);\n }\n setToasts(prev => prev.filter(t => t.id !== id));\n }, []);\n\n const toast: IToastFunction = useCallback((\n severity: ToastSeverity,\n summary: string,\n body: string = \"\",\n position: ToastPosition = \"bottom-center\",\n isUpdate: boolean = false,\n size: ToastSize = \"md\",\n onPress?: () => void,\n ) => {\n const id = ++toastIdCounter;\n const item: ToastItem = {id, severity, summary, body, position, size, sticky: severity === \"loading\", onPress};\n\n // isUpdate mirrors web's toastRef.replace: swap the most recent toast\n // at this position instead of stacking a new one.\n setToasts(prev => {\n if (!isUpdate) return [...prev, item];\n const lastAtPos = [...prev].reverse().find(t => t.position === position);\n if (!lastAtPos) return [...prev, item];\n const timer = timersRef.current.get(lastAtPos.id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(lastAtPos.id);\n }\n return prev.map(t => (t.id === lastAtPos.id ? item : t));\n });\n\n if (!item.sticky) {\n const timer = setTimeout(() => removeToast(id), LIFE);\n timersRef.current.set(id, timer);\n }\n }, [removeToast]) as IToastFunction;\n\n const dismiss = useCallback((position?: ToastPosition) => {\n setToasts(prev => {\n const toRemove = position ? prev.filter(t => t.position === position) : prev;\n toRemove.forEach(t => {\n const timer = timersRef.current.get(t.id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(t.id);\n }\n });\n return position ? prev.filter(t => t.position !== position) : [];\n });\n }, []);\n\n const dismissAll = useCallback(() => {\n timersRef.current.forEach(t => clearTimeout(t));\n timersRef.current.clear();\n setToasts([]);\n }, []);\n\n useImperativeHandle(ref, () => ({toast, dismiss, dismissAll}));\n\n useEffect(() => {\n return () => {\n timersRef.current.forEach(t => clearTimeout(t));\n };\n }, []);\n\n if (toasts.length === 0) return null;\n\n const getAlignment = (position: ToastPosition): 'flex-start' | 'center' | 'flex-end' => {\n if (position.endsWith('-left')) return 'flex-start';\n if (position.endsWith('-right')) return 'flex-end';\n return 'center';\n };\n\n const isTop = (position: ToastPosition) => position.startsWith('top');\n\n return (\n <View style={StyleSheet.absoluteFill} pointerEvents=\"box-none\">\n {toasts.map(item => {\n const top = isTop(item.position);\n const align = getAlignment(item.position);\n // One builder owns the whole entrance: FadeInUp/FadeInDown animate\n // opacity AND translateY together, direction matched to placement\n // (top toasts drop in from above, bottom toasts rise from below).\n const entering = (top ? FadeInUp : FadeInDown)\n .springify()\n .damping(anim.toast.enter.damping)\n .stiffness(anim.toast.enter.stiffness)\n .mass(anim.toast.enter.mass ?? 1);\n const exiting = (top ? FadeOutUp : FadeOutDown).duration(anim.toast.exitDuration);\n const s = SIZE_CONFIG[item.size] ?? SIZE_CONFIG.md;\n const accentColor = severityColors[item.severity] ?? severityColors.info;\n\n return (\n <Animated.View\n key={item.id}\n style={[\n styles.toastWrapper,\n {\n alignItems: align,\n ...(top\n ? {top: insets.top + 8}\n : {bottom: insets.bottom + 8}),\n },\n // Bottom toasts lift with the keyboard; top toasts never move.\n top ? null : keyboardOffsetStyle,\n ]}\n pointerEvents=\"box-none\"\n >\n <Animated.View\n entering={entering}\n exiting={exiting}\n layout={Layout.duration(anim.toast.layoutDuration)}\n style={[\n styles.toast,\n {\n backgroundColor: surfaceColor,\n borderColor,\n minWidth: s.minW,\n },\n ]}\n >\n <Pressable\n style={styles.pressArea}\n disabled={!item.onPress}\n onPress={() => {\n item.onPress?.();\n removeToast(item.id);\n }}\n >\n <View style={[styles.accentBar, {backgroundColor: accentColor, width: s.accentWidth}]}/>\n <View style={[styles.content, {paddingVertical: s.paddingV, paddingHorizontal: s.paddingH, gap: s.paddingH * 0.7}]}>\n {item.severity === \"loading\" && (\n <ActivityIndicator size=\"small\" color={accentColor}/>\n )}\n <View style={styles.textContainer}>\n <Text style={{fontWeight: \"600\", fontSize: s.summarySize, color: textColor}}>\n {item.summary}\n </Text>\n {!!item.body && (\n <Text style={{fontSize: s.bodySize, marginTop: 2, color: textColor, opacity: 0.7}}>\n {item.body}\n </Text>\n )}\n </View>\n <Pressable onPress={() => removeToast(item.id)} hitSlop={8}>\n <Text style={{fontSize: s.closeSize, fontWeight: \"bold\", color: textColor, opacity: 0.4}}>\n ✕\n </Text>\n </Pressable>\n </View>\n </Pressable>\n </Animated.View>\n </Animated.View>\n );\n })}\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n toastWrapper: {\n position: \"absolute\",\n left: 16,\n right: 16,\n zIndex: 9999,\n },\n toast: {\n flexDirection: \"row\",\n // Fill the wrapper (already inset 16pt each side) but never exceed 560pt;\n // the wrapper's alignItems keeps -left/-center/-right placement intact.\n width: \"100%\",\n maxWidth: 560,\n borderRadius: 10,\n borderWidth: 1,\n marginBottom: 8,\n overflow: \"hidden\",\n elevation: 6,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: 3},\n shadowOpacity: 0.15,\n shadowRadius: 6,\n },\n accentBar: {},\n pressArea: {\n flex: 1,\n flexDirection: \"row\",\n },\n content: {\n flex: 1,\n flexDirection: \"row\",\n alignItems: \"center\",\n },\n textContainer: {\n flex: 1,\n },\n});\n\nexport default KitsToast;\n"],"names":["useState","useRef","useKitsTheme","useSafeAreaInsets","useAnimatedKeyboard","useAnimatedStyle","Platform","anim","useCallback","useImperativeHandle","useEffect","jsx","View","StyleSheet","FadeInUp","FadeInDown","FadeOutUp","FadeOutDown","Layout","jsxs","Pressable","ActivityIndicator","Text"],"mappings":";;;;;;;;;;;;;AA0CA,IAAI,cAAA,GAAiB,CAAA;AACrB,MAAM,IAAA,GAAO,GAAA;AAEb,MAAM,WAAA,GAAsK;AAAA,EACxK,EAAA,EAAI,EAAC,QAAA,EAAU,CAAA,EAAG,UAAU,EAAA,EAAI,WAAA,EAAa,EAAA,EAAI,QAAA,EAAU,IAAI,WAAA,EAAa,CAAA,EAAG,SAAA,EAAW,EAAA,EAAI,MAAM,GAAA,EAAG;AAAA,EACvG,EAAA,EAAI,EAAC,QAAA,EAAU,EAAA,EAAI,UAAU,EAAA,EAAI,WAAA,EAAa,EAAA,EAAI,QAAA,EAAU,IAAI,WAAA,EAAa,CAAA,EAAG,SAAA,EAAW,EAAA,EAAI,MAAM,GAAA,EAAG;AAAA,EACxG,EAAA,EAAI,EAAC,QAAA,EAAU,EAAA,EAAI,UAAU,EAAA,EAAI,WAAA,EAAa,EAAA,EAAI,QAAA,EAAU,IAAI,WAAA,EAAa,CAAA,EAAG,SAAA,EAAW,EAAA,EAAI,MAAM,GAAA;AACzG,CAAA;AAEA,MAAM,SAAA,GAAY,CAAC,EAAC,GAAA,EAAG,KAAoC;AACvD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,cAAA,CAAsB,EAAE,CAAA;AACpD,EAAA,MAAM,SAAA,GAAYC,YAAA,iBAAmD,IAAI,GAAA,EAAK,CAAA;AAC9E,EAAA,MAAM,EAAC,YAAA,EAAY,GAAIC,qCAAA,EAAa;AACpC,EAAA,MAAM,SAASC,4CAAA,EAAkB;AAIjC,EAAA,MAAM,WAAWC,4BAAA,EAAoB;AACrC,EAAA,MAAM,mBAAA,GAAsBC,0BAAiB,MAAM;AAK/C,IAAA,IAAIC,oBAAA,CAAS,EAAA,KAAO,SAAA,EAAW,OAAO,EAAC,SAAA,EAAW,CAAC,EAAC,UAAA,EAAY,CAAA,EAAE,CAAA,EAAC;AACnE,IAAA,MAAM,CAAA,GAAI,SAAS,MAAA,CAAO,KAAA;AAC1B,IAAA,OAAO,EAAC,SAAA,EAAW,CAAC,EAAC,YAAY,CAAA,GAAI,CAAA,GAAI,EAAE,CAAA,GAAIC,uBAAA,CAAK,KAAA,CAAM,WAAA,CAAA,GAAe,CAAA,EAAE,CAAA,EAAC;AAAA,EAChF,CAAC,CAAA;AAED,EAAA,MAAM,cAAA,GAAyC;AAAA,IAC3C,OAAA,EAAS,aAAa,WAAW,CAAA;AAAA,IACjC,IAAA,EAAM,aAAa,UAAU,CAAA;AAAA,IAC7B,IAAA,EAAM,aAAa,YAAY,CAAA;AAAA,IAC/B,KAAA,EAAO,aAAa,SAAS,CAAA;AAAA,IAC7B,OAAA,EAAS,aAAa,UAAU,CAAA;AAAA,IAChC,KAAA,EAAO,aAAa,SAAS;AAAA,GACjC;AAEA,EAAA,MAAM,YAAA,GAAe,aAAa,cAAc,CAAA;AAChD,EAAA,MAAM,SAAA,GAAY,aAAa,MAAM,CAAA;AACrC,EAAA,MAAM,WAAA,GAAc,aAAa,QAAQ,CAAA;AAEzC,EAAA,MAAM,WAAA,GAAcC,iBAAA,CAAY,CAAC,EAAA,KAAe;AAC5C,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AACtC,IAAA,IAAI,KAAA,EAAO;AACP,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,SAAA,CAAU,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA,IAC/B;AACA,IAAA,SAAA,CAAU,UAAQ,IAAA,CAAK,MAAA,CAAO,OAAK,CAAA,CAAE,EAAA,KAAO,EAAE,CAAC,CAAA;AAAA,EACnD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,KAAA,GAAwBA,iBAAA,CAAY,CACtC,QAAA,EACA,OAAA,EACA,IAAA,GAAe,EAAA,EACf,QAAA,GAA0B,eAAA,EAC1B,QAAA,GAAoB,KAAA,EACpB,IAAA,GAAkB,MAClB,OAAA,KACC;AACD,IAAA,MAAM,KAAK,EAAE,cAAA;AACb,IAAA,MAAM,IAAA,GAAkB,EAAC,EAAA,EAAI,QAAA,EAAU,OAAA,EAAS,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,MAAA,EAAQ,QAAA,KAAa,SAAA,EAAW,OAAA,EAAO;AAI7G,IAAA,SAAA,CAAU,CAAA,IAAA,KAAQ;AACd,MAAA,IAAI,CAAC,QAAA,EAAU,OAAO,CAAC,GAAG,MAAM,IAAI,CAAA;AACpC,MAAA,MAAM,SAAA,GAAY,CAAC,GAAG,IAAI,CAAA,CAAE,OAAA,EAAQ,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,QAAA,KAAa,QAAQ,CAAA;AACvE,MAAA,IAAI,CAAC,SAAA,EAAW,OAAO,CAAC,GAAG,MAAM,IAAI,CAAA;AACrC,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,OAAA,CAAQ,GAAA,CAAI,UAAU,EAAE,CAAA;AAChD,MAAA,IAAI,KAAA,EAAO;AACP,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,SAAA,CAAU,OAAA,CAAQ,MAAA,CAAO,SAAA,CAAU,EAAE,CAAA;AAAA,MACzC;AACA,MAAA,OAAO,IAAA,CAAK,IAAI,CAAA,CAAA,KAAM,CAAA,CAAE,OAAO,SAAA,CAAU,EAAA,GAAK,OAAO,CAAE,CAAA;AAAA,IAC3D,CAAC,CAAA;AAED,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AACd,MAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,WAAA,CAAY,EAAE,GAAG,IAAI,CAAA;AACpD,MAAA,SAAA,CAAU,OAAA,CAAQ,GAAA,CAAI,EAAA,EAAI,KAAK,CAAA;AAAA,IACnC;AAAA,EACJ,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,MAAM,OAAA,GAAUA,iBAAA,CAAY,CAAC,QAAA,KAA6B;AACtD,IAAA,SAAA,CAAU,CAAA,IAAA,KAAQ;AACd,MAAA,MAAM,QAAA,GAAW,WAAW,IAAA,CAAK,MAAA,CAAO,OAAK,CAAA,CAAE,QAAA,KAAa,QAAQ,CAAA,GAAI,IAAA;AACxE,MAAA,QAAA,CAAS,QAAQ,CAAA,CAAA,KAAK;AAClB,QAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,OAAA,CAAQ,GAAA,CAAI,EAAE,EAAE,CAAA;AACxC,QAAA,IAAI,KAAA,EAAO;AACP,UAAA,YAAA,CAAa,KAAK,CAAA;AAClB,UAAA,SAAA,CAAU,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA;AAAA,QACjC;AAAA,MACJ,CAAC,CAAA;AACD,MAAA,OAAO,QAAA,GAAW,KAAK,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,QAAA,KAAa,QAAQ,IAAI,EAAC;AAAA,IACnE,CAAC,CAAA;AAAA,EACL,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,UAAA,GAAaA,kBAAY,MAAM;AACjC,IAAA,SAAA,CAAU,OAAA,CAAQ,OAAA,CAAQ,CAAA,CAAA,KAAK,YAAA,CAAa,CAAC,CAAC,CAAA;AAC9C,IAAA,SAAA,CAAU,QAAQ,KAAA,EAAM;AACxB,IAAA,SAAA,CAAU,EAAE,CAAA;AAAA,EAChB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAAC,yBAAA,CAAoB,KAAK,OAAO,EAAC,KAAA,EAAO,OAAA,EAAS,YAAU,CAAE,CAAA;AAE7D,EAAAC,eAAA,CAAU,MAAM;AACZ,IAAA,OAAO,MAAM;AACT,MAAA,SAAA,CAAU,OAAA,CAAQ,OAAA,CAAQ,CAAA,CAAA,KAAK,YAAA,CAAa,CAAC,CAAC,CAAA;AAAA,IAClD,CAAA;AAAA,EACJ,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEhC,EAAA,MAAM,YAAA,GAAe,CAAC,QAAA,KAAkE;AACpF,IAAA,IAAI,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA,EAAG,OAAO,YAAA;AACvC,IAAA,IAAI,QAAA,CAAS,QAAA,CAAS,QAAQ,CAAA,EAAG,OAAO,UAAA;AACxC,IAAA,OAAO,QAAA;AAAA,EACX,CAAA;AAEA,EAAA,MAAM,KAAA,GAAQ,CAAC,QAAA,KAA4B,QAAA,CAAS,WAAW,KAAK,CAAA;AAEpE,EAAA,uBACIC,cAAA,CAACC,oBAAK,KAAA,EAAOC,sBAAA,CAAW,cAAc,aAAA,EAAc,UAAA,EAC/C,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAA,IAAA,KAAQ;AAChB,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA;AAC/B,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAA;AAIxC,IAAA,MAAM,QAAA,GAAA,CAAY,MAAMC,iBAAA,GAAWC,mBAAA,EAC9B,WAAU,CACV,OAAA,CAAQR,uBAAA,CAAK,KAAA,CAAM,KAAA,CAAM,OAAO,EAChC,SAAA,CAAUA,uBAAA,CAAK,KAAA,CAAM,KAAA,CAAM,SAAS,CAAA,CACpC,KAAKA,uBAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAS,CAAA;AACpC,IAAA,MAAM,WAAW,GAAA,GAAMS,kBAAA,GAAYC,sBAAa,QAAA,CAASV,uBAAA,CAAK,MAAM,YAAY,CAAA;AAChF,IAAA,MAAM,CAAA,GAAI,WAAA,CAAY,IAAA,CAAK,IAAI,KAAK,WAAA,CAAY,EAAA;AAChD,IAAA,MAAM,WAAA,GAAc,cAAA,CAAe,IAAA,CAAK,QAAQ,KAAK,cAAA,CAAe,IAAA;AAEpE,IAAA,uBACII,cAAA;AAAA,MAAC,QAAA,CAAS,IAAA;AAAA,MAAT;AAAA,QAEG,KAAA,EAAO;AAAA,UACH,MAAA,CAAO,YAAA;AAAA,UACP;AAAA,YACI,UAAA,EAAY,KAAA;AAAA,YACZ,GAAI,GAAA,GACE,EAAC,GAAA,EAAK,MAAA,CAAO,GAAA,GAAM,CAAA,EAAC,GACpB,EAAC,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,CAAA;AAAC,WACpC;AAAA;AAAA,UAEA,MAAM,IAAA,GAAO;AAAA,SACjB;AAAA,QACA,aAAA,EAAc,UAAA;AAAA,QAEd,QAAA,kBAAAA,cAAA;AAAA,UAAC,QAAA,CAAS,IAAA;AAAA,UAAT;AAAA,YACG,QAAA;AAAA,YACA,OAAA;AAAA,YACA,MAAA,EAAQO,eAAA,CAAO,QAAA,CAASX,uBAAA,CAAK,MAAM,cAAc,CAAA;AAAA,YACjD,KAAA,EAAO;AAAA,cACH,MAAA,CAAO,KAAA;AAAA,cACP;AAAA,gBACI,eAAA,EAAiB,YAAA;AAAA,gBACjB,WAAA;AAAA,gBACA,UAAU,CAAA,CAAE;AAAA;AAChB,aACJ;AAAA,YAEA,QAAA,kBAAAY,eAAA;AAAA,cAACC,qBAAA;AAAA,cAAA;AAAA,gBACG,OAAO,MAAA,CAAO,SAAA;AAAA,gBACd,QAAA,EAAU,CAAC,IAAA,CAAK,OAAA;AAAA,gBAChB,SAAS,MAAM;AACX,kBAAA,IAAA,CAAK,OAAA,IAAU;AACf,kBAAA,WAAA,CAAY,KAAK,EAAE,CAAA;AAAA,gBACvB,CAAA;AAAA,gBAEA,QAAA,EAAA;AAAA,kCAAAT,cAAA,CAACC,gBAAA,EAAA,EAAK,KAAA,EAAO,CAAC,MAAA,CAAO,SAAA,EAAW,EAAC,eAAA,EAAiB,WAAA,EAAa,KAAA,EAAO,CAAA,CAAE,WAAA,EAAY,CAAA,EAAE,CAAA;AAAA,kDACrFA,gBAAA,EAAA,EAAK,KAAA,EAAO,CAAC,MAAA,CAAO,OAAA,EAAS,EAAC,eAAA,EAAiB,CAAA,CAAE,QAAA,EAAU,iBAAA,EAAmB,EAAE,QAAA,EAAU,GAAA,EAAK,EAAE,QAAA,GAAW,GAAA,EAAI,CAAA,EAC5G,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAK,aAAa,SAAA,oBACfD,cAAA,CAACU,iCAAkB,IAAA,EAAK,OAAA,EAAQ,OAAO,WAAA,EAAY,CAAA;AAAA,oCAEvDF,eAAA,CAACP,gBAAA,EAAA,EAAK,KAAA,EAAO,MAAA,CAAO,aAAA,EAChB,QAAA,EAAA;AAAA,sCAAAD,cAAA,CAACW,oBAAA,EAAA,EAAK,KAAA,EAAO,EAAC,UAAA,EAAY,KAAA,EAAO,QAAA,EAAU,CAAA,CAAE,WAAA,EAAa,KAAA,EAAO,SAAA,EAAS,EACrE,QAAA,EAAA,IAAA,CAAK,OAAA,EACV,CAAA;AAAA,sBACC,CAAC,CAAC,IAAA,CAAK,wBACJX,cAAA,CAACW,oBAAA,EAAA,EAAK,OAAO,EAAC,QAAA,EAAU,EAAE,QAAA,EAAU,SAAA,EAAW,GAAG,KAAA,EAAO,SAAA,EAAW,SAAS,GAAA,EAAG,EAC3E,eAAK,IAAA,EACV;AAAA,qBAAA,EAER,CAAA;AAAA,oCACAX,cAAA,CAACS,qBAAA,EAAA,EAAU,OAAA,EAAS,MAAM,WAAA,CAAY,KAAK,EAAE,CAAA,EAAG,OAAA,EAAS,CAAA,EACrD,QAAA,kBAAAT,cAAA,CAACW,oBAAA,EAAA,EAAK,OAAO,EAAC,QAAA,EAAU,CAAA,CAAE,SAAA,EAAW,UAAA,EAAY,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,GAAA,EAAG,EAAG,QAAA,EAAA,QAAA,EAE1F,CAAA,EACJ;AAAA,mBAAA,EACJ;AAAA;AAAA;AAAA;AACJ;AAAA;AACJ,OAAA;AAAA,MAzDK,IAAA,CAAK;AAAA,KA0Dd;AAAA,EAER,CAAC,CAAA,EACL,CAAA;AAER;AAEA,MAAM,MAAA,GAAST,uBAAW,MAAA,CAAO;AAAA,EAC7B,YAAA,EAAc;AAAA,IACV,QAAA,EAAU,UAAA;AAAA,IACV,IAAA,EAAM,EAAA;AAAA,IACN,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACZ;AAAA,EACA,KAAA,EAAO;AAAA,IACH,aAAA,EAAe,KAAA;AAAA;AAAA;AAAA,IAGf,KAAA,EAAO,MAAA;AAAA,IACP,QAAA,EAAU,GAAA;AAAA,IACV,YAAA,EAAc,EAAA;AAAA,IACd,WAAA,EAAa,CAAA;AAAA,IACb,YAAA,EAAc,CAAA;AAAA,IACd,QAAA,EAAU,QAAA;AAAA,IACV,SAAA,EAAW,CAAA;AAAA,IACX,WAAA,EAAa,MAAA;AAAA,IACb,YAAA,EAAc,EAAC,KAAA,EAAO,CAAA,EAAG,QAAQ,CAAA,EAAC;AAAA,IAClC,aAAA,EAAe,IAAA;AAAA,IACf,YAAA,EAAc;AAAA,GAClB;AAAA,EACA,WAAW,EAAC;AAAA,EACZ,SAAA,EAAW;AAAA,IACP,IAAA,EAAM,CAAA;AAAA,IACN,aAAA,EAAe;AAAA,GACnB;AAAA,EACA,OAAA,EAAS;AAAA,IACL,IAAA,EAAM,CAAA;AAAA,IACN,aAAA,EAAe,KAAA;AAAA,IACf,UAAA,EAAY;AAAA,GAChB;AAAA,EACA,aAAA,EAAe;AAAA,IACX,IAAA,EAAM;AAAA;AAEd,CAAC,CAAA;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../../../src/components/overlay/Toast/index.native.tsx"],"sourcesContent":["import React, {\n type Ref,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from \"react\";\nimport {Platform, Pressable, StyleSheet, ActivityIndicator, View} from \"react-native\";\nimport Animated, {\n FadeInUp,\n FadeInDown,\n FadeOutUp,\n FadeOutDown,\n Layout,\n useAnimatedKeyboard,\n useAnimatedStyle,\n} from \"react-native-reanimated\";\nimport {useSafeAreaInsets} from \"react-native-safe-area-context\";\nimport {Text} from \"../../../_compat\";\nimport type {\n IKitsToastRef,\n IToastAction,\n IToastFunction,\n IToastOptions,\n IToastParams,\n ToastPosition,\n ToastSeverity,\n ToastSize,\n} from \"@lmb-it/kitsconcerto-types\";\nimport {useKitsTheme} from \"../../../contexts/Theme\";\nimport {overlayAnimations as anim} from \"../../../animations\";\n\ninterface ToastItem {\n id: number;\n severity: ToastSeverity;\n summary: string;\n body?: string;\n position: ToastPosition;\n size: ToastSize;\n sticky?: boolean;\n onPress?: () => void;\n action?: IToastAction;\n offset?: number;\n}\n\nlet toastIdCounter = 0;\nconst LIFE = 3000;\n\nconst SIZE_CONFIG: Record<ToastSize, { paddingV: number; paddingH: number; summarySize: number; bodySize: number; accentWidth: number; closeSize: number; actionSize: number; minW: number }> = {\n sm: {paddingV: 8, paddingH: 10, summarySize: 12, bodySize: 10, accentWidth: 3, closeSize: 14, actionSize: 12, minW: 200},\n md: {paddingV: 12, paddingH: 14, summarySize: 14, bodySize: 12, accentWidth: 4, closeSize: 16, actionSize: 13, minW: 280},\n lg: {paddingV: 16, paddingH: 18, summarySize: 16, bodySize: 14, accentWidth: 5, closeSize: 18, actionSize: 15, minW: 320},\n};\n\nconst KitsToast = ({ref}: { ref?: Ref<IKitsToastRef> }) => {\n const [toasts, setToasts] = useState<ToastItem[]>([]);\n const timersRef = useRef<Map<number, ReturnType<typeof setTimeout>>>(new Map());\n const {resolveToken} = useKitsTheme();\n const insets = useSafeAreaInsets();\n\n // Keyboard avoidance for BOTTOM-positioned toasts, driven on the UI thread so\n // the lift tracks the keyboard's own curve instead of snapping on a JS event.\n const keyboard = useAnimatedKeyboard();\n const keyboardOffsetStyle = useAnimatedStyle(() => {\n // Android ships `windowSoftInputMode=\"adjustResize\"`: the window (and with\n // it this absoluteFill host) is already resized to sit above the keyboard,\n // so the toast clears it for free. Adding the keyboard height here would\n // double-compensate and launch the toast into the middle of the screen.\n if (Platform.OS === \"android\") return {transform: [{translateY: 0}]};\n const h = keyboard.height.value;\n return {transform: [{translateY: h > 0 ? -(h + anim.toast.keyboardGap) : 0}]};\n });\n\n const severityColors: Record<string, string> = {\n success: resolveToken('green.500'),\n info: resolveToken('blue.500'),\n warn: resolveToken('yellow.500'),\n error: resolveToken('red.500'),\n loading: resolveToken('blue.500'),\n brand: resolveToken('primary'),\n };\n\n const surfaceColor = resolveToken('surface-card');\n const textColor = resolveToken('text');\n const borderColor = resolveToken('border');\n\n const removeToast = useCallback((id: number) => {\n const timer = timersRef.current.get(id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(id);\n }\n setToasts(prev => prev.filter(t => t.id !== id));\n }, []);\n\n const toast: IToastFunction = useCallback((\n severity: ToastSeverity,\n summary: string,\n body: string = \"\",\n position: ToastPosition = \"bottom-center\",\n isUpdate: boolean = false,\n size: ToastSize = \"md\",\n onPress?: () => void,\n options?: IToastOptions,\n ) => {\n const id = ++toastIdCounter;\n const item: ToastItem = {\n id, severity, summary, body, position, size,\n sticky: severity === \"loading\",\n onPress,\n action: options?.action,\n offset: options?.offset,\n };\n\n // isUpdate mirrors web's toastRef.replace: swap the most recent toast\n // at this position instead of stacking a new one.\n setToasts(prev => {\n if (!isUpdate) return [...prev, item];\n const lastAtPos = [...prev].reverse().find(t => t.position === position);\n if (!lastAtPos) return [...prev, item];\n const timer = timersRef.current.get(lastAtPos.id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(lastAtPos.id);\n }\n return prev.map(t => (t.id === lastAtPos.id ? item : t));\n });\n\n if (!item.sticky) {\n const timer = setTimeout(() => removeToast(id), LIFE);\n timersRef.current.set(id, timer);\n }\n }, [removeToast]) as IToastFunction;\n\n const dismiss = useCallback((position?: ToastPosition) => {\n setToasts(prev => {\n const toRemove = position ? prev.filter(t => t.position === position) : prev;\n toRemove.forEach(t => {\n const timer = timersRef.current.get(t.id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(t.id);\n }\n });\n return position ? prev.filter(t => t.position !== position) : [];\n });\n }, []);\n\n const dismissAll = useCallback(() => {\n timersRef.current.forEach(t => clearTimeout(t));\n timersRef.current.clear();\n setToasts([]);\n }, []);\n\n useImperativeHandle(ref, () => ({toast, dismiss, dismissAll}));\n\n useEffect(() => {\n return () => {\n timersRef.current.forEach(t => clearTimeout(t));\n };\n }, []);\n\n if (toasts.length === 0) return null;\n\n const getAlignment = (position: ToastPosition): 'flex-start' | 'center' | 'flex-end' => {\n if (position.endsWith('-left')) return 'flex-start';\n if (position.endsWith('-right')) return 'flex-end';\n return 'center';\n };\n\n const isTop = (position: ToastPosition) => position.startsWith('top');\n\n return (\n <View style={StyleSheet.absoluteFill} pointerEvents=\"box-none\">\n {toasts.map(item => {\n const top = isTop(item.position);\n const align = getAlignment(item.position);\n // One builder owns the whole entrance: FadeInUp/FadeInDown animate\n // opacity AND translateY together, direction matched to placement\n // (top toasts drop in from above, bottom toasts rise from below).\n const entering = (top ? FadeInUp : FadeInDown)\n .springify()\n .damping(anim.toast.enter.damping)\n .stiffness(anim.toast.enter.stiffness)\n .mass(anim.toast.enter.mass ?? 1);\n const exiting = (top ? FadeOutUp : FadeOutDown).duration(anim.toast.exitDuration);\n const s = SIZE_CONFIG[item.size] ?? SIZE_CONFIG.md;\n const accentColor = severityColors[item.severity] ?? severityColors.info;\n\n return (\n <Animated.View\n key={item.id}\n style={[\n styles.toastWrapper,\n {\n alignItems: align,\n // `offset` is consumer chrome KitsConcerto cannot see\n // (a bottom tab bar, a sticky header). It stacks ON TOP\n // of the safe-area inset; absent, the gap is unchanged.\n ...(top\n ? {top: insets.top + 8 + (item.offset ?? 0)}\n : {bottom: insets.bottom + 8 + (item.offset ?? 0)}),\n },\n // Bottom toasts lift with the keyboard; top toasts never move.\n top ? null : keyboardOffsetStyle,\n ]}\n pointerEvents=\"box-none\"\n >\n <Animated.View\n entering={entering}\n exiting={exiting}\n layout={Layout.duration(anim.toast.layoutDuration)}\n style={[\n styles.toast,\n {\n backgroundColor: surfaceColor,\n borderColor,\n minWidth: s.minW,\n },\n ]}\n >\n <Pressable\n style={styles.pressArea}\n disabled={!item.onPress}\n onPress={() => {\n item.onPress?.();\n removeToast(item.id);\n }}\n >\n <View style={[styles.accentBar, {backgroundColor: accentColor, width: s.accentWidth}]}/>\n <View style={[styles.content, {paddingVertical: s.paddingV, paddingHorizontal: s.paddingH, gap: s.paddingH * 0.7}]}>\n {item.severity === \"loading\" && (\n <ActivityIndicator size=\"small\" color={accentColor}/>\n )}\n <View style={styles.textContainer}>\n <Text style={{fontWeight: \"600\", fontSize: s.summarySize, color: textColor}}>\n {item.summary}\n </Text>\n {!!item.body && (\n <Text style={{fontSize: s.bodySize, marginTop: 2, color: textColor, opacity: 0.7}}>\n {item.body}\n </Text>\n )}\n </View>\n {!!item.action && (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={item.action.label}\n hitSlop={8}\n // Nested Pressable: RN hands the touch to the\n // deepest responder, so the surrounding body\n // press never double-fires (same mechanism the\n // close control has always relied on).\n onPress={() => {\n item.action?.onPress();\n removeToast(item.id);\n }}\n style={[styles.action, {borderColor: accentColor}]}\n >\n <Text style={{fontSize: s.actionSize, fontWeight: \"600\", color: accentColor}}>\n {item.action.label}\n </Text>\n </Pressable>\n )}\n <Pressable onPress={() => removeToast(item.id)} hitSlop={8}>\n <Text style={{fontSize: s.closeSize, fontWeight: \"bold\", color: textColor, opacity: 0.4}}>\n ✕\n </Text>\n </Pressable>\n </View>\n </Pressable>\n </Animated.View>\n </Animated.View>\n );\n })}\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n toastWrapper: {\n position: \"absolute\",\n left: 16,\n right: 16,\n zIndex: 9999,\n },\n toast: {\n flexDirection: \"row\",\n // Fill the wrapper (already inset 16pt each side) but never exceed 560pt;\n // the wrapper's alignItems keeps -left/-center/-right placement intact.\n width: \"100%\",\n maxWidth: 560,\n borderRadius: 10,\n borderWidth: 1,\n marginBottom: 8,\n overflow: \"hidden\",\n elevation: 6,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: 3},\n shadowOpacity: 0.15,\n shadowRadius: 6,\n },\n accentBar: {},\n action: {\n borderWidth: 1,\n borderRadius: 6,\n paddingHorizontal: 10,\n paddingVertical: 4,\n },\n pressArea: {\n flex: 1,\n flexDirection: \"row\",\n },\n content: {\n flex: 1,\n flexDirection: \"row\",\n alignItems: \"center\",\n },\n textContainer: {\n flex: 1,\n },\n});\n\nexport default KitsToast;\n"],"names":["useState","useRef","useKitsTheme","useSafeAreaInsets","useAnimatedKeyboard","useAnimatedStyle","Platform","anim","useCallback","useImperativeHandle","useEffect","jsx","View","StyleSheet","FadeInUp","FadeInDown","FadeOutUp","FadeOutDown","Layout","jsxs","Pressable","ActivityIndicator","Text"],"mappings":";;;;;;;;;;;;;AA8CA,IAAI,cAAA,GAAiB,CAAA;AACrB,MAAM,IAAA,GAAO,GAAA;AAEb,MAAM,WAAA,GAA0L;AAAA,EAC5L,IAAI,EAAC,QAAA,EAAU,CAAA,EAAG,QAAA,EAAU,IAAI,WAAA,EAAa,EAAA,EAAI,QAAA,EAAU,EAAA,EAAI,aAAa,CAAA,EAAG,SAAA,EAAW,IAAI,UAAA,EAAY,EAAA,EAAI,MAAM,GAAA,EAAG;AAAA,EACvH,IAAI,EAAC,QAAA,EAAU,EAAA,EAAI,QAAA,EAAU,IAAI,WAAA,EAAa,EAAA,EAAI,QAAA,EAAU,EAAA,EAAI,aAAa,CAAA,EAAG,SAAA,EAAW,IAAI,UAAA,EAAY,EAAA,EAAI,MAAM,GAAA,EAAG;AAAA,EACxH,IAAI,EAAC,QAAA,EAAU,EAAA,EAAI,QAAA,EAAU,IAAI,WAAA,EAAa,EAAA,EAAI,QAAA,EAAU,EAAA,EAAI,aAAa,CAAA,EAAG,SAAA,EAAW,IAAI,UAAA,EAAY,EAAA,EAAI,MAAM,GAAA;AACzH,CAAA;AAEA,MAAM,SAAA,GAAY,CAAC,EAAC,GAAA,EAAG,KAAoC;AACvD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,cAAA,CAAsB,EAAE,CAAA;AACpD,EAAA,MAAM,SAAA,GAAYC,YAAA,iBAAmD,IAAI,GAAA,EAAK,CAAA;AAC9E,EAAA,MAAM,EAAC,YAAA,EAAY,GAAIC,qCAAA,EAAa;AACpC,EAAA,MAAM,SAASC,4CAAA,EAAkB;AAIjC,EAAA,MAAM,WAAWC,4BAAA,EAAoB;AACrC,EAAA,MAAM,mBAAA,GAAsBC,0BAAiB,MAAM;AAK/C,IAAA,IAAIC,oBAAA,CAAS,EAAA,KAAO,SAAA,EAAW,OAAO,EAAC,SAAA,EAAW,CAAC,EAAC,UAAA,EAAY,CAAA,EAAE,CAAA,EAAC;AACnE,IAAA,MAAM,CAAA,GAAI,SAAS,MAAA,CAAO,KAAA;AAC1B,IAAA,OAAO,EAAC,SAAA,EAAW,CAAC,EAAC,YAAY,CAAA,GAAI,CAAA,GAAI,EAAE,CAAA,GAAIC,uBAAA,CAAK,KAAA,CAAM,WAAA,CAAA,GAAe,CAAA,EAAE,CAAA,EAAC;AAAA,EAChF,CAAC,CAAA;AAED,EAAA,MAAM,cAAA,GAAyC;AAAA,IAC3C,OAAA,EAAS,aAAa,WAAW,CAAA;AAAA,IACjC,IAAA,EAAM,aAAa,UAAU,CAAA;AAAA,IAC7B,IAAA,EAAM,aAAa,YAAY,CAAA;AAAA,IAC/B,KAAA,EAAO,aAAa,SAAS,CAAA;AAAA,IAC7B,OAAA,EAAS,aAAa,UAAU,CAAA;AAAA,IAChC,KAAA,EAAO,aAAa,SAAS;AAAA,GACjC;AAEA,EAAA,MAAM,YAAA,GAAe,aAAa,cAAc,CAAA;AAChD,EAAA,MAAM,SAAA,GAAY,aAAa,MAAM,CAAA;AACrC,EAAA,MAAM,WAAA,GAAc,aAAa,QAAQ,CAAA;AAEzC,EAAA,MAAM,WAAA,GAAcC,iBAAA,CAAY,CAAC,EAAA,KAAe;AAC5C,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AACtC,IAAA,IAAI,KAAA,EAAO;AACP,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,SAAA,CAAU,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA,IAC/B;AACA,IAAA,SAAA,CAAU,UAAQ,IAAA,CAAK,MAAA,CAAO,OAAK,CAAA,CAAE,EAAA,KAAO,EAAE,CAAC,CAAA;AAAA,EACnD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,KAAA,GAAwBA,iBAAA,CAAY,CACtC,QAAA,EACA,SACA,IAAA,GAAe,EAAA,EACf,QAAA,GAA0B,eAAA,EAC1B,QAAA,GAAoB,KAAA,EACpB,IAAA,GAAkB,IAAA,EAClB,SACA,OAAA,KACC;AACD,IAAA,MAAM,KAAK,EAAE,cAAA;AACb,IAAA,MAAM,IAAA,GAAkB;AAAA,MACpB,EAAA;AAAA,MAAI,QAAA;AAAA,MAAU,OAAA;AAAA,MAAS,IAAA;AAAA,MAAM,QAAA;AAAA,MAAU,IAAA;AAAA,MACvC,QAAQ,QAAA,KAAa,SAAA;AAAA,MACrB,OAAA;AAAA,MACA,QAAQ,OAAA,EAAS,MAAA;AAAA,MACjB,QAAQ,OAAA,EAAS;AAAA,KACrB;AAIA,IAAA,SAAA,CAAU,CAAA,IAAA,KAAQ;AACd,MAAA,IAAI,CAAC,QAAA,EAAU,OAAO,CAAC,GAAG,MAAM,IAAI,CAAA;AACpC,MAAA,MAAM,SAAA,GAAY,CAAC,GAAG,IAAI,CAAA,CAAE,OAAA,EAAQ,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,QAAA,KAAa,QAAQ,CAAA;AACvE,MAAA,IAAI,CAAC,SAAA,EAAW,OAAO,CAAC,GAAG,MAAM,IAAI,CAAA;AACrC,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,OAAA,CAAQ,GAAA,CAAI,UAAU,EAAE,CAAA;AAChD,MAAA,IAAI,KAAA,EAAO;AACP,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,SAAA,CAAU,OAAA,CAAQ,MAAA,CAAO,SAAA,CAAU,EAAE,CAAA;AAAA,MACzC;AACA,MAAA,OAAO,IAAA,CAAK,IAAI,CAAA,CAAA,KAAM,CAAA,CAAE,OAAO,SAAA,CAAU,EAAA,GAAK,OAAO,CAAE,CAAA;AAAA,IAC3D,CAAC,CAAA;AAED,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AACd,MAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,WAAA,CAAY,EAAE,GAAG,IAAI,CAAA;AACpD,MAAA,SAAA,CAAU,OAAA,CAAQ,GAAA,CAAI,EAAA,EAAI,KAAK,CAAA;AAAA,IACnC;AAAA,EACJ,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,MAAM,OAAA,GAAUA,iBAAA,CAAY,CAAC,QAAA,KAA6B;AACtD,IAAA,SAAA,CAAU,CAAA,IAAA,KAAQ;AACd,MAAA,MAAM,QAAA,GAAW,WAAW,IAAA,CAAK,MAAA,CAAO,OAAK,CAAA,CAAE,QAAA,KAAa,QAAQ,CAAA,GAAI,IAAA;AACxE,MAAA,QAAA,CAAS,QAAQ,CAAA,CAAA,KAAK;AAClB,QAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,OAAA,CAAQ,GAAA,CAAI,EAAE,EAAE,CAAA;AACxC,QAAA,IAAI,KAAA,EAAO;AACP,UAAA,YAAA,CAAa,KAAK,CAAA;AAClB,UAAA,SAAA,CAAU,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA;AAAA,QACjC;AAAA,MACJ,CAAC,CAAA;AACD,MAAA,OAAO,QAAA,GAAW,KAAK,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,QAAA,KAAa,QAAQ,IAAI,EAAC;AAAA,IACnE,CAAC,CAAA;AAAA,EACL,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,UAAA,GAAaA,kBAAY,MAAM;AACjC,IAAA,SAAA,CAAU,OAAA,CAAQ,OAAA,CAAQ,CAAA,CAAA,KAAK,YAAA,CAAa,CAAC,CAAC,CAAA;AAC9C,IAAA,SAAA,CAAU,QAAQ,KAAA,EAAM;AACxB,IAAA,SAAA,CAAU,EAAE,CAAA;AAAA,EAChB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAAC,yBAAA,CAAoB,KAAK,OAAO,EAAC,KAAA,EAAO,OAAA,EAAS,YAAU,CAAE,CAAA;AAE7D,EAAAC,eAAA,CAAU,MAAM;AACZ,IAAA,OAAO,MAAM;AACT,MAAA,SAAA,CAAU,OAAA,CAAQ,OAAA,CAAQ,CAAA,CAAA,KAAK,YAAA,CAAa,CAAC,CAAC,CAAA;AAAA,IAClD,CAAA;AAAA,EACJ,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEhC,EAAA,MAAM,YAAA,GAAe,CAAC,QAAA,KAAkE;AACpF,IAAA,IAAI,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA,EAAG,OAAO,YAAA;AACvC,IAAA,IAAI,QAAA,CAAS,QAAA,CAAS,QAAQ,CAAA,EAAG,OAAO,UAAA;AACxC,IAAA,OAAO,QAAA;AAAA,EACX,CAAA;AAEA,EAAA,MAAM,KAAA,GAAQ,CAAC,QAAA,KAA4B,QAAA,CAAS,WAAW,KAAK,CAAA;AAEpE,EAAA,uBACIC,cAAA,CAACC,oBAAK,KAAA,EAAOC,sBAAA,CAAW,cAAc,aAAA,EAAc,UAAA,EAC/C,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAA,IAAA,KAAQ;AAChB,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA;AAC/B,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAA;AAIxC,IAAA,MAAM,QAAA,GAAA,CAAY,MAAMC,iBAAA,GAAWC,mBAAA,EAC9B,WAAU,CACV,OAAA,CAAQR,uBAAA,CAAK,KAAA,CAAM,KAAA,CAAM,OAAO,EAChC,SAAA,CAAUA,uBAAA,CAAK,KAAA,CAAM,KAAA,CAAM,SAAS,CAAA,CACpC,KAAKA,uBAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAS,CAAA;AACpC,IAAA,MAAM,WAAW,GAAA,GAAMS,kBAAA,GAAYC,sBAAa,QAAA,CAASV,uBAAA,CAAK,MAAM,YAAY,CAAA;AAChF,IAAA,MAAM,CAAA,GAAI,WAAA,CAAY,IAAA,CAAK,IAAI,KAAK,WAAA,CAAY,EAAA;AAChD,IAAA,MAAM,WAAA,GAAc,cAAA,CAAe,IAAA,CAAK,QAAQ,KAAK,cAAA,CAAe,IAAA;AAEpE,IAAA,uBACII,cAAA;AAAA,MAAC,QAAA,CAAS,IAAA;AAAA,MAAT;AAAA,QAEG,KAAA,EAAO;AAAA,UACH,MAAA,CAAO,YAAA;AAAA,UACP;AAAA,YACI,UAAA,EAAY,KAAA;AAAA;AAAA;AAAA;AAAA,YAIZ,GAAI,GAAA,GACE,EAAC,KAAK,MAAA,CAAO,GAAA,GAAM,KAAK,IAAA,CAAK,MAAA,IAAU,CAAA,CAAA,EAAE,GACzC,EAAC,MAAA,EAAQ,MAAA,CAAO,SAAS,CAAA,IAAK,IAAA,CAAK,UAAU,CAAA,CAAA;AAAE,WACzD;AAAA;AAAA,UAEA,MAAM,IAAA,GAAO;AAAA,SACjB;AAAA,QACA,aAAA,EAAc,UAAA;AAAA,QAEd,QAAA,kBAAAA,cAAA;AAAA,UAAC,QAAA,CAAS,IAAA;AAAA,UAAT;AAAA,YACG,QAAA;AAAA,YACA,OAAA;AAAA,YACA,MAAA,EAAQO,eAAA,CAAO,QAAA,CAASX,uBAAA,CAAK,MAAM,cAAc,CAAA;AAAA,YACjD,KAAA,EAAO;AAAA,cACH,MAAA,CAAO,KAAA;AAAA,cACP;AAAA,gBACI,eAAA,EAAiB,YAAA;AAAA,gBACjB,WAAA;AAAA,gBACA,UAAU,CAAA,CAAE;AAAA;AAChB,aACJ;AAAA,YAEA,QAAA,kBAAAY,eAAA;AAAA,cAACC,qBAAA;AAAA,cAAA;AAAA,gBACG,OAAO,MAAA,CAAO,SAAA;AAAA,gBACd,QAAA,EAAU,CAAC,IAAA,CAAK,OAAA;AAAA,gBAChB,SAAS,MAAM;AACX,kBAAA,IAAA,CAAK,OAAA,IAAU;AACf,kBAAA,WAAA,CAAY,KAAK,EAAE,CAAA;AAAA,gBACvB,CAAA;AAAA,gBAEA,QAAA,EAAA;AAAA,kCAAAT,cAAA,CAACC,gBAAA,EAAA,EAAK,KAAA,EAAO,CAAC,MAAA,CAAO,SAAA,EAAW,EAAC,eAAA,EAAiB,WAAA,EAAa,KAAA,EAAO,CAAA,CAAE,WAAA,EAAY,CAAA,EAAE,CAAA;AAAA,kDACrFA,gBAAA,EAAA,EAAK,KAAA,EAAO,CAAC,MAAA,CAAO,OAAA,EAAS,EAAC,eAAA,EAAiB,CAAA,CAAE,QAAA,EAAU,iBAAA,EAAmB,EAAE,QAAA,EAAU,GAAA,EAAK,EAAE,QAAA,GAAW,GAAA,EAAI,CAAA,EAC5G,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAK,aAAa,SAAA,oBACfD,cAAA,CAACU,iCAAkB,IAAA,EAAK,OAAA,EAAQ,OAAO,WAAA,EAAY,CAAA;AAAA,oCAEvDF,eAAA,CAACP,gBAAA,EAAA,EAAK,KAAA,EAAO,MAAA,CAAO,aAAA,EAChB,QAAA,EAAA;AAAA,sCAAAD,cAAA,CAACW,oBAAA,EAAA,EAAK,KAAA,EAAO,EAAC,UAAA,EAAY,KAAA,EAAO,QAAA,EAAU,CAAA,CAAE,WAAA,EAAa,KAAA,EAAO,SAAA,EAAS,EACrE,QAAA,EAAA,IAAA,CAAK,OAAA,EACV,CAAA;AAAA,sBACC,CAAC,CAAC,IAAA,CAAK,wBACJX,cAAA,CAACW,oBAAA,EAAA,EAAK,OAAO,EAAC,QAAA,EAAU,EAAE,QAAA,EAAU,SAAA,EAAW,GAAG,KAAA,EAAO,SAAA,EAAW,SAAS,GAAA,EAAG,EAC3E,eAAK,IAAA,EACV;AAAA,qBAAA,EAER,CAAA;AAAA,oBACC,CAAC,CAAC,IAAA,CAAK,MAAA,oBACJX,cAAA;AAAA,sBAACS,qBAAA;AAAA,sBAAA;AAAA,wBACG,iBAAA,EAAkB,QAAA;AAAA,wBAClB,kBAAA,EAAoB,KAAK,MAAA,CAAO,KAAA;AAAA,wBAChC,OAAA,EAAS,CAAA;AAAA,wBAKT,SAAS,MAAM;AACX,0BAAA,IAAA,CAAK,QAAQ,OAAA,EAAQ;AACrB,0BAAA,WAAA,CAAY,KAAK,EAAE,CAAA;AAAA,wBACvB,CAAA;AAAA,wBACA,OAAO,CAAC,MAAA,CAAO,QAAQ,EAAC,WAAA,EAAa,aAAY,CAAA;AAAA,wBAEjD,QAAA,kBAAAT,cAAA,CAACW,oBAAA,EAAA,EAAK,KAAA,EAAO,EAAC,UAAU,CAAA,CAAE,UAAA,EAAY,UAAA,EAAY,KAAA,EAAO,KAAA,EAAO,WAAA,EAAW,EACtE,QAAA,EAAA,IAAA,CAAK,OAAO,KAAA,EACjB;AAAA;AAAA,qBACJ;AAAA,oCAEJX,cAAA,CAACS,qBAAA,EAAA,EAAU,OAAA,EAAS,MAAM,WAAA,CAAY,KAAK,EAAE,CAAA,EAAG,OAAA,EAAS,CAAA,EACrD,QAAA,kBAAAT,cAAA,CAACW,oBAAA,EAAA,EAAK,OAAO,EAAC,QAAA,EAAU,CAAA,CAAE,SAAA,EAAW,UAAA,EAAY,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,GAAA,EAAG,EAAG,QAAA,EAAA,QAAA,EAE1F,CAAA,EACJ;AAAA,mBAAA,EACJ;AAAA;AAAA;AAAA;AACJ;AAAA;AACJ,OAAA;AAAA,MAhFK,IAAA,CAAK;AAAA,KAiFd;AAAA,EAER,CAAC,CAAA,EACL,CAAA;AAER;AAEA,MAAM,MAAA,GAAST,uBAAW,MAAA,CAAO;AAAA,EAC7B,YAAA,EAAc;AAAA,IACV,QAAA,EAAU,UAAA;AAAA,IACV,IAAA,EAAM,EAAA;AAAA,IACN,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACZ;AAAA,EACA,KAAA,EAAO;AAAA,IACH,aAAA,EAAe,KAAA;AAAA;AAAA;AAAA,IAGf,KAAA,EAAO,MAAA;AAAA,IACP,QAAA,EAAU,GAAA;AAAA,IACV,YAAA,EAAc,EAAA;AAAA,IACd,WAAA,EAAa,CAAA;AAAA,IACb,YAAA,EAAc,CAAA;AAAA,IACd,QAAA,EAAU,QAAA;AAAA,IACV,SAAA,EAAW,CAAA;AAAA,IACX,WAAA,EAAa,MAAA;AAAA,IACb,YAAA,EAAc,EAAC,KAAA,EAAO,CAAA,EAAG,QAAQ,CAAA,EAAC;AAAA,IAClC,aAAA,EAAe,IAAA;AAAA,IACf,YAAA,EAAc;AAAA,GAClB;AAAA,EACA,WAAW,EAAC;AAAA,EACZ,MAAA,EAAQ;AAAA,IACJ,WAAA,EAAa,CAAA;AAAA,IACb,YAAA,EAAc,CAAA;AAAA,IACd,iBAAA,EAAmB,EAAA;AAAA,IACnB,eAAA,EAAiB;AAAA,GACrB;AAAA,EACA,SAAA,EAAW;AAAA,IACP,IAAA,EAAM,CAAA;AAAA,IACN,aAAA,EAAe;AAAA,GACnB;AAAA,EACA,OAAA,EAAS;AAAA,IACL,IAAA,EAAM,CAAA;AAAA,IACN,aAAA,EAAe,KAAA;AAAA,IACf,UAAA,EAAY;AAAA,GAChB;AAAA,EACA,aAAA,EAAe;AAAA,IACX,IAAA,EAAM;AAAA;AAEd,CAAC,CAAA;;;;"}
@@ -10,9 +10,9 @@ import Text from '../../../primitives/Text/index.js';
10
10
  let toastIdCounter = 0;
11
11
  const LIFE = 3e3;
12
12
  const SIZE_CONFIG = {
13
- sm: { paddingV: 8, paddingH: 10, summarySize: 12, bodySize: 10, accentWidth: 3, closeSize: 14, minW: 200 },
14
- md: { paddingV: 12, paddingH: 14, summarySize: 14, bodySize: 12, accentWidth: 4, closeSize: 16, minW: 280 },
15
- lg: { paddingV: 16, paddingH: 18, summarySize: 16, bodySize: 14, accentWidth: 5, closeSize: 18, minW: 320 }
13
+ sm: { paddingV: 8, paddingH: 10, summarySize: 12, bodySize: 10, accentWidth: 3, closeSize: 14, actionSize: 12, minW: 200 },
14
+ md: { paddingV: 12, paddingH: 14, summarySize: 14, bodySize: 12, accentWidth: 4, closeSize: 16, actionSize: 13, minW: 280 },
15
+ lg: { paddingV: 16, paddingH: 18, summarySize: 16, bodySize: 14, accentWidth: 5, closeSize: 18, actionSize: 15, minW: 320 }
16
16
  };
17
17
  const KitsToast = ({ ref }) => {
18
18
  const [toasts, setToasts] = useState([]);
@@ -44,9 +44,20 @@ const KitsToast = ({ ref }) => {
44
44
  }
45
45
  setToasts((prev) => prev.filter((t) => t.id !== id));
46
46
  }, []);
47
- const toast = useCallback((severity, summary, body = "", position = "bottom-center", isUpdate = false, size = "md", onPress) => {
47
+ const toast = useCallback((severity, summary, body = "", position = "bottom-center", isUpdate = false, size = "md", onPress, options) => {
48
48
  const id = ++toastIdCounter;
49
- const item = { id, severity, summary, body, position, size, sticky: severity === "loading", onPress };
49
+ const item = {
50
+ id,
51
+ severity,
52
+ summary,
53
+ body,
54
+ position,
55
+ size,
56
+ sticky: severity === "loading",
57
+ onPress,
58
+ action: options?.action,
59
+ offset: options?.offset
60
+ };
50
61
  setToasts((prev) => {
51
62
  if (!isUpdate) return [...prev, item];
52
63
  const lastAtPos = [...prev].reverse().find((t) => t.position === position);
@@ -108,7 +119,10 @@ const KitsToast = ({ ref }) => {
108
119
  styles.toastWrapper,
109
120
  {
110
121
  alignItems: align,
111
- ...top ? { top: insets.top + 8 } : { bottom: insets.bottom + 8 }
122
+ // `offset` is consumer chrome KitsConcerto cannot see
123
+ // (a bottom tab bar, a sticky header). It stacks ON TOP
124
+ // of the safe-area inset; absent, the gap is unchanged.
125
+ ...top ? { top: insets.top + 8 + (item.offset ?? 0) } : { bottom: insets.bottom + 8 + (item.offset ?? 0) }
112
126
  },
113
127
  // Bottom toasts lift with the keyboard; top toasts never move.
114
128
  top ? null : keyboardOffsetStyle
@@ -145,6 +159,20 @@ const KitsToast = ({ ref }) => {
145
159
  /* @__PURE__ */ jsx(Text, { style: { fontWeight: "600", fontSize: s.summarySize, color: textColor }, children: item.summary }),
146
160
  !!item.body && /* @__PURE__ */ jsx(Text, { style: { fontSize: s.bodySize, marginTop: 2, color: textColor, opacity: 0.7 }, children: item.body })
147
161
  ] }),
162
+ !!item.action && /* @__PURE__ */ jsx(
163
+ Pressable,
164
+ {
165
+ accessibilityRole: "button",
166
+ accessibilityLabel: item.action.label,
167
+ hitSlop: 8,
168
+ onPress: () => {
169
+ item.action?.onPress();
170
+ removeToast(item.id);
171
+ },
172
+ style: [styles.action, { borderColor: accentColor }],
173
+ children: /* @__PURE__ */ jsx(Text, { style: { fontSize: s.actionSize, fontWeight: "600", color: accentColor }, children: item.action.label })
174
+ }
175
+ ),
148
176
  /* @__PURE__ */ jsx(Pressable, { onPress: () => removeToast(item.id), hitSlop: 8, children: /* @__PURE__ */ jsx(Text, { style: { fontSize: s.closeSize, fontWeight: "bold", color: textColor, opacity: 0.4 }, children: "\u2715" }) })
149
177
  ] })
150
178
  ]
@@ -181,6 +209,12 @@ const styles = StyleSheet.create({
181
209
  shadowRadius: 6
182
210
  },
183
211
  accentBar: {},
212
+ action: {
213
+ borderWidth: 1,
214
+ borderRadius: 6,
215
+ paddingHorizontal: 10,
216
+ paddingVertical: 4
217
+ },
184
218
  pressArea: {
185
219
  flex: 1,
186
220
  flexDirection: "row"
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../src/components/overlay/Toast/index.native.tsx"],"sourcesContent":["import React, {\n type Ref,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from \"react\";\nimport {Platform, Pressable, StyleSheet, ActivityIndicator, View} from \"react-native\";\nimport Animated, {\n FadeInUp,\n FadeInDown,\n FadeOutUp,\n FadeOutDown,\n Layout,\n useAnimatedKeyboard,\n useAnimatedStyle,\n} from \"react-native-reanimated\";\nimport {useSafeAreaInsets} from \"react-native-safe-area-context\";\nimport {Text} from \"../../../_compat\";\nimport type {\n IKitsToastRef,\n IToastFunction,\n IToastParams,\n ToastPosition,\n ToastSeverity,\n ToastSize,\n} from \"@lmb-it/kitsconcerto-types\";\nimport {useKitsTheme} from \"../../../contexts/Theme\";\nimport {overlayAnimations as anim} from \"../../../animations\";\n\ninterface ToastItem {\n id: number;\n severity: ToastSeverity;\n summary: string;\n body?: string;\n position: ToastPosition;\n size: ToastSize;\n sticky?: boolean;\n onPress?: () => void;\n}\n\nlet toastIdCounter = 0;\nconst LIFE = 3000;\n\nconst SIZE_CONFIG: Record<ToastSize, { paddingV: number; paddingH: number; summarySize: number; bodySize: number; accentWidth: number; closeSize: number; minW: number }> = {\n sm: {paddingV: 8, paddingH: 10, summarySize: 12, bodySize: 10, accentWidth: 3, closeSize: 14, minW: 200},\n md: {paddingV: 12, paddingH: 14, summarySize: 14, bodySize: 12, accentWidth: 4, closeSize: 16, minW: 280},\n lg: {paddingV: 16, paddingH: 18, summarySize: 16, bodySize: 14, accentWidth: 5, closeSize: 18, minW: 320},\n};\n\nconst KitsToast = ({ref}: { ref?: Ref<IKitsToastRef> }) => {\n const [toasts, setToasts] = useState<ToastItem[]>([]);\n const timersRef = useRef<Map<number, ReturnType<typeof setTimeout>>>(new Map());\n const {resolveToken} = useKitsTheme();\n const insets = useSafeAreaInsets();\n\n // Keyboard avoidance for BOTTOM-positioned toasts, driven on the UI thread so\n // the lift tracks the keyboard's own curve instead of snapping on a JS event.\n const keyboard = useAnimatedKeyboard();\n const keyboardOffsetStyle = useAnimatedStyle(() => {\n // Android ships `windowSoftInputMode=\"adjustResize\"`: the window (and with\n // it this absoluteFill host) is already resized to sit above the keyboard,\n // so the toast clears it for free. Adding the keyboard height here would\n // double-compensate and launch the toast into the middle of the screen.\n if (Platform.OS === \"android\") return {transform: [{translateY: 0}]};\n const h = keyboard.height.value;\n return {transform: [{translateY: h > 0 ? -(h + anim.toast.keyboardGap) : 0}]};\n });\n\n const severityColors: Record<string, string> = {\n success: resolveToken('green.500'),\n info: resolveToken('blue.500'),\n warn: resolveToken('yellow.500'),\n error: resolveToken('red.500'),\n loading: resolveToken('blue.500'),\n brand: resolveToken('primary'),\n };\n\n const surfaceColor = resolveToken('surface-card');\n const textColor = resolveToken('text');\n const borderColor = resolveToken('border');\n\n const removeToast = useCallback((id: number) => {\n const timer = timersRef.current.get(id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(id);\n }\n setToasts(prev => prev.filter(t => t.id !== id));\n }, []);\n\n const toast: IToastFunction = useCallback((\n severity: ToastSeverity,\n summary: string,\n body: string = \"\",\n position: ToastPosition = \"bottom-center\",\n isUpdate: boolean = false,\n size: ToastSize = \"md\",\n onPress?: () => void,\n ) => {\n const id = ++toastIdCounter;\n const item: ToastItem = {id, severity, summary, body, position, size, sticky: severity === \"loading\", onPress};\n\n // isUpdate mirrors web's toastRef.replace: swap the most recent toast\n // at this position instead of stacking a new one.\n setToasts(prev => {\n if (!isUpdate) return [...prev, item];\n const lastAtPos = [...prev].reverse().find(t => t.position === position);\n if (!lastAtPos) return [...prev, item];\n const timer = timersRef.current.get(lastAtPos.id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(lastAtPos.id);\n }\n return prev.map(t => (t.id === lastAtPos.id ? item : t));\n });\n\n if (!item.sticky) {\n const timer = setTimeout(() => removeToast(id), LIFE);\n timersRef.current.set(id, timer);\n }\n }, [removeToast]) as IToastFunction;\n\n const dismiss = useCallback((position?: ToastPosition) => {\n setToasts(prev => {\n const toRemove = position ? prev.filter(t => t.position === position) : prev;\n toRemove.forEach(t => {\n const timer = timersRef.current.get(t.id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(t.id);\n }\n });\n return position ? prev.filter(t => t.position !== position) : [];\n });\n }, []);\n\n const dismissAll = useCallback(() => {\n timersRef.current.forEach(t => clearTimeout(t));\n timersRef.current.clear();\n setToasts([]);\n }, []);\n\n useImperativeHandle(ref, () => ({toast, dismiss, dismissAll}));\n\n useEffect(() => {\n return () => {\n timersRef.current.forEach(t => clearTimeout(t));\n };\n }, []);\n\n if (toasts.length === 0) return null;\n\n const getAlignment = (position: ToastPosition): 'flex-start' | 'center' | 'flex-end' => {\n if (position.endsWith('-left')) return 'flex-start';\n if (position.endsWith('-right')) return 'flex-end';\n return 'center';\n };\n\n const isTop = (position: ToastPosition) => position.startsWith('top');\n\n return (\n <View style={StyleSheet.absoluteFill} pointerEvents=\"box-none\">\n {toasts.map(item => {\n const top = isTop(item.position);\n const align = getAlignment(item.position);\n // One builder owns the whole entrance: FadeInUp/FadeInDown animate\n // opacity AND translateY together, direction matched to placement\n // (top toasts drop in from above, bottom toasts rise from below).\n const entering = (top ? FadeInUp : FadeInDown)\n .springify()\n .damping(anim.toast.enter.damping)\n .stiffness(anim.toast.enter.stiffness)\n .mass(anim.toast.enter.mass ?? 1);\n const exiting = (top ? FadeOutUp : FadeOutDown).duration(anim.toast.exitDuration);\n const s = SIZE_CONFIG[item.size] ?? SIZE_CONFIG.md;\n const accentColor = severityColors[item.severity] ?? severityColors.info;\n\n return (\n <Animated.View\n key={item.id}\n style={[\n styles.toastWrapper,\n {\n alignItems: align,\n ...(top\n ? {top: insets.top + 8}\n : {bottom: insets.bottom + 8}),\n },\n // Bottom toasts lift with the keyboard; top toasts never move.\n top ? null : keyboardOffsetStyle,\n ]}\n pointerEvents=\"box-none\"\n >\n <Animated.View\n entering={entering}\n exiting={exiting}\n layout={Layout.duration(anim.toast.layoutDuration)}\n style={[\n styles.toast,\n {\n backgroundColor: surfaceColor,\n borderColor,\n minWidth: s.minW,\n },\n ]}\n >\n <Pressable\n style={styles.pressArea}\n disabled={!item.onPress}\n onPress={() => {\n item.onPress?.();\n removeToast(item.id);\n }}\n >\n <View style={[styles.accentBar, {backgroundColor: accentColor, width: s.accentWidth}]}/>\n <View style={[styles.content, {paddingVertical: s.paddingV, paddingHorizontal: s.paddingH, gap: s.paddingH * 0.7}]}>\n {item.severity === \"loading\" && (\n <ActivityIndicator size=\"small\" color={accentColor}/>\n )}\n <View style={styles.textContainer}>\n <Text style={{fontWeight: \"600\", fontSize: s.summarySize, color: textColor}}>\n {item.summary}\n </Text>\n {!!item.body && (\n <Text style={{fontSize: s.bodySize, marginTop: 2, color: textColor, opacity: 0.7}}>\n {item.body}\n </Text>\n )}\n </View>\n <Pressable onPress={() => removeToast(item.id)} hitSlop={8}>\n <Text style={{fontSize: s.closeSize, fontWeight: \"bold\", color: textColor, opacity: 0.4}}>\n ✕\n </Text>\n </Pressable>\n </View>\n </Pressable>\n </Animated.View>\n </Animated.View>\n );\n })}\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n toastWrapper: {\n position: \"absolute\",\n left: 16,\n right: 16,\n zIndex: 9999,\n },\n toast: {\n flexDirection: \"row\",\n // Fill the wrapper (already inset 16pt each side) but never exceed 560pt;\n // the wrapper's alignItems keeps -left/-center/-right placement intact.\n width: \"100%\",\n maxWidth: 560,\n borderRadius: 10,\n borderWidth: 1,\n marginBottom: 8,\n overflow: \"hidden\",\n elevation: 6,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: 3},\n shadowOpacity: 0.15,\n shadowRadius: 6,\n },\n accentBar: {},\n pressArea: {\n flex: 1,\n flexDirection: \"row\",\n },\n content: {\n flex: 1,\n flexDirection: \"row\",\n alignItems: \"center\",\n },\n textContainer: {\n flex: 1,\n },\n});\n\nexport default KitsToast;\n"],"names":["anim"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../src/components/overlay/Toast/index.native.tsx"],"sourcesContent":["import React, {\n type Ref,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from \"react\";\nimport {Platform, Pressable, StyleSheet, ActivityIndicator, View} from \"react-native\";\nimport Animated, {\n FadeInUp,\n FadeInDown,\n FadeOutUp,\n FadeOutDown,\n Layout,\n useAnimatedKeyboard,\n useAnimatedStyle,\n} from \"react-native-reanimated\";\nimport {useSafeAreaInsets} from \"react-native-safe-area-context\";\nimport {Text} from \"../../../_compat\";\nimport type {\n IKitsToastRef,\n IToastAction,\n IToastFunction,\n IToastOptions,\n IToastParams,\n ToastPosition,\n ToastSeverity,\n ToastSize,\n} from \"@lmb-it/kitsconcerto-types\";\nimport {useKitsTheme} from \"../../../contexts/Theme\";\nimport {overlayAnimations as anim} from \"../../../animations\";\n\ninterface ToastItem {\n id: number;\n severity: ToastSeverity;\n summary: string;\n body?: string;\n position: ToastPosition;\n size: ToastSize;\n sticky?: boolean;\n onPress?: () => void;\n action?: IToastAction;\n offset?: number;\n}\n\nlet toastIdCounter = 0;\nconst LIFE = 3000;\n\nconst SIZE_CONFIG: Record<ToastSize, { paddingV: number; paddingH: number; summarySize: number; bodySize: number; accentWidth: number; closeSize: number; actionSize: number; minW: number }> = {\n sm: {paddingV: 8, paddingH: 10, summarySize: 12, bodySize: 10, accentWidth: 3, closeSize: 14, actionSize: 12, minW: 200},\n md: {paddingV: 12, paddingH: 14, summarySize: 14, bodySize: 12, accentWidth: 4, closeSize: 16, actionSize: 13, minW: 280},\n lg: {paddingV: 16, paddingH: 18, summarySize: 16, bodySize: 14, accentWidth: 5, closeSize: 18, actionSize: 15, minW: 320},\n};\n\nconst KitsToast = ({ref}: { ref?: Ref<IKitsToastRef> }) => {\n const [toasts, setToasts] = useState<ToastItem[]>([]);\n const timersRef = useRef<Map<number, ReturnType<typeof setTimeout>>>(new Map());\n const {resolveToken} = useKitsTheme();\n const insets = useSafeAreaInsets();\n\n // Keyboard avoidance for BOTTOM-positioned toasts, driven on the UI thread so\n // the lift tracks the keyboard's own curve instead of snapping on a JS event.\n const keyboard = useAnimatedKeyboard();\n const keyboardOffsetStyle = useAnimatedStyle(() => {\n // Android ships `windowSoftInputMode=\"adjustResize\"`: the window (and with\n // it this absoluteFill host) is already resized to sit above the keyboard,\n // so the toast clears it for free. Adding the keyboard height here would\n // double-compensate and launch the toast into the middle of the screen.\n if (Platform.OS === \"android\") return {transform: [{translateY: 0}]};\n const h = keyboard.height.value;\n return {transform: [{translateY: h > 0 ? -(h + anim.toast.keyboardGap) : 0}]};\n });\n\n const severityColors: Record<string, string> = {\n success: resolveToken('green.500'),\n info: resolveToken('blue.500'),\n warn: resolveToken('yellow.500'),\n error: resolveToken('red.500'),\n loading: resolveToken('blue.500'),\n brand: resolveToken('primary'),\n };\n\n const surfaceColor = resolveToken('surface-card');\n const textColor = resolveToken('text');\n const borderColor = resolveToken('border');\n\n const removeToast = useCallback((id: number) => {\n const timer = timersRef.current.get(id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(id);\n }\n setToasts(prev => prev.filter(t => t.id !== id));\n }, []);\n\n const toast: IToastFunction = useCallback((\n severity: ToastSeverity,\n summary: string,\n body: string = \"\",\n position: ToastPosition = \"bottom-center\",\n isUpdate: boolean = false,\n size: ToastSize = \"md\",\n onPress?: () => void,\n options?: IToastOptions,\n ) => {\n const id = ++toastIdCounter;\n const item: ToastItem = {\n id, severity, summary, body, position, size,\n sticky: severity === \"loading\",\n onPress,\n action: options?.action,\n offset: options?.offset,\n };\n\n // isUpdate mirrors web's toastRef.replace: swap the most recent toast\n // at this position instead of stacking a new one.\n setToasts(prev => {\n if (!isUpdate) return [...prev, item];\n const lastAtPos = [...prev].reverse().find(t => t.position === position);\n if (!lastAtPos) return [...prev, item];\n const timer = timersRef.current.get(lastAtPos.id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(lastAtPos.id);\n }\n return prev.map(t => (t.id === lastAtPos.id ? item : t));\n });\n\n if (!item.sticky) {\n const timer = setTimeout(() => removeToast(id), LIFE);\n timersRef.current.set(id, timer);\n }\n }, [removeToast]) as IToastFunction;\n\n const dismiss = useCallback((position?: ToastPosition) => {\n setToasts(prev => {\n const toRemove = position ? prev.filter(t => t.position === position) : prev;\n toRemove.forEach(t => {\n const timer = timersRef.current.get(t.id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(t.id);\n }\n });\n return position ? prev.filter(t => t.position !== position) : [];\n });\n }, []);\n\n const dismissAll = useCallback(() => {\n timersRef.current.forEach(t => clearTimeout(t));\n timersRef.current.clear();\n setToasts([]);\n }, []);\n\n useImperativeHandle(ref, () => ({toast, dismiss, dismissAll}));\n\n useEffect(() => {\n return () => {\n timersRef.current.forEach(t => clearTimeout(t));\n };\n }, []);\n\n if (toasts.length === 0) return null;\n\n const getAlignment = (position: ToastPosition): 'flex-start' | 'center' | 'flex-end' => {\n if (position.endsWith('-left')) return 'flex-start';\n if (position.endsWith('-right')) return 'flex-end';\n return 'center';\n };\n\n const isTop = (position: ToastPosition) => position.startsWith('top');\n\n return (\n <View style={StyleSheet.absoluteFill} pointerEvents=\"box-none\">\n {toasts.map(item => {\n const top = isTop(item.position);\n const align = getAlignment(item.position);\n // One builder owns the whole entrance: FadeInUp/FadeInDown animate\n // opacity AND translateY together, direction matched to placement\n // (top toasts drop in from above, bottom toasts rise from below).\n const entering = (top ? FadeInUp : FadeInDown)\n .springify()\n .damping(anim.toast.enter.damping)\n .stiffness(anim.toast.enter.stiffness)\n .mass(anim.toast.enter.mass ?? 1);\n const exiting = (top ? FadeOutUp : FadeOutDown).duration(anim.toast.exitDuration);\n const s = SIZE_CONFIG[item.size] ?? SIZE_CONFIG.md;\n const accentColor = severityColors[item.severity] ?? severityColors.info;\n\n return (\n <Animated.View\n key={item.id}\n style={[\n styles.toastWrapper,\n {\n alignItems: align,\n // `offset` is consumer chrome KitsConcerto cannot see\n // (a bottom tab bar, a sticky header). It stacks ON TOP\n // of the safe-area inset; absent, the gap is unchanged.\n ...(top\n ? {top: insets.top + 8 + (item.offset ?? 0)}\n : {bottom: insets.bottom + 8 + (item.offset ?? 0)}),\n },\n // Bottom toasts lift with the keyboard; top toasts never move.\n top ? null : keyboardOffsetStyle,\n ]}\n pointerEvents=\"box-none\"\n >\n <Animated.View\n entering={entering}\n exiting={exiting}\n layout={Layout.duration(anim.toast.layoutDuration)}\n style={[\n styles.toast,\n {\n backgroundColor: surfaceColor,\n borderColor,\n minWidth: s.minW,\n },\n ]}\n >\n <Pressable\n style={styles.pressArea}\n disabled={!item.onPress}\n onPress={() => {\n item.onPress?.();\n removeToast(item.id);\n }}\n >\n <View style={[styles.accentBar, {backgroundColor: accentColor, width: s.accentWidth}]}/>\n <View style={[styles.content, {paddingVertical: s.paddingV, paddingHorizontal: s.paddingH, gap: s.paddingH * 0.7}]}>\n {item.severity === \"loading\" && (\n <ActivityIndicator size=\"small\" color={accentColor}/>\n )}\n <View style={styles.textContainer}>\n <Text style={{fontWeight: \"600\", fontSize: s.summarySize, color: textColor}}>\n {item.summary}\n </Text>\n {!!item.body && (\n <Text style={{fontSize: s.bodySize, marginTop: 2, color: textColor, opacity: 0.7}}>\n {item.body}\n </Text>\n )}\n </View>\n {!!item.action && (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={item.action.label}\n hitSlop={8}\n // Nested Pressable: RN hands the touch to the\n // deepest responder, so the surrounding body\n // press never double-fires (same mechanism the\n // close control has always relied on).\n onPress={() => {\n item.action?.onPress();\n removeToast(item.id);\n }}\n style={[styles.action, {borderColor: accentColor}]}\n >\n <Text style={{fontSize: s.actionSize, fontWeight: \"600\", color: accentColor}}>\n {item.action.label}\n </Text>\n </Pressable>\n )}\n <Pressable onPress={() => removeToast(item.id)} hitSlop={8}>\n <Text style={{fontSize: s.closeSize, fontWeight: \"bold\", color: textColor, opacity: 0.4}}>\n ✕\n </Text>\n </Pressable>\n </View>\n </Pressable>\n </Animated.View>\n </Animated.View>\n );\n })}\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n toastWrapper: {\n position: \"absolute\",\n left: 16,\n right: 16,\n zIndex: 9999,\n },\n toast: {\n flexDirection: \"row\",\n // Fill the wrapper (already inset 16pt each side) but never exceed 560pt;\n // the wrapper's alignItems keeps -left/-center/-right placement intact.\n width: \"100%\",\n maxWidth: 560,\n borderRadius: 10,\n borderWidth: 1,\n marginBottom: 8,\n overflow: \"hidden\",\n elevation: 6,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: 3},\n shadowOpacity: 0.15,\n shadowRadius: 6,\n },\n accentBar: {},\n action: {\n borderWidth: 1,\n borderRadius: 6,\n paddingHorizontal: 10,\n paddingVertical: 4,\n },\n pressArea: {\n flex: 1,\n flexDirection: \"row\",\n },\n content: {\n flex: 1,\n flexDirection: \"row\",\n alignItems: \"center\",\n },\n textContainer: {\n flex: 1,\n },\n});\n\nexport default KitsToast;\n"],"names":["anim"],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var React = require('react');
6
+ var index_native = require('./useReducedMotion/index.cjs');
7
+ var index = require('../motion/index.cjs');
8
+
9
+ function useCountUp(target, {
10
+ duration = index.kitsMotion.duration.countUp,
11
+ delay = 0,
12
+ run = true,
13
+ decimals = 0
14
+ } = {}) {
15
+ const reduced = index_native.useReducedMotion();
16
+ const [value, setValue] = React.useState(reduced ? target : 0);
17
+ React.useEffect(() => {
18
+ if (reduced) {
19
+ setValue(target);
20
+ return;
21
+ }
22
+ if (!run) {
23
+ setValue(0);
24
+ return;
25
+ }
26
+ let raf = 0;
27
+ let start = null;
28
+ const step = (now) => {
29
+ if (start === null) start = now;
30
+ const progress = Math.min(1, (now - start) / duration);
31
+ const eased = 1 - Math.pow(1 - progress, 3);
32
+ setValue(target * eased);
33
+ if (progress < 1) raf = requestAnimationFrame(step);
34
+ else setValue(target);
35
+ };
36
+ const timer = setTimeout(() => {
37
+ raf = requestAnimationFrame(step);
38
+ }, delay);
39
+ return () => {
40
+ clearTimeout(timer);
41
+ cancelAnimationFrame(raf);
42
+ };
43
+ }, [target, run, duration, delay, reduced]);
44
+ return decimals > 0 ? value.toFixed(decimals) : Math.round(value);
45
+ }
46
+
47
+ exports.default = useCountUp;
48
+ exports.useCountUp = useCountUp;
49
+ //# sourceMappingURL=useCountUp.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCountUp.cjs","sources":["../../../src/hooks/useCountUp.ts"],"sourcesContent":["import {useEffect, useState} from \"react\";\nimport {useReducedMotion} from \"./useReducedMotion\";\nimport {kitsMotion} from \"../motion\";\n\nexport interface IUseCountUpOptions {\n /** Animation duration in ms. @default kitsMotion.duration.countUp */\n duration?: number;\n /** Delay before the count starts, in ms. @default 0 */\n delay?: number;\n /** Gate: the count runs only while true (pair with `useEnter`). While false the value stays at 0. @default true */\n run?: boolean;\n /** Decimal places; when > 0 the hook returns a fixed-point string. @default 0 */\n decimals?: number;\n}\n\n/**\n * Animates a number from 0 to `target` (ease-out cubic, rAF), landing\n * exactly on `target`. With reduced motion the target is returned\n * immediately — no animation. Formatting and locale are the caller's\n * concern (see `formatNumber`).\n */\nexport function useCountUp(\n target: number,\n {\n duration = kitsMotion.duration.countUp,\n delay = 0,\n run = true,\n decimals = 0,\n }: IUseCountUpOptions = {},\n): number | string {\n const reduced = useReducedMotion();\n const [value, setValue] = useState(reduced ? target : 0);\n\n useEffect(() => {\n if (reduced) {\n setValue(target);\n return;\n }\n if (!run) {\n setValue(0);\n return;\n }\n let raf = 0;\n let start: number | null = null;\n const step = (now: number) => {\n if (start === null) start = now;\n const progress = Math.min(1, (now - start) / duration);\n const eased = 1 - Math.pow(1 - progress, 3);\n setValue(target * eased);\n if (progress < 1) raf = requestAnimationFrame(step);\n else setValue(target);\n };\n const timer = setTimeout(() => {\n raf = requestAnimationFrame(step);\n }, delay);\n return () => {\n clearTimeout(timer);\n cancelAnimationFrame(raf);\n };\n }, [target, run, duration, delay, reduced]);\n\n return decimals > 0 ? value.toFixed(decimals) : Math.round(value);\n}\n\nexport default useCountUp;\n"],"names":["kitsMotion","useReducedMotion","useState","useEffect"],"mappings":";;;;;;;;AAqBO,SAAS,WACZ,MAAA,EACA;AAAA,EACI,QAAA,GAAWA,iBAAW,QAAA,CAAS,OAAA;AAAA,EAC/B,KAAA,GAAQ,CAAA;AAAA,EACR,GAAA,GAAM,IAAA;AAAA,EACN,QAAA,GAAW;AACf,CAAA,GAAwB,EAAC,EACV;AACf,EAAA,MAAM,UAAUC,6BAAA,EAAiB;AACjC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,IAAIC,cAAA,CAAS,OAAA,GAAU,SAAS,CAAC,CAAA;AAEvD,EAAAC,eAAA,CAAU,MAAM;AACZ,IAAA,IAAI,OAAA,EAAS;AACT,MAAA,QAAA,CAAS,MAAM,CAAA;AACf,MAAA;AAAA,IACJ;AACA,IAAA,IAAI,CAAC,GAAA,EAAK;AACN,MAAA,QAAA,CAAS,CAAC,CAAA;AACV,MAAA;AAAA,IACJ;AACA,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,IAAI,KAAA,GAAuB,IAAA;AAC3B,IAAA,MAAM,IAAA,GAAO,CAAC,GAAA,KAAgB;AAC1B,MAAA,IAAI,KAAA,KAAU,MAAM,KAAA,GAAQ,GAAA;AAC5B,MAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAA,CAAI,GAAA,GAAM,SAAS,QAAQ,CAAA;AACrD,MAAA,MAAM,QAAQ,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,UAAU,CAAC,CAAA;AAC1C,MAAA,QAAA,CAAS,SAAS,KAAK,CAAA;AACvB,MAAA,IAAI,QAAA,GAAW,CAAA,EAAG,GAAA,GAAM,qBAAA,CAAsB,IAAI,CAAA;AAAA,oBACpC,MAAM,CAAA;AAAA,IACxB,CAAA;AACA,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC3B,MAAA,GAAA,GAAM,sBAAsB,IAAI,CAAA;AAAA,IACpC,GAAG,KAAK,CAAA;AACR,IAAA,OAAO,MAAM;AACT,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,oBAAA,CAAqB,GAAG,CAAA;AAAA,IAC5B,CAAA;AAAA,EACJ,GAAG,CAAC,MAAA,EAAQ,KAAK,QAAA,EAAU,KAAA,EAAO,OAAO,CAAC,CAAA;AAE1C,EAAA,OAAO,QAAA,GAAW,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,IAAA,CAAK,MAAM,KAAK,CAAA;AACpE;;;;;"}
@@ -0,0 +1,44 @@
1
+ import { useState, useEffect } from 'react';
2
+ import { useReducedMotion } from './useReducedMotion/index.js';
3
+ import { kitsMotion } from '../motion/index.js';
4
+
5
+ function useCountUp(target, {
6
+ duration = kitsMotion.duration.countUp,
7
+ delay = 0,
8
+ run = true,
9
+ decimals = 0
10
+ } = {}) {
11
+ const reduced = useReducedMotion();
12
+ const [value, setValue] = useState(reduced ? target : 0);
13
+ useEffect(() => {
14
+ if (reduced) {
15
+ setValue(target);
16
+ return;
17
+ }
18
+ if (!run) {
19
+ setValue(0);
20
+ return;
21
+ }
22
+ let raf = 0;
23
+ let start = null;
24
+ const step = (now) => {
25
+ if (start === null) start = now;
26
+ const progress = Math.min(1, (now - start) / duration);
27
+ const eased = 1 - Math.pow(1 - progress, 3);
28
+ setValue(target * eased);
29
+ if (progress < 1) raf = requestAnimationFrame(step);
30
+ else setValue(target);
31
+ };
32
+ const timer = setTimeout(() => {
33
+ raf = requestAnimationFrame(step);
34
+ }, delay);
35
+ return () => {
36
+ clearTimeout(timer);
37
+ cancelAnimationFrame(raf);
38
+ };
39
+ }, [target, run, duration, delay, reduced]);
40
+ return decimals > 0 ? value.toFixed(decimals) : Math.round(value);
41
+ }
42
+
43
+ export { useCountUp as default, useCountUp };
44
+ //# sourceMappingURL=useCountUp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCountUp.js","sources":["../../../src/hooks/useCountUp.ts"],"sourcesContent":["import {useEffect, useState} from \"react\";\nimport {useReducedMotion} from \"./useReducedMotion\";\nimport {kitsMotion} from \"../motion\";\n\nexport interface IUseCountUpOptions {\n /** Animation duration in ms. @default kitsMotion.duration.countUp */\n duration?: number;\n /** Delay before the count starts, in ms. @default 0 */\n delay?: number;\n /** Gate: the count runs only while true (pair with `useEnter`). While false the value stays at 0. @default true */\n run?: boolean;\n /** Decimal places; when > 0 the hook returns a fixed-point string. @default 0 */\n decimals?: number;\n}\n\n/**\n * Animates a number from 0 to `target` (ease-out cubic, rAF), landing\n * exactly on `target`. With reduced motion the target is returned\n * immediately — no animation. Formatting and locale are the caller's\n * concern (see `formatNumber`).\n */\nexport function useCountUp(\n target: number,\n {\n duration = kitsMotion.duration.countUp,\n delay = 0,\n run = true,\n decimals = 0,\n }: IUseCountUpOptions = {},\n): number | string {\n const reduced = useReducedMotion();\n const [value, setValue] = useState(reduced ? target : 0);\n\n useEffect(() => {\n if (reduced) {\n setValue(target);\n return;\n }\n if (!run) {\n setValue(0);\n return;\n }\n let raf = 0;\n let start: number | null = null;\n const step = (now: number) => {\n if (start === null) start = now;\n const progress = Math.min(1, (now - start) / duration);\n const eased = 1 - Math.pow(1 - progress, 3);\n setValue(target * eased);\n if (progress < 1) raf = requestAnimationFrame(step);\n else setValue(target);\n };\n const timer = setTimeout(() => {\n raf = requestAnimationFrame(step);\n }, delay);\n return () => {\n clearTimeout(timer);\n cancelAnimationFrame(raf);\n };\n }, [target, run, duration, delay, reduced]);\n\n return decimals > 0 ? value.toFixed(decimals) : Math.round(value);\n}\n\nexport default useCountUp;\n"],"names":[],"mappings":";;;;AAqBO,SAAS,WACZ,MAAA,EACA;AAAA,EACI,QAAA,GAAW,WAAW,QAAA,CAAS,OAAA;AAAA,EAC/B,KAAA,GAAQ,CAAA;AAAA,EACR,GAAA,GAAM,IAAA;AAAA,EACN,QAAA,GAAW;AACf,CAAA,GAAwB,EAAC,EACV;AACf,EAAA,MAAM,UAAU,gBAAA,EAAiB;AACjC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,IAAI,QAAA,CAAS,OAAA,GAAU,SAAS,CAAC,CAAA;AAEvD,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,IAAI,OAAA,EAAS;AACT,MAAA,QAAA,CAAS,MAAM,CAAA;AACf,MAAA;AAAA,IACJ;AACA,IAAA,IAAI,CAAC,GAAA,EAAK;AACN,MAAA,QAAA,CAAS,CAAC,CAAA;AACV,MAAA;AAAA,IACJ;AACA,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,IAAI,KAAA,GAAuB,IAAA;AAC3B,IAAA,MAAM,IAAA,GAAO,CAAC,GAAA,KAAgB;AAC1B,MAAA,IAAI,KAAA,KAAU,MAAM,KAAA,GAAQ,GAAA;AAC5B,MAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAA,CAAI,GAAA,GAAM,SAAS,QAAQ,CAAA;AACrD,MAAA,MAAM,QAAQ,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,UAAU,CAAC,CAAA;AAC1C,MAAA,QAAA,CAAS,SAAS,KAAK,CAAA;AACvB,MAAA,IAAI,QAAA,GAAW,CAAA,EAAG,GAAA,GAAM,qBAAA,CAAsB,IAAI,CAAA;AAAA,oBACpC,MAAM,CAAA;AAAA,IACxB,CAAA;AACA,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC3B,MAAA,GAAA,GAAM,sBAAsB,IAAI,CAAA;AAAA,IACpC,GAAG,KAAK,CAAA;AACR,IAAA,OAAO,MAAM;AACT,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,oBAAA,CAAqB,GAAG,CAAA;AAAA,IAC5B,CAAA;AAAA,EACJ,GAAG,CAAC,MAAA,EAAQ,KAAK,QAAA,EAAU,KAAA,EAAO,OAAO,CAAC,CAAA;AAE1C,EAAA,OAAO,QAAA,GAAW,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,IAAA,CAAK,MAAM,KAAK,CAAA;AACpE;;;;"}
@@ -0,0 +1,25 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var React = require('react');
6
+ var index_native = require('./useReducedMotion/index.cjs');
7
+ var index = require('../motion/index.cjs');
8
+
9
+ function useEnter(delay = 0) {
10
+ const reduced = index_native.useReducedMotion();
11
+ const [on, setOn] = React.useState(reduced);
12
+ React.useEffect(() => {
13
+ if (reduced) {
14
+ setOn(true);
15
+ return;
16
+ }
17
+ const timer = setTimeout(() => setOn(true), index.kitsMotion.enterBaseDelay + delay);
18
+ return () => clearTimeout(timer);
19
+ }, [reduced, delay]);
20
+ return on;
21
+ }
22
+
23
+ exports.default = useEnter;
24
+ exports.useEnter = useEnter;
25
+ //# sourceMappingURL=useEnter.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useEnter.cjs","sources":["../../../src/hooks/useEnter.ts"],"sourcesContent":["import {useEffect, useState} from \"react\";\nimport {useReducedMotion} from \"./useReducedMotion\";\nimport {kitsMotion} from \"../motion\";\n\n/**\n * Entrance trigger: `false` on mount, flips to `true` after\n * `kitsMotion.enterBaseDelay + delay` ms so a CSS transition can play\n * from the initial state. With reduced motion it is `true` from the first\n * render — the element appears directly in its final state.\n *\n * Replay by remounting (key change); the timer does not restart on\n * re-renders.\n */\nexport function useEnter(delay = 0): boolean {\n const reduced = useReducedMotion();\n const [on, setOn] = useState(reduced);\n\n useEffect(() => {\n if (reduced) {\n setOn(true);\n return;\n }\n const timer = setTimeout(() => setOn(true), kitsMotion.enterBaseDelay + delay);\n return () => clearTimeout(timer);\n }, [reduced, delay]);\n\n return on;\n}\n\nexport default useEnter;\n"],"names":["useReducedMotion","useState","useEffect","kitsMotion"],"mappings":";;;;;;;;AAaO,SAAS,QAAA,CAAS,QAAQ,CAAA,EAAY;AACzC,EAAA,MAAM,UAAUA,6BAAA,EAAiB;AACjC,EAAA,MAAM,CAAC,EAAA,EAAI,KAAK,CAAA,GAAIC,eAAS,OAAO,CAAA;AAEpC,EAAAC,eAAA,CAAU,MAAM;AACZ,IAAA,IAAI,OAAA,EAAS;AACT,MAAA,KAAA,CAAM,IAAI,CAAA;AACV,MAAA;AAAA,IACJ;AACA,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM,KAAA,CAAM,IAAI,CAAA,EAAGC,gBAAA,CAAW,iBAAiB,KAAK,CAAA;AAC7E,IAAA,OAAO,MAAM,aAAa,KAAK,CAAA;AAAA,EACnC,CAAA,EAAG,CAAC,OAAA,EAAS,KAAK,CAAC,CAAA;AAEnB,EAAA,OAAO,EAAA;AACX;;;;;"}
@@ -0,0 +1,20 @@
1
+ import { useState, useEffect } from 'react';
2
+ import { useReducedMotion } from './useReducedMotion/index.js';
3
+ import { kitsMotion } from '../motion/index.js';
4
+
5
+ function useEnter(delay = 0) {
6
+ const reduced = useReducedMotion();
7
+ const [on, setOn] = useState(reduced);
8
+ useEffect(() => {
9
+ if (reduced) {
10
+ setOn(true);
11
+ return;
12
+ }
13
+ const timer = setTimeout(() => setOn(true), kitsMotion.enterBaseDelay + delay);
14
+ return () => clearTimeout(timer);
15
+ }, [reduced, delay]);
16
+ return on;
17
+ }
18
+
19
+ export { useEnter as default, useEnter };
20
+ //# sourceMappingURL=useEnter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useEnter.js","sources":["../../../src/hooks/useEnter.ts"],"sourcesContent":["import {useEffect, useState} from \"react\";\nimport {useReducedMotion} from \"./useReducedMotion\";\nimport {kitsMotion} from \"../motion\";\n\n/**\n * Entrance trigger: `false` on mount, flips to `true` after\n * `kitsMotion.enterBaseDelay + delay` ms so a CSS transition can play\n * from the initial state. With reduced motion it is `true` from the first\n * render — the element appears directly in its final state.\n *\n * Replay by remounting (key change); the timer does not restart on\n * re-renders.\n */\nexport function useEnter(delay = 0): boolean {\n const reduced = useReducedMotion();\n const [on, setOn] = useState(reduced);\n\n useEffect(() => {\n if (reduced) {\n setOn(true);\n return;\n }\n const timer = setTimeout(() => setOn(true), kitsMotion.enterBaseDelay + delay);\n return () => clearTimeout(timer);\n }, [reduced, delay]);\n\n return on;\n}\n\nexport default useEnter;\n"],"names":[],"mappings":";;;;AAaO,SAAS,QAAA,CAAS,QAAQ,CAAA,EAAY;AACzC,EAAA,MAAM,UAAU,gBAAA,EAAiB;AACjC,EAAA,MAAM,CAAC,EAAA,EAAI,KAAK,CAAA,GAAI,SAAS,OAAO,CAAA;AAEpC,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,IAAI,OAAA,EAAS;AACT,MAAA,KAAA,CAAM,IAAI,CAAA;AACV,MAAA;AAAA,IACJ;AACA,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM,KAAA,CAAM,IAAI,CAAA,EAAG,UAAA,CAAW,iBAAiB,KAAK,CAAA;AAC7E,IAAA,OAAO,MAAM,aAAa,KAAK,CAAA;AAAA,EACnC,CAAA,EAAG,CAAC,OAAA,EAAS,KAAK,CAAC,CAAA;AAEnB,EAAA,OAAO,EAAA;AACX;;;;"}
@@ -0,0 +1,14 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var React = require('react');
6
+
7
+ function useMeasuredWidth() {
8
+ const ref = React.useRef(null);
9
+ return [ref, 0];
10
+ }
11
+
12
+ exports.default = useMeasuredWidth;
13
+ exports.useMeasuredWidth = useMeasuredWidth;
14
+ //# sourceMappingURL=useMeasuredWidth.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMeasuredWidth.cjs","sources":["../../../src/hooks/useMeasuredWidth.native.ts"],"sourcesContent":["import {useRef, type RefObject} from \"react\";\n\n/**\n * Native stub — the widget family is web-only for now (matches the\n * `Widgets.*` charts precedent). Always reports width 0, so measured\n * drawings render nothing on native.\n */\nexport function useMeasuredWidth<T = unknown>(): [RefObject<T | null>, number] {\n const ref = useRef<T | null>(null);\n return [ref, 0];\n}\n\nexport default useMeasuredWidth;\n"],"names":["useRef"],"mappings":";;;;;;AAOO,SAAS,gBAAA,GAA+D;AAC3E,EAAA,MAAM,GAAA,GAAMA,aAAiB,IAAI,CAAA;AACjC,EAAA,OAAO,CAAC,KAAK,CAAC,CAAA;AAClB;;;;;"}
@@ -0,0 +1,9 @@
1
+ import { useRef } from 'react';
2
+
3
+ function useMeasuredWidth() {
4
+ const ref = useRef(null);
5
+ return [ref, 0];
6
+ }
7
+
8
+ export { useMeasuredWidth as default, useMeasuredWidth };
9
+ //# sourceMappingURL=useMeasuredWidth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMeasuredWidth.js","sources":["../../../src/hooks/useMeasuredWidth.native.ts"],"sourcesContent":["import {useRef, type RefObject} from \"react\";\n\n/**\n * Native stub — the widget family is web-only for now (matches the\n * `Widgets.*` charts precedent). Always reports width 0, so measured\n * drawings render nothing on native.\n */\nexport function useMeasuredWidth<T = unknown>(): [RefObject<T | null>, number] {\n const ref = useRef<T | null>(null);\n return [ref, 0];\n}\n\nexport default useMeasuredWidth;\n"],"names":[],"mappings":";;AAOO,SAAS,gBAAA,GAA+D;AAC3E,EAAA,MAAM,GAAA,GAAM,OAAiB,IAAI,CAAA;AACjC,EAAA,OAAO,CAAC,KAAK,CAAC,CAAA;AAClB;;;;"}
@@ -0,0 +1,10 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+
5
+ const ReducedMotionContext = React.createContext(null);
6
+ const ReducedMotionProvider = ReducedMotionContext.Provider;
7
+
8
+ exports.ReducedMotionContext = ReducedMotionContext;
9
+ exports.ReducedMotionProvider = ReducedMotionProvider;
10
+ //# sourceMappingURL=context.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.cjs","sources":["../../../../src/hooks/useReducedMotion/context.ts"],"sourcesContent":["import {createContext} from \"react\";\n\n/**\n * Optional override for `useReducedMotion`. `null` (the default) means\n * \"no override — read the platform signal\". Wrap a subtree in\n * `ReducedMotionProvider` to force a value (stories and tests use this,\n * since the OS media query cannot be toggled per-story).\n */\nexport const ReducedMotionContext = createContext<boolean | null>(null);\n\nexport const ReducedMotionProvider = ReducedMotionContext.Provider;\n"],"names":["createContext"],"mappings":";;;;AAQO,MAAM,oBAAA,GAAuBA,oBAA8B,IAAI;AAE/D,MAAM,wBAAwB,oBAAA,CAAqB;;;;;"}
@@ -0,0 +1,7 @@
1
+ import { createContext } from 'react';
2
+
3
+ const ReducedMotionContext = createContext(null);
4
+ const ReducedMotionProvider = ReducedMotionContext.Provider;
5
+
6
+ export { ReducedMotionContext, ReducedMotionProvider };
7
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sources":["../../../../src/hooks/useReducedMotion/context.ts"],"sourcesContent":["import {createContext} from \"react\";\n\n/**\n * Optional override for `useReducedMotion`. `null` (the default) means\n * \"no override — read the platform signal\". Wrap a subtree in\n * `ReducedMotionProvider` to force a value (stories and tests use this,\n * since the OS media query cannot be toggled per-story).\n */\nexport const ReducedMotionContext = createContext<boolean | null>(null);\n\nexport const ReducedMotionProvider = ReducedMotionContext.Provider;\n"],"names":[],"mappings":";;AAQO,MAAM,oBAAA,GAAuB,cAA8B,IAAI;AAE/D,MAAM,wBAAwB,oBAAA,CAAqB;;;;"}
@@ -0,0 +1,13 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var context = require('./context.cjs');
5
+
6
+ function useReducedMotion() {
7
+ const override = React.useContext(context.ReducedMotionContext);
8
+ return override ?? false;
9
+ }
10
+
11
+ exports.ReducedMotionProvider = context.ReducedMotionProvider;
12
+ exports.useReducedMotion = useReducedMotion;
13
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../../../../src/hooks/useReducedMotion/index.native.ts"],"sourcesContent":["import {useContext} from \"react\";\nimport {ReducedMotionContext, ReducedMotionProvider} from \"./context\";\n\n/**\n * Native counterpart of `useReducedMotion`. The widget family is currently\n * web-only, so the platform signal (AccessibilityInfo.isReduceMotionEnabled)\n * is not wired yet — that is a future unit. Only the `ReducedMotionProvider`\n * override is honoured; without one this returns false.\n */\nexport function useReducedMotion(): boolean {\n const override = useContext(ReducedMotionContext);\n return override ?? false;\n}\n\nexport {ReducedMotionProvider};\nexport default useReducedMotion;\n"],"names":["useContext","ReducedMotionContext"],"mappings":";;;;;AASO,SAAS,gBAAA,GAA4B;AACxC,EAAA,MAAM,QAAA,GAAWA,iBAAWC,4BAAoB,CAAA;AAChD,EAAA,OAAO,QAAA,IAAY,KAAA;AACvB;;;;;"}
@@ -0,0 +1,11 @@
1
+ import { useContext } from 'react';
2
+ import { ReducedMotionContext } from './context.js';
3
+ export { ReducedMotionProvider } from './context.js';
4
+
5
+ function useReducedMotion() {
6
+ const override = useContext(ReducedMotionContext);
7
+ return override ?? false;
8
+ }
9
+
10
+ export { useReducedMotion };
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../src/hooks/useReducedMotion/index.native.ts"],"sourcesContent":["import {useContext} from \"react\";\nimport {ReducedMotionContext, ReducedMotionProvider} from \"./context\";\n\n/**\n * Native counterpart of `useReducedMotion`. The widget family is currently\n * web-only, so the platform signal (AccessibilityInfo.isReduceMotionEnabled)\n * is not wired yet — that is a future unit. Only the `ReducedMotionProvider`\n * override is honoured; without one this returns false.\n */\nexport function useReducedMotion(): boolean {\n const override = useContext(ReducedMotionContext);\n return override ?? false;\n}\n\nexport {ReducedMotionProvider};\nexport default useReducedMotion;\n"],"names":[],"mappings":";;;;AASO,SAAS,gBAAA,GAA4B;AACxC,EAAA,MAAM,QAAA,GAAW,WAAW,oBAAoB,CAAA;AAChD,EAAA,OAAO,QAAA,IAAY,KAAA;AACvB;;;;"}