@vocoweb/kernel 1.0.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.
- package/LICENSE +21 -0
- package/README.md +252 -0
- package/dist/index.d.mts +2670 -0
- package/dist/index.d.ts +2670 -0
- package/dist/index.js +5560 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +5370 -0
- package/dist/index.mjs.map +1 -0
- package/dist/react-CSDXc0m4.d.mts +446 -0
- package/dist/react-CSDXc0m4.d.ts +446 -0
- package/dist/react.d.mts +3 -0
- package/dist/react.d.ts +3 -0
- package/dist/react.js +1854 -0
- package/dist/react.js.map +1 -0
- package/dist/react.mjs +1845 -0
- package/dist/react.mjs.map +1 -0
- package/package.json +89 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shared/errors.ts","../src/config/env.ts","../src/auth/config.ts","../src/auth/client.ts","../src/auth/components/VocoAuth.tsx","../src/legal/components/PrivacyPolicy.tsx","../src/legal/components/TermsOfService.tsx","../src/legal/components/CookieConsent.tsx","../src/accessibility/validators.ts","../src/accessibility/components/VocoButton.tsx","../src/accessibility/components/VocoInput.tsx","../src/accessibility/components/VocoForm.tsx","../src/audit/components/VocoAuditLog.tsx"],"names":["jsx","jsxs","useState","useCallback","categories","forwardRef","useEffect"],"mappings":"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","file":"react.mjs","sourcesContent":["/**\n * Custom error classes for @vocoweb/kernel\n */\n\n/**\n * Base VocoWeb error\n */\nexport class VocoError extends Error {\n constructor(\n message: string,\n public code: string,\n public statusCode: number = 500,\n public details?: Record<string, unknown>\n ) {\n super(message);\n this.name = 'VocoError';\n Error.captureStackTrace(this, this.constructor);\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n statusCode: this.statusCode,\n details: this.details,\n };\n }\n}\n\n/**\n * Authentication errors\n */\nexport class VocoAuthError extends VocoError {\n constructor(message: string, code: string = 'AUTH_ERROR', details?: Record<string, unknown>) {\n super(message, code, 401, details);\n this.name = 'VocoAuthError';\n }\n\n static invalidCredentials(): VocoAuthError {\n return new VocoAuthError('Invalid email or password', 'INVALID_CREDENTIALS');\n }\n\n static sessionExpired(): VocoAuthError {\n return new VocoAuthError('Session has expired', 'SESSION_EXPIRED');\n }\n\n static unauthorized(message = 'Unauthorized access'): VocoAuthError {\n return new VocoAuthError(message, 'UNAUTHORIZED');\n }\n\n static forbidden(message = 'Access forbidden'): VocoAuthError {\n const error = new VocoAuthError(message, 'FORBIDDEN');\n error.statusCode = 403;\n return error;\n }\n}\n\n/**\n * Payment errors\n */\nexport class VocoBillingError extends VocoError {\n constructor(message: string, code: string = 'BILLING_ERROR', details?: Record<string, unknown>) {\n super(message, code, 400, details);\n this.name = 'VocoBillingError';\n }\n\n static invalidVatNumber(vatNumber: string): VocoBillingError {\n return new VocoBillingError(\n `Invalid VAT number: ${vatNumber}`,\n 'INVALID_VAT_NUMBER',\n { vatNumber }\n );\n }\n\n static vatValidationFailed(vatNumber: string, reason: string): VocoBillingError {\n return new VocoBillingError(\n `VAT validation failed for ${vatNumber}: ${reason}`,\n 'VAT_VALIDATION_FAILED',\n { vatNumber, reason }\n );\n }\n\n static paymentRequired(message = 'Payment required'): VocoBillingError {\n const error = new VocoBillingError(message, 'PAYMENT_REQUIRED');\n error.statusCode = 402;\n return error;\n }\n\n static checkoutFailed(reason: string): VocoBillingError {\n return new VocoBillingError(\n `Checkout failed: ${reason}`,\n 'CHECKOUT_FAILED',\n { reason }\n );\n }\n\n static subscriptionNotFound(): VocoBillingError {\n return new VocoBillingError('Subscription not found', 'SUBSCRIPTION_NOT_FOUND');\n }\n\n static invoiceNotFound(invoiceId: string): VocoBillingError {\n return new VocoBillingError(\n `Invoice not found: ${invoiceId}`,\n 'INVOICE_NOT_FOUND',\n { invoiceId }\n );\n }\n}\n\n/**\n * Configuration errors\n */\nexport class VocoConfigError extends VocoError {\n constructor(message: string, code: string = 'CONFIG_ERROR', details?: Record<string, unknown>) {\n super(message, code, 500, details);\n this.name = 'VocoConfigError';\n }\n\n static missingEnvVar(varName: string): VocoConfigError {\n return new VocoConfigError(\n `Missing required environment variable: ${varName}`,\n 'MISSING_ENV_VAR',\n { varName }\n );\n }\n\n static invalidConfig(message: string): VocoConfigError {\n return new VocoConfigError(`Invalid configuration: ${message}`, 'INVALID_CONFIG');\n }\n}\n\n/**\n * Compliance errors\n */\nexport class VocoComplianceError extends VocoError {\n constructor(message: string, code: string = 'COMPLIANCE_ERROR', details?: Record<string, unknown>) {\n super(message, code, 400, details);\n this.name = 'VocoComplianceError';\n }\n\n static deletionFailed(userId: string, reason: string): VocoComplianceError {\n return new VocoComplianceError(\n `GDPR deletion failed for user ${userId}: ${reason}`,\n 'DELETION_FAILED',\n { userId, reason }\n );\n }\n\n static deletionInProgress(userId: string): VocoComplianceError {\n return new VocoComplianceError(\n `Deletion already in progress for user ${userId}`,\n 'DELETION_IN_PROGRESS',\n { userId }\n );\n }\n\n static invalidEntityType(entityType: string): VocoComplianceError {\n return new VocoComplianceError(\n `Invalid entity type: ${entityType}`,\n 'INVALID_ENTITY_TYPE',\n { entityType }\n );\n }\n\n static anonymizationFailed(table: string, reason: string): VocoComplianceError {\n return new VocoComplianceError(\n `Anonymization failed for table ${table}: ${reason}`,\n 'ANONYMIZATION_FAILED',\n { table, reason }\n );\n }\n\n static externalApiFailed(service: string, reason: string): VocoComplianceError {\n return new VocoComplianceError(\n `External API call failed for ${service}: ${reason}`,\n 'EXTERNAL_API_FAILED',\n { service, reason }\n );\n }\n\n static dataExportFailed(userId: string, reason: string): VocoComplianceError {\n return new VocoComplianceError(\n `Data export failed for user ${userId}: ${reason}`,\n 'EXPORT_FAILED',\n { userId, reason }\n );\n }\n\n static egressBlocked(destination: string, reason: string): VocoComplianceError {\n const error = new VocoComplianceError(\n `Request to ${destination} blocked: ${reason}`,\n 'EGRESS_BLOCKED',\n { destination, reason }\n );\n error.statusCode = 403;\n return error;\n }\n}\n\n/**\n * Accessibility errors\n */\nexport class VocoAccessibilityError extends VocoError {\n constructor(message: string, code: string = 'A11Y_ERROR', details?: Record<string, unknown>) {\n super(message, code, 400, details);\n this.name = 'VocoAccessibilityError';\n }\n\n static missingAriaLabel(component: string, prop: string): VocoAccessibilityError {\n return new VocoAccessibilityError(\n `Missing required accessibility attribute: ${component} requires ${prop}`,\n 'MISSING_ARIA_LABEL',\n { component, prop }\n );\n }\n\n static contrastRatioFailed(fg: string, bg: string, ratio: number): VocoAccessibilityError {\n return new VocoAccessibilityError(\n `Color contrast ratio ${ratio.toFixed(2)} for ${fg} on ${bg} fails WCAG AA standards`,\n 'CONTRAST_RATIO_FAILED',\n { foreground: fg, background: bg, ratio }\n );\n }\n\n static keyboardNavigationMissing(component: string): VocoAccessibilityError {\n return new VocoAccessibilityError(\n `Component ${component} is not keyboard accessible`,\n 'KEYBOARD_NAVIGATION_MISSING',\n { component }\n );\n }\n}\n\n/**\n * Validation errors using Zod\n */\nexport class VocoValidationError extends VocoError {\n constructor(\n message: string,\n public field: string,\n details?: Record<string, unknown>\n ) {\n super(message, 'VALIDATION_ERROR', 400, details);\n this.name = 'VocoValidationError';\n }\n\n static fromZod(error: { fieldErrors: Record<string, string[]> }): VocoValidationError {\n const fields = Object.keys(error.fieldErrors);\n const messages = Object.values(error.fieldErrors).flat();\n return new VocoValidationError(\n messages[0] || 'Validation failed',\n fields[0] || 'unknown',\n { fieldErrors: error.fieldErrors }\n );\n }\n}\n\n/**\n * Network errors\n */\nexport class VocoNetworkError extends VocoError {\n constructor(message: string, details?: Record<string, unknown>) {\n super(message, 'NETWORK_ERROR', 503, details);\n this.name = 'VocoNetworkError';\n }\n\n static fetchFailed(url: string, status?: number): VocoNetworkError {\n return new VocoNetworkError(\n `Failed to fetch: ${url}`,\n { url, status }\n );\n }\n\n static timeout(operation: string, timeoutMs: number): VocoNetworkError {\n return new VocoNetworkError(\n `Operation ${operation} timed out after ${timeoutMs}ms`,\n { operation, timeout: timeoutMs }\n );\n }\n}\n\n/**\n * Type guard for VocoWeb errors\n */\nexport function isVocoError(error: unknown): error is VocoError {\n return error instanceof VocoError;\n}\n\n/**\n * Get a user-friendly error message\n */\nexport function getErrorMessage(error: unknown): string {\n if (isVocoError(error)) {\n return error.message;\n }\n if (error instanceof Error) {\n return error.message;\n }\n return 'An unexpected error occurred';\n}\n\n/**\n * Format error for API responses\n */\nexport function formatApiError(error: unknown) {\n if (isVocoError(error)) {\n return error.toJSON();\n }\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message,\n code: 'UNKNOWN_ERROR',\n statusCode: 500,\n };\n }\n return {\n name: 'UnknownError',\n message: 'An unexpected error occurred',\n code: 'UNKNOWN_ERROR',\n statusCode: 500,\n };\n}\n","/**\n * Environment configuration for @vocoweb/kernel\n * Validates all required environment variables at startup\n */\n\nimport { z } from 'zod';\nimport { VocoConfigError } from '../shared/errors';\n\n/**\n * Supabase configuration schema\n */\nconst SupabaseConfigSchema = z.object({\n url: z.string().url('SUPABASE_URL must be a valid URL'),\n anonKey: z.string().min(1, 'SUPABASE_ANON_KEY is required'),\n serviceRoleKey: z.string().min(1, 'SUPABASE_SERVICE_ROLE_KEY is required'),\n});\n\n/**\n * Stripe configuration schema\n */\nconst StripeConfigSchema = z.object({\n secretKey: z.string().startsWith('sk_', 'STRIPE_SECRET_KEY must start with sk_'),\n publishableKey: z.string().startsWith('pk_', 'STRIPE_PUBLISHABLE_KEY must start with pk_'),\n webhookSecret: z.string().optional(),\n});\n\n/**\n * App configuration schema\n */\nconst AppConfigSchema = z.object({\n url: z.string().url('NEXT_PUBLIC_APP_URL must be a valid URL').optional().default('http://localhost:3000'),\n name: z.string().optional().default('VocoWeb App'),\n supportEmail: z.string().email('SUPPORT_EMAIL must be valid').optional().default('support@vocoweb.in'),\n legalEmail: z.string().email('LEGAL_EMAIL must be valid').optional().default('legal@vocoweb.in'),\n});\n\n/**\n * Data residency configuration schema\n */\nconst ResidencyConfigSchema = z.object({\n enabled: z.boolean().optional().default(false),\n region: z.enum(['eu', 'us', 'apac', 'global']).optional().default('global'),\n strictMode: z.boolean().optional().default(false),\n});\n\n/**\n * Accessibility configuration schema\n */\nconst AccessibilityConfigSchema = z.object({\n enforceContrast: z.boolean().optional().default(true),\n enforceAriaLabels: z.boolean().optional().default(true),\n enforceKeyboardNav: z.boolean().optional().default(true),\n contrastRatio: z.number().min(1).max(21).optional().default(4.5),\n});\n\n/**\n * Complete kernel configuration schema\n */\nconst KernelConfigSchema = z.object({\n supabase: SupabaseConfigSchema,\n stripe: StripeConfigSchema,\n app: AppConfigSchema,\n residency: ResidencyConfigSchema,\n accessibility: AccessibilityConfigSchema,\n});\n\n/**\n * Parsed configuration types\n */\nexport type SupabaseConfig = z.infer<typeof SupabaseConfigSchema>;\nexport type StripeConfig = z.infer<typeof StripeConfigSchema>;\nexport type AppConfig = z.infer<typeof AppConfigSchema>;\nexport type ResidencyConfig = z.infer<typeof ResidencyConfigSchema>;\nexport type AccessibilityConfig = z.infer<typeof AccessibilityConfigSchema>;\nexport type KernelConfig = z.infer<typeof KernelConfigSchema>;\n\n/**\n * Get environment variable (works in both browser and Node.js)\n */\nfunction getEnvVar(key: string): string {\n // Browser: use import.meta.env or window.env\n if (typeof window !== 'undefined') {\n return (window as unknown as { env?: Record<string, string> })?.env?.[key]\n || (import.meta as unknown as { env?: Record<string, string> })?.env?.[key]\n || '';\n }\n // Node.js\n return process.env[key] || '';\n}\n\n/**\n * Validate and parse kernel configuration\n */\nexport function validateConfig(config: Record<string, unknown>): KernelConfig {\n try {\n return KernelConfigSchema.parse(config);\n } catch (error) {\n if (error instanceof z.ZodError) {\n const errors = error.errors.map(e => `${e.path.join('.')}: ${e.message}`).join(', ');\n throw new VocoConfigError(`Configuration validation failed: ${errors}`, 'CONFIG_VALIDATION_FAILED', {\n errors: error.errors,\n });\n }\n throw error;\n }\n}\n\n/**\n * Load configuration from environment variables\n */\nexport function loadConfigFromEnv(): KernelConfig {\n const rawConfig = {\n supabase: {\n url: getEnvVar('NEXT_PUBLIC_SUPABASE_URL') || getEnvVar('SUPABASE_URL'),\n anonKey: getEnvVar('NEXT_PUBLIC_SUPABASE_ANON_KEY') || getEnvVar('SUPABASE_ANON_KEY'),\n serviceRoleKey: getEnvVar('SUPABASE_SERVICE_ROLE_KEY'),\n },\n stripe: {\n secretKey: getEnvVar('STRIPE_SECRET_KEY'),\n publishableKey: getEnvVar('NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY') || getEnvVar('STRIPE_PUBLISHABLE_KEY'),\n webhookSecret: getEnvVar('STRIPE_WEBHOOK_SECRET') || undefined,\n },\n app: {\n url: getEnvVar('NEXT_PUBLIC_APP_URL') || undefined,\n name: getEnvVar('NEXT_PUBLIC_APP_NAME') || undefined,\n supportEmail: getEnvVar('SUPPORT_EMAIL') || undefined,\n legalEmail: getEnvVar('LEGAL_EMAIL') || undefined,\n },\n residency: {\n enabled: getEnvVar('VOCO_DATA_RESIDENCY_ENABLED') === 'true',\n region: (getEnvVar('VOCO_DATA_REGION') as 'eu' | 'us' | 'apac' | 'global') || undefined,\n strictMode: getEnvVar('VOCO_RESIDENCY_STRICT_MODE') === 'true',\n },\n accessibility: {\n enforceContrast: getEnvVar('VOCO_ENFORCE_CONTRAST') !== 'false',\n enforceAriaLabels: getEnvVar('VOCO_ENFORCE_ARIA') !== 'false',\n enforceKeyboardNav: getEnvVar('VOCO_ENFORCE_KEYBOARD') !== 'false',\n contrastRatio: getEnvVar('VOCO_CONTRAST_RATIO')\n ? parseFloat(getEnvVar('VOCO_CONTRAST_RATIO'))\n : undefined,\n },\n };\n\n return validateConfig(rawConfig);\n}\n\n/**\n * Cached configuration instance\n */\nlet cachedConfig: KernelConfig | null = null;\n\n/**\n * Get the kernel configuration (cached)\n */\nexport function getConfig(): KernelConfig {\n if (!cachedConfig) {\n cachedConfig = loadConfigFromEnv();\n }\n return cachedConfig;\n}\n\n/**\n * Reset cached configuration (useful for testing)\n */\nexport function resetConfig(): void {\n cachedConfig = null;\n}\n\n/**\n * Set configuration manually (useful for testing or custom initialization)\n */\nexport function setConfig(config: KernelConfig): void {\n cachedConfig = validateConfig(config);\n}\n\n/**\n * Get Supabase configuration\n */\nexport function getSupabaseConfig(): SupabaseConfig {\n return getConfig().supabase;\n}\n\n/**\n * Get Stripe configuration\n */\nexport function getStripeConfig(): StripeConfig {\n return getConfig().stripe;\n}\n\n/**\n * Get App configuration\n */\nexport function getAppConfig(): AppConfig {\n return getConfig().app;\n}\n\n/**\n * Get Data Residency configuration\n */\nexport function getResidencyConfig(): ResidencyConfig {\n return getConfig().residency;\n}\n\n/**\n * Get Accessibility configuration\n */\nexport function getAccessibilityConfig(): AccessibilityConfig {\n return getConfig().accessibility;\n}\n\n/**\n * Check if all required environment variables are set\n */\nexport function checkRequiredEnvVars(): boolean {\n const requiredVars: Array<{ key: string; required: boolean }> = [\n { key: 'NEXT_PUBLIC_SUPABASE_URL', required: true },\n { key: 'NEXT_PUBLIC_SUPABASE_ANON_KEY', required: true },\n { key: 'SUPABASE_SERVICE_ROLE_KEY', required: true },\n { key: 'STRIPE_SECRET_KEY', required: true },\n { key: 'NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY', required: true },\n ];\n\n const missing: string[] = [];\n\n for (const { key, required } of requiredVars) {\n if (required && !getEnvVar(key)) {\n missing.push(key);\n }\n }\n\n if (missing.length > 0) {\n throw new VocoConfigError(\n `Missing required environment variables: ${missing.join(', ')}`,\n 'MISSING_ENV_VARS',\n { missing }\n );\n }\n\n return true;\n}\n\n/**\n * Environment-aware check: runs validation only in development or when explicitly enabled\n */\nexport function validateEnvironment(skipProduction: boolean = true): boolean {\n const isDev = getEnvVar('NODE_ENV') === 'development';\n const shouldValidate = isDev || !skipProduction;\n\n if (shouldValidate) {\n return checkRequiredEnvVars();\n }\n return true;\n}\n\n/**\n * Export a singleton instance for convenience\n */\nexport const config = {\n get: getConfig,\n supabase: getSupabaseConfig,\n stripe: getStripeConfig,\n app: getAppConfig,\n residency: getResidencyConfig,\n accessibility: getAccessibilityConfig,\n validate: validateEnvironment,\n check: checkRequiredEnvVars,\n};\n","/**\n * Supabase client configuration\n * Singleton pattern to prevent multiple instances\n */\n\nimport { createClient, SupabaseClient } from '@supabase/supabase-js';\nimport { getSupabaseConfig } from '../config/env';\nimport { VocoConfigError } from '../shared/errors';\n\n/**\n * Client type enum\n */\nenum ClientType {\n Browser = 'browser',\n Server = 'server',\n ServiceRole = 'service_role',\n}\n\n/**\n * Singleton client instances\n */\nlet browserClient: SupabaseClient | null = null;\nlet serverClient: SupabaseClient | null = null;\nlet serviceRoleClient: SupabaseClient | null = null;\n\n/**\n * Get the browser Supabase client (uses anon key)\n * Only works in browser environment\n */\nexport function getBrowserClient(): SupabaseClient {\n if (browserClient) {\n return browserClient;\n }\n\n if (typeof window === 'undefined') {\n throw new VocoConfigError(\n 'Browser client can only be used in browser environment',\n 'INVALID_CLIENT_TYPE'\n );\n }\n\n const config = getSupabaseConfig();\n\n browserClient = createClient(config.url, config.anonKey, {\n auth: {\n persistSession: true,\n autoRefreshToken: true,\n detectSessionInUrl: true,\n storage: typeof window !== 'undefined' ? window.localStorage : undefined,\n storageKey: 'vocoweb-auth-token',\n flowType: 'pkce',\n },\n });\n\n return browserClient;\n}\n\n/**\n * Get the server Supabase client (uses anon key)\n * For server-side operations with user context\n */\nexport function getServerClient(): SupabaseClient {\n if (serverClient) {\n return serverClient;\n }\n\n const config = getSupabaseConfig();\n\n serverClient = createClient(config.url, config.anonKey, {\n auth: {\n persistSession: false,\n autoRefreshToken: false,\n detectSessionInUrl: false,\n },\n });\n\n return serverClient;\n}\n\n/**\n * Get the service role client (uses service role key)\n * For admin operations - use with caution!\n * Should only be used server-side for privileged operations.\n */\nexport function getServiceRoleClient(): SupabaseClient {\n if (serviceRoleClient) {\n return serviceRoleClient;\n }\n\n if (typeof window !== 'undefined') {\n throw new VocoConfigError(\n 'Service role client can only be used server-side',\n 'INVALID_CLIENT_TYPE'\n );\n }\n\n const config = getSupabaseConfig();\n\n serviceRoleClient = createClient(config.url, config.serviceRoleKey, {\n auth: {\n persistSession: false,\n autoRefreshToken: false,\n detectSessionInUrl: false,\n },\n });\n\n return serviceRoleClient;\n}\n\n/**\n * Get a Supabase client based on type\n */\nexport function getClient(type: ClientType = ClientType.Browser): SupabaseClient {\n switch (type) {\n case ClientType.Browser:\n return getBrowserClient();\n case ClientType.Server:\n return getServerClient();\n case ClientType.ServiceRole:\n return getServiceRoleClient();\n default:\n return getBrowserClient();\n }\n}\n\n/**\n * Reset all clients (useful for testing)\n */\nexport function resetClients(): void {\n browserClient = null;\n serverClient = null;\n serviceRoleClient = null;\n}\n\n/**\n * Check if a specific client type is initialized\n */\nexport function isClientInitialized(type: ClientType): boolean {\n switch (type) {\n case ClientType.Browser:\n return browserClient !== null;\n case ClientType.Server:\n return serverClient !== null;\n case ClientType.ServiceRole:\n return serviceRoleClient !== null;\n default:\n return false;\n }\n}\n\nexport { ClientType };\n","/**\n * Client-side authentication functions\n * These functions are meant to be used in the browser\n */\n\nimport type {\n OAuthOptions,\n SignInWithPasswordOptions,\n SignUpOptions,\n ResetPasswordOptions,\n UpdateUserOptions,\n AuthStateChangeCallback,\n AuthSubscription,\n} from './types';\nimport { getBrowserClient } from './config';\nimport { VocoAuthError } from '../shared/errors';\nimport type { Session, User, AuthError as SupabaseAuthError } from '@supabase/supabase-js';\n\n/**\n * Convert Supabase auth error to VocoAuthError\n */\nfunction handleAuthError(error: SupabaseAuthError | null): never {\n if (!error) {\n throw new VocoAuthError('Unknown authentication error', 'UNKNOWN_ERROR');\n }\n\n const errorMap: Record<string, string> = {\n InvalidCredentials: 'INVALID_CREDENTIALS',\n EmailNotConfirmed: 'EMAIL_NOT_CONFIRMED',\n UserNotFound: 'USER_NOT_FOUND',\n InvalidEmail: 'INVALID_EMAIL',\n WeakPassword: 'WEAK_PASSWORD',\n EmailAlreadyExists: 'EMAIL_ALREADY_EXISTS',\n SessionExpired: 'SESSION_EXPIRED',\n };\n\n const code = errorMap[error.name] || 'AUTH_ERROR';\n\n throw new VocoAuthError(error.message || 'Authentication failed', code, {\n originalError: error.name,\n });\n}\n\n/**\n * Sign in with OAuth provider (e.g., Google, GitHub)\n *\n * @example\n * await auth.loginWithGoogle({ redirectTo: '/dashboard' });\n */\nexport async function loginWithOAuth(options: OAuthOptions = {}): Promise<void> {\n const {\n provider = 'google',\n redirectTo,\n scopes,\n queryParams,\n skipBrowserRedirect = false,\n } = options;\n\n const supabase = getBrowserClient();\n\n // Build redirect URL\n let redirectUrl = redirectTo;\n if (!redirectUrl && typeof window !== 'undefined') {\n redirectUrl = `${window.location.origin}/auth/callback`;\n }\n\n const { error } = await supabase.auth.signInWithOAuth({\n provider,\n options: {\n redirectTo: redirectUrl,\n scopes,\n queryParams,\n skipBrowserRedirect,\n },\n });\n\n if (error) {\n handleAuthError(error);\n }\n}\n\n/**\n * Sign in with Google OAuth (convenience function)\n *\n * @example\n * await auth.loginWithGoogle();\n */\nexport async function loginWithGoogle(redirectTo?: string): Promise<void> {\n await loginWithOAuth({ provider: 'google', redirectTo });\n}\n\n/**\n * Sign in with GitHub OAuth\n *\n * @example\n * await auth.loginWithGitHub();\n */\nexport async function loginWithGitHub(redirectTo?: string): Promise<void> {\n await loginWithOAuth({ provider: 'github', redirectTo });\n}\n\n/**\n * Sign in with email and password\n *\n * @example\n * await auth.signInWithPassword({ email: 'user@example.com', password: 'password123' });\n */\nexport async function signInWithPassword(\n options: SignInWithPasswordOptions\n): Promise<{ data: { session: Session | null; user: User | null } }> {\n const supabase = getBrowserClient();\n\n const { data, error } = await supabase.auth.signInWithPassword({\n email: options.email,\n password: options.password,\n });\n\n if (error) {\n handleAuthError(error);\n }\n\n return { data };\n}\n\n/**\n * Sign up a new user\n *\n * @example\n * await auth.signUp({\n * email: 'user@example.com',\n * password: 'password123',\n * metadata: { name: 'John Doe' }\n * });\n */\nexport async function signUp(options: SignUpOptions): Promise<{\n data: { session: Session | null; user: User | null };\n}> {\n const supabase = getBrowserClient();\n\n const { data, error } = await supabase.auth.signUp({\n email: options.email,\n password: options.password,\n options: {\n data: options.metadata,\n },\n });\n\n if (error) {\n handleAuthError(error);\n }\n\n return { data };\n}\n\n/**\n * Sign out the current user\n *\n * @example\n * await auth.logout();\n */\nexport async function logout(): Promise<void> {\n const supabase = getBrowserClient();\n\n const { error } = await supabase.auth.signOut();\n\n if (error) {\n handleAuthError(error);\n }\n}\n\n/**\n * Get the current session\n *\n * @example\n * const session = await auth.getSession();\n * if (session) {\n * console.log('User is logged in:', session.user);\n * }\n */\nexport async function getSession(): Promise<Session | null> {\n const supabase = getBrowserClient();\n\n const { data, error } = await supabase.auth.getSession();\n\n if (error) {\n handleAuthError(error);\n }\n\n return data.session;\n}\n\n/**\n * Get the current user\n *\n * @example\n * const user = await auth.getUser();\n * if (user) {\n * console.log('User email:', user.email);\n * }\n */\nexport async function getUser(): Promise<User | null> {\n const session = await getSession();\n return session?.user ?? null;\n}\n\n/**\n * Refresh the current session\n *\n * @example\n * await auth.refreshSession();\n */\nexport async function refreshSession(): Promise<Session | null> {\n const supabase = getBrowserClient();\n\n const { data, error } = await supabase.auth.refreshSession();\n\n if (error) {\n handleAuthError(error);\n }\n\n return data.session;\n}\n\n/**\n * Update the current user\n *\n * @example\n * await auth.updateUser({ metadata: { name: 'Jane Doe' } });\n */\nexport async function updateUser(options: UpdateUserOptions): Promise<User> {\n const supabase = getBrowserClient();\n\n const { data, error } = await supabase.auth.updateUser({\n email: options.email,\n password: options.password,\n data: options.metadata,\n });\n\n if (error) {\n handleAuthError(error);\n }\n\n if (!data.user) {\n throw new VocoAuthError('Failed to update user', 'UPDATE_FAILED');\n }\n\n return data.user;\n}\n\n/**\n * Send a password reset email\n *\n * @example\n * await auth.resetPassword({ email: 'user@example.com' });\n */\nexport async function resetPassword(options: ResetPasswordOptions): Promise<void> {\n const supabase = getBrowserClient();\n\n let redirectTo = options.redirectTo;\n if (!redirectTo && typeof window !== 'undefined') {\n redirectTo = `${window.location.origin}/auth/reset-password`;\n }\n\n const { error } = await supabase.auth.resetPasswordForEmail(options.email, {\n redirectTo,\n });\n\n if (error) {\n handleAuthError(error);\n }\n}\n\n/**\n * Subscribe to auth state changes\n *\n * @example\n * const subscription = auth.onAuthStateChange((event, session) => {\n * console.log('Auth event:', event, 'Session:', session);\n * });\n *\n * // Later: unsubscribe\n * subscription.unsubscribe();\n */\nexport function onAuthStateChange(\n callback: AuthStateChangeCallback\n): AuthSubscription {\n const supabase = getBrowserClient();\n\n const { data } = supabase.auth.onAuthStateChange((event, session) => {\n callback(event as Parameters<AuthStateChangeCallback>[0], session);\n });\n\n return {\n unsubscribe: () => {\n data.subscription.unsubscribe();\n },\n };\n}\n\n/**\n * Get the access token for API requests\n *\n * @example\n * const token = await auth.getAccessToken();\n * const response = await fetch('/api/protected', {\n * headers: { Authorization: `Bearer ${token}` }\n * });\n */\nexport async function getAccessToken(): Promise<string | null> {\n const session = await getSession();\n return session?.access_token ?? null;\n}\n\n/**\n * Check if a user is currently authenticated\n *\n * @example\n * if (await auth.isAuthenticated()) {\n * console.log('User is logged in');\n * }\n */\nexport async function isAuthenticated(): Promise<boolean> {\n const session = await getSession();\n return session !== null;\n}\n\n/**\n * Client authentication API\n */\nexport const clientAuth = {\n loginWithOAuth,\n loginWithGoogle,\n loginWithGitHub,\n signInWithPassword,\n signUp,\n logout,\n getSession,\n getUser,\n refreshSession,\n updateUser,\n resetPassword,\n onAuthStateChange,\n getAccessToken,\n isAuthenticated,\n};\n\n/**\n * Convenience exports\n */\nexport { loginWithOAuth as signInWithOAuth };\n","/**\n * VocoAuth Component\n *\n * A pre-styled, high-converting authentication component.\n * Handles Google OAuth login with loading states and error handling.\n *\n * @example\n * <VocoAuth redirectUrl=\"/dashboard\" />\n */\n\nimport { useState, useCallback } from 'react';\nimport { loginWithGoogle, loginWithGitHub, signInWithPassword, signUp } from '../client';\n\nexport interface VocoAuthProps {\n /**\n * URL to redirect to after successful authentication\n */\n redirectUrl?: string;\n\n /**\n * Custom CSS class name\n */\n className?: string;\n\n /**\n * Authentication mode\n */\n mode?: 'oauth' | 'password' | 'both';\n\n /**\n * OAuth providers to show\n */\n providers?: Array<'google' | 'github'>;\n\n /**\n * Show sign up form\n */\n showSignUp?: boolean;\n\n /**\n * Custom success callback\n */\n onSuccess?: (user: { id: string; email: string }) => void;\n\n /**\n * Custom error callback\n */\n onError?: (error: { message: string; code: string }) => void;\n}\n\nexport function VocoAuth({\n redirectUrl,\n className,\n mode = 'both',\n providers = ['google'],\n showSignUp = false,\n onSuccess,\n onError,\n}: VocoAuthProps) {\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [authMode, setAuthMode] = useState<'signIn' | 'signUp'>('signIn');\n\n const handleOAuthLogin = useCallback(\n async (provider: 'google' | 'github') => {\n setIsLoading(true);\n setError(null);\n\n try {\n if (provider === 'google') {\n await loginWithGoogle(redirectUrl);\n } else {\n await loginWithGitHub(redirectUrl);\n }\n // Note: OAuth redirect will navigate away, so we may not reach here\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Authentication failed';\n setError(errorMessage);\n setIsLoading(false);\n onError?.({ message: errorMessage, code: 'OAUTH_ERROR' });\n }\n },\n [redirectUrl, onError]\n );\n\n const handlePasswordAuth = useCallback(\n async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n setIsLoading(true);\n setError(null);\n\n const formData = new FormData(e.currentTarget);\n const email = formData.get('email') as string;\n const password = formData.get('password') as string;\n\n try {\n let result;\n if (authMode === 'signIn') {\n result = await signInWithPassword({ email, password });\n } else {\n result = await signUp({\n email,\n password,\n });\n }\n\n if (result.data.user) {\n onSuccess?.({\n id: result.data.user.id,\n email: result.data.user.email || '',\n });\n }\n\n // Redirect if specified\n if (redirectUrl && typeof window !== 'undefined') {\n window.location.href = redirectUrl;\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Authentication failed';\n setError(errorMessage);\n setIsLoading(false);\n onError?.({ message: errorMessage, code: 'AUTH_ERROR' });\n }\n },\n [authMode, redirectUrl, onSuccess, onError]\n );\n\n const toggleAuthMode = () => {\n setAuthMode(prev => (prev === 'signIn' ? 'signUp' : 'signIn'));\n setError(null);\n };\n\n return (\n <div\n className={className}\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '400px',\n padding: '2rem',\n }}\n >\n <div\n style={{\n width: '100%',\n maxWidth: '400px',\n backgroundColor: 'white',\n borderRadius: '12px',\n padding: '2rem',\n boxShadow: '0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)',\n }}\n >\n {/* Header */}\n <div style={{ textAlign: 'center', marginBottom: '2rem' }}>\n <h1\n style={{\n fontSize: '1.5rem',\n fontWeight: '700',\n color: '#111827',\n marginBottom: '0.5rem',\n }}\n >\n {authMode === 'signIn' ? 'Sign in to your account' : 'Create your account'}\n </h1>\n <p style={{ fontSize: '0.875rem', color: '#6b7280' }}>\n {authMode === 'signIn' ? 'Welcome back!' : 'Get started for free'}\n </p>\n </div>\n\n {/* Error Message */}\n {error && (\n <div\n role=\"alert\"\n style={{\n padding: '0.75rem',\n marginBottom: '1rem',\n backgroundColor: '#fef2f2',\n border: '1px solid #fecaca',\n borderRadius: '0.5rem',\n color: '#991b1b',\n fontSize: '0.875rem',\n }}\n >\n {error}\n </div>\n )}\n\n {/* OAuth Buttons */}\n {(mode === 'oauth' || mode === 'both') && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem', marginBottom: '1.5rem' }}>\n {providers.includes('google') && (\n <button\n type=\"button\"\n onClick={() => handleOAuthLogin('google')}\n disabled={isLoading}\n aria-label=\"Sign in with Google\"\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '0.75rem',\n width: '100%',\n padding: '0.75rem 1rem',\n backgroundColor: 'white',\n border: '1px solid #d1d5db',\n borderRadius: '0.5rem',\n fontSize: '0.875rem',\n fontWeight: '500',\n color: '#374151',\n cursor: isLoading ? 'not-allowed' : 'pointer',\n opacity: isLoading ? 0.5 : 1,\n transition: 'all 0.15s ease',\n }}\n onMouseEnter={e => {\n if (!isLoading) {\n e.currentTarget.style.backgroundColor = '#f9fafb';\n }\n }}\n onMouseLeave={e => {\n e.currentTarget.style.backgroundColor = 'white';\n }}\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path\n d=\"M19.6 10.23c0-.82-.1-1.42-.25-2.05H10v3.72h5.5c-.15.96-.74 2.31-2.04 3.22v2.45h3.16c1.89-1.73 2.98-4.3 2.98-7.34z\"\n fill=\"#4285F4\"\n />\n <path\n d=\"M10 20c2.7 0 4.96-.89 6.62-2.42l-3.16-2.45c-.86.58-1.97.92-3.46.92-2.65 0-4.92-1.8-5.73-4.22H2.98v2.52C4.56 17.64 7.06 20 10 20z\"\n fill=\"#34A853\"\n />\n <path\n d=\"M4.27 11.83c-.2-.58-.32-1.19-.32-1.83 0-.64.12-1.25.32-1.83V4.9H2.98C1.08 7.28 1.08 10.72 2.98 13.1l1.29-1.27z\"\n fill=\"#FBBC05\"\n />\n <path\n d=\"M10 3.98c1.52 0 2.87.52 3.94 1.54l2.9-2.9C15.06 1.19 12.7 0 10 0 7.06 0 4.56 2.36 3.38 5.9l1.29 1.27C5.38 4.98 7.65 3.98 10 3.98z\"\n fill=\"#EA4335\"\n />\n </svg>\n Continue with Google\n </button>\n )}\n\n {providers.includes('github') && (\n <button\n type=\"button\"\n onClick={() => handleOAuthLogin('github')}\n disabled={isLoading}\n aria-label=\"Sign in with GitHub\"\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '0.75rem',\n width: '100%',\n padding: '0.75rem 1rem',\n backgroundColor: 'white',\n border: '1px solid #d1d5db',\n borderRadius: '0.5rem',\n fontSize: '0.875rem',\n fontWeight: '500',\n color: '#374151',\n cursor: isLoading ? 'not-allowed' : 'pointer',\n opacity: isLoading ? 0.5 : 1,\n transition: 'all 0.15s ease',\n }}\n onMouseEnter={e => {\n if (!isLoading) {\n e.currentTarget.style.backgroundColor = '#f9fafb';\n }\n }}\n onMouseLeave={e => {\n e.currentTarget.style.backgroundColor = 'white';\n }}\n >\n <svg width=\"20\" height=\"20\" fill=\"currentColor\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path\n fillRule=\"evenodd\"\n d=\"M10 0C4.477 0 0 4.484 0 10.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0110 4.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0020 10.017C20 4.484 15.522 0 10 0z\"\n clipRule=\"evenodd\"\n />\n </svg>\n Continue with GitHub\n </button>\n )}\n </div>\n )}\n\n {/* Divider */}\n {(mode === 'both' || (mode === 'password' && showSignUp)) && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '1rem',\n marginBottom: '1.5rem',\n }}\n >\n <div style={{ flex: 1, height: '1px', backgroundColor: '#e5e7eb' }} />\n <span style={{ fontSize: '0.875rem', color: '#6b7280' }}>or continue with email</span>\n <div style={{ flex: 1, height: '1px', backgroundColor: '#e5e7eb' }} />\n </div>\n )}\n\n {/* Password Form */}\n {(mode === 'password' || mode === 'both') && (\n <form onSubmit={handlePasswordAuth} style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n <div>\n <label\n htmlFor=\"email\"\n style={{\n display: 'block',\n fontSize: '0.875rem',\n fontWeight: '500',\n color: '#374151',\n marginBottom: '0.5rem',\n }}\n >\n Email address\n </label>\n <input\n id=\"email\"\n name=\"email\"\n type=\"email\"\n autoComplete=\"email\"\n required\n disabled={isLoading}\n style={{\n width: '100%',\n padding: '0.75rem 1rem',\n border: '1px solid #d1d5db',\n borderRadius: '0.5rem',\n fontSize: '0.875rem',\n outline: 'none',\n cursor: isLoading ? 'not-allowed' : 'text',\n }}\n onFocus={e => {\n e.currentTarget.style.borderColor = '#3b82f6';\n e.currentTarget.style.boxShadow = '0 0 0 3px rgba(59, 130, 246, 0.1)';\n }}\n onBlur={e => {\n e.currentTarget.style.borderColor = '#d1d5db';\n e.currentTarget.style.boxShadow = 'none';\n }}\n />\n </div>\n\n <div>\n <label\n htmlFor=\"password\"\n style={{\n display: 'block',\n fontSize: '0.875rem',\n fontWeight: '500',\n color: '#374151',\n marginBottom: '0.5rem',\n }}\n >\n Password\n </label>\n <input\n id=\"password\"\n name=\"password\"\n type=\"password\"\n autoComplete={authMode === 'signIn' ? 'current-password' : 'new-password'}\n required\n disabled={isLoading}\n minLength={6}\n style={{\n width: '100%',\n padding: '0.75rem 1rem',\n border: '1px solid #d1d5db',\n borderRadius: '0.5rem',\n fontSize: '0.875rem',\n outline: 'none',\n cursor: isLoading ? 'not-allowed' : 'text',\n }}\n onFocus={e => {\n e.currentTarget.style.borderColor = '#3b82f6';\n e.currentTarget.style.boxShadow = '0 0 0 3px rgba(59, 130, 246, 0.1)';\n }}\n onBlur={e => {\n e.currentTarget.style.borderColor = '#d1d5db';\n e.currentTarget.style.boxShadow = 'none';\n }}\n />\n </div>\n\n <button\n type=\"submit\"\n disabled={isLoading}\n style={{\n width: '100%',\n padding: '0.75rem 1rem',\n backgroundColor: '#3b82f6',\n border: 'none',\n borderRadius: '0.5rem',\n fontSize: '0.875rem',\n fontWeight: '500',\n color: 'white',\n cursor: isLoading ? 'not-allowed' : 'pointer',\n opacity: isLoading ? 0.5 : 1,\n transition: 'all 0.15s ease',\n }}\n onMouseEnter={e => {\n if (!isLoading) {\n e.currentTarget.style.backgroundColor = '#2563eb';\n }\n }}\n onMouseLeave={e => {\n e.currentTarget.style.backgroundColor = '#3b82f6';\n }}\n >\n {isLoading ? 'Loading...' : authMode === 'signIn' ? 'Sign in' : 'Create account'}\n </button>\n </form>\n )}\n\n {/* Toggle Sign In/Sign Up */}\n {showSignUp && mode !== 'oauth' && (\n <div style={{ marginTop: '1.5rem', textAlign: 'center' }}>\n <p style={{ fontSize: '0.875rem', color: '#6b7280' }}>\n {authMode === 'signIn' ? \"Don't have an account? \" : 'Already have an account? '}\n <button\n type=\"button\"\n onClick={toggleAuthMode}\n disabled={isLoading}\n style={{\n background: 'none',\n border: 'none',\n color: '#3b82f6',\n fontSize: '0.875rem',\n fontWeight: '500',\n cursor: isLoading ? 'not-allowed' : 'pointer',\n textDecoration: 'underline',\n }}\n >\n {authMode === 'signIn' ? 'Sign up' : 'Sign in'}\n </button>\n </p>\n </div>\n )}\n\n {/* Terms */}\n <p style={{ marginTop: '1.5rem', fontSize: '0.75rem', color: '#9ca3af', textAlign: 'center' }}>\n By continuing, you agree to our Terms of Service and Privacy Policy.\n </p>\n </div>\n </div>\n );\n}\n","/**\n * PrivacyPolicy Component\n *\n * GDPR-compliant privacy policy component.\n *\n * @example\n * <PrivacyPolicy\n * companyName=\"Acme Inc\"\n * email=\"privacy@acme.com\"\n * updatedAt=\"2025-01-01\"\n * />\n */\n\nimport type { PrivacyPolicyProps } from '../types';\n\nconst DEFAULT_SECTIONS = {\n dataCollection: {\n title: '1. Information We Collect',\n content: `We collect information you provide directly to us, including:\n- Name, email address, and other contact information\n- Account credentials (encrypted)\n- Profile information and preferences\n- Usage data and analytics\n- Payment information (processed securely through third-party providers)`,\n },\n dataUsage: {\n title: '2. How We Use Your Information',\n content: `We use the information we collect to:\n- Provide, maintain, and improve our services\n- Process transactions and send related information\n- Send technical notices and support messages\n- Respond to comments and questions\n- Monitor and analyze trends, usage, and activities\n- Detect, prevent, and address technical issues and security threats`,\n },\n dataSharing: {\n title: '3. Information Sharing',\n content: `We do not sell your personal data. We may share your information with:\n- Service providers who perform services on our behalf\n- Payment processors (for transaction processing)\n- Analytics providers (to understand service usage)\n- Legal authorities when required by law\n- Third parties with your explicit consent`,\n },\n dataRetention: {\n title: '4. Data Retention',\n content: `We retain your personal data for as long as necessary to provide our services and fulfill the transactions you request. You may request deletion of your data at any time, subject to certain legal obligations.`,\n },\n userRights: {\n title: '5. Your Rights (GDPR)',\n content: `Under GDPR, you have the right to:\n- Access your personal data\n- Correct inaccurate data\n- Request deletion of your data (\"right to be forgotten\")\n- Object to processing of your data\n- Data portability\n- Restrict processing\n- Withdraw consent at any time`,\n },\n cookies: {\n title: '6. Cookies and Tracking',\n content: `We use cookies and similar technologies to:\n- Remember your preferences\n- Understand how you use our services\n- Provide analytics and improve performance\n- Deliver personalized content`,\n },\n security: {\n title: '7. Security',\n content: `We implement appropriate technical and organizational measures to protect your personal data against unauthorized access, alteration, disclosure, or destruction. However, no method of transmission over the internet is 100% secure.`,\n },\n contact: {\n title: '8. Contact Us',\n content: `For questions about this privacy policy or your personal data, please contact us.`,\n },\n};\n\nexport function PrivacyPolicy({\n companyName,\n email,\n updatedAt,\n websiteUrl,\n supportEmail,\n retentionDays = 365,\n dataCategories = ['personal information', 'usage data', 'payment information'],\n sections = {},\n className,\n}: PrivacyPolicyProps) {\n const formatDate = (date: string | Date): string => {\n if (typeof date === 'string') {\n return date;\n }\n const parts = date.toISOString().split('T');\n // ISO date string always has a T, so [0] will always exist\n return parts[0]!;\n };\n\n const allSections = { ...DEFAULT_SECTIONS, ...sections };\n\n const lastUpdated = updatedAt ? formatDate(updatedAt) : new Date().toISOString().split('T')[0]!;\n\n return (\n <div className={className} style={{ fontFamily: 'system-ui, -apple-system, sans-serif' }}>\n <div style={{ maxWidth: '800px', margin: '0 auto', padding: '2rem 1rem' }}>\n <h1 style={{ fontSize: '2rem', fontWeight: '700', marginBottom: '0.5rem' }}>\n Privacy Policy\n </h1>\n <p style={{ color: '#6b7280', marginBottom: '2rem' }}>\n Last Updated: {lastUpdated}\n </p>\n\n {/* Introduction */}\n <section style={{ marginBottom: '2rem' }}>\n <p style={{ lineHeight: '1.6' }}>\n At <strong>{companyName}</strong> (\"we\", \"our\", or \"us\"), we are committed to protecting\n your privacy and personal data. This privacy policy explains how we collect, use, share,\n and protect your information when you use our services.\n </p>\n </section>\n\n {/* Sections */}\n {(Object.entries(allSections) as Array<[string, { title: string; content: string }]>).map(([key, section]) => (\n <section key={key} style={{ marginBottom: '2rem' }}>\n <h2 style={{ fontSize: '1.25rem', fontWeight: '600', marginBottom: '1rem' }}>\n {section.title}\n </h2>\n <div style={{ lineHeight: '1.7', whiteSpace: 'pre-line', color: '#374151' }}>\n {section.content}\n </div>\n </section>\n ))}\n\n {/* Custom Data Categories */}\n {dataCategories && dataCategories.length > 0 && (\n <section style={{ marginBottom: '2rem' }}>\n <h2 style={{ fontSize: '1.25rem', fontWeight: '600', marginBottom: '1rem' }}>\n Categories of Personal Data\n </h2>\n <ul style={{ paddingLeft: '1.5rem', color: '#374151', lineHeight: '1.7' }}>\n {dataCategories.map((category: string, index: number) => (\n <li key={index}>{category}</li>\n ))}\n </ul>\n </section>\n )}\n\n {/* Retention Period */}\n <section style={{ marginBottom: '2rem' }}>\n <h2 style={{ fontSize: '1.25rem', fontWeight: '600', marginBottom: '1rem' }}>\n Data Retention Period\n </h2>\n <p style={{ lineHeight: '1.7', color: '#374151' }}>\n We retain your personal data for a period of <strong>{retentionDays} days</strong> after\n account closure, unless longer retention is required by law.\n </p>\n </section>\n\n {/* Contact */}\n <section style={{ marginBottom: '2rem' }}>\n <h2 style={{ fontSize: '1.25rem', fontWeight: '600', marginBottom: '1rem' }}>\n Contact Information\n </h2>\n <div style={{ lineHeight: '1.7', color: '#374151' }}>\n <p>\n If you have any questions about this Privacy Policy, please contact us at:{' '}\n <a href={`mailto:${email}`} style={{ color: '#3b82f6' }}>\n {email}\n </a>\n </p>\n {supportEmail && supportEmail !== email && (\n <p style={{ marginTop: '0.5rem' }}>\n For support inquiries:{' '}\n <a href={`mailto:${supportEmail}`} style={{ color: '#3b82f6' }}>\n {supportEmail}\n </a>\n </p>\n )}\n {websiteUrl && (\n <p style={{ marginTop: '0.5rem' }}>\n Website: {' '}\n <a href={websiteUrl} style={{ color: '#3b82f6' }}>\n {websiteUrl}\n </a>\n </p>\n )}\n </div>\n </section>\n\n {/* Footer */}\n <footer style={{ marginTop: '3rem', paddingTop: '2rem', borderTop: '1px solid #e5e7eb' }}>\n <p style={{ fontSize: '0.875rem', color: '#6b7280', textAlign: 'center' }}>\n © {new Date().getFullYear()} {companyName}. All rights reserved.\n </p>\n </footer>\n </div>\n </div>\n );\n}\n","/**\n * TermsOfService Component\n *\n * Terms of service component.\n *\n * @example\n * <TermsOfService\n * companyName=\"Acme Inc\"\n * email=\"legal@acme.com\"\n * jurisdiction=\"Delaware, USA\"\n * />\n */\n\nimport type { TermsOfServiceProps } from '../types';\n\nexport function TermsOfService({\n companyName,\n email,\n updatedAt,\n websiteUrl,\n jurisdiction = 'The laws of the jurisdiction where the company is registered',\n governingLaw,\n limitationOfLiability = true,\n intellectualProperty = true,\n terminationClause = true,\n className,\n}: TermsOfServiceProps) {\n const formatDate = (date: string | Date): string => {\n if (typeof date === 'string') {\n return date;\n }\n const parts = date.toISOString().split('T');\n // ISO date string always has a T, so [0] will always exist\n return parts[0]!;\n };\n\n const lastUpdated = updatedAt ? formatDate(updatedAt) : new Date().toISOString().split('T')[0]!;\n\n return (\n <div className={className} style={{ fontFamily: 'system-ui, -apple-system, sans-serif' }}>\n <div style={{ maxWidth: '800px', margin: '0 auto', padding: '2rem 1rem' }}>\n <h1 style={{ fontSize: '2rem', fontWeight: '700', marginBottom: '0.5rem' }}>\n Terms of Service\n </h1>\n <p style={{ color: '#6b7280', marginBottom: '2rem' }}>\n Last Updated: {lastUpdated}\n </p>\n\n {/* Introduction */}\n <section style={{ marginBottom: '2rem' }}>\n <p style={{ lineHeight: '1.6' }}>\n Welcome to <strong>{companyName}</strong>. By using our services, you agree to these terms.\n Please read them carefully.\n </p>\n </section>\n\n {/* 1. Acceptance of Terms */}\n <section style={{ marginBottom: '2rem' }}>\n <h2 style={{ fontSize: '1.25rem', fontWeight: '600', marginBottom: '1rem' }}>\n 1. Acceptance of Terms\n </h2>\n <p style={{ lineHeight: '1.7', color: '#374151' }}>\n By accessing or using {companyName}'s services, you agree to be bound by these Terms of Service.\n If you do not agree to these terms, please do not use our services.\n </p>\n </section>\n\n {/* 2. Description of Service */}\n <section style={{ marginBottom: '2rem' }}>\n <h2 style={{ fontSize: '1.25rem', fontWeight: '600', marginBottom: '1rem' }}>\n 2. Description of Service\n </h2>\n <p style={{ lineHeight: '1.7', color: '#374151' }}>\n {companyName} provides software services and related features as described in our documentation.\n We reserve the right to modify, suspend, or discontinue any aspect of our services at any time.\n </p>\n </section>\n\n {/* 3. User Responsibilities */}\n <section style={{ marginBottom: '2rem' }}>\n <h2 style={{ fontSize: '1.25rem', fontWeight: '600', marginBottom: '1rem' }}>\n 3. User Responsibilities\n </h2>\n <p style={{ lineHeight: '1.7', color: '#374151' }}>\n As a user of our services, you agree to:\n </p>\n <ul style={{ paddingLeft: '1.5rem', color: '#374151', lineHeight: '1.7' }}>\n <li>Provide accurate and complete information</li>\n <li>Maintain the security of your account credentials</li>\n <li>Comply with all applicable laws and regulations</li>\n <li>Not use our services for any unlawful purpose</li>\n <li>Not interfere with or disrupt our services</li>\n <li>Not attempt to gain unauthorized access to our systems</li>\n </ul>\n </section>\n\n {/* 4. Intellectual Property */}\n {intellectualProperty && (\n <section style={{ marginBottom: '2rem' }}>\n <h2 style={{ fontSize: '1.25rem', fontWeight: '600', marginBottom: '1rem' }}>\n 4. Intellectual Property\n </h2>\n <p style={{ lineHeight: '1.7', color: '#374151' }}>\n All content, features, and functionality of our services are owned by {companyName} and\n are protected by copyright, trademark, and other intellectual property laws. You may not:\n </p>\n <ul style={{ paddingLeft: '1.5rem', color: '#374151', lineHeight: '1.7' }}>\n <li>Reproduce, distribute, or create derivative works</li>\n <li>Use our services for commercial purposes without authorization</li>\n <li>Remove any proprietary notices from our services</li>\n </ul>\n </section>\n )}\n\n {/* 5. User Content */}\n <section style={{ marginBottom: '2rem' }}>\n <h2 style={{ fontSize: '1.25rem', fontWeight: '600', marginBottom: '1rem' }}>\n {intellectualProperty ? '5' : '4'}. User Content\n </h2>\n <p style={{ lineHeight: '1.7', color: '#374151' }}>\n You retain ownership of any content you submit to our services. By submitting content, you grant\n {companyName} a license to use, modify, and display your content for the purpose of providing\n our services. You represent that you have all necessary rights to grant such license.\n </p>\n </section>\n\n {/* 6. Termination */}\n {terminationClause && (\n <section style={{ marginBottom: '2rem' }}>\n <h2 style={{ fontSize: '1.25rem', fontWeight: '600', marginBottom: '1rem' }}>\n {intellectualProperty ? '6' : '5'}. Termination\n </h2>\n <p style={{ lineHeight: '1.7', color: '#374151' }}>\n We may terminate or suspend your account and access to our services at any time, with or\n without cause, with or without notice. Upon termination, your right to use our services\n will immediately cease.\n </p>\n </section>\n )}\n\n {/* 7. Limitation of Liability */}\n {limitationOfLiability && (\n <section style={{ marginBottom: '2rem' }}>\n <h2 style={{ fontSize: '1.25rem', fontWeight: '600', marginBottom: '1rem' }}>\n {terminationClause ? '7' : intellectualProperty ? '6' : '5'}. Limitation of Liability\n </h2>\n <p style={{ lineHeight: '1.7', color: '#374151' }}>\n To the fullest extent permitted by law, {companyName} shall not be liable for any\n indirect, incidental, special, consequential, or punitive damages, including without\n limitation, loss of profits, data, use, goodwill, or other intangible losses.\n </p>\n </section>\n )}\n\n {/* 8. Governing Law */}\n <section style={{ marginBottom: '2rem' }}>\n <h2 style={{ fontSize: '1.25rem', fontWeight: '600', marginBottom: '1rem' }}>\n {limitationOfLiability\n ? '8'\n : terminationClause\n ? '7'\n : intellectualProperty\n ? '6'\n : '5'}\n . Governing Law\n </h2>\n <p style={{ lineHeight: '1.7', color: '#374151' }}>\n These terms shall be governed by and construed in accordance with {governingLaw || jurisdiction}.\n </p>\n </section>\n\n {/* 9. Changes to Terms */}\n <section style={{ marginBottom: '2rem' }}>\n <h2 style={{ fontSize: '1.25rem', fontWeight: '600', marginBottom: '1rem' }}>\n {limitationOfLiability\n ? '9'\n : terminationClause\n ? '8'\n : intellectualProperty\n ? '7'\n : '6'}\n . Changes to Terms\n </h2>\n <p style={{ lineHeight: '1.7', color: '#374151' }}>\n We reserve the right to modify these terms at any time. We will notify users of any material\n changes via email or through our services. Your continued use of our services after such\n modifications constitutes your acceptance of the updated terms.\n </p>\n </section>\n\n {/* 10. Contact Information */}\n <section style={{ marginBottom: '2rem' }}>\n <h2 style={{ fontSize: '1.25rem', fontWeight: '600', marginBottom: '1rem' }}>\n {limitationOfLiability\n ? '10'\n : terminationClause\n ? '9'\n : intellectualProperty\n ? '8'\n : '7'}\n . Contact Us\n </h2>\n <p style={{ lineHeight: '1.7', color: '#374151' }}>\n If you have any questions about these Terms of Service, please contact us at:{' '}\n <a href={`mailto:${email}`} style={{ color: '#3b82f6' }}>\n {email}\n </a>\n </p>\n {websiteUrl && (\n <p style={{ marginTop: '0.5rem', lineHeight: '1.7', color: '#374151' }}>\n Website: {' '}\n <a href={websiteUrl} style={{ color: '#3b82f6' }}>\n {websiteUrl}\n </a>\n </p>\n )}\n </section>\n\n {/* Footer */}\n <footer style={{ marginTop: '3rem', paddingTop: '2rem', borderTop: '1px solid #e5e7eb' }}>\n <p style={{ fontSize: '0.875rem', color: '#6b7280', textAlign: 'center' }}>\n © {new Date().getFullYear()} {companyName}. All rights reserved.\n </p>\n </footer>\n </div>\n </div>\n );\n}\n","/**\n * CookieConsent Component\n *\n * GDPR-compliant cookie consent banner with category management.\n *\n * @example\n * <CookieConsent\n * onAccept={() => console.log('Accepted')}\n * onReject={() => console.log('Rejected')}\n * position=\"bottom\"\n * style=\"banner\"\n * />\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport type { CookieConsentProps, CookieCategory } from '../types';\n\nconst STORAGE_KEY = 'vocoweb-cookie-consent';\nconst CONSENT_EXPIRY_DAYS = 365;\n\nconst DEFAULT_CATEGORIES: CookieCategory[] = [\n {\n id: 'necessary',\n name: 'Strictly Necessary',\n description: 'These cookies are essential for the site to function properly.',\n required: true,\n },\n {\n id: 'analytics',\n name: 'Analytics',\n description: 'Help us improve our website by collecting anonymous usage data.',\n required: false,\n scripts: ['https://www.googletagmanager.com/gtag/js'],\n },\n {\n id: 'marketing',\n name: 'Marketing',\n description: 'Used to deliver advertisements that are relevant to you and your interests.',\n required: false,\n },\n {\n id: 'preferences',\n name: 'Preferences',\n description: 'Allows the site to remember your choices and preferences.',\n required: false,\n },\n];\n\nexport function CookieConsent({\n onAccept,\n onReject,\n onCustomize,\n position = 'bottom',\n style = 'banner',\n categories = DEFAULT_CATEGORIES,\n privacyPolicyUrl,\n acceptAllText = 'Accept All',\n rejectAllText = 'Reject All',\n customizeText = 'Customize',\n className,\n}: CookieConsentProps) {\n const [isVisible, setIsVisible] = useState(false);\n const [showCustomize, setShowCustomize] = useState(false);\n const [selectedCategories, setSelectedCategories] = useState<Record<string, boolean>>({});\n\n // Check if user has already made a choice\n useEffect(() => {\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored) {\n const { timestamp, consent } = JSON.parse(stored);\n const daysSince = (Date.now() - timestamp) / (1000 * 60 * 60 * 24);\n\n // Re-show consent after expiry period\n if (daysSince > CONSENT_EXPIRY_DAYS) {\n setIsVisible(true);\n } else if (consent === 'pending') {\n // User was customizing but didn't finish\n setIsVisible(true);\n }\n } else {\n setIsVisible(true);\n }\n } catch {\n setIsVisible(true);\n }\n }, []);\n\n // Initialize selected categories with required ones\n useEffect(() => {\n const required: Record<string, boolean> = {};\n categories.forEach((cat: CookieCategory) => {\n if (cat.required) {\n required[cat.id] = true;\n }\n });\n setSelectedCategories(required);\n }, [categories]);\n\n // Save consent to localStorage\n const saveConsent = useCallback((consent: 'accept' | 'reject' | 'partial', categories?: Record<string, boolean>) => {\n const data = {\n timestamp: Date.now(),\n consent,\n categories,\n };\n localStorage.setItem(STORAGE_KEY, JSON.stringify(data));\n }, []);\n\n // Handle accept all\n const handleAccept = useCallback(() => {\n const allAccepted: Record<string, boolean> = {};\n categories.forEach((cat: CookieCategory) => {\n allAccepted[cat.id] = true;\n });\n\n setSelectedCategories(allAccepted);\n saveConsent('accept', allAccepted);\n setIsVisible(false);\n\n onAccept?.();\n }, [categories, onAccept, saveConsent]);\n\n // Handle reject all (except required)\n const handleReject = useCallback(() => {\n const requiredOnly: Record<string, boolean> = {};\n categories.forEach((cat: CookieCategory) => {\n if (cat.required) {\n requiredOnly[cat.id] = true;\n }\n });\n\n setSelectedCategories(requiredOnly);\n saveConsent('reject', requiredOnly);\n setIsVisible(false);\n\n onReject?.();\n }, [categories, onReject, saveConsent]);\n\n // Handle customize - show modal\n const handleCustomize = useCallback(() => {\n setShowCustomize(true);\n }, []);\n\n // Save custom selection\n const handleSaveCustom = useCallback(() => {\n saveConsent('partial', selectedCategories);\n setIsVisible(false);\n setShowCustomize(false);\n\n onCustomize?.(selectedCategories);\n }, [selectedCategories, saveConsent, onCustomize]);\n\n // Toggle category selection\n const toggleCategory = useCallback((categoryId: string) => {\n const category = categories.find(c => c.id === categoryId);\n if (category?.required) {\n return; // Can't toggle required categories\n }\n\n setSelectedCategories(prev => ({\n ...prev,\n [categoryId]: !prev[categoryId],\n }));\n }, [categories]);\n\n // Close modal without saving\n const handleCloseModal = useCallback(() => {\n setShowCustomize(false);\n }, []);\n\n // Block scripts for non-accepted categories\n useEffect(() => {\n if (Object.keys(selectedCategories).length === 0) {\n return; // Not yet selected\n }\n\n categories.forEach((category: CookieCategory) => {\n if (category.scripts && category.scripts.length > 0) {\n const shouldBlock = !selectedCategories[category.id];\n\n category.scripts.forEach((scriptSrc: string) => {\n // Find and block/re-enable scripts\n const scripts = document.querySelectorAll(`script[src=\"${scriptSrc}\"]`);\n scripts.forEach((script: Element) => {\n if (shouldBlock) {\n script.remove();\n }\n });\n });\n }\n });\n }, [selectedCategories, categories]);\n\n if (!isVisible) {\n return null;\n }\n\n // Banner style\n if (style === 'banner' && !showCustomize) {\n const isBottom = position === 'bottom';\n\n return (\n <div\n className={className}\n role=\"dialog\"\n aria-labelledby=\"cookie-consent-title\"\n aria-describedby=\"cookie-consent-description\"\n style={{\n position: 'fixed',\n left: 0,\n right: 0,\n [isBottom ? 'bottom' : 'top']: 0,\n backgroundColor: 'rgba(17, 24, 39, 0.95)',\n backdropFilter: 'blur(8px)',\n padding: '1rem',\n zIndex: 9999,\n boxShadow: isBottom ? '0 -4px 6px -1px rgb(0 0 0 / 0.1)' : '0 4px 6px -1px rgb(0 0 0 / 0.1)',\n }}\n >\n <div\n style={{\n maxWidth: '1200px',\n margin: '0 auto',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '1rem',\n flexWrap: 'wrap',\n }}\n >\n <div style={{ flex: 1, minWidth: '200px' }}>\n <h2 id=\"cookie-consent-title\" style={{ fontSize: '1rem', fontWeight: '600', color: 'white', marginBottom: '0.25rem' }}>\n We use cookies\n </h2>\n <p id=\"cookie-consent-description\" style={{ fontSize: '0.875rem', color: '#d1d5db', margin: 0 }}>\n We use cookies to improve your experience and analyze usage. By continuing, you agree to our{' '}\n {privacyPolicyUrl && (\n <a\n href={privacyPolicyUrl}\n style={{ color: '#60a5fa', textDecoration: 'underline' }}\n >\n Privacy Policy\n </a>\n )}\n </p>\n </div>\n\n <div style={{ display: 'flex', gap: '0.5rem', flexWrap: 'wrap' }}>\n <button\n onClick={handleReject}\n style={{\n padding: '0.5rem 1rem',\n backgroundColor: 'transparent',\n border: '1px solid #4b5563',\n borderRadius: '0.375rem',\n color: '#d1d5db',\n fontSize: '0.875rem',\n fontWeight: '500',\n cursor: 'pointer',\n transition: 'all 0.15s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#374151';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n {rejectAllText}\n </button>\n\n <button\n onClick={handleCustomize}\n style={{\n padding: '0.5rem 1rem',\n backgroundColor: 'transparent',\n border: '1px solid #4b5563',\n borderRadius: '0.375rem',\n color: '#d1d5db',\n fontSize: '0.875rem',\n fontWeight: '500',\n cursor: 'pointer',\n transition: 'all 0.15s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#374151';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n {customizeText}\n </button>\n\n <button\n onClick={handleAccept}\n style={{\n padding: '0.5rem 1rem',\n backgroundColor: '#3b82f6',\n border: 'none',\n borderRadius: '0.375rem',\n color: 'white',\n fontSize: '0.875rem',\n fontWeight: '500',\n cursor: 'pointer',\n transition: 'all 0.15s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#2563eb';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = '#3b82f6';\n }}\n >\n {acceptAllText}\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n // Modal/Bar style for customization\n return (\n <>\n {/* Backdrop */}\n {showCustomize && (\n <div\n onClick={handleCloseModal}\n style={{\n position: 'fixed',\n inset: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n zIndex: 9998,\n }}\n />\n )}\n\n {/* Modal */}\n <div\n className={className}\n role=\"dialog\"\n aria-labelledby=\"cookie-consent-title\"\n aria-modal=\"true\"\n style={{\n position: 'fixed',\n left: '50%',\n top: '50%',\n transform: 'translate(-50%, -50%)',\n backgroundColor: 'white',\n borderRadius: '0.75rem',\n padding: '1.5rem',\n zIndex: 9999,\n maxWidth: '500px',\n width: '90%',\n maxHeight: '80vh',\n overflowY: 'auto',\n boxShadow: '0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)',\n }}\n >\n <h2\n id=\"cookie-consent-title\"\n style={{ fontSize: '1.25rem', fontWeight: '700', color: '#111827', marginBottom: '0.5rem' }}\n >\n Customize Cookie Preferences\n </h2>\n <p style={{ fontSize: '0.875rem', color: '#6b7280', marginBottom: '1.5rem' }}>\n We use different types of cookies to provide you with the best experience. You can choose which\n cookies to accept.\n </p>\n\n {/* Cookie categories */}\n <div style={{ marginBottom: '1.5rem' }}>\n {categories.map(category => (\n <div\n key={category.id}\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'flex-start',\n padding: '0.75rem 0',\n borderBottom: '1px solid #e5e7eb',\n }}\n >\n <div style={{ flex: 1 }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <h3 style={{ fontSize: '0.875rem', fontWeight: '600', color: '#111827', margin: 0 }}>\n {category.name}\n </h3>\n {category.required && (\n <span\n style={{\n fontSize: '0.75rem',\n backgroundColor: '#dbeafe',\n color: '#1e40af',\n padding: '0.125rem 0.375rem',\n borderRadius: '0.25rem',\n fontWeight: '500',\n }}\n >\n Required\n </span>\n )}\n </div>\n <p style={{ fontSize: '0.875rem', color: '#6b7280', margin: '0.25rem 0 0', marginTop: '0.25rem' }}>\n {category.description}\n </p>\n </div>\n\n {!category.required && (\n <button\n onClick={() => toggleCategory(category.id)}\n style={{\n position: 'relative',\n width: '44px',\n height: '24px',\n backgroundColor: selectedCategories[category.id] ? '#3b82f6' : '#d1d5db',\n borderRadius: '12px',\n border: 'none',\n cursor: 'pointer',\n transition: 'background-color 0.15s ease',\n }}\n aria-pressed={selectedCategories[category.id]}\n >\n <span\n style={{\n position: 'absolute',\n top: '2px',\n left: selectedCategories[category.id] ? '22px' : '2px',\n width: '20px',\n height: '20px',\n backgroundColor: 'white',\n borderRadius: '50%',\n transition: 'left 0.15s ease',\n }}\n />\n </button>\n )}\n </div>\n ))}\n </div>\n\n {/* Privacy policy link */}\n {privacyPolicyUrl && (\n <p style={{ fontSize: '0.875rem', color: '#6b7280', marginBottom: '1rem' }}>\n Read more in our{' '}\n <a href={privacyPolicyUrl} style={{ color: '#3b82f6', textDecoration: 'underline' }}>\n Privacy Policy\n </a>\n </p>\n )}\n\n {/* Actions */}\n <div style={{ display: 'flex', gap: '0.75rem', justifyContent: 'flex-end' }}>\n <button\n onClick={handleCloseModal}\n style={{\n padding: '0.5rem 1rem',\n backgroundColor: 'white',\n border: '1px solid #d1d5db',\n borderRadius: '0.375rem',\n color: '#374151',\n fontSize: '0.875rem',\n fontWeight: '500',\n cursor: 'pointer',\n transition: 'all 0.15s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#f9fafb';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'white';\n }}\n >\n Cancel\n </button>\n\n <button\n onClick={handleSaveCustom}\n style={{\n padding: '0.5rem 1rem',\n backgroundColor: '#3b82f6',\n border: 'none',\n borderRadius: '0.375rem',\n color: 'white',\n fontSize: '0.875rem',\n fontWeight: '500',\n cursor: 'pointer',\n transition: 'all 0.15s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#2563eb';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = '#3b82f6';\n }}\n >\n Save Preferences\n </button>\n </div>\n </div>\n </>\n );\n}\n","/**\n * Accessibility validators for WCAG 2.1 AA compliance\n */\n\nimport type { ContrastResult, AriaValidationResult, KeyboardNavigationResult, AccessibilityViolation, ComplianceLevel } from './types';\nimport { VocoAccessibilityError } from '../shared/errors';\n\n/**\n * Convert hex color to RGB\n */\nfunction hexToRgb(hex: string): { r: number; g: number; b: number } | null {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n return result\n ? {\n r: parseInt(result[1]!, 16),\n g: parseInt(result[2]!, 16),\n b: parseInt(result[3]!, 16),\n }\n : null;\n}\n\n/**\n * Calculate relative luminance of a color\n * Based on WCAG 2.1 specification\n */\nfunction calculateLuminance(r: number, g: number, b: number): number {\n const values = [r, g, b].map((value) => {\n const sRGB = value / 255;\n return sRGB <= 0.03928 ? sRGB / 12.92 : Math.pow((sRGB + 0.055) / 1.055, 2.4);\n });\n\n const rs = values[0]!;\n const gs = values[1]!;\n const bs = values[2]!;\n\n return 0.2126 * rs + 0.7152 * gs + 0.0722 * bs;\n}\n\n/**\n * Calculate contrast ratio between two colors\n */\nfunction calculateContrastRatio(luminance1: number, luminance2: number): number {\n const lighter = Math.max(luminance1, luminance2);\n const darker = Math.min(luminance1, luminance2);\n return (lighter + 0.05) / (darker + 0.05);\n}\n\n/**\n * Check color contrast ratio against WCAG standards\n *\n * @param foreground - Foreground color (hex)\n * @param background - Background color (hex)\n * @returns Contrast result with WCAG AA/AAA compliance\n *\n * @example\n * const result = checkColorContrast('#ffffff', '#000000');\n * // Returns: { ratio: 21, aa: true, aaa: true, ... }\n */\nexport function checkColorContrast(foreground: string, background: string): ContrastResult {\n const fg = hexToRgb(foreground);\n const bg = hexToRgb(background);\n\n if (!fg || !bg) {\n throw new Error('Invalid color format. Use hex format like #ffffff');\n }\n\n const fgLuminance = calculateLuminance(fg.r, fg.g, fg.b);\n const bgLuminance = calculateLuminance(bg.r, bg.g, bg.b);\n\n const ratio = calculateContrastRatio(fgLuminance, bgLuminance);\n\n // WCAG AA: 4.5:1 for normal text, 3:1 for large text\n // WCAG AAA: 7:1 for normal text, 4.5:1 for large text\n const passesNormalText = ratio >= 4.5;\n const passesLargeText = ratio >= 3.0;\n const aa = passesNormalText;\n const aaa = ratio >= 7.0;\n\n return {\n ratio: Math.round(ratio * 100) / 100,\n aa,\n aaa,\n passesLargeText,\n passesNormalText,\n foreground,\n background,\n };\n}\n\n/**\n * Validate ARIA attributes on an element\n *\n * @param ariaLabel - ARIA label value\n * @param ariaLabelledby - ARIA labelledby value\n * @param elementType - Type of element (button, input, etc.)\n * @returns Validation result with any issues found\n *\n * @example\n * const result = validateAriaLabel(undefined, undefined, 'button');\n * // Returns: { valid: false, issues: [{ severity: 'error', message: '...' }] }\n */\nexport function validateAriaLabel(\n ariaLabel?: string,\n ariaLabelledby?: string,\n elementType: string = 'button'\n): AriaValidationResult {\n const issues: Array<{ severity: 'error' | 'warning'; message: string; attribute?: string }> = [];\n\n // Elements that require accessible names\n const elementsRequiringLabel = ['button', 'a', 'input', 'textarea', 'select'];\n\n if (elementsRequiringLabel.includes(elementType)) {\n if (!ariaLabel && !ariaLabelledby) {\n issues.push({\n severity: 'error',\n message: `${elementType} must have an accessible name via aria-label or aria-labelledby`,\n attribute: 'aria-label',\n });\n }\n }\n\n // Check for empty aria-label\n if (ariaLabel === '') {\n issues.push({\n severity: 'error',\n message: 'aria-label cannot be empty',\n attribute: 'aria-label',\n });\n }\n\n // Check for aria-label with aria-labelledby (should use one or the other)\n if (ariaLabel && ariaLabelledby) {\n issues.push({\n severity: 'warning',\n message: 'Use either aria-label or aria-labelledby, not both',\n attribute: 'aria-label',\n });\n }\n\n return {\n valid: issues.filter((i) => i.severity === 'error').length === 0,\n element: elementType,\n issues,\n };\n}\n\n/**\n * Test keyboard navigation for a component\n *\n * @param element - DOM element to test\n * @returns Keyboard navigation result\n *\n * @example\n * const button = document.querySelector('button');\n * const result = testKeyboardNavigation(button);\n */\nexport function testKeyboardNavigation(element: unknown): KeyboardNavigationResult {\n const issues: string[] = [];\n let navigable = false;\n let focusable = false;\n\n if (typeof window === 'undefined' || !element) {\n return {\n navigable: false,\n focusable: false,\n tabOrder: [],\n issues: ['Element not available for testing'],\n };\n }\n\n try {\n const el = element as HTMLElement;\n const tabIndex = parseInt(el.getAttribute('tabindex') || '0', 10);\n const focusableElements = ['button', 'a', 'input', 'textarea', 'select'];\n\n // Check if element is focusable\n const disabled = (el as Partial<HTMLInputElement>).disabled === true;\n focusable =\n !disabled &&\n (tabIndex >= 0 ||\n focusableElements.includes(el.tagName.toLowerCase()) ||\n el.contentEditable === 'true');\n\n // Check if element is in tab order\n navigable = tabIndex >= 0;\n\n // Get tab order for all focusable elements\n const allFocusable = Array.from(\n document.querySelectorAll<HTMLElement>(\n 'button, a[href], input, textarea, select, [tabindex]:not([tabindex=\"-1\"])'\n )\n );\n\n const tabOrder = allFocusable\n .filter((el) => {\n const t = parseInt(el.getAttribute('tabindex') || '0', 10);\n return t >= 0;\n })\n .map((el) => parseInt(el.getAttribute('tabindex') || '0', 10))\n .sort((a, b) => a - b);\n\n // Check for keyboard traps\n if (el.getAttribute('aria-hidden') === 'true' && focusable) {\n issues.push('Element is aria-hidden but still focusable - keyboard trap');\n }\n\n // Check for missing keyboard handlers\n if (el.tagName === 'BUTTON' && el.getAttribute('role') === 'button' && !el.onclick) {\n issues.push('Interactive element has no click handler');\n }\n\n return {\n navigable,\n focusable,\n tabOrder,\n issues,\n };\n } catch (error) {\n return {\n navigable: false,\n focusable: false,\n tabOrder: [],\n issues: [error instanceof Error ? error.message : 'Unknown error'],\n };\n }\n}\n\n/**\n * Run comprehensive accessibility audit on a color scheme\n *\n * @param colors - Object with foreground and background colors\n * @param level - WCAG compliance level to test against\n * @returns Array of accessibility violations\n *\n * @example\n * const violations = auditColorScheme({\n * primary: '#ffffff',\n * background: '#000000'\n * }, 'AA');\n */\nexport function auditColorScheme(\n colors: Record<string, { foreground?: string; background?: string }>,\n level: ComplianceLevel = 'AA'\n): AccessibilityViolation[] {\n const violations: AccessibilityViolation[] = [];\n\n for (const [name, colorSet] of Object.entries(colors)) {\n if (colorSet.foreground && colorSet.background) {\n const result = checkColorContrast(colorSet.foreground, colorSet.background);\n\n const requiredRatio = level === 'AAA' ? 7.0 : 4.5;\n if (result.ratio < requiredRatio) {\n violations.push({\n rule: 'WCAG 2.1 Contrast',\n description: `Color contrast ratio ${result.ratio}:1 is below ${level} requirement of ${requiredRatio}:1`,\n impact: result.ratio < 3.0 ? 'critical' : 'serious',\n element: name,\n help: `Increase contrast to at least ${requiredRatio}:1`,\n helpUrl: 'https://www.w3.org/WAI/WCAG21/Understanding/contrast-minimum.html',\n wcagLevel: level,\n wcagCriteria: '1.4.3',\n });\n }\n }\n }\n\n return violations;\n}\n\n/**\n * Validate that all interactive elements have accessible names\n *\n * @param elements - Array of element descriptors\n * @returns Array of accessibility violations\n */\nexport function validateInteractiveElements(\n elements: Array<{ type: string; hasLabel?: boolean; hasAriaLabel?: string; id?: string }>\n): AccessibilityViolation[] {\n const violations: AccessibilityViolation[] = [];\n\n for (const element of elements) {\n if (!element.hasLabel && !element.hasAriaLabel) {\n violations.push({\n rule: 'WCAG 2.1 Accessible Name',\n description: `Interactive element of type ${element.type} lacks an accessible name`,\n impact: 'serious',\n element: element.id || element.type,\n help: 'Add aria-label or ensure element has visible text content',\n helpUrl: 'https://www.w3.org/WAI/WCAG21/Understanding/name-role-value.html',\n wcagLevel: 'A',\n wcagCriteria: '2.4.6',\n });\n }\n }\n\n return violations;\n}\n\n/**\n * Check if a focus indicator meets WCAG requirements\n *\n * @param element - CSS selector or element to check\n * @returns Whether the focus indicator is sufficient\n */\nexport function validateFocusIndicator(element: unknown): boolean {\n // This would typically use a library like axe-core\n // For now, return a basic check\n try {\n if (typeof window === 'undefined') return true;\n\n const el = element as HTMLElement;\n if (!el) return true;\n\n // Check if element has outline or other focus indicator\n const style = window.getComputedStyle(el);\n const hasOutline = style.outline !== 'none' && style.outlineWidth !== '0px';\n\n // Many elements use custom focus indicators via :focus-visible or other means\n // This is a basic check\n return hasOutline;\n } catch {\n return true;\n }\n}\n\n/**\n * Get suggested color pairings for improved contrast\n *\n * @param color - Color to find pairings for\n * @param targetRatio - Target contrast ratio (default 4.5 for AA)\n * @returns Array of suggested colors with their contrast ratios\n */\nexport function getSuggestedColorPairings(\n color: string,\n targetRatio: number = 4.5\n): Array<{ color: string; ratio: number }> {\n const rgb = hexToRgb(color);\n if (!rgb) return [];\n\n const luminance = calculateLuminance(rgb.r, rgb.g, rgb.b);\n\n // Common WCAG-compliant colors\n const commonColors = [\n { name: 'white', hex: '#ffffff' },\n { name: 'black', hex: '#000000' },\n { name: 'gray-100', hex: '#f3f4f6' },\n { name: 'gray-900', hex: '#111827' },\n { name: 'blue-500', hex: '#3b82f6' },\n { name: 'blue-600', hex: '#2563eb' },\n { name: 'red-500', hex: '#ef4444' },\n { name: 'green-500', hex: '#22c55e' },\n ];\n\n return commonColors\n .map((c) => {\n const cRgb = hexToRgb(c.hex)!;\n const cLuminance = calculateLuminance(cRgb.r, cRgb.g, cRgb.b);\n const ratio = calculateContrastRatio(luminance, cLuminance);\n return { color: c.hex, ratio: Math.round(ratio * 100) / 100 };\n })\n .filter((c) => c.ratio >= targetRatio)\n .sort((a, b) => b.ratio - a.ratio);\n}\n\n/**\n * Accessibility validators API\n */\nexport const validators = {\n checkColorContrast,\n validateAriaLabel,\n testKeyboardNavigation,\n auditColorScheme,\n validateInteractiveElements,\n validateFocusIndicator,\n getSuggestedColorPairings,\n};\n\n/**\n * Create a contrast error with suggestions\n */\nexport function throwContrastError(fg: string, bg: string, ratio: number): never {\n throw VocoAccessibilityError.contrastRatioFailed(fg, bg, ratio);\n}\n","/**\n * VocoButton Component\n *\n * WCAG 2.1 AA compliant button component.\n * Ensures keyboard navigation, ARIA labels, and focus indicators.\n *\n * @example\n * <VocoButton aria-label=\"Save changes\" onClick={handleSave}>\n * Save\n * </VocoButton>\n */\n\nimport { forwardRef } from 'react';\nimport { validateAriaLabel } from '../validators';\nimport type { ButtonProps } from '../types';\n\nconst variantStyles: Record<NonNullable<ButtonProps['variant']>, string> = {\n default: 'bg-blue-600 text-white hover:bg-blue-700',\n destructive: 'bg-red-600 text-white hover:bg-red-700',\n outline: 'border-2 border-gray-300 text-gray-700 hover:bg-gray-50',\n secondary: 'bg-gray-200 text-gray-900 hover:bg-gray-300',\n ghost: 'text-gray-700 hover:bg-gray-100',\n link: 'text-blue-600 underline hover:text-blue-700',\n};\n\nconst sizeStyles: Record<NonNullable<ButtonProps['size']>, string> = {\n default: 'px-4 py-2 text-sm',\n sm: 'px-3 py-1 text-xs',\n lg: 'px-6 py-3 text-base',\n icon: 'p-2',\n};\n\nexport const VocoButton = forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n children,\n variant = 'default',\n size = 'default',\n disabled = false,\n type = 'button',\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n 'aria-describedby': ariaDescribedby,\n role,\n className = '',\n ...props\n },\n ref\n ) => {\n // Validate ARIA attributes in development\n if (process.env.NODE_ENV === 'development') {\n const validation = validateAriaLabel(ariaLabel, ariaLabelledby, 'button');\n if (!validation.valid && !children) {\n console.warn('VocoButton accessibility warning:', validation.issues);\n }\n }\n\n const baseStyles = 'inline-flex items-center justify-center rounded-md font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed';\n\n // If button has children, we don't require aria-label\n const hasAccessibleName = children || ariaLabel || ariaLabelledby;\n\n return (\n <button\n ref={ref}\n type={type}\n disabled={disabled}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n aria-describedby={ariaDescribedby}\n role={role}\n className={`${baseStyles} ${variantStyles[variant]} ${sizeStyles[size]} ${className}`.trim()}\n {...(hasAccessibleName ? {} : { 'aria-label': 'Button' })}\n {...props}\n >\n {children}\n </button>\n );\n }\n);\n\nVocoButton.displayName = 'VocoButton';\n","/**\n * VocoInput Component\n *\n * WCAG 2.1 AA compliant input component.\n * Ensures label association, error message linkage, and keyboard navigation.\n *\n * @example\n * <VocoInput\n * id=\"email\"\n * label=\"Email address\"\n * type=\"email\"\n * required\n * error={errors.email}\n * hint=\"We'll never share your email\"\n * />\n */\n\nimport { forwardRef } from 'react';\nimport type { InputProps } from '../types';\n\nexport const VocoInput = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n id,\n label,\n error,\n hint,\n required = false,\n type = 'text',\n disabled = false,\n placeholder,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n 'aria-describedby': ariaDescribedby,\n role,\n className = '',\n ...props\n },\n ref\n ) => {\n const inputId = id || `input-${Math.random().toString(36).substring(2, 9)}`;\n const errorId = error ? `${inputId}-error` : undefined;\n const hintId = hint ? `${inputId}-hint` : undefined;\n\n // Build aria-describedby with error and hint\n const describedByParts = [\n ariaDescribedby,\n error ? errorId : undefined,\n hint ? hintId : undefined,\n ].filter(Boolean).join(' ');\n\n return (\n <div className=\"flex flex-col gap-1\">\n {label && (\n <label\n htmlFor={inputId}\n className=\"text-sm font-medium text-gray-700\"\n id={ariaLabelledby}\n >\n {label}\n {required && <span className=\"text-red-500 ml-1\" aria-label=\"required\">*</span>}\n </label>\n )}\n\n <input\n ref={ref}\n id={inputId}\n type={type}\n disabled={disabled}\n placeholder={placeholder}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n aria-describedby={describedByParts || undefined}\n aria-invalid={!!error}\n aria-required={required}\n required={required}\n role={role}\n className={`\n px-3 py-2 rounded-md border transition-colors\n focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2\n disabled:opacity-50 disabled:cursor-not-allowed\n ${error\n ? 'border-red-500 focus:border-red-500 focus:ring-red-500'\n : 'border-gray-300 focus:border-blue-500'\n }\n ${className}\n `.trim().replace(/\\s+/g, ' ')}\n {...props}\n />\n\n {hint && !error && (\n <span id={hintId} className=\"text-xs text-gray-500\">\n {hint}\n </span>\n )}\n\n {error && (\n <span\n id={errorId}\n className=\"text-xs text-red-500\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n {error}\n </span>\n )}\n </div>\n );\n }\n);\n\nVocoInput.displayName = 'VocoInput';\n","/**\n * VocoForm Component\n *\n * WCAG 2.1 AA compliant form component.\n * Ensures proper form validation, error announcements, and keyboard navigation.\n *\n * @example\n * <VocoForm onSubmit={handleSubmit} aria-live=\"polite\">\n * <VocoInput label=\"Name\" required />\n * <VocoButton type=\"submit\">Submit</VocoButton>\n * </VocoForm>\n */\n\nimport { forwardRef, useState, useCallback } from 'react';\nimport type { FormProps } from '../types';\n\nexport const VocoForm = forwardRef<HTMLFormElement, FormProps>(\n (\n {\n children,\n onSubmit,\n 'aria-live': ariaLive = 'polite',\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n 'aria-describedby': ariaDescribedby,\n role,\n className = '',\n ...props\n },\n ref\n ) => {\n const [errors, setErrors] = useState<Record<string, string>>({});\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const handleSubmit = useCallback(\n async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n setIsSubmitting(true);\n\n // Validate form (basic required field validation)\n const newErrors: Record<string, string> = {};\n const requiredElements = event.currentTarget.querySelectorAll('[required]');\n\n requiredElements.forEach((element) => {\n const input = element as HTMLInputElement;\n if (!input.value.trim()) {\n const fieldName = input.getAttribute('aria-label') ||\n input.getAttribute('name') ||\n 'Field';\n newErrors[input.name || input.id || Math.random().toString()] = `${fieldName} is required`;\n }\n });\n\n setErrors(newErrors);\n\n if (Object.keys(newErrors).length > 0) {\n setIsSubmitting(false);\n // Focus first error\n const firstErrorInput = event.currentTarget.querySelector('[aria-invalid=\"true\"]') as HTMLInputElement;\n firstErrorInput?.focus();\n return;\n }\n\n try {\n await onSubmit?.(event);\n } finally {\n setIsSubmitting(false);\n }\n },\n [onSubmit]\n );\n\n const formStatusId = `form-status-${Math.random().toString(36).substring(2, 9)}`;\n const hasErrors = Object.keys(errors).length > 0;\n\n return (\n <form\n ref={ref}\n onSubmit={handleSubmit}\n aria-live={ariaLive}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n aria-describedby={ariaDescribedby}\n role={role}\n aria-busy={isSubmitting}\n noValidate\n className={className}\n {...props}\n >\n {children}\n\n {/* Screen reader announcements for form status */}\n <div\n id={formStatusId}\n role=\"status\"\n aria-live=\"polite\"\n className=\"sr-only\"\n aria-atomic=\"true\"\n >\n {isSubmitting && 'Submitting form...'}\n {hasErrors && 'Form has errors. Please correct them and try again.'}\n </div>\n </form>\n );\n }\n);\n\nVocoForm.displayName = 'VocoForm';\n","/**\n * VocoAuditLog Component\n *\n * Enterprise audit log viewer component with filtering and pagination.\n *\n * @example\n * <VocoAuditLog\n * userId=\"user-123\"\n * filters={{ action: 'UPDATE' }}\n * onExport={handleExport}\n * />\n */\n\nimport { useState, useEffect } from 'react';\nimport type { AuditQueryResult, AuditAction } from '../types';\n\nexport interface VocoAuditLogProps {\n userId: string;\n filters?: {\n action?: AuditAction;\n table?: string;\n recordId?: string;\n startDate?: Date;\n endDate?: Date;\n };\n limit?: number;\n className?: string;\n onExport?: (format: 'csv' | 'json') => void;\n onLogClick?: (logId: string) => void;\n showFilters?: boolean;\n showExport?: boolean;\n}\n\nexport function VocoAuditLog({\n userId: _userId,\n filters = {},\n limit = 50,\n className = '',\n onExport,\n onLogClick,\n showFilters = true,\n showExport = true,\n}: VocoAuditLogProps) {\n const [logs, setLogs] = useState<AuditQueryResult['logs']>([]);\n const [total, setTotal] = useState(0);\n const [loading, setLoading] = useState(false);\n const [hasMore, setHasMore] = useState(false);\n const [offset, setOffset] = useState(0);\n const [currentFilters, setCurrentFilters] = useState(filters);\n\n // Fetch logs when filters or offset changes\n useEffect(() => {\n fetchLogs();\n }, [currentFilters, offset]);\n\n async function fetchLogs() {\n setLoading(true);\n try {\n // This would call the actual API\n // For now, it's a placeholder\n // const result = await queryLogs({\n // userId,\n // ...currentFilters,\n // limit,\n // offset\n // });\n\n // Mock data for now\n const result = {\n logs: [],\n total: 0,\n hasMore: false,\n };\n\n setLogs(result.logs);\n setTotal(result.total);\n setHasMore(result.hasMore);\n } catch (error) {\n console.error('Failed to fetch audit logs:', error);\n } finally {\n setLoading(false);\n }\n }\n\n function handleFilterChange(key: string, value: unknown) {\n setCurrentFilters({ ...currentFilters, [key]: value });\n setOffset(0);\n }\n\n function handleLoadMore() {\n setOffset(offset + limit);\n }\n\n function handleExportClick(format: 'csv' | 'json') {\n onExport?.(format);\n }\n\n function getActionColor(action: AuditAction): string {\n switch (action) {\n case 'INSERT':\n return 'text-green-600 bg-green-50';\n case 'UPDATE':\n return 'text-blue-600 bg-blue-50';\n case 'DELETE':\n return 'text-red-600 bg-red-50';\n default:\n return 'text-gray-600 bg-gray-50';\n }\n }\n\n return (\n <div className={className}>\n <div className=\"space-y-6\">\n {/* Header */}\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-2xl font-bold text-gray-900\">Audit Log</h2>\n {showExport && (\n <div className=\"flex gap-2\">\n <button\n onClick={() => handleExportClick('csv')}\n className=\"px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700\"\n >\n Export CSV\n </button>\n <button\n onClick={() => handleExportClick('json')}\n className=\"px-4 py-2 bg-gray-600 text-white rounded-md hover:bg-gray-700\"\n >\n Export JSON\n </button>\n </div>\n )}\n </div>\n\n {/* Filters */}\n {showFilters && (\n <div className=\"p-4 bg-gray-50 rounded-md space-y-4\">\n <div className=\"grid grid-cols-1 md:grid-cols-4 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Action\n </label>\n <select\n value={currentFilters.action || ''}\n onChange={(e) => handleFilterChange('action', e.target.value)}\n className=\"w-full px-3 py-2 border rounded-md\"\n >\n <option value=\"\">All Actions</option>\n <option value=\"INSERT\">Insert</option>\n <option value=\"UPDATE\">Update</option>\n <option value=\"DELETE\">Delete</option>\n <option value=\"LOGIN\">Login</option>\n <option value=\"LOGOUT\">Logout</option>\n </select>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Table\n </label>\n <input\n type=\"text\"\n value={currentFilters.table || ''}\n onChange={(e) => handleFilterChange('table', e.target.value)}\n placeholder=\"e.g. users\"\n className=\"w-full px-3 py-2 border rounded-md\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Start Date\n </label>\n <input\n type=\"date\"\n value={currentFilters.startDate ? currentFilters.startDate.toISOString().split('T')[0] : ''}\n onChange={(e) =>\n handleFilterChange('startDate', e.target.value ? new Date(e.target.value) : undefined)\n }\n className=\"w-full px-3 py-2 border rounded-md\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n End Date\n </label>\n <input\n type=\"date\"\n value={currentFilters.endDate ? currentFilters.endDate.toISOString().split('T')[0] : ''}\n onChange={(e) =>\n handleFilterChange('endDate', e.target.value ? new Date(e.target.value) : undefined)\n }\n className=\"w-full px-3 py-2 border rounded-md\"\n />\n </div>\n </div>\n </div>\n )}\n\n {/* Summary */}\n <div className=\"grid grid-cols-3 gap-4\">\n <div className=\"p-4 bg-white rounded-md border\">\n <div className=\"text-sm text-gray-500\">Total Entries</div>\n <div className=\"text-2xl font-bold\">{total}</div>\n </div>\n <div className=\"p-4 bg-white rounded-md border\">\n <div className=\"text-sm text-gray-500\">Showing</div>\n <div className=\"text-2xl font-bold\">{logs.length}</div>\n </div>\n <div className=\"p-4 bg-white rounded-md border\">\n <div className=\"text-sm text-gray-500\">Offset</div>\n <div className=\"text-2xl font-bold\">{offset}</div>\n </div>\n </div>\n\n {/* Log Table */}\n <div className=\"overflow-x-auto\">\n <table className=\"min-w-full divide-y divide-gray-200\">\n <thead className=\"bg-gray-50\">\n <tr>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase\">\n Timestamp\n </th>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase\">\n Action\n </th>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase\">\n Table\n </th>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase\">\n Record ID\n </th>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase\">\n Changes\n </th>\n </tr>\n </thead>\n <tbody className=\"bg-white divide-y divide-gray-200\">\n {loading ? (\n <tr>\n <td colSpan={5} className=\"px-6 py-4 text-center text-gray-500\">\n Loading...\n </td>\n </tr>\n ) : logs.length === 0 ? (\n <tr>\n <td colSpan={5} className=\"px-6 py-4 text-center text-gray-500\">\n No audit logs found\n </td>\n </tr>\n ) : (\n logs.map((log) => (\n <tr\n key={log.id}\n onClick={() => onLogClick?.(log.id)}\n className={onLogClick ? 'cursor-pointer hover:bg-gray-50' : ''}\n >\n <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-900\">\n {log.timestamp.toLocaleString()}\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap\">\n <span\n className={`px-2 py-1 text-xs font-medium rounded-full ${getActionColor(log.action)}`}\n >\n {log.action}\n </span>\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-900\">\n {log.tableName}\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-900\">\n {log.recordId}\n </td>\n <td className=\"px-6 py-4 text-sm text-gray-500\">\n <details>\n <summary className=\"cursor-pointer\">\n {Object.keys(log.oldValue || log.newValue || {}).length} fields\n </summary>\n <pre className=\"mt-2 text-xs\">\n {JSON.stringify({ old: log.oldValue, new: log.newValue }, null, 2)}\n </pre>\n </details>\n </td>\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n\n {/* Pagination */}\n {hasMore && (\n <div className=\"flex justify-center mt-4\">\n <button\n onClick={handleLoadMore}\n disabled={loading}\n className=\"px-6 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 disabled:opacity-50\"\n >\n Load More\n </button>\n </div>\n )}\n </div>\n </div>\n );\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@vocoweb/kernel",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Production-ready authentication, payments, and compliance kernel for B2B SaaS",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"module": "./dist/index.mjs",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.mjs",
|
|
11
|
+
"require": "./dist/index.js",
|
|
12
|
+
"types": "./dist/index.d.ts"
|
|
13
|
+
},
|
|
14
|
+
"./react": {
|
|
15
|
+
"import": "./dist/react.mjs",
|
|
16
|
+
"types": "./dist/react.d.ts"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"files": [
|
|
20
|
+
"dist",
|
|
21
|
+
"README.md",
|
|
22
|
+
"LICENSE"
|
|
23
|
+
],
|
|
24
|
+
"scripts": {
|
|
25
|
+
"build": "tsup",
|
|
26
|
+
"dev": "tsup --watch",
|
|
27
|
+
"test": "vitest",
|
|
28
|
+
"lint": "eslint src",
|
|
29
|
+
"type-check": "tsc --noEmit",
|
|
30
|
+
"prepublishOnly": "npm run build"
|
|
31
|
+
},
|
|
32
|
+
"keywords": [
|
|
33
|
+
"authentication",
|
|
34
|
+
"payments",
|
|
35
|
+
"stripe",
|
|
36
|
+
"supabase",
|
|
37
|
+
"gdpr",
|
|
38
|
+
"compliance",
|
|
39
|
+
"saas",
|
|
40
|
+
"vat",
|
|
41
|
+
"accessibility",
|
|
42
|
+
"audit"
|
|
43
|
+
],
|
|
44
|
+
"author": "VocoWeb <legal@vocoweb.in>",
|
|
45
|
+
"license": "MIT",
|
|
46
|
+
"repository": {
|
|
47
|
+
"type": "git",
|
|
48
|
+
"url": "https://github.com/vocoweb/vocoweb-kernel.git"
|
|
49
|
+
},
|
|
50
|
+
"homepage": "https://github.com/vocoweb/vocoweb-kernel#readme",
|
|
51
|
+
"peerDependencies": {
|
|
52
|
+
"next": ">=14.0.0",
|
|
53
|
+
"react": ">=18.0.0",
|
|
54
|
+
"react-dom": ">=18.0.0"
|
|
55
|
+
},
|
|
56
|
+
"peerDependenciesMeta": {
|
|
57
|
+
"next": {
|
|
58
|
+
"optional": true
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
"dependencies": {
|
|
62
|
+
"@radix-ui/react-label": "^2.1.0",
|
|
63
|
+
"@radix-ui/react-slot": "^1.1.0",
|
|
64
|
+
"@stripe/stripe-js": "^4.0.0",
|
|
65
|
+
"@supabase/supabase-js": "^2.39.0",
|
|
66
|
+
"class-variance-authority": "^0.7.0",
|
|
67
|
+
"clsx": "^2.1.0",
|
|
68
|
+
"jwt-decode": "^4.0.0",
|
|
69
|
+
"lucide-react": "^0.468.0",
|
|
70
|
+
"stripe": "^17.0.0",
|
|
71
|
+
"tailwind-merge": "^2.2.0",
|
|
72
|
+
"zod": "^3.22.0"
|
|
73
|
+
},
|
|
74
|
+
"devDependencies": {
|
|
75
|
+
"@types/node": "^20.11.0",
|
|
76
|
+
"@types/react": "^18.2.0",
|
|
77
|
+
"@types/react-dom": "^18.2.0",
|
|
78
|
+
"eslint": "^8.56.0",
|
|
79
|
+
"tsup": "^8.0.0",
|
|
80
|
+
"typescript": "^5.3.0",
|
|
81
|
+
"vitest": "^1.2.0"
|
|
82
|
+
},
|
|
83
|
+
"engines": {
|
|
84
|
+
"node": ">=18.0.0"
|
|
85
|
+
},
|
|
86
|
+
"publishConfig": {
|
|
87
|
+
"access": "public"
|
|
88
|
+
}
|
|
89
|
+
}
|