@sesionario/blocks 1.41.0 → 1.42.0-rc.2

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.
package/dist/index.cjs CHANGED
@@ -14,9 +14,9 @@ var DialogPrimitive = require('@radix-ui/react-dialog');
14
14
  var nextThemes = require('next-themes');
15
15
  var framerMotion = require('framer-motion');
16
16
  var DropdownMenuPrimitive = require('@radix-ui/react-dropdown-menu');
17
+ var vaul = require('vaul');
17
18
  var SliderPrimitive = require('@radix-ui/react-slider');
18
19
  var TogglePrimitive = require('@radix-ui/react-toggle');
19
- var vaul = require('vaul');
20
20
  var PopoverPrimitive = require('@radix-ui/react-popover');
21
21
  var cmdk = require('cmdk');
22
22
  var RPNInput = require('react-phone-number-input');
@@ -1949,50 +1949,6 @@ function DropdownMenuShortcut({
1949
1949
  }
1950
1950
  );
1951
1951
  }
1952
- function DropdownMenuSub({
1953
- ...props
1954
- }) {
1955
- return /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuPrimitive__namespace.Sub, { "data-slot": "dropdown-menu-sub", ...props });
1956
- }
1957
- function DropdownMenuSubTrigger({
1958
- className,
1959
- inset,
1960
- children,
1961
- ...props
1962
- }) {
1963
- return /* @__PURE__ */ jsxRuntime.jsxs(
1964
- DropdownMenuPrimitive__namespace.SubTrigger,
1965
- {
1966
- "data-slot": "dropdown-menu-sub-trigger",
1967
- "data-inset": inset,
1968
- className: cn(
1969
- "flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden data-[inset]:pl-8 data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground data-[highlighted]:[&_svg:not([class*='text-'])]:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground data-[state=open]:[&_svg:not([class*='text-'])]:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:[&_svg:not([class*='text-'])]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
1970
- className
1971
- ),
1972
- ...props,
1973
- children: [
1974
- children,
1975
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "ml-auto size-4" })
1976
- ]
1977
- }
1978
- );
1979
- }
1980
- function DropdownMenuSubContent({
1981
- className,
1982
- ...props
1983
- }) {
1984
- return /* @__PURE__ */ jsxRuntime.jsx(
1985
- DropdownMenuPrimitive__namespace.SubContent,
1986
- {
1987
- "data-slot": "dropdown-menu-sub-content",
1988
- className: cn(
1989
- "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg",
1990
- className
1991
- ),
1992
- ...props
1993
- }
1994
- );
1995
- }
1996
1952
  var defaultLabels = {
1997
1953
  theme: "Theme",
1998
1954
  system: "System",
@@ -2751,6 +2707,181 @@ function VerifiedProfessionalBadge({
2751
2707
  }
2752
2708
  );
2753
2709
  }
