@flamingo-stack/openframe-frontend-core 0.0.203 → 0.0.204-snapshot.20260523020255

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/dist/chunk-27APPAJN.cjs +24 -0
  2. package/dist/chunk-27APPAJN.cjs.map +1 -0
  3. package/dist/{chunk-XGL5FKIK.js → chunk-D6BNDYZK.js} +114 -4
  4. package/dist/chunk-D6BNDYZK.js.map +1 -0
  5. package/dist/chunk-MJNXIEV2.js +24 -0
  6. package/dist/chunk-MJNXIEV2.js.map +1 -0
  7. package/dist/{chunk-25LVV26X.cjs → chunk-NLXY4QZE.cjs} +114 -4
  8. package/dist/chunk-NLXY4QZE.cjs.map +1 -0
  9. package/dist/{chunk-E6Q6UGDK.js → chunk-OFCRX24Y.js} +383 -569
  10. package/dist/chunk-OFCRX24Y.js.map +1 -0
  11. package/dist/{chunk-3YH2M76N.cjs → chunk-RDXOQWBY.cjs} +556 -742
  12. package/dist/chunk-RDXOQWBY.cjs.map +1 -0
  13. package/dist/components/announcement-bar.d.ts.map +1 -1
  14. package/dist/components/features/index.cjs +4 -3
  15. package/dist/components/features/index.cjs.map +1 -1
  16. package/dist/components/features/index.js +3 -2
  17. package/dist/components/index.cjs +4 -3
  18. package/dist/components/index.cjs.map +1 -1
  19. package/dist/components/index.js +3 -2
  20. package/dist/components/navigation/index.cjs +4 -3
  21. package/dist/components/navigation/index.cjs.map +1 -1
  22. package/dist/components/navigation/index.js +3 -2
  23. package/dist/components/navigation/navigation-sidebar.d.ts.map +1 -1
  24. package/dist/components/shared/product-release/product-release-card-skeleton.d.ts +1 -1
  25. package/dist/components/shared/product-release/product-release-card-skeleton.d.ts.map +1 -1
  26. package/dist/components/shared/product-release/product-release-card.d.ts +19 -12
  27. package/dist/components/shared/product-release/product-release-card.d.ts.map +1 -1
  28. package/dist/components/ui/index.cjs +4 -3
  29. package/dist/components/ui/index.cjs.map +1 -1
  30. package/dist/components/ui/index.js +3 -2
  31. package/dist/contexts/endpoints-runtime-context.d.ts +28 -0
  32. package/dist/contexts/endpoints-runtime-context.d.ts.map +1 -0
  33. package/dist/contexts/index.cjs +13 -0
  34. package/dist/contexts/index.cjs.map +1 -0
  35. package/dist/contexts/index.d.ts +24 -0
  36. package/dist/contexts/index.d.ts.map +1 -0
  37. package/dist/contexts/index.js +13 -0
  38. package/dist/contexts/index.js.map +1 -0
  39. package/dist/hooks/index.cjs +5 -2
  40. package/dist/hooks/index.cjs.map +1 -1
  41. package/dist/hooks/index.d.ts +1 -0
  42. package/dist/hooks/index.d.ts.map +1 -1
  43. package/dist/hooks/index.js +4 -1
  44. package/dist/hooks/use-access-code-integration.d.ts +48 -0
  45. package/dist/hooks/use-access-code-integration.d.ts.map +1 -0
  46. package/dist/hooks/use-contact-submission.d.ts.map +1 -1
  47. package/dist/index.cjs +4 -3
  48. package/dist/index.cjs.map +1 -1
  49. package/dist/index.js +7 -6
  50. package/dist/utils/access-code-client.d.ts +21 -37
  51. package/dist/utils/access-code-client.d.ts.map +1 -1
  52. package/dist/utils/index.cjs +10 -51
  53. package/dist/utils/index.cjs.map +1 -1
  54. package/dist/utils/index.js +11 -47
  55. package/dist/utils/index.js.map +1 -1
  56. package/package.json +7 -1
  57. package/src/components/announcement-bar.tsx +25 -3
  58. package/src/components/navigation/navigation-sidebar.tsx +3 -1
  59. package/src/components/shared/product-release/product-release-card-skeleton.tsx +66 -70
  60. package/src/components/shared/product-release/product-release-card.tsx +194 -242
  61. package/src/contexts/endpoints-runtime-context.tsx +68 -0
  62. package/src/contexts/index.ts +29 -0
  63. package/src/hooks/index.ts +6 -0
  64. package/src/hooks/use-access-code-integration.ts +107 -0
  65. package/src/hooks/use-contact-submission.ts +6 -2
  66. package/src/utils/access-code-client.ts +32 -75
  67. package/dist/chunk-25LVV26X.cjs.map +0 -1
  68. package/dist/chunk-3YH2M76N.cjs.map +0 -1
  69. package/dist/chunk-E6Q6UGDK.js.map +0 -1
  70. package/dist/chunk-XGL5FKIK.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/cn.ts","../../src/components/icons-v2-generated/media-playback/play-icon.tsx","../../src/utils/ods-color-utils.ts","../../src/utils/common.ts","../../src/components/icons/openmsp-logo.tsx","../../src/components/icons/openframe-logo.tsx","../../src/components/icons/flamingo-logo.tsx","../../src/components/icons/miami-cyber-gang-logo-face-only.tsx","../../src/components/icons/shell-icon.tsx","../../src/components/icons/slack-icon.tsx","../../src/components/icons/x-logo.tsx","../../src/components/icons/linkedin-icon.tsx","../../src/components/icons/youtube-icon.tsx","../../src/components/icons/instagram-icon.tsx","../../src/components/icons/facebook-icon.tsx","../../src/components/icons/windows-icon.tsx","../../src/components/icons/macos-icon.tsx","../../src/components/icons/linux-icon.tsx","../../src/components/icons/cmd-icon.tsx","../../src/components/icons/bash-icon.tsx","../../src/components/icons/nushell-icon.tsx","../../src/components/icons/deno-icon.tsx","../../src/utils/platform-config.tsx","../../src/utils/os-platforms.ts","../../src/utils/access-code-client.ts","../../src/utils/validation-utils.ts","../../src/utils/confidence-helpers.ts","../../src/utils/date-formatters.ts","../../src/utils/format-relative-time.ts","../../src/utils/dynamic-icons.tsx","../../src/types/tool.types.ts","../../src/utils/tool-utils.ts","../../src/components/icons-v2-generated/brand-logos/powershell-logo-icon.tsx","../../src/components/icons-v2-generated/brand-logos/python-logo-icon.tsx","../../src/types/shell.types.ts","../../src/utils/shell-utils.ts","../../src/components/icons-v2-generated/brand-logos/apple-logo-icon.tsx","../../src/components/icons-v2-generated/brand-logos/linux-logo-icon.tsx","../../src/components/icons-v2-generated/brand-logos/windows-logo-icon.tsx","../../src/types/os.types.ts","../../src/utils/os-utils.ts","../../src/utils/country-phone-utils.ts","../../src/utils/generic-domain-utils.ts"],"names":["extendTailwindMerge","clsx","platformColors","jsxs","jsx","Globe","React","FileText","PenSquare","Github","MessageCircle","Send","Video","Twitter","getCountries","getCountryCallingCode","isValidPhoneNumber","parsePhoneNumber"],"mappings":"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","file":"index.cjs","sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { extendTailwindMerge } from \"tailwind-merge\"\n\nconst twMerge = extendTailwindMerge<'ods-typography'>({\n extend: {\n classGroups: {\n 'ods-typography': ['text-h1', 'text-h2', 'text-h3', 'text-h4', 'text-h5', 'text-h6'],\n },\n },\n})\n\n/**\n * Combine class names with Tailwind's merge utility\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\n/**\n * Format a date to a human-readable string\n * @param date - The date to format (Date object or ISO string)\n * @param options - Formatting options\n * @returns Formatted date string\n */\nexport function formatDate(\n date: Date | string,\n options: Intl.DateTimeFormatOptions = {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n },\n): string {\n const dateObj = typeof date === \"string\" ? new Date(date) : date\n \n // Check if the date is valid\n if (isNaN(dateObj.getTime())) {\n console.warn(\"Invalid date provided to formatDate:\", date)\n return \"Invalid Date\"\n }\n \n return dateObj.toLocaleDateString(\"en-US\", options)\n}\n\n/**\n * Format a number with thousands separators\n * @param num - The number to format\n * @returns Formatted number string\n */\nexport function formatNumber(num: number): string {\n return num.toLocaleString()\n}\n\n/**\n * Format a price with currency symbol\n * @param price - The price to format\n * @param currency - The currency code\n * @returns Formatted price string\n */\nexport function formatPrice(price: number, currency = \"USD\"): string {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency,\n }).format(price)\n}\n\n/**\n * Format bytes to a human-readable string (KB, MB, GB, etc.)\n * @param bytes - The number of bytes\n * @param decimals - Number of decimal places\n * @returns Formatted bytes string\n */\nexport function formatBytes(bytes: number, decimals = 2): string {\n if (bytes === 0) return \"0 Bytes\"\n\n const k = 1024\n const dm = decimals < 0 ? 0 : decimals\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\", \"ZB\", \"YB\"]\n\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n\n return Number.parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + \" \" + sizes[i]\n}\n\n/**\n * Platform URL mappings for production (with environment variable overrides)\n */\nexport function getPlatformProductionUrl(platform: string): string {\n switch (platform) {\n // *-hub platforms — env var convention: NEXT_PUBLIC_<NAME>_HUB_URL\n case 'marketing-hub':\n return process.env.NEXT_PUBLIC_MARKETING_HUB_URL || 'https://marketing-hub.flamingo.so';\n case 'company-hub':\n return process.env.NEXT_PUBLIC_COMPANY_HUB_URL || 'https://company-hub.flamingo.so';\n case 'product-hub':\n return process.env.NEXT_PUBLIC_PRODUCT_HUB_URL || 'https://product-hub.flamingo.so';\n case 'revenue-hub':\n return process.env.NEXT_PUBLIC_REVENUE_HUB_URL || 'https://revenue-hub.flamingo.so';\n case 'people-hub':\n return process.env.NEXT_PUBLIC_PEOPLE_HUB_URL || 'https://people-hub.flamingo.so';\n // Standalone platforms — env var convention: NEXT_PUBLIC_<NAME>_URL\n case 'openmsp':\n return process.env.NEXT_PUBLIC_OPENMSP_URL || 'https://www.openmsp.ai';\n case 'flamingo':\n return process.env.NEXT_PUBLIC_FLAMINGO_URL || 'https://www.flamingo.run';\n case 'tmcg':\n return process.env.NEXT_PUBLIC_TMCG_URL || 'https://www.tmcg.miami';\n case 'flamingo-teaser':\n return process.env.NEXT_PUBLIC_FLAMINGO_URL || 'https://www.flamingo.run';\n case 'openframe':\n return process.env.NEXT_PUBLIC_OPENFRAME_URL || 'https://openframe.ai';\n case 'universal':\n return process.env.NEXT_PUBLIC_FLAMINGO_URL || 'https://www.flamingo.run';\n default:\n return process.env.NEXT_PUBLIC_FLAMINGO_URL || 'https://www.flamingo.run';\n }\n}\n\n/**\n * Get ALL unique base domains from getPlatformProductionUrl\n *\n * Extracts domains by calling getPlatformProductionUrl for each platform identifier.\n * Platform identifiers match the switch cases in getPlatformProductionUrl.\n *\n * Handles 3 cases:\n * 1. LOCALHOST DEBUG - No domain (hostname-specific cookies)\n * 2. VERCEL PREVIEW (*.vercel.app) - Use vercel.app domain\n * 3. PRODUCTION - Extract from ALL platform URLs via getPlatformProductionUrl\n *\n * @returns Array of all unique base domains (with and without wildcard)\n */\nexport function getAllPlatformBaseDomains(): string[] {\n if (typeof window === 'undefined') return []\n\n const hostname = window.location.hostname\n\n // Case 1: LOCALHOST DEBUG - no domains needed\n if (hostname === 'localhost' ||\n hostname === '127.0.0.1' ||\n hostname.startsWith('127.')) {\n return []\n }\n\n // Case 2: VERCEL PREVIEW - use vercel.app domain\n const isVercelPreview = process.env.VERCEL_ENV === 'preview' ||\n process.env.NEXT_PUBLIC_VERCEL_ENV === 'preview' ||\n hostname.includes('.vercel.app')\n\n if (isVercelPreview) {\n return ['.vercel.app', 'vercel.app']\n }\n\n // Case 3: PRODUCTION - extract from ALL platforms using getPlatformProductionUrl\n // Platform identifiers MUST match switch cases in getPlatformProductionUrl —\n // otherwise the corresponding domain is omitted from cookie scope.\n const platformIdentifiers = [\n 'marketing-hub', 'company-hub', 'product-hub', 'revenue-hub', 'people-hub',\n 'openmsp', 'flamingo', 'tmcg', 'flamingo-teaser', 'openframe', 'universal'\n ]\n\n const baseDomains = new Set<string>()\n\n platformIdentifiers.forEach(platform => {\n try {\n const url = getPlatformProductionUrl(platform)\n const urlHostname = new URL(url).hostname\n const parts = urlHostname.split('.')\n\n if (parts.length >= 2) {\n const baseDomain = parts.slice(-2).join('.')\n baseDomains.add(`.${baseDomain}`) // Wildcard\n baseDomains.add(baseDomain) // Non-wildcard\n }\n } catch (error) {\n console.warn('[Platform Domains] Failed to parse URL for platform:', platform, error)\n }\n })\n\n return Array.from(baseDomains)\n}\n\n/**\n * Get the application base URL for the current environment\n *\n * @param platform - Optional platform name (openmsp, flamingo, tmcg, openframe, etc.)\n * @returns The base URL with protocol (https:// or http://)\n *\n * Priority order:\n * 1. Environment variable override (NEXT_PUBLIC_*_URL)\n * 2. Platform-specific URL (if platform parameter provided)\n * 3. VERCEL_PROJECT_PRODUCTION_URL (Vercel production domain)\n * 4. Production fallback (current app or openmsp)\n * 5. Development (http://localhost:3000)\n *\n * Environment Variables (optional overrides — only set when production domain\n * differs from the hardcoded default):\n *\n * Hub deployments (NEXT_PUBLIC_<NAME>_HUB_URL):\n * - NEXT_PUBLIC_MARKETING_HUB_URL -> marketing-hub.flamingo.so\n * - NEXT_PUBLIC_COMPANY_HUB_URL -> company-hub.flamingo.so\n * - NEXT_PUBLIC_PRODUCT_HUB_URL -> product-hub.flamingo.so\n * - NEXT_PUBLIC_REVENUE_HUB_URL -> revenue-hub.flamingo.so\n * - NEXT_PUBLIC_PEOPLE_HUB_URL -> people-hub.flamingo.so\n *\n * Standalone platforms (NEXT_PUBLIC_<NAME>_URL):\n * - NEXT_PUBLIC_OPENMSP_URL -> www.openmsp.ai\n * - NEXT_PUBLIC_FLAMINGO_URL -> www.flamingo.run\n * - NEXT_PUBLIC_TMCG_URL -> www.tmcg.miami\n * - NEXT_PUBLIC_FLAMINGO_TEASER_URL -> www.flamingo.cx\n * - NEXT_PUBLIC_OPENFRAME_URL -> openframe.ai\n *\n * @example\n * getBaseUrl() // Current app URL\n * getBaseUrl('flamingo') // https://www.flamingo.run (production) or http://localhost:3000 (dev)\n * getBaseUrl('openmsp') // https://www.openmsp.ai (or NEXT_PUBLIC_OPENMSP_URL if set)\n */\nexport function getBaseUrl(platform?: string): string {\n // In development, always use localhost (regardless of platform)\n if (process.env.NODE_ENV !== 'production') {\n return process.env.NEXT_PUBLIC_DEV_URL || 'http://localhost:3000'\n }\n\n // If platform is specified, return its production URL with env variable override support\n if (platform) {\n return getPlatformProductionUrl(platform)\n }\n\n // Production: Use Vercel domain if available\n if (process.env.VERCEL_PROJECT_PRODUCTION_URL) {\n return `https://${process.env.VERCEL_PROJECT_PRODUCTION_URL}`\n }\n\n // Production fallback: Use canonical www domain to avoid Google \"Page with redirect\" issue.\n // openmsp.ai redirects to www.openmsp.ai, so we set the base URL to the\n // final destination to ensure canonical URLs do not require a redirect.\n return 'https://www.openmsp.ai'\n}\n","import type { SVGProps } from \"react\";\n\n/** SVG path data for the play icon — exported for reuse in server-side image generation */\nexport const PLAY_ICON_PATH = \"M4.875 5.006c0-2.501 2.793-3.989 4.87-2.592l9.78 6.578c2.135 1.437 2.135 4.58 0 6.016l-9.78 6.579c-2.077 1.396-4.87-.091-4.87-2.593zm2.25 13.988c0 .7.783 1.118 1.364.727l9.78-6.58c.81-.545.81-1.738 0-2.283L8.488 4.28a.875.875 0 0 0-1.364.726v13.988Z\";\n\nexport interface PlayIconProps\n extends Omit<SVGProps<SVGSVGElement>, \"width\" | \"height\"> {\n className?: string;\n size?: number;\n color?: string;\n}\nexport function PlayIcon({\n className = \"\",\n size = 24,\n color = \"currentColor\",\n ...props\n}: PlayIconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n className={className}\n {...props}\n >\n <path\n fill={color}\n d={PLAY_ICON_PATH}\n />\n </svg>\n );\n}\n","/**\n * ODS Color Token Utility Functions\n * \n * Provides runtime utilities for working with ODS color tokens\n */\n\nimport { colorTokens as odsTokens } from './ods-color-tokens-stub';\n\nexport type Platform = 'openmsp' | 'openframe' | 'flamingo';\nexport type ColorCategory = 'open' | 'flamingo' | 'system' | 'attention';\nexport type ColorVariant = 'base' | 'hover' | 'active' | 'focus' | 'disabled';\n\n/**\n * Gets the raw ODS token value for a specific color\n */\nexport function getODSToken(\n category: ColorCategory,\n color: string,\n variant: ColorVariant = 'base'\n): string | undefined {\n const tokenKey = `${category}-${color}-${variant}`;\n return (odsTokens as any)[tokenKey];\n}\n\n/**\n * Gets the current platform's accent color\n */\nexport function getPlatformAccentColor(platform?: Platform): string {\n const currentPlatform = platform || getCurrentPlatform();\n \n const platformColors = {\n 'openmsp': 'var(--ods-open-yellow-base)', // CSS variable instead of hex\n 'openframe': 'var(--ods-open-yellow-base)', // CSS variable instead of hex\n 'flamingo': 'var(--ods-flamingo-pink-base)' // CSS variable instead of hex\n };\n \n return platformColors[currentPlatform];\n}\n\n/**\n * Gets the current platform from environment or DOM\n */\nexport function getCurrentPlatform(): Platform {\n // Server-side: use environment variable\n if (typeof window === 'undefined') {\n return (process.env.NEXT_PUBLIC_APP_TYPE as Platform) || 'openmsp';\n }\n \n // Client-side: check DOM attribute first, fallback to environment\n const domPlatform = document.documentElement.getAttribute('data-app-type');\n if (domPlatform) {\n return domPlatform as Platform;\n }\n \n return (process.env.NEXT_PUBLIC_APP_TYPE as Platform) || 'openmsp';\n}\n\n/**\n * Switches the platform theme by updating CSS custom properties\n */\nexport function switchPlatformTheme(platform: Platform): void {\n if (typeof window === 'undefined') return;\n \n const root = document.documentElement;\n root.setAttribute('data-app-type', platform);\n \n // Note: Cannot modify process.env at runtime in production\n // This would only work in development/test environments\n \n // Dispatch custom event for components to react to platform changes\n window.dispatchEvent(new CustomEvent('platformThemeChanged', {\n detail: { platform }\n }));\n}\n\n/**\n * Gets a semantic color value for the current platform\n */\nexport function getSemanticColor(semanticName: string, platform?: Platform): string | undefined {\n if (typeof window === 'undefined') return undefined;\n \n const currentPlatform = platform || getCurrentPlatform();\n \n // Switch platform temporarily to get the color\n const originalPlatform = getCurrentPlatform();\n if (currentPlatform !== originalPlatform) {\n switchPlatformTheme(currentPlatform);\n }\n \n const testElement = document.createElement('div');\n document.body.appendChild(testElement);\n \n const computedStyle = getComputedStyle(testElement);\n const colorValue = computedStyle.getPropertyValue(`--color-${semanticName}`);\n \n document.body.removeChild(testElement);\n \n // Restore original platform\n if (currentPlatform !== originalPlatform) {\n switchPlatformTheme(originalPlatform);\n }\n \n return colorValue.trim() || undefined;\n}\n\n/**\n * Converts an ODS token to its corresponding Tailwind class\n */\nexport function tokenToTailwindClass(\n tokenKey: string,\n type: 'bg' | 'text' | 'border' = 'bg'\n): string | undefined {\n // Map common tokens to Tailwind classes\n const tokenMappings: Record<string, string> = {\n // Accent colors\n 'accent-primary': 'accent',\n 'accent-hover': 'accent-hover',\n 'accent-active': 'accent-active',\n \n // Background colors\n 'bg': 'bg',\n 'bg-card': 'card',\n 'bg-hover': 'bg-hover',\n 'bg-active': 'bg-active',\n \n // Text colors\n 'text-primary': 'text-primary',\n 'text-secondary': 'text-secondary',\n 'text-muted': 'text-muted',\n 'text-disabled': 'text-disabled',\n 'text-on-accent': 'text-on-accent',\n 'text-on-dark': 'text-on-dark',\n \n // Border colors\n 'border-default': 'border',\n 'border-hover': 'border-hover',\n 'border-focus': 'border-focus',\n \n // Status colors\n 'success': 'success',\n 'error': 'error',\n 'warning': 'warning',\n 'info': 'info'\n };\n \n const mappedToken = tokenMappings[tokenKey];\n if (!mappedToken) return undefined;\n \n return `${type}-ods-${mappedToken}`;\n}\n\n/**\n * Gets all available ODS tokens for a category\n */\nexport function getTokensByCategory(category: ColorCategory): Record<string, string> {\n const tokens: Record<string, string> = {};\n \n Object.entries(odsTokens).forEach(([key, value]) => {\n if (key.startsWith(`${category}-`)) {\n tokens[key] = value as string;\n }\n });\n \n return tokens;\n}\n\n/**\n * Validates if a color token exists in the ODS system\n */\nexport function isValidODSToken(tokenKey: string): boolean {\n return tokenKey in odsTokens;\n}\n\n/**\n * Gets the platform configuration for theming\n */\nexport function getPlatformConfig(platform?: Platform) {\n const currentPlatform = platform || getCurrentPlatform();\n \n return {\n platform: currentPlatform,\n accentColor: getPlatformAccentColor(currentPlatform),\n isDarkTheme: currentPlatform !== 'flamingo',\n isLightTheme: currentPlatform === 'flamingo',\n brandName: {\n 'openmsp': 'OpenMSP',\n 'openframe': 'OpenFrame',\n 'flamingo': 'Flamingo'\n }[currentPlatform]\n };\n}\n\n/**\n * Generates CSS custom property declarations for a platform\n */\nexport function generatePlatformCSS(platform: Platform): string {\n const accentColor = getPlatformAccentColor(platform);\n const tokens = getTokensByCategory('system');\n \n let css = `[data-app-type=\"${platform}\"] {\\n`;\n css += ` --color-accent-primary: ${accentColor};\\n`;\n \n // Add platform-specific overrides\n if (platform === 'flamingo') {\n css += ` --color-bg: var(--ods-system-greys-white);\\n`;\n css += ` --color-text-primary: var(--ods-system-greys-background);\\n`;\n }\n \n if (platform === 'openframe') {\n css += ` --color-bg: var(--ods-system-greys-darker);\\n`;\n }\n \n css += `}\\n`;\n \n return css;\n}\n\n/**\n * Applies a color token as a CSS custom property\n */\nexport function applyColorToken(\n element: HTMLElement,\n property: string,\n tokenKey: string\n): void {\n const tokenValue = (odsTokens as any)[tokenKey];\n if (tokenValue) {\n element.style.setProperty(`--${property}`, tokenValue);\n }\n}\n\n/**\n * Creates a color interpolation between two ODS tokens\n */\nexport function interpolateColors(\n startToken: string,\n endToken: string,\n progress: number\n): string {\n const startColor = (odsTokens as any)[startToken];\n const endColor = (odsTokens as any)[endToken];\n \n if (!startColor || !endColor) {\n return startColor || endColor || '#000000';\n }\n \n // Simple hex color interpolation\n const hexToRgb = (hex: string) => {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n return result ? {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16)\n } : { r: 0, g: 0, b: 0 };\n };\n \n const rgbToHex = (r: number, g: number, b: number) => {\n return \"#\" + ((1 << 24) + (Math.round(r) << 16) + (Math.round(g) << 8) + Math.round(b)).toString(16).slice(1);\n };\n \n const start = hexToRgb(startColor);\n const end = hexToRgb(endColor);\n \n const interpolated = {\n r: start.r + (end.r - start.r) * progress,\n g: start.g + (end.g - start.g) * progress,\n b: start.b + (end.b - start.b) * progress\n };\n \n return rgbToHex(interpolated.r, interpolated.g, interpolated.b);\n}\n\n/**\n * Hook for React components to use platform-aware colors\n */\nexport function usePlatformColors(platform?: Platform) {\n const currentPlatform = platform || getCurrentPlatform();\n const config = getPlatformConfig(currentPlatform);\n \n return {\n platform: currentPlatform,\n accentColor: config.accentColor,\n isDarkTheme: config.isDarkTheme,\n isLightTheme: config.isLightTheme,\n brandName: config.brandName,\n getToken: (category: ColorCategory, color: string, variant?: ColorVariant) =>\n getODSToken(category, color, variant),\n switchTheme: (newPlatform: Platform) => switchPlatformTheme(newPlatform),\n getSemanticColor: (semanticName: string) => getSemanticColor(semanticName, currentPlatform)\n };\n}\n\n/**\n * Picks a near-black or near-white text color with adequate contrast on `hex`.\n * Uses Rec. 601 luminance.\n */\nexport function getReadableTextColor(hex: string): string {\n const n = parseInt(hex.replace('#', ''), 16)\n const r = (n >> 16) & 0xff\n const g = (n >> 8) & 0xff\n const b = n & 0xff\n const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255\n return luminance > 0.5 ? '#212121' : '#fafafa'\n}\n\nexport default {\n getODSToken,\n getPlatformAccentColor,\n getCurrentPlatform,\n switchPlatformTheme,\n getSemanticColor,\n tokenToTailwindClass,\n getTokensByCategory,\n isValidODSToken,\n getPlatformConfig,\n generatePlatformCSS,\n applyColorToken,\n interpolateColors,\n usePlatformColors\n};","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\n/**\n * Utility functions for common operations\n */\n\n/**\n * Merge class names with Tailwind CSS\n * @param inputs - Class names to merge\n * @returns Merged class names\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\n/**\n * Delay execution for a specified time\n * @param ms - Milliseconds to delay\n * @returns Promise that resolves after the delay\n */\nexport function delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\n/**\n * Generate a random string of specified length\n * @param length - Length of the string\n * @returns Random string\n */\nexport function generateRandomString(length = 8): string {\n const chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\"\n let result = \"\"\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length))\n }\n return result\n}\n\n/**\n * Truncate a string to a specified length\n * @param str - String to truncate\n * @param maxLength - Maximum length\n * @param suffix - Suffix to add to truncated string\n * @returns Truncated string\n */\nexport function truncateString(str: string, maxLength: number, suffix = \"...\"): string {\n if (str.length <= maxLength) return str\n return str.substring(0, maxLength - suffix.length) + suffix\n}\n\n/**\n * Deep clone an object\n * @param obj - Object to clone\n * @returns Cloned object\n */\nexport function deepClone<T>(obj: T): T {\n return JSON.parse(JSON.stringify(obj))\n}\n\n/**\n * Get the Slack community join URL from environment variables\n * @returns Slack community join URL or fallback URL\n */\nexport function getSlackCommunityJoinUrl(): string {\n const url = process.env.NEXT_PUBLIC_SLACK_COMMUNITY_JOIN_URL\n if (!url) {\n console.warn('NEXT_PUBLIC_SLACK_COMMUNITY_JOIN_URL is not defined in environment variables')\n return 'https://join.slack.com/t/openmsp/shared_invite/zt-36bl7mx0h-3~U2nFH6nqHqoTPXMaHEHA'\n }\n return url\n}\n\n","import React from 'react';\n\ninterface OpenmspLogoProps extends React.SVGProps<SVGSVGElement> {\n className?: string;\n frontBubbleColor?: string;\n innerFrontBubbleColor?: string;\n backBubbleColor?: string;\n color?: string;\n}\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport function OpenmspLogo({ className = '', frontBubbleColor = '#000000', innerFrontBubbleColor = '#ffffff', backBubbleColor = '#ffffff', ...props }: OpenmspLogoProps) {\n return (\n <svg\n width=\"97\"\n height=\"96\"\n viewBox=\"0 0 97 96\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n {...props}\n >\n <path\n d=\"M73.933 0C75.7003 0 77.133 1.43269 77.133 3.2V54.4C77.133 56.1673 75.7003 57.6 73.933 57.6H3.53301C1.7657 57.6 0.333008 56.1673 0.333008 54.4V3.2C0.333008 1.43269 1.7657 0 3.53301 0H73.933ZM10.1076 47.6494C10.1076 48.0912 10.4658 48.4494 10.9076 48.4494H66.5584C67.0002 48.4494 67.3584 48.0912 67.3584 47.6494V9.95059C67.3584 9.50876 67.0002 9.15059 66.5584 9.15059H10.9076C10.4658 9.15059 10.1076 9.50876 10.1076 9.95059V47.6494Z\"\n fill={backBubbleColor} />\n <path\n d=\"M19.5332 22.4C19.5332 20.6326 20.9659 19.2 22.7332 19.2H93.1332C94.9005 19.2 96.3332 20.6326 96.3332 22.4V76.8C96.3332 78.2222 95.3945 79.4737 94.0292 79.8719L39.7572 95.7013C39.2452 95.8506 38.7332 95.4666 38.7332 94.9333V80C38.7332 79.5581 38.375 79.2 37.9332 79.2H22.7332C20.9659 79.2 19.5332 77.7673 19.5332 76V22.4Z\"\n fill={innerFrontBubbleColor} />\n <path\n d=\"M93.1332 19.2C94.9005 19.2 96.3332 20.6326 96.3332 22.4V76.8C96.3332 78.2222 95.3945 79.4737 94.0292 79.8719L39.7572 95.7013C39.2452 95.8506 38.7332 95.4666 38.7332 94.9333V80C38.7332 79.5581 38.375 79.2 37.9332 79.2H22.7332C20.9659 79.2 19.5332 77.7673 19.5332 76V22.4C19.5332 20.6326 20.9659 19.2 22.7332 19.2H93.1332ZM48.3377 82.1286C48.3355 82.6633 48.8484 83.0497 49.3617 82.9L86.1572 72.1672C86.4985 72.0676 86.7332 71.7547 86.7332 71.3992V29.6C86.7332 29.1581 86.375 28.8 85.9332 28.8H29.9332C29.4914 28.8 29.1332 29.1581 29.1332 29.6V68.8C29.1332 69.2418 29.4914 69.6 29.9332 69.6H47.5869C48.03 69.6 48.3887 69.9602 48.3869 70.4033L48.3377 82.1286Z\"\n fill={frontBubbleColor} />\n <circle\n cx=\"45.1334\" cy=\"44.8\" r=\"6.4\"\n fill={frontBubbleColor} />\n </svg>\n );\n}\n","import React from 'react';\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport const OpenFrameLogo = ({ className, lowerPathColor, upperPathColor, ...props }: { className?: string, lowerPathColor?: string, upperPathColor?: string } & React.SVGProps<SVGSVGElement>) => {\n return (\n <svg\n {...props}\n className={className}\n width=\"32\"\n height=\"32\"\n viewBox=\"0 0 32 32\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{\n '--fill-0': 'currentColor',\n ...props.style\n } as React.CSSProperties}\n >\n <g>\n <g>\n {/* White squares - top right, bottom left, bottom right, bottom center */}\n <path\n d=\"M21.3333 16.5333C21.3333 16.2388 21.5721 16 21.8667 16H26.1333C26.4279 16 26.6667 16.2388 26.6667 16.5333V20.8C26.6667 21.0946 26.4279 21.3333 26.1333 21.3333H21.8667C21.5721 21.3333 21.3333 21.0946 21.3333 20.8V16.5333Z\"\n fill={lowerPathColor ?? '#ffffff'}\n />\n <path\n d=\"M16 21.8667C16 21.5721 16.2388 21.3333 16.5333 21.3333H20.8C21.0946 21.3333 21.3333 21.5721 21.3333 21.8667V26.1333C21.3333 26.4279 21.0946 26.6667 20.8 26.6667H16.5333C16.2388 26.6667 16 26.4279 16 26.1333V21.8667Z\"\n fill={lowerPathColor ?? '#ffffff'}\n />\n <path\n d=\"M26.6667 21.8667C26.6667 21.5721 26.9054 21.3333 27.2 21.3333H31.4667C31.7612 21.3333 32 21.5721 32 21.8667V26.1333C32 26.4279 31.7612 26.6667 31.4667 26.6667H27.2C26.9054 26.6667 26.6667 26.4279 26.6667 26.1333V21.8667Z\"\n fill={lowerPathColor ?? '#ffffff'}\n />\n <path\n d=\"M21.3333 27.2C21.3333 26.9054 21.5721 26.6667 21.8667 26.6667H26.1333C26.4279 26.6667 26.6667 26.9054 26.6667 27.2V31.4667C26.6667 31.7612 26.4279 32 26.1333 32H21.8667C21.5721 32 21.3333 31.7612 21.3333 31.4667V27.2Z\"\n fill={lowerPathColor ?? '#ffffff'}\n />\n </g>\n {/* Black frame/border */}\n <path\n d=\"M30.9333 0H1.06667C0.477563 0 0 0.477564 0 1.06667V30.9333C0 31.5224 0.477563 32 1.06667 32H14.9333C15.5224 32 16 31.5224 16 30.9333V27.7333C16 27.1442 15.5224 26.6667 14.9333 26.6667H5.86667C5.57211 26.6667 5.33333 26.4279 5.33333 26.1333V5.86667C5.33333 5.57211 5.57211 5.33333 5.86667 5.33333H26.1333C26.4279 5.33333 26.6667 5.57212 26.6667 5.86667V14.9333C26.6667 15.5224 27.1442 16 27.7333 16H30.9333C31.5224 16 32 15.5224 32 14.9333V1.06667C32 0.477563 31.5224 0 30.9333 0Z\"\n fill={upperPathColor ?? '#1A1A1A'}\n />\n </g>\n </svg>\n );\n}; ","import React from 'react';\n\n/** Raw SVG path data — single source of truth for the Flamingo logo.\n * Used by the React component and exported for non-React contexts (e.g. email HTML). */\nexport const FLAMINGO_LOGO_SVG_PATH = 'M20.8645 77.9756C20.6306 78.095 20.3452 77.9582 20.3369 77.7002C20.2055 73.6173 23.4398 62.2314 27.7657 59.0452C31.477 45.9806 61.8811 24.0208 81.7715 48.2044C83.1662 49.7884 84.0264 52.0978 84.7512 54.0436C86.0615 57.5613 86.9291 59.8908 89.7117 54.5977C92.4782 49.335 87.2725 42.2381 81.701 34.6426C75.7955 26.5918 69.4791 17.9808 71.8102 10.4001C75.4609 -1.47146 91.9849 -4.33245 94.5422 7.89834C98.4226 10.7002 104.422 17.0815 96.2751 25.8554C96.0466 26.1014 95.6263 25.9453 95.6104 25.6132C95.417 21.5769 93.9498 16.1177 90.5641 14.5697C89.0187 13.8632 88.0307 13.6723 87.1405 13.5003C85.585 13.1998 84.3282 12.9569 80.919 10.1221C75.236 5.39658 75.236 20.1291 87.7386 32.3599C97.1156 41.533 106.493 66.2324 84.0287 70.9981C74.9174 72.9311 68.0892 72.0015 61.3076 71.0782C61.0953 71.0493 60.8831 71.0204 60.6708 70.9916V89.3274L66.3745 91.8104C67.0914 92.1225 67.4139 92.944 67.0949 93.6453C66.7759 94.3466 65.9362 94.6621 65.2193 94.35L60.6708 92.37V118.61C60.6708 119.378 60.0347 120 59.2501 120C58.4654 120 57.8293 119.378 57.8293 118.61V91.133L42.4873 84.4542C42.0611 84.2686 41.7551 83.8902 41.6687 83.4417C41.5824 82.9931 41.7266 82.5317 42.0546 82.2072L54.1527 70.2377C45.537 69.536 35.8193 70.3474 20.8645 77.9756ZM57.7692 70.613L45.5202 82.732L57.8293 88.0905V70.6204C57.8093 70.618 57.7893 70.6155 57.7692 70.613Z';\n\nexport const FLAMINGO_LOGO_VIEWBOX = '0 0 121 120';\n\ninterface FlamingoLogoProps extends React.SVGProps<SVGSVGElement> {\n className?: string;\n fill?: string;\n}\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport function FlamingoLogo({ className = '', fill = 'var(--ods-flamingo-pink-base)', ...props }: FlamingoLogoProps) {\n return (\n <svg\n width=\"121\"\n height=\"120\"\n viewBox={FLAMINGO_LOGO_VIEWBOX}\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d={FLAMINGO_LOGO_SVG_PATH}\n fill={fill}\n />\n </svg>\n );\n} ","import React from 'react';\n\ninterface MiamiCyberGangLogoFaceOnlyProps {\n size?: number;\n /** Pink color used for accent elements. Defaults to ODS accent color */\n originalPink?: string;\n /** White color used for text and details. Defaults to ODS text-on-accent color */\n originalWhite?: string;\n className?: string;\n}\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport const MiamiCyberGangLogoFaceOnly: React.FC<MiamiCyberGangLogoFaceOnlyProps> = ({\n size = 64,\n originalPink = \"var(--ods-accent, #F357BB)\",\n originalWhite = \"var(--ods-text-on-accent, #FAFAFA)\",\n className = ''\n}) => {\n return (\n <svg className={className} width={size} height={size} viewBox=\"0 0 120 120\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M102.395 53.6809C90.4125 50.7582 80.6974 44.729 74.1665 33.9873C73.8956 34.2151 73.7234 34.299 73.6447 34.4355C68.7714 42.9024 61.1392 47.742 52.0761 50.5062C47.3393 51.9497 42.4555 52.9072 37.5024 53.8814C38.8546 50.9314 40.3233 48.1903 39.8929 44.7238C32.5693 50.9692 23.5986 52.1744 14.4546 53.8478C14.7695 52.1649 14.9501 50.6658 15.3375 49.2212C16.6004 44.5086 17.6723 39.7203 19.3048 35.1347C22.3566 26.5661 28.8445 21.5521 37.3439 18.9685C43.3699 17.1376 49.5848 16.6746 55.8502 16.7114C57.7094 16.7229 59.5676 16.7135 61.4972 16.5234C58.6459 13.5482 55.13 11.7205 51.3055 10.3305C52.8141 9.65024 59.3786 10.0628 64.043 11.1714C68.2685 12.1761 72.1833 13.8527 75.4588 16.9087C80.9704 13.8873 86.8746 13.1651 93.1336 13.3834C91.7416 14.0102 90.444 14.5036 89.2356 15.1618C87.9706 15.8505 86.7423 16.6326 85.5864 17.4935C84.4379 18.348 83.3997 19.3506 82.1021 20.4697C82.7572 20.8256 83.1697 21.0776 83.6054 21.2812C89.3312 23.9698 93.9283 27.9151 97.25 33.3406C99.2404 36.5919 100.029 40.2327 100.817 43.8682C101.477 46.9085 101.961 49.9887 102.51 53.0531C102.538 53.2127 102.451 53.3922 102.395 53.6809Z\"\n fill={originalWhite} />\n <path\n d=\"M45.7357 106.481C44.8472 105.838 44.7949 104.555 45.5033 103.717C46.1854 102.911 47.3459 102.791 48.2538 103.331C54.1019 106.808 59.9027 106.818 65.7439 103.334C66.6566 102.79 67.8521 102.94 68.5404 103.749C69.2297 104.56 69.1869 105.767 68.3442 106.417C62.4972 110.926 52.5717 111.432 45.7357 106.481Z\"\n fill={originalWhite} />\n <path\n d=\"M81.9671 69.9535C85.2121 69.9577 87.8881 72.2967 87.9564 75.1869C88.0246 78.1117 85.1533 80.7006 81.8768 80.6691C78.6203 80.6376 76.0892 78.2996 76.0724 75.3087C76.0545 72.2222 78.5573 69.9493 81.9671 69.9535Z\"\n fill={originalWhite} />\n <path\n d=\"M35.5036 80.7335C33.1909 80.7356 31.549 79.9891 30.3942 78.3535C28.684 75.9337 29.2792 72.7863 31.761 71.1675C33.8239 69.8216 36.0149 69.6893 38.2321 70.7706C40.5449 71.8971 41.6063 74.0303 41.1632 76.5237C40.8011 78.5551 38.6815 80.4238 36.4369 80.6768C36.0212 80.723 35.6013 80.7282 35.5036 80.7335Z\"\n fill={originalWhite} />\n <path\n d=\"M16.2685 72.4296C16.743 61.5083 30.7046 61.3183 31.8437 61.2228C31.8437 61.2228 43.4306 60.0837 48.749 65.0221C54.0674 69.9605 50.9326 86.6757 45.1397 90.285C39.0119 94.1022 28.71 94.2733 23.9606 91.2341C19.2122 88.1948 15.794 83.351 16.2685 72.4296ZM95.1911 91.2341C90.4427 94.2733 80.1408 94.1022 74.013 90.285C68.219 86.6757 65.0853 69.9605 70.4037 65.0221C75.7221 60.0837 87.309 61.2238 87.309 61.2238C88.4481 61.3183 102.41 61.5083 102.884 72.4307C103.359 83.352 99.9405 88.1948 95.1911 91.2341ZM59.5758 68.9474C59.9538 68.9999 60.422 69.0817 61.0015 69.2014C64.7053 69.9605 64.4208 76.419 66.8899 83.162C69.3591 89.905 74.1075 96.458 88.7336 95.3179C103.359 94.1788 105.163 81.0728 105.638 78.3181C106.113 75.5644 107.253 72.9052 107.253 72.9052L108.687 71.4711C108.985 71.173 109.153 70.7688 109.153 70.3478V63.6174C109.153 62.8762 108.641 62.2369 107.92 62.071C105.532 61.522 99.8575 60.2958 92.5319 59.2292C82.7496 57.8045 72.7784 59.7037 70.6882 61.1283C68.5991 62.5529 66.8899 63.0274 66.8899 63.0274H52.2627C52.2627 63.0274 50.5536 62.5529 48.4645 61.1283C46.3753 59.7037 36.4031 57.8045 26.6208 59.2281C19.2951 60.2947 13.6208 61.522 11.2325 62.071C10.5113 62.2369 10 62.8762 10 63.6164V70.3468C10 70.7688 10.168 71.1719 10.4651 71.4701L11.9002 72.9042C11.9002 72.9042 13.0392 75.5634 13.5148 78.3181C13.9893 81.0718 15.7929 94.1778 30.4191 95.3179C45.0442 96.458 49.7936 89.905 52.2627 83.162C54.7319 76.419 54.4474 69.9605 58.1512 69.2014C58.7307 69.0817 59.1989 68.9999 59.5758 68.9474Z\"\n fill={originalPink} />\n </svg>\n\n\n );\n};","import React from 'react'\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport function ShellIcon({ className = \"w-5 h-5\", size = 22, color = 'white' }: { className?: string; size?: number; color?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 48 48\" >\n <path\n fill='transparent'\n stroke={color}\n d=\"M6.5 8.4a2 2 0 0 0-2 2v27.2a2 2 0 0 0 2 2h35a2 2 0 0 0 2-2V10.4a2 2 0 0 0-2-2zM9 23.16l7.72 6L9 35.13v-12zm20.46 11.97h-11\" />\n </svg >\n )\n}\n","import { color } from 'framer-motion'\nimport React from 'react'\n\ninterface SlackIconProps {\n width?: number | string\n height?: number | string\n className?: string\n injectedColor?: string\n}\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport function SlackIcon({ \n width = 24, \n height = 24, \n className = \"text-current\" ,\n injectedColor \n}: SlackIconProps) {\n\n const redColor = injectedColor || \"#E01E5A\";\n const blueColor = injectedColor || \"#36C5F0\";\n const greenColor = injectedColor || \"#2EB67D\";\n const yellowColor = injectedColor || \"#ECB22E\";\n\n return (\n <svg \n width={width} \n height={height} \n viewBox=\"0 0 24 24\" \n fill=\"none\" \n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <g>\n <path \n d=\"M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zM6.313 15.165a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313z\" \n fill={redColor} \n />\n <path \n d=\"M8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zM8.834 6.313a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312z\" \n fill={blueColor} \n />\n <path \n d=\"M18.956 8.834a2.528 2.528 0 0 1 2.521-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.523 2.521h-2.521V8.834zM17.688 8.834a2.528 2.528 0 0 1-2.523 2.521 2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.528 2.528 0 0 1 2.523 2.522v6.312z\" \n fill={greenColor} \n />\n <path \n d=\"M15.165 18.956a2.528 2.528 0 0 1 2.523 2.521A2.528 2.528 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.523v-2.521h2.52zM15.165 17.688a2.527 2.527 0 0 1-2.52-2.523 2.528 2.528 0 0 1 2.52-2.521h6.313A2.528 2.528 0 0 1 24 15.165a2.528 2.528 0 0 1-2.522 2.523h-6.313z\" \n fill={yellowColor}\n />\n </g>\n </svg>\n )\n} ","import React from 'react';\n\ninterface XLogoProps extends React.SVGProps<SVGSVGElement> {\n className?: string;\n}\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport function XLogo({ className = '', color = 'white', ...props }: XLogoProps) {\n return (\n <svg\n width={24}\n height={24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n {...props}\n >\n <path d=\"M9.75292 12.6562C10.1923 12.2169 10.9044 12.2169 11.3437 12.6562C11.7831 13.0956 11.7831 13.8077 11.3437 14.2471L3.7954 21.7954C3.35606 22.2348 2.64392 22.2348 2.20458 21.7954C1.76524 21.3561 1.76524 20.6439 2.20458 20.2046L9.75292 12.6562ZM20.2046 2.20459C20.6439 1.76525 21.3561 1.76525 21.7954 2.20459C22.2347 2.64393 22.2347 3.35607 21.7954 3.79541L14.2471 11.3438C13.8077 11.7831 13.0956 11.7831 12.6562 11.3438C12.2169 10.9044 12.2169 10.1923 12.6562 9.75293L20.2046 2.20459Z\" fill=\"#FAFAFA\" />\n <path d=\"M7.9995 1.875L8.13426 1.88232C8.444 1.91951 8.72702 2.08473 8.9121 2.34082L21.9126 20.3408C22.1599 20.6833 22.1943 21.1365 22.0019 21.5127C21.8096 21.8887 21.4223 22.125 21 22.125H16.0005C15.6393 22.125 15.2994 21.9519 15.0879 21.6592L2.08739 3.65918C1.84004 3.31669 1.8057 2.86346 1.99803 2.4873C2.19042 2.11133 2.57763 1.875 2.99999 1.875H7.9995ZM16.5747 19.875H18.7983L7.42528 4.125H5.20165L16.5747 19.875Z\" fill=\"#FAFAFA\" />\n </svg>\n );\n} ","import React from 'react';\n\ninterface LinkedInIconProps extends React.SVGProps<SVGSVGElement> {\n className?: string;\n size?: number;\n}\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport function LinkedInIcon({ className = '', size = 24, color = 'white', ...props }: LinkedInIconProps) {\n return (\n <svg \n width={size} \n height={size} \n viewBox=\"0 0 24 24\" \n fill=\"none\" \n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n {...props}\n >\n <path \n d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z\" \n fill={color}\n />\n </svg>\n );\n}","import React from 'react';\n\ninterface YouTubeIconProps {\n color?: string;\n className?: string;\n}\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport function YouTubeIcon({ className ,\n color = 'white'\n}: YouTubeIconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M2.5 17a24.12 24.12 0 0 1 0-10 2 2 0 0 1 1.4-1.4 49.56 49.56 0 0 1 16.2 0A2 2 0 0 1 21.5 7a24.12 24.12 0 0 1 0 10 2 2 0 0 1-1.4 1.4 49.55 49.55 0 0 1-16.2 0A2 2 0 0 1 2.5 17\" />\n <path d=\"m10 15 5-3-5-3z\" />\n </svg>\n );\n}","import React from 'react';\n\ninterface InstagramIconProps {\n color?: string;\n className?: string;\n}\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport function InstagramIcon({ className ,\n color = 'white'\n}: InstagramIconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <rect width=\"20\" height=\"20\" x=\"2\" y=\"2\" rx=\"5\" ry=\"5\" />\n <path d=\"m16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z\" />\n <line x1=\"17.5\" x2=\"17.51\" y1=\"6.5\" y2=\"6.5\" />\n </svg>\n );\n}","import React from 'react';\n\ninterface FacebookIconProps {\n color?: string;\n className?: string;\n}\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport function FacebookIcon({ className ,\n color = 'white'\n}: FacebookIconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z\" />\n </svg>\n );\n}","import React from \"react\"\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport interface WindowsIconProps extends React.SVGProps<SVGSVGElement> {}\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport function WindowsIcon({ className, color = 'white', ...props }: WindowsIconProps) {\n return (\n <svg \n width=\"16\" \n height=\"16\" \n viewBox=\"0 0 16 16\" \n fill=\"none\" \n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n {...props}\n >\n <path d=\"M0.833374 2.22562L6.28233 1.48656L6.28468 6.72147L0.838322 6.75234L0.833374 2.22567V2.22562ZM6.27973 7.32457L6.2839 12.564L0.837593 11.8182L0.83728 7.28945L6.27973 7.32457ZM6.94025 1.38981L14.165 0.3396V6.65486L6.94025 6.71192V1.38981ZM14.1667 7.37385L14.165 13.6606L6.9402 12.645L6.93009 7.36207L14.1667 7.37385Z\" fill={color}/>\n </svg>\n )\n}","import React from \"react\"\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport interface MacOSIconProps extends React.SVGProps<SVGSVGElement> {\n color?: string;\n}\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport function MacOSIcon({ className, color = 'white', ...props }: MacOSIconProps) {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n {...props}\n >\n <path d=\"M12.2131 8.41846C12.1971 6.7312 13.5884 5.92054 13.651 5.88193C12.8678 4.73511 11.6515 4.57748 11.2182 4.55979C10.1831 4.45363 9.1978 5.171 8.67145 5.171C8.14509 5.171 7.3347 4.57427 6.47616 4.59196C5.34642 4.60804 4.30494 5.24981 3.72242 6.26314C2.55096 8.29943 3.42394 11.3233 4.56812 12.9784C5.12818 13.7875 5.79254 14.6994 6.66873 14.6657C7.51282 14.6319 7.83056 14.1188 8.84797 14.1188C9.86538 14.1188 10.1526 14.6657 11.0433 14.6496C11.9499 14.6319 12.5244 13.8228 13.0797 13.0106C13.7184 12.0696 13.9831 11.1609 13.9992 11.1126C13.9783 11.1046 12.2324 10.4338 12.2131 8.41846Z\" fill={color} />\n <path d=\"M10.5393 3.46284C11.0047 2.89827 11.3176 2.11496 11.2326 1.33325C10.5634 1.3606 9.75299 1.7804 9.27317 2.34497C8.8431 2.84359 8.46598 3.64138 8.56869 4.407C9.31168 4.4649 10.0755 4.02579 10.5393 3.46284Z\" fill={color} />\n </svg>\n )\n}","import React from \"react\"\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport interface LinuxIconProps extends React.SVGProps<SVGSVGElement> {}\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport function LinuxIcon({ className, color = 'white', ...props }: LinuxIconProps) {\n return (\n <svg \n width=\"16\" \n height=\"16\" \n viewBox=\"0 0 17 20\" \n fill=\"none\" \n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n {...props}\n >\n <path d=\"M16.5665 16.3141C16.0389 16.0972 15.6042 15.7556 15.6357 15.1013C15.6664 14.448 15.1694 14.015 15.1694 14.015C15.1694 14.015 15.6042 12.5845 15.2002 11.4033C14.797 10.2204 13.4629 8.32531 12.4392 6.8956C11.4171 5.46507 12.2849 3.81673 11.3549 1.7038C10.4232 -0.409119 8.00404 -0.285272 6.70073 0.616579C5.39654 1.51677 5.79974 3.75437 5.86111 4.8134C5.92335 5.86899 5.88924 6.62142 5.76903 6.89473C5.64629 7.16804 4.8075 8.1707 4.24833 9.00936C3.68999 9.84806 3.2868 11.5894 2.88191 12.3043C2.47872 13.0191 2.7583 13.6716 2.7583 13.6716C2.7583 13.6716 2.47872 13.7639 2.26133 14.2328C2.04395 14.6973 1.61009 14.9151 0.834407 15.0689C0.0587253 15.2243 0.0587252 15.7239 0.244535 16.2834C0.431214 16.8419 0.245404 17.1545 0.0280204 17.8676C-0.189363 18.5808 0.896647 18.8002 1.95108 18.9224C3.00639 19.0479 4.18526 19.732 5.1792 19.8559C6.17056 19.9806 6.48168 19.1726 6.48168 19.1726C6.48168 19.1726 7.59836 18.9224 8.7764 18.8933C9.95615 18.8617 11.0711 19.1419 11.0711 19.1419C11.0711 19.1419 11.2885 19.6389 11.6917 19.8558C12.0958 20.0736 12.9644 20.1052 13.5227 19.5159C14.0819 18.9241 15.5711 18.1793 16.4081 17.7122C17.2476 17.2442 17.0942 16.5302 16.5665 16.3141ZM9.30566 2.60573C9.83756 2.60573 10.2672 3.13438 10.2672 3.78604C10.2672 4.24893 10.0515 4.64779 9.73699 4.84163C9.65685 4.80663 9.57248 4.77076 9.48297 4.73232C9.67222 4.63836 9.80689 4.39669 9.80689 4.11482C9.80689 3.7476 9.58014 3.4495 9.29969 3.4495C9.02267 3.4495 8.79506 3.74843 8.79506 4.11482C8.79506 4.25063 8.82746 4.38129 8.88286 4.48803C8.71748 4.42226 8.56491 4.36078 8.44557 4.31552C8.3808 4.15667 8.34413 3.97732 8.34413 3.786C8.34413 3.13438 8.77376 2.60573 9.30566 2.60573ZM9.23662 5.09444C9.50257 5.18669 9.79836 5.36006 9.76769 5.5317C9.73616 5.70421 9.59634 5.70421 9.23662 5.92458C8.87607 6.14322 8.09525 6.62831 7.84546 6.6599C7.59401 6.6915 7.4542 6.55059 7.18825 6.37891C6.9223 6.20641 6.42193 5.79729 6.54807 5.57953C6.54807 5.57953 6.93763 5.2806 7.10898 5.12433C7.28115 4.96718 7.71932 4.59224 7.98527 4.64094C8.25122 4.68619 8.97067 5.00048 9.23662 5.09444ZM6.83876 2.79277C7.25816 2.79277 7.59911 3.29323 7.59911 3.91072C7.59911 4.02431 7.58804 4.12935 7.56671 4.23099C7.46444 4.26599 7.36043 4.32237 7.25985 4.40777C7.20872 4.44962 7.16351 4.4889 7.12004 4.52818C7.18655 4.4035 7.21295 4.22584 7.18311 4.03881C7.12684 3.70147 6.90266 3.45548 6.68018 3.49052C6.45857 3.52897 6.32472 3.83213 6.38099 4.1712C6.4381 4.51028 6.66145 4.75623 6.88306 4.71949C6.89586 4.71692 6.9078 4.71351 6.92056 4.70923C6.81232 4.81344 6.71258 4.90312 6.61114 4.9791C6.30429 4.83649 6.07924 4.41201 6.07924 3.90981C6.07928 3.2924 6.41936 2.79277 6.83876 2.79277ZM6.01961 18.4997C5.92074 18.9455 5.3999 19.2691 5.3999 19.2691C4.92767 19.4177 3.61495 18.8472 3.01994 18.597C2.4258 18.3502 0.91277 18.2733 0.714157 18.053C0.517243 17.8275 0.813028 17.3313 0.888901 16.8607C0.962206 16.3867 0.740593 16.0903 0.813898 15.7667C0.888901 15.4447 1.85553 15.4447 2.22636 15.2218C2.59885 14.9972 2.67302 14.3515 2.97051 14.1782C3.26799 14.0031 3.8127 14.624 4.03601 14.9733C4.25849 15.3191 5.10151 16.8103 5.44847 17.1827C5.79626 17.5551 6.11848 18.0538 6.01961 18.4997ZM11.5066 14.1679C11.4171 14.606 11.4171 16.1894 11.4171 16.1894C11.4171 16.1894 10.4556 17.5243 8.9647 17.743C7.47554 17.9616 6.73052 17.8044 6.73052 17.8044L5.89343 16.8419C5.89343 16.8419 6.5438 16.7471 6.45177 16.0947C6.35799 15.4422 4.46651 14.5403 4.12468 13.7315C3.78456 12.9244 4.06331 11.5554 4.49804 10.8713C4.93194 10.188 5.20982 8.69685 5.64455 8.19806C6.07928 7.70271 6.4194 6.64537 6.26426 6.17822C6.26426 6.17822 7.19509 7.29787 7.8455 7.11253C8.49674 6.9255 9.95694 5.83657 10.1726 6.02448C10.3891 6.21151 12.2508 10.3135 12.4357 11.6194C12.6224 12.9244 12.3113 13.9185 12.3113 13.9185C12.3113 13.9185 11.5986 13.7323 11.5066 14.1679ZM16.2682 17.0964C15.9784 17.3629 14.3656 18.0154 13.8823 18.5244C13.4015 19.0291 12.7732 19.44 12.3888 19.3204C12.0018 19.1982 11.6651 18.6679 11.8339 17.8941C12.0018 17.1229 12.1476 16.2774 12.1237 15.794C12.0998 15.3106 12.0018 14.6572 12.1237 14.5607C12.2439 14.4668 12.4357 14.5138 12.4357 14.5138C12.4357 14.5138 12.3411 15.4302 12.8943 15.6736C13.4475 15.9127 14.2437 15.5771 14.4849 15.3337C14.727 15.0937 14.8958 14.7316 14.8958 14.7316C14.8958 14.7316 15.1361 14.8537 15.1123 15.2389C15.0884 15.6249 15.2802 16.1818 15.6433 16.3739C16.0039 16.5644 16.558 16.8317 16.2682 17.0964Z\" fill={color}/>\n </svg>\n )\n}","import React from 'react'\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport interface CmdIconProps {\n size?: number\n className?: string\n color?: string\n}\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport const CmdIcon: React.FC<CmdIconProps> = ({ size = 16, className = '', color='white'}) => {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M3 4C3 3.44772 3.44772 3 4 3H20C20.5523 3 21 3.44772 21 4V20C21 20.5523 20.5523 21 20 21H4C3.44772 21 3 20.5523 3 20V4Z\"\n stroke={color}\n />\n <text\n x=\"12\"\n y=\"16\"\n textAnchor=\"middle\"\n fill={color}\n fontSize=\"10\"\n fontFamily=\"monospace\"\n fontWeight=\"bold\"\n >\n \\&gt;\n </text>\n </svg>\n )\n}\n\nCmdIcon.displayName = 'CmdIcon'\n","import React from 'react'\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport interface BashIconProps {\n size?: number\n className?: string\n color?: string\n}\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport const BashIcon: React.FC<BashIconProps> = ({ size = 16, className = '' , color = 'white'}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n className={className}\n viewBox=\"0 0 24 24\">\n <path fill={color}\n d=\"M5 9h2.31l.32-3h2l-.32 3h2l.32-3h2l-.32 3H15v2h-1.9l-.2 2H15v2h-2.31l-.32 3h-2l.32-3h-2l-.32 3h-2l.32-3H5v-2h1.9l.2-2H5zm4.1 2l-.2 2h2l.2-2M19 6h-2v8h2m0 2h-2v2h2Z\" />\n </svg>\n )\n}\n\nBashIcon.displayName = 'BashIcon'\n","import React from 'react'\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport interface NushellIconProps {\n size?: number\n className?: string\n color?: string\n}\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport const NushellIcon: React.FC<NushellIconProps> = ({ size = 16, className = '', color = 'white' }) => {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n className={className}\n viewBox=\"0 0 24 24\">\n <path\n fill={color}\n d=\"M0 16.338h1.25v-5.7c.417-.624 1.205-1.309 2.127-1.309c1.176 0 1.34.64 1.34 2.247v4.762h1.25v-5.685c0-1.458-.67-2.32-2.202-2.32c-.923 0-1.964.46-2.59 1.264l-.103-1.1H0Zm10.177-7.842h-1.25v5.698c0 1.46.745 2.307 2.263 2.307c.921 0 1.889-.431 2.514-1.22l.104 1.057h1.072V8.496h-1.25v5.773c-.432.67-1.265 1.25-2.129 1.25c-.907 0-1.324-.446-1.324-1.458zm8.11-.997l-.61.952l5.251 3.229l-5.251 3.244l.669.922L24 12.32v-1.28z\" />\n </svg>\n )\n}\n\nNushellIcon.displayName = 'NushellIcon'\n","import React from 'react'\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport interface DenoIconProps {\n size?: number\n className?: string\n color?: string\n}\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport const DenoIcon: React.FC<DenoIconProps> = ({ size = 16, className = '', color = 'white' }) => {\n return (\n <svg\n version=\"1.1\"\n width={size}\n height={size}\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 122.87 122.88\">\n <g>\n <path\n fill={color}\n d=\"M56.6,0.03c-0.29,0.03-1.21,0.14-2.04,0.21C42.74,1.48,31.11,6.48,21.62,14.43c-1.75,1.45-5.74,5.44-7.19,7.19 C6.57,31.01,1.98,41.54,0.28,54.01c-0.38,2.77-0.38,12.1,0,14.87c1.69,12.47,6.29,23,14.14,32.38c1.45,1.75,5.44,5.74,7.19,7.19 C31,116.31,41.54,120.9,54,122.6c2.77,0.38,12.1,0.38,14.87,0c12.47-1.69,23-6.29,32.38-14.14c1.75-1.45,5.74-5.44,7.19-7.19 c7.86-9.38,12.45-19.92,14.14-32.38c0.38-2.77,0.38-12.1,0-14.87c-1.69-12.47-6.29-23-14.14-32.38c-1.45-1.75-5.44-5.74-7.19-7.19 C91.9,6.6,81.26,1.95,68.96,0.3c-1.33-0.18-3.26-0.26-6.85-0.29C59.38-0.01,56.89,0,56.6,0.03L56.6,0.03z M57.36,6.56 c0,1.77,0.12,5.61,0.29,9.25c0.09,1.78,0.2,4.34,0.24,5.67c0.17,4.71,0.67,17.09,0.74,18.19l0.08,1.1l-0.68-0.08 c-0.38-0.03-0.73-0.12-0.79-0.17c-0.05-0.06-0.15-1.1-0.21-2.33c-0.27-5.38-1.16-26.25-1.25-29.3l-0.09-3.35l0.42-0.06 c0.23-0.03,0.6-0.08,0.85-0.09l0.41-0.01L57.36,6.56L57.36,6.56L57.36,6.56z M71.82,6.2c0.02,0.02,0.06,4.58,0.11,10.14 c0.06,5.58,0.14,10.58,0.18,11.12c0.05,0.56,0.03,1.04-0.05,1.07c-0.06,0.05-0.44,0.05-0.82,0l-0.7-0.06l-0.11-4.4 c-0.06-2.43-0.14-5.12-0.17-6c-0.12-2.67-0.23-11.76-0.14-11.98C70.2,5.93,70.37,5.91,71,6.02C71.44,6.11,71.8,6.18,71.82,6.2 L71.82,6.2L71.82,6.2z M36.87,11.26c0.09,0.14,0.8,8.46,1.68,19.36c0.29,3.7,0.57,7.09,0.62,7.51c0.08,0.77,0.06,0.8-0.42,1.1 c-0.27,0.17-0.54,0.3-0.6,0.3c-0.05,0-0.14-0.39-0.18-0.88c-0.21-1.96-1.03-11.45-1.6-18.31c-0.33-4.03-0.63-7.65-0.68-8.04 c-0.08-0.67-0.06-0.73,0.33-0.94C36.49,11.11,36.76,11.06,36.87,11.26L36.87,11.26L36.87,11.26z M78.47,14.3 c0.42,0.15,0.47,0.23,0.56,1.09c0.15,1.51,0.11,8.73-0.06,8.73c-0.44,0-1.35-0.51-1.42-0.8c-0.05-0.18-0.09-2.33-0.09-4.76 C77.45,13.65,77.39,13.93,78.47,14.3L78.47,14.3z M50.56,15.01c0,0.41,0.11,2.66,0.23,5.03c0.12,2.37,0.26,5.38,0.32,6.68 c0.11,2.63,0.14,2.54-0.88,2.6c-0.5,0.02-0.5,0.02-0.53-0.74c-0.03-0.42-0.11-1.74-0.2-2.95c-0.08-1.21-0.26-3.82-0.38-5.82 c-0.12-1.99-0.27-3.97-0.32-4.4c-0.09-0.76-0.08-0.79,0.33-0.94c0.24-0.09,0.67-0.17,0.94-0.17C50.56,14.3,50.56,14.3,50.56,15.01 L50.56,15.01L50.56,15.01z M92.47,17.08l0.51,0.21l0.11,2.02c0.05,1.1,0.08,3.49,0.05,5.29l-0.05,3.29l-0.63-0.32l-0.63-0.3 l-0.05-5.02c-0.03-2.77-0.02-5.11,0.02-5.21C91.85,16.82,91.85,16.82,92.47,17.08L92.47,17.08L92.47,17.08z M64.88,19.06 c0.09,0.09,0.3,7.42,0.32,11.14l0.02,2.24l-0.71-0.11c-0.41-0.05-0.74-0.09-0.76-0.11c-0.05-0.03-0.5-11.23-0.5-12.32v-1.12 l0.77,0.09C64.46,18.94,64.84,19.01,64.88,19.06L64.88,19.06L64.88,19.06z M99.68,20.13c0.18,0.21,0.21,3.52,0.26,21.77 c0.05,20.96,0.05,21.5-0.23,21.5c-0.17,0-0.39-0.09-0.53-0.2c-0.23-0.17-0.26-1.99-0.33-19.9c-0.06-10.85-0.14-20.7-0.18-21.9 l-0.09-2.18l0.44,0.32C99.27,19.74,99.56,19.99,99.68,20.13L99.68,20.13L99.68,20.13z M86.13,23.23c0.08,0.06,0.15,0.92,0.17,1.9 c0.08,3.34,0.09,23.81,0.02,23.88c-0.03,0.03-0.3-0.05-0.6-0.17l-0.54-0.23l0-25.7L85.58,23C85.81,23.06,86.05,23.15,86.13,23.23 L86.13,23.23L86.13,23.23z M44.42,24.07c0.05,0.41,0.12,1.33,0.17,2.09c0.05,0.74,0.15,2.43,0.24,3.75 c0.18,2.66,0.15,2.83-0.71,2.83c-0.45,0-0.51-0.05-0.57-0.5c-0.15-0.89-0.68-8.33-0.6-8.45c0.08-0.11,0.86-0.38,1.22-0.41 C44.26,23.36,44.38,23.68,44.42,24.07L44.42,24.07z M19.43,27.93c0.17,1.6,0.5,4.96,0.74,7.45c0.26,2.49,0.47,4.61,0.47,4.7 c0,0.18-1.16,0.76-1.28,0.63c-0.08-0.08-1.59-13.45-1.59-14.05c0-0.36,1.16-1.89,1.31-1.72C19.13,24.96,19.28,26.31,19.43,27.93 L19.43,27.93z M78.68,29.51l0.44,0.26l0.02,3.26c0.01,1.78,0.05,3.78,0.05,4.43c0.03,1.36-0.14,1.59-0.95,1.3l-0.47-0.17v-1.3 c0-0.73-0.05-2.83-0.11-4.68l-0.09-3.35h0.35C78.09,29.26,78.44,29.38,78.68,29.51L78.68,29.51L78.68,29.51z M26.06,35.38 c0.27,2.9,0.71,7.8,1,10.88l0.51,5.59l-0.59,0.59l-0.57,0.59l-0.11-1.19c-0.06-0.67-0.36-3.75-0.68-6.86 c-0.32-3.11-0.77-7.63-1-10.03l-0.42-4.35l0.59-0.54c0.53-0.5,0.59-0.51,0.7-0.24C25.55,29.95,25.81,32.46,26.06,35.38L26.06,35.38 L26.06,35.38z M14.74,37.2c0.33,2.98,1.21,10.89,1.96,17.59c0.76,6.69,1.47,13.15,1.6,14.36c0.12,1.21,0.33,3.04,0.45,4.08 c0.21,1.77,0.21,1.89-0.03,2.07c-0.36,0.27-0.51,0.24-0.51-0.08c0-0.14-0.14-1.28-0.3-2.52c-0.27-2.07-0.73-5.58-1.74-13.45 c-0.21-1.59-0.62-4.74-0.91-7.03c-0.3-2.28-0.74-5.68-0.98-7.56c-0.24-1.87-0.65-5.08-0.91-7.15c-0.27-2.05-0.44-3.88-0.39-4.08 c0.11-0.41,1-1.83,1.09-1.74C14.11,31.75,14.41,34.21,14.74,37.2L14.74,37.2L14.74,37.2z M10.12,43.72 c0.23,1.81,0.65,5.12,0.94,7.37c0.29,2.24,0.65,5.03,0.82,6.2l0.29,2.12l-0.32,0.27c-0.18,0.15-0.36,0.21-0.42,0.15 c-0.06-0.06-0.18-0.67-0.27-1.33c-0.09-0.67-0.65-4.55-1.25-8.61l-1.07-7.4l0.35-1.03c0.18-0.56,0.38-1.01,0.42-1.01 C9.65,40.44,9.88,41.92,10.12,43.72L10.12,43.72L10.12,43.72z M93.08,41.74c0.21,0.21,0.24,1.15,0.24,8.08v7.84H92.9 c-0.92,0-0.91,0.23-0.97-8.36l-0.05-7.81h0.48C92.63,41.5,92.96,41.6,93.08,41.74L93.08,41.74z M60,44.44 c3.41,0.51,6.39,1.47,9.34,2.98c1.9,0.98,2.81,1.66,4.93,3.69c3.14,3.01,5.08,5.64,6.89,9.35c2.64,5.41,3.67,10.2,4.97,23.04 c0.59,5.76,1.36,16.2,1.53,20.48c0.05,1.24,0.15,3.28,0.24,4.53c0.17,2.66,0.36,2.3-1.98,3.43c-3.25,1.57-6.38,2.66-10.5,3.67 c-5.05,1.24-8.31,1.63-13.3,1.65l-3.63,0.01l0.03-1.74c0-0.95,0.09-3.17,0.18-4.91c0.45-8.42,0.36-19.04-0.23-24.93 c-0.33-3.38-0.98-7.49-1.35-8.4c-0.08-0.2,0.27-0.36,1.77-0.88c2.74-0.95,5.11-2.15,5.47-2.73c0.65-1.12-0.51-2.72-1.99-2.72 c-0.26,0-1.03,0.27-1.74,0.59c-3.39,1.56-10.17,3.39-14.08,3.79c-2.7,0.29-6.91,0.12-9.82-0.41c-1.59-0.29-4.43-1.36-6.8-2.58 c-2.73-1.42-4.41-3.31-4.91-5.55c-0.27-1.21-0.2-3.63,0.15-4.99c0.38-1.5,1.44-3.67,2.4-4.94c4.31-5.67,13.19-10.58,22.3-12.3 C52.78,44.03,56.89,43.97,60,44.44L60,44.44L60,44.44z M106.62,44.91c0.54,0.23,0.6,0.29,0.6,0.8c0.03,4.13-0.06,13.55-0.14,13.95 c-0.02,0.14-0.8,0.15-1.13,0.03c-0.21-0.08-0.24-0.89-0.24-7.56c0-4.77,0.06-7.46,0.15-7.46 C105.94,44.67,106.29,44.77,106.62,44.91L106.62,44.91z M113.22,53.21l0.54,0.23l-0.11,12.51c-0.12,15.94-0.14,16.41-0.71,17.79 c-0.94,2.25-0.89,2.7-0.8-7.18c0.03-4.94,0.11-9.94,0.14-11.11c0.03-1.16,0.06-4.44,0.08-7.3c0-3.45,0.05-5.17,0.15-5.17 C112.6,52.98,112.92,53.09,113.22,53.21L113.22,53.21z M22.34,56.97c0.09,1.22,0.06,1.35-0.38,2.31l-0.48,1.03L21.3,58.8 c-0.29-2.42-0.29-2.52,0.29-2.89c0.26-0.18,0.53-0.3,0.57-0.27C22.21,55.67,22.3,56.27,22.34,56.97L22.34,56.97z M13.01,66.08 c0.14,1.24,1.19,9.46,1.74,13.49c0.82,6.24,0.88,7.13,0.51,6.75c-0.05-0.05-0.39-2.15-0.76-4.67c-2.36-16.29-2.34-16.18-2.15-16.3 C12.76,65.08,12.9,65.23,13.01,66.08L13.01,66.08L13.01,66.08z M23.89,73c0.09,0.38,0.53,4.47,0.53,4.97 c0,0.42-0.54,0.82-0.79,0.57c-0.08-0.08-0.27-1.36-0.42-2.84c-0.17-1.5-0.33-3.05-0.38-3.46l-0.09-0.76l0.53,0.6 C23.57,72.43,23.84,72.84,23.89,73L23.89,73L23.89,73z M36.08,78.7c0.17,0.15,0.27,0.76,0.41,2.39c0.23,2.95,0.26,2.72-0.36,2.72 c-0.63,0-0.62,0.05-0.83-2.61c-0.21-2.7-0.21-2.67,0.2-2.67C35.69,78.52,35.94,78.61,36.08,78.7L36.08,78.7z M48.05,78.93 c0.03,0.15,0.11,1.06,0.17,2.01c0.05,0.95,0.18,3.1,0.3,4.76c0.42,6.1,0.44,6.88,0.18,6.88c-0.29,0-0.32-0.23-0.65-4.53 c-0.12-1.78-0.35-4.59-0.5-6.24c-0.14-1.65-0.23-3.02-0.18-3.05C47.54,78.56,47.97,78.7,48.05,78.93L48.05,78.93L48.05,78.93z M19.64,81.83c0.09,0.14,0.67,4.97,1.37,11.57c0.21,1.99,0.42,3.91,0.47,4.28l0.08,0.65l-0.38-0.24c-0.29-0.2-0.39-0.39-0.39-0.74 c0-0.95-0.65-7.22-1.15-11.06c-0.29-2.18-0.51-4.09-0.51-4.28C19.13,81.69,19.49,81.57,19.64,81.83L19.64,81.83z M106.85,88.14 l-0.11,6.32l-0.38,0.56c-0.86,1.27-0.82,1.51-0.77-5.56l0.03-6.48l0.56-0.57c0.3-0.3,0.6-0.56,0.67-0.56 C106.89,81.84,106.89,84.68,106.85,88.14L106.85,88.14L106.85,88.14z M92.87,98.16c0.08,8.78,0.06,9.46-0.18,9.73 c-0.15,0.17-0.29,0.27-0.33,0.23c-0.11-0.12-0.26-19.27-0.14-19.37c0.06-0.06,0.21-0.09,0.35-0.08 C92.76,88.72,92.81,89.79,92.87,98.16L92.87,98.16L92.87,98.16z M43.52,92.15c0.11,0.94,0.48,5.42,0.63,7.54 c0.09,1.42,0.09,1.47-0.24,1.57c-0.18,0.06-0.39,0.05-0.45-0.03c-0.11-0.11-0.44-3.46-0.85-8.63l-0.11-1.24h0.47 C43.41,91.36,43.44,91.39,43.52,92.15L43.52,92.15z M31.64,97.44c0.11,0.11,0.18,0.48,0.18,0.86c0,0.39,0.18,2.43,0.38,4.55 c0.57,5.79,0.62,6.57,0.36,6.42c-0.39-0.23-0.74-0.57-0.67-0.67c0.03-0.06-0.03-0.82-0.15-1.68c-0.11-0.88-0.24-2.3-0.3-3.17 c-0.06-0.88-0.2-2.48-0.32-3.55c-0.29-2.64-0.27-2.95,0.06-2.95C31.34,97.25,31.53,97.33,31.64,97.44L31.64,97.44L31.64,97.44z M38.79,107.61c0.05,0.33,0.14,1.57,0.2,2.75c0.11,2.27,0.06,2.43-0.56,1.96c-0.18-0.14-0.3-0.71-0.48-2.43 c-0.32-3.11-0.33-2.99,0.26-2.93C38.63,107,38.7,107.06,38.79,107.61L38.79,107.61L38.79,107.61z\" />\n <path\n fill={color}\n d=\"M33.39,51.68c-1.57,0.68-1.69,2.81-0.21,3.57c1.07,0.54,2.16,0.29,2.72-0.65 C36.96,52.87,35.23,50.88,33.39,51.68L33.39,51.68L33.39,51.68z M43.64,53.13c-1.45,0.89-1.45,3.04,0,3.93 c1.44,0.86,3.29-0.27,3.29-1.99C46.93,53.4,45.03,52.29,43.64,53.13L43.64,53.13z\" />\n </g>\n </svg>\n )\n}\nDenoIcon.displayName = 'DenoIcon'","import React from 'react';\nimport { OpenmspLogo, FlamingoLogo, OpenFrameLogo, MiamiCyberGangLogoFaceOnly } from '../components/icons';\nimport { Globe } from 'lucide-react';\nimport type { SelectableOption } from '../components/features';\nimport type { PlatformConfig } from '../types/platform';\n\n// Platform icons mapping with consistent colors matching app theme\nexport const platformIcons = {\n openframe: <OpenFrameLogo className=\"h-5 w-5\" lowerPathColor=\"#FFC008\" upperPathColor=\"#ffffff\" />,\n openmsp: <OpenmspLogo className=\"h-5 w-5\" />,\n flamingo: <FlamingoLogo className=\"h-5 w-5\" fill=\"#EC4899\" />,\n 'flamingo-teaser': <FlamingoLogo className=\"h-5 w-5\" fill=\"#EC4899\" />,\n 'marketing-hub': <FlamingoLogo className=\"h-5 w-5\" fill=\"#F357BB\" />,\n 'product-hub': <FlamingoLogo className=\"h-5 w-5\" fill=\"#5EA62E\" />,\n 'revenue-hub': <FlamingoLogo className=\"h-5 w-5\" fill=\"#FFC008\" />,\n 'people-hub': <FlamingoLogo className=\"h-5 w-5\" fill=\"#5EFAF0\" />,\n 'company-hub': <FlamingoLogo className=\"h-5 w-5\" fill=\"#f36666\" />,\n tmcg: <MiamiCyberGangLogoFaceOnly className=\"h-5 w-5\" />,\n universal: <Globe className=\"h-5 w-5 text-[#10B981]\" />\n};\n\n// Platform colors mapping\nexport const platformColors = {\n openmsp: 'bg-[#3B82F6]',\n openframe: 'bg-[#8B5CF6]',\n flamingo: 'bg-[#EC4899]',\n 'flamingo-teaser': 'bg-[#F59E0B]',\n 'marketing-hub': 'bg-[#F357BB]',\n 'product-hub': 'bg-[#5EA62E]',\n 'revenue-hub': 'bg-[#FFC008]',\n 'people-hub': 'bg-[#5EFAF0]',\n 'company-hub': 'bg-[#f36666]',\n tmcg: 'bg-[#FF6B6B]',\n universal: 'bg-[#10B981]'\n};\n\n// Platform display names for consistent naming across the app\nexport const platformDisplayNames = {\n openmsp: 'OpenMSP',\n openframe: 'OpenFrame',\n flamingo: 'Flamingo',\n 'flamingo-teaser': 'Flamingo Teaser',\n 'marketing-hub': 'Flamingo Marketing Hub',\n 'product-hub': 'Flamingo Product Hub',\n 'revenue-hub': 'Flamingo Revenue Hub',\n 'people-hub': 'Flamingo People Hub',\n 'company-hub': 'Flamingo Company Hub',\n tmcg: 'TMCG',\n universal: 'Universal'\n};\n\n// Platform descriptions for consistent messaging across the app\nexport const platformDescriptions = {\n openmsp: 'Comprehensive directory and comparison platform for managed service providers (MSPs) and technology vendors. Reduce vendor costs and discover open-source alternatives.',\n openframe: 'AI-driven open-source security operations center (SOC) and endpoint detection platform for MSPs.',\n flamingo: 'AI-driven open-source OS for MSPs. Swap bloated vendor tools for open ones. Automate the boring crap. Take your margin back.',\n 'flamingo-teaser': 'Preview of Flamingo - the AI-driven open-source OS for MSPs.',\n tmcg: 'The Miami Cyber Gang - A cybersecurity community focused on education and collaboration.',\n universal: 'Cross-platform universal content.'\n};\n\n// Platform slogans for branding consistency\nexport const platformSlogans = {\n openmsp: 'Find Your Perfect MSP Partner',\n openframe: 'Open-Source Security Operations',\n flamingo: 'Open-Source OS for MSPs',\n 'flamingo-teaser': 'Coming Soon: Open-Source OS for MSPs',\n tmcg: 'Miami Cyber Community',\n universal: 'Universal Platform'\n};\n\n// Platform hex colors for default configuration\nexport const platformHexColors = {\n openmsp: '#FFC008',\n openframe: '#FFC008',\n flamingo: '#FF6B9D',\n universal: '#FFC008',\n 'flamingo-teaser': '#F59E0B',\n 'marketing-hub': '#F357BB',\n 'product-hub': '#5EA62E',\n 'revenue-hub': '#FFC008',\n 'people-hub': '#5EFAF0',\n 'company-hub': '#f36666',\n tmcg: '#FF6B6B'\n};\n\n// Platform icon names for default configuration\nexport const platformIconNames = {\n openmsp: 'openmsp-logo',\n openframe: 'openframe-logo',\n flamingo: 'flamingo-logo',\n universal: 'globe',\n 'flamingo-teaser': 'flamingo-logo',\n 'marketing-hub': 'flamingo-logo',\n 'product-hub': 'flamingo-logo',\n 'revenue-hub': 'flamingo-logo',\n 'people-hub': 'flamingo-logo',\n 'company-hub': 'flamingo-logo',\n tmcg: 'tmcg-logo'\n};\n\n/**\n * Get default color for platform\n */\nexport function getDefaultColorForPlatform(platformName: string): string {\n return platformHexColors[platformName as keyof typeof platformHexColors] || platformHexColors.universal;\n}\n\n/**\n * Get default icon name for platform\n */\nexport function getDefaultIconForPlatform(platformName: string): string {\n return platformIconNames[platformName as keyof typeof platformIconNames] || platformIconNames.universal;\n}\n\nexport function transformPlatformConfigsToOptions(platformConfigs: PlatformConfig[]): SelectableOption[] {\n return platformConfigs.map((platform: PlatformConfig) => ({\n id: platform.id, // Database UUID for matching\n name: platform.name, // Platform name enum\n displayName: platform.display_name, // Human-readable name\n description: platform.description,\n icon: platformIcons[platform.name as keyof typeof platformIcons] || platformIcons.universal,\n color: platformColors[platform.name as keyof typeof platformColors] || platformColors.universal\n }));\n}\n\n/**\n * Get platform icon by name\n */\nexport function getPlatformIcon(platformName: string) {\n return platformIcons[platformName as keyof typeof platformIcons] || platformIcons.universal;\n}\n\n/**\n * Get platform color by name\n */\nexport function getPlatformColor(platformName: string) {\n return platformColors[platformName as keyof typeof platformColors] || platformColors.universal;\n}\n\n/**\n * Get platform display name by name\n */\nexport function getPlatformDisplayName(platformName: string): string {\n return platformDisplayNames[platformName as keyof typeof platformDisplayNames] || platformName;\n}\n\n/**\n * Get platform description by name\n */\nexport function getPlatformDescription(platformName: string): string {\n return platformDescriptions[platformName as keyof typeof platformDescriptions] || platformName;\n}\n\n/**\n * Get platform slogan by name\n */\nexport function getPlatformSlogan(platformName: string): string {\n return platformSlogans[platformName as keyof typeof platformSlogans] || platformName;\n}\n\n/**\n * Get small platform icon for filter buttons with white colors (4x4 size)\n */\nexport function getSmallPlatformIcon(platformName: string): React.ReactNode {\n const className = \"h-4 w-4 flex-shrink-0\";\n\n switch (platformName) {\n case 'openframe':\n return <OpenFrameLogo className={className} lowerPathColor=\"#FFC008\" upperPathColor=\"#ffffff\" />;\n case 'openmsp':\n return <OpenmspLogo className={className} frontBubbleColor=\"#f1f1f1\" innerFrontBubbleColor=\"#000000\" backBubbleColor=\"#FFC008\" />;\n case 'flamingo':\n case 'flamingo-teaser':\n return <FlamingoLogo className={`${className}`} fill=\"#EC4899\" />;\n case 'marketing-hub':\n return <FlamingoLogo className={className} fill=\"var(--ods-flamingo-pink-base)\" />;\n case 'product-hub':\n return <FlamingoLogo className={className} fill=\"var(--ods-attention-green-success)\" />;\n case 'revenue-hub':\n return <FlamingoLogo className={className} fill=\"var(--ods-attention-yellow-warning)\" />;\n case 'people-hub':\n return <FlamingoLogo className={className} fill=\"var(--ods-flamingo-cyan-base)\" />;\n case 'company-hub':\n return <FlamingoLogo className={className} fill=\"var(--ods-attention-red-error)\" />;\n case 'tmcg':\n return <MiamiCyberGangLogoFaceOnly className={className} />;\n case 'universal':\n default:\n return <Globe className={className} />;\n }\n}\n\n/**\n * Get platform icon for admin/selector components (standard 6x6 size)\n */\nexport function getPlatformIconComponent(platformName: string, className: string = \"h-6 w-6\"): React.ReactNode {\n switch (platformName) {\n case 'openframe':\n return <OpenFrameLogo className={className} />;\n case 'openmsp':\n return <OpenmspLogo className={className} color=\"#f1f1f1\" />;\n case 'flamingo':\n case 'flamingo-teaser':\n return <FlamingoLogo className={`${className} text-white`} />;\n case 'marketing-hub':\n return <FlamingoLogo className={className} fill=\"var(--ods-flamingo-pink-base)\" />;\n case 'product-hub':\n return <FlamingoLogo className={className} fill=\"var(--ods-attention-green-success)\" />;\n case 'revenue-hub':\n return <FlamingoLogo className={className} fill=\"var(--ods-attention-yellow-warning)\" />;\n case 'people-hub':\n return <FlamingoLogo className={className} fill=\"var(--ods-flamingo-cyan-base)\" />;\n case 'company-hub':\n return <FlamingoLogo className={className} fill=\"var(--ods-attention-red-error)\" />;\n case 'tmcg':\n return <MiamiCyberGangLogoFaceOnly size={24} className={className} />;\n case 'universal':\n default:\n return <Globe className={className} />;\n }\n}","import type { ComponentType } from 'react';\nimport { WindowsIcon, LinuxIcon, MacOSIcon } from '../components/icons';\n\n// OS-level platforms (Windows, Linux, MacOS)\n\nexport type OSPlatformId = 'windows' | 'linux' | 'darwin';\n\nexport interface OSPlatformOption {\n id: OSPlatformId;\n name: string;\n icon: ComponentType<any>;\n}\n\nexport const OS_PLATFORMS: OSPlatformOption[] = [\n { id: 'windows', name: 'Windows', icon: WindowsIcon },\n { id: 'linux', name: 'Linux', icon: LinuxIcon },\n { id: 'darwin', name: 'MacOS', icon: MacOSIcon }\n];\n\nexport const DEFAULT_OS_PLATFORM: OSPlatformId = 'windows';\n\n\n","/**\n * Access Code Client Utilities\n *\n * Simple client-side utilities for integrating access code validation\n * and consumption into registration forms.\n */\n\nimport React from 'react';\nimport {\n AccessCodeValidation,\n AccessCodeValidationResponse,\n AccessCodeConsumptionResponse\n} from '../types/access-code-cohorts';\n\n/**\n * Validate an access code for a given email\n *\n * @param email - User's email address\n * @param code - Access code to validate\n * @returns Promise with validation result\n *\n * @example\n * const result = await validateAccessCode('user@example.com', 'ABC123XY');\n * if (result.valid) {\n * // Allow user to proceed with registration\n * console.log(`Welcome to ${result.cohort_name}!`);\n * } else {\n * // Show error message\n * console.error(result.message);\n * }\n */\nexport async function validateAccessCode(\n email: string,\n code: string\n): Promise<AccessCodeValidationResponse> {\n try {\n const response = await fetch('/api/validate-access-code', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ email, code } as AccessCodeValidation),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new Error(error.error || 'Validation request failed');\n }\n\n return await response.json() as AccessCodeValidationResponse;\n } catch (error) {\n return {\n valid: false,\n message: error instanceof Error ? error.message : 'Validation failed',\n };\n }\n}\n\n/**\n * Consume an access code after successful registration\n *\n * Call this ONLY after the user has successfully completed registration.\n * This marks the code as used and prevents further usage.\n *\n * @param email - User's email address\n * @param code - Access code to consume\n * @returns Promise with consumption result\n *\n * @example\n * // After successful registration\n * const result = await consumeAccessCode('user@example.com', 'ABC123XY');\n * if (result.consumed) {\n * console.log('Access code consumed successfully');\n * } else {\n * console.warn('Failed to consume access code:', result.message);\n * }\n */\nexport async function consumeAccessCode(\n email: string,\n code: string\n): Promise<AccessCodeConsumptionResponse> {\n try {\n const response = await fetch('/api/consume-access-code', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ email, code } as AccessCodeValidation),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new Error(error.error || 'Consumption request failed');\n }\n\n return await response.json() as AccessCodeConsumptionResponse;\n } catch (error) {\n return {\n success: false,\n consumed: false,\n message: error instanceof Error ? error.message : 'Consumption failed',\n };\n }\n}\n\n/**\n * Complete access code flow: validate then consume\n *\n * This is a convenience function that validates an access code and,\n * if valid, immediately consumes it. Use this when you want to\n * validate and consume in one step during registration.\n *\n * @param email - User's email address\n * @param code - Access code to validate and consume\n * @returns Promise with validation and consumption results\n *\n * @example\n * const result = await validateAndConsumeAccessCode('user@example.com', 'ABC123XY');\n * if (result.valid && result.consumed) {\n * // Registration successful\n * console.log(`Welcome to ${result.cohort_name}!`);\n * } else {\n * console.error(result.message);\n * }\n */\nexport async function validateAndConsumeAccessCode(\n email: string,\n code: string\n): Promise<AccessCodeValidationResponse & { consumed?: boolean }> {\n // First validate\n const validation = await validateAccessCode(email, code);\n\n if (!validation.valid) {\n return validation;\n }\n\n // If valid, consume the code\n const consumption = await consumeAccessCode(email, code);\n\n return {\n ...validation,\n consumed: consumption.consumed,\n message: consumption.consumed\n ? `Access granted for ${validation.cohort_name}`\n : consumption.message || validation.message,\n };\n}\n\n/**\n * Access Code Integration Hook (for React components)\n *\n * @example\n * const { validate, consume, isValidating, isConsuming } = useAccessCodeIntegration();\n *\n * const handleRegistration = async (formData) => {\n * const validation = await validate(formData.email, formData.accessCode);\n * if (!validation.valid) {\n * setError(validation.message);\n * return;\n * }\n *\n * // Process registration...\n * const registrationResult = await registerUser(formData);\n *\n * if (registrationResult.success) {\n * await consume(formData.email, formData.accessCode);\n * }\n * };\n */\nexport function useAccessCodeIntegration() {\n const [isValidating, setIsValidating] = React.useState(false);\n const [isConsuming, setIsConsuming] = React.useState(false);\n\n const validate = async (email: string, code: string) => {\n setIsValidating(true);\n try {\n return await validateAccessCode(email, code);\n } finally {\n setIsValidating(false);\n }\n };\n\n const consume = async (email: string, code: string) => {\n setIsConsuming(true);\n try {\n return await consumeAccessCode(email, code);\n } finally {\n setIsConsuming(false);\n }\n };\n\n const validateAndConsume = async (email: string, code: string) => {\n setIsValidating(true);\n setIsConsuming(true);\n try {\n return await validateAndConsumeAccessCode(email, code);\n } finally {\n setIsValidating(false);\n setIsConsuming(false);\n }\n };\n\n return {\n validate,\n consume,\n validateAndConsume,\n isValidating,\n isConsuming,\n isProcessing: isValidating || isConsuming,\n };\n}\n\n","/**\n * Email Domain Validation Utilities\n *\n * Validates email domain formats (the part after @ in email addresses)\n * Used for SSO domain allowlist feature to restrict auto-provisioning to specific domains.\n */\n\n/**\n * Validates an email domain format (the part after @ in email addresses)\n * Valid: example.com, sub.domain.org, my-company.co.uk\n * Invalid: http://example.com, @example.com, example, .com\n *\n * @param domain - The domain string to validate\n * @returns true if the domain is a valid email domain format\n */\nexport function isValidEmailDomain(domain: string): boolean {\n if (!domain || typeof domain !== 'string') {\n return false\n }\n\n const trimmed = domain.trim()\n if (!trimmed) {\n return false\n }\n\n // Domain regex: must have at least one dot, valid characters, and proper TLD\n // Allows subdomains, hyphens (not at start/end of labels), alphanumeric characters\n const domainRegex = /^(?!-)[A-Za-z0-9-]{1,63}(?<!-)(\\.[A-Za-z0-9-]{1,63})*\\.[A-Za-z]{2,}$/\n return domainRegex.test(trimmed)\n}\n\n/**\n * Validation result type\n */\nexport interface EmailDomainValidationResult {\n valid: boolean\n error?: string\n cleanedDomain?: string\n}\n\n/**\n * Validates an email domain with detailed error messages\n * Also cleans the input (removes leading @, trims whitespace)\n *\n * @param domain - The domain string to validate\n * @returns Validation result with error message if invalid\n */\nexport function validateEmailDomain(domain: string): EmailDomainValidationResult {\n if (!domain || typeof domain !== 'string') {\n return { valid: false, error: 'Email domain is required' }\n }\n\n // Clean the input: trim and remove leading @ if user enters it\n let trimmed = domain.trim()\n if (trimmed.startsWith('@')) {\n trimmed = trimmed.substring(1)\n }\n\n // Check for empty after cleaning\n if (!trimmed) {\n return { valid: false, error: 'Email domain is required' }\n }\n\n // Check for protocol (common mistake: entering full URL)\n if (trimmed.includes('://')) {\n return { valid: false, error: 'Enter email domain only (e.g., openframe.ai), not a URL' }\n }\n\n // Check for @ symbol (common mistake: entering full email address)\n if (trimmed.includes('@')) {\n return { valid: false, error: 'Enter domain only, not a full email address' }\n }\n\n // Check for spaces\n if (trimmed.includes(' ')) {\n return { valid: false, error: 'Domain cannot contain spaces' }\n }\n\n // Check for trailing slash\n if (trimmed.includes('/')) {\n return { valid: false, error: 'Enter domain only, without paths' }\n }\n\n // Validate the domain format\n if (!isValidEmailDomain(trimmed)) {\n return { valid: false, error: 'Invalid domain format (e.g., openframe.ai)' }\n }\n\n // Return success with the cleaned domain\n return { valid: true, cleanedDomain: trimmed.toLowerCase() }\n}\n\n/**\n * Validates a list of email domains\n * Returns the first error encountered or success if all domains are valid\n *\n * @param domains - Array of domain strings to validate\n * @returns Validation result with array of cleaned domains if valid\n */\nexport function validateEmailDomainList(domains: string[]): {\n valid: boolean\n error?: string\n cleanedDomains?: string[]\n} {\n if (!Array.isArray(domains)) {\n return { valid: false, error: 'Domains must be an array' }\n }\n\n const cleanedDomains: string[] = []\n const seenDomains = new Set<string>()\n\n for (const domain of domains) {\n const result = validateEmailDomain(domain)\n\n if (!result.valid) {\n return { valid: false, error: `Invalid domain \"${domain}\": ${result.error}` }\n }\n\n const cleanedDomain = result.cleanedDomain!\n\n // Check for duplicates (case-insensitive)\n if (seenDomains.has(cleanedDomain)) {\n return { valid: false, error: `Duplicate domain: ${cleanedDomain}` }\n }\n\n seenDomains.add(cleanedDomain)\n cleanedDomains.push(cleanedDomain)\n }\n\n return { valid: true, cleanedDomains }\n}\n\n/**\n * Cleans a domain string by removing common user input mistakes\n * Does NOT validate - use validateEmailDomain for validation\n *\n * @param domain - The domain string to clean\n * @returns Cleaned domain string\n */\nexport function cleanEmailDomain(domain: string): string {\n if (!domain || typeof domain !== 'string') {\n return ''\n }\n\n let cleaned = domain.trim().toLowerCase()\n\n // Remove leading @\n if (cleaned.startsWith('@')) {\n cleaned = cleaned.substring(1)\n }\n\n // Remove protocol if present\n cleaned = cleaned.replace(/^https?:\\/\\//, '')\n\n // Remove trailing slash and path\n cleaned = cleaned.split('/')[0]\n\n // Remove www. prefix\n cleaned = cleaned.replace(/^www\\./, '')\n\n return cleaned\n}\n","/**\n * Confidence helpers for AI enrichment\n * Shared utilities for displaying confidence levels from AI operations\n */\n\n/**\n * Get Tailwind CSS classes for confidence badge display (border and text color)\n * @param confidence - Confidence score (0-100)\n * @returns CSS classes for border and text color\n */\nexport function getConfidenceColorClass(confidence?: number): string {\n if (!confidence && confidence !== 0) return '';\n if (confidence >= 80) return 'border-green-500 text-green-500';\n if (confidence >= 50) return 'border-yellow-500 text-yellow-500';\n return 'border-red-500 text-red-500';\n}\n\n/**\n * Get confidence level category\n * @param confidence - Confidence score (0-100)\n * @returns Confidence level category\n */\nexport function getConfidenceLevel(confidence?: number): 'high' | 'medium' | 'low' | 'none' {\n if (!confidence && confidence !== 0) return 'none';\n if (confidence >= 80) return 'high';\n if (confidence >= 50) return 'medium';\n return 'low';\n}\n\n/**\n * Get Tailwind CSS class for border color only\n * @param confidence - Confidence score (0-100)\n * @returns CSS class for border color\n */\nexport function getConfidenceBorderClass(confidence?: number): string {\n if (!confidence && confidence !== 0) return '';\n if (confidence >= 80) return 'border-green-500';\n if (confidence >= 50) return 'border-yellow-500';\n return 'border-red-500';\n}\n\n/**\n * Get Tailwind CSS class for text color only\n * @param confidence - Confidence score (0-100)\n * @returns CSS class for text color\n */\nexport function getConfidenceTextClass(confidence?: number): string {\n if (!confidence && confidence !== 0) return '';\n if (confidence >= 80) return 'text-green-500';\n if (confidence >= 50) return 'text-yellow-500';\n return 'text-red-500';\n}\n\n/**\n * Get Tailwind CSS class for background color (subtle)\n * @param confidence - Confidence score (0-100)\n * @returns CSS class for subtle background color\n */\nexport function getConfidenceBgClass(confidence?: number): string {\n if (!confidence && confidence !== 0) return '';\n if (confidence >= 80) return 'bg-green-500/10';\n if (confidence >= 50) return 'bg-yellow-500/10';\n return 'bg-red-500/10';\n}\n\n/**\n * Get descriptive label for confidence level\n * @param confidence - Confidence score (0-100)\n * @returns Human-readable confidence label\n */\nexport function getConfidenceLabel(confidence?: number): string {\n if (!confidence && confidence !== 0) return 'Unknown';\n if (confidence >= 80) return 'High';\n if (confidence >= 50) return 'Medium';\n return 'Low';\n}\n","/**\n * Shared Date Formatting Utilities\n * Single source of truth for date formatting across the application\n */\n\n/**\n * Format release date - avoids timezone shifts\n * Used in product releases list and detail pages\n *\n * @param dateString - ISO date string (e.g., \"2025-11-11T00:00:00Z\")\n * @returns Formatted date (e.g., \"November 11, 2025\")\n */\nexport function formatReleaseDate(dateString: string): string {\n const [year, month, day] = dateString.split('T')[0].split('-');\n const monthNames = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December'\n ];\n return `${monthNames[parseInt(month) - 1]} ${parseInt(day)}, ${year}`;\n}\n","/**\n * Format a timestamp as relative time with support for both past and future dates\n *\n * @param timestamp - ISO date string or timestamp in milliseconds\n * @returns Human-readable relative time string\n *\n * @example\n * // Past dates\n * formatRelativeTime('2024-01-01T00:00:00Z') // \"5 days ago\"\n * formatRelativeTime(Date.now() - 3600000) // \"1 hour ago\"\n *\n * // Future dates\n * formatRelativeTime(Date.now() + 86400000) // \"in 1 day\"\n *\n * // Edge cases\n * formatRelativeTime('') // \"Not scheduled\"\n * formatRelativeTime('invalid') // \"Invalid date\"\n * formatRelativeTime(Date.now()) // \"just now\"\n */\nexport function formatRelativeTime(timestamp: string | number): string {\n if (!timestamp) return 'Not scheduled';\n\n const date = new Date(timestamp);\n if (isNaN(date.getTime())) return 'Invalid date';\n\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffSecs = Math.floor(diffMs / 1000);\n const diffMins = Math.floor(diffSecs / 60);\n const diffHours = Math.floor(diffMins / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n // Future dates (next run times)\n if (diffMs < 0) {\n const absDiffSecs = Math.abs(diffSecs);\n const absDiffMins = Math.floor(absDiffSecs / 60);\n const absDiffHours = Math.floor(absDiffMins / 60);\n const absDiffDays = Math.floor(absDiffHours / 24);\n\n if (absDiffDays > 0) return `in ${absDiffDays} day${absDiffDays === 1 ? '' : 's'}`;\n if (absDiffHours > 0) return `in ${absDiffHours} hour${absDiffHours === 1 ? '' : 's'}`;\n if (absDiffMins > 0) return `in ${absDiffMins} minute${absDiffMins === 1 ? '' : 's'}`;\n return `in ${absDiffSecs} second${absDiffSecs === 1 ? '' : 's'}`;\n }\n\n // Past dates (completed times)\n if (diffDays > 0) return `${diffDays} day${diffDays === 1 ? '' : 's'} ago`;\n if (diffHours > 0) return `${diffHours} hour${diffHours === 1 ? '' : 's'} ago`;\n if (diffMins > 0) return `${diffMins} minute${diffMins === 1 ? '' : 's'} ago`;\n if (diffSecs > 0) return `${diffSecs} second${diffSecs === 1 ? '' : 's'}`;\n return 'just now';\n}\n","/**\n * Dynamic Icon Registry - UNIFIED\n *\n * Single source of truth for all dynamic icon rendering.\n * Icons are looked up by EXACT name from database (icon_name column).\n *\n * Registry-based approach: All icons explicitly imported and registered.\n * NO runtime namespace tricks - real imported components.\n */\n\nimport React from 'react';\n\n// UI Kit social platform icons\nimport {\n LinkedInIcon,\n FacebookIcon,\n InstagramIcon,\n YouTubeIcon,\n SlackIcon,\n XLogo,\n} from '../components/icons';\n\n// Lucide icons (commonly used for social platforms)\nimport {\n Globe,\n FileText,\n PenSquare,\n Github,\n MessageCircle,\n Send,\n Video,\n Twitter,\n} from 'lucide-react';\n\n// Type for icon size presets\nexport type DynamicIconSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n// Size class mapping (Tailwind)\nconst SIZE_CLASSES: Record<DynamicIconSize, string> = {\n xs: 'w-3 h-3', // 12px\n sm: 'w-4 h-4', // 16px\n md: 'w-6 h-6', // 24px\n lg: 'w-8 h-8', // 32px\n xl: 'w-12 h-12', // 48px\n};\n\n/**\n * Icon color configuration (optional overrides)\n */\nconst ICON_COLORS: Record<string, { color?: string; fill?: string }> = {\n LinkedInIcon: { color: '#0A66C2' },\n FacebookIcon: { color: '#1877F2' },\n YouTubeIcon: { color: '#FF0000' },\n OpenFrameLogo: { /* Uses component defaults */ },\n};\n\n/**\n * Icon Component Registry\n * Maps exact icon_name (from database) to imported React components\n */\nconst ICON_REGISTRY: Record<string, React.ComponentType<{ className?: string; color?: string }>> = {\n // UI Kit social platform icons (from @flamingo/ui-kit/components/icons)\n LinkedInIcon,\n FacebookIcon,\n InstagramIcon,\n YouTubeIcon,\n SlackIcon,\n XLogo,\n\n // Lucide icons (from lucide-react)\n Globe,\n FileText, // Blog Posts icon (internal-blogging)\n PenSquare, // Alternative blog icon\n Github, // GitHub platform\n MessageCircle, // Discord platform\n Send, // Telegram platform\n Video, // TikTok platform\n Twitter, // Twitter/X platform\n};\n\n/**\n * Get icon component dynamically by name\n *\n * @param iconName - Exact component name from database (e.g., 'LinkedInIcon', 'FileText')\n * @param size - Size preset (xs, sm, md, lg, xl)\n * @param className - Optional additional Tailwind classes\n * @returns React icon component or Globe fallback\n */\nexport function getDynamicIcon(\n iconName: string | undefined | null,\n size: DynamicIconSize = 'md',\n className?: string\n): React.ReactNode {\n\n if (!iconName) {\n console.warn('[getDynamicIcon] No iconName provided, using Globe fallback');\n return <Globe className={SIZE_CLASSES[size]} />;\n }\n\n const sizeClass = SIZE_CLASSES[size];\n const finalClassName = className ? `${sizeClass} ${className}` : sizeClass;\n\n // Lookup icon from registry\n const IconComponent = ICON_REGISTRY[iconName];\n\n if (IconComponent) {\n const colorConfig = ICON_COLORS[iconName] || {};\n return <IconComponent className={finalClassName} {...colorConfig} />;\n }\n\n // Fallback\n console.error(`[getDynamicIcon] Icon NOT found in registry: \"${iconName}\". Available icons:`, Object.keys(ICON_REGISTRY));\n return <Globe className={finalClassName} />;\n}\n\n/**\n * Get platform brand logo - delegates to existing ui-kit function\n * Re-exported here for unified icon API\n */\nexport { getPlatformIconComponent as getPlatformLogo } from './platform-config';\n","/**\n * Centralized Tool Types\n *\n * Single source of truth for all tool-related types across the entire platform.\n * Used by ToolBadge, ToolIcon, and any component that needs tool type information.\n */\n\nexport const ToolTypeValues = {\n TACTICAL_RMM: 'TACTICAL_RMM',\n FLEET_MDM: 'FLEET_MDM',\n MESHCENTRAL: 'MESHCENTRAL',\n AUTHENTIK: 'AUTHENTIK',\n OPENFRAME: 'OPENFRAME',\n OPENFRAME_CHAT: 'OPENFRAME_CHAT',\n OPENFRAME_CLIENT: 'OPENFRAME_CLIENT',\n OSQUERY: 'OSQUERY',\n SYSTEM: 'SYSTEM'\n} as const\n\nexport type ToolType = (typeof ToolTypeValues)[keyof typeof ToolTypeValues]\n\n/**\n * Maps tool types to display labels\n */\nexport const toolLabels: Record<ToolType, string> = {\n TACTICAL_RMM: 'Tactical',\n FLEET_MDM: 'Fleet',\n MESHCENTRAL: 'MeshCentral',\n AUTHENTIK: 'Authentik',\n OPENFRAME: 'OpenFrame',\n OPENFRAME_CHAT: 'OpenFrame Chat',\n OPENFRAME_CLIENT: 'OpenFrame Client',\n OSQUERY: 'Osquery',\n SYSTEM: 'System'\n}\n","/**\n * Tool Utilities\n *\n * Provides normalization and conversion utilities for tool types.\n * Handles various input formats (aliases, case variations) and converts\n * them to the canonical ToolType used throughout the platform.\n */\n\nimport { ToolType, toolLabels } from '../types/tool.types'\n\n/**\n * Map of common tool name variants to canonical ToolType\n */\nconst toolAliasMap: Record<string, ToolType> = {\n // Tactical RMM\n 'TACTICAL': 'TACTICAL_RMM',\n 'TACTICAL_RMM': 'TACTICAL_RMM',\n 'TACTICAL-RMM': 'TACTICAL_RMM',\n 'TACTICALRMM': 'TACTICAL_RMM',\n 'tactical': 'TACTICAL_RMM',\n 'tactical_rmm': 'TACTICAL_RMM',\n 'tactical-rmm': 'TACTICAL_RMM',\n 'tacticalrmm': 'TACTICAL_RMM',\n 'tacticalrmm-agent': 'TACTICAL_RMM',\n\n // Fleet MDM\n 'FLEET': 'FLEET_MDM',\n 'FLEET_MDM': 'FLEET_MDM',\n 'FLEET-MDM': 'FLEET_MDM',\n 'FLEETMDM': 'FLEET_MDM',\n 'fleet': 'FLEET_MDM',\n 'fleet_mdm': 'FLEET_MDM',\n 'fleet-mdm': 'FLEET_MDM',\n 'fleetmdm': 'FLEET_MDM',\n 'fleetmdm-agent': 'FLEET_MDM',\n\n // MeshCentral\n 'MESHCENTRAL': 'MESHCENTRAL',\n 'MESH': 'MESHCENTRAL',\n 'MESH_CENTRAL': 'MESHCENTRAL',\n 'MESH-CENTRAL': 'MESHCENTRAL',\n 'mesh': 'MESHCENTRAL',\n 'meshcentral': 'MESHCENTRAL',\n 'mesh_central': 'MESHCENTRAL',\n 'mesh-central': 'MESHCENTRAL',\n 'meshcentral-agent': 'MESHCENTRAL',\n\n // Authentik\n 'AUTHENTIK': 'AUTHENTIK',\n 'authentik': 'AUTHENTIK',\n\n // OpenFrame\n 'OPENFRAME': 'OPENFRAME',\n 'openframe': 'OPENFRAME',\n 'OPEN_FRAME': 'OPENFRAME',\n 'OPEN-FRAME': 'OPENFRAME',\n 'open_frame': 'OPENFRAME',\n 'open-frame': 'OPENFRAME',\n\n // OpenFrame Chat\n 'OPENFRAME_CHAT': 'OPENFRAME_CHAT',\n 'OPENFRAME-CHAT': 'OPENFRAME_CHAT',\n 'OPENFRAMECHAT': 'OPENFRAME_CHAT',\n 'openframe_chat': 'OPENFRAME_CHAT',\n 'openframe-chat': 'OPENFRAME_CHAT',\n 'openframechat': 'OPENFRAME_CHAT',\n\n // OpenFrame Client\n 'OPENFRAME_CLIENT': 'OPENFRAME_CLIENT',\n 'OPENFRAME-CLIENT': 'OPENFRAME_CLIENT',\n 'OPENFRAMECLIENT': 'OPENFRAME_CLIENT',\n 'openframe_client': 'OPENFRAME_CLIENT',\n 'openframe-client': 'OPENFRAME_CLIENT',\n 'openframeclient': 'OPENFRAME_CLIENT',\n\n // OSQUERY\n 'OSQUERY': 'OSQUERY',\n\n // System\n 'SYSTEM': 'SYSTEM',\n 'system': 'SYSTEM',\n}\n\n/**\n * Normalizes a tool name string to the canonical ToolType.\n * Handles various formats like 'tactical', 'TACTICAL_RMM', 'tactical-rmm', etc.\n *\n * @param input - The tool name string to normalize\n * @returns The canonical ToolType, or undefined if no match found\n *\n * @example\n * normalizeToolType('tactical') // => 'TACTICAL_RMM'\n * normalizeToolType('FLEET-MDM') // => 'FLEET_MDM'\n * normalizeToolType('unknown') // => undefined\n */\nexport function normalizeToolType(input?: string): ToolType | undefined {\n if (!input) return undefined\n\n // Try exact match first\n const exact = toolAliasMap[input]\n if (exact) return exact\n\n // Try uppercase\n const upper = input.toUpperCase()\n if (toolAliasMap[upper]) return toolAliasMap[upper]\n\n // Try lowercase\n const lower = input.toLowerCase()\n if (toolAliasMap[lower]) return toolAliasMap[lower]\n\n return undefined\n}\n\n/**\n * Normalizes a tool name string to the canonical ToolType with a fallback.\n * Returns 'SYSTEM' as the default if no match is found.\n *\n * @param input - The tool name string to normalize\n * @returns The canonical ToolType, defaults to 'SYSTEM' if no match\n *\n * @example\n * normalizeToolTypeWithFallback('tactical') // => 'TACTICAL_RMM'\n * normalizeToolTypeWithFallback('unknown') // => 'SYSTEM'\n */\nexport function normalizeToolTypeWithFallback(input?: string): ToolType {\n return normalizeToolType(input) ?? 'SYSTEM'\n}\n\n/**\n * Converts any tool name variant to its display label.\n * Handles normalization internally.\n *\n * @param input - The tool name string (any format)\n * @returns The display label, or the original input if no match\n *\n * @example\n * toToolLabel('tactical') // => 'Tactical'\n * toToolLabel('FLEET-MDM') // => 'Fleet'\n * toToolLabel('unknown') // => 'unknown'\n */\nexport function toToolLabel(input?: string): string {\n if (!input) return ''\n\n const toolType = normalizeToolType(input)\n if (toolType) {\n return toolLabels[toolType]\n }\n\n return input\n}\n\n/**\n * Checks if a string is a valid tool type (or can be normalized to one).\n *\n * @param input - The string to check\n * @returns True if the input can be normalized to a valid ToolType\n *\n * @example\n * isValidToolType('tactical') // => true\n * isValidToolType('FLEET_MDM') // => true\n * isValidToolType('unknown') // => false\n */\nexport function isValidToolType(input?: string): boolean {\n return normalizeToolType(input) !== undefined\n}\n\n/**\n * Gets all valid tool type aliases for a given canonical ToolType.\n * Useful for documentation or validation purposes.\n *\n * @param toolType - The canonical ToolType\n * @returns Array of all aliases that map to this tool type\n */\nexport function getToolTypeAliases(toolType: ToolType): string[] {\n return Object.entries(toolAliasMap)\n .filter(([_, value]) => value === toolType)\n .map(([key]) => key)\n}\n\n/**\n * Get display label for a tool type\n */\nexport function getToolLabel(toolType: ToolType): string {\n return toolLabels[toolType] || toolType\n}\n","import type { SVGProps } from \"react\";\nexport interface PowershellLogoIconProps\n extends Omit<SVGProps<SVGSVGElement>, \"width\" | \"height\"> {\n className?: string;\n size?: number;\n color?: string;\n}\nexport function PowershellLogoIcon({\n className = \"\",\n size = 24,\n color = \"currentColor\",\n ...props\n}: PowershellLogoIconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n className={className}\n {...props}\n >\n <path\n fill={color}\n fillRule=\"evenodd\"\n d=\"M10.274 19.708c-2.345 0-4.69.01-7.034-.005-1.19-.008-1.405-.286-1.138-1.442.908-3.919 1.844-7.83 2.732-11.754C5.07 5.455 5.584 4.99 6.719 5c4.69.043 9.379.014 14.068.019 1.176 0 1.374.25 1.11 1.436-.858 3.848-1.72 7.694-2.598 11.537-.328 1.438-.706 1.713-2.23 1.716-2.265.005-4.53.001-6.795 0\"\n clipRule=\"evenodd\"\n />\n <path\n fill=\"#212121\"\n fillRule=\"evenodd\"\n d=\"M12.269 12.029c-.157-.184-.33-.395-.513-.596-1.036-1.144-2.063-2.297-3.118-3.423C8.155 7.494 8 6.993 8.58 6.484c.573-.503 1.136-.458 1.661.12 1.464 1.612 2.925 3.225 4.413 4.815.556.593.426.997-.185 1.437a937 937 0 0 0-7.016 5.106c-.525.385-1.024.481-1.448-.087-.467-.626-.035-1 .45-1.35a764 764 0 0 0 5.186-3.782c.24-.177.584-.28.627-.714M13.012 18.09c-.632 0-1.264.02-1.894-.008-.502-.022-.805-.301-.798-.827.006-.497.258-.871.76-.885a90 90 0 0 1 4.142-.002c.438.009.762.293.76.747-.004.52-.28.925-.841.958-.708.043-1.42.01-2.13.01z\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n","import type { SVGProps } from \"react\";\nexport interface PythonLogoIconProps\n extends Omit<SVGProps<SVGSVGElement>, \"width\" | \"height\"> {\n className?: string;\n size?: number;\n color?: string;\n}\nexport function PythonLogoIcon({\n className = \"\",\n size = 24,\n color = \"currentColor\",\n ...props\n}: PythonLogoIconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n className={className}\n {...props}\n >\n <path\n fill={color}\n d=\"M11.966 2C7.244 2 7.193 3.833 7.193 4.21V6.5h4.864v.687H5.26C3.816 7.187 2 8.067 2 11.96c0 3.577 1.417 4.96 2.847 4.96h1.698v-2.386c0-.998.495-2.847 2.802-2.847h4.823c.71 0 2.71-.308 2.71-2.619V4.665C16.88 4.09 16.784 2 11.967 2M9.284 3.54a.874.874 0 1 1 0 1.75.874.874 0 1 1 0-1.75\"\n />\n <path\n fill={color}\n d=\"M12.034 22c4.72 0 4.778-1.867 4.778-2.21V17.5h-4.869v-.687h6.795c1.457 0 3.262-.901 3.262-4.773 0-4.24-1.916-4.96-2.847-4.96h-1.699v2.386c0 .998-.478 2.847-2.8 2.847H9.828c-.707 0-2.71.344-2.71 2.619v4.403c0 .951.581 2.665 4.915 2.665m2.682-1.54a.874.874 0 1 1-.002-1.748.874.874 0 0 1 .002 1.748\"\n />\n </svg>\n );\n}\n","/**\n * Centralized Shell Types\n *\n * Single source of truth for all shell/script type information across the platform.\n * Based on Tactical RMM supported shell types.\n */\nimport { PowershellLogoIcon } from '../components/icons-v2-generated/brand-logos/powershell-logo-icon'\nimport { PythonLogoIcon } from '../components/icons-v2-generated/brand-logos/python-logo-icon'\nimport {\n BashIcon,\n CmdIcon,\n DenoIcon,\n NushellIcon,\n ShellIcon\n} from '../components/icons'\nimport type { IconProps } from './icons'\n\n\n\nexport const ShellTypeValues = {\n POWERSHELL: 'POWERSHELL',\n CMD: 'CMD',\n BASH: 'BASH',\n PYTHON: 'PYTHON',\n NUSHELL: 'NUSHELL',\n DENO: 'DENO',\n SHELL: 'SHELL'\n} as const\n\nexport type ShellType = (typeof ShellTypeValues)[keyof typeof ShellTypeValues]\n\n/**\n * Shell type definition with all metadata\n */\nexport interface ShellTypeDefinition {\n id: ShellType\n label: string\n value: string\n icon: React.ComponentType<IconProps>\n}\n\n/**\n * Complete list of all shell types with icons and labels\n * SINGLE SOURCE OF TRUTH - Use this everywhere\n */\nexport const SHELL_TYPES: ShellTypeDefinition[] = [\n { id: ShellTypeValues.POWERSHELL, label: 'PowerShell', value: 'powershell', icon: PowershellLogoIcon },\n { id: ShellTypeValues.CMD, label: 'Batch', value: 'cmd', icon: CmdIcon },\n { id: ShellTypeValues.BASH, label: 'Bash', value: 'bash', icon: BashIcon },\n { id: ShellTypeValues.PYTHON, label: 'Python', value: 'python', icon: PythonLogoIcon },\n { id: ShellTypeValues.NUSHELL, label: 'Nu', value: 'nushell', icon: NushellIcon },\n { id: ShellTypeValues.DENO, label: 'Deno', value: 'deno', icon: DenoIcon },\n { id: ShellTypeValues.SHELL, label: 'Shell', value: 'shell', icon: ShellIcon },\n]\n\n/**\n * Maps shell types to display labels\n */\nexport const shellLabels: Record<ShellType, string> = {\n [ShellTypeValues.POWERSHELL]: 'PowerShell',\n [ShellTypeValues.CMD]: 'Batch',\n [ShellTypeValues.BASH]: 'Bash',\n [ShellTypeValues.PYTHON]: 'Python',\n [ShellTypeValues.NUSHELL]: 'Nu',\n [ShellTypeValues.DENO]: 'Deno',\n [ShellTypeValues.SHELL]: 'Shell'\n}\n","/**\n * Shell Type Utilities\n *\n * Helper functions for working with shell types.\n */\n\nimport React from 'react'\nimport { ShellType, SHELL_TYPES, shellLabels } from '../types/shell.types'\n\n/**\n * Get display label for a shell type\n */\nexport function getShellLabel(shellType?: string): string {\n if (!shellType) return 'Unknown'\n const normalized = shellType.toUpperCase() as ShellType\n return shellLabels[normalized] || shellType\n}\n\n/**\n * Get icon component for a shell type\n */\nexport function getShellIcon(shellType?: string): React.ComponentType<{ className?: string }> | undefined {\n if (!shellType) return undefined\n const normalized = shellType.toUpperCase() as ShellType\n const shellDef = SHELL_TYPES.find(s => s.id === normalized)\n return shellDef?.icon\n}\n","import type { SVGProps } from \"react\";\nexport interface AppleLogoIconProps\n extends Omit<SVGProps<SVGSVGElement>, \"width\" | \"height\"> {\n className?: string;\n size?: number;\n color?: string;\n}\nexport function AppleLogoIcon({\n className = \"\",\n size = 24,\n color = \"currentColor\",\n ...props\n}: AppleLogoIconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n className={className}\n {...props}\n >\n <path\n fill={color}\n d=\"M17.57 12.628c-.024-2.531 2.062-3.747 2.156-3.805-1.174-1.72-2.999-1.957-3.649-1.983-1.552-.16-3.03.917-3.82.917s-2.005-.895-3.293-.869c-1.694.024-3.257.987-4.13 2.507-1.758 3.054-.448 7.59 1.268 10.073.84 1.213 1.837 2.581 3.151 2.53 1.266-.05 1.743-.82 3.269-.82s1.957.82 3.293.796c1.36-.026 2.222-1.24 3.054-2.458.958-1.411 1.356-2.775 1.38-2.847-.032-.012-2.65-1.018-2.68-4.041Zm-2.51-7.434c.697-.846 1.167-2.021 1.039-3.194-1.004.041-2.22.67-2.94 1.518-.644.748-1.21 1.944-1.056 3.093 1.115.086 2.26-.572 2.956-1.417Z\"\n />\n </svg>\n );\n}\n","import type { SVGProps } from \"react\";\nexport interface LinuxLogoIconProps\n extends Omit<SVGProps<SVGSVGElement>, \"width\" | \"height\"> {\n className?: string;\n size?: number;\n color?: string;\n}\nexport function LinuxLogoIcon({\n className = \"\",\n size = 24,\n color = \"currentColor\",\n ...props\n}: LinuxLogoIconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n className={className}\n {...props}\n >\n <path\n fill={color}\n d=\"M19.567 18.314c-.528-.217-.963-.558-.931-1.213.03-.653-.467-1.086-.467-1.086s.435-1.43.031-2.612c-.403-1.183-1.737-3.078-2.76-4.507-1.023-1.43-.155-3.08-1.085-5.192-.932-2.113-3.351-1.99-4.654-1.087-1.304.9-.901 3.137-.84 4.196.062 1.056.028 1.808-.092 2.082-.123.273-.962 1.276-1.52 2.114-.559.84-.962 2.58-1.367 3.295-.403.715-.124 1.368-.124 1.368s-.28.092-.497.56c-.217.465-.65.683-1.427.837-.775.155-.775.655-.59 1.214.187.559.001.871-.216 1.585-.217.713.869.932 1.923 1.054 1.055.126 2.234.81 3.228.934.992.125 1.303-.683 1.303-.683s1.116-.25 2.294-.28c1.18-.031 2.295.249 2.295.249s.218.497.62.714c.405.218 1.273.25 1.832-.34.559-.592 2.048-1.337 2.885-1.804.84-.468.686-1.182.159-1.398M12.306 4.606c.532 0 .961.528.961 1.18 0 .463-.215.862-.53 1.056l-.254-.11c.19-.094.324-.335.324-.617 0-.367-.227-.666-.507-.666-.277 0-.505.3-.505.666a.8.8 0 0 0 .088.373 27 27 0 0 0-.437-.172 1.4 1.4 0 0 1-.102-.53c0-.652.43-1.18.962-1.18m-.07 2.488c.267.093.562.266.532.438-.032.172-.172.172-.531.393-.36.218-1.142.703-1.392.735-.251.031-.39-.11-.657-.281-.266-.173-.766-.582-.64-.8 0 0 .39-.298.561-.455s.61-.532.876-.483c.266.045.986.36 1.252.453ZM9.84 4.793c.42 0 .76.5.76 1.118q0 .168-.032.32a1 1 0 0 0-.307.177 4 4 0 0 0-.14.12.8.8 0 0 0 .063-.49c-.056-.337-.28-.583-.503-.547-.221.038-.355.341-.299.68.057.34.28.585.502.548l.038-.01a3 3 0 0 1-.31.27c-.307-.143-.532-.567-.532-1.07 0-.617.34-1.116.76-1.116M9.019 20.5c-.098.445-.62.77-.62.77-.471.148-1.784-.423-2.38-.673-.593-.247-2.106-.324-2.305-.544-.197-.226.099-.722.175-1.192.073-.474-.148-.77-.075-1.094.075-.322 1.042-.322 1.412-.545.373-.225.447-.87.745-1.044.297-.175.842.446 1.065.795.222.346 1.066 1.837 1.412 2.21.348.372.67.87.572 1.317Zm5.488-4.332c-.09.438-.09 2.021-.09 2.021s-.961 1.335-2.452 1.554c-1.49.219-2.234.061-2.234.061l-.838-.962s.65-.095.559-.747c-.094-.653-1.985-1.555-2.327-2.363-.34-.808-.062-2.177.373-2.86.434-.684.712-2.175 1.147-2.674.434-.495.774-1.553.62-2.02 0 0 .93 1.12 1.58.935.652-.188 2.112-1.276 2.328-1.089s2.078 4.29 2.263 5.595-.125 2.3-.125 2.3-.712-.187-.804.249m4.761 2.928c-.29.267-1.902.92-2.386 1.428-.48.505-1.109.916-1.493.796-.387-.122-.724-.652-.555-1.426.168-.771.314-1.617.29-2.1s-.122-1.137 0-1.233c.12-.094.312-.047.312-.047s-.095.916.458 1.16c.554.239 1.35-.097 1.59-.34.243-.24.412-.602.412-.602s.24.122.216.507c-.024.386.168.943.531 1.135.36.19.915.458.625.722\"\n />\n </svg>\n );\n}\n","import type { SVGProps } from \"react\";\nexport interface WindowsLogoIconProps\n extends Omit<SVGProps<SVGSVGElement>, \"width\" | \"height\"> {\n className?: string;\n size?: number;\n color?: string;\n}\nexport function WindowsLogoIcon({\n className = \"\",\n size = 24,\n color = \"currentColor\",\n ...props\n}: WindowsLogoIconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n className={className}\n {...props}\n >\n <path\n fill={color}\n d=\"m2 4.832 8.173-1.11.004 7.86-8.17.046zm8.17 7.655.006 7.867-8.17-1.12v-6.8zm.99-8.91L21.997 2v9.482l-10.837.085zM22 12.56 21.997 22 11.16 20.475l-.015-7.932z\"\n />\n </svg>\n );\n}\n","/**\n * Centralized OS Types\n *\n * Single source of truth for all operating system type information across the platform.\n * Handles normalization of OS values from various sources (Fleet MDM, Tactical RMM, GraphQL).\n */\n\nimport { AppleLogoIcon } from '../components/icons-v2-generated/brand-logos/apple-logo-icon'\nimport { LinuxLogoIcon } from '../components/icons-v2-generated/brand-logos/linux-logo-icon'\nimport { WindowsLogoIcon } from '../components/icons-v2-generated/brand-logos/windows-logo-icon'\nimport React from 'react'\nimport type { OSPlatformId } from '../utils/os-platforms'\n\nexport const OSTypeValues = {\n WINDOWS: 'WINDOWS',\n MACOS: 'MACOS',\n LINUX: 'LINUX'\n} as const\n\nexport type OSType = (typeof OSTypeValues)[keyof typeof OSTypeValues]\n\n/**\n * OS type definition with all metadata\n */\nexport interface OSTypeDefinition {\n id: OSType\n label: string\n value: string\n icon: React.ComponentType<any>\n platformId: OSPlatformId\n aliases: string[] // Alternative names/values that map to this OS\n}\n\n/**\n * Complete list of all OS types with icons and labels\n * SINGLE SOURCE OF TRUTH - Use this everywhere\n */\nexport const OS_TYPES: OSTypeDefinition[] = [\n {\n id: OSTypeValues.MACOS,\n label: 'macOS',\n value: OSTypeValues.MACOS,\n icon: AppleLogoIcon,\n platformId: 'darwin',\n aliases: ['darwin', 'macos', 'mac os', 'osx', 'os x', 'mac'] // Put more specific ones first, 'mac' last to avoid false matches\n },\n {\n id: OSTypeValues.WINDOWS,\n label: 'Windows',\n value: OSTypeValues.WINDOWS,\n icon: WindowsLogoIcon,\n platformId: 'windows',\n aliases: ['windows', 'win32', 'win64', 'win'] // 'win' last since it's shortest\n },\n {\n id: OSTypeValues.LINUX,\n label: 'Linux',\n value: OSTypeValues.LINUX,\n icon: LinuxLogoIcon,\n platformId: 'linux',\n aliases: ['linux', 'ubuntu', 'debian', 'centos', 'redhat', 'fedora', 'pop', 'pop!_os', 'arch', 'manjaro']\n }\n]\n\n/**\n * Maps OS types to display labels\n */\nexport const osLabels: Record<OSType, string> = {\n [OSTypeValues.WINDOWS]: 'Windows',\n [OSTypeValues.MACOS]: 'macOS',\n [OSTypeValues.LINUX]: 'Linux'\n}\n","/**\n * OS Type Utilities\n *\n * Helper functions for working with OS types.\n */\n\nimport React from 'react'\nimport type { OSPlatformId } from './os-platforms'\nimport { OSType, OSTypeDefinition, OS_TYPES, osLabels } from '../types/os.types'\n\n/**\n * Normalize OS type string to standard OSType enum\n * Handles case-insensitive matching and various OS name variations\n *\n * @param osType - Raw OS type string from API or device data\n * @returns Normalized OSType or undefined if not recognized\n *\n * @example\n * normalizeOSType('windows') // 'WINDOWS'\n * normalizeOSType('Darwin') // 'MACOS'\n * normalizeOSType('Ubuntu') // 'LINUX'\n */\nexport function normalizeOSType(osType?: string): OSType | undefined {\n if (!osType) return undefined\n\n const normalized = osType.toLowerCase().trim()\n\n // Check for exact matches first, then partial matches\n // This prevents \"win\" from matching \"darwin\"\n for (const osTypeDef of OS_TYPES) {\n // Check for exact word match first\n if (osTypeDef.aliases.some(alias => {\n // Exact match\n if (normalized === alias) return true\n // Word boundary match (e.g., \"mac\" in \"mac os\" but not in \"vmac\")\n const wordBoundaryRegex = new RegExp(`\\\\b${alias}\\\\b`, 'i')\n return wordBoundaryRegex.test(osType)\n })) {\n return osTypeDef.id\n }\n }\n\n // Fallback to partial matching for version strings like \"macOS 26.0.1\"\n for (const osTypeDef of OS_TYPES) {\n if (osTypeDef.aliases.some(alias => normalized.includes(alias))) {\n return osTypeDef.id\n }\n }\n\n return undefined\n}\n\n/**\n * Get display label for an OS type\n *\n * @param osType - OS type string (can be raw or normalized)\n * @returns Display label\n */\nexport function getOSLabel(osType?: string): string {\n if (!osType) return 'Unknown'\n\n const normalized = normalizeOSType(osType)\n return normalized ? osLabels[normalized] : osType\n}\n\n/**\n * Get icon component for an OS type\n *\n * @param osType - OS type string (can be raw or normalized)\n * @returns Icon component or undefined\n */\nexport function getOSIcon(osType?: string): React.ComponentType<any> | undefined {\n if (!osType) return undefined\n\n const normalized = normalizeOSType(osType)\n if (!normalized) return undefined\n\n const osTypeDef = OS_TYPES.find(t => t.id === normalized)\n return osTypeDef?.icon\n}\n\n/**\n * Get OS type definition by OS type string\n *\n * @param osType - OS type string (can be raw or normalized)\n * @returns Complete OS type definition or undefined\n */\nexport function getOSTypeDefinition(osType?: string): OSTypeDefinition | undefined {\n if (!osType) return undefined\n\n const normalized = normalizeOSType(osType)\n if (!normalized) return undefined\n\n return OS_TYPES.find(t => t.id === normalized)\n}\n\n/**\n * Get platform ID for an OS type (for cross-referencing with OS_PLATFORMS)\n *\n * @param osType - OS type string (can be raw or normalized)\n * @returns Platform ID or undefined\n */\nexport function getOSPlatformId(osType?: string): OSPlatformId | undefined {\n const osTypeDef = getOSTypeDefinition(osType)\n return osTypeDef?.platformId\n}\n\n/**\n * Check if device OS matches a specific platform\n *\n * @param deviceOS - Device OS string\n * @param targetPlatform - Target platform to check against\n * @returns True if OS matches platform\n *\n * @example\n * isOSPlatform('Darwin', 'darwin') // true\n * isOSPlatform('Windows 10', 'windows') // true\n * isOSPlatform('Ubuntu', 'linux') // true\n */\nexport function isOSPlatform(deviceOS?: string, targetPlatform?: OSPlatformId): boolean {\n if (!deviceOS || !targetPlatform) return false\n\n const platformId = getOSPlatformId(deviceOS)\n return platformId === targetPlatform\n}\n","import { getCountries, getCountryCallingCode, isValidPhoneNumber, parsePhoneNumber } from 'libphonenumber-js'\nimport type { CountryCode } from 'libphonenumber-js'\n\nexport interface CountryPhoneData {\n code: CountryCode\n name: string\n dialCode: string\n flag: string\n}\n\n/**\n * Priority country codes shown at the top of country selectors\n */\nconst PRIORITY_CODES: CountryCode[] = ['US', 'CA', 'GB', 'AU']\n\n/**\n * Convert ISO 3166-1 alpha-2 country code to flag emoji\n */\nfunction countryCodeToFlag(code: string): string {\n return code\n .toUpperCase()\n .split('')\n .map(char => String.fromCodePoint(0x1F1E6 + char.charCodeAt(0) - 65))\n .join('')\n}\n\n/**\n * Build country phone data from libphonenumber-js metadata + Intl.DisplayNames\n */\nfunction buildCountryData(): { priority: CountryPhoneData[]; others: CountryPhoneData[] } {\n const displayNames = new Intl.DisplayNames(['en'], { type: 'region' })\n const allCodes = getCountries()\n\n const toData = (code: CountryCode): CountryPhoneData => ({\n code,\n name: displayNames.of(code) || code,\n dialCode: `+${getCountryCallingCode(code)}`,\n flag: countryCodeToFlag(code),\n })\n\n const priority = PRIORITY_CODES.map(toData)\n\n const prioritySet = new Set(PRIORITY_CODES)\n const others = allCodes\n .filter(c => !prioritySet.has(c))\n .map(toData)\n .sort((a, b) => a.name.localeCompare(b.name))\n\n return { priority, others }\n}\n\nlet _cache: { priority: CountryPhoneData[]; others: CountryPhoneData[] } | null = null\n\n/**\n * Get all countries split into priority (US, CA, GB, AU) and the rest alphabetically\n */\nexport function getCountryPhoneData() {\n if (!_cache) {\n _cache = buildCountryData()\n }\n return _cache\n}\n\n/**\n * Find country data by ISO code\n */\nexport function getCountryByCode(code: CountryCode): CountryPhoneData | undefined {\n const { priority, others } = getCountryPhoneData()\n return priority.find(c => c.code === code) || others.find(c => c.code === code)\n}\n\n/**\n * Validate a phone number for a specific country using libphonenumber\n */\nexport function validatePhoneNumber(phoneNumber: string, countryCode: CountryCode): boolean {\n if (!phoneNumber.trim()) return true // optional field\n return isValidPhoneNumber(phoneNumber, countryCode)\n}\n\n/**\n * Format a phone number to E.164 format (e.g., +14155552671)\n */\nexport function formatPhoneE164(phoneNumber: string, countryCode: CountryCode): string {\n try {\n const parsed = parsePhoneNumber(phoneNumber, countryCode)\n if (parsed && parsed.isValid()) {\n return parsed.format('E.164')\n }\n } catch {\n // fall through to manual formatting\n }\n const dialCode = `+${getCountryCallingCode(countryCode)}`\n const digits = phoneNumber.replace(/\\D/g, '')\n return `${dialCode}${digits}`\n}\n","/**\n * Generic Domain Detection\n * Detects personal/generic email providers (gmail, yahoo, etc.)\n */\n\nexport const GENERIC_EMAIL_DOMAINS = [\n // Major providers\n 'gmail.com',\n 'yahoo.com',\n 'hotmail.com',\n 'outlook.com',\n 'live.com',\n 'msn.com',\n // Apple\n 'icloud.com',\n 'me.com',\n 'mac.com',\n // Other providers\n 'aol.com',\n 'protonmail.com',\n 'mail.com',\n 'yandex.com',\n 'zoho.com',\n 'gmx.com',\n 'fastmail.com',\n // ISP-based\n 'comcast.net',\n 'verizon.net',\n 'att.net',\n 'sbcglobal.net',\n 'bellsouth.net',\n 'cox.net',\n // International\n 'qq.com',\n '163.com',\n '126.com',\n 'web.de',\n 't-online.de',\n] as const\n\nexport type GenericEmailDomain = (typeof GENERIC_EMAIL_DOMAINS)[number]\n\nexport function extractDomainFromEmail(email: string): string | null {\n if (!email || !email.includes('@')) return null\n return email.split('@')[1]?.toLowerCase() || null\n}\n\nexport function normalizeDomain(domain: string): string {\n return (\n domain\n ?.toLowerCase()\n .replace(/^https?:\\/\\//, '')\n .replace(/^www\\./, '')\n .split('/')[0]\n .trim() || ''\n )\n}\n\nexport function isGenericDomain(domain: string): boolean {\n const normalized = normalizeDomain(domain)\n return GENERIC_EMAIL_DOMAINS.includes(normalized as GenericEmailDomain)\n}\n\nexport function hasGenericEmailDomain(email: string): boolean {\n const domain = extractDomainFromEmail(email)\n return domain ? isGenericDomain(domain) : false\n}\n\nexport function isGenericWebsiteDomain(website: string): boolean {\n return isGenericDomain(normalizeDomain(website))\n}\n"]}
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/components/icons-v2-generated/media-playback/play-icon.tsx","../../src/utils/ods-color-utils.ts","../../src/utils/common.ts","../../src/components/icons/openmsp-logo.tsx","../../src/components/icons/openframe-logo.tsx","../../src/components/icons/flamingo-logo.tsx","../../src/components/icons/miami-cyber-gang-logo-face-only.tsx","../../src/components/icons/shell-icon.tsx","../../src/components/icons/slack-icon.tsx","../../src/components/icons/x-logo.tsx","../../src/components/icons/linkedin-icon.tsx","../../src/components/icons/youtube-icon.tsx","../../src/components/icons/instagram-icon.tsx","../../src/components/icons/facebook-icon.tsx","../../src/components/icons/windows-icon.tsx","../../src/components/icons/macos-icon.tsx","../../src/components/icons/linux-icon.tsx","../../src/components/icons/cmd-icon.tsx","../../src/components/icons/bash-icon.tsx","../../src/components/icons/nushell-icon.tsx","../../src/components/icons/deno-icon.tsx","../../src/utils/platform-config.tsx","../../src/utils/os-platforms.ts","../../src/utils/access-code-client.ts","../../src/utils/validation-utils.ts","../../src/utils/confidence-helpers.ts","../../src/utils/date-formatters.ts","../../src/utils/format-relative-time.ts","../../src/utils/dynamic-icons.tsx","../../src/types/tool.types.ts","../../src/utils/tool-utils.ts","../../src/components/icons-v2-generated/brand-logos/powershell-logo-icon.tsx","../../src/components/icons-v2-generated/brand-logos/python-logo-icon.tsx","../../src/types/shell.types.ts","../../src/utils/shell-utils.ts","../../src/components/icons-v2-generated/brand-logos/apple-logo-icon.tsx","../../src/components/icons-v2-generated/brand-logos/linux-logo-icon.tsx","../../src/components/icons-v2-generated/brand-logos/windows-logo-icon.tsx","../../src/types/os.types.ts","../../src/utils/os-utils.ts","../../src/utils/country-phone-utils.ts","../../src/utils/generic-domain-utils.ts"],"names":["extendTailwindMerge","clsx","platformColors","jsxs","jsx","Globe","FileText","PenSquare","Github","MessageCircle","Send","Video","Twitter","getCountries","getCountryCallingCode","isValidPhoneNumber","parsePhoneNumber"],"mappings":"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","file":"index.cjs","sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { extendTailwindMerge } from \"tailwind-merge\"\n\nconst twMerge = extendTailwindMerge<'ods-typography'>({\n extend: {\n classGroups: {\n 'ods-typography': ['text-h1', 'text-h2', 'text-h3', 'text-h4', 'text-h5', 'text-h6'],\n },\n },\n})\n\n/**\n * Combine class names with Tailwind's merge utility\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\n/**\n * Format a date to a human-readable string\n * @param date - The date to format (Date object or ISO string)\n * @param options - Formatting options\n * @returns Formatted date string\n */\nexport function formatDate(\n date: Date | string,\n options: Intl.DateTimeFormatOptions = {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n },\n): string {\n const dateObj = typeof date === \"string\" ? new Date(date) : date\n \n // Check if the date is valid\n if (isNaN(dateObj.getTime())) {\n console.warn(\"Invalid date provided to formatDate:\", date)\n return \"Invalid Date\"\n }\n \n return dateObj.toLocaleDateString(\"en-US\", options)\n}\n\n/**\n * Format a number with thousands separators\n * @param num - The number to format\n * @returns Formatted number string\n */\nexport function formatNumber(num: number): string {\n return num.toLocaleString()\n}\n\n/**\n * Format a price with currency symbol\n * @param price - The price to format\n * @param currency - The currency code\n * @returns Formatted price string\n */\nexport function formatPrice(price: number, currency = \"USD\"): string {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency,\n }).format(price)\n}\n\n/**\n * Format bytes to a human-readable string (KB, MB, GB, etc.)\n * @param bytes - The number of bytes\n * @param decimals - Number of decimal places\n * @returns Formatted bytes string\n */\nexport function formatBytes(bytes: number, decimals = 2): string {\n if (bytes === 0) return \"0 Bytes\"\n\n const k = 1024\n const dm = decimals < 0 ? 0 : decimals\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\", \"ZB\", \"YB\"]\n\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n\n return Number.parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + \" \" + sizes[i]\n}\n\n/**\n * Platform URL mappings for production (with environment variable overrides)\n */\nexport function getPlatformProductionUrl(platform: string): string {\n switch (platform) {\n // *-hub platforms — env var convention: NEXT_PUBLIC_<NAME>_HUB_URL\n case 'marketing-hub':\n return process.env.NEXT_PUBLIC_MARKETING_HUB_URL || 'https://marketing-hub.flamingo.so';\n case 'company-hub':\n return process.env.NEXT_PUBLIC_COMPANY_HUB_URL || 'https://company-hub.flamingo.so';\n case 'product-hub':\n return process.env.NEXT_PUBLIC_PRODUCT_HUB_URL || 'https://product-hub.flamingo.so';\n case 'revenue-hub':\n return process.env.NEXT_PUBLIC_REVENUE_HUB_URL || 'https://revenue-hub.flamingo.so';\n case 'people-hub':\n return process.env.NEXT_PUBLIC_PEOPLE_HUB_URL || 'https://people-hub.flamingo.so';\n // Standalone platforms — env var convention: NEXT_PUBLIC_<NAME>_URL\n case 'openmsp':\n return process.env.NEXT_PUBLIC_OPENMSP_URL || 'https://www.openmsp.ai';\n case 'flamingo':\n return process.env.NEXT_PUBLIC_FLAMINGO_URL || 'https://www.flamingo.run';\n case 'tmcg':\n return process.env.NEXT_PUBLIC_TMCG_URL || 'https://www.tmcg.miami';\n case 'flamingo-teaser':\n return process.env.NEXT_PUBLIC_FLAMINGO_URL || 'https://www.flamingo.run';\n case 'openframe':\n return process.env.NEXT_PUBLIC_OPENFRAME_URL || 'https://openframe.ai';\n case 'universal':\n return process.env.NEXT_PUBLIC_FLAMINGO_URL || 'https://www.flamingo.run';\n default:\n return process.env.NEXT_PUBLIC_FLAMINGO_URL || 'https://www.flamingo.run';\n }\n}\n\n/**\n * Get ALL unique base domains from getPlatformProductionUrl\n *\n * Extracts domains by calling getPlatformProductionUrl for each platform identifier.\n * Platform identifiers match the switch cases in getPlatformProductionUrl.\n *\n * Handles 3 cases:\n * 1. LOCALHOST DEBUG - No domain (hostname-specific cookies)\n * 2. VERCEL PREVIEW (*.vercel.app) - Use vercel.app domain\n * 3. PRODUCTION - Extract from ALL platform URLs via getPlatformProductionUrl\n *\n * @returns Array of all unique base domains (with and without wildcard)\n */\nexport function getAllPlatformBaseDomains(): string[] {\n if (typeof window === 'undefined') return []\n\n const hostname = window.location.hostname\n\n // Case 1: LOCALHOST DEBUG - no domains needed\n if (hostname === 'localhost' ||\n hostname === '127.0.0.1' ||\n hostname.startsWith('127.')) {\n return []\n }\n\n // Case 2: VERCEL PREVIEW - use vercel.app domain\n const isVercelPreview = process.env.VERCEL_ENV === 'preview' ||\n process.env.NEXT_PUBLIC_VERCEL_ENV === 'preview' ||\n hostname.includes('.vercel.app')\n\n if (isVercelPreview) {\n return ['.vercel.app', 'vercel.app']\n }\n\n // Case 3: PRODUCTION - extract from ALL platforms using getPlatformProductionUrl\n // Platform identifiers MUST match switch cases in getPlatformProductionUrl —\n // otherwise the corresponding domain is omitted from cookie scope.\n const platformIdentifiers = [\n 'marketing-hub', 'company-hub', 'product-hub', 'revenue-hub', 'people-hub',\n 'openmsp', 'flamingo', 'tmcg', 'flamingo-teaser', 'openframe', 'universal'\n ]\n\n const baseDomains = new Set<string>()\n\n platformIdentifiers.forEach(platform => {\n try {\n const url = getPlatformProductionUrl(platform)\n const urlHostname = new URL(url).hostname\n const parts = urlHostname.split('.')\n\n if (parts.length >= 2) {\n const baseDomain = parts.slice(-2).join('.')\n baseDomains.add(`.${baseDomain}`) // Wildcard\n baseDomains.add(baseDomain) // Non-wildcard\n }\n } catch (error) {\n console.warn('[Platform Domains] Failed to parse URL for platform:', platform, error)\n }\n })\n\n return Array.from(baseDomains)\n}\n\n/**\n * Get the application base URL for the current environment\n *\n * @param platform - Optional platform name (openmsp, flamingo, tmcg, openframe, etc.)\n * @returns The base URL with protocol (https:// or http://)\n *\n * Priority order:\n * 1. Environment variable override (NEXT_PUBLIC_*_URL)\n * 2. Platform-specific URL (if platform parameter provided)\n * 3. VERCEL_PROJECT_PRODUCTION_URL (Vercel production domain)\n * 4. Production fallback (current app or openmsp)\n * 5. Development (http://localhost:3000)\n *\n * Environment Variables (optional overrides — only set when production domain\n * differs from the hardcoded default):\n *\n * Hub deployments (NEXT_PUBLIC_<NAME>_HUB_URL):\n * - NEXT_PUBLIC_MARKETING_HUB_URL -> marketing-hub.flamingo.so\n * - NEXT_PUBLIC_COMPANY_HUB_URL -> company-hub.flamingo.so\n * - NEXT_PUBLIC_PRODUCT_HUB_URL -> product-hub.flamingo.so\n * - NEXT_PUBLIC_REVENUE_HUB_URL -> revenue-hub.flamingo.so\n * - NEXT_PUBLIC_PEOPLE_HUB_URL -> people-hub.flamingo.so\n *\n * Standalone platforms (NEXT_PUBLIC_<NAME>_URL):\n * - NEXT_PUBLIC_OPENMSP_URL -> www.openmsp.ai\n * - NEXT_PUBLIC_FLAMINGO_URL -> www.flamingo.run\n * - NEXT_PUBLIC_TMCG_URL -> www.tmcg.miami\n * - NEXT_PUBLIC_FLAMINGO_TEASER_URL -> www.flamingo.cx\n * - NEXT_PUBLIC_OPENFRAME_URL -> openframe.ai\n *\n * @example\n * getBaseUrl() // Current app URL\n * getBaseUrl('flamingo') // https://www.flamingo.run (production) or http://localhost:3000 (dev)\n * getBaseUrl('openmsp') // https://www.openmsp.ai (or NEXT_PUBLIC_OPENMSP_URL if set)\n */\nexport function getBaseUrl(platform?: string): string {\n // In development, always use localhost (regardless of platform)\n if (process.env.NODE_ENV !== 'production') {\n return process.env.NEXT_PUBLIC_DEV_URL || 'http://localhost:3000'\n }\n\n // If platform is specified, return its production URL with env variable override support\n if (platform) {\n return getPlatformProductionUrl(platform)\n }\n\n // Production: Use Vercel domain if available\n if (process.env.VERCEL_PROJECT_PRODUCTION_URL) {\n return `https://${process.env.VERCEL_PROJECT_PRODUCTION_URL}`\n }\n\n // Production fallback: Use canonical www domain to avoid Google \"Page with redirect\" issue.\n // openmsp.ai redirects to www.openmsp.ai, so we set the base URL to the\n // final destination to ensure canonical URLs do not require a redirect.\n return 'https://www.openmsp.ai'\n}\n","import type { SVGProps } from \"react\";\n\n/** SVG path data for the play icon — exported for reuse in server-side image generation */\nexport const PLAY_ICON_PATH = \"M4.875 5.006c0-2.501 2.793-3.989 4.87-2.592l9.78 6.578c2.135 1.437 2.135 4.58 0 6.016l-9.78 6.579c-2.077 1.396-4.87-.091-4.87-2.593zm2.25 13.988c0 .7.783 1.118 1.364.727l9.78-6.58c.81-.545.81-1.738 0-2.283L8.488 4.28a.875.875 0 0 0-1.364.726v13.988Z\";\n\nexport interface PlayIconProps\n extends Omit<SVGProps<SVGSVGElement>, \"width\" | \"height\"> {\n className?: string;\n size?: number;\n color?: string;\n}\nexport function PlayIcon({\n className = \"\",\n size = 24,\n color = \"currentColor\",\n ...props\n}: PlayIconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n className={className}\n {...props}\n >\n <path\n fill={color}\n d={PLAY_ICON_PATH}\n />\n </svg>\n );\n}\n","/**\n * ODS Color Token Utility Functions\n * \n * Provides runtime utilities for working with ODS color tokens\n */\n\nimport { colorTokens as odsTokens } from './ods-color-tokens-stub';\n\nexport type Platform = 'openmsp' | 'openframe' | 'flamingo';\nexport type ColorCategory = 'open' | 'flamingo' | 'system' | 'attention';\nexport type ColorVariant = 'base' | 'hover' | 'active' | 'focus' | 'disabled';\n\n/**\n * Gets the raw ODS token value for a specific color\n */\nexport function getODSToken(\n category: ColorCategory,\n color: string,\n variant: ColorVariant = 'base'\n): string | undefined {\n const tokenKey = `${category}-${color}-${variant}`;\n return (odsTokens as any)[tokenKey];\n}\n\n/**\n * Gets the current platform's accent color\n */\nexport function getPlatformAccentColor(platform?: Platform): string {\n const currentPlatform = platform || getCurrentPlatform();\n \n const platformColors = {\n 'openmsp': 'var(--ods-open-yellow-base)', // CSS variable instead of hex\n 'openframe': 'var(--ods-open-yellow-base)', // CSS variable instead of hex\n 'flamingo': 'var(--ods-flamingo-pink-base)' // CSS variable instead of hex\n };\n \n return platformColors[currentPlatform];\n}\n\n/**\n * Gets the current platform from environment or DOM\n */\nexport function getCurrentPlatform(): Platform {\n // Server-side: use environment variable\n if (typeof window === 'undefined') {\n return (process.env.NEXT_PUBLIC_APP_TYPE as Platform) || 'openmsp';\n }\n \n // Client-side: check DOM attribute first, fallback to environment\n const domPlatform = document.documentElement.getAttribute('data-app-type');\n if (domPlatform) {\n return domPlatform as Platform;\n }\n \n return (process.env.NEXT_PUBLIC_APP_TYPE as Platform) || 'openmsp';\n}\n\n/**\n * Switches the platform theme by updating CSS custom properties\n */\nexport function switchPlatformTheme(platform: Platform): void {\n if (typeof window === 'undefined') return;\n \n const root = document.documentElement;\n root.setAttribute('data-app-type', platform);\n \n // Note: Cannot modify process.env at runtime in production\n // This would only work in development/test environments\n \n // Dispatch custom event for components to react to platform changes\n window.dispatchEvent(new CustomEvent('platformThemeChanged', {\n detail: { platform }\n }));\n}\n\n/**\n * Gets a semantic color value for the current platform\n */\nexport function getSemanticColor(semanticName: string, platform?: Platform): string | undefined {\n if (typeof window === 'undefined') return undefined;\n \n const currentPlatform = platform || getCurrentPlatform();\n \n // Switch platform temporarily to get the color\n const originalPlatform = getCurrentPlatform();\n if (currentPlatform !== originalPlatform) {\n switchPlatformTheme(currentPlatform);\n }\n \n const testElement = document.createElement('div');\n document.body.appendChild(testElement);\n \n const computedStyle = getComputedStyle(testElement);\n const colorValue = computedStyle.getPropertyValue(`--color-${semanticName}`);\n \n document.body.removeChild(testElement);\n \n // Restore original platform\n if (currentPlatform !== originalPlatform) {\n switchPlatformTheme(originalPlatform);\n }\n \n return colorValue.trim() || undefined;\n}\n\n/**\n * Converts an ODS token to its corresponding Tailwind class\n */\nexport function tokenToTailwindClass(\n tokenKey: string,\n type: 'bg' | 'text' | 'border' = 'bg'\n): string | undefined {\n // Map common tokens to Tailwind classes\n const tokenMappings: Record<string, string> = {\n // Accent colors\n 'accent-primary': 'accent',\n 'accent-hover': 'accent-hover',\n 'accent-active': 'accent-active',\n \n // Background colors\n 'bg': 'bg',\n 'bg-card': 'card',\n 'bg-hover': 'bg-hover',\n 'bg-active': 'bg-active',\n \n // Text colors\n 'text-primary': 'text-primary',\n 'text-secondary': 'text-secondary',\n 'text-muted': 'text-muted',\n 'text-disabled': 'text-disabled',\n 'text-on-accent': 'text-on-accent',\n 'text-on-dark': 'text-on-dark',\n \n // Border colors\n 'border-default': 'border',\n 'border-hover': 'border-hover',\n 'border-focus': 'border-focus',\n \n // Status colors\n 'success': 'success',\n 'error': 'error',\n 'warning': 'warning',\n 'info': 'info'\n };\n \n const mappedToken = tokenMappings[tokenKey];\n if (!mappedToken) return undefined;\n \n return `${type}-ods-${mappedToken}`;\n}\n\n/**\n * Gets all available ODS tokens for a category\n */\nexport function getTokensByCategory(category: ColorCategory): Record<string, string> {\n const tokens: Record<string, string> = {};\n \n Object.entries(odsTokens).forEach(([key, value]) => {\n if (key.startsWith(`${category}-`)) {\n tokens[key] = value as string;\n }\n });\n \n return tokens;\n}\n\n/**\n * Validates if a color token exists in the ODS system\n */\nexport function isValidODSToken(tokenKey: string): boolean {\n return tokenKey in odsTokens;\n}\n\n/**\n * Gets the platform configuration for theming\n */\nexport function getPlatformConfig(platform?: Platform) {\n const currentPlatform = platform || getCurrentPlatform();\n \n return {\n platform: currentPlatform,\n accentColor: getPlatformAccentColor(currentPlatform),\n isDarkTheme: currentPlatform !== 'flamingo',\n isLightTheme: currentPlatform === 'flamingo',\n brandName: {\n 'openmsp': 'OpenMSP',\n 'openframe': 'OpenFrame',\n 'flamingo': 'Flamingo'\n }[currentPlatform]\n };\n}\n\n/**\n * Generates CSS custom property declarations for a platform\n */\nexport function generatePlatformCSS(platform: Platform): string {\n const accentColor = getPlatformAccentColor(platform);\n const tokens = getTokensByCategory('system');\n \n let css = `[data-app-type=\"${platform}\"] {\\n`;\n css += ` --color-accent-primary: ${accentColor};\\n`;\n \n // Add platform-specific overrides\n if (platform === 'flamingo') {\n css += ` --color-bg: var(--ods-system-greys-white);\\n`;\n css += ` --color-text-primary: var(--ods-system-greys-background);\\n`;\n }\n \n if (platform === 'openframe') {\n css += ` --color-bg: var(--ods-system-greys-darker);\\n`;\n }\n \n css += `}\\n`;\n \n return css;\n}\n\n/**\n * Applies a color token as a CSS custom property\n */\nexport function applyColorToken(\n element: HTMLElement,\n property: string,\n tokenKey: string\n): void {\n const tokenValue = (odsTokens as any)[tokenKey];\n if (tokenValue) {\n element.style.setProperty(`--${property}`, tokenValue);\n }\n}\n\n/**\n * Creates a color interpolation between two ODS tokens\n */\nexport function interpolateColors(\n startToken: string,\n endToken: string,\n progress: number\n): string {\n const startColor = (odsTokens as any)[startToken];\n const endColor = (odsTokens as any)[endToken];\n \n if (!startColor || !endColor) {\n return startColor || endColor || '#000000';\n }\n \n // Simple hex color interpolation\n const hexToRgb = (hex: string) => {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n return result ? {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16)\n } : { r: 0, g: 0, b: 0 };\n };\n \n const rgbToHex = (r: number, g: number, b: number) => {\n return \"#\" + ((1 << 24) + (Math.round(r) << 16) + (Math.round(g) << 8) + Math.round(b)).toString(16).slice(1);\n };\n \n const start = hexToRgb(startColor);\n const end = hexToRgb(endColor);\n \n const interpolated = {\n r: start.r + (end.r - start.r) * progress,\n g: start.g + (end.g - start.g) * progress,\n b: start.b + (end.b - start.b) * progress\n };\n \n return rgbToHex(interpolated.r, interpolated.g, interpolated.b);\n}\n\n/**\n * Hook for React components to use platform-aware colors\n */\nexport function usePlatformColors(platform?: Platform) {\n const currentPlatform = platform || getCurrentPlatform();\n const config = getPlatformConfig(currentPlatform);\n \n return {\n platform: currentPlatform,\n accentColor: config.accentColor,\n isDarkTheme: config.isDarkTheme,\n isLightTheme: config.isLightTheme,\n brandName: config.brandName,\n getToken: (category: ColorCategory, color: string, variant?: ColorVariant) =>\n getODSToken(category, color, variant),\n switchTheme: (newPlatform: Platform) => switchPlatformTheme(newPlatform),\n getSemanticColor: (semanticName: string) => getSemanticColor(semanticName, currentPlatform)\n };\n}\n\n/**\n * Picks a near-black or near-white text color with adequate contrast on `hex`.\n * Uses Rec. 601 luminance.\n */\nexport function getReadableTextColor(hex: string): string {\n const n = parseInt(hex.replace('#', ''), 16)\n const r = (n >> 16) & 0xff\n const g = (n >> 8) & 0xff\n const b = n & 0xff\n const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255\n return luminance > 0.5 ? '#212121' : '#fafafa'\n}\n\nexport default {\n getODSToken,\n getPlatformAccentColor,\n getCurrentPlatform,\n switchPlatformTheme,\n getSemanticColor,\n tokenToTailwindClass,\n getTokensByCategory,\n isValidODSToken,\n getPlatformConfig,\n generatePlatformCSS,\n applyColorToken,\n interpolateColors,\n usePlatformColors\n};","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\n/**\n * Utility functions for common operations\n */\n\n/**\n * Merge class names with Tailwind CSS\n * @param inputs - Class names to merge\n * @returns Merged class names\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\n/**\n * Delay execution for a specified time\n * @param ms - Milliseconds to delay\n * @returns Promise that resolves after the delay\n */\nexport function delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\n/**\n * Generate a random string of specified length\n * @param length - Length of the string\n * @returns Random string\n */\nexport function generateRandomString(length = 8): string {\n const chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\"\n let result = \"\"\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length))\n }\n return result\n}\n\n/**\n * Truncate a string to a specified length\n * @param str - String to truncate\n * @param maxLength - Maximum length\n * @param suffix - Suffix to add to truncated string\n * @returns Truncated string\n */\nexport function truncateString(str: string, maxLength: number, suffix = \"...\"): string {\n if (str.length <= maxLength) return str\n return str.substring(0, maxLength - suffix.length) + suffix\n}\n\n/**\n * Deep clone an object\n * @param obj - Object to clone\n * @returns Cloned object\n */\nexport function deepClone<T>(obj: T): T {\n return JSON.parse(JSON.stringify(obj))\n}\n\n/**\n * Get the Slack community join URL from environment variables\n * @returns Slack community join URL or fallback URL\n */\nexport function getSlackCommunityJoinUrl(): string {\n const url = process.env.NEXT_PUBLIC_SLACK_COMMUNITY_JOIN_URL\n if (!url) {\n console.warn('NEXT_PUBLIC_SLACK_COMMUNITY_JOIN_URL is not defined in environment variables')\n return 'https://join.slack.com/t/openmsp/shared_invite/zt-36bl7mx0h-3~U2nFH6nqHqoTPXMaHEHA'\n }\n return url\n}\n\n","import React from 'react';\n\ninterface OpenmspLogoProps extends React.SVGProps<SVGSVGElement> {\n className?: string;\n frontBubbleColor?: string;\n innerFrontBubbleColor?: string;\n backBubbleColor?: string;\n color?: string;\n}\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport function OpenmspLogo({ className = '', frontBubbleColor = '#000000', innerFrontBubbleColor = '#ffffff', backBubbleColor = '#ffffff', ...props }: OpenmspLogoProps) {\n return (\n <svg\n width=\"97\"\n height=\"96\"\n viewBox=\"0 0 97 96\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n {...props}\n >\n <path\n d=\"M73.933 0C75.7003 0 77.133 1.43269 77.133 3.2V54.4C77.133 56.1673 75.7003 57.6 73.933 57.6H3.53301C1.7657 57.6 0.333008 56.1673 0.333008 54.4V3.2C0.333008 1.43269 1.7657 0 3.53301 0H73.933ZM10.1076 47.6494C10.1076 48.0912 10.4658 48.4494 10.9076 48.4494H66.5584C67.0002 48.4494 67.3584 48.0912 67.3584 47.6494V9.95059C67.3584 9.50876 67.0002 9.15059 66.5584 9.15059H10.9076C10.4658 9.15059 10.1076 9.50876 10.1076 9.95059V47.6494Z\"\n fill={backBubbleColor} />\n <path\n d=\"M19.5332 22.4C19.5332 20.6326 20.9659 19.2 22.7332 19.2H93.1332C94.9005 19.2 96.3332 20.6326 96.3332 22.4V76.8C96.3332 78.2222 95.3945 79.4737 94.0292 79.8719L39.7572 95.7013C39.2452 95.8506 38.7332 95.4666 38.7332 94.9333V80C38.7332 79.5581 38.375 79.2 37.9332 79.2H22.7332C20.9659 79.2 19.5332 77.7673 19.5332 76V22.4Z\"\n fill={innerFrontBubbleColor} />\n <path\n d=\"M93.1332 19.2C94.9005 19.2 96.3332 20.6326 96.3332 22.4V76.8C96.3332 78.2222 95.3945 79.4737 94.0292 79.8719L39.7572 95.7013C39.2452 95.8506 38.7332 95.4666 38.7332 94.9333V80C38.7332 79.5581 38.375 79.2 37.9332 79.2H22.7332C20.9659 79.2 19.5332 77.7673 19.5332 76V22.4C19.5332 20.6326 20.9659 19.2 22.7332 19.2H93.1332ZM48.3377 82.1286C48.3355 82.6633 48.8484 83.0497 49.3617 82.9L86.1572 72.1672C86.4985 72.0676 86.7332 71.7547 86.7332 71.3992V29.6C86.7332 29.1581 86.375 28.8 85.9332 28.8H29.9332C29.4914 28.8 29.1332 29.1581 29.1332 29.6V68.8C29.1332 69.2418 29.4914 69.6 29.9332 69.6H47.5869C48.03 69.6 48.3887 69.9602 48.3869 70.4033L48.3377 82.1286Z\"\n fill={frontBubbleColor} />\n <circle\n cx=\"45.1334\" cy=\"44.8\" r=\"6.4\"\n fill={frontBubbleColor} />\n </svg>\n );\n}\n","import React from 'react';\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport const OpenFrameLogo = ({ className, lowerPathColor, upperPathColor, ...props }: { className?: string, lowerPathColor?: string, upperPathColor?: string } & React.SVGProps<SVGSVGElement>) => {\n return (\n <svg\n {...props}\n className={className}\n width=\"32\"\n height=\"32\"\n viewBox=\"0 0 32 32\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{\n '--fill-0': 'currentColor',\n ...props.style\n } as React.CSSProperties}\n >\n <g>\n <g>\n {/* White squares - top right, bottom left, bottom right, bottom center */}\n <path\n d=\"M21.3333 16.5333C21.3333 16.2388 21.5721 16 21.8667 16H26.1333C26.4279 16 26.6667 16.2388 26.6667 16.5333V20.8C26.6667 21.0946 26.4279 21.3333 26.1333 21.3333H21.8667C21.5721 21.3333 21.3333 21.0946 21.3333 20.8V16.5333Z\"\n fill={lowerPathColor ?? '#ffffff'}\n />\n <path\n d=\"M16 21.8667C16 21.5721 16.2388 21.3333 16.5333 21.3333H20.8C21.0946 21.3333 21.3333 21.5721 21.3333 21.8667V26.1333C21.3333 26.4279 21.0946 26.6667 20.8 26.6667H16.5333C16.2388 26.6667 16 26.4279 16 26.1333V21.8667Z\"\n fill={lowerPathColor ?? '#ffffff'}\n />\n <path\n d=\"M26.6667 21.8667C26.6667 21.5721 26.9054 21.3333 27.2 21.3333H31.4667C31.7612 21.3333 32 21.5721 32 21.8667V26.1333C32 26.4279 31.7612 26.6667 31.4667 26.6667H27.2C26.9054 26.6667 26.6667 26.4279 26.6667 26.1333V21.8667Z\"\n fill={lowerPathColor ?? '#ffffff'}\n />\n <path\n d=\"M21.3333 27.2C21.3333 26.9054 21.5721 26.6667 21.8667 26.6667H26.1333C26.4279 26.6667 26.6667 26.9054 26.6667 27.2V31.4667C26.6667 31.7612 26.4279 32 26.1333 32H21.8667C21.5721 32 21.3333 31.7612 21.3333 31.4667V27.2Z\"\n fill={lowerPathColor ?? '#ffffff'}\n />\n </g>\n {/* Black frame/border */}\n <path\n d=\"M30.9333 0H1.06667C0.477563 0 0 0.477564 0 1.06667V30.9333C0 31.5224 0.477563 32 1.06667 32H14.9333C15.5224 32 16 31.5224 16 30.9333V27.7333C16 27.1442 15.5224 26.6667 14.9333 26.6667H5.86667C5.57211 26.6667 5.33333 26.4279 5.33333 26.1333V5.86667C5.33333 5.57211 5.57211 5.33333 5.86667 5.33333H26.1333C26.4279 5.33333 26.6667 5.57212 26.6667 5.86667V14.9333C26.6667 15.5224 27.1442 16 27.7333 16H30.9333C31.5224 16 32 15.5224 32 14.9333V1.06667C32 0.477563 31.5224 0 30.9333 0Z\"\n fill={upperPathColor ?? '#1A1A1A'}\n />\n </g>\n </svg>\n );\n}; ","import React from 'react';\n\n/** Raw SVG path data — single source of truth for the Flamingo logo.\n * Used by the React component and exported for non-React contexts (e.g. email HTML). */\nexport const FLAMINGO_LOGO_SVG_PATH = 'M20.8645 77.9756C20.6306 78.095 20.3452 77.9582 20.3369 77.7002C20.2055 73.6173 23.4398 62.2314 27.7657 59.0452C31.477 45.9806 61.8811 24.0208 81.7715 48.2044C83.1662 49.7884 84.0264 52.0978 84.7512 54.0436C86.0615 57.5613 86.9291 59.8908 89.7117 54.5977C92.4782 49.335 87.2725 42.2381 81.701 34.6426C75.7955 26.5918 69.4791 17.9808 71.8102 10.4001C75.4609 -1.47146 91.9849 -4.33245 94.5422 7.89834C98.4226 10.7002 104.422 17.0815 96.2751 25.8554C96.0466 26.1014 95.6263 25.9453 95.6104 25.6132C95.417 21.5769 93.9498 16.1177 90.5641 14.5697C89.0187 13.8632 88.0307 13.6723 87.1405 13.5003C85.585 13.1998 84.3282 12.9569 80.919 10.1221C75.236 5.39658 75.236 20.1291 87.7386 32.3599C97.1156 41.533 106.493 66.2324 84.0287 70.9981C74.9174 72.9311 68.0892 72.0015 61.3076 71.0782C61.0953 71.0493 60.8831 71.0204 60.6708 70.9916V89.3274L66.3745 91.8104C67.0914 92.1225 67.4139 92.944 67.0949 93.6453C66.7759 94.3466 65.9362 94.6621 65.2193 94.35L60.6708 92.37V118.61C60.6708 119.378 60.0347 120 59.2501 120C58.4654 120 57.8293 119.378 57.8293 118.61V91.133L42.4873 84.4542C42.0611 84.2686 41.7551 83.8902 41.6687 83.4417C41.5824 82.9931 41.7266 82.5317 42.0546 82.2072L54.1527 70.2377C45.537 69.536 35.8193 70.3474 20.8645 77.9756ZM57.7692 70.613L45.5202 82.732L57.8293 88.0905V70.6204C57.8093 70.618 57.7893 70.6155 57.7692 70.613Z';\n\nexport const FLAMINGO_LOGO_VIEWBOX = '0 0 121 120';\n\ninterface FlamingoLogoProps extends React.SVGProps<SVGSVGElement> {\n className?: string;\n fill?: string;\n}\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport function FlamingoLogo({ className = '', fill = 'var(--ods-flamingo-pink-base)', ...props }: FlamingoLogoProps) {\n return (\n <svg\n width=\"121\"\n height=\"120\"\n viewBox={FLAMINGO_LOGO_VIEWBOX}\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d={FLAMINGO_LOGO_SVG_PATH}\n fill={fill}\n />\n </svg>\n );\n} ","import React from 'react';\n\ninterface MiamiCyberGangLogoFaceOnlyProps {\n size?: number;\n /** Pink color used for accent elements. Defaults to ODS accent color */\n originalPink?: string;\n /** White color used for text and details. Defaults to ODS text-on-accent color */\n originalWhite?: string;\n className?: string;\n}\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport const MiamiCyberGangLogoFaceOnly: React.FC<MiamiCyberGangLogoFaceOnlyProps> = ({\n size = 64,\n originalPink = \"var(--ods-accent, #F357BB)\",\n originalWhite = \"var(--ods-text-on-accent, #FAFAFA)\",\n className = ''\n}) => {\n return (\n <svg className={className} width={size} height={size} viewBox=\"0 0 120 120\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M102.395 53.6809C90.4125 50.7582 80.6974 44.729 74.1665 33.9873C73.8956 34.2151 73.7234 34.299 73.6447 34.4355C68.7714 42.9024 61.1392 47.742 52.0761 50.5062C47.3393 51.9497 42.4555 52.9072 37.5024 53.8814C38.8546 50.9314 40.3233 48.1903 39.8929 44.7238C32.5693 50.9692 23.5986 52.1744 14.4546 53.8478C14.7695 52.1649 14.9501 50.6658 15.3375 49.2212C16.6004 44.5086 17.6723 39.7203 19.3048 35.1347C22.3566 26.5661 28.8445 21.5521 37.3439 18.9685C43.3699 17.1376 49.5848 16.6746 55.8502 16.7114C57.7094 16.7229 59.5676 16.7135 61.4972 16.5234C58.6459 13.5482 55.13 11.7205 51.3055 10.3305C52.8141 9.65024 59.3786 10.0628 64.043 11.1714C68.2685 12.1761 72.1833 13.8527 75.4588 16.9087C80.9704 13.8873 86.8746 13.1651 93.1336 13.3834C91.7416 14.0102 90.444 14.5036 89.2356 15.1618C87.9706 15.8505 86.7423 16.6326 85.5864 17.4935C84.4379 18.348 83.3997 19.3506 82.1021 20.4697C82.7572 20.8256 83.1697 21.0776 83.6054 21.2812C89.3312 23.9698 93.9283 27.9151 97.25 33.3406C99.2404 36.5919 100.029 40.2327 100.817 43.8682C101.477 46.9085 101.961 49.9887 102.51 53.0531C102.538 53.2127 102.451 53.3922 102.395 53.6809Z\"\n fill={originalWhite} />\n <path\n d=\"M45.7357 106.481C44.8472 105.838 44.7949 104.555 45.5033 103.717C46.1854 102.911 47.3459 102.791 48.2538 103.331C54.1019 106.808 59.9027 106.818 65.7439 103.334C66.6566 102.79 67.8521 102.94 68.5404 103.749C69.2297 104.56 69.1869 105.767 68.3442 106.417C62.4972 110.926 52.5717 111.432 45.7357 106.481Z\"\n fill={originalWhite} />\n <path\n d=\"M81.9671 69.9535C85.2121 69.9577 87.8881 72.2967 87.9564 75.1869C88.0246 78.1117 85.1533 80.7006 81.8768 80.6691C78.6203 80.6376 76.0892 78.2996 76.0724 75.3087C76.0545 72.2222 78.5573 69.9493 81.9671 69.9535Z\"\n fill={originalWhite} />\n <path\n d=\"M35.5036 80.7335C33.1909 80.7356 31.549 79.9891 30.3942 78.3535C28.684 75.9337 29.2792 72.7863 31.761 71.1675C33.8239 69.8216 36.0149 69.6893 38.2321 70.7706C40.5449 71.8971 41.6063 74.0303 41.1632 76.5237C40.8011 78.5551 38.6815 80.4238 36.4369 80.6768C36.0212 80.723 35.6013 80.7282 35.5036 80.7335Z\"\n fill={originalWhite} />\n <path\n d=\"M16.2685 72.4296C16.743 61.5083 30.7046 61.3183 31.8437 61.2228C31.8437 61.2228 43.4306 60.0837 48.749 65.0221C54.0674 69.9605 50.9326 86.6757 45.1397 90.285C39.0119 94.1022 28.71 94.2733 23.9606 91.2341C19.2122 88.1948 15.794 83.351 16.2685 72.4296ZM95.1911 91.2341C90.4427 94.2733 80.1408 94.1022 74.013 90.285C68.219 86.6757 65.0853 69.9605 70.4037 65.0221C75.7221 60.0837 87.309 61.2238 87.309 61.2238C88.4481 61.3183 102.41 61.5083 102.884 72.4307C103.359 83.352 99.9405 88.1948 95.1911 91.2341ZM59.5758 68.9474C59.9538 68.9999 60.422 69.0817 61.0015 69.2014C64.7053 69.9605 64.4208 76.419 66.8899 83.162C69.3591 89.905 74.1075 96.458 88.7336 95.3179C103.359 94.1788 105.163 81.0728 105.638 78.3181C106.113 75.5644 107.253 72.9052 107.253 72.9052L108.687 71.4711C108.985 71.173 109.153 70.7688 109.153 70.3478V63.6174C109.153 62.8762 108.641 62.2369 107.92 62.071C105.532 61.522 99.8575 60.2958 92.5319 59.2292C82.7496 57.8045 72.7784 59.7037 70.6882 61.1283C68.5991 62.5529 66.8899 63.0274 66.8899 63.0274H52.2627C52.2627 63.0274 50.5536 62.5529 48.4645 61.1283C46.3753 59.7037 36.4031 57.8045 26.6208 59.2281C19.2951 60.2947 13.6208 61.522 11.2325 62.071C10.5113 62.2369 10 62.8762 10 63.6164V70.3468C10 70.7688 10.168 71.1719 10.4651 71.4701L11.9002 72.9042C11.9002 72.9042 13.0392 75.5634 13.5148 78.3181C13.9893 81.0718 15.7929 94.1778 30.4191 95.3179C45.0442 96.458 49.7936 89.905 52.2627 83.162C54.7319 76.419 54.4474 69.9605 58.1512 69.2014C58.7307 69.0817 59.1989 68.9999 59.5758 68.9474Z\"\n fill={originalPink} />\n </svg>\n\n\n );\n};","import React from 'react'\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport function ShellIcon({ className = \"w-5 h-5\", size = 22, color = 'white' }: { className?: string; size?: number; color?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 48 48\" >\n <path\n fill='transparent'\n stroke={color}\n d=\"M6.5 8.4a2 2 0 0 0-2 2v27.2a2 2 0 0 0 2 2h35a2 2 0 0 0 2-2V10.4a2 2 0 0 0-2-2zM9 23.16l7.72 6L9 35.13v-12zm20.46 11.97h-11\" />\n </svg >\n )\n}\n","import { color } from 'framer-motion'\nimport React from 'react'\n\ninterface SlackIconProps {\n width?: number | string\n height?: number | string\n className?: string\n injectedColor?: string\n}\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport function SlackIcon({ \n width = 24, \n height = 24, \n className = \"text-current\" ,\n injectedColor \n}: SlackIconProps) {\n\n const redColor = injectedColor || \"#E01E5A\";\n const blueColor = injectedColor || \"#36C5F0\";\n const greenColor = injectedColor || \"#2EB67D\";\n const yellowColor = injectedColor || \"#ECB22E\";\n\n return (\n <svg \n width={width} \n height={height} \n viewBox=\"0 0 24 24\" \n fill=\"none\" \n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <g>\n <path \n d=\"M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zM6.313 15.165a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313z\" \n fill={redColor} \n />\n <path \n d=\"M8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zM8.834 6.313a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312z\" \n fill={blueColor} \n />\n <path \n d=\"M18.956 8.834a2.528 2.528 0 0 1 2.521-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.523 2.521h-2.521V8.834zM17.688 8.834a2.528 2.528 0 0 1-2.523 2.521 2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.528 2.528 0 0 1 2.523 2.522v6.312z\" \n fill={greenColor} \n />\n <path \n d=\"M15.165 18.956a2.528 2.528 0 0 1 2.523 2.521A2.528 2.528 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.523v-2.521h2.52zM15.165 17.688a2.527 2.527 0 0 1-2.52-2.523 2.528 2.528 0 0 1 2.52-2.521h6.313A2.528 2.528 0 0 1 24 15.165a2.528 2.528 0 0 1-2.522 2.523h-6.313z\" \n fill={yellowColor}\n />\n </g>\n </svg>\n )\n} ","import React from 'react';\n\ninterface XLogoProps extends React.SVGProps<SVGSVGElement> {\n className?: string;\n}\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport function XLogo({ className = '', color = 'white', ...props }: XLogoProps) {\n return (\n <svg\n width={24}\n height={24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n {...props}\n >\n <path d=\"M9.75292 12.6562C10.1923 12.2169 10.9044 12.2169 11.3437 12.6562C11.7831 13.0956 11.7831 13.8077 11.3437 14.2471L3.7954 21.7954C3.35606 22.2348 2.64392 22.2348 2.20458 21.7954C1.76524 21.3561 1.76524 20.6439 2.20458 20.2046L9.75292 12.6562ZM20.2046 2.20459C20.6439 1.76525 21.3561 1.76525 21.7954 2.20459C22.2347 2.64393 22.2347 3.35607 21.7954 3.79541L14.2471 11.3438C13.8077 11.7831 13.0956 11.7831 12.6562 11.3438C12.2169 10.9044 12.2169 10.1923 12.6562 9.75293L20.2046 2.20459Z\" fill=\"#FAFAFA\" />\n <path d=\"M7.9995 1.875L8.13426 1.88232C8.444 1.91951 8.72702 2.08473 8.9121 2.34082L21.9126 20.3408C22.1599 20.6833 22.1943 21.1365 22.0019 21.5127C21.8096 21.8887 21.4223 22.125 21 22.125H16.0005C15.6393 22.125 15.2994 21.9519 15.0879 21.6592L2.08739 3.65918C1.84004 3.31669 1.8057 2.86346 1.99803 2.4873C2.19042 2.11133 2.57763 1.875 2.99999 1.875H7.9995ZM16.5747 19.875H18.7983L7.42528 4.125H5.20165L16.5747 19.875Z\" fill=\"#FAFAFA\" />\n </svg>\n );\n} ","import React from 'react';\n\ninterface LinkedInIconProps extends React.SVGProps<SVGSVGElement> {\n className?: string;\n size?: number;\n}\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport function LinkedInIcon({ className = '', size = 24, color = 'white', ...props }: LinkedInIconProps) {\n return (\n <svg \n width={size} \n height={size} \n viewBox=\"0 0 24 24\" \n fill=\"none\" \n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n {...props}\n >\n <path \n d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z\" \n fill={color}\n />\n </svg>\n );\n}","import React from 'react';\n\ninterface YouTubeIconProps {\n color?: string;\n className?: string;\n}\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport function YouTubeIcon({ className ,\n color = 'white'\n}: YouTubeIconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M2.5 17a24.12 24.12 0 0 1 0-10 2 2 0 0 1 1.4-1.4 49.56 49.56 0 0 1 16.2 0A2 2 0 0 1 21.5 7a24.12 24.12 0 0 1 0 10 2 2 0 0 1-1.4 1.4 49.55 49.55 0 0 1-16.2 0A2 2 0 0 1 2.5 17\" />\n <path d=\"m10 15 5-3-5-3z\" />\n </svg>\n );\n}","import React from 'react';\n\ninterface InstagramIconProps {\n color?: string;\n className?: string;\n}\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport function InstagramIcon({ className ,\n color = 'white'\n}: InstagramIconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <rect width=\"20\" height=\"20\" x=\"2\" y=\"2\" rx=\"5\" ry=\"5\" />\n <path d=\"m16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z\" />\n <line x1=\"17.5\" x2=\"17.51\" y1=\"6.5\" y2=\"6.5\" />\n </svg>\n );\n}","import React from 'react';\n\ninterface FacebookIconProps {\n color?: string;\n className?: string;\n}\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport function FacebookIcon({ className ,\n color = 'white'\n}: FacebookIconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z\" />\n </svg>\n );\n}","import React from \"react\"\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport interface WindowsIconProps extends React.SVGProps<SVGSVGElement> {}\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport function WindowsIcon({ className, color = 'white', ...props }: WindowsIconProps) {\n return (\n <svg \n width=\"16\" \n height=\"16\" \n viewBox=\"0 0 16 16\" \n fill=\"none\" \n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n {...props}\n >\n <path d=\"M0.833374 2.22562L6.28233 1.48656L6.28468 6.72147L0.838322 6.75234L0.833374 2.22567V2.22562ZM6.27973 7.32457L6.2839 12.564L0.837593 11.8182L0.83728 7.28945L6.27973 7.32457ZM6.94025 1.38981L14.165 0.3396V6.65486L6.94025 6.71192V1.38981ZM14.1667 7.37385L14.165 13.6606L6.9402 12.645L6.93009 7.36207L14.1667 7.37385Z\" fill={color}/>\n </svg>\n )\n}","import React from \"react\"\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport interface MacOSIconProps extends React.SVGProps<SVGSVGElement> {\n color?: string;\n}\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport function MacOSIcon({ className, color = 'white', ...props }: MacOSIconProps) {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n {...props}\n >\n <path d=\"M12.2131 8.41846C12.1971 6.7312 13.5884 5.92054 13.651 5.88193C12.8678 4.73511 11.6515 4.57748 11.2182 4.55979C10.1831 4.45363 9.1978 5.171 8.67145 5.171C8.14509 5.171 7.3347 4.57427 6.47616 4.59196C5.34642 4.60804 4.30494 5.24981 3.72242 6.26314C2.55096 8.29943 3.42394 11.3233 4.56812 12.9784C5.12818 13.7875 5.79254 14.6994 6.66873 14.6657C7.51282 14.6319 7.83056 14.1188 8.84797 14.1188C9.86538 14.1188 10.1526 14.6657 11.0433 14.6496C11.9499 14.6319 12.5244 13.8228 13.0797 13.0106C13.7184 12.0696 13.9831 11.1609 13.9992 11.1126C13.9783 11.1046 12.2324 10.4338 12.2131 8.41846Z\" fill={color} />\n <path d=\"M10.5393 3.46284C11.0047 2.89827 11.3176 2.11496 11.2326 1.33325C10.5634 1.3606 9.75299 1.7804 9.27317 2.34497C8.8431 2.84359 8.46598 3.64138 8.56869 4.407C9.31168 4.4649 10.0755 4.02579 10.5393 3.46284Z\" fill={color} />\n </svg>\n )\n}","import React from \"react\"\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport interface LinuxIconProps extends React.SVGProps<SVGSVGElement> {}\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport function LinuxIcon({ className, color = 'white', ...props }: LinuxIconProps) {\n return (\n <svg \n width=\"16\" \n height=\"16\" \n viewBox=\"0 0 17 20\" \n fill=\"none\" \n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n {...props}\n >\n <path d=\"M16.5665 16.3141C16.0389 16.0972 15.6042 15.7556 15.6357 15.1013C15.6664 14.448 15.1694 14.015 15.1694 14.015C15.1694 14.015 15.6042 12.5845 15.2002 11.4033C14.797 10.2204 13.4629 8.32531 12.4392 6.8956C11.4171 5.46507 12.2849 3.81673 11.3549 1.7038C10.4232 -0.409119 8.00404 -0.285272 6.70073 0.616579C5.39654 1.51677 5.79974 3.75437 5.86111 4.8134C5.92335 5.86899 5.88924 6.62142 5.76903 6.89473C5.64629 7.16804 4.8075 8.1707 4.24833 9.00936C3.68999 9.84806 3.2868 11.5894 2.88191 12.3043C2.47872 13.0191 2.7583 13.6716 2.7583 13.6716C2.7583 13.6716 2.47872 13.7639 2.26133 14.2328C2.04395 14.6973 1.61009 14.9151 0.834407 15.0689C0.0587253 15.2243 0.0587252 15.7239 0.244535 16.2834C0.431214 16.8419 0.245404 17.1545 0.0280204 17.8676C-0.189363 18.5808 0.896647 18.8002 1.95108 18.9224C3.00639 19.0479 4.18526 19.732 5.1792 19.8559C6.17056 19.9806 6.48168 19.1726 6.48168 19.1726C6.48168 19.1726 7.59836 18.9224 8.7764 18.8933C9.95615 18.8617 11.0711 19.1419 11.0711 19.1419C11.0711 19.1419 11.2885 19.6389 11.6917 19.8558C12.0958 20.0736 12.9644 20.1052 13.5227 19.5159C14.0819 18.9241 15.5711 18.1793 16.4081 17.7122C17.2476 17.2442 17.0942 16.5302 16.5665 16.3141ZM9.30566 2.60573C9.83756 2.60573 10.2672 3.13438 10.2672 3.78604C10.2672 4.24893 10.0515 4.64779 9.73699 4.84163C9.65685 4.80663 9.57248 4.77076 9.48297 4.73232C9.67222 4.63836 9.80689 4.39669 9.80689 4.11482C9.80689 3.7476 9.58014 3.4495 9.29969 3.4495C9.02267 3.4495 8.79506 3.74843 8.79506 4.11482C8.79506 4.25063 8.82746 4.38129 8.88286 4.48803C8.71748 4.42226 8.56491 4.36078 8.44557 4.31552C8.3808 4.15667 8.34413 3.97732 8.34413 3.786C8.34413 3.13438 8.77376 2.60573 9.30566 2.60573ZM9.23662 5.09444C9.50257 5.18669 9.79836 5.36006 9.76769 5.5317C9.73616 5.70421 9.59634 5.70421 9.23662 5.92458C8.87607 6.14322 8.09525 6.62831 7.84546 6.6599C7.59401 6.6915 7.4542 6.55059 7.18825 6.37891C6.9223 6.20641 6.42193 5.79729 6.54807 5.57953C6.54807 5.57953 6.93763 5.2806 7.10898 5.12433C7.28115 4.96718 7.71932 4.59224 7.98527 4.64094C8.25122 4.68619 8.97067 5.00048 9.23662 5.09444ZM6.83876 2.79277C7.25816 2.79277 7.59911 3.29323 7.59911 3.91072C7.59911 4.02431 7.58804 4.12935 7.56671 4.23099C7.46444 4.26599 7.36043 4.32237 7.25985 4.40777C7.20872 4.44962 7.16351 4.4889 7.12004 4.52818C7.18655 4.4035 7.21295 4.22584 7.18311 4.03881C7.12684 3.70147 6.90266 3.45548 6.68018 3.49052C6.45857 3.52897 6.32472 3.83213 6.38099 4.1712C6.4381 4.51028 6.66145 4.75623 6.88306 4.71949C6.89586 4.71692 6.9078 4.71351 6.92056 4.70923C6.81232 4.81344 6.71258 4.90312 6.61114 4.9791C6.30429 4.83649 6.07924 4.41201 6.07924 3.90981C6.07928 3.2924 6.41936 2.79277 6.83876 2.79277ZM6.01961 18.4997C5.92074 18.9455 5.3999 19.2691 5.3999 19.2691C4.92767 19.4177 3.61495 18.8472 3.01994 18.597C2.4258 18.3502 0.91277 18.2733 0.714157 18.053C0.517243 17.8275 0.813028 17.3313 0.888901 16.8607C0.962206 16.3867 0.740593 16.0903 0.813898 15.7667C0.888901 15.4447 1.85553 15.4447 2.22636 15.2218C2.59885 14.9972 2.67302 14.3515 2.97051 14.1782C3.26799 14.0031 3.8127 14.624 4.03601 14.9733C4.25849 15.3191 5.10151 16.8103 5.44847 17.1827C5.79626 17.5551 6.11848 18.0538 6.01961 18.4997ZM11.5066 14.1679C11.4171 14.606 11.4171 16.1894 11.4171 16.1894C11.4171 16.1894 10.4556 17.5243 8.9647 17.743C7.47554 17.9616 6.73052 17.8044 6.73052 17.8044L5.89343 16.8419C5.89343 16.8419 6.5438 16.7471 6.45177 16.0947C6.35799 15.4422 4.46651 14.5403 4.12468 13.7315C3.78456 12.9244 4.06331 11.5554 4.49804 10.8713C4.93194 10.188 5.20982 8.69685 5.64455 8.19806C6.07928 7.70271 6.4194 6.64537 6.26426 6.17822C6.26426 6.17822 7.19509 7.29787 7.8455 7.11253C8.49674 6.9255 9.95694 5.83657 10.1726 6.02448C10.3891 6.21151 12.2508 10.3135 12.4357 11.6194C12.6224 12.9244 12.3113 13.9185 12.3113 13.9185C12.3113 13.9185 11.5986 13.7323 11.5066 14.1679ZM16.2682 17.0964C15.9784 17.3629 14.3656 18.0154 13.8823 18.5244C13.4015 19.0291 12.7732 19.44 12.3888 19.3204C12.0018 19.1982 11.6651 18.6679 11.8339 17.8941C12.0018 17.1229 12.1476 16.2774 12.1237 15.794C12.0998 15.3106 12.0018 14.6572 12.1237 14.5607C12.2439 14.4668 12.4357 14.5138 12.4357 14.5138C12.4357 14.5138 12.3411 15.4302 12.8943 15.6736C13.4475 15.9127 14.2437 15.5771 14.4849 15.3337C14.727 15.0937 14.8958 14.7316 14.8958 14.7316C14.8958 14.7316 15.1361 14.8537 15.1123 15.2389C15.0884 15.6249 15.2802 16.1818 15.6433 16.3739C16.0039 16.5644 16.558 16.8317 16.2682 17.0964Z\" fill={color}/>\n </svg>\n )\n}","import React from 'react'\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport interface CmdIconProps {\n size?: number\n className?: string\n color?: string\n}\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport const CmdIcon: React.FC<CmdIconProps> = ({ size = 16, className = '', color='white'}) => {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M3 4C3 3.44772 3.44772 3 4 3H20C20.5523 3 21 3.44772 21 4V20C21 20.5523 20.5523 21 20 21H4C3.44772 21 3 20.5523 3 20V4Z\"\n stroke={color}\n />\n <text\n x=\"12\"\n y=\"16\"\n textAnchor=\"middle\"\n fill={color}\n fontSize=\"10\"\n fontFamily=\"monospace\"\n fontWeight=\"bold\"\n >\n \\&gt;\n </text>\n </svg>\n )\n}\n\nCmdIcon.displayName = 'CmdIcon'\n","import React from 'react'\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport interface BashIconProps {\n size?: number\n className?: string\n color?: string\n}\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport const BashIcon: React.FC<BashIconProps> = ({ size = 16, className = '' , color = 'white'}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n className={className}\n viewBox=\"0 0 24 24\">\n <path fill={color}\n d=\"M5 9h2.31l.32-3h2l-.32 3h2l.32-3h2l-.32 3H15v2h-1.9l-.2 2H15v2h-2.31l-.32 3h-2l.32-3h-2l-.32 3h-2l.32-3H5v-2h1.9l.2-2H5zm4.1 2l-.2 2h2l.2-2M19 6h-2v8h2m0 2h-2v2h2Z\" />\n </svg>\n )\n}\n\nBashIcon.displayName = 'BashIcon'\n","import React from 'react'\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport interface NushellIconProps {\n size?: number\n className?: string\n color?: string\n}\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport const NushellIcon: React.FC<NushellIconProps> = ({ size = 16, className = '', color = 'white' }) => {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n className={className}\n viewBox=\"0 0 24 24\">\n <path\n fill={color}\n d=\"M0 16.338h1.25v-5.7c.417-.624 1.205-1.309 2.127-1.309c1.176 0 1.34.64 1.34 2.247v4.762h1.25v-5.685c0-1.458-.67-2.32-2.202-2.32c-.923 0-1.964.46-2.59 1.264l-.103-1.1H0Zm10.177-7.842h-1.25v5.698c0 1.46.745 2.307 2.263 2.307c.921 0 1.889-.431 2.514-1.22l.104 1.057h1.072V8.496h-1.25v5.773c-.432.67-1.265 1.25-2.129 1.25c-.907 0-1.324-.446-1.324-1.458zm8.11-.997l-.61.952l5.251 3.229l-5.251 3.244l.669.922L24 12.32v-1.28z\" />\n </svg>\n )\n}\n\nNushellIcon.displayName = 'NushellIcon'\n","import React from 'react'\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport interface DenoIconProps {\n size?: number\n className?: string\n color?: string\n}\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport const DenoIcon: React.FC<DenoIconProps> = ({ size = 16, className = '', color = 'white' }) => {\n return (\n <svg\n version=\"1.1\"\n width={size}\n height={size}\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 122.87 122.88\">\n <g>\n <path\n fill={color}\n d=\"M56.6,0.03c-0.29,0.03-1.21,0.14-2.04,0.21C42.74,1.48,31.11,6.48,21.62,14.43c-1.75,1.45-5.74,5.44-7.19,7.19 C6.57,31.01,1.98,41.54,0.28,54.01c-0.38,2.77-0.38,12.1,0,14.87c1.69,12.47,6.29,23,14.14,32.38c1.45,1.75,5.44,5.74,7.19,7.19 C31,116.31,41.54,120.9,54,122.6c2.77,0.38,12.1,0.38,14.87,0c12.47-1.69,23-6.29,32.38-14.14c1.75-1.45,5.74-5.44,7.19-7.19 c7.86-9.38,12.45-19.92,14.14-32.38c0.38-2.77,0.38-12.1,0-14.87c-1.69-12.47-6.29-23-14.14-32.38c-1.45-1.75-5.44-5.74-7.19-7.19 C91.9,6.6,81.26,1.95,68.96,0.3c-1.33-0.18-3.26-0.26-6.85-0.29C59.38-0.01,56.89,0,56.6,0.03L56.6,0.03z M57.36,6.56 c0,1.77,0.12,5.61,0.29,9.25c0.09,1.78,0.2,4.34,0.24,5.67c0.17,4.71,0.67,17.09,0.74,18.19l0.08,1.1l-0.68-0.08 c-0.38-0.03-0.73-0.12-0.79-0.17c-0.05-0.06-0.15-1.1-0.21-2.33c-0.27-5.38-1.16-26.25-1.25-29.3l-0.09-3.35l0.42-0.06 c0.23-0.03,0.6-0.08,0.85-0.09l0.41-0.01L57.36,6.56L57.36,6.56L57.36,6.56z M71.82,6.2c0.02,0.02,0.06,4.58,0.11,10.14 c0.06,5.58,0.14,10.58,0.18,11.12c0.05,0.56,0.03,1.04-0.05,1.07c-0.06,0.05-0.44,0.05-0.82,0l-0.7-0.06l-0.11-4.4 c-0.06-2.43-0.14-5.12-0.17-6c-0.12-2.67-0.23-11.76-0.14-11.98C70.2,5.93,70.37,5.91,71,6.02C71.44,6.11,71.8,6.18,71.82,6.2 L71.82,6.2L71.82,6.2z M36.87,11.26c0.09,0.14,0.8,8.46,1.68,19.36c0.29,3.7,0.57,7.09,0.62,7.51c0.08,0.77,0.06,0.8-0.42,1.1 c-0.27,0.17-0.54,0.3-0.6,0.3c-0.05,0-0.14-0.39-0.18-0.88c-0.21-1.96-1.03-11.45-1.6-18.31c-0.33-4.03-0.63-7.65-0.68-8.04 c-0.08-0.67-0.06-0.73,0.33-0.94C36.49,11.11,36.76,11.06,36.87,11.26L36.87,11.26L36.87,11.26z M78.47,14.3 c0.42,0.15,0.47,0.23,0.56,1.09c0.15,1.51,0.11,8.73-0.06,8.73c-0.44,0-1.35-0.51-1.42-0.8c-0.05-0.18-0.09-2.33-0.09-4.76 C77.45,13.65,77.39,13.93,78.47,14.3L78.47,14.3z M50.56,15.01c0,0.41,0.11,2.66,0.23,5.03c0.12,2.37,0.26,5.38,0.32,6.68 c0.11,2.63,0.14,2.54-0.88,2.6c-0.5,0.02-0.5,0.02-0.53-0.74c-0.03-0.42-0.11-1.74-0.2-2.95c-0.08-1.21-0.26-3.82-0.38-5.82 c-0.12-1.99-0.27-3.97-0.32-4.4c-0.09-0.76-0.08-0.79,0.33-0.94c0.24-0.09,0.67-0.17,0.94-0.17C50.56,14.3,50.56,14.3,50.56,15.01 L50.56,15.01L50.56,15.01z M92.47,17.08l0.51,0.21l0.11,2.02c0.05,1.1,0.08,3.49,0.05,5.29l-0.05,3.29l-0.63-0.32l-0.63-0.3 l-0.05-5.02c-0.03-2.77-0.02-5.11,0.02-5.21C91.85,16.82,91.85,16.82,92.47,17.08L92.47,17.08L92.47,17.08z M64.88,19.06 c0.09,0.09,0.3,7.42,0.32,11.14l0.02,2.24l-0.71-0.11c-0.41-0.05-0.74-0.09-0.76-0.11c-0.05-0.03-0.5-11.23-0.5-12.32v-1.12 l0.77,0.09C64.46,18.94,64.84,19.01,64.88,19.06L64.88,19.06L64.88,19.06z M99.68,20.13c0.18,0.21,0.21,3.52,0.26,21.77 c0.05,20.96,0.05,21.5-0.23,21.5c-0.17,0-0.39-0.09-0.53-0.2c-0.23-0.17-0.26-1.99-0.33-19.9c-0.06-10.85-0.14-20.7-0.18-21.9 l-0.09-2.18l0.44,0.32C99.27,19.74,99.56,19.99,99.68,20.13L99.68,20.13L99.68,20.13z M86.13,23.23c0.08,0.06,0.15,0.92,0.17,1.9 c0.08,3.34,0.09,23.81,0.02,23.88c-0.03,0.03-0.3-0.05-0.6-0.17l-0.54-0.23l0-25.7L85.58,23C85.81,23.06,86.05,23.15,86.13,23.23 L86.13,23.23L86.13,23.23z M44.42,24.07c0.05,0.41,0.12,1.33,0.17,2.09c0.05,0.74,0.15,2.43,0.24,3.75 c0.18,2.66,0.15,2.83-0.71,2.83c-0.45,0-0.51-0.05-0.57-0.5c-0.15-0.89-0.68-8.33-0.6-8.45c0.08-0.11,0.86-0.38,1.22-0.41 C44.26,23.36,44.38,23.68,44.42,24.07L44.42,24.07z M19.43,27.93c0.17,1.6,0.5,4.96,0.74,7.45c0.26,2.49,0.47,4.61,0.47,4.7 c0,0.18-1.16,0.76-1.28,0.63c-0.08-0.08-1.59-13.45-1.59-14.05c0-0.36,1.16-1.89,1.31-1.72C19.13,24.96,19.28,26.31,19.43,27.93 L19.43,27.93z M78.68,29.51l0.44,0.26l0.02,3.26c0.01,1.78,0.05,3.78,0.05,4.43c0.03,1.36-0.14,1.59-0.95,1.3l-0.47-0.17v-1.3 c0-0.73-0.05-2.83-0.11-4.68l-0.09-3.35h0.35C78.09,29.26,78.44,29.38,78.68,29.51L78.68,29.51L78.68,29.51z M26.06,35.38 c0.27,2.9,0.71,7.8,1,10.88l0.51,5.59l-0.59,0.59l-0.57,0.59l-0.11-1.19c-0.06-0.67-0.36-3.75-0.68-6.86 c-0.32-3.11-0.77-7.63-1-10.03l-0.42-4.35l0.59-0.54c0.53-0.5,0.59-0.51,0.7-0.24C25.55,29.95,25.81,32.46,26.06,35.38L26.06,35.38 L26.06,35.38z M14.74,37.2c0.33,2.98,1.21,10.89,1.96,17.59c0.76,6.69,1.47,13.15,1.6,14.36c0.12,1.21,0.33,3.04,0.45,4.08 c0.21,1.77,0.21,1.89-0.03,2.07c-0.36,0.27-0.51,0.24-0.51-0.08c0-0.14-0.14-1.28-0.3-2.52c-0.27-2.07-0.73-5.58-1.74-13.45 c-0.21-1.59-0.62-4.74-0.91-7.03c-0.3-2.28-0.74-5.68-0.98-7.56c-0.24-1.87-0.65-5.08-0.91-7.15c-0.27-2.05-0.44-3.88-0.39-4.08 c0.11-0.41,1-1.83,1.09-1.74C14.11,31.75,14.41,34.21,14.74,37.2L14.74,37.2L14.74,37.2z M10.12,43.72 c0.23,1.81,0.65,5.12,0.94,7.37c0.29,2.24,0.65,5.03,0.82,6.2l0.29,2.12l-0.32,0.27c-0.18,0.15-0.36,0.21-0.42,0.15 c-0.06-0.06-0.18-0.67-0.27-1.33c-0.09-0.67-0.65-4.55-1.25-8.61l-1.07-7.4l0.35-1.03c0.18-0.56,0.38-1.01,0.42-1.01 C9.65,40.44,9.88,41.92,10.12,43.72L10.12,43.72L10.12,43.72z M93.08,41.74c0.21,0.21,0.24,1.15,0.24,8.08v7.84H92.9 c-0.92,0-0.91,0.23-0.97-8.36l-0.05-7.81h0.48C92.63,41.5,92.96,41.6,93.08,41.74L93.08,41.74z M60,44.44 c3.41,0.51,6.39,1.47,9.34,2.98c1.9,0.98,2.81,1.66,4.93,3.69c3.14,3.01,5.08,5.64,6.89,9.35c2.64,5.41,3.67,10.2,4.97,23.04 c0.59,5.76,1.36,16.2,1.53,20.48c0.05,1.24,0.15,3.28,0.24,4.53c0.17,2.66,0.36,2.3-1.98,3.43c-3.25,1.57-6.38,2.66-10.5,3.67 c-5.05,1.24-8.31,1.63-13.3,1.65l-3.63,0.01l0.03-1.74c0-0.95,0.09-3.17,0.18-4.91c0.45-8.42,0.36-19.04-0.23-24.93 c-0.33-3.38-0.98-7.49-1.35-8.4c-0.08-0.2,0.27-0.36,1.77-0.88c2.74-0.95,5.11-2.15,5.47-2.73c0.65-1.12-0.51-2.72-1.99-2.72 c-0.26,0-1.03,0.27-1.74,0.59c-3.39,1.56-10.17,3.39-14.08,3.79c-2.7,0.29-6.91,0.12-9.82-0.41c-1.59-0.29-4.43-1.36-6.8-2.58 c-2.73-1.42-4.41-3.31-4.91-5.55c-0.27-1.21-0.2-3.63,0.15-4.99c0.38-1.5,1.44-3.67,2.4-4.94c4.31-5.67,13.19-10.58,22.3-12.3 C52.78,44.03,56.89,43.97,60,44.44L60,44.44L60,44.44z M106.62,44.91c0.54,0.23,0.6,0.29,0.6,0.8c0.03,4.13-0.06,13.55-0.14,13.95 c-0.02,0.14-0.8,0.15-1.13,0.03c-0.21-0.08-0.24-0.89-0.24-7.56c0-4.77,0.06-7.46,0.15-7.46 C105.94,44.67,106.29,44.77,106.62,44.91L106.62,44.91z M113.22,53.21l0.54,0.23l-0.11,12.51c-0.12,15.94-0.14,16.41-0.71,17.79 c-0.94,2.25-0.89,2.7-0.8-7.18c0.03-4.94,0.11-9.94,0.14-11.11c0.03-1.16,0.06-4.44,0.08-7.3c0-3.45,0.05-5.17,0.15-5.17 C112.6,52.98,112.92,53.09,113.22,53.21L113.22,53.21z M22.34,56.97c0.09,1.22,0.06,1.35-0.38,2.31l-0.48,1.03L21.3,58.8 c-0.29-2.42-0.29-2.52,0.29-2.89c0.26-0.18,0.53-0.3,0.57-0.27C22.21,55.67,22.3,56.27,22.34,56.97L22.34,56.97z M13.01,66.08 c0.14,1.24,1.19,9.46,1.74,13.49c0.82,6.24,0.88,7.13,0.51,6.75c-0.05-0.05-0.39-2.15-0.76-4.67c-2.36-16.29-2.34-16.18-2.15-16.3 C12.76,65.08,12.9,65.23,13.01,66.08L13.01,66.08L13.01,66.08z M23.89,73c0.09,0.38,0.53,4.47,0.53,4.97 c0,0.42-0.54,0.82-0.79,0.57c-0.08-0.08-0.27-1.36-0.42-2.84c-0.17-1.5-0.33-3.05-0.38-3.46l-0.09-0.76l0.53,0.6 C23.57,72.43,23.84,72.84,23.89,73L23.89,73L23.89,73z M36.08,78.7c0.17,0.15,0.27,0.76,0.41,2.39c0.23,2.95,0.26,2.72-0.36,2.72 c-0.63,0-0.62,0.05-0.83-2.61c-0.21-2.7-0.21-2.67,0.2-2.67C35.69,78.52,35.94,78.61,36.08,78.7L36.08,78.7z M48.05,78.93 c0.03,0.15,0.11,1.06,0.17,2.01c0.05,0.95,0.18,3.1,0.3,4.76c0.42,6.1,0.44,6.88,0.18,6.88c-0.29,0-0.32-0.23-0.65-4.53 c-0.12-1.78-0.35-4.59-0.5-6.24c-0.14-1.65-0.23-3.02-0.18-3.05C47.54,78.56,47.97,78.7,48.05,78.93L48.05,78.93L48.05,78.93z M19.64,81.83c0.09,0.14,0.67,4.97,1.37,11.57c0.21,1.99,0.42,3.91,0.47,4.28l0.08,0.65l-0.38-0.24c-0.29-0.2-0.39-0.39-0.39-0.74 c0-0.95-0.65-7.22-1.15-11.06c-0.29-2.18-0.51-4.09-0.51-4.28C19.13,81.69,19.49,81.57,19.64,81.83L19.64,81.83z M106.85,88.14 l-0.11,6.32l-0.38,0.56c-0.86,1.27-0.82,1.51-0.77-5.56l0.03-6.48l0.56-0.57c0.3-0.3,0.6-0.56,0.67-0.56 C106.89,81.84,106.89,84.68,106.85,88.14L106.85,88.14L106.85,88.14z M92.87,98.16c0.08,8.78,0.06,9.46-0.18,9.73 c-0.15,0.17-0.29,0.27-0.33,0.23c-0.11-0.12-0.26-19.27-0.14-19.37c0.06-0.06,0.21-0.09,0.35-0.08 C92.76,88.72,92.81,89.79,92.87,98.16L92.87,98.16L92.87,98.16z M43.52,92.15c0.11,0.94,0.48,5.42,0.63,7.54 c0.09,1.42,0.09,1.47-0.24,1.57c-0.18,0.06-0.39,0.05-0.45-0.03c-0.11-0.11-0.44-3.46-0.85-8.63l-0.11-1.24h0.47 C43.41,91.36,43.44,91.39,43.52,92.15L43.52,92.15z M31.64,97.44c0.11,0.11,0.18,0.48,0.18,0.86c0,0.39,0.18,2.43,0.38,4.55 c0.57,5.79,0.62,6.57,0.36,6.42c-0.39-0.23-0.74-0.57-0.67-0.67c0.03-0.06-0.03-0.82-0.15-1.68c-0.11-0.88-0.24-2.3-0.3-3.17 c-0.06-0.88-0.2-2.48-0.32-3.55c-0.29-2.64-0.27-2.95,0.06-2.95C31.34,97.25,31.53,97.33,31.64,97.44L31.64,97.44L31.64,97.44z M38.79,107.61c0.05,0.33,0.14,1.57,0.2,2.75c0.11,2.27,0.06,2.43-0.56,1.96c-0.18-0.14-0.3-0.71-0.48-2.43 c-0.32-3.11-0.33-2.99,0.26-2.93C38.63,107,38.7,107.06,38.79,107.61L38.79,107.61L38.79,107.61z\" />\n <path\n fill={color}\n d=\"M33.39,51.68c-1.57,0.68-1.69,2.81-0.21,3.57c1.07,0.54,2.16,0.29,2.72-0.65 C36.96,52.87,35.23,50.88,33.39,51.68L33.39,51.68L33.39,51.68z M43.64,53.13c-1.45,0.89-1.45,3.04,0,3.93 c1.44,0.86,3.29-0.27,3.29-1.99C46.93,53.4,45.03,52.29,43.64,53.13L43.64,53.13z\" />\n </g>\n </svg>\n )\n}\nDenoIcon.displayName = 'DenoIcon'","import React from 'react';\nimport { OpenmspLogo, FlamingoLogo, OpenFrameLogo, MiamiCyberGangLogoFaceOnly } from '../components/icons';\nimport { Globe } from 'lucide-react';\nimport type { SelectableOption } from '../components/features';\nimport type { PlatformConfig } from '../types/platform';\n\n// Platform icons mapping with consistent colors matching app theme\nexport const platformIcons = {\n openframe: <OpenFrameLogo className=\"h-5 w-5\" lowerPathColor=\"#FFC008\" upperPathColor=\"#ffffff\" />,\n openmsp: <OpenmspLogo className=\"h-5 w-5\" />,\n flamingo: <FlamingoLogo className=\"h-5 w-5\" fill=\"#EC4899\" />,\n 'flamingo-teaser': <FlamingoLogo className=\"h-5 w-5\" fill=\"#EC4899\" />,\n 'marketing-hub': <FlamingoLogo className=\"h-5 w-5\" fill=\"#F357BB\" />,\n 'product-hub': <FlamingoLogo className=\"h-5 w-5\" fill=\"#5EA62E\" />,\n 'revenue-hub': <FlamingoLogo className=\"h-5 w-5\" fill=\"#FFC008\" />,\n 'people-hub': <FlamingoLogo className=\"h-5 w-5\" fill=\"#5EFAF0\" />,\n 'company-hub': <FlamingoLogo className=\"h-5 w-5\" fill=\"#f36666\" />,\n tmcg: <MiamiCyberGangLogoFaceOnly className=\"h-5 w-5\" />,\n universal: <Globe className=\"h-5 w-5 text-[#10B981]\" />\n};\n\n// Platform colors mapping\nexport const platformColors = {\n openmsp: 'bg-[#3B82F6]',\n openframe: 'bg-[#8B5CF6]',\n flamingo: 'bg-[#EC4899]',\n 'flamingo-teaser': 'bg-[#F59E0B]',\n 'marketing-hub': 'bg-[#F357BB]',\n 'product-hub': 'bg-[#5EA62E]',\n 'revenue-hub': 'bg-[#FFC008]',\n 'people-hub': 'bg-[#5EFAF0]',\n 'company-hub': 'bg-[#f36666]',\n tmcg: 'bg-[#FF6B6B]',\n universal: 'bg-[#10B981]'\n};\n\n// Platform display names for consistent naming across the app\nexport const platformDisplayNames = {\n openmsp: 'OpenMSP',\n openframe: 'OpenFrame',\n flamingo: 'Flamingo',\n 'flamingo-teaser': 'Flamingo Teaser',\n 'marketing-hub': 'Flamingo Marketing Hub',\n 'product-hub': 'Flamingo Product Hub',\n 'revenue-hub': 'Flamingo Revenue Hub',\n 'people-hub': 'Flamingo People Hub',\n 'company-hub': 'Flamingo Company Hub',\n tmcg: 'TMCG',\n universal: 'Universal'\n};\n\n// Platform descriptions for consistent messaging across the app\nexport const platformDescriptions = {\n openmsp: 'Comprehensive directory and comparison platform for managed service providers (MSPs) and technology vendors. Reduce vendor costs and discover open-source alternatives.',\n openframe: 'AI-driven open-source security operations center (SOC) and endpoint detection platform for MSPs.',\n flamingo: 'AI-driven open-source OS for MSPs. Swap bloated vendor tools for open ones. Automate the boring crap. Take your margin back.',\n 'flamingo-teaser': 'Preview of Flamingo - the AI-driven open-source OS for MSPs.',\n tmcg: 'The Miami Cyber Gang - A cybersecurity community focused on education and collaboration.',\n universal: 'Cross-platform universal content.'\n};\n\n// Platform slogans for branding consistency\nexport const platformSlogans = {\n openmsp: 'Find Your Perfect MSP Partner',\n openframe: 'Open-Source Security Operations',\n flamingo: 'Open-Source OS for MSPs',\n 'flamingo-teaser': 'Coming Soon: Open-Source OS for MSPs',\n tmcg: 'Miami Cyber Community',\n universal: 'Universal Platform'\n};\n\n// Platform hex colors for default configuration\nexport const platformHexColors = {\n openmsp: '#FFC008',\n openframe: '#FFC008',\n flamingo: '#FF6B9D',\n universal: '#FFC008',\n 'flamingo-teaser': '#F59E0B',\n 'marketing-hub': '#F357BB',\n 'product-hub': '#5EA62E',\n 'revenue-hub': '#FFC008',\n 'people-hub': '#5EFAF0',\n 'company-hub': '#f36666',\n tmcg: '#FF6B6B'\n};\n\n// Platform icon names for default configuration\nexport const platformIconNames = {\n openmsp: 'openmsp-logo',\n openframe: 'openframe-logo',\n flamingo: 'flamingo-logo',\n universal: 'globe',\n 'flamingo-teaser': 'flamingo-logo',\n 'marketing-hub': 'flamingo-logo',\n 'product-hub': 'flamingo-logo',\n 'revenue-hub': 'flamingo-logo',\n 'people-hub': 'flamingo-logo',\n 'company-hub': 'flamingo-logo',\n tmcg: 'tmcg-logo'\n};\n\n/**\n * Get default color for platform\n */\nexport function getDefaultColorForPlatform(platformName: string): string {\n return platformHexColors[platformName as keyof typeof platformHexColors] || platformHexColors.universal;\n}\n\n/**\n * Get default icon name for platform\n */\nexport function getDefaultIconForPlatform(platformName: string): string {\n return platformIconNames[platformName as keyof typeof platformIconNames] || platformIconNames.universal;\n}\n\nexport function transformPlatformConfigsToOptions(platformConfigs: PlatformConfig[]): SelectableOption[] {\n return platformConfigs.map((platform: PlatformConfig) => ({\n id: platform.id, // Database UUID for matching\n name: platform.name, // Platform name enum\n displayName: platform.display_name, // Human-readable name\n description: platform.description,\n icon: platformIcons[platform.name as keyof typeof platformIcons] || platformIcons.universal,\n color: platformColors[platform.name as keyof typeof platformColors] || platformColors.universal\n }));\n}\n\n/**\n * Get platform icon by name\n */\nexport function getPlatformIcon(platformName: string) {\n return platformIcons[platformName as keyof typeof platformIcons] || platformIcons.universal;\n}\n\n/**\n * Get platform color by name\n */\nexport function getPlatformColor(platformName: string) {\n return platformColors[platformName as keyof typeof platformColors] || platformColors.universal;\n}\n\n/**\n * Get platform display name by name\n */\nexport function getPlatformDisplayName(platformName: string): string {\n return platformDisplayNames[platformName as keyof typeof platformDisplayNames] || platformName;\n}\n\n/**\n * Get platform description by name\n */\nexport function getPlatformDescription(platformName: string): string {\n return platformDescriptions[platformName as keyof typeof platformDescriptions] || platformName;\n}\n\n/**\n * Get platform slogan by name\n */\nexport function getPlatformSlogan(platformName: string): string {\n return platformSlogans[platformName as keyof typeof platformSlogans] || platformName;\n}\n\n/**\n * Get small platform icon for filter buttons with white colors (4x4 size)\n */\nexport function getSmallPlatformIcon(platformName: string): React.ReactNode {\n const className = \"h-4 w-4 flex-shrink-0\";\n\n switch (platformName) {\n case 'openframe':\n return <OpenFrameLogo className={className} lowerPathColor=\"#FFC008\" upperPathColor=\"#ffffff\" />;\n case 'openmsp':\n return <OpenmspLogo className={className} frontBubbleColor=\"#f1f1f1\" innerFrontBubbleColor=\"#000000\" backBubbleColor=\"#FFC008\" />;\n case 'flamingo':\n case 'flamingo-teaser':\n return <FlamingoLogo className={`${className}`} fill=\"#EC4899\" />;\n case 'marketing-hub':\n return <FlamingoLogo className={className} fill=\"var(--ods-flamingo-pink-base)\" />;\n case 'product-hub':\n return <FlamingoLogo className={className} fill=\"var(--ods-attention-green-success)\" />;\n case 'revenue-hub':\n return <FlamingoLogo className={className} fill=\"var(--ods-attention-yellow-warning)\" />;\n case 'people-hub':\n return <FlamingoLogo className={className} fill=\"var(--ods-flamingo-cyan-base)\" />;\n case 'company-hub':\n return <FlamingoLogo className={className} fill=\"var(--ods-attention-red-error)\" />;\n case 'tmcg':\n return <MiamiCyberGangLogoFaceOnly className={className} />;\n case 'universal':\n default:\n return <Globe className={className} />;\n }\n}\n\n/**\n * Get platform icon for admin/selector components (standard 6x6 size)\n */\nexport function getPlatformIconComponent(platformName: string, className: string = \"h-6 w-6\"): React.ReactNode {\n switch (platformName) {\n case 'openframe':\n return <OpenFrameLogo className={className} />;\n case 'openmsp':\n return <OpenmspLogo className={className} color=\"#f1f1f1\" />;\n case 'flamingo':\n case 'flamingo-teaser':\n return <FlamingoLogo className={`${className} text-white`} />;\n case 'marketing-hub':\n return <FlamingoLogo className={className} fill=\"var(--ods-flamingo-pink-base)\" />;\n case 'product-hub':\n return <FlamingoLogo className={className} fill=\"var(--ods-attention-green-success)\" />;\n case 'revenue-hub':\n return <FlamingoLogo className={className} fill=\"var(--ods-attention-yellow-warning)\" />;\n case 'people-hub':\n return <FlamingoLogo className={className} fill=\"var(--ods-flamingo-cyan-base)\" />;\n case 'company-hub':\n return <FlamingoLogo className={className} fill=\"var(--ods-attention-red-error)\" />;\n case 'tmcg':\n return <MiamiCyberGangLogoFaceOnly size={24} className={className} />;\n case 'universal':\n default:\n return <Globe className={className} />;\n }\n}","import type { ComponentType } from 'react';\nimport { WindowsIcon, LinuxIcon, MacOSIcon } from '../components/icons';\n\n// OS-level platforms (Windows, Linux, MacOS)\n\nexport type OSPlatformId = 'windows' | 'linux' | 'darwin';\n\nexport interface OSPlatformOption {\n id: OSPlatformId;\n name: string;\n icon: ComponentType<any>;\n}\n\nexport const OS_PLATFORMS: OSPlatformOption[] = [\n { id: 'windows', name: 'Windows', icon: WindowsIcon },\n { id: 'linux', name: 'Linux', icon: LinuxIcon },\n { id: 'darwin', name: 'MacOS', icon: MacOSIcon }\n];\n\nexport const DEFAULT_OS_PLATFORM: OSPlatformId = 'windows';\n\n\n","/**\n * Access Code Client Utilities — pure standalone functions.\n *\n * Endpoint paths are NOT hardcoded — every function takes an\n * `endpoints` argument. The React-side wrapper that binds them from\n * `EndpointsRuntimeContext` lives separately at\n * `hooks/use-access-code-integration.ts` (`useAccessCodeIntegration`).\n *\n * Keep this file **free of React imports** — it lives in the\n * server-safe `utils/index` tsup bundle. Any module-top-level call\n * into `createContext()` (which the runtime context file does) would\n * be pulled into the server bundle and crash SSR with\n * `createContext is not a function`.\n */\n\nimport {\n AccessCodeValidation,\n AccessCodeValidationResponse,\n AccessCodeConsumptionResponse\n} from '../types/access-code-cohorts';\n\n/** Endpoints required by the standalone client utilities. The\n * `useAccessCodeIntegration` hook (in `hooks/`) resolves these from\n * `EndpointsRuntimeContext.accessCode` automatically. */\nexport interface AccessCodeEndpoints {\n validateUrl: string\n consumeUrl: string\n}\n\n/**\n * Validate an access code for a given email\n *\n * @param email - User's email address\n * @param code - Access code to validate\n * @returns Promise with validation result\n *\n * @example\n * const result = await validateAccessCode('user@example.com', 'ABC123XY');\n * if (result.valid) {\n * // Allow user to proceed with registration\n * console.log(`Welcome to ${result.cohort_name}!`);\n * } else {\n * // Show error message\n * console.error(result.message);\n * }\n */\nexport async function validateAccessCode(\n email: string,\n code: string,\n endpoints: AccessCodeEndpoints,\n): Promise<AccessCodeValidationResponse> {\n try {\n const response = await fetch(endpoints.validateUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ email, code } as AccessCodeValidation),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new Error(error.error || 'Validation request failed');\n }\n\n return await response.json() as AccessCodeValidationResponse;\n } catch (error) {\n return {\n valid: false,\n message: error instanceof Error ? error.message : 'Validation failed',\n };\n }\n}\n\n/**\n * Consume an access code after successful registration\n *\n * Call this ONLY after the user has successfully completed registration.\n * This marks the code as used and prevents further usage.\n *\n * @param email - User's email address\n * @param code - Access code to consume\n * @returns Promise with consumption result\n *\n * @example\n * // After successful registration\n * const result = await consumeAccessCode('user@example.com', 'ABC123XY');\n * if (result.consumed) {\n * console.log('Access code consumed successfully');\n * } else {\n * console.warn('Failed to consume access code:', result.message);\n * }\n */\nexport async function consumeAccessCode(\n email: string,\n code: string,\n endpoints: AccessCodeEndpoints,\n): Promise<AccessCodeConsumptionResponse> {\n try {\n const response = await fetch(endpoints.consumeUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ email, code } as AccessCodeValidation),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new Error(error.error || 'Consumption request failed');\n }\n\n return await response.json() as AccessCodeConsumptionResponse;\n } catch (error) {\n return {\n success: false,\n consumed: false,\n message: error instanceof Error ? error.message : 'Consumption failed',\n };\n }\n}\n\n/**\n * Complete access code flow: validate then consume\n *\n * This is a convenience function that validates an access code and,\n * if valid, immediately consumes it. Use this when you want to\n * validate and consume in one step during registration.\n *\n * @param email - User's email address\n * @param code - Access code to validate and consume\n * @returns Promise with validation and consumption results\n *\n * @example\n * const result = await validateAndConsumeAccessCode('user@example.com', 'ABC123XY');\n * if (result.valid && result.consumed) {\n * // Registration successful\n * console.log(`Welcome to ${result.cohort_name}!`);\n * } else {\n * console.error(result.message);\n * }\n */\nexport async function validateAndConsumeAccessCode(\n email: string,\n code: string,\n endpoints: AccessCodeEndpoints,\n): Promise<AccessCodeValidationResponse & { consumed?: boolean }> {\n // First validate\n const validation = await validateAccessCode(email, code, endpoints);\n\n if (!validation.valid) {\n return validation;\n }\n\n // If valid, consume the code\n const consumption = await consumeAccessCode(email, code, endpoints);\n\n return {\n ...validation,\n consumed: consumption.consumed,\n message: consumption.consumed\n ? `Access granted for ${validation.cohort_name}`\n : consumption.message || validation.message,\n };\n}\n\n// `useAccessCodeIntegration` (the React-side wrapper) lives in\n// `hooks/use-access-code-integration.ts`. It binds the endpoints from\n// `EndpointsRuntimeContext` so React callers don't have to plumb URLs.\n","/**\n * Email Domain Validation Utilities\n *\n * Validates email domain formats (the part after @ in email addresses)\n * Used for SSO domain allowlist feature to restrict auto-provisioning to specific domains.\n */\n\n/**\n * Validates an email domain format (the part after @ in email addresses)\n * Valid: example.com, sub.domain.org, my-company.co.uk\n * Invalid: http://example.com, @example.com, example, .com\n *\n * @param domain - The domain string to validate\n * @returns true if the domain is a valid email domain format\n */\nexport function isValidEmailDomain(domain: string): boolean {\n if (!domain || typeof domain !== 'string') {\n return false\n }\n\n const trimmed = domain.trim()\n if (!trimmed) {\n return false\n }\n\n // Domain regex: must have at least one dot, valid characters, and proper TLD\n // Allows subdomains, hyphens (not at start/end of labels), alphanumeric characters\n const domainRegex = /^(?!-)[A-Za-z0-9-]{1,63}(?<!-)(\\.[A-Za-z0-9-]{1,63})*\\.[A-Za-z]{2,}$/\n return domainRegex.test(trimmed)\n}\n\n/**\n * Validation result type\n */\nexport interface EmailDomainValidationResult {\n valid: boolean\n error?: string\n cleanedDomain?: string\n}\n\n/**\n * Validates an email domain with detailed error messages\n * Also cleans the input (removes leading @, trims whitespace)\n *\n * @param domain - The domain string to validate\n * @returns Validation result with error message if invalid\n */\nexport function validateEmailDomain(domain: string): EmailDomainValidationResult {\n if (!domain || typeof domain !== 'string') {\n return { valid: false, error: 'Email domain is required' }\n }\n\n // Clean the input: trim and remove leading @ if user enters it\n let trimmed = domain.trim()\n if (trimmed.startsWith('@')) {\n trimmed = trimmed.substring(1)\n }\n\n // Check for empty after cleaning\n if (!trimmed) {\n return { valid: false, error: 'Email domain is required' }\n }\n\n // Check for protocol (common mistake: entering full URL)\n if (trimmed.includes('://')) {\n return { valid: false, error: 'Enter email domain only (e.g., openframe.ai), not a URL' }\n }\n\n // Check for @ symbol (common mistake: entering full email address)\n if (trimmed.includes('@')) {\n return { valid: false, error: 'Enter domain only, not a full email address' }\n }\n\n // Check for spaces\n if (trimmed.includes(' ')) {\n return { valid: false, error: 'Domain cannot contain spaces' }\n }\n\n // Check for trailing slash\n if (trimmed.includes('/')) {\n return { valid: false, error: 'Enter domain only, without paths' }\n }\n\n // Validate the domain format\n if (!isValidEmailDomain(trimmed)) {\n return { valid: false, error: 'Invalid domain format (e.g., openframe.ai)' }\n }\n\n // Return success with the cleaned domain\n return { valid: true, cleanedDomain: trimmed.toLowerCase() }\n}\n\n/**\n * Validates a list of email domains\n * Returns the first error encountered or success if all domains are valid\n *\n * @param domains - Array of domain strings to validate\n * @returns Validation result with array of cleaned domains if valid\n */\nexport function validateEmailDomainList(domains: string[]): {\n valid: boolean\n error?: string\n cleanedDomains?: string[]\n} {\n if (!Array.isArray(domains)) {\n return { valid: false, error: 'Domains must be an array' }\n }\n\n const cleanedDomains: string[] = []\n const seenDomains = new Set<string>()\n\n for (const domain of domains) {\n const result = validateEmailDomain(domain)\n\n if (!result.valid) {\n return { valid: false, error: `Invalid domain \"${domain}\": ${result.error}` }\n }\n\n const cleanedDomain = result.cleanedDomain!\n\n // Check for duplicates (case-insensitive)\n if (seenDomains.has(cleanedDomain)) {\n return { valid: false, error: `Duplicate domain: ${cleanedDomain}` }\n }\n\n seenDomains.add(cleanedDomain)\n cleanedDomains.push(cleanedDomain)\n }\n\n return { valid: true, cleanedDomains }\n}\n\n/**\n * Cleans a domain string by removing common user input mistakes\n * Does NOT validate - use validateEmailDomain for validation\n *\n * @param domain - The domain string to clean\n * @returns Cleaned domain string\n */\nexport function cleanEmailDomain(domain: string): string {\n if (!domain || typeof domain !== 'string') {\n return ''\n }\n\n let cleaned = domain.trim().toLowerCase()\n\n // Remove leading @\n if (cleaned.startsWith('@')) {\n cleaned = cleaned.substring(1)\n }\n\n // Remove protocol if present\n cleaned = cleaned.replace(/^https?:\\/\\//, '')\n\n // Remove trailing slash and path\n cleaned = cleaned.split('/')[0]\n\n // Remove www. prefix\n cleaned = cleaned.replace(/^www\\./, '')\n\n return cleaned\n}\n","/**\n * Confidence helpers for AI enrichment\n * Shared utilities for displaying confidence levels from AI operations\n */\n\n/**\n * Get Tailwind CSS classes for confidence badge display (border and text color)\n * @param confidence - Confidence score (0-100)\n * @returns CSS classes for border and text color\n */\nexport function getConfidenceColorClass(confidence?: number): string {\n if (!confidence && confidence !== 0) return '';\n if (confidence >= 80) return 'border-green-500 text-green-500';\n if (confidence >= 50) return 'border-yellow-500 text-yellow-500';\n return 'border-red-500 text-red-500';\n}\n\n/**\n * Get confidence level category\n * @param confidence - Confidence score (0-100)\n * @returns Confidence level category\n */\nexport function getConfidenceLevel(confidence?: number): 'high' | 'medium' | 'low' | 'none' {\n if (!confidence && confidence !== 0) return 'none';\n if (confidence >= 80) return 'high';\n if (confidence >= 50) return 'medium';\n return 'low';\n}\n\n/**\n * Get Tailwind CSS class for border color only\n * @param confidence - Confidence score (0-100)\n * @returns CSS class for border color\n */\nexport function getConfidenceBorderClass(confidence?: number): string {\n if (!confidence && confidence !== 0) return '';\n if (confidence >= 80) return 'border-green-500';\n if (confidence >= 50) return 'border-yellow-500';\n return 'border-red-500';\n}\n\n/**\n * Get Tailwind CSS class for text color only\n * @param confidence - Confidence score (0-100)\n * @returns CSS class for text color\n */\nexport function getConfidenceTextClass(confidence?: number): string {\n if (!confidence && confidence !== 0) return '';\n if (confidence >= 80) return 'text-green-500';\n if (confidence >= 50) return 'text-yellow-500';\n return 'text-red-500';\n}\n\n/**\n * Get Tailwind CSS class for background color (subtle)\n * @param confidence - Confidence score (0-100)\n * @returns CSS class for subtle background color\n */\nexport function getConfidenceBgClass(confidence?: number): string {\n if (!confidence && confidence !== 0) return '';\n if (confidence >= 80) return 'bg-green-500/10';\n if (confidence >= 50) return 'bg-yellow-500/10';\n return 'bg-red-500/10';\n}\n\n/**\n * Get descriptive label for confidence level\n * @param confidence - Confidence score (0-100)\n * @returns Human-readable confidence label\n */\nexport function getConfidenceLabel(confidence?: number): string {\n if (!confidence && confidence !== 0) return 'Unknown';\n if (confidence >= 80) return 'High';\n if (confidence >= 50) return 'Medium';\n return 'Low';\n}\n","/**\n * Shared Date Formatting Utilities\n * Single source of truth for date formatting across the application\n */\n\n/**\n * Format release date - avoids timezone shifts\n * Used in product releases list and detail pages\n *\n * @param dateString - ISO date string (e.g., \"2025-11-11T00:00:00Z\")\n * @returns Formatted date (e.g., \"November 11, 2025\")\n */\nexport function formatReleaseDate(dateString: string): string {\n const [year, month, day] = dateString.split('T')[0].split('-');\n const monthNames = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December'\n ];\n return `${monthNames[parseInt(month) - 1]} ${parseInt(day)}, ${year}`;\n}\n","/**\n * Format a timestamp as relative time with support for both past and future dates\n *\n * @param timestamp - ISO date string or timestamp in milliseconds\n * @returns Human-readable relative time string\n *\n * @example\n * // Past dates\n * formatRelativeTime('2024-01-01T00:00:00Z') // \"5 days ago\"\n * formatRelativeTime(Date.now() - 3600000) // \"1 hour ago\"\n *\n * // Future dates\n * formatRelativeTime(Date.now() + 86400000) // \"in 1 day\"\n *\n * // Edge cases\n * formatRelativeTime('') // \"Not scheduled\"\n * formatRelativeTime('invalid') // \"Invalid date\"\n * formatRelativeTime(Date.now()) // \"just now\"\n */\nexport function formatRelativeTime(timestamp: string | number): string {\n if (!timestamp) return 'Not scheduled';\n\n const date = new Date(timestamp);\n if (isNaN(date.getTime())) return 'Invalid date';\n\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffSecs = Math.floor(diffMs / 1000);\n const diffMins = Math.floor(diffSecs / 60);\n const diffHours = Math.floor(diffMins / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n // Future dates (next run times)\n if (diffMs < 0) {\n const absDiffSecs = Math.abs(diffSecs);\n const absDiffMins = Math.floor(absDiffSecs / 60);\n const absDiffHours = Math.floor(absDiffMins / 60);\n const absDiffDays = Math.floor(absDiffHours / 24);\n\n if (absDiffDays > 0) return `in ${absDiffDays} day${absDiffDays === 1 ? '' : 's'}`;\n if (absDiffHours > 0) return `in ${absDiffHours} hour${absDiffHours === 1 ? '' : 's'}`;\n if (absDiffMins > 0) return `in ${absDiffMins} minute${absDiffMins === 1 ? '' : 's'}`;\n return `in ${absDiffSecs} second${absDiffSecs === 1 ? '' : 's'}`;\n }\n\n // Past dates (completed times)\n if (diffDays > 0) return `${diffDays} day${diffDays === 1 ? '' : 's'} ago`;\n if (diffHours > 0) return `${diffHours} hour${diffHours === 1 ? '' : 's'} ago`;\n if (diffMins > 0) return `${diffMins} minute${diffMins === 1 ? '' : 's'} ago`;\n if (diffSecs > 0) return `${diffSecs} second${diffSecs === 1 ? '' : 's'}`;\n return 'just now';\n}\n","/**\n * Dynamic Icon Registry - UNIFIED\n *\n * Single source of truth for all dynamic icon rendering.\n * Icons are looked up by EXACT name from database (icon_name column).\n *\n * Registry-based approach: All icons explicitly imported and registered.\n * NO runtime namespace tricks - real imported components.\n */\n\nimport React from 'react';\n\n// UI Kit social platform icons\nimport {\n LinkedInIcon,\n FacebookIcon,\n InstagramIcon,\n YouTubeIcon,\n SlackIcon,\n XLogo,\n} from '../components/icons';\n\n// Lucide icons (commonly used for social platforms)\nimport {\n Globe,\n FileText,\n PenSquare,\n Github,\n MessageCircle,\n Send,\n Video,\n Twitter,\n} from 'lucide-react';\n\n// Type for icon size presets\nexport type DynamicIconSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n// Size class mapping (Tailwind)\nconst SIZE_CLASSES: Record<DynamicIconSize, string> = {\n xs: 'w-3 h-3', // 12px\n sm: 'w-4 h-4', // 16px\n md: 'w-6 h-6', // 24px\n lg: 'w-8 h-8', // 32px\n xl: 'w-12 h-12', // 48px\n};\n\n/**\n * Icon color configuration (optional overrides)\n */\nconst ICON_COLORS: Record<string, { color?: string; fill?: string }> = {\n LinkedInIcon: { color: '#0A66C2' },\n FacebookIcon: { color: '#1877F2' },\n YouTubeIcon: { color: '#FF0000' },\n OpenFrameLogo: { /* Uses component defaults */ },\n};\n\n/**\n * Icon Component Registry\n * Maps exact icon_name (from database) to imported React components\n */\nconst ICON_REGISTRY: Record<string, React.ComponentType<{ className?: string; color?: string }>> = {\n // UI Kit social platform icons (from @flamingo/ui-kit/components/icons)\n LinkedInIcon,\n FacebookIcon,\n InstagramIcon,\n YouTubeIcon,\n SlackIcon,\n XLogo,\n\n // Lucide icons (from lucide-react)\n Globe,\n FileText, // Blog Posts icon (internal-blogging)\n PenSquare, // Alternative blog icon\n Github, // GitHub platform\n MessageCircle, // Discord platform\n Send, // Telegram platform\n Video, // TikTok platform\n Twitter, // Twitter/X platform\n};\n\n/**\n * Get icon component dynamically by name\n *\n * @param iconName - Exact component name from database (e.g., 'LinkedInIcon', 'FileText')\n * @param size - Size preset (xs, sm, md, lg, xl)\n * @param className - Optional additional Tailwind classes\n * @returns React icon component or Globe fallback\n */\nexport function getDynamicIcon(\n iconName: string | undefined | null,\n size: DynamicIconSize = 'md',\n className?: string\n): React.ReactNode {\n\n if (!iconName) {\n console.warn('[getDynamicIcon] No iconName provided, using Globe fallback');\n return <Globe className={SIZE_CLASSES[size]} />;\n }\n\n const sizeClass = SIZE_CLASSES[size];\n const finalClassName = className ? `${sizeClass} ${className}` : sizeClass;\n\n // Lookup icon from registry\n const IconComponent = ICON_REGISTRY[iconName];\n\n if (IconComponent) {\n const colorConfig = ICON_COLORS[iconName] || {};\n return <IconComponent className={finalClassName} {...colorConfig} />;\n }\n\n // Fallback\n console.error(`[getDynamicIcon] Icon NOT found in registry: \"${iconName}\". Available icons:`, Object.keys(ICON_REGISTRY));\n return <Globe className={finalClassName} />;\n}\n\n/**\n * Get platform brand logo - delegates to existing ui-kit function\n * Re-exported here for unified icon API\n */\nexport { getPlatformIconComponent as getPlatformLogo } from './platform-config';\n","/**\n * Centralized Tool Types\n *\n * Single source of truth for all tool-related types across the entire platform.\n * Used by ToolBadge, ToolIcon, and any component that needs tool type information.\n */\n\nexport const ToolTypeValues = {\n TACTICAL_RMM: 'TACTICAL_RMM',\n FLEET_MDM: 'FLEET_MDM',\n MESHCENTRAL: 'MESHCENTRAL',\n AUTHENTIK: 'AUTHENTIK',\n OPENFRAME: 'OPENFRAME',\n OPENFRAME_CHAT: 'OPENFRAME_CHAT',\n OPENFRAME_CLIENT: 'OPENFRAME_CLIENT',\n OSQUERY: 'OSQUERY',\n SYSTEM: 'SYSTEM'\n} as const\n\nexport type ToolType = (typeof ToolTypeValues)[keyof typeof ToolTypeValues]\n\n/**\n * Maps tool types to display labels\n */\nexport const toolLabels: Record<ToolType, string> = {\n TACTICAL_RMM: 'Tactical',\n FLEET_MDM: 'Fleet',\n MESHCENTRAL: 'MeshCentral',\n AUTHENTIK: 'Authentik',\n OPENFRAME: 'OpenFrame',\n OPENFRAME_CHAT: 'OpenFrame Chat',\n OPENFRAME_CLIENT: 'OpenFrame Client',\n OSQUERY: 'Osquery',\n SYSTEM: 'System'\n}\n","/**\n * Tool Utilities\n *\n * Provides normalization and conversion utilities for tool types.\n * Handles various input formats (aliases, case variations) and converts\n * them to the canonical ToolType used throughout the platform.\n */\n\nimport { ToolType, toolLabels } from '../types/tool.types'\n\n/**\n * Map of common tool name variants to canonical ToolType\n */\nconst toolAliasMap: Record<string, ToolType> = {\n // Tactical RMM\n 'TACTICAL': 'TACTICAL_RMM',\n 'TACTICAL_RMM': 'TACTICAL_RMM',\n 'TACTICAL-RMM': 'TACTICAL_RMM',\n 'TACTICALRMM': 'TACTICAL_RMM',\n 'tactical': 'TACTICAL_RMM',\n 'tactical_rmm': 'TACTICAL_RMM',\n 'tactical-rmm': 'TACTICAL_RMM',\n 'tacticalrmm': 'TACTICAL_RMM',\n 'tacticalrmm-agent': 'TACTICAL_RMM',\n\n // Fleet MDM\n 'FLEET': 'FLEET_MDM',\n 'FLEET_MDM': 'FLEET_MDM',\n 'FLEET-MDM': 'FLEET_MDM',\n 'FLEETMDM': 'FLEET_MDM',\n 'fleet': 'FLEET_MDM',\n 'fleet_mdm': 'FLEET_MDM',\n 'fleet-mdm': 'FLEET_MDM',\n 'fleetmdm': 'FLEET_MDM',\n 'fleetmdm-agent': 'FLEET_MDM',\n\n // MeshCentral\n 'MESHCENTRAL': 'MESHCENTRAL',\n 'MESH': 'MESHCENTRAL',\n 'MESH_CENTRAL': 'MESHCENTRAL',\n 'MESH-CENTRAL': 'MESHCENTRAL',\n 'mesh': 'MESHCENTRAL',\n 'meshcentral': 'MESHCENTRAL',\n 'mesh_central': 'MESHCENTRAL',\n 'mesh-central': 'MESHCENTRAL',\n 'meshcentral-agent': 'MESHCENTRAL',\n\n // Authentik\n 'AUTHENTIK': 'AUTHENTIK',\n 'authentik': 'AUTHENTIK',\n\n // OpenFrame\n 'OPENFRAME': 'OPENFRAME',\n 'openframe': 'OPENFRAME',\n 'OPEN_FRAME': 'OPENFRAME',\n 'OPEN-FRAME': 'OPENFRAME',\n 'open_frame': 'OPENFRAME',\n 'open-frame': 'OPENFRAME',\n\n // OpenFrame Chat\n 'OPENFRAME_CHAT': 'OPENFRAME_CHAT',\n 'OPENFRAME-CHAT': 'OPENFRAME_CHAT',\n 'OPENFRAMECHAT': 'OPENFRAME_CHAT',\n 'openframe_chat': 'OPENFRAME_CHAT',\n 'openframe-chat': 'OPENFRAME_CHAT',\n 'openframechat': 'OPENFRAME_CHAT',\n\n // OpenFrame Client\n 'OPENFRAME_CLIENT': 'OPENFRAME_CLIENT',\n 'OPENFRAME-CLIENT': 'OPENFRAME_CLIENT',\n 'OPENFRAMECLIENT': 'OPENFRAME_CLIENT',\n 'openframe_client': 'OPENFRAME_CLIENT',\n 'openframe-client': 'OPENFRAME_CLIENT',\n 'openframeclient': 'OPENFRAME_CLIENT',\n\n // OSQUERY\n 'OSQUERY': 'OSQUERY',\n\n // System\n 'SYSTEM': 'SYSTEM',\n 'system': 'SYSTEM',\n}\n\n/**\n * Normalizes a tool name string to the canonical ToolType.\n * Handles various formats like 'tactical', 'TACTICAL_RMM', 'tactical-rmm', etc.\n *\n * @param input - The tool name string to normalize\n * @returns The canonical ToolType, or undefined if no match found\n *\n * @example\n * normalizeToolType('tactical') // => 'TACTICAL_RMM'\n * normalizeToolType('FLEET-MDM') // => 'FLEET_MDM'\n * normalizeToolType('unknown') // => undefined\n */\nexport function normalizeToolType(input?: string): ToolType | undefined {\n if (!input) return undefined\n\n // Try exact match first\n const exact = toolAliasMap[input]\n if (exact) return exact\n\n // Try uppercase\n const upper = input.toUpperCase()\n if (toolAliasMap[upper]) return toolAliasMap[upper]\n\n // Try lowercase\n const lower = input.toLowerCase()\n if (toolAliasMap[lower]) return toolAliasMap[lower]\n\n return undefined\n}\n\n/**\n * Normalizes a tool name string to the canonical ToolType with a fallback.\n * Returns 'SYSTEM' as the default if no match is found.\n *\n * @param input - The tool name string to normalize\n * @returns The canonical ToolType, defaults to 'SYSTEM' if no match\n *\n * @example\n * normalizeToolTypeWithFallback('tactical') // => 'TACTICAL_RMM'\n * normalizeToolTypeWithFallback('unknown') // => 'SYSTEM'\n */\nexport function normalizeToolTypeWithFallback(input?: string): ToolType {\n return normalizeToolType(input) ?? 'SYSTEM'\n}\n\n/**\n * Converts any tool name variant to its display label.\n * Handles normalization internally.\n *\n * @param input - The tool name string (any format)\n * @returns The display label, or the original input if no match\n *\n * @example\n * toToolLabel('tactical') // => 'Tactical'\n * toToolLabel('FLEET-MDM') // => 'Fleet'\n * toToolLabel('unknown') // => 'unknown'\n */\nexport function toToolLabel(input?: string): string {\n if (!input) return ''\n\n const toolType = normalizeToolType(input)\n if (toolType) {\n return toolLabels[toolType]\n }\n\n return input\n}\n\n/**\n * Checks if a string is a valid tool type (or can be normalized to one).\n *\n * @param input - The string to check\n * @returns True if the input can be normalized to a valid ToolType\n *\n * @example\n * isValidToolType('tactical') // => true\n * isValidToolType('FLEET_MDM') // => true\n * isValidToolType('unknown') // => false\n */\nexport function isValidToolType(input?: string): boolean {\n return normalizeToolType(input) !== undefined\n}\n\n/**\n * Gets all valid tool type aliases for a given canonical ToolType.\n * Useful for documentation or validation purposes.\n *\n * @param toolType - The canonical ToolType\n * @returns Array of all aliases that map to this tool type\n */\nexport function getToolTypeAliases(toolType: ToolType): string[] {\n return Object.entries(toolAliasMap)\n .filter(([_, value]) => value === toolType)\n .map(([key]) => key)\n}\n\n/**\n * Get display label for a tool type\n */\nexport function getToolLabel(toolType: ToolType): string {\n return toolLabels[toolType] || toolType\n}\n","import type { SVGProps } from \"react\";\nexport interface PowershellLogoIconProps\n extends Omit<SVGProps<SVGSVGElement>, \"width\" | \"height\"> {\n className?: string;\n size?: number;\n color?: string;\n}\nexport function PowershellLogoIcon({\n className = \"\",\n size = 24,\n color = \"currentColor\",\n ...props\n}: PowershellLogoIconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n className={className}\n {...props}\n >\n <path\n fill={color}\n fillRule=\"evenodd\"\n d=\"M10.274 19.708c-2.345 0-4.69.01-7.034-.005-1.19-.008-1.405-.286-1.138-1.442.908-3.919 1.844-7.83 2.732-11.754C5.07 5.455 5.584 4.99 6.719 5c4.69.043 9.379.014 14.068.019 1.176 0 1.374.25 1.11 1.436-.858 3.848-1.72 7.694-2.598 11.537-.328 1.438-.706 1.713-2.23 1.716-2.265.005-4.53.001-6.795 0\"\n clipRule=\"evenodd\"\n />\n <path\n fill=\"#212121\"\n fillRule=\"evenodd\"\n d=\"M12.269 12.029c-.157-.184-.33-.395-.513-.596-1.036-1.144-2.063-2.297-3.118-3.423C8.155 7.494 8 6.993 8.58 6.484c.573-.503 1.136-.458 1.661.12 1.464 1.612 2.925 3.225 4.413 4.815.556.593.426.997-.185 1.437a937 937 0 0 0-7.016 5.106c-.525.385-1.024.481-1.448-.087-.467-.626-.035-1 .45-1.35a764 764 0 0 0 5.186-3.782c.24-.177.584-.28.627-.714M13.012 18.09c-.632 0-1.264.02-1.894-.008-.502-.022-.805-.301-.798-.827.006-.497.258-.871.76-.885a90 90 0 0 1 4.142-.002c.438.009.762.293.76.747-.004.52-.28.925-.841.958-.708.043-1.42.01-2.13.01z\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n","import type { SVGProps } from \"react\";\nexport interface PythonLogoIconProps\n extends Omit<SVGProps<SVGSVGElement>, \"width\" | \"height\"> {\n className?: string;\n size?: number;\n color?: string;\n}\nexport function PythonLogoIcon({\n className = \"\",\n size = 24,\n color = \"currentColor\",\n ...props\n}: PythonLogoIconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n className={className}\n {...props}\n >\n <path\n fill={color}\n d=\"M11.966 2C7.244 2 7.193 3.833 7.193 4.21V6.5h4.864v.687H5.26C3.816 7.187 2 8.067 2 11.96c0 3.577 1.417 4.96 2.847 4.96h1.698v-2.386c0-.998.495-2.847 2.802-2.847h4.823c.71 0 2.71-.308 2.71-2.619V4.665C16.88 4.09 16.784 2 11.967 2M9.284 3.54a.874.874 0 1 1 0 1.75.874.874 0 1 1 0-1.75\"\n />\n <path\n fill={color}\n d=\"M12.034 22c4.72 0 4.778-1.867 4.778-2.21V17.5h-4.869v-.687h6.795c1.457 0 3.262-.901 3.262-4.773 0-4.24-1.916-4.96-2.847-4.96h-1.699v2.386c0 .998-.478 2.847-2.8 2.847H9.828c-.707 0-2.71.344-2.71 2.619v4.403c0 .951.581 2.665 4.915 2.665m2.682-1.54a.874.874 0 1 1-.002-1.748.874.874 0 0 1 .002 1.748\"\n />\n </svg>\n );\n}\n","/**\n * Centralized Shell Types\n *\n * Single source of truth for all shell/script type information across the platform.\n * Based on Tactical RMM supported shell types.\n */\nimport { PowershellLogoIcon } from '../components/icons-v2-generated/brand-logos/powershell-logo-icon'\nimport { PythonLogoIcon } from '../components/icons-v2-generated/brand-logos/python-logo-icon'\nimport {\n BashIcon,\n CmdIcon,\n DenoIcon,\n NushellIcon,\n ShellIcon\n} from '../components/icons'\nimport type { IconProps } from './icons'\n\n\n\nexport const ShellTypeValues = {\n POWERSHELL: 'POWERSHELL',\n CMD: 'CMD',\n BASH: 'BASH',\n PYTHON: 'PYTHON',\n NUSHELL: 'NUSHELL',\n DENO: 'DENO',\n SHELL: 'SHELL'\n} as const\n\nexport type ShellType = (typeof ShellTypeValues)[keyof typeof ShellTypeValues]\n\n/**\n * Shell type definition with all metadata\n */\nexport interface ShellTypeDefinition {\n id: ShellType\n label: string\n value: string\n icon: React.ComponentType<IconProps>\n}\n\n/**\n * Complete list of all shell types with icons and labels\n * SINGLE SOURCE OF TRUTH - Use this everywhere\n */\nexport const SHELL_TYPES: ShellTypeDefinition[] = [\n { id: ShellTypeValues.POWERSHELL, label: 'PowerShell', value: 'powershell', icon: PowershellLogoIcon },\n { id: ShellTypeValues.CMD, label: 'Batch', value: 'cmd', icon: CmdIcon },\n { id: ShellTypeValues.BASH, label: 'Bash', value: 'bash', icon: BashIcon },\n { id: ShellTypeValues.PYTHON, label: 'Python', value: 'python', icon: PythonLogoIcon },\n { id: ShellTypeValues.NUSHELL, label: 'Nu', value: 'nushell', icon: NushellIcon },\n { id: ShellTypeValues.DENO, label: 'Deno', value: 'deno', icon: DenoIcon },\n { id: ShellTypeValues.SHELL, label: 'Shell', value: 'shell', icon: ShellIcon },\n]\n\n/**\n * Maps shell types to display labels\n */\nexport const shellLabels: Record<ShellType, string> = {\n [ShellTypeValues.POWERSHELL]: 'PowerShell',\n [ShellTypeValues.CMD]: 'Batch',\n [ShellTypeValues.BASH]: 'Bash',\n [ShellTypeValues.PYTHON]: 'Python',\n [ShellTypeValues.NUSHELL]: 'Nu',\n [ShellTypeValues.DENO]: 'Deno',\n [ShellTypeValues.SHELL]: 'Shell'\n}\n","/**\n * Shell Type Utilities\n *\n * Helper functions for working with shell types.\n */\n\nimport React from 'react'\nimport { ShellType, SHELL_TYPES, shellLabels } from '../types/shell.types'\n\n/**\n * Get display label for a shell type\n */\nexport function getShellLabel(shellType?: string): string {\n if (!shellType) return 'Unknown'\n const normalized = shellType.toUpperCase() as ShellType\n return shellLabels[normalized] || shellType\n}\n\n/**\n * Get icon component for a shell type\n */\nexport function getShellIcon(shellType?: string): React.ComponentType<{ className?: string }> | undefined {\n if (!shellType) return undefined\n const normalized = shellType.toUpperCase() as ShellType\n const shellDef = SHELL_TYPES.find(s => s.id === normalized)\n return shellDef?.icon\n}\n","import type { SVGProps } from \"react\";\nexport interface AppleLogoIconProps\n extends Omit<SVGProps<SVGSVGElement>, \"width\" | \"height\"> {\n className?: string;\n size?: number;\n color?: string;\n}\nexport function AppleLogoIcon({\n className = \"\",\n size = 24,\n color = \"currentColor\",\n ...props\n}: AppleLogoIconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n className={className}\n {...props}\n >\n <path\n fill={color}\n d=\"M17.57 12.628c-.024-2.531 2.062-3.747 2.156-3.805-1.174-1.72-2.999-1.957-3.649-1.983-1.552-.16-3.03.917-3.82.917s-2.005-.895-3.293-.869c-1.694.024-3.257.987-4.13 2.507-1.758 3.054-.448 7.59 1.268 10.073.84 1.213 1.837 2.581 3.151 2.53 1.266-.05 1.743-.82 3.269-.82s1.957.82 3.293.796c1.36-.026 2.222-1.24 3.054-2.458.958-1.411 1.356-2.775 1.38-2.847-.032-.012-2.65-1.018-2.68-4.041Zm-2.51-7.434c.697-.846 1.167-2.021 1.039-3.194-1.004.041-2.22.67-2.94 1.518-.644.748-1.21 1.944-1.056 3.093 1.115.086 2.26-.572 2.956-1.417Z\"\n />\n </svg>\n );\n}\n","import type { SVGProps } from \"react\";\nexport interface LinuxLogoIconProps\n extends Omit<SVGProps<SVGSVGElement>, \"width\" | \"height\"> {\n className?: string;\n size?: number;\n color?: string;\n}\nexport function LinuxLogoIcon({\n className = \"\",\n size = 24,\n color = \"currentColor\",\n ...props\n}: LinuxLogoIconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n className={className}\n {...props}\n >\n <path\n fill={color}\n d=\"M19.567 18.314c-.528-.217-.963-.558-.931-1.213.03-.653-.467-1.086-.467-1.086s.435-1.43.031-2.612c-.403-1.183-1.737-3.078-2.76-4.507-1.023-1.43-.155-3.08-1.085-5.192-.932-2.113-3.351-1.99-4.654-1.087-1.304.9-.901 3.137-.84 4.196.062 1.056.028 1.808-.092 2.082-.123.273-.962 1.276-1.52 2.114-.559.84-.962 2.58-1.367 3.295-.403.715-.124 1.368-.124 1.368s-.28.092-.497.56c-.217.465-.65.683-1.427.837-.775.155-.775.655-.59 1.214.187.559.001.871-.216 1.585-.217.713.869.932 1.923 1.054 1.055.126 2.234.81 3.228.934.992.125 1.303-.683 1.303-.683s1.116-.25 2.294-.28c1.18-.031 2.295.249 2.295.249s.218.497.62.714c.405.218 1.273.25 1.832-.34.559-.592 2.048-1.337 2.885-1.804.84-.468.686-1.182.159-1.398M12.306 4.606c.532 0 .961.528.961 1.18 0 .463-.215.862-.53 1.056l-.254-.11c.19-.094.324-.335.324-.617 0-.367-.227-.666-.507-.666-.277 0-.505.3-.505.666a.8.8 0 0 0 .088.373 27 27 0 0 0-.437-.172 1.4 1.4 0 0 1-.102-.53c0-.652.43-1.18.962-1.18m-.07 2.488c.267.093.562.266.532.438-.032.172-.172.172-.531.393-.36.218-1.142.703-1.392.735-.251.031-.39-.11-.657-.281-.266-.173-.766-.582-.64-.8 0 0 .39-.298.561-.455s.61-.532.876-.483c.266.045.986.36 1.252.453ZM9.84 4.793c.42 0 .76.5.76 1.118q0 .168-.032.32a1 1 0 0 0-.307.177 4 4 0 0 0-.14.12.8.8 0 0 0 .063-.49c-.056-.337-.28-.583-.503-.547-.221.038-.355.341-.299.68.057.34.28.585.502.548l.038-.01a3 3 0 0 1-.31.27c-.307-.143-.532-.567-.532-1.07 0-.617.34-1.116.76-1.116M9.019 20.5c-.098.445-.62.77-.62.77-.471.148-1.784-.423-2.38-.673-.593-.247-2.106-.324-2.305-.544-.197-.226.099-.722.175-1.192.073-.474-.148-.77-.075-1.094.075-.322 1.042-.322 1.412-.545.373-.225.447-.87.745-1.044.297-.175.842.446 1.065.795.222.346 1.066 1.837 1.412 2.21.348.372.67.87.572 1.317Zm5.488-4.332c-.09.438-.09 2.021-.09 2.021s-.961 1.335-2.452 1.554c-1.49.219-2.234.061-2.234.061l-.838-.962s.65-.095.559-.747c-.094-.653-1.985-1.555-2.327-2.363-.34-.808-.062-2.177.373-2.86.434-.684.712-2.175 1.147-2.674.434-.495.774-1.553.62-2.02 0 0 .93 1.12 1.58.935.652-.188 2.112-1.276 2.328-1.089s2.078 4.29 2.263 5.595-.125 2.3-.125 2.3-.712-.187-.804.249m4.761 2.928c-.29.267-1.902.92-2.386 1.428-.48.505-1.109.916-1.493.796-.387-.122-.724-.652-.555-1.426.168-.771.314-1.617.29-2.1s-.122-1.137 0-1.233c.12-.094.312-.047.312-.047s-.095.916.458 1.16c.554.239 1.35-.097 1.59-.34.243-.24.412-.602.412-.602s.24.122.216.507c-.024.386.168.943.531 1.135.36.19.915.458.625.722\"\n />\n </svg>\n );\n}\n","import type { SVGProps } from \"react\";\nexport interface WindowsLogoIconProps\n extends Omit<SVGProps<SVGSVGElement>, \"width\" | \"height\"> {\n className?: string;\n size?: number;\n color?: string;\n}\nexport function WindowsLogoIcon({\n className = \"\",\n size = 24,\n color = \"currentColor\",\n ...props\n}: WindowsLogoIconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n className={className}\n {...props}\n >\n <path\n fill={color}\n d=\"m2 4.832 8.173-1.11.004 7.86-8.17.046zm8.17 7.655.006 7.867-8.17-1.12v-6.8zm.99-8.91L21.997 2v9.482l-10.837.085zM22 12.56 21.997 22 11.16 20.475l-.015-7.932z\"\n />\n </svg>\n );\n}\n","/**\n * Centralized OS Types\n *\n * Single source of truth for all operating system type information across the platform.\n * Handles normalization of OS values from various sources (Fleet MDM, Tactical RMM, GraphQL).\n */\n\nimport { AppleLogoIcon } from '../components/icons-v2-generated/brand-logos/apple-logo-icon'\nimport { LinuxLogoIcon } from '../components/icons-v2-generated/brand-logos/linux-logo-icon'\nimport { WindowsLogoIcon } from '../components/icons-v2-generated/brand-logos/windows-logo-icon'\nimport React from 'react'\nimport type { OSPlatformId } from '../utils/os-platforms'\n\nexport const OSTypeValues = {\n WINDOWS: 'WINDOWS',\n MACOS: 'MACOS',\n LINUX: 'LINUX'\n} as const\n\nexport type OSType = (typeof OSTypeValues)[keyof typeof OSTypeValues]\n\n/**\n * OS type definition with all metadata\n */\nexport interface OSTypeDefinition {\n id: OSType\n label: string\n value: string\n icon: React.ComponentType<any>\n platformId: OSPlatformId\n aliases: string[] // Alternative names/values that map to this OS\n}\n\n/**\n * Complete list of all OS types with icons and labels\n * SINGLE SOURCE OF TRUTH - Use this everywhere\n */\nexport const OS_TYPES: OSTypeDefinition[] = [\n {\n id: OSTypeValues.MACOS,\n label: 'macOS',\n value: OSTypeValues.MACOS,\n icon: AppleLogoIcon,\n platformId: 'darwin',\n aliases: ['darwin', 'macos', 'mac os', 'osx', 'os x', 'mac'] // Put more specific ones first, 'mac' last to avoid false matches\n },\n {\n id: OSTypeValues.WINDOWS,\n label: 'Windows',\n value: OSTypeValues.WINDOWS,\n icon: WindowsLogoIcon,\n platformId: 'windows',\n aliases: ['windows', 'win32', 'win64', 'win'] // 'win' last since it's shortest\n },\n {\n id: OSTypeValues.LINUX,\n label: 'Linux',\n value: OSTypeValues.LINUX,\n icon: LinuxLogoIcon,\n platformId: 'linux',\n aliases: ['linux', 'ubuntu', 'debian', 'centos', 'redhat', 'fedora', 'pop', 'pop!_os', 'arch', 'manjaro']\n }\n]\n\n/**\n * Maps OS types to display labels\n */\nexport const osLabels: Record<OSType, string> = {\n [OSTypeValues.WINDOWS]: 'Windows',\n [OSTypeValues.MACOS]: 'macOS',\n [OSTypeValues.LINUX]: 'Linux'\n}\n","/**\n * OS Type Utilities\n *\n * Helper functions for working with OS types.\n */\n\nimport React from 'react'\nimport type { OSPlatformId } from './os-platforms'\nimport { OSType, OSTypeDefinition, OS_TYPES, osLabels } from '../types/os.types'\n\n/**\n * Normalize OS type string to standard OSType enum\n * Handles case-insensitive matching and various OS name variations\n *\n * @param osType - Raw OS type string from API or device data\n * @returns Normalized OSType or undefined if not recognized\n *\n * @example\n * normalizeOSType('windows') // 'WINDOWS'\n * normalizeOSType('Darwin') // 'MACOS'\n * normalizeOSType('Ubuntu') // 'LINUX'\n */\nexport function normalizeOSType(osType?: string): OSType | undefined {\n if (!osType) return undefined\n\n const normalized = osType.toLowerCase().trim()\n\n // Check for exact matches first, then partial matches\n // This prevents \"win\" from matching \"darwin\"\n for (const osTypeDef of OS_TYPES) {\n // Check for exact word match first\n if (osTypeDef.aliases.some(alias => {\n // Exact match\n if (normalized === alias) return true\n // Word boundary match (e.g., \"mac\" in \"mac os\" but not in \"vmac\")\n const wordBoundaryRegex = new RegExp(`\\\\b${alias}\\\\b`, 'i')\n return wordBoundaryRegex.test(osType)\n })) {\n return osTypeDef.id\n }\n }\n\n // Fallback to partial matching for version strings like \"macOS 26.0.1\"\n for (const osTypeDef of OS_TYPES) {\n if (osTypeDef.aliases.some(alias => normalized.includes(alias))) {\n return osTypeDef.id\n }\n }\n\n return undefined\n}\n\n/**\n * Get display label for an OS type\n *\n * @param osType - OS type string (can be raw or normalized)\n * @returns Display label\n */\nexport function getOSLabel(osType?: string): string {\n if (!osType) return 'Unknown'\n\n const normalized = normalizeOSType(osType)\n return normalized ? osLabels[normalized] : osType\n}\n\n/**\n * Get icon component for an OS type\n *\n * @param osType - OS type string (can be raw or normalized)\n * @returns Icon component or undefined\n */\nexport function getOSIcon(osType?: string): React.ComponentType<any> | undefined {\n if (!osType) return undefined\n\n const normalized = normalizeOSType(osType)\n if (!normalized) return undefined\n\n const osTypeDef = OS_TYPES.find(t => t.id === normalized)\n return osTypeDef?.icon\n}\n\n/**\n * Get OS type definition by OS type string\n *\n * @param osType - OS type string (can be raw or normalized)\n * @returns Complete OS type definition or undefined\n */\nexport function getOSTypeDefinition(osType?: string): OSTypeDefinition | undefined {\n if (!osType) return undefined\n\n const normalized = normalizeOSType(osType)\n if (!normalized) return undefined\n\n return OS_TYPES.find(t => t.id === normalized)\n}\n\n/**\n * Get platform ID for an OS type (for cross-referencing with OS_PLATFORMS)\n *\n * @param osType - OS type string (can be raw or normalized)\n * @returns Platform ID or undefined\n */\nexport function getOSPlatformId(osType?: string): OSPlatformId | undefined {\n const osTypeDef = getOSTypeDefinition(osType)\n return osTypeDef?.platformId\n}\n\n/**\n * Check if device OS matches a specific platform\n *\n * @param deviceOS - Device OS string\n * @param targetPlatform - Target platform to check against\n * @returns True if OS matches platform\n *\n * @example\n * isOSPlatform('Darwin', 'darwin') // true\n * isOSPlatform('Windows 10', 'windows') // true\n * isOSPlatform('Ubuntu', 'linux') // true\n */\nexport function isOSPlatform(deviceOS?: string, targetPlatform?: OSPlatformId): boolean {\n if (!deviceOS || !targetPlatform) return false\n\n const platformId = getOSPlatformId(deviceOS)\n return platformId === targetPlatform\n}\n","import { getCountries, getCountryCallingCode, isValidPhoneNumber, parsePhoneNumber } from 'libphonenumber-js'\nimport type { CountryCode } from 'libphonenumber-js'\n\nexport interface CountryPhoneData {\n code: CountryCode\n name: string\n dialCode: string\n flag: string\n}\n\n/**\n * Priority country codes shown at the top of country selectors\n */\nconst PRIORITY_CODES: CountryCode[] = ['US', 'CA', 'GB', 'AU']\n\n/**\n * Convert ISO 3166-1 alpha-2 country code to flag emoji\n */\nfunction countryCodeToFlag(code: string): string {\n return code\n .toUpperCase()\n .split('')\n .map(char => String.fromCodePoint(0x1F1E6 + char.charCodeAt(0) - 65))\n .join('')\n}\n\n/**\n * Build country phone data from libphonenumber-js metadata + Intl.DisplayNames\n */\nfunction buildCountryData(): { priority: CountryPhoneData[]; others: CountryPhoneData[] } {\n const displayNames = new Intl.DisplayNames(['en'], { type: 'region' })\n const allCodes = getCountries()\n\n const toData = (code: CountryCode): CountryPhoneData => ({\n code,\n name: displayNames.of(code) || code,\n dialCode: `+${getCountryCallingCode(code)}`,\n flag: countryCodeToFlag(code),\n })\n\n const priority = PRIORITY_CODES.map(toData)\n\n const prioritySet = new Set(PRIORITY_CODES)\n const others = allCodes\n .filter(c => !prioritySet.has(c))\n .map(toData)\n .sort((a, b) => a.name.localeCompare(b.name))\n\n return { priority, others }\n}\n\nlet _cache: { priority: CountryPhoneData[]; others: CountryPhoneData[] } | null = null\n\n/**\n * Get all countries split into priority (US, CA, GB, AU) and the rest alphabetically\n */\nexport function getCountryPhoneData() {\n if (!_cache) {\n _cache = buildCountryData()\n }\n return _cache\n}\n\n/**\n * Find country data by ISO code\n */\nexport function getCountryByCode(code: CountryCode): CountryPhoneData | undefined {\n const { priority, others } = getCountryPhoneData()\n return priority.find(c => c.code === code) || others.find(c => c.code === code)\n}\n\n/**\n * Validate a phone number for a specific country using libphonenumber\n */\nexport function validatePhoneNumber(phoneNumber: string, countryCode: CountryCode): boolean {\n if (!phoneNumber.trim()) return true // optional field\n return isValidPhoneNumber(phoneNumber, countryCode)\n}\n\n/**\n * Format a phone number to E.164 format (e.g., +14155552671)\n */\nexport function formatPhoneE164(phoneNumber: string, countryCode: CountryCode): string {\n try {\n const parsed = parsePhoneNumber(phoneNumber, countryCode)\n if (parsed && parsed.isValid()) {\n return parsed.format('E.164')\n }\n } catch {\n // fall through to manual formatting\n }\n const dialCode = `+${getCountryCallingCode(countryCode)}`\n const digits = phoneNumber.replace(/\\D/g, '')\n return `${dialCode}${digits}`\n}\n","/**\n * Generic Domain Detection\n * Detects personal/generic email providers (gmail, yahoo, etc.)\n */\n\nexport const GENERIC_EMAIL_DOMAINS = [\n // Major providers\n 'gmail.com',\n 'yahoo.com',\n 'hotmail.com',\n 'outlook.com',\n 'live.com',\n 'msn.com',\n // Apple\n 'icloud.com',\n 'me.com',\n 'mac.com',\n // Other providers\n 'aol.com',\n 'protonmail.com',\n 'mail.com',\n 'yandex.com',\n 'zoho.com',\n 'gmx.com',\n 'fastmail.com',\n // ISP-based\n 'comcast.net',\n 'verizon.net',\n 'att.net',\n 'sbcglobal.net',\n 'bellsouth.net',\n 'cox.net',\n // International\n 'qq.com',\n '163.com',\n '126.com',\n 'web.de',\n 't-online.de',\n] as const\n\nexport type GenericEmailDomain = (typeof GENERIC_EMAIL_DOMAINS)[number]\n\nexport function extractDomainFromEmail(email: string): string | null {\n if (!email || !email.includes('@')) return null\n return email.split('@')[1]?.toLowerCase() || null\n}\n\nexport function normalizeDomain(domain: string): string {\n return (\n domain\n ?.toLowerCase()\n .replace(/^https?:\\/\\//, '')\n .replace(/^www\\./, '')\n .split('/')[0]\n .trim() || ''\n )\n}\n\nexport function isGenericDomain(domain: string): boolean {\n const normalized = normalizeDomain(domain)\n return GENERIC_EMAIL_DOMAINS.includes(normalized as GenericEmailDomain)\n}\n\nexport function hasGenericEmailDomain(email: string): boolean {\n const domain = extractDomainFromEmail(email)\n return domain ? isGenericDomain(domain) : false\n}\n\nexport function isGenericWebsiteDomain(website: string): boolean {\n return isGenericDomain(normalizeDomain(website))\n}\n"]}