@sincpro/mobile-ui 0.3.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/Dialog/BottomSheet/BottomSheet.Root.d.ts +2 -2
  2. package/dist/Dialog/BottomSheet/BottomSheet.Root.js +2 -2
  3. package/dist/Dialog/Dialog.Confirmation.js +5 -1
  4. package/dist/Dialog/Dialog.EditValue.js +1 -1
  5. package/dist/Display/Display.GradientSurface.d.ts +116 -0
  6. package/dist/Display/Display.GradientSurface.js +62 -0
  7. package/dist/Display/Display.KeyValue.js +1 -1
  8. package/dist/Display/Display.ListItem.d.ts +5 -1
  9. package/dist/Display/Display.ListItem.js +6 -2
  10. package/dist/Display/Display.Monetary.js +1 -1
  11. package/dist/Display/Display.Pattern.d.ts +26 -0
  12. package/dist/Display/Display.Pattern.js +27 -0
  13. package/dist/Display/Display.PriceTag.js +3 -3
  14. package/dist/Display/Display.Stat.js +1 -1
  15. package/dist/Display/Display.StatCard.js +1 -1
  16. package/dist/Display/index.d.ts +4 -0
  17. package/dist/Display/index.js +4 -0
  18. package/dist/Feedback/Feedback.DomainSplashScreen.js +3 -2
  19. package/dist/Feedback/Feedback.Loading.d.ts +6 -0
  20. package/dist/Feedback/Feedback.Loading.js +7 -1
  21. package/dist/Feedback/Feedback.Spinner.js +2 -1
  22. package/dist/Feedback/Feedback.Splash.d.ts +7 -1
  23. package/dist/Feedback/Feedback.Splash.js +11 -2
  24. package/dist/Feedback/Toast.context.d.ts +8 -1
  25. package/dist/Feedback/Toast.context.js +25 -23
  26. package/dist/Form/Form.Button.d.ts +4 -4
  27. package/dist/Form/Form.Button.js +19 -19
  28. package/dist/Form/Form.Checkbox.js +1 -1
  29. package/dist/Form/Form.Input.js +1 -1
  30. package/dist/Form/Form.InputField.js +1 -1
  31. package/dist/Form/Form.Switch.js +1 -1
  32. package/dist/Navigation/Navigation.AppBar.d.ts +18 -2
  33. package/dist/Navigation/Navigation.AppBar.js +48 -9
  34. package/dist/Navigation/Navigation.BottomNav.d.ts +33 -5
  35. package/dist/Navigation/Navigation.BottomNav.js +90 -17
  36. package/dist/Navigation/Navigation.SearchBar.js +7 -1
  37. package/dist/Navigation/Navigation.TabIcon.d.ts +4 -0
  38. package/dist/Navigation/Navigation.TabIcon.js +4 -0
  39. package/dist/Navigation/Navigation.TabItem.d.ts +5 -0
  40. package/dist/Navigation/Navigation.TabItem.js +5 -0
  41. package/dist/Navigation/index.d.ts +2 -2
  42. package/dist/Typography/Typography.Text.d.ts +1 -1
  43. package/dist/Typography/Typography.Text.js +16 -6
  44. package/dist/icons/OdooIcon.d.ts +5 -0
  45. package/dist/icons/OdooIcon.js +5 -0
  46. package/dist/icons/PrinterIcon.d.ts +5 -0
  47. package/dist/icons/PrinterIcon.js +5 -0
  48. package/dist/layouts/AuthContainer.js +2 -2
  49. package/dist/theme/dark.d.ts +3 -3
  50. package/dist/theme/dark.js +54 -53
  51. package/dist/theme/default.js +1 -0
  52. package/dist/theme/index.d.ts +1 -0
  53. package/dist/theme/index.js +1 -0
  54. package/dist/theme/types.d.ts +1 -0
  55. package/dist/theme/typography.d.ts +117 -60
  56. package/dist/theme/typography.js +115 -29
  57. package/dist/utils/timezone.d.ts +5 -0
  58. package/dist/views/FormViewV2.d.ts +2 -1
  59. package/dist/views/FormViewV2.js +8 -4
  60. package/dist/views/ListViewV2.context.d.ts +5 -1
  61. package/dist/views/ListViewV2.context.js +3 -1
  62. package/dist/views/ListViewV2.d.ts +7 -2
  63. package/dist/views/ListViewV2.js +18 -20
  64. package/dist/widgets/GeoPermissionCard.d.ts +5 -0
  65. package/dist/widgets/GeoPermissionCard.js +8 -3
  66. package/dist/widgets/JSONViewer.js +3 -6
  67. package/dist/widgets/TimeZoneSelector.d.ts +5 -0
  68. package/dist/widgets/TimeZoneSelector.js +6 -1
  69. package/dist/widgets/TimeZoneSelectorModal.d.ts +5 -0
  70. package/dist/widgets/TimeZoneSelectorModal.js +8 -3
  71. package/package.json +12 -7