2710
+ function useMediaQuery(query) {
2711
+ const [matches, setMatches] = React2.useState(false);
2712
+ React2.useEffect(() => {
2713
+ if (typeof window === "undefined" || !window.matchMedia) return;
2714
+ const mql = window.matchMedia(query);
2715
+ const onChange = () => setMatches(mql.matches);
2716
+ onChange();
2717
+ mql.addEventListener("change", onChange);
2718
+ return () => mql.removeEventListener("change", onChange);
2719
+ }, [query]);
2720
+ return matches;
2721
+ }
2722
+ function Drawer({
2723
+ repositionInputs = false,
2724
+ ...props
2725
+ }) {
2726
+ return /* @__PURE__ */ jsxRuntime.jsx(
2727
+ vaul.Drawer.Root,
2728
+ {
2729
+ "data-slot": "drawer",
2730
+ repositionInputs,
2731
+ ...props
2732
+ }
2733
+ );
2734
+ }
2735
+ function DrawerPortal({
2736
+ ...props
2737
+ }) {
2738
+ return /* @__PURE__ */ jsxRuntime.jsx(vaul.Drawer.Portal, { "data-slot": "drawer-portal", ...props });
2739
+ }
2740
+ function DrawerClose({
2741
+ ...props
2742
+ }) {
2743
+ return /* @__PURE__ */ jsxRuntime.jsx(vaul.Drawer.Close, { "data-slot": "drawer-close", ...props });
2744
+ }
2745
+ function DrawerOverlay({
2746
+ className,
2747
+ ...props
2748
+ }) {
2749
+ return /* @__PURE__ */ jsxRuntime.jsx(
2750
+ vaul.Drawer.Overlay,
2751
+ {
2752
+ "data-slot": "drawer-overlay",
2753
+ className: cn(
2754
+ "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50 dark:bg-black/80",
2755
+ className
2756
+ ),
2757
+ ...props
2758
+ }
2759
+ );
2760
+ }
2761
+ function DrawerContent({
2762
+ className,
2763
+ children,
2764
+ ...props
2765
+ }) {
2766
+ return /* @__PURE__ */ jsxRuntime.jsxs(DrawerPortal, { "data-slot": "drawer-portal", children: [
2767
+ /* @__PURE__ */ jsxRuntime.jsx(DrawerOverlay, {}),
2768
+ /* @__PURE__ */ jsxRuntime.jsxs(
2769
+ vaul.Drawer.Content,
2770
+ {
2771
+ "data-slot": "drawer-content",
2772
+ className: cn(
2773
+ "group/drawer-content bg-background fixed z-50 flex h-auto flex-col",
2774
+ "data-[vaul-drawer-direction=top]:inset-x-0 data-[vaul-drawer-direction=top]:top-0 data-[vaul-drawer-direction=top]:mb-24 data-[vaul-drawer-direction=top]:max-h-[80vh] data-[vaul-drawer-direction=top]:rounded-b-lg data-[vaul-drawer-direction=top]:border-b",
2775
+ "data-[vaul-drawer-direction=bottom]:inset-x-0 data-[vaul-drawer-direction=bottom]:bottom-0 data-[vaul-drawer-direction=bottom]:mt-24 data-[vaul-drawer-direction=bottom]:max-h-[80vh] data-[vaul-drawer-direction=bottom]:rounded-t-lg data-[vaul-drawer-direction=bottom]:border-t",
2776
+ "data-[vaul-drawer-direction=right]:inset-y-0 data-[vaul-drawer-direction=right]:right-0 data-[vaul-drawer-direction=right]:w-3/4 data-[vaul-drawer-direction=right]:border-l data-[vaul-drawer-direction=right]:sm:max-w-sm",
2777
+ "data-[vaul-drawer-direction=left]:inset-y-0 data-[vaul-drawer-direction=left]:left-0 data-[vaul-drawer-direction=left]:w-3/4 data-[vaul-drawer-direction=left]:border-r data-[vaul-drawer-direction=left]:sm:max-w-sm",
2778
+ className
2779
+ ),
2780
+ ...props,
2781
+ children: [
2782
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "bg-muted mx-auto mt-4 hidden h-2 w-[100px] shrink-0 rounded-full group-data-[vaul-drawer-direction=bottom]/drawer-content:block" }),
2783
+ children
2784
+ ]
2785
+ }
2786
+ )
2787
+ ] });
2788
+ }
2789
+ function DrawerHeader({ className, ...props }) {
2790
+ return /* @__PURE__ */ jsxRuntime.jsx(
2791
+ "div",
2792
+ {
2793
+ "data-slot": "drawer-header",
2794
+ className: cn(
2795
+ "flex flex-col gap-0.5 p-4 group-data-[vaul-drawer-direction=bottom]/drawer-content:text-center group-data-[vaul-drawer-direction=top]/drawer-content:text-center md:gap-1.5 md:text-left",
2796
+ className
2797
+ ),
2798
+ ...props
2799
+ }
2800
+ );
2801
+ }
2802
+ function DrawerFooter({ className, ...props }) {
2803
+ return /* @__PURE__ */ jsxRuntime.jsx(
2804
+ "div",
2805
+ {
2806
+ "data-slot": "drawer-footer",
2807
+ className: cn("mt-auto flex flex-col gap-2 p-4", className),
2808
+ ...props
2809
+ }
2810
+ );
2811
+ }
2812
+ function DrawerTitle({
2813
+ className,
2814
+ ...props
2815
+ }) {
2816
+ return /* @__PURE__ */ jsxRuntime.jsx(
2817
+ vaul.Drawer.Title,
2818
+ {
2819
+ "data-slot": "drawer-title",
2820
+ className: cn("text-foreground font-semibold", className),
2821
+ ...props
2822
+ }
2823
+ );
2824
+ }
2825
+ var ResponsiveMenuSurfaceContext = React2.createContext("dropdown");
2826
+ function useResponsiveMenuSurface() {
2827
+ return React2.useContext(ResponsiveMenuSurfaceContext);
2828
+ }
2829
+ function ResponsiveMenu({
2830
+ trigger,
2831
+ children,
2832
+ open,
2833
+ onOpenChange,
2834
+ title,
2835
+ align = "end",
2836
+ side,
2837
+ sideOffset,
2838
+ contentClassName,
2839
+ drawerClassName
2840
+ }) {
2841
+ const isMobile = useMediaQuery("(max-width: 767px)");
2842
+ if (isMobile) {
2843
+ const triggerNode = React2.isValidElement(trigger) ? React2.cloneElement(trigger, {
2844
+ onClick: (event) => {
2845
+ const original = trigger.props.onClick;
2846
+ original?.(event);
2847
+ if (!event.defaultPrevented) {
2848
+ onOpenChange(true);
2849
+ }
2850
+ }
2851
+ }) : /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => onOpenChange(true), children: trigger });
2852
+ return /* @__PURE__ */ jsxRuntime.jsxs(ResponsiveMenuSurfaceContext.Provider, { value: "drawer", children: [
2853
+ triggerNode,
2854
+ /* @__PURE__ */ jsxRuntime.jsx(Drawer, { open, onOpenChange, children: /* @__PURE__ */ jsxRuntime.jsxs(
2855
+ DrawerContent,
2856
+ {
2857
+ className: cn(
2858
+ "mx-auto flex max-h-[90vh] max-w-lg flex-col",
2859
+ drawerClassName
2860
+ ),
2861
+ "data-testid": "responsive-menu-drawer",
2862
+ children: [
2863
+ title ? /* @__PURE__ */ jsxRuntime.jsx(DrawerHeader, { className: "text-left", children: /* @__PURE__ */ jsxRuntime.jsx(DrawerTitle, { children: title }) }) : /* @__PURE__ */ jsxRuntime.jsx(DrawerHeader, { className: "sr-only", children: /* @__PURE__ */ jsxRuntime.jsx(DrawerTitle, { children: "Menu" }) }),
2864
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-h-0 flex-1 overflow-y-auto p-1 pb-4", children })
2865
+ ]
2866
+ }
2867
+ ) })
2868
+ ] });
2869
+ }
2870
+ return /* @__PURE__ */ jsxRuntime.jsx(ResponsiveMenuSurfaceContext.Provider, { value: "dropdown", children: /* @__PURE__ */ jsxRuntime.jsxs(DropdownMenu, { open, onOpenChange, children: [
2871
+ /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuTrigger, { asChild: true, children: trigger }),
2872
+ /* @__PURE__ */ jsxRuntime.jsx(
2873
+ DropdownMenuContent,
2874
+ {
2875
+ align,
2876
+ side,
2877
+ sideOffset,
2878
+ className: contentClassName,
2879
+ "data-testid": "responsive-menu-dropdown",
2880
+ children
2881
+ }
2882
+ )
2883
+ ] }) });
2884
+ }
2754
2885
  var defaultLabels3 = {
2755
2886
  accountMenu: "Account menu",
2756
2887
  settingsMenu: "Settings",
@@ -2771,6 +2902,8 @@ var defaultLabels3 = {
2771
2902
  accountSettings: "Account settings"
2772
2903
  };
2773
2904
  var PLATFORM_ACCOUNT_ORG_COLLAPSE_AT = 4;
2905
+ var menuItemClassName = "relative flex w-full cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive";
2906
+ var radioItemClassName = "relative flex w-full cursor-default select-none items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0";
2774
2907
  function mergePlatformAccountOrgs(memberOrgs, manageableOrgs) {
2775
2908
  const manageableIds = new Set(manageableOrgs.map((org) => org.id));
2776
2909
  const byId = /* @__PURE__ */ new Map();
@@ -2794,6 +2927,82 @@ function mergePlatformAccountOrgs(memberOrgs, manageableOrgs) {
2794
2927
  }
2795
2928
  return Array.from(byId.values());
2796
2929
  }
2930
+ function PlatformAccountMenuItem({
2931
+ className,
2932
+ inset,
2933
+ variant = "default",
2934
+ disabled,
2935
+ asChild = false,
2936
+ onSelect,
2937
+ children,
2938
+ onClick
2939
+ }) {
2940
+ const surface = useResponsiveMenuSurface();
2941
+ if (surface === "dropdown") {
2942
+ return /* @__PURE__ */ jsxRuntime.jsx(
2943
+ DropdownMenuItem,
2944
+ {
2945
+ className,
2946
+ inset,
2947
+ variant,
2948
+ disabled,
2949
+ asChild,
2950
+ onSelect: (event) => {
2951
+ onSelect?.(event);
2952
+ },
2953
+ onClick,
2954
+ children
2955
+ }
2956
+ );
2957
+ }
2958
+ const Comp = asChild ? reactSlot.Slot : "button";
2959
+ return /* @__PURE__ */ jsxRuntime.jsx(
2960
+ Comp,
2961
+ {
2962
+ type: asChild ? void 0 : "button",
2963
+ role: "menuitem",
2964
+ "data-slot": "dropdown-menu-item",
2965
+ "data-inset": inset || void 0,
2966
+ "data-variant": variant,
2967
+ "data-disabled": disabled || void 0,
2968
+ disabled: asChild ? void 0 : disabled,
2969
+ "aria-disabled": disabled || void 0,
2970
+ className: cn(menuItemClassName, className),
2971
+ onClick: (event) => {
2972
+ if (disabled) {
2973
+ event.preventDefault();
2974
+ return;
2975
+ }
2976
+ onClick?.(event);
2977
+ onSelect?.({ preventDefault: () => void 0 });
2978
+ },
2979
+ children
2980
+ }
2981
+ );
2982
+ }
2983
+ function AccountMenuLabel({
2984
+ className,
2985
+ children
2986
+ }) {
2987
+ const surface = useResponsiveMenuSurface();
2988
+ if (surface === "dropdown") {
2989
+ return /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuLabel, { className, children });
2990
+ }
2991
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("px-2 py-1.5 text-sm font-medium", className), children });
2992
+ }
2993
+ function AccountMenuSeparator({ className }) {
2994
+ const surface = useResponsiveMenuSurface();
2995
+ if (surface === "dropdown") {
2996
+ return /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuSeparator, { className });
2997
+ }
2998
+ return /* @__PURE__ */ jsxRuntime.jsx(
2999
+ "div",
3000
+ {
3001
+ role: "separator",
3002
+ className: cn("bg-border -mx-1 my-1 h-px", className)
3003
+ }
3004
+ );
3005
+ }
2797
3006
  function MenuAvatar({
2798
3007
  name,
2799
3008
  image,
@@ -2823,7 +3032,7 @@ function MenuAvatar({
2823
3032
  }
2824
3033
  );
2825
3034
  }
2826
- function LanguageThemeSubs({
3035
+ function LanguageThemeExpand({
2827
3036
  languages,
2828
3037
  currentLanguage,
2829
3038
  onLanguageChange,
@@ -2831,32 +3040,76 @@ function LanguageThemeSubs({
2831
3040
  }) {
2832
3041
  const { theme, setTheme } = nextThemes.useTheme();
2833
3042
  const themeValue = theme ?? "system";
2834
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2835
- /* @__PURE__ */ jsxRuntime.jsxs(DropdownMenuSub, { children: [
2836
- /* @__PURE__ */ jsxRuntime.jsxs(DropdownMenuSubTrigger, { className: "gap-2 [&>svg:last-child]:ml-0", children: [
2837
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1 truncate", children: labels.language }),
2838
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Languages, { className: "size-4" })
2839
- ] }),
2840
- /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuSubContent, { className: "min-w-40", children: /* @__PURE__ */ jsxRuntime.jsx(
2841
- DropdownMenuRadioGroup,
3043
+ const surface = useResponsiveMenuSurface();
3044
+ const [languageOpen, setLanguageOpen] = React2.useState(false);
3045
+ const [themeOpen, setThemeOpen] = React2.useState(false);
3046
+ function renderRadioOptions(value, onValueChange, options) {
3047
+ if (surface === "dropdown") {
3048
+ return /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuRadioGroup, { value, onValueChange, children: options.map((option) => /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuRadioItem, { value: option.value, children: option.label }, option.value)) });
3049
+ }
3050
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { role: "group", children: options.map((option) => {
3051
+ const checked = value === option.value;
3052
+ return /* @__PURE__ */ jsxRuntime.jsxs(
3053
+ "button",
2842
3054
  {
2843
- value: currentLanguage,
2844
- onValueChange: onLanguageChange,
2845
- children: languages.map((lang) => /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuRadioItem, { value: lang.key, children: lang.nativeName }, lang.key))
2846
- }
2847
- ) })
2848
- ] }),
2849
- /* @__PURE__ */ jsxRuntime.jsxs(DropdownMenuSub, { children: [
2850
- /* @__PURE__ */ jsxRuntime.jsxs(DropdownMenuSubTrigger, { className: "gap-2 [&>svg:last-child]:ml-0", children: [
2851
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1 truncate", children: labels.theme }),
2852
- themeValue === "light" ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Sun, { className: "size-4" }) : themeValue === "dark" ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Moon, { className: "size-4" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Monitor, { className: "size-4" })
2853
- ] }),
2854
- /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuSubContent, { className: "min-w-40", children: /* @__PURE__ */ jsxRuntime.jsxs(DropdownMenuRadioGroup, { value: themeValue, onValueChange: setTheme, children: [
2855
- /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuRadioItem, { value: "system", children: labels.themeSystem }),
2856
- /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuRadioItem, { value: "light", children: labels.themeLight }),
2857
- /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuRadioItem, { value: "dark", children: labels.themeDark })
2858
- ] }) })
2859
- ] })
3055
+ type: "button",
3056
+ role: "menuitemradio",
3057
+ "aria-checked": checked,
3058
+ className: radioItemClassName,
3059
+ onClick: () => onValueChange(option.value),
3060
+ children: [
3061
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", children: checked ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "size-4" }) : null }),
3062
+ option.label
3063
+ ]
3064
+ },
3065
+ option.value
3066
+ );
3067
+ }) });
3068
+ }
3069
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3070
+ /* @__PURE__ */ jsxRuntime.jsxs(
3071
+ PlatformAccountMenuItem,
3072
+ {
3073
+ className: "gap-2",
3074
+ onSelect: (event) => {
3075
+ event.preventDefault();
3076
+ setLanguageOpen((open) => !open);
3077
+ },
3078
+ children: [
3079
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1 truncate", children: labels.language }),
3080
+ languageOpen ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronUp, { className: "size-4" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { className: "size-4" }),
3081
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Languages, { className: "size-4" })
3082
+ ]
3083
+ }
3084
+ ),
3085
+ languageOpen ? renderRadioOptions(
3086
+ currentLanguage,
3087
+ onLanguageChange,
3088
+ languages.map((lang) => ({
3089
+ value: lang.key,
3090
+ label: lang.nativeName
3091
+ }))
3092
+ ) : null,
3093
+ /* @__PURE__ */ jsxRuntime.jsxs(
3094
+ PlatformAccountMenuItem,
3095
+ {
3096
+ className: "gap-2",
3097
+ onSelect: (event) => {
3098
+ event.preventDefault();
3099
+ setThemeOpen((open) => !open);
3100
+ },
3101
+ children: [
3102
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1 truncate", children: labels.theme }),
3103
+ themeOpen ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronUp, { className: "size-4" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { className: "size-4" }),
3104
+ themeValue === "light" ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Sun, { className: "size-4" }) : themeValue === "dark" ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Moon, { className: "size-4" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Monitor, { className: "size-4" })
3105
+ ]
3106
+ }
3107
+ ),
3108
+ themeOpen ? renderRadioOptions(themeValue, setTheme, [
3109
+ { value: "system", label: labels.themeSystem },
3110
+ { value: "light", label: labels.themeLight },
3111
+ { value: "dark", label: labels.themeDark }
3112
+ ]) : null
2860
3113
  ] });
