@nice2dev/licensing 1.0.11 → 1.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/FeatureGate-9rvyns7j.cjs +1405 -0
- package/dist/FeatureGate-9rvyns7j.cjs.map +1 -0
- package/dist/FeatureGate-cIgJ8Gq2.js +1406 -0
- package/dist/FeatureGate-cIgJ8Gq2.js.map +1 -0
- package/dist/index.cjs +7 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +8 -6
- package/dist/index.mjs.map +1 -1
- package/dist/react.cjs +4 -4
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.ts +1 -1
- package/dist/react.mjs +4 -4
- package/dist/react.mjs.map +1 -1
- package/package.json +1 -1
package/dist/react.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react.mjs","sources":["../src/react.tsx"],"sourcesContent":["/* eslint-disable jsx-a11y/click-events-have-key-events -- modal overlay backdrops (Esc-on-parent provides keyboard close), selection rows in .map() accompanied by visible cursor:pointer styling and sibling buttons; full keyboard migration via useAccessibleClick + extracted subcomponents tracked in TODO_1.0.10 A2.3 */\r\n/* ────────────────────────────────────────────────────────────────\r\n License React Components — UI for license management\r\n──────────────────────────────────────────────────────────────── */\r\n\r\nimport React, {\r\n createContext,\r\n useContext,\r\n useState,\r\n useEffect,\r\n useCallback,\r\n type ReactNode,\r\n type CSSProperties,\r\n} from 'react';\r\n\r\nimport { hasFeature, checkFeatureAccess, getAllPlans, getMissingFeatures } from './FeatureGate';\r\nimport { maskLicenseKey, normalizeLicenseKey } from './LicenseKeyGenerator';\r\nimport { LicenseValidator } from './LicenseValidator';\r\nimport type {\r\n LicenseKey,\r\n LicenseInfo,\r\n LicenseValidationResult,\r\n LicenseState,\r\n FeatureId,\r\n LicensePlan,\r\n LicenseTier,\r\n} from './types';\r\n\r\n// ─── License Context ────────────────────────────────────────────\r\n\r\ninterface LicenseContextValue extends LicenseState {\r\n activate: (key: LicenseKey) => Promise<LicenseValidationResult>;\r\n deactivate: () => Promise<void>;\r\n refresh: () => Promise<void>;\r\n hasFeature: (featureId: FeatureId) => boolean;\r\n}\r\n\r\nconst LicenseContext = createContext<LicenseContextValue | null>(null);\r\n\r\n/**\r\n * License Provider Props\r\n */\r\nexport interface LicenseProviderProps {\r\n /** License server URL */\r\n serverUrl?: string;\r\n /** API key for server communication */\r\n apiKey?: string;\r\n /** Initial license key (from storage) */\r\n initialKey?: LicenseKey;\r\n /** Storage key for persisting license */\r\n storageKey?: string;\r\n /** Auto-validate on mount */\r\n autoValidate?: boolean;\r\n /** Validation interval in ms (0 to disable) */\r\n validationInterval?: number;\r\n /** On license change callback */\r\n onLicenseChange?: (license: LicenseInfo | null) => void;\r\n children: ReactNode;\r\n}\r\n\r\n/**\r\n * License Provider Component\r\n */\r\nexport function LicenseProvider({\r\n serverUrl = 'https://license.nice2dev.com/api/v1',\r\n apiKey,\r\n initialKey,\r\n storageKey = 'nice2dev_license_key',\r\n autoValidate = true,\r\n validationInterval = 3600000, // 1 hour\r\n onLicenseChange,\r\n children,\r\n}: LicenseProviderProps) {\r\n const [state, setState] = useState<LicenseState>({\r\n license: null,\r\n validation: null,\r\n loading: true,\r\n error: null,\r\n features: new Set(),\r\n fingerprint: null,\r\n });\r\n\r\n const [validator] = useState(() => new LicenseValidator({ serverUrl, apiKey }));\r\n\r\n // Load license key from storage\r\n const loadStoredKey = useCallback((): LicenseKey | null => {\r\n if (typeof localStorage === 'undefined') {\r\n return null;\r\n }\r\n try {\r\n return localStorage.getItem(storageKey);\r\n } catch {\r\n return null;\r\n }\r\n }, [storageKey]);\r\n\r\n // Save license key to storage\r\n const saveKey = useCallback(\r\n (key: LicenseKey | null) => {\r\n if (typeof localStorage === 'undefined') {\r\n return;\r\n }\r\n try {\r\n if (key) {\r\n localStorage.setItem(storageKey, key);\r\n } else {\r\n localStorage.removeItem(storageKey);\r\n }\r\n } catch {\r\n // Storage not available\r\n }\r\n },\r\n [storageKey],\r\n );\r\n\r\n // Validate license\r\n const validateLicense = useCallback(\r\n async (key: LicenseKey): Promise<LicenseValidationResult> => {\r\n setState((s) => ({ ...s, loading: true, error: null }));\r\n\r\n try {\r\n const result = await validator.validate(key);\r\n\r\n setState((s) => ({\r\n ...s,\r\n license: result.license || null,\r\n validation: result,\r\n loading: false,\r\n error: result.valid ? null : result.errorMessage || 'Validation failed',\r\n features: new Set(result.availableFeatures || []),\r\n }));\r\n\r\n if (result.valid && result.license) {\r\n onLicenseChange?.(result.license);\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\r\n setState((s) => ({\r\n ...s,\r\n loading: false,\r\n error: errorMessage,\r\n validation: {\r\n valid: false,\r\n errorCode: 'SERVER_ERROR',\r\n errorMessage,\r\n validatedAt: new Date().toISOString(),\r\n },\r\n }));\r\n\r\n return {\r\n valid: false,\r\n errorCode: 'SERVER_ERROR',\r\n errorMessage,\r\n validatedAt: new Date().toISOString(),\r\n };\r\n }\r\n },\r\n [validator, onLicenseChange],\r\n );\r\n\r\n // Activate license\r\n const activate = useCallback(\r\n async (key: LicenseKey): Promise<LicenseValidationResult> => {\r\n const normalized = normalizeLicenseKey(key);\r\n if (!normalized) {\r\n const result: LicenseValidationResult = {\r\n valid: false,\r\n errorCode: 'INVALID_KEY',\r\n errorMessage: 'Invalid license key format',\r\n validatedAt: new Date().toISOString(),\r\n };\r\n setState((s) => ({ ...s, error: result.errorMessage || null, validation: result }));\r\n return result;\r\n }\r\n\r\n const result = await validateLicense(normalized);\r\n\r\n if (result.valid) {\r\n saveKey(normalized);\r\n }\r\n\r\n return result;\r\n },\r\n [validateLicense, saveKey],\r\n );\r\n\r\n // Deactivate license\r\n const deactivate = useCallback(async () => {\r\n const key = loadStoredKey();\r\n if (key) {\r\n await validator.deactivateMachine(key);\r\n }\r\n\r\n saveKey(null);\r\n setState({\r\n license: null,\r\n validation: null,\r\n loading: false,\r\n error: null,\r\n features: new Set(),\r\n fingerprint: null,\r\n });\r\n onLicenseChange?.(null);\r\n }, [validator, loadStoredKey, saveKey, onLicenseChange]);\r\n\r\n // Refresh validation\r\n const refresh = useCallback(async () => {\r\n const key = state.license?.key || loadStoredKey();\r\n if (key) {\r\n await validateLicense(key);\r\n }\r\n }, [state.license?.key, loadStoredKey, validateLicense]);\r\n\r\n // Check feature\r\n const checkFeature = useCallback(\r\n (featureId: FeatureId): boolean => {\r\n return hasFeature(state.license, featureId);\r\n },\r\n [state.license],\r\n );\r\n\r\n // Initial validation\r\n useEffect(() => {\r\n if (!autoValidate) {\r\n setState((s) => ({ ...s, loading: false }));\r\n return;\r\n }\r\n\r\n const key = initialKey || loadStoredKey();\r\n if (key) {\r\n validateLicense(key);\r\n } else {\r\n setState((s) => ({ ...s, loading: false }));\r\n }\r\n }, [autoValidate, initialKey, loadStoredKey, validateLicense]);\r\n\r\n // Periodic validation\r\n useEffect(() => {\r\n if (validationInterval <= 0 || !state.license) {\r\n return;\r\n }\r\n\r\n const interval = setInterval(() => {\r\n refresh();\r\n }, validationInterval);\r\n\r\n return () => clearInterval(interval);\r\n }, [validationInterval, state.license, refresh]);\r\n\r\n const value: LicenseContextValue = {\r\n ...state,\r\n activate,\r\n deactivate,\r\n refresh,\r\n hasFeature: checkFeature,\r\n };\r\n\r\n return <LicenseContext.Provider value={value}>{children}</LicenseContext.Provider>;\r\n}\r\n\r\n/**\r\n * Hook to access license context\r\n */\r\nexport function useLicense(): LicenseContextValue {\r\n const context = useContext(LicenseContext);\r\n if (!context) {\r\n throw new Error('useLicense must be used within a LicenseProvider');\r\n }\r\n return context;\r\n}\r\n\r\n/**\r\n * Hook to check a specific feature\r\n */\r\nexport function useFeature(featureId: FeatureId): {\r\n allowed: boolean;\r\n loading: boolean;\r\n error: string | null;\r\n} {\r\n const { license, loading, error } = useLicense();\r\n const allowed = hasFeature(license, featureId);\r\n return { allowed, loading, error };\r\n}\r\n\r\n// ─── Feature Gate Component ─────────────────────────────────────\r\n\r\nexport interface FeatureGateProps {\r\n /** Feature ID to check */\r\n feature: FeatureId;\r\n /** Content to show when feature is allowed */\r\n children: ReactNode;\r\n /** Content to show when feature is not allowed */\r\n fallback?: ReactNode;\r\n /** Show upgrade prompt instead of fallback */\r\n showUpgradePrompt?: boolean;\r\n /** Custom upgrade prompt render */\r\n renderUpgradePrompt?: (targetTier: LicenseTier) => ReactNode;\r\n}\r\n\r\n/**\r\n * Feature Gate Component — conditionally render based on license\r\n */\r\nexport function FeatureGate({\r\n feature,\r\n children,\r\n fallback = null,\r\n showUpgradePrompt = false,\r\n renderUpgradePrompt,\r\n}: FeatureGateProps) {\r\n const { license, loading } = useLicense();\r\n\r\n if (loading) {\r\n return null; // Or a loading skeleton\r\n }\r\n\r\n const result = checkFeatureAccess(license, feature);\r\n\r\n if (result.allowed) {\r\n return <>{children}</>;\r\n }\r\n\r\n if (showUpgradePrompt && result.upgradeTarget) {\r\n if (renderUpgradePrompt) {\r\n return <>{renderUpgradePrompt(result.upgradeTarget)}</>;\r\n }\r\n return <UpgradePrompt targetTier={result.upgradeTarget} feature={feature} />;\r\n }\r\n\r\n return <>{fallback}</>;\r\n}\r\n\r\n// ─── License Status Widget ──────────────────────────────────────\r\n\r\nexport interface LicenseStatusProps {\r\n /** Show detailed info */\r\n detailed?: boolean;\r\n /** Custom styles */\r\n style?: CSSProperties;\r\n /** Custom class name */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * License Status Widget\r\n */\r\nexport function LicenseStatus({ detailed = false, style, className }: LicenseStatusProps) {\r\n const { license, validation, loading, error } = useLicense();\r\n\r\n const baseStyle: CSSProperties = {\r\n padding: '8px 12px',\r\n borderRadius: '6px',\r\n fontSize: '14px',\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: '8px',\r\n ...style,\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div\r\n style={{ ...baseStyle, backgroundColor: '#f0f0f0', color: '#666' }}\r\n className={className}\r\n >\r\n <span>⏳</span>\r\n <span>Checking license...</span>\r\n </div>\r\n );\r\n }\r\n\r\n if (error || !license) {\r\n return (\r\n <div\r\n style={{ ...baseStyle, backgroundColor: '#fee2e2', color: '#991b1b' }}\r\n className={className}\r\n >\r\n <span>⚠️</span>\r\n <span>{error || 'No license'}</span>\r\n </div>\r\n );\r\n }\r\n\r\n const tierColors: Record<LicenseTier, string> = {\r\n trial: '#fef3c7',\r\n personal: '#dbeafe',\r\n team: '#d1fae5',\r\n enterprise: '#ede9fe',\r\n site: '#fce7f3',\r\n oem: '#f3e8ff',\r\n };\r\n\r\n const tierTextColors: Record<LicenseTier, string> = {\r\n trial: '#92400e',\r\n personal: '#1e40af',\r\n team: '#065f46',\r\n enterprise: '#5b21b6',\r\n site: '#9d174d',\r\n oem: '#7c3aed',\r\n };\r\n\r\n const bgColor = tierColors[license.tier] || '#f0f0f0';\r\n const textColor = tierTextColors[license.tier] || '#333';\r\n\r\n return (\r\n <div style={{ ...baseStyle, backgroundColor: bgColor, color: textColor }} className={className}>\r\n <span>✓</span>\r\n <span style={{ fontWeight: 600 }}>\r\n {license.tier.charAt(0).toUpperCase() + license.tier.slice(1)}\r\n </span>\r\n {validation?.inGracePeriod && (\r\n <span style={{ color: '#dc2626', fontSize: '12px' }}>(Grace period)</span>\r\n )}\r\n {detailed && validation?.daysRemaining !== undefined && validation.daysRemaining > 0 && (\r\n <span style={{ fontSize: '12px', opacity: 0.8 }}>\r\n {validation.daysRemaining} days remaining\r\n </span>\r\n )}\r\n {detailed && (\r\n <span style={{ fontSize: '12px', opacity: 0.6 }}>{maskLicenseKey(license.key)}</span>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── License Activator ──────────────────────────────────────────\r\n\r\nexport interface LicenseActivatorProps {\r\n /** On successful activation */\r\n onActivated?: (license: LicenseInfo) => void;\r\n /** On activation error */\r\n onError?: (error: string) => void;\r\n /** Custom styles */\r\n style?: CSSProperties;\r\n /** Custom class name */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * License Activator Form\r\n */\r\nexport function LicenseActivator({\r\n onActivated,\r\n onError,\r\n style,\r\n className,\r\n}: LicenseActivatorProps) {\r\n const { activate, loading } = useLicense();\r\n const [key, setKey] = useState('');\r\n const [localError, setLocalError] = useState<string | null>(null);\r\n const [isActivating, setIsActivating] = useState(false);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!key.trim() || isActivating) {\r\n return;\r\n }\r\n\r\n setIsActivating(true);\r\n setLocalError(null);\r\n\r\n try {\r\n const result = await activate(key.trim());\r\n\r\n if (result.valid && result.license) {\r\n setKey('');\r\n onActivated?.(result.license);\r\n } else {\r\n setLocalError(result.errorMessage || 'Activation failed');\r\n onError?.(result.errorMessage || 'Activation failed');\r\n }\r\n } finally {\r\n setIsActivating(false);\r\n }\r\n };\r\n\r\n const containerStyle: CSSProperties = {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: '12px',\r\n padding: '16px',\r\n border: '1px solid #e5e7eb',\r\n borderRadius: '8px',\r\n backgroundColor: '#fff',\r\n ...style,\r\n };\r\n\r\n const inputStyle: CSSProperties = {\r\n padding: '10px 12px',\r\n fontSize: '14px',\r\n fontFamily: 'monospace',\r\n border: '1px solid #d1d5db',\r\n borderRadius: '6px',\r\n outline: 'none',\r\n textTransform: 'uppercase',\r\n };\r\n\r\n const buttonStyle: CSSProperties = {\r\n padding: '10px 16px',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n color: '#fff',\r\n backgroundColor: isActivating || loading ? '#9ca3af' : '#2563eb',\r\n border: 'none',\r\n borderRadius: '6px',\r\n cursor: isActivating || loading ? 'not-allowed' : 'pointer',\r\n };\r\n\r\n return (\r\n <form onSubmit={handleSubmit} style={containerStyle} className={className}>\r\n <label style={{ fontWeight: 500, color: '#374151' }}>Enter License Key</label>\r\n <input\r\n type=\"text\"\r\n value={key}\r\n onChange={(e) => setKey(e.target.value)}\r\n placeholder=\"XXXX-XXXX-XXXX-XXXX-XXXX\"\r\n style={inputStyle}\r\n disabled={isActivating || loading}\r\n />\r\n {localError && <div style={{ color: '#dc2626', fontSize: '13px' }}>{localError}</div>}\r\n <button type=\"submit\" style={buttonStyle} disabled={isActivating || loading || !key.trim()}>\r\n {isActivating ? 'Activating...' : 'Activate License'}\r\n </button>\r\n </form>\r\n );\r\n}\r\n\r\n// ─── Upgrade Prompt ─────────────────────────────────────────────\r\n\r\nexport interface UpgradePromptProps {\r\n /** Target tier for upgrade */\r\n targetTier: LicenseTier;\r\n /** Feature that triggered the prompt */\r\n feature?: FeatureId;\r\n /** On upgrade click */\r\n onUpgrade?: (tier: LicenseTier) => void;\r\n /** Custom styles */\r\n style?: CSSProperties;\r\n /** Compact mode */\r\n compact?: boolean;\r\n}\r\n\r\n/**\r\n * Upgrade Prompt Component\r\n */\r\nexport function UpgradePrompt({\r\n targetTier,\r\n feature,\r\n onUpgrade,\r\n style,\r\n compact = false,\r\n}: UpgradePromptProps) {\r\n const { license } = useLicense();\r\n const missingFeatures = getMissingFeatures(license, targetTier);\r\n\r\n const handleUpgrade = () => {\r\n onUpgrade?.(targetTier);\r\n // Default: open upgrade page\r\n if (!onUpgrade) {\r\n window.open(`https://nice2dev.com/pricing?upgrade=${targetTier}`, '_blank');\r\n }\r\n };\r\n\r\n const containerStyle: CSSProperties = {\r\n padding: compact ? '12px' : '20px',\r\n backgroundColor: '#eff6ff',\r\n borderRadius: '8px',\r\n border: '1px solid #bfdbfe',\r\n ...style,\r\n };\r\n\r\n const titleStyle: CSSProperties = {\r\n fontSize: compact ? '14px' : '16px',\r\n fontWeight: 600,\r\n color: '#1e40af',\r\n marginBottom: '8px',\r\n };\r\n\r\n const buttonStyle: CSSProperties = {\r\n padding: '8px 16px',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n color: '#fff',\r\n backgroundColor: '#2563eb',\r\n border: 'none',\r\n borderRadius: '6px',\r\n cursor: 'pointer',\r\n marginTop: '12px',\r\n };\r\n\r\n return (\r\n <div style={containerStyle}>\r\n <div style={titleStyle}>\r\n 🚀 Upgrade to {targetTier.charAt(0).toUpperCase() + targetTier.slice(1)}\r\n </div>\r\n {!compact && missingFeatures.length > 0 && (\r\n <ul style={{ margin: '8px 0', paddingLeft: '20px', color: '#374151', fontSize: '14px' }}>\r\n {missingFeatures.slice(0, 3).map((f) => (\r\n <li key={f.id}>{f.name}</li>\r\n ))}\r\n {missingFeatures.length > 3 && <li>+{missingFeatures.length - 3} more features</li>}\r\n </ul>\r\n )}\r\n <button onClick={handleUpgrade} style={buttonStyle}>\r\n Upgrade Now\r\n </button>\r\n </div>\r\n );\r\n}\r\n\r\n// ─── License Comparison ─────────────────────────────────────────\r\n\r\nexport interface LicenseComparisonProps {\r\n /** Plans to show (default: all) */\r\n plans?: LicensePlan[];\r\n /** Current tier for highlighting */\r\n currentTier?: LicenseTier;\r\n /** On plan select */\r\n onSelect?: (plan: LicensePlan) => void;\r\n /** Show prices */\r\n showPrices?: boolean;\r\n}\r\n\r\n/**\r\n * License Comparison Table\r\n */\r\nexport function LicenseComparison({\r\n plans: customPlans,\r\n currentTier,\r\n onSelect,\r\n showPrices = true,\r\n}: LicenseComparisonProps) {\r\n const { license } = useLicense();\r\n const tier = currentTier || license?.tier;\r\n const plans = customPlans || getAllPlans().filter((p) => p.priceMonthly > 0 || p.id === 'trial');\r\n\r\n const formatPrice = (cents: number) => {\r\n if (cents === 0) {\r\n return 'Free';\r\n }\r\n return `$${(cents / 100).toFixed(0)}`;\r\n };\r\n\r\n return (\r\n <div style={{ display: 'flex', gap: '16px', flexWrap: 'wrap', justifyContent: 'center' }}>\r\n {plans.map((plan) => {\r\n const isCurrent = plan.id === tier;\r\n const isRecommended = plan.recommended;\r\n\r\n return (\r\n <div\r\n key={plan.id}\r\n style={{\r\n flex: '1 1 250px',\r\n maxWidth: '300px',\r\n padding: '24px',\r\n borderRadius: '12px',\r\n border: isRecommended ? '2px solid #2563eb' : '1px solid #e5e7eb',\r\n backgroundColor: isCurrent ? '#f0f9ff' : '#fff',\r\n position: 'relative',\r\n }}\r\n >\r\n {isRecommended && (\r\n <div\r\n style={{\r\n position: 'absolute',\r\n top: '-12px',\r\n left: '50%',\r\n transform: 'translateX(-50%)',\r\n backgroundColor: '#2563eb',\r\n color: '#fff',\r\n padding: '4px 12px',\r\n borderRadius: '12px',\r\n fontSize: '12px',\r\n fontWeight: 600,\r\n }}\r\n >\r\n Recommended\r\n </div>\r\n )}\r\n\r\n <h3 style={{ margin: '0 0 4px', fontSize: '20px', color: '#111' }}>{plan.name}</h3>\r\n <p style={{ margin: '0 0 16px', fontSize: '14px', color: '#6b7280' }}>\r\n {plan.description}\r\n </p>\r\n\r\n {showPrices && (\r\n <div style={{ marginBottom: '16px' }}>\r\n <span style={{ fontSize: '32px', fontWeight: 700, color: '#111' }}>\r\n {formatPrice(plan.priceMonthly)}\r\n </span>\r\n {plan.priceMonthly > 0 && (\r\n <span style={{ fontSize: '14px', color: '#6b7280' }}>/month</span>\r\n )}\r\n </div>\r\n )}\r\n\r\n <ul style={{ listStyle: 'none', padding: 0, margin: '0 0 16px' }}>\r\n {plan.highlights.map((h, i) => (\r\n <li key={i} style={{ padding: '6px 0', fontSize: '14px', color: '#374151' }}>\r\n ✓ {h}\r\n </li>\r\n ))}\r\n </ul>\r\n\r\n <button\r\n onClick={() => onSelect?.(plan)}\r\n disabled={isCurrent}\r\n style={{\r\n width: '100%',\r\n padding: '10px',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n color: isCurrent ? '#9ca3af' : isRecommended ? '#fff' : '#2563eb',\r\n backgroundColor: isCurrent ? '#f3f4f6' : isRecommended ? '#2563eb' : '#fff',\r\n border: isCurrent ? 'none' : isRecommended ? 'none' : '1px solid #2563eb',\r\n borderRadius: '6px',\r\n cursor: isCurrent ? 'default' : 'pointer',\r\n }}\r\n >\r\n {isCurrent ? 'Current Plan' : 'Select'}\r\n </button>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── Trial Watermark ────────────────────────────────────────────\r\n\r\nexport interface TrialWatermarkProps {\r\n /** Position */\r\n position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\r\n /** Custom text */\r\n text?: string;\r\n}\r\n\r\n/**\r\n * Trial Watermark — shows for trial licenses\r\n */\r\nexport function TrialWatermark({\r\n position = 'bottom-right',\r\n text = 'Trial Version',\r\n}: TrialWatermarkProps) {\r\n const { license, hasFeature } = useLicense();\r\n\r\n // Only show for trial or if feature is enabled\r\n if (!hasFeature('trial-watermark') && license?.tier !== 'trial') {\r\n return null;\r\n }\r\n\r\n const positions: Record<string, CSSProperties> = {\r\n 'top-left': { top: '16px', left: '16px' },\r\n 'top-right': { top: '16px', right: '16px' },\r\n 'bottom-left': { bottom: '16px', left: '16px' },\r\n 'bottom-right': { bottom: '16px', right: '16px' },\r\n };\r\n\r\n return (\r\n <div\r\n style={{\r\n position: 'fixed',\r\n ...positions[position],\r\n padding: '8px 16px',\r\n backgroundColor: 'rgba(0, 0, 0, 0.8)',\r\n color: '#fff',\r\n fontSize: '12px',\r\n fontWeight: 600,\r\n borderRadius: '4px',\r\n zIndex: 9999,\r\n pointerEvents: 'none',\r\n }}\r\n >\r\n {text}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── License Portal ─────────────────────────────────────────────\r\n\r\n/** License Portal tab identifier */\r\nexport type LicensePortalTab = 'overview' | 'activation' | 'seats' | 'features' | 'plans';\r\n\r\nexport interface LicensePortalProps {\r\n /** Tabs to display (default: all) */\r\n tabs?: LicensePortalTab[];\r\n /** Default active tab */\r\n defaultTab?: LicensePortalTab;\r\n /** On plan upgrade click */\r\n onUpgrade?: (tier: LicenseTier) => void;\r\n /** On deactivation */\r\n onDeactivate?: () => void;\r\n /** Custom styles */\r\n style?: CSSProperties;\r\n /** Custom class name */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * License Portal — self-service dashboard for customers to manage\r\n * their license (activation, seat overview, feature list, plan comparison).\r\n */\r\nexport function LicensePortal({\r\n tabs = ['overview', 'activation', 'seats', 'features', 'plans'],\r\n defaultTab = 'overview',\r\n onUpgrade,\r\n onDeactivate,\r\n style,\r\n className,\r\n}: LicensePortalProps) {\r\n const {\r\n license,\r\n validation,\r\n loading,\r\n error,\r\n deactivate,\r\n refresh,\r\n hasFeature: checkFeat,\r\n } = useLicense();\r\n const [activeTab, setActiveTab] = useState<LicensePortalTab>(defaultTab);\r\n const [refreshing, setRefreshing] = useState(false);\r\n\r\n const handleRefresh = async () => {\r\n setRefreshing(true);\r\n try {\r\n await refresh();\r\n } finally {\r\n setRefreshing(false);\r\n }\r\n };\r\n\r\n const handleDeactivate = async () => {\r\n await deactivate();\r\n onDeactivate?.();\r\n };\r\n\r\n const tabLabels: Record<LicensePortalTab, string> = {\r\n overview: 'Overview',\r\n activation: 'Activation',\r\n seats: 'Seats',\r\n features: 'Features',\r\n plans: 'Plans',\r\n };\r\n\r\n const containerStyle: CSSProperties = {\r\n border: '1px solid #e5e7eb',\r\n borderRadius: '12px',\r\n backgroundColor: '#fff',\r\n overflow: 'hidden',\r\n ...style,\r\n };\r\n\r\n const tabBarStyle: CSSProperties = {\r\n display: 'flex',\r\n borderBottom: '1px solid #e5e7eb',\r\n backgroundColor: '#f9fafb',\r\n };\r\n\r\n const getTabStyle = (tab: LicensePortalTab): CSSProperties => ({\r\n padding: '12px 20px',\r\n fontSize: '14px',\r\n fontWeight: activeTab === tab ? 600 : 400,\r\n color: activeTab === tab ? '#2563eb' : '#6b7280',\r\n backgroundColor: 'transparent',\r\n border: 'none',\r\n borderBottom: activeTab === tab ? '2px solid #2563eb' : '2px solid transparent',\r\n cursor: 'pointer',\r\n });\r\n\r\n const panelStyle: CSSProperties = { padding: '24px' };\r\n\r\n return (\r\n <div style={containerStyle} className={className}>\r\n {/* Tab bar */}\r\n <div style={tabBarStyle}>\r\n {tabs.map((tab) => (\r\n <button key={tab} style={getTabStyle(tab)} onClick={() => setActiveTab(tab)}>\r\n {tabLabels[tab]}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Tab panels */}\r\n <div style={panelStyle}>\r\n {loading && <p style={{ color: '#6b7280' }}>Loading license information...</p>}\r\n\r\n {!loading && activeTab === 'overview' && (\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: '16px' }}>\r\n <LicenseStatus detailed />\r\n {license && (\r\n <>\r\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '12px' }}>\r\n <div>\r\n <span style={{ fontSize: '12px', color: '#6b7280' }}>Licensee</span>\r\n <p style={{ margin: '2px 0 0', fontWeight: 500 }}>{license.licensee}</p>\r\n </div>\r\n <div>\r\n <span style={{ fontSize: '12px', color: '#6b7280' }}>Email</span>\r\n <p style={{ margin: '2px 0 0', fontWeight: 500 }}>{license.email}</p>\r\n </div>\r\n <div>\r\n <span style={{ fontSize: '12px', color: '#6b7280' }}>Seats</span>\r\n <p style={{ margin: '2px 0 0', fontWeight: 500 }}>\r\n {license.activeSeats} / {license.maxSeats ?? '∞'}\r\n </p>\r\n </div>\r\n <div>\r\n <span style={{ fontSize: '12px', color: '#6b7280' }}>Expires</span>\r\n <p style={{ margin: '2px 0 0', fontWeight: 500 }}>\r\n {license.expiresAt\r\n ? new Date(license.expiresAt).toLocaleDateString()\r\n : 'Perpetual'}\r\n </p>\r\n </div>\r\n </div>\r\n <div style={{ display: 'flex', gap: '8px' }}>\r\n <button\r\n onClick={handleRefresh}\r\n disabled={refreshing}\r\n style={{\r\n padding: '8px 16px',\r\n fontSize: '13px',\r\n border: '1px solid #d1d5db',\r\n borderRadius: '6px',\r\n backgroundColor: '#fff',\r\n cursor: refreshing ? 'not-allowed' : 'pointer',\r\n }}\r\n >\r\n {refreshing ? 'Refreshing...' : 'Refresh'}\r\n </button>\r\n <button\r\n onClick={handleDeactivate}\r\n style={{\r\n padding: '8px 16px',\r\n fontSize: '13px',\r\n color: '#dc2626',\r\n border: '1px solid #fecaca',\r\n borderRadius: '6px',\r\n backgroundColor: '#fff',\r\n cursor: 'pointer',\r\n }}\r\n >\r\n Deactivate\r\n </button>\r\n </div>\r\n </>\r\n )}\r\n {!license && !error && (\r\n <p style={{ color: '#6b7280' }}>\r\n No active license. Go to the Activation tab to enter your license key.\r\n </p>\r\n )}\r\n {error && <p style={{ color: '#dc2626' }}>{error}</p>}\r\n </div>\r\n )}\r\n\r\n {!loading && activeTab === 'activation' && (\r\n <LicenseActivator onActivated={() => setActiveTab('overview')} />\r\n )}\r\n\r\n {!loading && activeTab === 'seats' && (\r\n <div>\r\n {license ? (\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: '12px' }}>\r\n <div style={{ fontSize: '14px', color: '#374151' }}>\r\n <strong>{license.activeSeats}</strong> of{' '}\r\n <strong>{license.maxSeats ?? '∞'}</strong> seats in use\r\n {license.floatingSeats != null && (\r\n <span> ({license.floatingSeats} floating)</span>\r\n )}\r\n </div>\r\n <div\r\n style={{\r\n height: '8px',\r\n borderRadius: '4px',\r\n backgroundColor: '#e5e7eb',\r\n overflow: 'hidden',\r\n }}\r\n >\r\n <div\r\n style={{\r\n height: '100%',\r\n width: license.maxSeats\r\n ? `${Math.min(100, (license.activeSeats / license.maxSeats) * 100)}%`\r\n : '10%',\r\n backgroundColor:\r\n license.maxSeats && license.activeSeats / license.maxSeats > 0.9\r\n ? '#dc2626'\r\n : '#2563eb',\r\n borderRadius: '4px',\r\n transition: 'width 0.3s ease',\r\n }}\r\n />\r\n </div>\r\n <div style={{ fontSize: '12px', color: '#9ca3af' }}>\r\n Machines bound: {license.boundMachines.length} / {license.maxMachines}\r\n </div>\r\n </div>\r\n ) : (\r\n <p style={{ color: '#6b7280' }}>Activate a license to view seat information.</p>\r\n )}\r\n </div>\r\n )}\r\n\r\n {!loading && activeTab === 'features' && (\r\n <div>\r\n {license ? (\r\n <ul\r\n style={{\r\n listStyle: 'none',\r\n padding: 0,\r\n margin: 0,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: '8px',\r\n }}\r\n >\r\n {license.features.map((f) => (\r\n <li\r\n key={f}\r\n style={{\r\n padding: '8px 12px',\r\n borderRadius: '6px',\r\n backgroundColor: '#f0fdf4',\r\n color: '#166534',\r\n fontSize: '14px',\r\n }}\r\n >\r\n ✓ {f}\r\n </li>\r\n ))}\r\n {license.features.length === 0 && (\r\n <li style={{ color: '#6b7280', fontSize: '14px' }}>\r\n No explicit features — tier-based access applies.\r\n </li>\r\n )}\r\n </ul>\r\n ) : (\r\n <p style={{ color: '#6b7280' }}>Activate a license to view features.</p>\r\n )}\r\n </div>\r\n )}\r\n\r\n {!loading && activeTab === 'plans' && (\r\n <LicenseComparison\r\n currentTier={license?.tier}\r\n onSelect={(plan) => onUpgrade?.(plan.id)}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// ─── License Manager (Admin) ────────────────────────────────────\r\n\r\n/** Admin-managed license entry */\r\nexport interface ManagedLicense {\r\n key: LicenseKey;\r\n tier: LicenseTier;\r\n licensee: string;\r\n email: string;\r\n status: 'valid' | 'expired' | 'revoked' | 'grace';\r\n issuedAt: string;\r\n expiresAt: string | null;\r\n activeSeats: number;\r\n maxSeats: number | null;\r\n features: string[];\r\n}\r\n\r\nexport interface NiceLicenseManagerProps {\r\n /** Licenses to display */\r\n licenses: ManagedLicense[];\r\n /** Revoke a license */\r\n onRevoke?: (key: LicenseKey) => void;\r\n /** Extend a license */\r\n onExtend?: (key: LicenseKey, days: number) => void;\r\n /** Change tier */\r\n onChangeTier?: (key: LicenseKey, tier: LicenseTier) => void;\r\n /** Add seat */\r\n onAddSeats?: (key: LicenseKey, count: number) => void;\r\n /** Generate new license */\r\n onGenerate?: () => void;\r\n /** Search term change */\r\n onSearchChange?: (term: string) => void;\r\n /** Custom styles */\r\n style?: CSSProperties;\r\n /** Custom class name */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * NiceLicenseManager — Admin panel for managing all issued licenses.\r\n * Shows a searchable table/list with inline actions (revoke, extend, change tier, manage seats).\r\n */\r\nexport function NiceLicenseManager({\r\n licenses,\r\n onRevoke,\r\n onExtend,\r\n onChangeTier,\r\n onAddSeats,\r\n onGenerate,\r\n onSearchChange,\r\n style,\r\n className,\r\n}: NiceLicenseManagerProps) {\r\n const [search, setSearch] = useState('');\r\n const [expandedKey, setExpandedKey] = useState<LicenseKey | null>(null);\r\n\r\n const handleSearch = (value: string) => {\r\n setSearch(value);\r\n onSearchChange?.(value);\r\n };\r\n\r\n const filtered = search\r\n ? licenses.filter(\r\n (l) =>\r\n l.licensee.toLowerCase().includes(search.toLowerCase()) ||\r\n l.email.toLowerCase().includes(search.toLowerCase()) ||\r\n l.key.toLowerCase().includes(search.toLowerCase()),\r\n )\r\n : licenses;\r\n\r\n const statusColors: Record<ManagedLicense['status'], string> = {\r\n valid: '#059669',\r\n expired: '#dc2626',\r\n revoked: '#6b7280',\r\n grace: '#d97706',\r\n };\r\n\r\n const containerStyle: CSSProperties = {\r\n border: '1px solid #e5e7eb',\r\n borderRadius: '12px',\r\n backgroundColor: '#fff',\r\n overflow: 'hidden',\r\n ...style,\r\n };\r\n\r\n return (\r\n <div style={containerStyle} className={className}>\r\n {/* Header */}\r\n <div\r\n style={{\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n padding: '16px 20px',\r\n borderBottom: '1px solid #e5e7eb',\r\n backgroundColor: '#f9fafb',\r\n }}\r\n >\r\n <h3 style={{ margin: 0, fontSize: '16px', color: '#111' }}>License Manager</h3>\r\n <div style={{ display: 'flex', gap: '8px' }}>\r\n <input\r\n type=\"text\"\r\n value={search}\r\n onChange={(e) => handleSearch(e.target.value)}\r\n placeholder=\"Search licenses...\"\r\n style={{\r\n padding: '6px 12px',\r\n fontSize: '13px',\r\n border: '1px solid #d1d5db',\r\n borderRadius: '6px',\r\n outline: 'none',\r\n width: '220px',\r\n }}\r\n />\r\n {onGenerate && (\r\n <button\r\n onClick={onGenerate}\r\n style={{\r\n padding: '6px 14px',\r\n fontSize: '13px',\r\n fontWeight: 600,\r\n color: '#fff',\r\n backgroundColor: '#2563eb',\r\n border: 'none',\r\n borderRadius: '6px',\r\n cursor: 'pointer',\r\n }}\r\n >\r\n + Generate\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* License list */}\r\n <div style={{ maxHeight: '500px', overflow: 'auto' }}>\r\n {filtered.length === 0 && (\r\n <p style={{ padding: '20px', textAlign: 'center', color: '#6b7280' }}>\r\n {search ? 'No licenses match your search.' : 'No licenses found.'}\r\n </p>\r\n )}\r\n\r\n {filtered.map((lic) => {\r\n const isExpanded = expandedKey === lic.key;\r\n\r\n return (\r\n <div\r\n key={lic.key}\r\n style={{\r\n borderBottom: '1px solid #f3f4f6',\r\n }}\r\n >\r\n {/* Summary row */}\r\n <div\r\n style={{\r\n display: 'grid',\r\n gridTemplateColumns: '1fr 140px 100px 80px 60px',\r\n alignItems: 'center',\r\n padding: '12px 20px',\r\n cursor: 'pointer',\r\n backgroundColor: isExpanded ? '#f9fafb' : 'transparent',\r\n }}\r\n onClick={() => setExpandedKey(isExpanded ? null : lic.key)}\r\n >\r\n <div>\r\n <div style={{ fontWeight: 500, fontSize: '14px', color: '#111' }}>\r\n {lic.licensee}\r\n </div>\r\n <div style={{ fontSize: '12px', color: '#6b7280' }}>{lic.email}</div>\r\n </div>\r\n <div style={{ fontSize: '12px', fontFamily: 'monospace', color: '#6b7280' }}>\r\n {maskLicenseKey(lic.key)}\r\n </div>\r\n <div\r\n style={{\r\n fontSize: '12px',\r\n fontWeight: 600,\r\n textTransform: 'capitalize',\r\n color: statusColors[lic.status],\r\n }}\r\n >\r\n {lic.status}\r\n </div>\r\n <div\r\n style={{\r\n fontSize: '12px',\r\n fontWeight: 500,\r\n textTransform: 'capitalize',\r\n color: '#374151',\r\n }}\r\n >\r\n {lic.tier}\r\n </div>\r\n <div style={{ fontSize: '14px', color: '#6b7280', textAlign: 'right' }}>\r\n {isExpanded ? '▲' : '▼'}\r\n </div>\r\n </div>\r\n\r\n {/* Expanded details */}\r\n {isExpanded && (\r\n <div style={{ padding: '12px 20px 16px', backgroundColor: '#f9fafb' }}>\r\n <div\r\n style={{\r\n display: 'grid',\r\n gridTemplateColumns: 'repeat(4, 1fr)',\r\n gap: '12px',\r\n marginBottom: '12px',\r\n }}\r\n >\r\n <div>\r\n <span style={{ fontSize: '11px', color: '#9ca3af' }}>Issued</span>\r\n <div style={{ fontSize: '13px' }}>\r\n {new Date(lic.issuedAt).toLocaleDateString()}\r\n </div>\r\n </div>\r\n <div>\r\n <span style={{ fontSize: '11px', color: '#9ca3af' }}>Expires</span>\r\n <div style={{ fontSize: '13px' }}>\r\n {lic.expiresAt ? new Date(lic.expiresAt).toLocaleDateString() : 'Perpetual'}\r\n </div>\r\n </div>\r\n <div>\r\n <span style={{ fontSize: '11px', color: '#9ca3af' }}>Seats</span>\r\n <div style={{ fontSize: '13px' }}>\r\n {lic.activeSeats} / {lic.maxSeats ?? '∞'}\r\n </div>\r\n </div>\r\n <div>\r\n <span style={{ fontSize: '11px', color: '#9ca3af' }}>Features</span>\r\n <div style={{ fontSize: '13px' }}>{lic.features.length} enabled</div>\r\n </div>\r\n </div>\r\n\r\n {/* Actions */}\r\n <div style={{ display: 'flex', gap: '8px', flexWrap: 'wrap' }}>\r\n {onExtend && lic.status !== 'revoked' && (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onExtend(lic.key, 365);\r\n }}\r\n style={{\r\n padding: '5px 12px',\r\n fontSize: '12px',\r\n border: '1px solid #d1d5db',\r\n borderRadius: '4px',\r\n backgroundColor: '#fff',\r\n cursor: 'pointer',\r\n }}\r\n >\r\n Extend 1 Year\r\n </button>\r\n )}\r\n {onAddSeats && lic.status !== 'revoked' && (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onAddSeats(lic.key, 5);\r\n }}\r\n style={{\r\n padding: '5px 12px',\r\n fontSize: '12px',\r\n border: '1px solid #d1d5db',\r\n borderRadius: '4px',\r\n backgroundColor: '#fff',\r\n cursor: 'pointer',\r\n }}\r\n >\r\n +5 Seats\r\n </button>\r\n )}\r\n {onChangeTier && lic.status !== 'revoked' && (\r\n <select\r\n onClick={(e) => e.stopPropagation()}\r\n onChange={(e) => onChangeTier(lic.key, e.target.value as LicenseTier)}\r\n value={lic.tier}\r\n style={{\r\n padding: '5px 8px',\r\n fontSize: '12px',\r\n border: '1px solid #d1d5db',\r\n borderRadius: '4px',\r\n cursor: 'pointer',\r\n }}\r\n >\r\n <option value=\"trial\">Trial</option>\r\n <option value=\"personal\">Personal</option>\r\n <option value=\"team\">Team</option>\r\n <option value=\"enterprise\">Enterprise</option>\r\n <option value=\"site\">Site</option>\r\n <option value=\"oem\">OEM</option>\r\n </select>\r\n )}\r\n {onRevoke && lic.status !== 'revoked' && (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onRevoke(lic.key);\r\n }}\r\n style={{\r\n padding: '5px 12px',\r\n fontSize: '12px',\r\n color: '#dc2626',\r\n border: '1px solid #fecaca',\r\n borderRadius: '4px',\r\n backgroundColor: '#fff',\r\n cursor: 'pointer',\r\n }}\r\n >\r\n Revoke\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n\r\n {/* Footer */}\r\n <div\r\n style={{\r\n padding: '10px 20px',\r\n borderTop: '1px solid #e5e7eb',\r\n backgroundColor: '#f9fafb',\r\n fontSize: '12px',\r\n color: '#6b7280',\r\n }}\r\n >\r\n {filtered.length} license{filtered.length !== 1 ? 's' : ''}\r\n {search && ` matching \"${search}\"`}\r\n {' · '}\r\n {licenses.filter((l) => l.status === 'valid').length} active\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["result","_a","hasFeature"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"react.mjs","sources":["../src/react.tsx"],"sourcesContent":["/* eslint-disable jsx-a11y/click-events-have-key-events -- modal overlay backdrops (Esc-on-parent provides keyboard close), selection rows in .map() accompanied by visible cursor:pointer styling and sibling buttons; full keyboard migration via useAccessibleClick + extracted subcomponents tracked in TODO_1.0.10 A2.3 */\r\n/* ────────────────────────────────────────────────────────────────\r\n License React Components — UI for license management\r\n──────────────────────────────────────────────────────────────── */\r\n\r\nimport React, {\r\n createContext,\r\n useContext,\r\n useState,\r\n useEffect,\r\n useCallback,\r\n type ReactNode,\r\n type CSSProperties,\r\n} from 'react';\r\n\r\nimport { hasFeature, checkFeatureAccess, getAllPlans, getMissingFeatures } from './FeatureGate';\r\nimport { maskLicenseKey, normalizeLicenseKey } from './LicenseKeyGenerator';\r\nimport { LicenseValidator } from './LicenseValidator';\r\nimport type {\r\n LicenseKey,\r\n LicenseInfo,\r\n LicenseValidationResult,\r\n LicenseState,\r\n FeatureId,\r\n LicensePlan,\r\n LicenseTier,\r\n} from './types';\r\n\r\n// ─── License Context ────────────────────────────────────────────\r\n\r\ninterface LicenseContextValue extends LicenseState {\r\n activate: (key: LicenseKey) => Promise<LicenseValidationResult>;\r\n deactivate: () => Promise<void>;\r\n refresh: () => Promise<void>;\r\n hasFeature: (featureId: FeatureId) => boolean;\r\n}\r\n\r\nconst LicenseContext = createContext<LicenseContextValue | null>(null);\r\n\r\n/**\r\n * License Provider Props\r\n */\r\nexport interface LicenseProviderProps {\r\n /** License server URL */\r\n serverUrl?: string;\r\n /** API key for server communication */\r\n apiKey?: string;\r\n /** Initial license key (from storage) */\r\n initialKey?: LicenseKey;\r\n /** Storage key for persisting license */\r\n storageKey?: string;\r\n /** Auto-validate on mount */\r\n autoValidate?: boolean;\r\n /** Validation interval in ms (0 to disable) */\r\n validationInterval?: number;\r\n /** On license change callback */\r\n onLicenseChange?: (license: LicenseInfo | null) => void;\r\n children: ReactNode;\r\n}\r\n\r\n/**\r\n * License Provider Component\r\n */\r\nexport function LicenseProvider({\r\n serverUrl = 'https://license.nice2dev.com/api/v1',\r\n apiKey,\r\n initialKey,\r\n storageKey = 'nice2dev_license_key',\r\n autoValidate = true,\r\n validationInterval = 3600000, // 1 hour\r\n onLicenseChange,\r\n children,\r\n}: LicenseProviderProps) {\r\n const [state, setState] = useState<LicenseState>({\r\n license: null,\r\n validation: null,\r\n loading: true,\r\n error: null,\r\n features: new Set(),\r\n fingerprint: null,\r\n });\r\n\r\n const [validator] = useState(() => new LicenseValidator({ serverUrl, apiKey }));\r\n\r\n // Load license key from storage\r\n const loadStoredKey = useCallback((): LicenseKey | null => {\r\n if (typeof localStorage === 'undefined') {\r\n return null;\r\n }\r\n try {\r\n return localStorage.getItem(storageKey);\r\n } catch {\r\n return null;\r\n }\r\n }, [storageKey]);\r\n\r\n // Save license key to storage\r\n const saveKey = useCallback(\r\n (key: LicenseKey | null) => {\r\n if (typeof localStorage === 'undefined') {\r\n return;\r\n }\r\n try {\r\n if (key) {\r\n localStorage.setItem(storageKey, key);\r\n } else {\r\n localStorage.removeItem(storageKey);\r\n }\r\n } catch {\r\n // Storage not available\r\n }\r\n },\r\n [storageKey],\r\n );\r\n\r\n // Validate license\r\n const validateLicense = useCallback(\r\n async (key: LicenseKey): Promise<LicenseValidationResult> => {\r\n setState((s) => ({ ...s, loading: true, error: null }));\r\n\r\n try {\r\n const result = await validator.validate(key);\r\n\r\n setState((s) => ({\r\n ...s,\r\n license: result.license || null,\r\n validation: result,\r\n loading: false,\r\n error: result.valid ? null : result.errorMessage || 'Validation failed',\r\n features: new Set(result.availableFeatures || []),\r\n }));\r\n\r\n if (result.valid && result.license) {\r\n onLicenseChange?.(result.license);\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\r\n setState((s) => ({\r\n ...s,\r\n loading: false,\r\n error: errorMessage,\r\n validation: {\r\n valid: false,\r\n errorCode: 'SERVER_ERROR',\r\n errorMessage,\r\n validatedAt: new Date().toISOString(),\r\n },\r\n }));\r\n\r\n return {\r\n valid: false,\r\n errorCode: 'SERVER_ERROR',\r\n errorMessage,\r\n validatedAt: new Date().toISOString(),\r\n };\r\n }\r\n },\r\n [validator, onLicenseChange],\r\n );\r\n\r\n // Activate license\r\n const activate = useCallback(\r\n async (key: LicenseKey): Promise<LicenseValidationResult> => {\r\n const normalized = normalizeLicenseKey(key);\r\n if (!normalized) {\r\n const result: LicenseValidationResult = {\r\n valid: false,\r\n errorCode: 'INVALID_KEY',\r\n errorMessage: 'Invalid license key format',\r\n validatedAt: new Date().toISOString(),\r\n };\r\n setState((s) => ({ ...s, error: result.errorMessage || null, validation: result }));\r\n return result;\r\n }\r\n\r\n const result = await validateLicense(normalized);\r\n\r\n if (result.valid) {\r\n saveKey(normalized);\r\n }\r\n\r\n return result;\r\n },\r\n [validateLicense, saveKey],\r\n );\r\n\r\n // Deactivate license\r\n const deactivate = useCallback(async () => {\r\n const key = loadStoredKey();\r\n if (key) {\r\n await validator.deactivateMachine(key);\r\n }\r\n\r\n saveKey(null);\r\n setState({\r\n license: null,\r\n validation: null,\r\n loading: false,\r\n error: null,\r\n features: new Set(),\r\n fingerprint: null,\r\n });\r\n onLicenseChange?.(null);\r\n }, [validator, loadStoredKey, saveKey, onLicenseChange]);\r\n\r\n // Refresh validation\r\n const refresh = useCallback(async () => {\r\n const key = state.license?.key || loadStoredKey();\r\n if (key) {\r\n await validateLicense(key);\r\n }\r\n }, [state.license?.key, loadStoredKey, validateLicense]);\r\n\r\n // Check feature\r\n const checkFeature = useCallback(\r\n (featureId: FeatureId): boolean => {\r\n return hasFeature(state.license, featureId);\r\n },\r\n [state.license],\r\n );\r\n\r\n // Initial validation\r\n useEffect(() => {\r\n if (!autoValidate) {\r\n setState((s) => ({ ...s, loading: false }));\r\n return;\r\n }\r\n\r\n const key = initialKey || loadStoredKey();\r\n if (key) {\r\n validateLicense(key);\r\n } else {\r\n setState((s) => ({ ...s, loading: false }));\r\n }\r\n }, [autoValidate, initialKey, loadStoredKey, validateLicense]);\r\n\r\n // Periodic validation\r\n useEffect(() => {\r\n if (validationInterval <= 0 || !state.license) {\r\n return;\r\n }\r\n\r\n const interval = setInterval(() => {\r\n refresh();\r\n }, validationInterval);\r\n\r\n return () => clearInterval(interval);\r\n }, [validationInterval, state.license, refresh]);\r\n\r\n const value: LicenseContextValue = {\r\n ...state,\r\n activate,\r\n deactivate,\r\n refresh,\r\n hasFeature: checkFeature,\r\n };\r\n\r\n return <LicenseContext.Provider value={value}>{children}</LicenseContext.Provider>;\r\n}\r\n\r\n/**\r\n * Hook to access license context\r\n */\r\nexport function useLicense(): LicenseContextValue {\r\n const context = useContext(LicenseContext);\r\n if (!context) {\r\n throw new Error('useLicense must be used within a LicenseProvider');\r\n }\r\n return context;\r\n}\r\n\r\n/**\r\n * Hook to check a specific feature\r\n */\r\nexport function useFeature(featureId: FeatureId): {\r\n allowed: boolean;\r\n loading: boolean;\r\n error: string | null;\r\n} {\r\n const { license, loading, error } = useLicense();\r\n const allowed = hasFeature(license, featureId);\r\n return { allowed, loading, error };\r\n}\r\n\r\n// ─── Feature Gate Component ─────────────────────────────────────\r\n\r\nexport interface FeatureGateProps {\r\n /** Feature ID to check */\r\n feature: FeatureId;\r\n /** Content to show when feature is allowed */\r\n children: ReactNode;\r\n /** Content to show when feature is not allowed */\r\n fallback?: ReactNode;\r\n /** Show upgrade prompt instead of fallback */\r\n showUpgradePrompt?: boolean;\r\n /** Custom upgrade prompt render */\r\n renderUpgradePrompt?: (targetTier: LicenseTier) => ReactNode;\r\n}\r\n\r\n/**\r\n * Feature Gate Component — conditionally render based on license\r\n */\r\nexport function FeatureGate({\r\n feature,\r\n children,\r\n fallback = null,\r\n showUpgradePrompt = false,\r\n renderUpgradePrompt,\r\n}: FeatureGateProps) {\r\n const { license, loading } = useLicense();\r\n\r\n if (loading) {\r\n return null; // Or a loading skeleton\r\n }\r\n\r\n const result = checkFeatureAccess(license, feature);\r\n\r\n if (result.allowed) {\r\n return <>{children}</>;\r\n }\r\n\r\n if (showUpgradePrompt && result.upgradeTarget) {\r\n if (renderUpgradePrompt) {\r\n return <>{renderUpgradePrompt(result.upgradeTarget)}</>;\r\n }\r\n return <UpgradePrompt targetTier={result.upgradeTarget} feature={feature} />;\r\n }\r\n\r\n return <>{fallback}</>;\r\n}\r\n\r\n// ─── License Status Widget ──────────────────────────────────────\r\n\r\nexport interface LicenseStatusProps {\r\n /** Show detailed info */\r\n detailed?: boolean;\r\n /** Custom styles */\r\n style?: CSSProperties;\r\n /** Custom class name */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * License Status Widget\r\n */\r\nexport function LicenseStatus({ detailed = false, style, className }: LicenseStatusProps) {\r\n const { license, validation, loading, error } = useLicense();\r\n\r\n const baseStyle: CSSProperties = {\r\n padding: '8px 12px',\r\n borderRadius: '6px',\r\n fontSize: '14px',\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: '8px',\r\n ...style,\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div\r\n style={{ ...baseStyle, backgroundColor: '#f0f0f0', color: '#666' }}\r\n className={className}\r\n >\r\n <span>⏳</span>\r\n <span>Checking license...</span>\r\n </div>\r\n );\r\n }\r\n\r\n if (error || !license) {\r\n return (\r\n <div\r\n style={{ ...baseStyle, backgroundColor: '#fee2e2', color: '#991b1b' }}\r\n className={className}\r\n >\r\n <span>⚠️</span>\r\n <span>{error || 'No license'}</span>\r\n </div>\r\n );\r\n }\r\n\r\n const tierColors: Record<LicenseTier, string> = {\r\n trial: '#fef3c7',\r\n personal: '#dbeafe',\r\n team: '#d1fae5',\r\n enterprise: '#ede9fe',\r\n site: '#fce7f3',\r\n oem: '#f3e8ff',\r\n };\r\n\r\n const tierTextColors: Record<LicenseTier, string> = {\r\n trial: '#92400e',\r\n personal: '#1e40af',\r\n team: '#065f46',\r\n enterprise: '#5b21b6',\r\n site: '#9d174d',\r\n oem: '#7c3aed',\r\n };\r\n\r\n const bgColor = tierColors[license.tier] || '#f0f0f0';\r\n const textColor = tierTextColors[license.tier] || '#333';\r\n\r\n return (\r\n <div style={{ ...baseStyle, backgroundColor: bgColor, color: textColor }} className={className}>\r\n <span>✓</span>\r\n <span style={{ fontWeight: 600 }}>\r\n {license.tier.charAt(0).toUpperCase() + license.tier.slice(1)}\r\n </span>\r\n {validation?.inGracePeriod && (\r\n <span style={{ color: '#dc2626', fontSize: '12px' }}>(Grace period)</span>\r\n )}\r\n {detailed && validation?.daysRemaining !== undefined && validation.daysRemaining > 0 && (\r\n <span style={{ fontSize: '12px', opacity: 0.8 }}>\r\n {validation.daysRemaining} days remaining\r\n </span>\r\n )}\r\n {detailed && (\r\n <span style={{ fontSize: '12px', opacity: 0.6 }}>{maskLicenseKey(license.key)}</span>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── License Activator ──────────────────────────────────────────\r\n\r\nexport interface LicenseActivatorProps {\r\n /** On successful activation */\r\n onActivated?: (license: LicenseInfo) => void;\r\n /** On activation error */\r\n onError?: (error: string) => void;\r\n /** Custom styles */\r\n style?: CSSProperties;\r\n /** Custom class name */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * License Activator Form\r\n */\r\nexport function LicenseActivator({\r\n onActivated,\r\n onError,\r\n style,\r\n className,\r\n}: LicenseActivatorProps) {\r\n const { activate, loading } = useLicense();\r\n const [key, setKey] = useState('');\r\n const [localError, setLocalError] = useState<string | null>(null);\r\n const [isActivating, setIsActivating] = useState(false);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!key.trim() || isActivating) {\r\n return;\r\n }\r\n\r\n setIsActivating(true);\r\n setLocalError(null);\r\n\r\n try {\r\n const result = await activate(key.trim());\r\n\r\n if (result.valid && result.license) {\r\n setKey('');\r\n onActivated?.(result.license);\r\n } else {\r\n setLocalError(result.errorMessage || 'Activation failed');\r\n onError?.(result.errorMessage || 'Activation failed');\r\n }\r\n } finally {\r\n setIsActivating(false);\r\n }\r\n };\r\n\r\n const containerStyle: CSSProperties = {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: '12px',\r\n padding: '16px',\r\n border: '1px solid #e5e7eb',\r\n borderRadius: '8px',\r\n backgroundColor: '#fff',\r\n ...style,\r\n };\r\n\r\n const inputStyle: CSSProperties = {\r\n padding: '10px 12px',\r\n fontSize: '14px',\r\n fontFamily: 'monospace',\r\n border: '1px solid #d1d5db',\r\n borderRadius: '6px',\r\n outline: 'none',\r\n textTransform: 'uppercase',\r\n };\r\n\r\n const buttonStyle: CSSProperties = {\r\n padding: '10px 16px',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n color: '#fff',\r\n backgroundColor: isActivating || loading ? '#9ca3af' : '#2563eb',\r\n border: 'none',\r\n borderRadius: '6px',\r\n cursor: isActivating || loading ? 'not-allowed' : 'pointer',\r\n };\r\n\r\n return (\r\n <form onSubmit={handleSubmit} style={containerStyle} className={className}>\r\n <label style={{ fontWeight: 500, color: '#374151' }}>Enter License Key</label>\r\n <input\r\n type=\"text\"\r\n value={key}\r\n onChange={(e) => setKey(e.target.value)}\r\n placeholder=\"XXXX-XXXX-XXXX-XXXX-XXXX\"\r\n style={inputStyle}\r\n disabled={isActivating || loading}\r\n />\r\n {localError && <div style={{ color: '#dc2626', fontSize: '13px' }}>{localError}</div>}\r\n <button type=\"submit\" style={buttonStyle} disabled={isActivating || loading || !key.trim()}>\r\n {isActivating ? 'Activating...' : 'Activate License'}\r\n </button>\r\n </form>\r\n );\r\n}\r\n\r\n// ─── Upgrade Prompt ─────────────────────────────────────────────\r\n\r\nexport interface UpgradePromptProps {\r\n /** Target tier for upgrade */\r\n targetTier: LicenseTier;\r\n /** Feature that triggered the prompt */\r\n feature?: FeatureId;\r\n /** On upgrade click */\r\n onUpgrade?: (tier: LicenseTier) => void;\r\n /** Custom styles */\r\n style?: CSSProperties;\r\n /** Compact mode */\r\n compact?: boolean;\r\n}\r\n\r\n/**\r\n * Upgrade Prompt Component\r\n */\r\nexport function UpgradePrompt({\r\n targetTier,\r\n feature: _feature,\r\n onUpgrade,\r\n style,\r\n compact = false,\r\n}: UpgradePromptProps) {\r\n const { license } = useLicense();\r\n const missingFeatures = getMissingFeatures(license, targetTier);\r\n\r\n const handleUpgrade = () => {\r\n onUpgrade?.(targetTier);\r\n // Default: open upgrade page\r\n if (!onUpgrade) {\r\n window.open(`https://nice2dev.com/pricing?upgrade=${targetTier}`, '_blank');\r\n }\r\n };\r\n\r\n const containerStyle: CSSProperties = {\r\n padding: compact ? '12px' : '20px',\r\n backgroundColor: '#eff6ff',\r\n borderRadius: '8px',\r\n border: '1px solid #bfdbfe',\r\n ...style,\r\n };\r\n\r\n const titleStyle: CSSProperties = {\r\n fontSize: compact ? '14px' : '16px',\r\n fontWeight: 600,\r\n color: '#1e40af',\r\n marginBottom: '8px',\r\n };\r\n\r\n const buttonStyle: CSSProperties = {\r\n padding: '8px 16px',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n color: '#fff',\r\n backgroundColor: '#2563eb',\r\n border: 'none',\r\n borderRadius: '6px',\r\n cursor: 'pointer',\r\n marginTop: '12px',\r\n };\r\n\r\n return (\r\n <div style={containerStyle}>\r\n <div style={titleStyle}>\r\n 🚀 Upgrade to {targetTier.charAt(0).toUpperCase() + targetTier.slice(1)}\r\n </div>\r\n {!compact && missingFeatures.length > 0 && (\r\n <ul style={{ margin: '8px 0', paddingLeft: '20px', color: '#374151', fontSize: '14px' }}>\r\n {missingFeatures.slice(0, 3).map((f) => (\r\n <li key={f.id}>{f.name}</li>\r\n ))}\r\n {missingFeatures.length > 3 && <li>+{missingFeatures.length - 3} more features</li>}\r\n </ul>\r\n )}\r\n <button onClick={handleUpgrade} style={buttonStyle}>\r\n Upgrade Now\r\n </button>\r\n </div>\r\n );\r\n}\r\n\r\n// ─── License Comparison ─────────────────────────────────────────\r\n\r\nexport interface LicenseComparisonProps {\r\n /** Plans to show (default: all) */\r\n plans?: LicensePlan[];\r\n /** Current tier for highlighting */\r\n currentTier?: LicenseTier;\r\n /** On plan select */\r\n onSelect?: (plan: LicensePlan) => void;\r\n /** Show prices */\r\n showPrices?: boolean;\r\n}\r\n\r\n/**\r\n * License Comparison Table\r\n */\r\nexport function LicenseComparison({\r\n plans: customPlans,\r\n currentTier,\r\n onSelect,\r\n showPrices = true,\r\n}: LicenseComparisonProps) {\r\n const { license } = useLicense();\r\n const tier = currentTier || license?.tier;\r\n const plans = customPlans || getAllPlans().filter((p) => p.priceMonthly > 0 || p.id === 'trial');\r\n\r\n const formatPrice = (cents: number) => {\r\n if (cents === 0) {\r\n return 'Free';\r\n }\r\n return `$${(cents / 100).toFixed(0)}`;\r\n };\r\n\r\n return (\r\n <div style={{ display: 'flex', gap: '16px', flexWrap: 'wrap', justifyContent: 'center' }}>\r\n {plans.map((plan) => {\r\n const isCurrent = plan.id === tier;\r\n const isRecommended = plan.recommended;\r\n\r\n return (\r\n <div\r\n key={plan.id}\r\n style={{\r\n flex: '1 1 250px',\r\n maxWidth: '300px',\r\n padding: '24px',\r\n borderRadius: '12px',\r\n border: isRecommended ? '2px solid #2563eb' : '1px solid #e5e7eb',\r\n backgroundColor: isCurrent ? '#f0f9ff' : '#fff',\r\n position: 'relative',\r\n }}\r\n >\r\n {isRecommended && (\r\n <div\r\n style={{\r\n position: 'absolute',\r\n top: '-12px',\r\n left: '50%',\r\n transform: 'translateX(-50%)',\r\n backgroundColor: '#2563eb',\r\n color: '#fff',\r\n padding: '4px 12px',\r\n borderRadius: '12px',\r\n fontSize: '12px',\r\n fontWeight: 600,\r\n }}\r\n >\r\n Recommended\r\n </div>\r\n )}\r\n\r\n <h3 style={{ margin: '0 0 4px', fontSize: '20px', color: '#111' }}>{plan.name}</h3>\r\n <p style={{ margin: '0 0 16px', fontSize: '14px', color: '#6b7280' }}>\r\n {plan.description}\r\n </p>\r\n\r\n {showPrices && (\r\n <div style={{ marginBottom: '16px' }}>\r\n <span style={{ fontSize: '32px', fontWeight: 700, color: '#111' }}>\r\n {formatPrice(plan.priceMonthly)}\r\n </span>\r\n {plan.priceMonthly > 0 && (\r\n <span style={{ fontSize: '14px', color: '#6b7280' }}>/month</span>\r\n )}\r\n </div>\r\n )}\r\n\r\n <ul style={{ listStyle: 'none', padding: 0, margin: '0 0 16px' }}>\r\n {plan.highlights.map((h, i) => (\r\n <li key={i} style={{ padding: '6px 0', fontSize: '14px', color: '#374151' }}>\r\n ✓ {h}\r\n </li>\r\n ))}\r\n </ul>\r\n\r\n <button\r\n onClick={() => onSelect?.(plan)}\r\n disabled={isCurrent}\r\n style={{\r\n width: '100%',\r\n padding: '10px',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n color: isCurrent ? '#9ca3af' : isRecommended ? '#fff' : '#2563eb',\r\n backgroundColor: isCurrent ? '#f3f4f6' : isRecommended ? '#2563eb' : '#fff',\r\n border: isCurrent ? 'none' : isRecommended ? 'none' : '1px solid #2563eb',\r\n borderRadius: '6px',\r\n cursor: isCurrent ? 'default' : 'pointer',\r\n }}\r\n >\r\n {isCurrent ? 'Current Plan' : 'Select'}\r\n </button>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── Trial Watermark ────────────────────────────────────────────\r\n\r\nexport interface TrialWatermarkProps {\r\n /** Position */\r\n position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\r\n /** Custom text */\r\n text?: string;\r\n}\r\n\r\n/**\r\n * Trial Watermark — shows for trial licenses\r\n */\r\nexport function TrialWatermark({\r\n position = 'bottom-right',\r\n text = 'Trial Version',\r\n}: TrialWatermarkProps) {\r\n const { license, hasFeature } = useLicense();\r\n\r\n // Only show for trial or if feature is enabled\r\n if (!hasFeature('trial-watermark') && license?.tier !== 'trial') {\r\n return null;\r\n }\r\n\r\n const positions: Record<string, CSSProperties> = {\r\n 'top-left': { top: '16px', left: '16px' },\r\n 'top-right': { top: '16px', right: '16px' },\r\n 'bottom-left': { bottom: '16px', left: '16px' },\r\n 'bottom-right': { bottom: '16px', right: '16px' },\r\n };\r\n\r\n return (\r\n <div\r\n style={{\r\n position: 'fixed',\r\n ...positions[position],\r\n padding: '8px 16px',\r\n backgroundColor: 'rgba(0, 0, 0, 0.8)',\r\n color: '#fff',\r\n fontSize: '12px',\r\n fontWeight: 600,\r\n borderRadius: '4px',\r\n zIndex: 9999,\r\n pointerEvents: 'none',\r\n }}\r\n >\r\n {text}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── License Portal ─────────────────────────────────────────────\r\n\r\n/** License Portal tab identifier */\r\nexport type LicensePortalTab = 'overview' | 'activation' | 'seats' | 'features' | 'plans';\r\n\r\nexport interface LicensePortalProps {\r\n /** Tabs to display (default: all) */\r\n tabs?: LicensePortalTab[];\r\n /** Default active tab */\r\n defaultTab?: LicensePortalTab;\r\n /** On plan upgrade click */\r\n onUpgrade?: (tier: LicenseTier) => void;\r\n /** On deactivation */\r\n onDeactivate?: () => void;\r\n /** Custom styles */\r\n style?: CSSProperties;\r\n /** Custom class name */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * License Portal — self-service dashboard for customers to manage\r\n * their license (activation, seat overview, feature list, plan comparison).\r\n */\r\nexport function LicensePortal({\r\n tabs = ['overview', 'activation', 'seats', 'features', 'plans'],\r\n defaultTab = 'overview',\r\n onUpgrade,\r\n onDeactivate,\r\n style,\r\n className,\r\n}: LicensePortalProps) {\r\n const {\r\n license,\r\n validation: _validation,\r\n loading,\r\n error,\r\n deactivate,\r\n refresh,\r\n hasFeature: _checkFeat,\r\n } = useLicense();\r\n const [activeTab, setActiveTab] = useState<LicensePortalTab>(defaultTab);\r\n const [refreshing, setRefreshing] = useState(false);\r\n\r\n const handleRefresh = async () => {\r\n setRefreshing(true);\r\n try {\r\n await refresh();\r\n } finally {\r\n setRefreshing(false);\r\n }\r\n };\r\n\r\n const handleDeactivate = async () => {\r\n await deactivate();\r\n onDeactivate?.();\r\n };\r\n\r\n const tabLabels: Record<LicensePortalTab, string> = {\r\n overview: 'Overview',\r\n activation: 'Activation',\r\n seats: 'Seats',\r\n features: 'Features',\r\n plans: 'Plans',\r\n };\r\n\r\n const containerStyle: CSSProperties = {\r\n border: '1px solid #e5e7eb',\r\n borderRadius: '12px',\r\n backgroundColor: '#fff',\r\n overflow: 'hidden',\r\n ...style,\r\n };\r\n\r\n const tabBarStyle: CSSProperties = {\r\n display: 'flex',\r\n borderBottom: '1px solid #e5e7eb',\r\n backgroundColor: '#f9fafb',\r\n };\r\n\r\n const getTabStyle = (tab: LicensePortalTab): CSSProperties => ({\r\n padding: '12px 20px',\r\n fontSize: '14px',\r\n fontWeight: activeTab === tab ? 600 : 400,\r\n color: activeTab === tab ? '#2563eb' : '#6b7280',\r\n backgroundColor: 'transparent',\r\n border: 'none',\r\n borderBottom: activeTab === tab ? '2px solid #2563eb' : '2px solid transparent',\r\n cursor: 'pointer',\r\n });\r\n\r\n const panelStyle: CSSProperties = { padding: '24px' };\r\n\r\n return (\r\n <div style={containerStyle} className={className}>\r\n {/* Tab bar */}\r\n <div style={tabBarStyle}>\r\n {tabs.map((tab) => (\r\n <button key={tab} style={getTabStyle(tab)} onClick={() => setActiveTab(tab)}>\r\n {tabLabels[tab]}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Tab panels */}\r\n <div style={panelStyle}>\r\n {loading && <p style={{ color: '#6b7280' }}>Loading license information...</p>}\r\n\r\n {!loading && activeTab === 'overview' && (\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: '16px' }}>\r\n <LicenseStatus detailed />\r\n {license && (\r\n <>\r\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '12px' }}>\r\n <div>\r\n <span style={{ fontSize: '12px', color: '#6b7280' }}>Licensee</span>\r\n <p style={{ margin: '2px 0 0', fontWeight: 500 }}>{license.licensee}</p>\r\n </div>\r\n <div>\r\n <span style={{ fontSize: '12px', color: '#6b7280' }}>Email</span>\r\n <p style={{ margin: '2px 0 0', fontWeight: 500 }}>{license.email}</p>\r\n </div>\r\n <div>\r\n <span style={{ fontSize: '12px', color: '#6b7280' }}>Seats</span>\r\n <p style={{ margin: '2px 0 0', fontWeight: 500 }}>\r\n {license.activeSeats} / {license.maxSeats ?? '∞'}\r\n </p>\r\n </div>\r\n <div>\r\n <span style={{ fontSize: '12px', color: '#6b7280' }}>Expires</span>\r\n <p style={{ margin: '2px 0 0', fontWeight: 500 }}>\r\n {license.expiresAt\r\n ? new Date(license.expiresAt).toLocaleDateString()\r\n : 'Perpetual'}\r\n </p>\r\n </div>\r\n </div>\r\n <div style={{ display: 'flex', gap: '8px' }}>\r\n <button\r\n onClick={handleRefresh}\r\n disabled={refreshing}\r\n style={{\r\n padding: '8px 16px',\r\n fontSize: '13px',\r\n border: '1px solid #d1d5db',\r\n borderRadius: '6px',\r\n backgroundColor: '#fff',\r\n cursor: refreshing ? 'not-allowed' : 'pointer',\r\n }}\r\n >\r\n {refreshing ? 'Refreshing...' : 'Refresh'}\r\n </button>\r\n <button\r\n onClick={handleDeactivate}\r\n style={{\r\n padding: '8px 16px',\r\n fontSize: '13px',\r\n color: '#dc2626',\r\n border: '1px solid #fecaca',\r\n borderRadius: '6px',\r\n backgroundColor: '#fff',\r\n cursor: 'pointer',\r\n }}\r\n >\r\n Deactivate\r\n </button>\r\n </div>\r\n </>\r\n )}\r\n {!license && !error && (\r\n <p style={{ color: '#6b7280' }}>\r\n No active license. Go to the Activation tab to enter your license key.\r\n </p>\r\n )}\r\n {error && <p style={{ color: '#dc2626' }}>{error}</p>}\r\n </div>\r\n )}\r\n\r\n {!loading && activeTab === 'activation' && (\r\n <LicenseActivator onActivated={() => setActiveTab('overview')} />\r\n )}\r\n\r\n {!loading && activeTab === 'seats' && (\r\n <div>\r\n {license ? (\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: '12px' }}>\r\n <div style={{ fontSize: '14px', color: '#374151' }}>\r\n <strong>{license.activeSeats}</strong> of{' '}\r\n <strong>{license.maxSeats ?? '∞'}</strong> seats in use\r\n {license.floatingSeats != null && (\r\n <span> ({license.floatingSeats} floating)</span>\r\n )}\r\n </div>\r\n <div\r\n style={{\r\n height: '8px',\r\n borderRadius: '4px',\r\n backgroundColor: '#e5e7eb',\r\n overflow: 'hidden',\r\n }}\r\n >\r\n <div\r\n style={{\r\n height: '100%',\r\n width: license.maxSeats\r\n ? `${Math.min(100, (license.activeSeats / license.maxSeats) * 100)}%`\r\n : '10%',\r\n backgroundColor:\r\n license.maxSeats && license.activeSeats / license.maxSeats > 0.9\r\n ? '#dc2626'\r\n : '#2563eb',\r\n borderRadius: '4px',\r\n transition: 'width 0.3s ease',\r\n }}\r\n />\r\n </div>\r\n <div style={{ fontSize: '12px', color: '#9ca3af' }}>\r\n Machines bound: {license.boundMachines.length} / {license.maxMachines}\r\n </div>\r\n </div>\r\n ) : (\r\n <p style={{ color: '#6b7280' }}>Activate a license to view seat information.</p>\r\n )}\r\n </div>\r\n )}\r\n\r\n {!loading && activeTab === 'features' && (\r\n <div>\r\n {license ? (\r\n <ul\r\n style={{\r\n listStyle: 'none',\r\n padding: 0,\r\n margin: 0,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: '8px',\r\n }}\r\n >\r\n {license.features.map((f) => (\r\n <li\r\n key={f}\r\n style={{\r\n padding: '8px 12px',\r\n borderRadius: '6px',\r\n backgroundColor: '#f0fdf4',\r\n color: '#166534',\r\n fontSize: '14px',\r\n }}\r\n >\r\n ✓ {f}\r\n </li>\r\n ))}\r\n {license.features.length === 0 && (\r\n <li style={{ color: '#6b7280', fontSize: '14px' }}>\r\n No explicit features — tier-based access applies.\r\n </li>\r\n )}\r\n </ul>\r\n ) : (\r\n <p style={{ color: '#6b7280' }}>Activate a license to view features.</p>\r\n )}\r\n </div>\r\n )}\r\n\r\n {!loading && activeTab === 'plans' && (\r\n <LicenseComparison\r\n currentTier={license?.tier}\r\n onSelect={(plan) => onUpgrade?.(plan.id)}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// ─── License Manager (Admin) ────────────────────────────────────\r\n\r\n/** Admin-managed license entry */\r\nexport interface ManagedLicense {\r\n key: LicenseKey;\r\n tier: LicenseTier;\r\n licensee: string;\r\n email: string;\r\n status: 'valid' | 'expired' | 'revoked' | 'grace';\r\n issuedAt: string;\r\n expiresAt: string | null;\r\n activeSeats: number;\r\n maxSeats: number | null;\r\n features: string[];\r\n}\r\n\r\nexport interface NiceLicenseManagerProps {\r\n /** Licenses to display */\r\n licenses: ManagedLicense[];\r\n /** Revoke a license */\r\n onRevoke?: (key: LicenseKey) => void;\r\n /** Extend a license */\r\n onExtend?: (key: LicenseKey, days: number) => void;\r\n /** Change tier */\r\n onChangeTier?: (key: LicenseKey, tier: LicenseTier) => void;\r\n /** Add seat */\r\n onAddSeats?: (key: LicenseKey, count: number) => void;\r\n /** Generate new license */\r\n onGenerate?: () => void;\r\n /** Search term change */\r\n onSearchChange?: (term: string) => void;\r\n /** Custom styles */\r\n style?: CSSProperties;\r\n /** Custom class name */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * NiceLicenseManager — Admin panel for managing all issued licenses.\r\n * Shows a searchable table/list with inline actions (revoke, extend, change tier, manage seats).\r\n */\r\nexport function NiceLicenseManager({\r\n licenses,\r\n onRevoke,\r\n onExtend,\r\n onChangeTier,\r\n onAddSeats,\r\n onGenerate,\r\n onSearchChange,\r\n style,\r\n className,\r\n}: NiceLicenseManagerProps) {\r\n const [search, setSearch] = useState('');\r\n const [expandedKey, setExpandedKey] = useState<LicenseKey | null>(null);\r\n\r\n const handleSearch = (value: string) => {\r\n setSearch(value);\r\n onSearchChange?.(value);\r\n };\r\n\r\n const filtered = search\r\n ? licenses.filter(\r\n (l) =>\r\n l.licensee.toLowerCase().includes(search.toLowerCase()) ||\r\n l.email.toLowerCase().includes(search.toLowerCase()) ||\r\n l.key.toLowerCase().includes(search.toLowerCase()),\r\n )\r\n : licenses;\r\n\r\n const statusColors: Record<ManagedLicense['status'], string> = {\r\n valid: '#059669',\r\n expired: '#dc2626',\r\n revoked: '#6b7280',\r\n grace: '#d97706',\r\n };\r\n\r\n const containerStyle: CSSProperties = {\r\n border: '1px solid #e5e7eb',\r\n borderRadius: '12px',\r\n backgroundColor: '#fff',\r\n overflow: 'hidden',\r\n ...style,\r\n };\r\n\r\n return (\r\n <div style={containerStyle} className={className}>\r\n {/* Header */}\r\n <div\r\n style={{\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n padding: '16px 20px',\r\n borderBottom: '1px solid #e5e7eb',\r\n backgroundColor: '#f9fafb',\r\n }}\r\n >\r\n <h3 style={{ margin: 0, fontSize: '16px', color: '#111' }}>License Manager</h3>\r\n <div style={{ display: 'flex', gap: '8px' }}>\r\n <input\r\n type=\"text\"\r\n value={search}\r\n onChange={(e) => handleSearch(e.target.value)}\r\n placeholder=\"Search licenses...\"\r\n style={{\r\n padding: '6px 12px',\r\n fontSize: '13px',\r\n border: '1px solid #d1d5db',\r\n borderRadius: '6px',\r\n outline: 'none',\r\n width: '220px',\r\n }}\r\n />\r\n {onGenerate && (\r\n <button\r\n onClick={onGenerate}\r\n style={{\r\n padding: '6px 14px',\r\n fontSize: '13px',\r\n fontWeight: 600,\r\n color: '#fff',\r\n backgroundColor: '#2563eb',\r\n border: 'none',\r\n borderRadius: '6px',\r\n cursor: 'pointer',\r\n }}\r\n >\r\n + Generate\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* License list */}\r\n <div style={{ maxHeight: '500px', overflow: 'auto' }}>\r\n {filtered.length === 0 && (\r\n <p style={{ padding: '20px', textAlign: 'center', color: '#6b7280' }}>\r\n {search ? 'No licenses match your search.' : 'No licenses found.'}\r\n </p>\r\n )}\r\n\r\n {filtered.map((lic) => {\r\n const isExpanded = expandedKey === lic.key;\r\n\r\n return (\r\n <div\r\n key={lic.key}\r\n style={{\r\n borderBottom: '1px solid #f3f4f6',\r\n }}\r\n >\r\n {/* Summary row */}\r\n <div\r\n style={{\r\n display: 'grid',\r\n gridTemplateColumns: '1fr 140px 100px 80px 60px',\r\n alignItems: 'center',\r\n padding: '12px 20px',\r\n cursor: 'pointer',\r\n backgroundColor: isExpanded ? '#f9fafb' : 'transparent',\r\n }}\r\n onClick={() => setExpandedKey(isExpanded ? null : lic.key)}\r\n >\r\n <div>\r\n <div style={{ fontWeight: 500, fontSize: '14px', color: '#111' }}>\r\n {lic.licensee}\r\n </div>\r\n <div style={{ fontSize: '12px', color: '#6b7280' }}>{lic.email}</div>\r\n </div>\r\n <div style={{ fontSize: '12px', fontFamily: 'monospace', color: '#6b7280' }}>\r\n {maskLicenseKey(lic.key)}\r\n </div>\r\n <div\r\n style={{\r\n fontSize: '12px',\r\n fontWeight: 600,\r\n textTransform: 'capitalize',\r\n color: statusColors[lic.status],\r\n }}\r\n >\r\n {lic.status}\r\n </div>\r\n <div\r\n style={{\r\n fontSize: '12px',\r\n fontWeight: 500,\r\n textTransform: 'capitalize',\r\n color: '#374151',\r\n }}\r\n >\r\n {lic.tier}\r\n </div>\r\n <div style={{ fontSize: '14px', color: '#6b7280', textAlign: 'right' }}>\r\n {isExpanded ? '▲' : '▼'}\r\n </div>\r\n </div>\r\n\r\n {/* Expanded details */}\r\n {isExpanded && (\r\n <div style={{ padding: '12px 20px 16px', backgroundColor: '#f9fafb' }}>\r\n <div\r\n style={{\r\n display: 'grid',\r\n gridTemplateColumns: 'repeat(4, 1fr)',\r\n gap: '12px',\r\n marginBottom: '12px',\r\n }}\r\n >\r\n <div>\r\n <span style={{ fontSize: '11px', color: '#9ca3af' }}>Issued</span>\r\n <div style={{ fontSize: '13px' }}>\r\n {new Date(lic.issuedAt).toLocaleDateString()}\r\n </div>\r\n </div>\r\n <div>\r\n <span style={{ fontSize: '11px', color: '#9ca3af' }}>Expires</span>\r\n <div style={{ fontSize: '13px' }}>\r\n {lic.expiresAt ? new Date(lic.expiresAt).toLocaleDateString() : 'Perpetual'}\r\n </div>\r\n </div>\r\n <div>\r\n <span style={{ fontSize: '11px', color: '#9ca3af' }}>Seats</span>\r\n <div style={{ fontSize: '13px' }}>\r\n {lic.activeSeats} / {lic.maxSeats ?? '∞'}\r\n </div>\r\n </div>\r\n <div>\r\n <span style={{ fontSize: '11px', color: '#9ca3af' }}>Features</span>\r\n <div style={{ fontSize: '13px' }}>{lic.features.length} enabled</div>\r\n </div>\r\n </div>\r\n\r\n {/* Actions */}\r\n <div style={{ display: 'flex', gap: '8px', flexWrap: 'wrap' }}>\r\n {onExtend && lic.status !== 'revoked' && (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onExtend(lic.key, 365);\r\n }}\r\n style={{\r\n padding: '5px 12px',\r\n fontSize: '12px',\r\n border: '1px solid #d1d5db',\r\n borderRadius: '4px',\r\n backgroundColor: '#fff',\r\n cursor: 'pointer',\r\n }}\r\n >\r\n Extend 1 Year\r\n </button>\r\n )}\r\n {onAddSeats && lic.status !== 'revoked' && (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onAddSeats(lic.key, 5);\r\n }}\r\n style={{\r\n padding: '5px 12px',\r\n fontSize: '12px',\r\n border: '1px solid #d1d5db',\r\n borderRadius: '4px',\r\n backgroundColor: '#fff',\r\n cursor: 'pointer',\r\n }}\r\n >\r\n +5 Seats\r\n </button>\r\n )}\r\n {onChangeTier && lic.status !== 'revoked' && (\r\n <select\r\n onClick={(e) => e.stopPropagation()}\r\n onChange={(e) => onChangeTier(lic.key, e.target.value as LicenseTier)}\r\n value={lic.tier}\r\n style={{\r\n padding: '5px 8px',\r\n fontSize: '12px',\r\n border: '1px solid #d1d5db',\r\n borderRadius: '4px',\r\n cursor: 'pointer',\r\n }}\r\n >\r\n <option value=\"trial\">Trial</option>\r\n <option value=\"personal\">Personal</option>\r\n <option value=\"team\">Team</option>\r\n <option value=\"enterprise\">Enterprise</option>\r\n <option value=\"site\">Site</option>\r\n <option value=\"oem\">OEM</option>\r\n </select>\r\n )}\r\n {onRevoke && lic.status !== 'revoked' && (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onRevoke(lic.key);\r\n }}\r\n style={{\r\n padding: '5px 12px',\r\n fontSize: '12px',\r\n color: '#dc2626',\r\n border: '1px solid #fecaca',\r\n borderRadius: '4px',\r\n backgroundColor: '#fff',\r\n cursor: 'pointer',\r\n }}\r\n >\r\n Revoke\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n\r\n {/* Footer */}\r\n <div\r\n style={{\r\n padding: '10px 20px',\r\n borderTop: '1px solid #e5e7eb',\r\n backgroundColor: '#f9fafb',\r\n fontSize: '12px',\r\n color: '#6b7280',\r\n }}\r\n >\r\n {filtered.length} license{filtered.length !== 1 ? 's' : ''}\r\n {search && ` matching \"${search}\"`}\r\n {' · '}\r\n {licenses.filter((l) => l.status === 'valid').length} active\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["result","_a","hasFeature"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nice2dev/licensing",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.14",
|
|
4
4
|
"description": "Nice2Dev Enterprise Licensing System — license key generation, validation, hardware fingerprinting, seat management and feature gating",
|
|
5
5
|
"author": "NiceToDev <contact@nicetodev.com>",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE",
|