@sincpro/mobile-ui 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/dist/Actions/Actions.Button.d.ts +151 -0
  2. package/dist/Actions/Actions.Button.js +217 -0
  3. package/dist/Actions/Actions.FAB.d.ts +10 -0
  4. package/dist/Actions/Actions.FAB.js +17 -0
  5. package/dist/Actions/Actions.FilterButton.d.ts +10 -0
  6. package/dist/Actions/Actions.FilterButton.js +28 -0
  7. package/dist/Actions/Actions.IconButton.d.ts +67 -0
  8. package/dist/Actions/Actions.IconButton.js +38 -0
  9. package/dist/Actions/index.d.ts +22 -0
  10. package/dist/Actions/index.js +17 -0
  11. package/dist/Dialog/BottomSheet/BottomSheet.Root.js +1 -0
  12. package/dist/Dialog/Dialog.Sheet.js +6 -4
  13. package/dist/Display/Display.CircleButton.d.ts +15 -0
  14. package/dist/Display/Display.CircleButton.js +39 -0
  15. package/dist/Display/Display.MenuButton.d.ts +51 -8
  16. package/dist/Display/Display.MenuButton.js +79 -13
  17. package/dist/Display/Display.MenuCard.d.ts +15 -0
  18. package/dist/Display/Display.MenuCard.js +24 -0
  19. package/dist/Display/Display.MenuGrid.d.ts +19 -0
  20. package/dist/Display/Display.MenuGrid.js +7 -0
  21. package/dist/Display/Display.SwipeableRow.js +2 -1
  22. package/dist/Display/Display.Tooltip.d.ts +1 -1
  23. package/dist/Display/Display.Tooltip.js +16 -5
  24. package/dist/Display/index.d.ts +9 -0
  25. package/dist/Display/index.js +6 -0
  26. package/dist/Feedback/Feedback.Empty.js +2 -2
  27. package/dist/Feedback/Feedback.Error.js +2 -2
  28. package/dist/Feedback/Feedback.Progress.js +2 -2
  29. package/dist/Feedback/Feedback.Skeleton.js +2 -2
  30. package/dist/Feedback/Feedback.Splash.js +1 -0
  31. package/dist/Form/Form.Button.d.ts +3 -151
  32. package/dist/Form/Form.Button.js +1 -283
  33. package/dist/Form/Form.FAB.d.ts +3 -10
  34. package/dist/Form/Form.FAB.js +1 -17
  35. package/dist/Form/Form.FilterButton.d.ts +3 -12
  36. package/dist/Form/Form.FilterButton.js +1 -34
  37. package/dist/Form/Form.IconButton.d.ts +3 -67
  38. package/dist/Form/Form.IconButton.js +1 -64
  39. package/dist/Navigation/Navigation.AppBar.d.ts +56 -1
  40. package/dist/Navigation/Navigation.AppBar.js +43 -12
  41. package/dist/Navigation/Navigation.BottomNav.js +2 -1
  42. package/dist/Navigation/Navigation.Header.js +3 -2
  43. package/dist/Navigation/Navigation.Menu.js +6 -3
  44. package/dist/Navigation/Navigation.MenuSection.d.ts +19 -0
  45. package/dist/Navigation/Navigation.MenuSection.js +25 -0
  46. package/dist/Navigation/Navigation.SegmentedControl.d.ts +15 -1
  47. package/dist/Navigation/Navigation.SegmentedControl.js +22 -4
  48. package/dist/Navigation/Navigation.TabIcon.js +1 -2
  49. package/dist/Navigation/Navigation.TabItem.js +2 -2
  50. package/dist/Navigation/Navigation.Tabs.d.ts +8 -3
  51. package/dist/Navigation/Navigation.Tabs.js +19 -6
  52. package/dist/Navigation/index.d.ts +7 -6
  53. package/dist/Navigation/index.js +2 -0
  54. package/dist/index.d.ts +2 -0
  55. package/dist/index.js +2 -0
  56. package/dist/layouts/BottomInset.d.ts +16 -0
  57. package/dist/layouts/BottomInset.js +17 -0
  58. package/dist/layouts/TabNavigatorLayout.js +2 -2
  59. package/dist/primitives/BaseButton.js +3 -3
  60. package/dist/theme/default.js +1 -1
  61. package/dist/views/FormViewV2.d.ts +18 -6
  62. package/dist/views/FormViewV2.js +14 -11
  63. package/dist/views/ListViewV2.d.ts +12 -1
  64. package/dist/views/ListViewV2.js +16 -10
  65. package/dist/widgets/CircleButton.d.ts +3 -19
  66. package/dist/widgets/CircleButton.js +1 -41
  67. package/dist/widgets/JSONViewer.js +7 -7
  68. package/dist/widgets/MenuCard.d.ts +3 -13
  69. package/dist/widgets/MenuCard.js +1 -8
  70. package/dist/widgets/MenuGrid.d.ts +5 -17
  71. package/dist/widgets/MenuGrid.js +1 -6
  72. package/dist/widgets/MenuSection.d.ts +3 -0
  73. package/dist/widgets/MenuSection.js +1 -0
  74. package/dist/widgets/PromoBanner.d.ts +38 -0
  75. package/dist/widgets/PromoBanner.js +61 -0
  76. package/dist/widgets/PromoModal.d.ts +41 -0
  77. package/dist/widgets/PromoModal.js +75 -0
  78. package/dist/widgets/QuickActions.d.ts +26 -0
  79. package/dist/widgets/QuickActions.js +41 -0
  80. package/dist/widgets/index.d.ts +11 -1
  81. package/dist/widgets/index.js +4 -0
  82. package/package.json +2 -1