2861
3114
  }
2862
3115
  function OrgMenuRows({
@@ -2887,7 +3140,7 @@ function OrgMenuRows({
2887
3140
  "data-testid": `platform-account-org-${org.id}`,
2888
3141
  children: [
2889
3142
  /* @__PURE__ */ jsxRuntime.jsx(
2890
- DropdownMenuItem,
3143
+ PlatformAccountMenuItem,
2891
3144
  {
2892
3145
  asChild: true,
2893
3146
  className: cn("gap-2", org.canManage && "pr-9"),
@@ -2905,7 +3158,7 @@ function OrgMenuRows({
2905
3158
  }
2906
3159
  ),
2907
3160
  org.canManage ? /* @__PURE__ */ jsxRuntime.jsx(
2908
- DropdownMenuItem,
3161
+ PlatformAccountMenuItem,
2909
3162
  {
2910
3163
  asChild: true,
2911
3164
  className: "absolute right-0.5 top-1/2 size-7 -translate-y-1/2 justify-center p-0",
@@ -2918,7 +3171,7 @@ function OrgMenuRows({
2918
3171
  );
2919
3172
  }),
2920
3173
  collapsible ? /* @__PURE__ */ jsxRuntime.jsxs(
2921
- DropdownMenuItem,
3174
+ PlatformAccountMenuItem,
2922
3175
  {
2923
3176
  className: "gap-2",
2924
3177
  onSelect: (event) => {
@@ -2958,6 +3211,7 @@ function PlatformAccountMenu({
2958
3211
  className
2959
3212
  }) {
2960
3213
  const labels = { ...defaultLabels3, ...labelsProp };
3214
+ const [open, setOpen] = React2.useState(false);
2961
3215
  const [signingOut, setSigningOut] = React2.useState(false);
2962
3216
  const mergedOrgs = React2.useMemo(
2963
3217
  () => mergePlatformAccountOrgs(memberOrgs, manageableOrgs),
@@ -3008,120 +3262,180 @@ function PlatformAccountMenu({
3008
3262
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Settings, { className: "size-4" })
3009
3263
  }
3010
3264
  );
3011
- return /* @__PURE__ */ jsxRuntime.jsxs(DropdownMenu, { children: [
3012
- /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuTrigger, { asChild: true, children: triggerProp ?? defaultTrigger }),
3013
- /* @__PURE__ */ jsxRuntime.jsx(
3014
- DropdownMenuContent,
3015
- {
3016
- side: contentSide,
3017
- align: contentAlign,
3018
- sideOffset: contentSideOffset,
3019
- className: cn("min-w-60 rounded-lg", contentClassName),
3020
- children: user ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3021
- /* @__PURE__ */ jsxRuntime.jsxs(DropdownMenuLabel, { className: "flex items-center gap-3 p-2 font-normal", children: [
3022
- /* @__PURE__ */ jsxRuntime.jsx(
3023
- MenuAvatar,
3024
- {
3025
- name: user.name,
3026
- image: user.image,
3027
- sizeClass: "size-9"
3028
- }
3029
- ),
3030
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-col", children: [
3031
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 items-center gap-1.5 truncate text-sm font-medium leading-tight", children: [
3032
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: user.name }),
3033
- variant === "platform" ? /* @__PURE__ */ jsxRuntime.jsx(
3034
- VerifiedProfessionalBadge,
3035
- {
3036
- status: verificationStatus,
3037
- professionLabel,
3038
- className: "shrink-0"
3039
- }
3040
- ) : null
3041
- ] }),
3042
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate text-xs text-muted-foreground leading-tight", children: user.email })
3043
- ] })
3044
- ] }),
3045
- /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuSeparator, {}),
3046
- variant === "platform" ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3047
- hasOrgs ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3048
- /* @__PURE__ */ jsxRuntime.jsx(
3049
- OrgMenuRows,
3050
- {
3051
- orgs: mergedOrgs,
3052
- appUrl: urls.appUrl,
3053
- adminUrl: urls.adminUrl,
3054
- labels
3055
- }
3056
- ),
3057
- /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuSeparator, {})
3058
- ] }) : null,
3059
- /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuItem, { asChild: true, className: "gap-2", children: /* @__PURE__ */ jsxRuntime.jsxs("a", { href: accountHref, children: [
3060
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1 truncate", children: labels.personalProfile }),
3061
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.User, { className: "size-4" })
3062
- ] }) }),
3063
- /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuItem, { asChild: true, className: "gap-2", children: /* @__PURE__ */ jsxRuntime.jsxs("a", { href: activityHref, children: [
3064
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1 truncate", children: labels.activity }),
3065
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Activity, { className: "size-4" })
3066
- ] }) }),
3067
- /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuItem, { asChild: true, className: "gap-2", children: /* @__PURE__ */ jsxRuntime.jsxs("a", { href: profileHref, children: [
3068
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1 truncate", children: labels.professionalProfile }),
3069
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.User, { className: "size-4" })
3070
- ] }) }),
3071
- extraItems,
3072
- /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuSeparator, {})
3073
- ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3074
- /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuItem, { asChild: true, className: "gap-2", children: /* @__PURE__ */ jsxRuntime.jsxs("a", { href: accountHref, children: [
3075
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1 truncate", children: labels.accountSettings }),
3076
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Settings, { className: "size-4" })
3077
- ] }) }),
3078
- extraItems,
3079
- /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuSeparator, {})
3080
- ] }),
3265
+ return /* @__PURE__ */ jsxRuntime.jsx(
3266
+ ResponsiveMenu,
3267
+ {
3268
+ open,
3269
+ onOpenChange: setOpen,
3270
+ trigger: triggerProp ?? defaultTrigger,
3271
+ align: contentAlign,
3272
+ side: contentSide,
3273
+ sideOffset: contentSideOffset,
3274
+ contentClassName: cn("min-w-60 rounded-lg", contentClassName),
3275
+ title: user ? labels.accountMenu : labels.settingsMenu,
3276
+ children: user ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3277
+ /* @__PURE__ */ jsxRuntime.jsxs(AccountMenuLabel, { className: "flex items-center gap-3 p-2 font-normal", children: [
3081
3278
  /* @__PURE__ */ jsxRuntime.jsx(
3082
- LanguageThemeSubs,
3279
+ MenuAvatar,
3083
3280
  {
3084
- languages,
3085
- currentLanguage,
3086
- onLanguageChange,
3087
- labels
3281
+ name: user.name,
3282
+ image: user.image,
3283
+ sizeClass: "size-9"
3088
3284
  }
3089
3285
  ),
3090
- /* @__PURE__ */ jsxRuntime.jsxs(
3091
- DropdownMenuItem,
3092
- {
3093
- variant: "destructive",
3094
- className: "gap-2",
3095
- disabled: signingOut || !onSignOut,
3096
- onSelect: (event) => {
3097
- event.preventDefault();
3098
- void handleSignOut();
3099
- },
3100
- children: [
3101
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1 truncate", children: signingOut ? labels.signingOut : labels.signOut }),
3102
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.LogOut, { className: "size-4" })
3103
- ]
3104
- }
3105
- )
3286
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-col", children: [
3287
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 items-center gap-1.5 truncate text-sm font-medium leading-tight", children: [
3288
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: user.name }),
3289
+ variant === "platform" ? /* @__PURE__ */ jsxRuntime.jsx(
3290
+ VerifiedProfessionalBadge,
3291
+ {
3292
+ status: verificationStatus,
3293
+ professionLabel,
3294
+ className: "shrink-0"
3295
+ }
3296
+ ) : null
3297
+ ] }),
3298
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate text-xs text-muted-foreground leading-tight", children: user.email })
3299
+ ] })
3300
+ ] }),
3301
+ /* @__PURE__ */ jsxRuntime.jsx(AccountMenuSeparator, {}),
3302
+ variant === "platform" ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3303
+ hasOrgs ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3304
+ /* @__PURE__ */ jsxRuntime.jsx(
3305
+ OrgMenuRows,
3306
+ {
3307
+ orgs: mergedOrgs,
3308
+ appUrl: urls.appUrl,
3309
+ adminUrl: urls.adminUrl,
3310
+ labels
3311
+ }
3312
+ ),
3313
+ /* @__PURE__ */ jsxRuntime.jsx(AccountMenuSeparator, {})
3314
+ ] }) : null,
3315
+ /* @__PURE__ */ jsxRuntime.jsx(PlatformAccountMenuItem, { asChild: true, className: "gap-2", children: /* @__PURE__ */ jsxRuntime.jsxs("a", { href: accountHref, children: [
3316
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1 truncate", children: labels.personalProfile }),
3317
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.User, { className: "size-4" })
3318
+ ] }) }),
3319
+ /* @__PURE__ */ jsxRuntime.jsx(PlatformAccountMenuItem, { asChild: true, className: "gap-2", children: /* @__PURE__ */ jsxRuntime.jsxs("a", { href: activityHref, children: [
3320
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1 truncate", children: labels.activity }),
3321
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Activity, { className: "size-4" })
3322
+ ] }) }),
3323
+ /* @__PURE__ */ jsxRuntime.jsx(PlatformAccountMenuItem, { asChild: true, className: "gap-2", children: /* @__PURE__ */ jsxRuntime.jsxs("a", { href: profileHref, children: [
3324
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1 truncate", children: labels.professionalProfile }),
3325
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.User, { className: "size-4" })
3326
+ ] }) }),
3327
+ extraItems,
3328
+ /* @__PURE__ */ jsxRuntime.jsx(AccountMenuSeparator, {})
3106
3329
  ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3107
