UNPKG

@frank-auth/react

Version:

Flexible and customizable React UI components for Frank Authentication

1 lines 21.1 kB
{"version":3,"file":"loading-spinner.cjs","sources":["../../../../../src/components/auth/common/loading-spinner.tsx"],"sourcesContent":["/**\n * @frank-auth/react - Loading Spinner Component\n *\n * Versatile loading component with multiple variants and customization options.\n * Supports organization theming and various loading states.\n */\n\n\"use client\";\n\nimport { Spinner } from \"@/components/ui\";\nimport { motion } from \"framer-motion\";\nimport React from \"react\";\nimport { useConfig } from \"../../../hooks/use-config\";\nimport { useTheme } from \"../../../hooks/use-theme\";\n\n// ============================================================================\n// Loading Spinner Interface\n// ============================================================================\n\nexport interface LoadingSpinnerProps {\n\t/**\n\t * Loading variant\n\t */\n\tvariant?: \"spinner\" | \"dots\" | \"pulse\" | \"bars\" | \"custom\";\n\n\t/**\n\t * Size of the loading component\n\t */\n\tsize?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n\n\t/**\n\t * Color theme\n\t */\n\tcolor?:\n\t\t| \"primary\"\n\t\t| \"secondary\"\n\t\t| \"success\"\n\t\t| \"warning\"\n\t\t| \"danger\"\n\t\t| \"default\";\n\n\t/**\n\t * Loading text\n\t */\n\ttext?: string;\n\n\t/**\n\t * Whether to show text\n\t */\n\tshowText?: boolean;\n\n\t/**\n\t * Text position relative to spinner\n\t */\n\ttextPosition?: \"top\" | \"bottom\" | \"left\" | \"right\";\n\n\t/**\n\t * Whether to center the component\n\t */\n\tcentered?: boolean;\n\n\t/**\n\t * Whether to show as overlay\n\t */\n\toverlay?: boolean;\n\n\t/**\n\t * Custom className\n\t */\n\tclassName?: string;\n\n\t/**\n\t * Custom loading content\n\t */\n\tchildren?: React.ReactNode;\n\n\t/**\n\t * Animation duration (in seconds)\n\t */\n\tduration?: number;\n\n\t/**\n\t * Whether to show backdrop\n\t */\n\tbackdrop?: boolean;\n\n\t/**\n\t * Backdrop opacity\n\t */\n\tbackdropOpacity?: number;\n}\n\n// ============================================================================\n// Loading Variants\n// ============================================================================\n\nconst SpinnerVariant = ({\n\tsize,\n\tcolor,\n\tduration = 1,\n}: { size: string; color: string; duration?: number }) => (\n\t<motion.div\n\t\tclassName={`border-2 border-transparent border-t-current border-r-current rounded-full ${size}`}\n\t\tanimate={{ rotate: 360 }}\n\t\ttransition={{ duration, repeat: Number.POSITIVE_INFINITY, ease: \"linear\" }}\n\t\tstyle={{ color: `var(--${color})` }}\n\t/>\n);\n\nconst DotsVariant = ({\n\tsize,\n\tcolor,\n\tduration = 1.4,\n}: { size: string; color: string; duration?: number }) => {\n\tconst dotSizes = {\n\t\t\"w-2 h-2\": \"w-2 h-2\",\n\t\t\"w-3 h-3\": \"w-3 h-3\",\n\t\t\"w-4 h-4\": \"w-4 h-4\",\n\t\t\"w-6 h-6\": \"w-6 h-6\",\n\t};\n\n\tconst dotSize = dotSizes[size as keyof typeof dotSizes] || \"w-3 h-3\";\n\n\treturn (\n\t\t<div className=\"flex gap-1\">\n\t\t\t{[0, 1, 2].map((index) => (\n\t\t\t\t<motion.div\n\t\t\t\t\tkey={index}\n\t\t\t\t\tclassName={`${dotSize} rounded-full bg-current`}\n\t\t\t\t\tstyle={{ color: `var(--${color})` }}\n\t\t\t\t\tanimate={{ scale: [1, 1.2, 1], opacity: [0.5, 1, 0.5] }}\n\t\t\t\t\ttransition={{\n\t\t\t\t\t\tduration,\n\t\t\t\t\t\trepeat: Number.POSITIVE_INFINITY,\n\t\t\t\t\t\tdelay: index * 0.2,\n\t\t\t\t\t\tease: \"easeInOut\",\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</div>\n\t);\n};\n\nconst PulseVariant = ({\n\tsize,\n\tcolor,\n\tduration = 1.5,\n}: { size: string; color: string; duration?: number }) => (\n\t<motion.div\n\t\tclassName={`rounded-full bg-current ${size}`}\n\t\tstyle={{ color: `var(--${color})` }}\n\t\tanimate={{ scale: [1, 1.2, 1], opacity: [0.5, 1, 0.5] }}\n\t\ttransition={{\n\t\t\tduration,\n\t\t\trepeat: Number.POSITIVE_INFINITY,\n\t\t\tease: \"easeInOut\",\n\t\t}}\n\t/>\n);\n\nconst BarsVariant = ({\n\tsize,\n\tcolor,\n\tduration = 1.2,\n}: { size: string; color: string; duration?: number }) => {\n\tconst barHeights = {\n\t\t\"w-2 h-2\": \"w-1 h-4\",\n\t\t\"w-3 h-3\": \"w-1 h-6\",\n\t\t\"w-4 h-4\": \"w-1 h-8\",\n\t\t\"w-6 h-6\": \"w-2 h-12\",\n\t};\n\n\tconst barHeight = barHeights[size as keyof typeof barHeights] || \"w-1 h-6\";\n\n\treturn (\n\t\t<div className=\"flex items-end gap-1\">\n\t\t\t{[0, 1, 2, 3].map((index) => (\n\t\t\t\t<motion.div\n\t\t\t\t\tkey={index}\n\t\t\t\t\tclassName={`${barHeight} bg-current rounded-sm`}\n\t\t\t\t\tstyle={{ color: `var(--${color})` }}\n\t\t\t\t\tanimate={{ scaleY: [1, 2, 1] }}\n\t\t\t\t\ttransition={{\n\t\t\t\t\t\tduration,\n\t\t\t\t\t\trepeat: Number.POSITIVE_INFINITY,\n\t\t\t\t\t\tdelay: index * 0.1,\n\t\t\t\t\t\tease: \"easeInOut\",\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</div>\n\t);\n};\n\n// ============================================================================\n// Loading Spinner Component\n// ============================================================================\n\nexport function LoadingSpinner({\n\tvariant = \"spinner\",\n\tsize = \"md\",\n\tcolor = \"primary\",\n\ttext = \"Loading...\",\n\tshowText = false,\n\ttextPosition = \"bottom\",\n\tcentered = false,\n\toverlay = false,\n\tclassName = \"\",\n\tchildren,\n\tduration = 1,\n\tbackdrop = false,\n\tbackdropOpacity = 0.5,\n}: LoadingSpinnerProps) {\n\tconst { getColorValue } = useTheme();\n\tconst { components } = useConfig();\n\n\t// Custom component override\n\tconst CustomLoadingSpinner = components.LoadingSpinner;\n\tif (CustomLoadingSpinner) {\n\t\treturn (\n\t\t\t<CustomLoadingSpinner\n\t\t\t\t{...{\n\t\t\t\t\tvariant,\n\t\t\t\t\tsize,\n\t\t\t\t\tcolor,\n\t\t\t\t\ttext,\n\t\t\t\t\tshowText,\n\t\t\t\t\ttextPosition,\n\t\t\t\t\tcentered,\n\t\t\t\t\toverlay,\n\t\t\t\t\tclassName,\n\t\t\t\t\tchildren,\n\t\t\t\t\tduration,\n\t\t\t\t\tbackdrop,\n\t\t\t\t\tbackdropOpacity,\n\t\t\t\t}}\n\t\t\t/>\n\t\t);\n\t}\n\n\t// Size mappings\n\tconst sizeClasses = {\n\t\tsm: \"w-4 h-4\",\n\t\tmd: \"w-6 h-6\",\n\t\tlg: \"w-8 h-8\",\n\t\txl: \"w-12 h-12\",\n\t};\n\n\tconst textSizes = {\n\t\tsm: \"text-xs\",\n\t\tmd: \"text-sm\",\n\t\tlg: \"text-base\",\n\t\txl: \"text-lg\",\n\t};\n\n\t// Get color value\n\tconst colorValue = getColorValue(color);\n\n\t// Render spinner based on variant\n\tconst renderSpinner = () => {\n\t\tconst sizeClass = sizeClasses[size];\n\t\tconst colorClass = `text-${color}-600 dark:text-${color}-400`;\n\n\t\tswitch (variant) {\n\t\t\tcase \"dots\":\n\t\t\t\treturn (\n\t\t\t\t\t<DotsVariant\n\t\t\t\t\t\tsize={sizeClass}\n\t\t\t\t\t\tcolor={colorClass}\n\t\t\t\t\t\tduration={duration}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\tcase \"pulse\":\n\t\t\t\treturn (\n\t\t\t\t\t<PulseVariant\n\t\t\t\t\t\tsize={sizeClass}\n\t\t\t\t\t\tcolor={colorClass}\n\t\t\t\t\t\tduration={duration}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\tcase \"bars\":\n\t\t\t\treturn (\n\t\t\t\t\t<BarsVariant\n\t\t\t\t\t\tsize={sizeClass}\n\t\t\t\t\t\tcolor={colorClass}\n\t\t\t\t\t\tduration={duration}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\tcase \"custom\":\n\t\t\t\treturn (\n\t\t\t\t\tchildren || (\n\t\t\t\t\t\t<SpinnerVariant\n\t\t\t\t\t\t\tsize={sizeClass}\n\t\t\t\t\t\t\tcolor={colorClass}\n\t\t\t\t\t\t\tduration={duration}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\tcase \"spinner\":\n\t\t\tdefault:\n\t\t\t\treturn <Spinner size={size} color={color as any} />;\n\t\t}\n\t};\n\n\t// Render text\n\tconst renderText = () => {\n\t\tif (!showText || !text) return null;\n\n\t\treturn (\n\t\t\t<span\n\t\t\t\tclassName={`${textSizes[size]} text-${color}-600 dark:text-${color}-400 font-medium`}\n\t\t\t>\n\t\t\t\t{text}\n\t\t\t</span>\n\t\t);\n\t};\n\n\t// Content layout based on text position\n\tconst renderContent = () => {\n\t\tconst spinner = renderSpinner();\n\t\tconst textElement = renderText();\n\n\t\tif (!showText) {\n\t\t\treturn spinner;\n\t\t}\n\n\t\tconst flexDirection = {\n\t\t\ttop: \"flex-col-reverse\",\n\t\t\tbottom: \"flex-col\",\n\t\t\tleft: \"flex-row-reverse\",\n\t\t\tright: \"flex-row\",\n\t\t};\n\n\t\tconst gap = {\n\t\t\ttop: \"gap-2\",\n\t\t\tbottom: \"gap-2\",\n\t\t\tleft: \"gap-3\",\n\t\t\tright: \"gap-3\",\n\t\t};\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={`flex items-center justify-center ${flexDirection[textPosition]} ${gap[textPosition]}`}\n\t\t\t>\n\t\t\t\t{spinner}\n\t\t\t\t{textElement}\n\t\t\t</div>\n\t\t);\n\t};\n\n\t// Base content\n\tconst content = (\n\t\t<div\n\t\t\tclassName={`\n ${centered ? \"flex items-center justify-center\" : \"\"}\n ${className}\n `}\n\t\t>\n\t\t\t{renderContent()}\n\t\t</div>\n\t);\n\n\t// Overlay variant\n\tif (overlay) {\n\t\treturn (\n\t\t\t<div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n\t\t\t\t{/* Backdrop */}\n\t\t\t\t{backdrop && (\n\t\t\t\t\t<motion.div\n\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\tanimate={{ opacity: backdropOpacity }}\n\t\t\t\t\t\texit={{ opacity: 0 }}\n\t\t\t\t\t\tclassName=\"absolute inset-0 bg-background/80 backdrop-blur-sm\"\n\t\t\t\t\t/>\n\t\t\t\t)}\n\n\t\t\t\t{/* Content */}\n\t\t\t\t<motion.div\n\t\t\t\t\tinitial={{ opacity: 0, scale: 0.8 }}\n\t\t\t\t\tanimate={{ opacity: 1, scale: 1 }}\n\t\t\t\t\texit={{ opacity: 0, scale: 0.8 }}\n\t\t\t\t\tclassName=\"relative z-10\"\n\t\t\t\t>\n\t\t\t\t\t{content}\n\t\t\t\t</motion.div>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn content;\n}\n\n// ============================================================================\n// Loading Button Component\n// ============================================================================\n\nexport interface LoadingButtonProps\n\textends React.ButtonHTMLAttributes<HTMLButtonElement> {\n\t/**\n\t * Whether button is loading\n\t */\n\tisLoading?: boolean;\n\n\t/**\n\t * Loading text (overrides children when loading)\n\t */\n\tloadingText?: string;\n\n\t/**\n\t * Loading spinner props\n\t */\n\tspinnerProps?: Partial<LoadingSpinnerProps>;\n\n\t/**\n\t * Button variant\n\t */\n\tvariant?:\n\t\t| \"solid\"\n\t\t| \"bordered\"\n\t\t| \"light\"\n\t\t| \"flat\"\n\t\t| \"faded\"\n\t\t| \"shadow\"\n\t\t| \"ghost\";\n\n\t/**\n\t * Button color\n\t */\n\tcolor?:\n\t\t| \"primary\"\n\t\t| \"secondary\"\n\t\t| \"success\"\n\t\t| \"warning\"\n\t\t| \"danger\"\n\t\t| \"default\";\n\n\t/**\n\t * Button size\n\t */\n\tsize?: \"sm\" | \"md\" | \"lg\";\n}\n\nexport function LoadingButton({\n\tisLoading = false,\n\tloadingText = \"Loading...\",\n\tspinnerProps = {},\n\tvariant = \"solid\",\n\tcolor = \"primary\",\n\tsize = \"md\",\n\tchildren,\n\tdisabled,\n\tclassName = \"\",\n\t...props\n}: LoadingButtonProps) {\n\tconst { components } = useConfig();\n\n\t// Custom component override\n\tconst CustomLoadingButton = components.LoadingButton;\n\tif (CustomLoadingButton) {\n\t\treturn (\n\t\t\t<CustomLoadingButton\n\t\t\t\t{...{\n\t\t\t\t\tisLoading,\n\t\t\t\t\tloadingText,\n\t\t\t\t\tspinnerProps,\n\t\t\t\t\tvariant,\n\t\t\t\t\tcolor,\n\t\t\t\t\tsize,\n\t\t\t\t\tchildren,\n\t\t\t\t\tdisabled,\n\t\t\t\t\tclassName,\n\t\t\t\t\t...props,\n\t\t\t\t}}\n\t\t\t/>\n\t\t);\n\t}\n\n\tconst spinnerSize = {\n\t\tsm: \"sm\" as const,\n\t\tmd: \"sm\" as const,\n\t\tlg: \"md\" as const,\n\t};\n\n\treturn (\n\t\t<button\n\t\t\t{...props}\n\t\t\tdisabled={disabled || isLoading}\n\t\t\tclassName={`\n relative inline-flex items-center justify-center gap-2 px-4 py-2 \n text-sm font-medium rounded-md transition-colors\n ${variant === \"solid\" ? `bg-${color}-600 text-white hover:bg-${color}-700` : \"\"}\n ${variant === \"bordered\" ? `border border-${color}-600 text-${color}-600 hover:bg-${color}-50` : \"\"}\n ${variant === \"light\" ? `text-${color}-600 hover:bg-${color}-50` : \"\"}\n disabled:opacity-50 disabled:cursor-not-allowed\n ${className}\n `}\n\t\t>\n\t\t\t{isLoading && (\n\t\t\t\t<LoadingSpinner\n\t\t\t\t\tvariant=\"spinner\"\n\t\t\t\t\tsize={spinnerSize[size]}\n\t\t\t\t\tcolor={variant === \"solid\" ? \"default\" : color}\n\t\t\t\t\t{...spinnerProps}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t<span className={isLoading ? \"opacity-70\" : \"\"}>\n\t\t\t\t{isLoading ? loadingText : children}\n\t\t\t</span>\n\t\t</button>\n\t);\n}\n\n// ============================================================================\n// Loading States\n// ============================================================================\n\n/**\n * Common loading states for authentication flows\n */\nexport const LoadingStates = {\n\tsignIn: {\n\t\ttext: \"Signing in...\",\n\t\tvariant: \"spinner\" as const,\n\t},\n\tsignUp: {\n\t\ttext: \"Creating account...\",\n\t\tvariant: \"spinner\" as const,\n\t},\n\tsignOut: {\n\t\ttext: \"Signing out...\",\n\t\tvariant: \"dots\" as const,\n\t},\n\tverifying: {\n\t\ttext: \"Verifying...\",\n\t\tvariant: \"pulse\" as const,\n\t},\n\tprocessing: {\n\t\ttext: \"Processing...\",\n\t\tvariant: \"bars\" as const,\n\t},\n\tloading: {\n\t\ttext: \"Loading...\",\n\t\tvariant: \"spinner\" as const,\n\t},\n\tsending: {\n\t\ttext: \"Sending...\",\n\t\tvariant: \"dots\" as const,\n\t},\n\tredirecting: {\n\t\ttext: \"Redirecting...\",\n\t\tvariant: \"pulse\" as const,\n\t},\n} as const;\n\n// ============================================================================\n// Loading Context\n// ============================================================================\n\ninterface LoadingContextValue {\n\tisLoading: boolean;\n\tloadingText: string;\n\tsetLoading: (loading: boolean, text?: string) => void;\n}\n\nconst LoadingContext = React.createContext<LoadingContextValue | null>(null);\n\nexport function LoadingProvider({ children }: { children: React.ReactNode }) {\n\tconst [isLoading, setIsLoading] = React.useState(false);\n\tconst [loadingText, setLoadingText] = React.useState(\"Loading...\");\n\n\tconst setLoading = React.useCallback(\n\t\t(loading: boolean, text = \"Loading...\") => {\n\t\t\tsetIsLoading(loading);\n\t\t\tsetLoadingText(text);\n\t\t},\n\t\t[],\n\t);\n\n\treturn (\n\t\t<LoadingContext.Provider value={{ isLoading, loadingText, setLoading }}>\n\t\t\t{children}\n\t\t\t{isLoading && (\n\t\t\t\t<LoadingSpinner\n\t\t\t\t\toverlay\n\t\t\t\t\tbackdrop\n\t\t\t\t\tshowText\n\t\t\t\t\ttext={loadingText}\n\t\t\t\t\tvariant=\"spinner\"\n\t\t\t\t\tsize=\"lg\"\n\t\t\t\t\tcolor=\"primary\"\n\t\t\t\t/>\n\t\t\t)}\n\t\t</LoadingContext.Provider>\n\t);\n}\n\nexport function useLoading() {\n\tconst context = React.useContext(LoadingContext);\n\tif (!context) {\n\t\tthrow new Error(\"useLoading must be used within a LoadingProvider\");\n\t}\n\treturn context;\n}\n\n// ============================================================================\n// Export\n// ============================================================================\n\nexport default LoadingSpinner;\n"],"names":["SpinnerVariant","size","color","duration","jsx","motion","DotsVariant","dotSize","index","PulseVariant","BarsVariant","barHeight","LoadingSpinner","variant","text","showText","textPosition","centered","overlay","className","children","backdrop","backdropOpacity","getColorValue","useTheme","components","useConfig","CustomLoadingSpinner","sizeClasses","textSizes","renderSpinner","sizeClass","colorClass","Spinner","renderText","renderContent","spinner","textElement","flexDirection","gap","jsxs","content","LoadingButton","isLoading","loadingText","spinnerProps","disabled","props","CustomLoadingButton","spinnerSize","LoadingStates","LoadingContext","React","LoadingProvider","setIsLoading","setLoadingText","setLoading","loading","useLoading","context","loading_spinner_default"],"mappings":"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"}