@@ -0,0 +1,75 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
2
+ import GradientSurface from "../Display/Display.GradientSurface";
3
+ import { useTheme } from "../theme";
4
+ import { Typography } from "../Typography";
5
+ import { Modal, TouchableOpacity, TouchableWithoutFeedback, View } from "react-native";
6
+ import { useSafeAreaInsets } from "react-native-safe-area-context";
7
+ /**
8
+ * Bottom-anchored modal for news, promotions, or announcements.
9
+ * Tapping outside (backdrop) also dismisses it.
10
+ *
11
+ * Usage:
12
+ * <PromoModal
13
+ * visible={showPromo}
14
+ * onDismiss={() => setShowPromo(false)}
15
+ * title="Nueva función disponible"
16
+ * body="Ahora puedes filtrar rutas por color directamente desde el panel principal."
17
+ * badge="Novedad"
18
+ * headerGradient={["#022B14", "#065E2B"]}
19
+ * icon={BellIcon}
20
+ * ctaLabel="Explorar"
21
+ * onPressCta={handleExplore}
22
+ * />
23
+ */
24
+ export function PromoModal({ visible, onDismiss, title, body, icon: Icon, headerGradient, ctaLabel, onPressCta, dismissLabel = "Ahora no", badge, accentColor, }) {
25
+ const theme = useTheme();
26
+ const insets = useSafeAreaInsets();
27
+ const accent = accentColor ?? theme.accent;
28
+ return (_jsxs(Modal, { animationType: "fade", onRequestClose: onDismiss, statusBarTranslucent: true, transparent: true, visible: visible, children: [_jsx(TouchableWithoutFeedback, { onPress: onDismiss, children: _jsx(View, { style: {
29
+ flex: 1,
30
+ backgroundColor: "rgba(0,0,0,0.55)",
31
+ alignItems: "center",
32
+ justifyContent: "center",
33
+ paddingHorizontal: 24,
34
+ paddingVertical: insets.top + 16,
35
+ } }) }), _jsx(View, { pointerEvents: "box-none", style: {
36
+ position: "absolute",
37
+ top: 0,
38
+ left: 0,
39
+ right: 0,
40
+ bottom: 0,
41
+ alignItems: "center",
42
+ justifyContent: "center",
43
+ paddingHorizontal: 24,
44
+ }, children: _jsxs(View, { style: {
45
+ backgroundColor: theme.bg.card,
46
+ borderRadius: 28,
47
+ borderWidth: 1,
48
+ borderColor: theme.border.default,
49
+ width: "100%",
50
+ maxWidth: 400,
51
+ overflow: "hidden",
52
+ }, children: [headerGradient || Icon ? (_jsxs(View, { style: { height: 120, justifyContent: "center", alignItems: "center" }, children: [headerGradient ? (_jsx(GradientSurface, { colors: headerGradient, padding: "none", radius: "none", style: { position: "absolute", top: 0, left: 0, right: 0, bottom: 0 } })) : null, Icon ? (_jsx(View, { style: {
53
+ width: 64,
54
+ height: 64,
55
+ borderRadius: 20,
56
+ backgroundColor: "rgba(255,255,255,0.18)",
57
+ alignItems: "center",
58
+ justifyContent: "center",
59
+ }, children: _jsx(Icon, { color: "#FFFFFF", size: 32 }) })) : null] })) : null, _jsxs(View, { style: { paddingHorizontal: 24, paddingTop: 12, paddingBottom: 8 }, children: [badge ? (_jsx(View, { style: {
60
+ alignSelf: "flex-start",
61
+ backgroundColor: accent,
62
+ borderRadius: 999,
63
+ paddingHorizontal: 12,
64
+ paddingVertical: 4,
65
+ marginBottom: 12,
66
+ }, children: _jsx(Typography.Text, { semibold: true, style: { color: theme.text.onAccent, fontSize: 11 }, variant: "caption", children: badge }) })) : null, _jsx(Typography.Text, { semibold: true, style: { color: theme.text.primary }, variant: "h3", children: title }), body ? (_jsx(Typography.Text, { style: { color: theme.text.secondary, marginTop: 8, lineHeight: 22 }, variant: "body", children: body })) : null] }), _jsxs(View, { style: { paddingHorizontal: 24, paddingTop: 16, gap: 10 }, children: [ctaLabel ? (_jsx(TouchableOpacity, { activeOpacity: 0.8, onPress: () => {
67
+ onPressCta?.();
68
+ onDismiss();
69
+ }, style: {
70
+ backgroundColor: accent,
71
+ borderRadius: 14,
72
+ paddingVertical: 15,
73
+ alignItems: "center",
74
+ }, children: _jsx(Typography.Text, { semibold: true, style: { color: theme.text.onAccent }, variant: "body", children: ctaLabel }) })) : null, _jsx(TouchableOpacity, { activeOpacity: 0.7, onPress: onDismiss, style: { alignItems: "center", paddingVertical: 12 }, children: _jsx(Typography.Text, { style: { color: theme.text.secondary }, variant: "body", children: dismissLabel }) })] })] }) })] }));
75
+ }
@@ -0,0 +1,26 @@
1
+ import { ComponentType } from "react";
2
+ export interface QuickActionItem {
3
+ id: string;
4
+ label: string;
5
+ /** Ionicon name — use this OR `customIcon`. */
6
+ icon?: string;
7
+ customIcon?: ComponentType<{
8
+ size?: number;
9
+ color?: string;
10
+ }>;
11
+ badge?: string | number;
12
+ onPress?: () => void;
13
+ /** Circle background color override. Defaults to `theme.bg.muted`. */
14
+ color?: string;
15
+ }
16
+ export interface QuickActionsProps {
17
+ items: QuickActionItem[];
18
+ /** Section heading rendered above the row. */
19
+ title?: string;
20
+ }
21
+ /**
22
+ * Horizontal scrollable row of small icon+label shortcuts ("Acciones Rápidas").
23
+ * Each item renders a 48 px icon circle + optional badge + label below.
24
+ * Scroll is horizontal and indicator-free for a clean look.
25
+ */
26
+ export declare function QuickActions({ items, title }: QuickActionsProps): import("react").JSX.Element;
@@ -0,0 +1,41 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
2
+ import Icon from "../Display/Display.Icon";
3
+ import { useTheme } from "../theme";
4
+ import { Typography } from "../Typography";
5
+ import { ScrollView, TouchableOpacity, View } from "react-native";
6
+ /**
7
+ * Horizontal scrollable row of small icon+label shortcuts ("Acciones Rápidas").
8
+ * Each item renders a 48 px icon circle + optional badge + label below.
9
+ * Scroll is horizontal and indicator-free for a clean look.
10
+ */
11
+ export function QuickActions({ items, title }) {
12
+ const theme = useTheme();
13
+ return (_jsxs(View, { children: [title ? (_jsx(Typography.Text, { semibold: true, style: { color: theme.text.secondary, marginBottom: 10, paddingHorizontal: 16 }, variant: "caption", children: title.toUpperCase() })) : null, _jsx(ScrollView, { contentContainerStyle: { paddingHorizontal: 12, gap: 4 }, horizontal: true, showsHorizontalScrollIndicator: false, children: items.map((item) => (_jsxs(TouchableOpacity, { activeOpacity: 0.7, onPress: item.onPress, style: { alignItems: "center", width: 72, paddingVertical: 4 }, children: [_jsx(View, { style: {
14
+ width: 52,
15
+ height: 52,
16
+ borderRadius: 999,
17
+ backgroundColor: item.color ?? theme.bg.muted,
18
+ alignItems: "center",
19
+ justifyContent: "center",
20
+ borderWidth: 1,
21
+ borderColor: theme.border.default,
22
+ }, children: _jsx(Icon, { color: theme.text.primary, customIcon: item.customIcon, name: item.icon, size: 24, type: item.customIcon ? "custom" : "ionicons" }) }), item.badge != null ? (_jsx(View, { style: {
23
+ position: "absolute",
24
+ top: 2,
25
+ right: 4,
26
+ minWidth: 18,
27
+ height: 18,
28
+ borderRadius: 999,
29
+ backgroundColor: theme.danger,
30
+ alignItems: "center",
31
+ justifyContent: "center",
32
+ paddingHorizontal: 4,
33
+ borderWidth: 2,
34
+ borderColor: theme.bg.card,
35
+ }, children: _jsx(Typography.Text, { style: { color: "#FFFFFF", fontSize: 9, lineHeight: 11 }, children: item.badge }) })) : null, _jsx(Typography.Text, { numberOfLines: 2, style: {
36
+ color: theme.text.primary,
37
+ marginTop: 6,
38
+ textAlign: "center",
39
+ fontSize: 11,
40
+ }, variant: "caption", children: item.label })] }, item.id))) })] }));
41
+ }
@@ -2,6 +2,16 @@ export { CircleButton } from "../widgets/CircleButton";
2
2
  export { default as GeoPermissionCard } from "../widgets/GeoPermissionCard";