- /* @__PURE__ */ jsxRuntime.jsx(
3108
- LanguageThemeSubs,
3109
- {
3110
- languages,
3111
- currentLanguage,
3112
- onLanguageChange,
3113
- labels
3114
- }
3115
- ),
3116
- /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuSeparator, {}),
3117
- /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuItem, { asChild: true, className: "gap-2", children: /* @__PURE__ */ jsxRuntime.jsxs("a", { href: loginHref, children: [
3118
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1 truncate", children: labels.signIn }),
3119
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.LogIn, { className: "size-4" })
3120
- ] }) })
3121
- ] })
3122
- }
3123
- )
3124
- ] });
3330
+ /* @__PURE__ */ jsxRuntime.jsx(PlatformAccountMenuItem, { asChild: true, className: "gap-2", children: /* @__PURE__ */ jsxRuntime.jsxs("a", { href: accountHref, children: [
3331
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1 truncate", children: labels.accountSettings }),
3332
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Settings, { className: "size-4" })
3333
+ ] }) }),
3334
+ extraItems,
3335
+ /* @__PURE__ */ jsxRuntime.jsx(AccountMenuSeparator, {})
3336
+ ] }),
3337
+ /* @__PURE__ */ jsxRuntime.jsx(
3338
+ LanguageThemeExpand,
3339
+ {
3340
+ languages,
3341
+ currentLanguage,
3342
+ onLanguageChange,
3343
+ labels
3344
+ }
3345
+ ),
3346
+ /* @__PURE__ */ jsxRuntime.jsxs(
3347
+ PlatformAccountMenuItem,
3348
+ {
3349
+ variant: "destructive",
3350
+ className: "gap-2",
3351
+ disabled: signingOut || !onSignOut,
3352
+ onSelect: (event) => {
3353
+ event.preventDefault();
3354
+ void handleSignOut();
3355
+ },
3356
+ children: [
3357
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1 truncate", children: signingOut ? labels.signingOut : labels.signOut }),
3358
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.LogOut, { className: "size-4" })
3359
+ ]
3360
+ }
3361
+ )
3362
+ ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3363
+ /* @__PURE__ */ jsxRuntime.jsx(
3364
+ LanguageThemeExpand,
3365
+ {
3366
+ languages,
3367
+ currentLanguage,
3368
+ onLanguageChange,
3369
+ labels
3370
+ }
3371
+ ),
3372
+ /* @__PURE__ */ jsxRuntime.jsx(AccountMenuSeparator, {}),
3373
+ /* @__PURE__ */ jsxRuntime.jsx(PlatformAccountMenuItem, { asChild: true, className: "gap-2", children: /* @__PURE__ */ jsxRuntime.jsxs("a", { href: loginHref, children: [
3374
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1 truncate", children: labels.signIn }),
3375
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.LogIn, { className: "size-4" })
3376
+ ] }) })
3377
+ ] })
3378
+ }
3379
+ );
3380
+ }
3381
+ function defaultFormatTime(isoDate, language) {
3382
+ return new Date(isoDate).toLocaleString(
3383
+ language === "es" ? "es-ES" : "en-US",
3384
+ {
3385
+ dateStyle: "short",
3386
+ timeStyle: "short"
3387
+ }
3388
+ );
3389
+ }
3390
+ function NotificationInbox({
3391
+ notifications,
3392
+ labels,
3393
+ language = "es",
3394
+ formatTime,
3395
+ viewAllHref,
3396
+ renderLeading,
3397
+ emptyIcon: EmptyIcon = lucideReact.Bell,
3398
+ className,
3399
+ listClassName
3400
+ }) {
3401
+ const surface = useResponsiveMenuSurface();
3402
+ const format = formatTime ?? ((iso) => defaultFormatTime(iso, language));
3403
+ return /* @__PURE__ */ jsxRuntime.jsxs(
3404
+ "div",
3405
+ {
3406
+ className: cn("flex flex-col", className),
3407
+ "data-testid": "notification-inbox",
3408
+ children: [
3409
+ surface === "dropdown" ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-between border-b px-4 py-3", children: /* @__PURE__ */ jsxRuntime.jsx("h4", { className: "font-semibold", children: labels.title }) }) : null,
3410
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("max-h-80 overflow-y-auto", listClassName), children: notifications.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(EmptyState, { variant: "compact", icon: EmptyIcon, title: labels.empty }) : /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex flex-col", children: notifications.map((notification, index) => {
3411
+ const leading = renderLeading?.(notification) ?? null;
3412
+ const body = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3413
+ leading,
3414
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1 space-y-1", children: [
3415
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-medium leading-none", children: notification.title }),
3416
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "line-clamp-2 text-xs text-muted-foreground", children: notification.message }),
3417
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground/70", children: format(notification.createdAt) })
3418
+ ] })
3419
+ ] });
3420
+ const rowClass = cn(
3421
+ "flex gap-3 px-4 py-3",
3422
+ !notification.read && "bg-muted/30",
3423
+ notification.link && "transition-colors hover:bg-muted/50",
3424
+ index < notifications.length - 1 && "border-b"
3425
+ );
3426
+ return /* @__PURE__ */ jsxRuntime.jsx("li", { children: notification.link ? /* @__PURE__ */ jsxRuntime.jsx("a", { href: notification.link, className: rowClass, children: body }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: rowClass, children: body }) }, notification.id);
3427
+ }) }) }),
3428
+ viewAllHref && labels.viewAll ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "border-t px-4 py-2", children: /* @__PURE__ */ jsxRuntime.jsx(
3429
+ "a",
3430
+ {
3431
+ href: viewAllHref,
3432
+ className: "block text-center text-sm font-medium text-primary hover:underline",
3433
+ children: labels.viewAll
3434
+ }
3435
+ ) }) : null
3436
+ ]
3437
+ }
3438
+ );
3125
3439
  }