@@ -4,13 +4,19 @@ import Pressable from "../primitives/Pressable";
4
4
  import { theme } from "../theme";
5
5
  import { cn } from "../theme/tw";
6
6
  import { Typography } from "../Typography";
7
+ import { useState } from "react";
7
8
  import { TextInput, View } from "react-native";
8
9
  /**
9
10
  * **Pill** search bar (rounded-full), 2026 style (merge of Material 3 + iOS 26).
10
11
  * Use `editable={false}` + `onPress` for a trigger that navigates to the search screen.
11
12
  */
12
13
  function SearchBar({ value, onChangeText, placeholder = "Buscar", onSubmit, onClear, autoFocus, editable = true, onPress, className, testID, }) {
13
- const body = (_jsxs(View, { className: cn("flex-row items-center gap-2 rounded-full bg-bg-muted px-4", className), style: { height: 44 }, children: [_jsx(Icon, { color: theme.icon.tertiary, name: "search", size: 18 }), editable ? (_jsx(TextInput, { autoFocus: autoFocus, className: "flex-1 text-sm text-text-primary", onChangeText: onChangeText, onSubmitEditing: (e) => onSubmit?.(e.nativeEvent.text), placeholder: placeholder, placeholderTextColor: theme.text.tertiary, returnKeyType: "search", value: value })) : (_jsx(Typography.Text, { className: "flex-1 text-text-tertiary text-sm", numberOfLines: 1, children: value || placeholder })), editable && value.length > 0 ? (_jsx(Pressable, { accessibilityLabel: "Limpiar", hitSlop: 8, onPress: () => {
14
+ const [focused, setFocused] = useState(false);
15
+ const body = (_jsxs(View, { className: cn("flex-row items-center gap-2 rounded-full px-4", focused ? "bg-bg-card" : "bg-bg-muted", className), style: {
16
+ height: 44,
17
+ borderWidth: 1,
18
+ borderColor: focused ? theme.border.focus : "transparent",
19
+ }, children: [_jsx(Icon, { color: focused ? theme.border.focus : theme.icon.tertiary, name: "search", size: 18 }), editable ? (_jsx(TextInput, { autoFocus: autoFocus, className: "flex-1 text-sm text-text-primary", onBlur: () => setFocused(false), onChangeText: onChangeText, onFocus: () => setFocused(true), onSubmitEditing: (e) => onSubmit?.(e.nativeEvent.text), placeholder: placeholder, placeholderTextColor: theme.text.tertiary, returnKeyType: "search", value: value })) : (_jsx(Typography.Text, { className: "flex-1 text-text-tertiary text-sm", numberOfLines: 1, children: value || placeholder })), editable && value.length > 0 ? (_jsx(Pressable, { accessibilityLabel: "Limpiar", hitSlop: 8, onPress: () => {
14
20
  onChangeText("");
15
21
  onClear?.();
16
22
  }, children: _jsx(Icon, { color: theme.icon.tertiary, name: "close-circle", size: 18 }) })) : null] }));
@@ -10,5 +10,9 @@ interface TabIconProps {
10
10
  name?: any;
11
11
  className?: string;
12
12
  }
13
+ /**
14
+ * @deprecated Orphan tab-bar icon piece (unused). Use `Navigation.BottomNav` (single source
15
+ * of truth for the bottom tab bar). Kept for backwards compatibility; removed in the next major.
16
+ */
13
17
  declare function TabIcon({ focused, size, customIcon, type, name, className, }: TabIconProps): import("react").JSX.Element;
14
18
  export default TabIcon;
@@ -3,6 +3,10 @@ import { Display } from "../Display";
3
3
  import { cn } from "../theme/tw";
4
4
  import { View } from "react-native";
5
5
  const Icon = Display.Icon;
6
+ /**
7
+ * @deprecated Orphan tab-bar icon piece (unused). Use `Navigation.BottomNav` (single source
8
+ * of truth for the bottom tab bar). Kept for backwards compatibility; removed in the next major.
9
+ */
6
10
  function TabIcon({ focused, size = 24, customIcon, type = "custom", name, className, }) {
7
11
  return (_jsx(View, { className: cn("justify-center items-center h-9 w-14 rounded-2xl", focused && "bg-primary shadow-sm", className), children: _jsx(Icon, { className: focused ? "text-white" : "text-text-secondary", customIcon: customIcon, name: name, size: size, type: type }) }));
8
12
  }
@@ -10,5 +10,10 @@ export interface TabIconProps {
10
10
  name?: any;
11
11
  className?: string;
12
12
  }
13
+ /**
14
+ * @deprecated Orphan tab-bar icon piece (unused). The bottom tab bar is now the single
15
+ * `Navigation.BottomNav` (configurable shape/indicator/labels/FAB). Kept for backwards
16
+ * compatibility; removed in the next major.
17
+ */
13
18
  declare const TabIcon: FC<TabIconProps>;
14
19
  export default TabIcon;
@@ -2,6 +2,11 @@ import { jsx as _jsx } from "nativewind/jsx-runtime";
2
2
  import { Display } from "../Display";
3
3
  import { cn } from "../theme/tw";
4
4
  import { View } from "react-native";
5
+ /**
6
+ * @deprecated Orphan tab-bar icon piece (unused). The bottom tab bar is now the single
7
+ * `Navigation.BottomNav` (configurable shape/indicator/labels/FAB). Kept for backwards
8
+ * compatibility; removed in the next major.
9
+ */
5
10
  const TabIcon = ({ focused, size = 24, customIcon, type = "custom", name, className, }) => {
6
11
  return (_jsx(View, { className: cn("justify-center items-center w-12 h-12 rounded-full", focused ? "bg-primary shadow-md" : "bg-transparent", className), children: _jsx(Display.Icon, { color: focused ? "#FFFFFF" : "#6B7280", customIcon: customIcon, name: name, size: size, type: type }) }));
7
12
  };
@@ -9,8 +9,8 @@ import SegmentedControl from "../Navigation/Navigation.SegmentedControl";
9
9
  import Steps from "../Navigation/Navigation.Steps";
10
10
  import TabIcon from "../Navigation/Navigation.TabIcon";
11
11
  export declare const Navigation: {
12
- AppBar: (({ title, subtitle, onBack, leading, actions, subheader, variant, border, safeArea, className, testID, }: import("../Navigation/Navigation.AppBar").AppBarProps) => import("react").JSX.Element) & {
13
- Action: ({ icon, onPress, badge, accessibilityLabel, tone, testID, }: import("../Navigation/Navigation.AppBar").AppBarActionProps) => import("react").JSX.Element;
12
+ AppBar: (({ title, subtitle, onBack, leading, actions, subheader, variant, tone, accentBar, backVariant, border, safeArea, className, testID, }: import("../Navigation/Navigation.AppBar").AppBarProps) => import("react").JSX.Element) & {
13
+ Action: ({ icon, onPress, badge, accessibilityLabel, tone, onDark, bare, testID, }: import("../Navigation/Navigation.AppBar").AppBarActionProps) => import("react").JSX.Element;
14
14
  };
15
15
  BottomNav: typeof BottomNav;
16
16
  CollapsingHeader: typeof CollapsingHeader;
@@ -9,7 +9,7 @@ import { type TextProps } from "react-native";
9
9
  *
10
10
  * Reason: Custom fonts (Montserrat) not in Tailwind, complex typography system
11
11
  *
12
- * @deprecated color prop - Use className instead: className="text-primary" or className="text-gray-600"
12
+ * @deprecated color prop - Use className instead: className="text-primary" or className="text-text-secondary"
13
13
  */
14
14
  interface AppTextProps extends TextProps {
15
15
  variant?: keyof typeof typographyVariants;
@@ -1,18 +1,28 @@
1
1
  import { jsx as _jsx } from "nativewind/jsx-runtime";
2
2
  import { cn } from "../theme/tw";
3
- import { fontFamilies, Typography, } from "../theme/typography";
3
+ import { fontFamilies, Typography, variantFontRole, } from "../theme/typography";
4
4
  import { Text } from "react-native";
5
5
  function AppText({ variant = "body", color, bold = false, italic = false, underline = false, align = "left", transform = "none", semibold = false, style, className, children, ...props }) {
6
6
  const baseStyle = Typography.variants[variant];
7
7
  const textClassName = cn("text-text-primary", align === "center" && "text-center", align === "right" && "text-right", align === "justify" && "text-justify", transform === "uppercase" && "uppercase", transform === "lowercase" && "lowercase", transform === "capitalize" && "capitalize", underline && "underline", italic && "italic", className);
8
+ // Resolve the family LIVE from the configurable registry by the variant's role, so
9
+ // `configureFonts(...)` (app/Storybook) takes effect. Falls back to the variant's baked
10
+ // family if a role is somehow missing.
11
+ const variantFamily = fontFamilies[variantFontRole[variant]] ?? baseStyle.fontFamily;
12
+ // `bold`/`semibold` map to the Inter weights — but NOT when the active family is a branded
13
+ // face (a configured title face, or Fira Code mono): those carry their own weight, so
14
+ // forcing Inter would erase the typeface. Keep the variant's family for those.
15
+ const isBrandedFace = typeof variantFamily === "string" && !variantFamily.startsWith("Inter_");
8
16
  const textStyle = {
9
17
  ...baseStyle,
10
18
  ...(color ? { color } : {}),
11
- fontFamily: bold
12
- ? fontFamilies.extraBold
13
- : semibold
14
- ? fontFamilies.semiBold
15
- : baseStyle.fontFamily,
19
+ fontFamily: isBrandedFace
20
+ ? variantFamily
21
+ : bold
22
+ ? fontFamilies.extraBold
23
+ : semibold
24
+ ? fontFamilies.semiBold
25
+ : variantFamily,
16
26
  ...(Array.isArray(style) ? Object.assign({}, ...style) : style),
17
27
  };
18
28
  return (_jsx(Text, { className: textClassName, style: textStyle, ...props, children: children }));
@@ -2,5 +2,10 @@ interface OdooIconProps {
2
2
  size?: number;
3
3
  color?: string;
4
4
  }
5
+ /**
6
+ * @deprecated Brand-coupled (Odoo logo); relocated to the Odoo integration package. Import
7
+ * from `@sincpro/mobile-odoo/ui/components/atoms` instead. Kept here for backwards
8
+ * compatibility and removed in the next major.
9
+ */
5
10
  declare function OdooIcon({ size, color }: OdooIconProps): import("react").JSX.Element;
6
11
  export default OdooIcon;
@@ -1,5 +1,10 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
2
2
  import Svg, { Path } from "react-native-svg";
3
+ /**
4
+ * @deprecated Brand-coupled (Odoo logo); relocated to the Odoo integration package. Import
5
+ * from `@sincpro/mobile-odoo/ui/components/atoms` instead. Kept here for backwards
6
+ * compatibility and removed in the next major.
7
+ */
3
8
  function OdooIcon({ size = 100, color = "#ffffff" }) {
4
9
  return (_jsxs(Svg, { fill: "none", height: size, viewBox: "0 0 919 495", width: size, children: [_jsx(Path, { d: "M695,346a75,75,0,1,1,75-75A75,75,0,0,1,695,346Zm0-31a44,44,0,1,0-44-44A44,44,0,0,0,695,315ZM538,346a75,75,0,1,1,75-75A75,75,0,0,1,538,346Zm0-31a44,44,0,1,0-44-44A44,44,0,0,0,538,315Zm-82-45c0,41.9-33.6,76-75,76s-75-34-75-75.9S336.5,196,381,196c16.4,0,31.6,3.5,44,12.6V165.1c0-8.3,7.3-15.1,15.5-15.1s15.5,6.8,15.5,15.1Zm-75,45a44,44,0,1,0-44-44A44,44,0,0,0,381,315Z", fill: color }), _jsx(Path, { d: "M224,346a75,75,0,1,1,75-75A75,75,0,0,1,224,346Zm0-31a44,44,0,1,0-44-44A44,44,0,0,0,224,315Z", fill: color })] }));
5
10
  }
@@ -1,4 +1,9 @@
1
1
  import { CustomIconProps } from "../icons/props";
2
2
  import React from "react";
3
+ /**
4
+ * @deprecated Device-coupled (printer hardware); relocated to the core. Import from
5
+ * `@sincpro/mobile/ui/components/atoms` instead. Kept here for backwards compatibility
6
+ * and removed in the next major.
7
+ */
3
8
  declare const PrinterIcon: React.FC<CustomIconProps>;
4
9
  export default PrinterIcon;
@@ -1,4 +1,9 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
2
2
  import Svg, { Path, Rect } from "react-native-svg";
3
+ /**
4
+ * @deprecated Device-coupled (printer hardware); relocated to the core. Import from
5
+ * `@sincpro/mobile/ui/components/atoms` instead. Kept here for backwards compatibility
6
+ * and removed in the next major.
7
+ */
3
8
  const PrinterIcon = ({ size = 24, color = "#000000" }) => (_jsxs(Svg, { fill: "none", height: size, viewBox: "0 0 24 24", width: size, children: [_jsx(Path, { d: "M6 9V2H18V9", stroke: color, strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2" }), _jsx(Rect, { height: "8", rx: "1", stroke: color, strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2", width: "16", x: "4", y: "9" }), _jsx(Path, { d: "M6 18H4C3.44772 18 3 17.5523 3 17V10C3 9.44772 3.44772 9 4 9H20C20.5523 9 21 9.44772 21 10V17C21 17.5523 20.5523 18 20 18H18", stroke: color, strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2" }), _jsx(Rect, { height: "6", stroke: color, strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2", width: "12", x: "6", y: "14" })] }));
4
9
  export default PrinterIcon;
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
2
2
  import { Display } from "../Display";
3
- import GradientContainer from "../layouts/GradientContainer";
3
+ import GradientSurface from "../Display/Display.GradientSurface";
4
4
  import { theme } from "../theme";
5
5
  import { cn } from "../theme/tw";
6
6
  import { Dimensions, Keyboard, TouchableOpacity, TouchableWithoutFeedback, View, } from "react-native";
@@ -8,6 +8,6 @@ import { KeyboardAwareScrollView } from "react-native-keyboard-controller";
8
8
  import { SafeAreaView } from "react-native-safe-area-context";
9
9
  function AuthContainer({ header, children, onBackPress, className }) {
10
10
  const screenHeight = Dimensions.get("window").height;
11
- return (_jsx(GradientContainer, { className: cn("flex-1", className), children: _jsx(SafeAreaView, { className: "flex-1", edges: ["top"], children: _jsxs(View, { className: "flex-1", children: [_jsx(TouchableWithoutFeedback, { onPress: Keyboard.dismiss, children: _jsxs(View, { className: "justify-center items-center relative", style: { height: screenHeight * 0.3 }, children: [onBackPress && (_jsx(TouchableOpacity, { className: "absolute top-4 left-4 p-2 z-[1]", onPress: onBackPress, children: _jsx(Display.Icon, { color: theme.text.inverse, name: "arrow-back", size: 24, type: "ionicons" }) })), header] }) }), _jsx(View, { className: "flex-1 bg-bg-card rounded-t-3xl shadow-lg", style: { minHeight: screenHeight * 0.7 }, children: _jsx(KeyboardAwareScrollView, { bottomOffset: 50, bounces: false, className: "flex-1", contentContainerClassName: "flex-grow pb-10", keyboardShouldPersistTaps: "handled", showsVerticalScrollIndicator: false, children: _jsx(View, { className: "p-4", children: children }) }) })] }) }) }));
11
+ return (_jsx(GradientSurface, { className: cn("flex-1", className), preset: "night-green", radius: "none", style: { flex: 1 }, children: _jsx(SafeAreaView, { className: "flex-1", edges: ["top"], children: _jsxs(View, { className: "flex-1", children: [_jsx(TouchableWithoutFeedback, { onPress: Keyboard.dismiss, children: _jsxs(View, { className: "justify-center items-center relative", style: { height: screenHeight * 0.3 }, children: [onBackPress && (_jsx(TouchableOpacity, { className: "absolute top-4 left-4 p-2 z-[1]", onPress: onBackPress, children: _jsx(Display.Icon, { color: theme.text.inverse, name: "arrow-back", size: 24, type: "ionicons" }) })), header] }) }), _jsx(View, { className: "flex-1 bg-bg-card rounded-t-3xl shadow-lg", style: { minHeight: screenHeight * 0.7 }, children: _jsx(KeyboardAwareScrollView, { bottomOffset: 50, bounces: false, className: "flex-1", contentContainerClassName: "flex-grow pb-10", keyboardShouldPersistTaps: "handled", showsVerticalScrollIndicator: false, children: _jsx(View, { className: "p-4", children: children }) }) })] }) }) }));
12
12
  }
13
13
  export default AuthContainer;
@@ -1,7 +1,7 @@
1
1
  import type { ThemeTokens } from "../theme/types";
2
2
  /**
3
- * Default dark theme (starting point — adjustable per app via createTheme).
4
- * Dark surfaces (slate-900/800/700), light text, brand accents preserved
5
- * and slightly more vivid for contrast on a dark background.
3
+ * SINCPRO brand-dark theme.
4
+ * Identity: black (#0B0B0B) surfaces + neon-green (#00F58C) as primary CTA / accent.
5
+ * Border/text tones shift to near-black warm neutrals (not blue-slate).
6
6
  */
7
7
  export declare const DEFAULT_DARK_THEME: ThemeTokens;
@@ -1,84 +1,85 @@
1
1
  /**
2
- * Default dark theme (starting point — adjustable per app via createTheme).
3
- * Dark surfaces (slate-900/800/700), light text, brand accents preserved
4
- * and slightly more vivid for contrast on a dark background.
2
+ * SINCPRO brand-dark theme.
3
+ * Identity: black (#0B0B0B) surfaces + neon-green (#00F58C) as primary CTA / accent.
4
+ * Border/text tones shift to near-black warm neutrals (not blue-slate).
5
5
  */
6
6
  export const DEFAULT_DARK_THEME = {
7
7
  name: "dark",
8
- primary: "#3B82F6",
9
- secondary: "#94A3B8",
10
- accent: "#FBBF24",
8
+ primary: "#00F58C", // verde neón → primary action in dark (border, link, focus indicator)
9
+ secondary: "#6B6963",
10
+ accent: "#00F58C",
11
11
  bg: {
12
- page: "#0F172A",
13
- card: "#1E293B",
14
- popover: "#1E293B",
15
- muted: "#334155",
16
- accent: "#1E3A8A",
17
- hover: "#334155",
18
- disabled: "#1E293B",
12
+ page: "#0B0B0B",
13
+ card: "#161616",
14
+ popover: "#161616",
15
+ muted: "#1E1E1E",
16
+ accent: "#0D2B1F", // dark-green tint for selected/active rows
17
+ hover: "#262626",
18
+ disabled: "#161616",
19
+ inverse: "#0B0B0B",
19
20
  },
20
21
  text: {
21
- primary: "#F1F5F9",
22
- secondary: "#CBD5E1",
23
- tertiary: "#64748B",
24
- muted: "#94A3B8",
25
- accent: "#93C5FD",
26
- inverse: "#0F172A",
27
- disabled: "#475569",
28
- onPrimary: "#FFFFFF",
29
- onSecondary: "#0F172A",
30
- onAccent: "#0F172A",
22
+ primary: "#FFFFFF",
23
+ secondary: "#B0B0B0",
24
+ tertiary: "#7D7D7D",
25
+ muted: "#9D9D9D",
26
+ accent: "#00F58C",
27
+ inverse: "#0B0B0B",
28
+ disabled: "#4A4A4A",
29
+ onPrimary: "#06170E", // texto sobre verde neón: oscuro para contraste
30
+ onSecondary: "#0B0B0B",
31
+ onAccent: "#06170E",
31
32
  onDanger: "#FFFFFF",
32
33
  onSuccess: "#FFFFFF",
33
34
  },
34
35
  icon: {
35
- primary: "#F1F5F9",
36
- secondary: "#94A3B8",
37
- tertiary: "#64748B",
38
- inverse: "#0F172A",
39
- disabled: "#475569",
36
+ primary: "#FFFFFF",
37
+ secondary: "#9A9A9A",
38
+ tertiary: "#7D7D7D",
39
+ inverse: "#0B0B0B",
40
+ disabled: "#4A4A4A",
40
41
  },
41
42
  border: {
42
- default: "#334155",
43
- light: "#1E293B",
44
- strong: "#475569",
45
- focus: "#3B82F6",
43
+ default: "#262626",
44
+ light: "#1E1E1E",
45
+ strong: "#3A3A3A",
46
+ focus: "#00F58C",
46
47
  },
47
- success: "#22C55E",
48
- warning: "#FBBF24",
49
- danger: "#EF4444",
50
- info: "#3B82F6",
51
- successLight: "#14532D",
52
- warningLight: "#78350F",
53
- dangerLight: "#7F1D1D",
54
- infoLight: "#1E3A8A",
55
- ring: "#3B82F6",
56
- input: "#334155",
48
+ success: "#00C357",
49
+ warning: "#FFB020",
50
+ danger: "#FF4D1F",
51
+ info: "#5B8DEF",
52
+ successLight: "#0D2B1A",
53
+ warningLight: "#2B1E04",
54
+ dangerLight: "#2B0A04",
55
+ infoLight: "#0A143B",
56
+ ring: "#00F58C",
57
+ input: "#262626",
57
58
  gradient: {
58
- primary: ["#3B82F6", "#1E40AF"],
59
- accent: ["#FBBF24", "#D97706"],
59
+ primary: ["#22E584", "#00F58C"], // verde gradient → primary btn en dark = CTA verde
60
+ accent: ["#22E584", "#00F58C"],
60
61
  },
61
62
  shadow: {
62
63
  sm: {
63
64
  shadowColor: "#000000",
64
65
  shadowOffset: { width: 0, height: 1 },
65
- shadowOpacity: 0.2,
66
- shadowRadius: 2,
67
- elevation: 1,
66
+ shadowOpacity: 0.4,
67
+ shadowRadius: 3,
68
+ elevation: 2,
68
69
  },
69
70
  md: {
70
71
  shadowColor: "#000000",
71
72
  shadowOffset: { width: 0, height: 4 },
72
- shadowOpacity: 0.3,
73
- shadowRadius: 6,
74
- elevation: 3,
73
+ shadowOpacity: 0.55,
74
+ shadowRadius: 8,
75
+ elevation: 4,
75
76
  },
76
77
  lg: {
77
78
  shadowColor: "#000000",
78
79
  shadowOffset: { width: 0, height: 10 },
79
- shadowOpacity: 0.4,
80
- shadowRadius: 15,
81
- elevation: 5,
80
+ shadowOpacity: 0.65,
81
+ shadowRadius: 18,
82
+ elevation: 7,
82
83
  },
83
84
  },
84
85
  };
@@ -11,6 +11,7 @@ export const DEFAULT_THEME = {
11
11
  accent: "#EFF6FF",
12
12
  hover: "#F3F4F6",
13
13
  disabled: "#F3F4F6",
14
+ inverse: "#0E1714",
14
15
  },
15
16
  text: {
16
17
  primary: "#0F172A",
@@ -6,4 +6,5 @@ export { DEFAULT_THEME } from "../theme/default";
6
6
  export { type DeepPartial, defineTheme, extendTheme, mergeTheme, } from "../theme/define";
7
7
  export { theme } from "../theme/theme";
8
8
  export type { ShadowStyle, ThemeTokens } from "../theme/types";
9
+ export { configureFonts, fontFamilies, type FontRole, resetFonts, useAppFonts, variantFontRole, } from "../theme/typography";
9
10
  export { useTheme } from "../theme/useTheme";
@@ -5,4 +5,5 @@ export { DEFAULT_DARK_THEME } from "../theme/dark";
5
5
  export { DEFAULT_THEME } from "../theme/default";
6
6
  export { defineTheme, extendTheme, mergeTheme, } from "../theme/define";
7
7
  export { theme } from "../theme/theme";
8
+ export { configureFonts, fontFamilies, resetFonts, useAppFonts, variantFontRole, } from "../theme/typography";
8
9
  export { useTheme } from "../theme/useTheme";
@@ -34,6 +34,7 @@ export interface ThemeTokens {
34
34
  accent: string;
35
35
  hover: string;
36
36
  disabled: string;
37
+ inverse?: string;
37
38
  };
38
39
  /** Text */
39
40
  text: {