3
3
  export { HomeHeader } from "../widgets/HomeHeader";
4
4
  export { MenuCard } from "../widgets/MenuCard";
5
- export type { MenuItem } from "../widgets/MenuGrid";
5
+ export type { MenuGridItem, MenuGridProps } from "../widgets/MenuGrid";
6
+ /** @deprecated Renamed to `MenuGridItem`. */
7
+ export type { MenuGridItem as MenuItem } from "../widgets/MenuGrid";
6
8
  export { MenuGrid } from "../widgets/MenuGrid";
9
+ export type { MenuSectionProps } from "../widgets/MenuSection";
10
+ export { MenuSection } from "../widgets/MenuSection";
11
+ export type { PromoBannerItem, PromoBannerProps, } from "../widgets/PromoBanner";
12
+ export { PromoBanner } from "../widgets/PromoBanner";
13
+ export type { PromoModalProps } from "../widgets/PromoModal";
14
+ export { PromoModal } from "../widgets/PromoModal";
15
+ export type { QuickActionItem, QuickActionsProps, } from "../widgets/QuickActions";
16
+ export { QuickActions } from "../widgets/QuickActions";
7
17
  export { TimeZoneSelector } from "../widgets/TimeZoneSelector";
@@ -3,4 +3,8 @@ export { default as GeoPermissionCard } from "../widgets/GeoPermissionCard";
3
3
  export { HomeHeader } from "../widgets/HomeHeader";
4
4
  export { MenuCard } from "../widgets/MenuCard";
5
5
  export { MenuGrid } from "../widgets/MenuGrid";
6
+ export { MenuSection } from "../widgets/MenuSection";
7
+ export { PromoBanner } from "../widgets/PromoBanner";
8
+ export { PromoModal } from "../widgets/PromoModal";
9
+ export { QuickActions } from "../widgets/QuickActions";
6
10
  export { TimeZoneSelector } from "../widgets/TimeZoneSelector";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sincpro/mobile-ui",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "description": "Sincpro Mobile design system: generic, presentational React Native components (no domain logic)",
5
5
  "main": "expo/AppEntry.js",
6
6
  "types": "./dist/index.d.ts",
@@ -18,6 +18,7 @@
18
18
  "./Dialog": "./dist/Dialog/index.js",
19
19
  "./Dialog/BottomSheet": "./dist/Dialog/BottomSheet/index.js",
20
20
  "./Dialog/Sheet": "./dist/Dialog/Dialog.Sheet.js",
21
+ "./Actions": "./dist/Actions/index.js",
21
22
  "./Display": "./dist/Display/index.js",
22
23
  "./Feedback": "./dist/Feedback/index.js",
23
24
  "./Form": "./dist/Form/index.js",