3126
3440
  function Slider({
3127
3441
  className,
@@ -3729,110 +4043,7 @@ function AvatarEditor({
3729
4043
  }
3730
4044
  );
3731
4045
  }
3732
- function Drawer({
3733
- repositionInputs = false,
3734
- ...props
3735
- }) {
3736
- return /* @__PURE__ */ jsxRuntime.jsx(
3737
- vaul.Drawer.Root,
3738
- {
3739
- "data-slot": "drawer",
3740
- repositionInputs,
3741
- ...props
3742
- }
3743
- );
3744
- }
3745
- function DrawerPortal({
3746
- ...props
3747
- }) {
3748
- return /* @__PURE__ */ jsxRuntime.jsx(vaul.Drawer.Portal, { "data-slot": "drawer-portal", ...props });
3749
- }
3750
- function DrawerClose({
3751
- ...props
3752
- }) {
3753
- return /* @__PURE__ */ jsxRuntime.jsx(vaul.Drawer.Close, { "data-slot": "drawer-close", ...props });
3754
- }
3755
- function DrawerOverlay({
3756
- className,
3757
- ...props
3758
- }) {
3759
- return /* @__PURE__ */ jsxRuntime.jsx(
3760
- vaul.Drawer.Overlay,
3761
- {
3762
- "data-slot": "drawer-overlay",
3763
- className: cn(
3764
- "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50 dark:bg-black/80",
3765
- className
3766
- ),
3767
- ...props
3768
- }
3769
- );
3770
- }
3771
- function DrawerContent({
3772
- className,
3773
- children,
3774
- ...props
3775
- }) {
3776
- return /* @__PURE__ */ jsxRuntime.jsxs(DrawerPortal, { "data-slot": "drawer-portal", children: [
3777
- /* @__PURE__ */ jsxRuntime.jsx(DrawerOverlay, {}),
3778
- /* @__PURE__ */ jsxRuntime.jsxs(
3779
- vaul.Drawer.Content,
3780
- {
3781
- "data-slot": "drawer-content",
3782
- className: cn(
3783
- "group/drawer-content bg-background fixed z-50 flex h-auto flex-col",
3784
- "data-[vaul-drawer-direction=top]:inset-x-0 data-[vaul-drawer-direction=top]:top-0 data-[vaul-drawer-direction=top]:mb-24 data-[vaul-drawer-direction=top]:max-h-[80vh] data-[vaul-drawer-direction=top]:rounded-b-lg data-[vaul-drawer-direction=top]:border-b",
3785
- "data-[vaul-drawer-direction=bottom]:inset-x-0 data-[vaul-drawer-direction=bottom]:bottom-0 data-[vaul-drawer-direction=bottom]:mt-24 data-[vaul-drawer-direction=bottom]:max-h-[80vh] data-[vaul-drawer-direction=bottom]:rounded-t-lg data-[vaul-drawer-direction=bottom]:border-t",
3786
- "data-[vaul-drawer-direction=right]:inset-y-0 data-[vaul-drawer-direction=right]:right-0 data-[vaul-drawer-direction=right]:w-3/4 data-[vaul-drawer-direction=right]:border-l data-[vaul-drawer-direction=right]:sm:max-w-sm",
3787
- "data-[vaul-drawer-direction=left]:inset-y-0 data-[vaul-drawer-direction=left]:left-0 data-[vaul-drawer-direction=left]:w-3/4 data-[vaul-drawer-direction=left]:border-r data-[vaul-drawer-direction=left]:sm:max-w-sm",
3788
- className
3789
- ),
3790
- ...props,
3791
- children: [
3792
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "bg-muted mx-auto mt-4 hidden h-2 w-[100px] shrink-0 rounded-full group-data-[vaul-drawer-direction=bottom]/drawer-content:block" }),
3793
- children
3794
- ]
3795
- }
3796
- )
3797
- ] });
3798
- }
3799
- function DrawerHeader({ className, ...props }) {
3800
- return /* @__PURE__ */ jsxRuntime.jsx(
3801
- "div",
3802
- {
3803
- "data-slot": "drawer-header",
3804
- className: cn(
3805
- "flex flex-col gap-0.5 p-4 group-data-[vaul-drawer-direction=bottom]/drawer-content:text-center group-data-[vaul-drawer-direction=top]/drawer-content:text-center md:gap-1.5 md:text-left",
3806
- className
3807
- ),
3808
- ...props
3809
- }
3810
- );
3811
- }
3812
- function DrawerFooter({ className, ...props }) {
3813
- return /* @__PURE__ */ jsxRuntime.jsx(
3814
- "div",
3815
- {
3816
- "data-slot": "drawer-footer",
3817
- className: cn("mt-auto flex flex-col gap-2 p-4", className),
3818
- ...props
3819
- }
3820
- );
3821
- }
3822
- function DrawerTitle({
3823
- className,
3824
- ...props
3825
- }) {
3826
- return /* @__PURE__ */ jsxRuntime.jsx(
3827
- vaul.Drawer.Title,
3828
- {
3829
- "data-slot": "drawer-title",
3830
- className: cn("text-foreground font-semibold", className),
3831
- ...props
3832
- }
3833
- );
3834
- }
3835
- function useMediaQuery(query) {
4046
+ function useMediaQuery2(query) {
3836
4047
  const [matches, setMatches] = React2.useState(false);
3837
4048
  React2.useEffect(() => {
3838
4049
  const media = window.matchMedia(query);
@@ -3867,7 +4078,7 @@ function AvatarEditorDialog({
3867
4078
  const [editedValue, setEditedValue] = React2.useState(value ?? null);
3868
4079
  const [isSaving, setIsSaving] = React2.useState(false);
3869
4080
  const [feedback, setFeedback] = React2.useState(null);
3870
- const isMobile = useMediaQuery("(max-width: 640px)");
4081
+ const isMobile = useMediaQuery2("(max-width: 640px)");
3871
4082
  const caption = (placeholder ?? "").trim();
3872
4083
  const handleOpenChange = React2.useCallback(
3873
4084
  (open) => {
@@ -4813,18 +5024,6 @@ function useDebouncedValueStrict(value, delayMs) {
4813
5024
  }, [value, delayMs]);
4814
5025
  return debounced;
4815
5026
  }
4816
- function useMediaQuery2(query) {
4817
- const [matches, setMatches] = React2.useState(false);
4818
- React2.useEffect(() => {
4819
- if (typeof window === "undefined" || !window.matchMedia) return;
4820
- const mql = window.matchMedia(query);
4821
- const onChange = () => setMatches(mql.matches);
4822
- onChange();
4823
- mql.addEventListener("change", onChange);
4824
- return () => mql.removeEventListener("change", onChange);
4825
- }, [query]);
4826
- return matches;
4827
- }
4828
5027
  function readMetrics() {
4829
5028
  if (typeof window === "undefined") {
4830
5029
  return { height: 0, offsetTop: 0, keyboardInset: 0 };
@@ -5753,7 +5952,7 @@ function SearchablePicker(props) {
5753
5952
  const mode = props.mode ?? "single";
5754
5953
  const labels = { ...defaultLabels4, ...userLabels };
5755
5954
  const resolvedEmptyLabel = emptyLabel ?? labels.emptyOption;
5756
- const isMobile = useMediaQuery2("(max-width: 767px)");
5955
+ const isMobile = useMediaQuery("(max-width: 767px)");
5757
5956
  const generatedId = React2.useId();
5758
5957
  const triggerId = id ?? generatedId;
5759
5958
  const [uncontrolledOpen, setUncontrolledOpen] = React2.useState(false);
@@ -6469,6 +6668,59 @@ var FlagComponent = ({ country, countryName }) => {
6469
6668
  return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex h-4 w-6 overflow-hidden rounded-sm bg-foreground/20 [&_svg:not([class*='size-'])]:size-full", children: Flag2 && /* @__PURE__ */ jsxRuntime.jsx(Flag2, { title: countryName }) });
6470
6669
  };
6471
6670
 
6671
+ // src/lib/rfc.ts
6672
+ var RFC_PERSONA_FISICA_RE = /^[A-ZÑ&]{4}\d{6}[A-Z0-9]{2}[0-9A]$/;
6673
+ var RFC_PERSONA_MORAL_RE = /^[A-ZÑ&]{3}\d{6}[A-Z0-9]{2}[0-9A]$/;
6674
+ var RFC_INPUT_CHARS_RE = /[^A-ZÑ&0-9]/g;
6675
+ function normalizeRfc(rfc) {
6676
+ return rfc.trim().toUpperCase().replace(/\s|-/g, "");
6677
+ }
6678
+ function formatRfcInput(raw, kind = "both") {
6679
+ const cleaned = raw.toUpperCase().replace(RFC_INPUT_CHARS_RE, "");
6680
+ const max = kind === "moral" ? 12 : 13;
6681
+ return cleaned.slice(0, max);
6682
+ }
6683
+ function isValidPersonaFisicaRfc(rfc) {
6684
+ const value = normalizeRfc(rfc);
6685
+ return value.length === 13 && RFC_PERSONA_FISICA_RE.test(value);
6686
+ }
6687
+ function isValidPersonaMoralRfc(rfc) {
6688
+ const value = normalizeRfc(rfc);
6689
+ return value.length === 12 && RFC_PERSONA_MORAL_RE.test(value);
6690
+ }
6691
+ function isValidRfc(rfc) {
6692
+ return isValidPersonaFisicaRfc(rfc) || isValidPersonaMoralRfc(rfc);
6693
+ }
6694
+ var RfcInput = React2__namespace.forwardRef(
6695
+ ({
6696
+ className,
6697
+ value,
6698
+ onChange,
6699
+ kind = "both",
6700
+ autoComplete = "off",
6701
+ ...props
6702
+ }, ref) => {
6703
+ const maxLength = kind === "moral" ? 12 : 13;
6704
+ return /* @__PURE__ */ jsxRuntime.jsx(
6705
+ Input,
6706
+ {
6707
+ ...props,
6708
+ ref,
6709
+ type: "text",
6710
+ autoCapitalize: "characters",
6711
+ autoCorrect: "off",
6712
+ spellCheck: false,
6713
+ autoComplete,
6714
+ maxLength,
6715
+ value,
6716
+ className: cn("uppercase tracking-wide", className),
6717
+ onChange: (event) => onChange(formatRfcInput(event.target.value, kind))
6718
+ }
6719
+ );
6720
+ }
6721
+ );
6722
+ RfcInput.displayName = "RfcInput";
6723
+
6472
6724
  // src/data/mexicoStates.ts
6473
6725
  var MEXICO_STATES = [
6474
6726
  { id: "MXAGU", name: "Aguascalientes" },
@@ -7988,7 +8240,7 @@ function SupportMessengerProvider({
7988
8240
  searchThreshold = 8,
7989
8241
  className
7990
8242
  }) {
7991
- const isMobile = useMediaQuery2("(max-width: 767px)");
8243
+ const isMobile = useMediaQuery("(max-width: 767px)");
7992
8244
  const { height: viewportHeight, keyboardInset } = useVisualViewportMetrics();
7993
8245
  const dockRef = React2.useRef(null);
7994
8246
  const [listOpen, setListOpen] = React2.useState(false);
@@ -9190,12 +9442,16 @@ exports.MessageScrollerItem = MessageScrollerItem;
9190
9442
  exports.MessageScrollerProvider = MessageScrollerProvider;
9191
9443
  exports.MessageScrollerViewport = MessageScrollerViewport;
9192
9444
  exports.MexicoMap = MexicoMap;
9445
+ exports.NotificationInbox = NotificationInbox;
9193
9446
  exports.OrgSwitcher = OrgSwitcher;
9194
9447
  exports.PLATFORM_ACCOUNT_ORG_COLLAPSE_AT = PLATFORM_ACCOUNT_ORG_COLLAPSE_AT;
9195
9448
  exports.PaymentIcon = PaymentIcon;
9196
9449
  exports.PhoneInput = PhoneInput;
9197
9450
  exports.PlatformAccountMenu = PlatformAccountMenu;
9451
+ exports.PlatformAccountMenuItem = PlatformAccountMenuItem;
9198
9452
  exports.PlatformNavbar = PlatformNavbar;
9453
+ exports.ResponsiveMenu = ResponsiveMenu;
9454
+ exports.RfcInput = RfcInput;
9199
9455
  exports.SafeImage = SafeImage;
9200
9456
  exports.ScrollRestorationProvider = ScrollRestorationProvider;
9201
9457
  exports.SearchCommand = SearchCommand;
@@ -9214,14 +9470,19 @@ exports.cn = cn;
9214
9470
  exports.createSupportChatClient = createSupportChatClient;
9215
9471
  exports.defaultLanguages = defaultLanguages;
9216
9472
  exports.formatPaymentCardBrand = formatPaymentCardBrand;
9473
+ exports.formatRfcInput = formatRfcInput;
9217
9474
  exports.fuzzyMatch = fuzzyMatch;
9218
9475
  exports.getAvatarColors = getAvatarColors;
9219
9476
  exports.getInitials = getInitials;
9220
9477
  exports.insertAtCaret = insertAtCaret;
9478
+ exports.isValidPersonaFisicaRfc = isValidPersonaFisicaRfc;
9479
+ exports.isValidPersonaMoralRfc = isValidPersonaMoralRfc;
9480
+ exports.isValidRfc = isValidRfc;
9221
9481
  exports.markerVariants = markerVariants;
9222
9482
  exports.mergePlatformAccountOrgs = mergePlatformAccountOrgs;
9223
9483
  exports.normalizeEmojiQuery = normalizeEmojiQuery;
9224
9484
  exports.normalizePaymentCardBrand = normalizePaymentCardBrand;
9485
+ exports.normalizeRfc = normalizeRfc;
9225
9486
  exports.paymentIconBrandFromStripe = paymentIconBrandFromStripe;
9226
9487
  exports.paymentTypeFromStripeBrand = paymentTypeFromStripeBrand;
9227
9488
  exports.prefersReducedMotion = prefersReducedMotion;
@@ -9229,9 +9490,10 @@ exports.useDebouncedValue = useDebouncedValue;
9229
9490
  exports.useDebouncedValueStrict = useDebouncedValueStrict;
9230
9491
  exports.useEditableSection = useEditableSection;
9231
9492
  exports.useLanguageContext = useLanguageContext;
9232
- exports.useMediaQuery = useMediaQuery2;
9493
+ exports.useMediaQuery = useMediaQuery;
9233
9494
  exports.useRealtimeChannel = useRealtimeChannel;
9234
9495
  exports.useRegisterScrollContainer = useRegisterScrollContainer;
9496
+ exports.useResponsiveMenuSurface = useResponsiveMenuSurface;
9235
9497
  exports.useRestorableState = useRestorableState;
9236
9498
  exports.useScrollFadeXEdges = useScrollFadeXEdges;
9237
9499
  exports.useScrollRestorationContext = useScrollRestorationContext;