@parhelia/core 0.1.12112 → 0.1.12175
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/components/ActionButton.d.ts +1 -1
- package/dist/components/ActionButton.js.map +1 -1
- package/dist/components/ui/button.d.ts +2 -2
- package/dist/components/ui/button.js +1 -0
- package/dist/components/ui/button.js.map +1 -1
- package/dist/components/ui/dialog.js +1 -1
- package/dist/components/ui/dialog.js.map +1 -1
- package/dist/editor/ConcurrentUserLimitDialog.d.ts +11 -0
- package/dist/editor/ConcurrentUserLimitDialog.js +72 -0
- package/dist/editor/ConcurrentUserLimitDialog.js.map +1 -0
- package/dist/editor/ContentTree.js +17 -15
- package/dist/editor/ContentTree.js.map +1 -1
- package/dist/editor/Editor.js +25 -4
- package/dist/editor/Editor.js.map +1 -1
- package/dist/editor/MainLayout.js +1 -1
- package/dist/editor/MainLayout.js.map +1 -1
- package/dist/editor/QuickItemSwitcher.js +21 -21
- package/dist/editor/QuickItemSwitcher.js.map +1 -1
- package/dist/editor/ai/AgentTerminal.js +256 -81
- package/dist/editor/ai/AgentTerminal.js.map +1 -1
- package/dist/editor/ai/AgentTerminalStatusBar.d.ts +1 -3
- package/dist/editor/ai/AgentTerminalStatusBar.js +3 -15
- package/dist/editor/ai/AgentTerminalStatusBar.js.map +1 -1
- package/dist/editor/ai/ContextInfoBar.d.ts +1 -3
- package/dist/editor/ai/ContextInfoBar.js +6 -148
- package/dist/editor/ai/ContextInfoBar.js.map +1 -1
- package/dist/editor/ai/InlineAiTrigger.js +46 -2
- package/dist/editor/ai/InlineAiTrigger.js.map +1 -1
- package/dist/editor/client/AboutDialog.js +4 -2
- package/dist/editor/client/AboutDialog.js.map +1 -1
- package/dist/editor/client/EditorShell.js +30 -5
- package/dist/editor/client/EditorShell.js.map +1 -1
- package/dist/editor/client/hooks/useEditorWebSocket.d.ts +6 -0
- package/dist/editor/client/hooks/useEditorWebSocket.js +80 -3
- package/dist/editor/client/hooks/useEditorWebSocket.js.map +1 -1
- package/dist/editor/field-types/RichTextEditor.js +4 -2
- package/dist/editor/field-types/RichTextEditor.js.map +1 -1
- package/dist/editor/field-types/RichTextEditorComponent.js +37 -3
- package/dist/editor/field-types/RichTextEditorComponent.js.map +1 -1
- package/dist/editor/field-types/richtext/components/ReactSlate.d.ts +2 -0
- package/dist/editor/field-types/richtext/components/ReactSlate.js +15 -2
- package/dist/editor/field-types/richtext/components/ReactSlate.js.map +1 -1
- package/dist/editor/field-types/richtext/contextMenuFactory.d.ts +13 -0
- package/dist/editor/field-types/richtext/contextMenuFactory.js +108 -3
- package/dist/editor/field-types/richtext/contextMenuFactory.js.map +1 -1
- package/dist/editor/field-types/richtext/types.d.ts +1 -0
- package/dist/editor/field-types/richtext/types.js.map +1 -1
- package/dist/editor/media-selector/MediaFolderBrowser.js +1 -1
- package/dist/editor/media-selector/MediaFolderBrowser.js.map +1 -1
- package/dist/editor/menubar/GenericToolbar.js +1 -1
- package/dist/editor/menubar/GenericToolbar.js.map +1 -1
- package/dist/editor/reviews/Comment.js +11 -1
- package/dist/editor/reviews/Comment.js.map +1 -1
- package/dist/editor/reviews/CommentDisplayPopover.js +3 -1
- package/dist/editor/reviews/CommentDisplayPopover.js.map +1 -1
- package/dist/editor/reviews/CreateReviewDetailsStep.d.ts +3 -1
- package/dist/editor/reviews/CreateReviewDetailsStep.js +2 -2
- package/dist/editor/reviews/CreateReviewDetailsStep.js.map +1 -1
- package/dist/editor/reviews/CreateReviewDialog.js +4 -1
- package/dist/editor/reviews/CreateReviewDialog.js.map +1 -1
- package/dist/editor/reviews/EditReviewSettingsDialog.js +6 -4
- package/dist/editor/reviews/EditReviewSettingsDialog.js.map +1 -1
- package/dist/editor/services/contentService.d.ts +1 -1
- package/dist/editor/services/contentService.js +2 -1
- package/dist/editor/services/contentService.js.map +1 -1
- package/dist/editor/services/editService.d.ts +12 -1
- package/dist/editor/services/editService.js +31 -2
- package/dist/editor/services/editService.js.map +1 -1
- package/dist/editor/services/reviewsService.d.ts +1 -1
- package/dist/editor/services/reviewsService.js +2 -1
- package/dist/editor/services/reviewsService.js.map +1 -1
- package/dist/editor/services/serviceHelper.js +38 -0
- package/dist/editor/services/serviceHelper.js.map +1 -1
- package/dist/editor/settings/About.js +260 -3
- package/dist/editor/settings/About.js.map +1 -1
- package/dist/editor/settings/status/coreStatusChecks.js +10 -2
- package/dist/editor/settings/status/coreStatusChecks.js.map +1 -1
- package/dist/editor/ui/SimpleTabs.js +1 -1
- package/dist/editor/ui/SimpleTabs.js.map +1 -1
- package/dist/editor/views/MediaFolderEditView.js +1 -1
- package/dist/editor/views/MediaFolderEditView.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/licensing/EmailEntry.d.ts +6 -0
- package/dist/licensing/EmailEntry.js +30 -0
- package/dist/licensing/EmailEntry.js.map +1 -0
- package/dist/licensing/FeatureGate.d.ts +75 -0
- package/dist/licensing/FeatureGate.js +114 -0
- package/dist/licensing/FeatureGate.js.map +1 -0
- package/dist/licensing/LicenseActivationForm.d.ts +8 -0
- package/dist/licensing/LicenseActivationForm.js +27 -0
- package/dist/licensing/LicenseActivationForm.js.map +1 -0
- package/dist/licensing/LicenseCodeEntry.d.ts +8 -0
- package/dist/licensing/LicenseCodeEntry.js +70 -0
- package/dist/licensing/LicenseCodeEntry.js.map +1 -0
- package/dist/licensing/LicenseContext.d.ts +45 -0
- package/dist/licensing/LicenseContext.js +287 -0
- package/dist/licensing/LicenseContext.js.map +1 -0
- package/dist/licensing/LicenseOverlay.d.ts +1 -0
- package/dist/licensing/LicenseOverlay.js +17 -0
- package/dist/licensing/LicenseOverlay.js.map +1 -0
- package/dist/licensing/index.d.ts +7 -0
- package/dist/licensing/index.js +8 -0
- package/dist/licensing/index.js.map +1 -0
- package/dist/licensing/licenseService.d.ts +28 -0
- package/dist/licensing/licenseService.js +110 -0
- package/dist/licensing/licenseService.js.map +1 -0
- package/dist/licensing/types.d.ts +85 -0
- package/dist/licensing/types.js +12 -0
- package/dist/licensing/types.js.map +1 -0
- package/dist/revision.d.ts +2 -2
- package/dist/revision.js +2 -2
- package/dist/splash-screen/ModernSplashScreen.js +2 -4
- package/dist/splash-screen/ModernSplashScreen.js.map +1 -1
- package/dist/splash-screen/NewPage.js +13 -31
- package/dist/splash-screen/NewPage.js.map +1 -1
- package/dist/splash-screen/ParheliaAssistantChat.js +12 -1
- package/dist/splash-screen/ParheliaAssistantChat.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -60,4 +60,6 @@ export { default as ItemSearch } from "./editor/ui/ItemSearch";
|
|
|
60
60
|
export { default as TreeListSelector } from "./editor/ui/TreeListSelector";
|
|
61
61
|
export { PerfectTree } from "./editor/ui/PerfectTree";
|
|
62
62
|
export { ItemConfigPanel } from "./editor/settings/panels/ItemConfigPanel";
|
|
63
|
+
// Licensing exports
|
|
64
|
+
export { LicenseProvider, useLicense, useLicenseOptional, LicenseOverlay, FeatureGate, useFeature, useLicenseStatus, LicenseBadge, UpgradePrompt, LicenseFeatures, hasFeature, } from "./licensing";
|
|
63
65
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
export function EmailEntry({ onSubmit, error }) {
|
|
5
|
+
const [email, setEmail] = useState("");
|
|
6
|
+
const [isSubmitting, setIsSubmitting] = useState(false);
|
|
7
|
+
const [validationError, setValidationError] = useState();
|
|
8
|
+
const handleSubmit = async (e) => {
|
|
9
|
+
e.preventDefault();
|
|
10
|
+
setValidationError(undefined);
|
|
11
|
+
// Basic validation
|
|
12
|
+
if (!email.trim()) {
|
|
13
|
+
setValidationError("Email address is required");
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
if (!email.includes("@") || !email.includes(".")) {
|
|
17
|
+
setValidationError("Please enter a valid email address");
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
setIsSubmitting(true);
|
|
21
|
+
try {
|
|
22
|
+
await onSubmit(email.trim());
|
|
23
|
+
}
|
|
24
|
+
finally {
|
|
25
|
+
setIsSubmitting(false);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
return (_jsxs("div", { children: [_jsx("h2", { className: "text-xl font-semibold text-white text-center", children: "Activate Your License" }), _jsx("p", { className: "mt-2 text-slate-400 text-center", children: "Enter your email address to get started." }), _jsxs("form", { onSubmit: handleSubmit, className: "mt-6 space-y-4", children: [_jsxs("div", { children: [_jsx("label", { htmlFor: "email", className: "block text-sm font-medium text-slate-300", children: "Email Address" }), _jsx("input", { type: "email", id: "email", "data-testid": "license-email-input", value: email, onChange: (e) => setEmail(e.target.value), className: "mt-1 block w-full rounded-lg border border-slate-600 bg-slate-700/50 px-4 py-3 text-white placeholder-slate-400 focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20", placeholder: "you@company.com", required: true, disabled: isSubmitting, autoFocus: true })] }), (error || validationError) && (_jsx("div", { className: "rounded-lg bg-red-500/10 border border-red-500/20 p-3 text-sm text-red-400", children: validationError || error })), _jsx("button", { type: "submit", disabled: isSubmitting, className: "w-full rounded-lg bg-blue-600 py-3 font-medium text-white transition-all hover:bg-blue-700 disabled:cursor-not-allowed disabled:opacity-50", children: isSubmitting ? (_jsxs("span", { className: "flex items-center justify-center gap-2", children: [_jsxs("svg", { className: "h-5 w-5 animate-spin", viewBox: "0 0 24 24", fill: "none", children: [_jsx("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), _jsx("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" })] }), "Checking..."] })) : ("Continue") })] }), _jsxs("p", { className: "mt-6 text-center text-xs text-slate-500", children: ["By continuing, you agree to our", " ", _jsx("a", { href: "#", className: "text-blue-400 hover:underline", children: "Terms of Service" }), " ", "and", " ", _jsx("a", { href: "#", className: "text-blue-400 hover:underline", children: "Privacy Policy" })] })] }));
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=EmailEntry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmailEntry.js","sourceRoot":"","sources":["../../src/licensing/EmailEntry.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
interface FeatureGateProps {
|
|
3
|
+
/** Feature(s) required to show the children. Can be a string or array of strings. */
|
|
4
|
+
feature: string | string[];
|
|
5
|
+
/** If true, ALL features must be present. If false (default), ANY feature grants access. */
|
|
6
|
+
requireAll?: boolean;
|
|
7
|
+
/** Content to show when the feature is available */
|
|
8
|
+
children: ReactNode;
|
|
9
|
+
/** Optional content to show when the feature is not available */
|
|
10
|
+
fallback?: ReactNode;
|
|
11
|
+
/** If true, shows children even when license context is not available (useful for dev) */
|
|
12
|
+
allowWhenNoContext?: boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Component that conditionally renders children based on license features.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* // Single feature check
|
|
19
|
+
* <FeatureGate feature="ai">
|
|
20
|
+
* <AIAssistantPanel />
|
|
21
|
+
* </FeatureGate>
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* // Multiple features (any)
|
|
25
|
+
* <FeatureGate feature={["ai", "translation"]}>
|
|
26
|
+
* <AdvancedTools />
|
|
27
|
+
* </FeatureGate>
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* // Multiple features (all required)
|
|
31
|
+
* <FeatureGate feature={["ai", "reviews"]} requireAll>
|
|
32
|
+
* <AIReviewsFeature />
|
|
33
|
+
* </FeatureGate>
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* // With fallback
|
|
37
|
+
* <FeatureGate feature="page-wizard" fallback={<UpgradePrompt />}>
|
|
38
|
+
* <PageWizard />
|
|
39
|
+
* </FeatureGate>
|
|
40
|
+
*/
|
|
41
|
+
export declare function FeatureGate({ feature, requireAll, children, fallback, allowWhenNoContext, }: FeatureGateProps): import("react/jsx-runtime").JSX.Element;
|
|
42
|
+
/**
|
|
43
|
+
* Hook to check if a feature is available
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* const canUseAI = useFeature("ai");
|
|
47
|
+
* const canUseAdvanced = useFeature(["ai", "translation"], { requireAll: true });
|
|
48
|
+
*/
|
|
49
|
+
export declare function useFeature(feature: string | string[], options?: {
|
|
50
|
+
requireAll?: boolean;
|
|
51
|
+
}): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Hook to get the current license status for display purposes
|
|
54
|
+
*/
|
|
55
|
+
export declare function useLicenseStatus(): {
|
|
56
|
+
isLicensed: boolean;
|
|
57
|
+
licenseType: "trial" | "purchased" | null;
|
|
58
|
+
features: string[];
|
|
59
|
+
daysRemaining: number | undefined;
|
|
60
|
+
expiresAt: Date | undefined;
|
|
61
|
+
isLoading: boolean;
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Upgrade prompt component shown when a feature is not available
|
|
65
|
+
*/
|
|
66
|
+
interface UpgradePromptProps {
|
|
67
|
+
feature: string;
|
|
68
|
+
className?: string;
|
|
69
|
+
}
|
|
70
|
+
export declare function UpgradePrompt({ feature, className }: UpgradePromptProps): import("react/jsx-runtime").JSX.Element;
|
|
71
|
+
/**
|
|
72
|
+
* Badge showing the current license status
|
|
73
|
+
*/
|
|
74
|
+
export declare function LicenseBadge(): import("react/jsx-runtime").JSX.Element | null;
|
|
75
|
+
export {};
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useLicenseOptional } from "./LicenseContext";
|
|
4
|
+
import { LicenseFeatures } from "./types";
|
|
5
|
+
/**
|
|
6
|
+
* Component that conditionally renders children based on license features.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* // Single feature check
|
|
10
|
+
* <FeatureGate feature="ai">
|
|
11
|
+
* <AIAssistantPanel />
|
|
12
|
+
* </FeatureGate>
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* // Multiple features (any)
|
|
16
|
+
* <FeatureGate feature={["ai", "translation"]}>
|
|
17
|
+
* <AdvancedTools />
|
|
18
|
+
* </FeatureGate>
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* // Multiple features (all required)
|
|
22
|
+
* <FeatureGate feature={["ai", "reviews"]} requireAll>
|
|
23
|
+
* <AIReviewsFeature />
|
|
24
|
+
* </FeatureGate>
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* // With fallback
|
|
28
|
+
* <FeatureGate feature="page-wizard" fallback={<UpgradePrompt />}>
|
|
29
|
+
* <PageWizard />
|
|
30
|
+
* </FeatureGate>
|
|
31
|
+
*/
|
|
32
|
+
export function FeatureGate({ feature, requireAll = false, children, fallback = null, allowWhenNoContext = false, }) {
|
|
33
|
+
const license = useLicenseOptional();
|
|
34
|
+
// If no license context and we allow it, show children
|
|
35
|
+
if (!license && allowWhenNoContext) {
|
|
36
|
+
return _jsx(_Fragment, { children: children });
|
|
37
|
+
}
|
|
38
|
+
// If no license context, don't show gated content
|
|
39
|
+
if (!license) {
|
|
40
|
+
return _jsx(_Fragment, { children: fallback });
|
|
41
|
+
}
|
|
42
|
+
const features = Array.isArray(feature) ? feature : [feature];
|
|
43
|
+
let hasAccess;
|
|
44
|
+
if (requireAll) {
|
|
45
|
+
hasAccess = features.every((f) => license.hasFeature(f));
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
hasAccess = features.some((f) => license.hasFeature(f));
|
|
49
|
+
}
|
|
50
|
+
return _jsx(_Fragment, { children: hasAccess ? children : fallback });
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Hook to check if a feature is available
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* const canUseAI = useFeature("ai");
|
|
57
|
+
* const canUseAdvanced = useFeature(["ai", "translation"], { requireAll: true });
|
|
58
|
+
*/
|
|
59
|
+
export function useFeature(feature, options) {
|
|
60
|
+
const license = useLicenseOptional();
|
|
61
|
+
if (!license) {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
const features = Array.isArray(feature) ? feature : [feature];
|
|
65
|
+
if (options?.requireAll) {
|
|
66
|
+
return features.every((f) => license.hasFeature(f));
|
|
67
|
+
}
|
|
68
|
+
return features.some((f) => license.hasFeature(f));
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Hook to get the current license status for display purposes
|
|
72
|
+
*/
|
|
73
|
+
export function useLicenseStatus() {
|
|
74
|
+
const license = useLicenseOptional();
|
|
75
|
+
return {
|
|
76
|
+
isLicensed: license?.isLicensed ?? false,
|
|
77
|
+
licenseType: license?.licenseType ?? null,
|
|
78
|
+
features: license?.features ?? [],
|
|
79
|
+
daysRemaining: license?.daysRemaining,
|
|
80
|
+
expiresAt: license?.expiresAt,
|
|
81
|
+
isLoading: license?.isLoading ?? true,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export function UpgradePrompt({ feature, className = "" }) {
|
|
85
|
+
const featureNames = {
|
|
86
|
+
[LicenseFeatures.AI]: "AI Assistant",
|
|
87
|
+
[LicenseFeatures.TRANSLATION]: "Translation",
|
|
88
|
+
[LicenseFeatures.PAGE_WIZARD]: "Page Wizard",
|
|
89
|
+
[LicenseFeatures.REVIEWS]: "Reviews & Feedback",
|
|
90
|
+
[LicenseFeatures.FULL]: "Full Access",
|
|
91
|
+
};
|
|
92
|
+
const displayName = featureNames[feature] || feature;
|
|
93
|
+
return (_jsx("div", { className: `rounded-lg border border-amber-200 bg-amber-50 p-4 ${className}`, children: _jsxs("div", { className: "flex items-start gap-3", children: [_jsx("div", { className: "flex-shrink-0", children: _jsx("svg", { className: "h-5 w-5 text-amber-500", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 15v2m0 0v2m0-2h2m-2 0H10m5-6a3 3 0 11-6 0 3 3 0 016 0z" }) }) }), _jsxs("div", { className: "flex-1", children: [_jsxs("h4", { className: "text-sm font-medium text-amber-800", children: [displayName, " requires an upgrade"] }), _jsx("p", { className: "mt-1 text-sm text-amber-700", children: "This feature is not available with your current license. Contact sales to upgrade." })] })] }) }));
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Badge showing the current license status
|
|
97
|
+
*/
|
|
98
|
+
export function LicenseBadge() {
|
|
99
|
+
const { isLicensed, licenseType, daysRemaining, isLoading } = useLicenseStatus();
|
|
100
|
+
if (isLoading) {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
if (!isLicensed) {
|
|
104
|
+
return (_jsx("span", { className: "inline-flex items-center rounded-full bg-red-100 px-2.5 py-0.5 text-xs font-medium text-red-800", children: "Unlicensed" }));
|
|
105
|
+
}
|
|
106
|
+
if (licenseType === "trial") {
|
|
107
|
+
const isExpiringSoon = daysRemaining !== undefined && daysRemaining <= 7;
|
|
108
|
+
return (_jsxs("span", { className: `inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium ${isExpiringSoon
|
|
109
|
+
? "bg-amber-100 text-amber-800"
|
|
110
|
+
: "bg-blue-100 text-blue-800"}`, children: ["Trial", daysRemaining !== undefined ? ` (${daysRemaining}d)` : ""] }));
|
|
111
|
+
}
|
|
112
|
+
return (_jsx("span", { className: "inline-flex items-center rounded-full bg-green-100 px-2.5 py-0.5 text-xs font-medium text-green-800", children: "Licensed" }));
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=FeatureGate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FeatureGate.js","sourceRoot":"","sources":["../../src/licensing/FeatureGate.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
interface LicenseActivationFormProps {
|
|
2
|
+
email: string;
|
|
3
|
+
onSubmit: (email: string, name: string, companyName: string) => Promise<void>;
|
|
4
|
+
onBack?: () => void;
|
|
5
|
+
error?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function LicenseActivationForm({ email, onSubmit, onBack, error, }: LicenseActivationFormProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
export function LicenseActivationForm({ email, onSubmit, onBack, error, }) {
|
|
5
|
+
const [name, setName] = useState("");
|
|
6
|
+
const [companyName, setCompanyName] = useState("");
|
|
7
|
+
const [isSubmitting, setIsSubmitting] = useState(false);
|
|
8
|
+
const [validationError, setValidationError] = useState();
|
|
9
|
+
const handleSubmit = async (e) => {
|
|
10
|
+
e.preventDefault();
|
|
11
|
+
setValidationError(undefined);
|
|
12
|
+
// Basic validation
|
|
13
|
+
if (!name.trim() || !companyName.trim()) {
|
|
14
|
+
setValidationError("All fields are required");
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
setIsSubmitting(true);
|
|
18
|
+
try {
|
|
19
|
+
await onSubmit(email.trim(), name.trim(), companyName.trim());
|
|
20
|
+
}
|
|
21
|
+
finally {
|
|
22
|
+
setIsSubmitting(false);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
return (_jsxs("div", { children: [_jsx("h2", { className: "text-xl font-semibold text-white text-center", children: "Start Your Trial" }), _jsx("p", { className: "mt-2 text-slate-400 text-center", children: "Enter your details to start a free trial." }), _jsxs("p", { className: "mt-1 text-sm text-slate-500 text-center", children: ["Email: ", _jsx("span", { className: "font-medium text-slate-400", children: email })] }), _jsxs("form", { onSubmit: handleSubmit, className: "mt-6 space-y-4", children: [_jsxs("div", { children: [_jsx("label", { htmlFor: "name", className: "block text-sm font-medium text-slate-300", children: "Your Name" }), _jsx("input", { type: "text", id: "name", value: name, onChange: (e) => setName(e.target.value), className: "mt-1 block w-full rounded-lg border border-slate-600 bg-slate-700/50 px-4 py-3 text-white placeholder-slate-400 focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20", placeholder: "John Smith", required: true, disabled: isSubmitting, autoFocus: true })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "company", className: "block text-sm font-medium text-slate-300", children: "Company Name" }), _jsx("input", { type: "text", id: "company", value: companyName, onChange: (e) => setCompanyName(e.target.value), className: "mt-1 block w-full rounded-lg border border-slate-600 bg-slate-700/50 px-4 py-3 text-white placeholder-slate-400 focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20", placeholder: "Acme Corp", required: true, disabled: isSubmitting })] }), (error || validationError) && (_jsx("div", { className: "rounded-lg bg-red-500/10 border border-red-500/20 p-3 text-sm text-red-400", children: validationError || error })), _jsxs("div", { className: "flex gap-3", children: [onBack && (_jsx("button", { type: "button", onClick: onBack, disabled: isSubmitting, className: "flex-1 rounded-lg border border-slate-600 py-3 font-medium text-slate-300 transition-colors hover:bg-slate-700/50 disabled:opacity-50", children: "Back" })), _jsx("button", { type: "submit", disabled: isSubmitting, className: `${onBack ? "flex-1" : "w-full"} rounded-lg bg-blue-600 py-3 font-medium text-white transition-all hover:bg-blue-700 disabled:cursor-not-allowed disabled:opacity-50`, children: isSubmitting ? (_jsxs("span", { className: "flex items-center justify-center gap-2", children: [_jsxs("svg", { className: "h-5 w-5 animate-spin", viewBox: "0 0 24 24", fill: "none", children: [_jsx("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), _jsx("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" })] }), "Processing..."] })) : ("Start Trial") })] })] }), _jsxs("p", { className: "mt-6 text-center text-xs text-slate-500", children: ["By continuing, you agree to our", " ", _jsx("a", { href: "#", className: "text-blue-400 hover:underline", children: "Terms of Service" }), " ", "and", " ", _jsx("a", { href: "#", className: "text-blue-400 hover:underline", children: "Privacy Policy" })] })] }));
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=LicenseActivationForm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LicenseActivationForm.js","sourceRoot":"","sources":["../../src/licensing/LicenseActivationForm.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
interface LicenseCodeEntryProps {
|
|
2
|
+
email: string;
|
|
3
|
+
onSubmit: (code: string) => Promise<void>;
|
|
4
|
+
onBack: () => void;
|
|
5
|
+
error?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function LicenseCodeEntry({ email, onSubmit, onBack, error, }: LicenseCodeEntryProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState, useRef, useEffect } from "react";
|
|
4
|
+
export function LicenseCodeEntry({ email, onSubmit, onBack, error, }) {
|
|
5
|
+
const [code, setCode] = useState(["", "", "", "", "", ""]);
|
|
6
|
+
const [isSubmitting, setIsSubmitting] = useState(false);
|
|
7
|
+
const inputRefs = useRef([]);
|
|
8
|
+
// Focus first input on mount
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
inputRefs.current[0]?.focus();
|
|
11
|
+
}, []);
|
|
12
|
+
const handleChange = (index, value) => {
|
|
13
|
+
// Only allow digits
|
|
14
|
+
const digit = value.replace(/\D/g, "").slice(-1);
|
|
15
|
+
const newCode = [...code];
|
|
16
|
+
newCode[index] = digit;
|
|
17
|
+
setCode(newCode);
|
|
18
|
+
// Auto-focus next input
|
|
19
|
+
if (digit && index < 5) {
|
|
20
|
+
inputRefs.current[index + 1]?.focus();
|
|
21
|
+
}
|
|
22
|
+
// Auto-submit when all digits entered
|
|
23
|
+
if (digit && index === 5) {
|
|
24
|
+
const fullCode = newCode.join("");
|
|
25
|
+
if (fullCode.length === 6) {
|
|
26
|
+
handleSubmit(fullCode);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
const handleKeyDown = (index, e) => {
|
|
31
|
+
if (e.key === "Backspace" && !code[index] && index > 0) {
|
|
32
|
+
// Move to previous input on backspace if current is empty
|
|
33
|
+
inputRefs.current[index - 1]?.focus();
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
const handlePaste = (e) => {
|
|
37
|
+
e.preventDefault();
|
|
38
|
+
const pastedData = e.clipboardData.getData("text").replace(/\D/g, "").slice(0, 6);
|
|
39
|
+
if (pastedData) {
|
|
40
|
+
const newCode = [...code];
|
|
41
|
+
for (let i = 0; i < pastedData.length && i < 6; i++) {
|
|
42
|
+
newCode[i] = pastedData.charAt(i);
|
|
43
|
+
}
|
|
44
|
+
setCode(newCode);
|
|
45
|
+
// Focus appropriate input
|
|
46
|
+
const nextEmptyIndex = Math.min(pastedData.length, 5);
|
|
47
|
+
inputRefs.current[nextEmptyIndex]?.focus();
|
|
48
|
+
// Auto-submit if complete
|
|
49
|
+
if (pastedData.length === 6) {
|
|
50
|
+
handleSubmit(pastedData);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
const handleSubmit = async (fullCode) => {
|
|
55
|
+
const codeToSubmit = fullCode || code.join("");
|
|
56
|
+
if (codeToSubmit.length !== 6)
|
|
57
|
+
return;
|
|
58
|
+
setIsSubmitting(true);
|
|
59
|
+
try {
|
|
60
|
+
await onSubmit(codeToSubmit);
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
setIsSubmitting(false);
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
return (_jsxs("div", { "data-testid": "license-code-entry", children: [_jsx("h2", { className: "text-xl font-semibold text-white text-center", children: "Enter Activation Code" }), _jsxs("p", { className: "mt-2 text-slate-400 text-center", children: ["We've sent a 6-digit code to", " ", _jsx("span", { className: "font-medium text-white", children: email })] }), _jsx("div", { className: "mt-8 flex justify-center gap-2", "data-testid": "license-code-inputs", children: code.map((digit, index) => (_jsx("input", { ref: (el) => {
|
|
67
|
+
inputRefs.current[index] = el;
|
|
68
|
+
}, type: "text", inputMode: "numeric", maxLength: 1, "data-testid": index === 0 ? "license-code-input-0" : undefined, value: digit, onChange: (e) => handleChange(index, e.target.value), onKeyDown: (e) => handleKeyDown(index, e), onPaste: handlePaste, disabled: isSubmitting, className: "h-14 w-12 rounded-lg border border-slate-600 bg-slate-700/50 text-center text-2xl font-bold text-white focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20 disabled:opacity-50" }, index))) }), error && (_jsx("div", { className: "mt-4 rounded-lg bg-red-500/10 border border-red-500/20 p-3 text-sm text-red-400 text-center", children: error })), _jsxs("p", { className: "mt-6 text-center text-sm text-slate-500", children: ["Didn't receive the code?", " ", _jsx("button", { onClick: onBack, disabled: isSubmitting, className: "text-blue-400 hover:underline disabled:opacity-50", children: "Try again" })] }), _jsxs("div", { className: "mt-6 flex gap-3", children: [_jsx("button", { onClick: onBack, disabled: isSubmitting, className: "flex-1 rounded-lg border border-slate-600 py-3 font-medium text-slate-300 transition-colors hover:bg-slate-700/50 disabled:opacity-50", children: "Back" }), _jsx("button", { onClick: () => handleSubmit(), disabled: isSubmitting || code.join("").length !== 6, className: "flex-1 rounded-lg bg-blue-600 py-3 font-medium text-white transition-all hover:bg-blue-700 disabled:cursor-not-allowed disabled:opacity-50", children: isSubmitting ? (_jsxs("span", { className: "flex items-center justify-center gap-2", children: [_jsxs("svg", { className: "h-5 w-5 animate-spin", viewBox: "0 0 24 24", fill: "none", children: [_jsx("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), _jsx("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" })] }), "Verifying..."] })) : ("Verify") })] })] }));
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=LicenseCodeEntry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LicenseCodeEntry.js","sourceRoot":"","sources":["../../src/licensing/LicenseCodeEntry.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
import type { LicenseStatus, ActivationState } from "./types";
|
|
3
|
+
interface LicenseContextValue {
|
|
4
|
+
/** Current license status from the backend */
|
|
5
|
+
licenseStatus: LicenseStatus | null;
|
|
6
|
+
/** Whether we're currently loading license status */
|
|
7
|
+
isLoading: boolean;
|
|
8
|
+
/** Whether the license is valid (trial or purchased) */
|
|
9
|
+
isLicensed: boolean;
|
|
10
|
+
/** License type if licensed */
|
|
11
|
+
licenseType: "trial" | "purchased" | null;
|
|
12
|
+
/** Available features */
|
|
13
|
+
features: string[];
|
|
14
|
+
/** Check if a specific feature is available */
|
|
15
|
+
hasFeature: (feature: string) => boolean;
|
|
16
|
+
/** Days remaining for trial licenses */
|
|
17
|
+
daysRemaining?: number;
|
|
18
|
+
/** Expiration date */
|
|
19
|
+
expiresAt?: Date;
|
|
20
|
+
/** Current activation flow state */
|
|
21
|
+
activationState: ActivationState;
|
|
22
|
+
/** Error message if any */
|
|
23
|
+
error?: string;
|
|
24
|
+
/** Start the activation flow */
|
|
25
|
+
startActivation: () => void;
|
|
26
|
+
/** Check email and determine next step */
|
|
27
|
+
checkEmail: (email: string) => Promise<void>;
|
|
28
|
+
/** Submit license request form (for trial) */
|
|
29
|
+
submitLicenseRequest: (email: string, name: string, companyName: string) => Promise<void>;
|
|
30
|
+
/** Submit activation code */
|
|
31
|
+
submitActivationCode: (code: string) => Promise<void>;
|
|
32
|
+
/** Refresh license status */
|
|
33
|
+
refreshLicenseStatus: () => Promise<void>;
|
|
34
|
+
/** Close the activation overlay */
|
|
35
|
+
closeActivation: () => void;
|
|
36
|
+
/** Email used in the activation flow */
|
|
37
|
+
activationEmail?: string;
|
|
38
|
+
}
|
|
39
|
+
export declare function useLicense(): LicenseContextValue;
|
|
40
|
+
export declare function useLicenseOptional(): LicenseContextValue | null;
|
|
41
|
+
interface LicenseProviderProps {
|
|
42
|
+
children: ReactNode;
|
|
43
|
+
}
|
|
44
|
+
export declare function LicenseProvider({ children, }: LicenseProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
45
|
+
export {};
|