shared-features 0.0.8 → 0.1.1
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/README.md +205 -2
- package/dist/{admin-notifications-D9n9h-eY.cjs → admin-notifications-CLzQc8zF.cjs} +20 -20
- package/dist/{admin-notifications-D9n9h-eY.cjs.map → admin-notifications-CLzQc8zF.cjs.map} +1 -1
- package/dist/{admin-notifications-p1dy3zIP.js → admin-notifications-C_7ReIMi.js} +13 -13
- package/dist/{admin-notifications-p1dy3zIP.js.map → admin-notifications-C_7ReIMi.js.map} +1 -1
- package/dist/{broadcasts-3_WfQMNL.cjs → broadcasts-6w_9X92Z.cjs} +10 -10
- package/dist/{broadcasts-3_WfQMNL.cjs.map → broadcasts-6w_9X92Z.cjs.map} +1 -1
- package/dist/{broadcasts-DgZUzqMf.js → broadcasts-CK4sGMz4.js} +12 -12
- package/dist/{broadcasts-DgZUzqMf.js.map → broadcasts-CK4sGMz4.js.map} +1 -1
- package/dist/commonFeatures-CaqcEOik.js +1255 -0
- package/dist/commonFeatures-CaqcEOik.js.map +1 -0
- package/dist/commonFeatures-DhWaBEv_.cjs +222 -0
- package/dist/commonFeatures-DhWaBEv_.cjs.map +1 -0
- package/dist/commonFeatures-XJ9fuxg_.js +223 -0
- package/dist/commonFeatures-XJ9fuxg_.js.map +1 -0
- package/dist/commonFeatures-ofZOjnZ0.cjs +1276 -0
- package/dist/commonFeatures-ofZOjnZ0.cjs.map +1 -0
- package/dist/components/common/index.d.ts +60 -0
- package/dist/components/common/index.d.ts.map +1 -0
- package/dist/components/index.cjs +31 -23
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +21 -13
- package/dist/firebase/config.d.ts +34 -0
- package/dist/firebase/config.d.ts.map +1 -1
- package/dist/hooks/index.cjs +26 -13
- package/dist/hooks/index.cjs.map +1 -1
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +24 -11
- package/dist/hooks/useCommonFeatures.d.ts +102 -0
- package/dist/hooks/useCommonFeatures.d.ts.map +1 -0
- package/dist/hooks/useFeatureFlags.d.ts +134 -0
- package/dist/hooks/useFeatureFlags.d.ts.map +1 -0
- package/dist/{AnnouncementModal-sxH4K5gy.js → index-BeNmzbTD.js} +212 -17
- package/dist/index-BeNmzbTD.js.map +1 -0
- package/dist/{AnnouncementModal-Bqy0pn3V.cjs → index-DB40ObYe.cjs} +209 -14
- package/dist/index-DB40ObYe.cjs.map +1 -0
- package/dist/index.cjs +127 -60
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +10 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +175 -108
- package/dist/index.js.map +1 -1
- package/dist/notifications/index.js +14 -14
- package/dist/services/commonFeatures.d.ts +25 -0
- package/dist/services/commonFeatures.d.ts.map +1 -0
- package/dist/services/featureFlags.d.ts +71 -0
- package/dist/services/featureFlags.d.ts.map +1 -0
- package/dist/services/index.cjs +49 -17
- package/dist/services/index.cjs.map +1 -1
- package/dist/services/index.d.ts +2 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +75 -43
- package/dist/services/index.js.map +1 -1
- package/dist/types/commonFeatures.d.ts +232 -0
- package/dist/types/commonFeatures.d.ts.map +1 -0
- package/dist/types/featureFlags.d.ts +203 -0
- package/dist/types/featureFlags.d.ts.map +1 -0
- package/dist/types/index.cjs +17 -0
- package/dist/types/index.cjs.map +1 -1
- package/dist/types/index.d.ts +3 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +17 -0
- package/dist/types/index.js.map +1 -1
- package/dist/useCommonFeatures-0EU_VRqi.cjs +488 -0
- package/dist/useCommonFeatures-0EU_VRqi.cjs.map +1 -0
- package/dist/useCommonFeatures-DP2YyB7m.js +489 -0
- package/dist/useCommonFeatures-DP2YyB7m.js.map +1 -0
- package/dist/useFeatureFlags-DHnOm0sA.js +368 -0
- package/dist/useFeatureFlags-DHnOm0sA.js.map +1 -0
- package/dist/useFeatureFlags-DRR1r3rt.cjs +367 -0
- package/dist/useFeatureFlags-DRR1r3rt.cjs.map +1 -0
- package/dist/{useNotificationEvents-D8DVxah1.js → useNotificationEvents-DAmR7FYF.js} +14 -14
- package/dist/{useNotificationEvents-D8DVxah1.js.map → useNotificationEvents-DAmR7FYF.js.map} +1 -1
- package/package.json +15 -8
- package/dist/AnnouncementModal-Bqy0pn3V.cjs.map +0 -1
- package/dist/AnnouncementModal-sxH4K5gy.js.map +0 -1
- package/dist/analytics-40-S_fHC.js +0 -440
- package/dist/analytics-40-S_fHC.js.map +0 -1
- package/dist/analytics-lEzOx2vl.cjs +0 -461
- package/dist/analytics-lEzOx2vl.cjs.map +0 -1
- package/dist/useBroadcasts-DzpCcbC8.js +0 -161
- package/dist/useBroadcasts-DzpCcbC8.js.map +0 -1
- package/dist/useBroadcasts-FP6ZrcY_.cjs +0 -160
- package/dist/useBroadcasts-FP6ZrcY_.cjs.map +0 -1
- package/dist/useCampaigns-BOZ9dDsG.cjs +0 -152
- package/dist/useCampaigns-BOZ9dDsG.cjs.map +0 -1
- package/dist/useCampaigns-D46b9zuf.js +0 -153
- package/dist/useCampaigns-D46b9zuf.js.map +0 -1
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { ContactInfo, DeveloperInfo, AddressInfo, SocialLink, PaymentOption, Service, Skill, Testimonial, Project, UseCommonFeatureOptions, UseCommonFeatureResult, UseCommonFeaturesListResult, FetchSocialLinksOptions, FetchServicesOptions, FetchSkillsOptions, FetchTestimonialsOptions, FetchPaymentOptionsOptions, FetchProjectsOptions } from '../types/commonFeatures';
|
|
2
|
+
/**
|
|
3
|
+
* Hook to fetch contact information
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```tsx
|
|
7
|
+
* const { data: contact, loading } = useContactInfo();
|
|
8
|
+
*
|
|
9
|
+
* if (loading) return <Spinner />;
|
|
10
|
+
* if (!contact) return null;
|
|
11
|
+
*
|
|
12
|
+
* return <a href={`mailto:${contact.email}`}>{contact.email}</a>;
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export declare function useContactInfo(options?: UseCommonFeatureOptions): UseCommonFeatureResult<ContactInfo>;
|
|
16
|
+
/**
|
|
17
|
+
* Hook to fetch developer information
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```tsx
|
|
21
|
+
* const { data: developer, loading } = useDeveloperInfo();
|
|
22
|
+
*
|
|
23
|
+
* if (loading) return <Spinner />;
|
|
24
|
+
* if (!developer) return null;
|
|
25
|
+
*
|
|
26
|
+
* return (
|
|
27
|
+
* <div>
|
|
28
|
+
* <h1>{developer.name}</h1>
|
|
29
|
+
* <p>{developer.title}</p>
|
|
30
|
+
* </div>
|
|
31
|
+
* );
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare function useDeveloperInfo(options?: UseCommonFeatureOptions): UseCommonFeatureResult<DeveloperInfo>;
|
|
35
|
+
/**
|
|
36
|
+
* Hook to fetch address information
|
|
37
|
+
*/
|
|
38
|
+
export declare function useAddressInfo(options?: UseCommonFeatureOptions): UseCommonFeatureResult<AddressInfo>;
|
|
39
|
+
/**
|
|
40
|
+
* Hook to fetch social links
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```tsx
|
|
44
|
+
* const { data: links, loading } = useSocialLinks({ showIn: ['footer'] });
|
|
45
|
+
*
|
|
46
|
+
* if (loading) return <Spinner />;
|
|
47
|
+
*
|
|
48
|
+
* return (
|
|
49
|
+
* <div>
|
|
50
|
+
* {links.map(link => (
|
|
51
|
+
* <a key={link.id} href={link.url}>{link.platform}</a>
|
|
52
|
+
* ))}
|
|
53
|
+
* </div>
|
|
54
|
+
* );
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
export declare function useSocialLinks(options?: FetchSocialLinksOptions & UseCommonFeatureOptions): UseCommonFeaturesListResult<SocialLink>;
|
|
58
|
+
/**
|
|
59
|
+
* Hook to fetch payment options
|
|
60
|
+
*/
|
|
61
|
+
export declare function usePaymentOptions(options?: FetchPaymentOptionsOptions & UseCommonFeatureOptions): UseCommonFeaturesListResult<PaymentOption>;
|
|
62
|
+
/**
|
|
63
|
+
* Hook to fetch services
|
|
64
|
+
*/
|
|
65
|
+
export declare function useServices(options?: FetchServicesOptions & UseCommonFeatureOptions): UseCommonFeaturesListResult<Service>;
|
|
66
|
+
/**
|
|
67
|
+
* Hook to fetch skills
|
|
68
|
+
*/
|
|
69
|
+
export declare function useSkills(options?: FetchSkillsOptions & UseCommonFeatureOptions): UseCommonFeaturesListResult<Skill>;
|
|
70
|
+
/**
|
|
71
|
+
* Hook to fetch testimonials
|
|
72
|
+
*/
|
|
73
|
+
export declare function useTestimonials(options?: FetchTestimonialsOptions & UseCommonFeatureOptions): UseCommonFeaturesListResult<Testimonial>;
|
|
74
|
+
/**
|
|
75
|
+
* Hook to fetch projects
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```tsx
|
|
79
|
+
* const { data: projects, loading } = useProjects({ featuredOnly: true });
|
|
80
|
+
*
|
|
81
|
+
* if (loading) return <Spinner />;
|
|
82
|
+
*
|
|
83
|
+
* return (
|
|
84
|
+
* <div>
|
|
85
|
+
* {projects.map(project => (
|
|
86
|
+
* <div key={project.id}>
|
|
87
|
+
* <h2>{project.title}</h2>
|
|
88
|
+
* <p>{project.description}</p>
|
|
89
|
+
* </div>
|
|
90
|
+
* ))}
|
|
91
|
+
* </div>
|
|
92
|
+
* );
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
95
|
+
export declare function useProjects(options?: FetchProjectsOptions & UseCommonFeatureOptions): UseCommonFeaturesListResult<Project>;
|
|
96
|
+
/**
|
|
97
|
+
* Hook to fetch a single project by slug
|
|
98
|
+
*/
|
|
99
|
+
export declare function useProject(slug: string, options?: {
|
|
100
|
+
autoFetch?: boolean;
|
|
101
|
+
}): UseCommonFeatureResult<Project>;
|
|
102
|
+
//# sourceMappingURL=useCommonFeatures.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCommonFeatures.d.ts","sourceRoot":"","sources":["../../src/hooks/useCommonFeatures.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA2BH,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACb,WAAW,EACX,UAAU,EACV,aAAa,EACb,OAAO,EACP,KAAK,EACL,WAAW,EACX,OAAO,EACP,uBAAuB,EACvB,sBAAsB,EACtB,2BAA2B,EAC3B,uBAAuB,EACvB,oBAAoB,EACpB,kBAAkB,EAClB,wBAAwB,EACxB,0BAA0B,EAC1B,oBAAoB,EACrB,MAAM,yBAAyB,CAAC;AAMjC;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAC5B,OAAO,GAAE,uBAA4B,GACpC,sBAAsB,CAAC,WAAW,CAAC,CA2DrC;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,GAAE,uBAA4B,GACpC,sBAAsB,CAAC,aAAa,CAAC,CA2DvC;AAMD;;GAEG;AACH,wBAAgB,cAAc,CAC5B,OAAO,GAAE,uBAA4B,GACpC,sBAAsB,CAAC,WAAW,CAAC,CA4CrC;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,CAC5B,OAAO,GAAE,uBAAuB,GAAG,uBAA4B,GAC9D,2BAA2B,CAAC,UAAU,CAAC,CA4CzC;AAMD;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,GAAE,0BAA0B,GAAG,uBAA4B,GACjE,2BAA2B,CAAC,aAAa,CAAC,CA4C5C;AAMD;;GAEG;AACH,wBAAgB,WAAW,CACzB,OAAO,GAAE,oBAAoB,GAAG,uBAA4B,GAC3D,2BAA2B,CAAC,OAAO,CAAC,CA4CtC;AAMD;;GAEG;AACH,wBAAgB,SAAS,CACvB,OAAO,GAAE,kBAAkB,GAAG,uBAA4B,GACzD,2BAA2B,CAAC,KAAK,CAAC,CA4CpC;AAMD;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,GAAE,wBAAwB,GAAG,uBAA4B,GAC/D,2BAA2B,CAAC,WAAW,CAAC,CA4C1C;AAMD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,WAAW,CACzB,OAAO,GAAE,oBAAoB,GAAG,uBAA4B,GAC3D,2BAA2B,CAAC,OAAO,CAAC,CA4CtC;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GACpC,sBAAsB,CAAC,OAAO,CAAC,CAiDjC"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { FeatureId, FeatureAvailability, SharedFeaturesStatus, UseFeatureFlagsOptions, UseFeatureFlagsResult } from '../types/featureFlags';
|
|
2
|
+
/**
|
|
3
|
+
* Hook to fetch and monitor feature flags
|
|
4
|
+
*
|
|
5
|
+
* @param options - Hook options
|
|
6
|
+
* @returns Feature flags status and utilities
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```tsx
|
|
10
|
+
* const {
|
|
11
|
+
* status,
|
|
12
|
+
* loading,
|
|
13
|
+
* isFeatureAvailable,
|
|
14
|
+
* hasDeprecatedFeatures
|
|
15
|
+
* } = useFeatureFlags();
|
|
16
|
+
*
|
|
17
|
+
* if (loading) return <Spinner />;
|
|
18
|
+
*
|
|
19
|
+
* if (!status?.operational) {
|
|
20
|
+
* return <MaintenancePage message={status?.maintenanceMessage} />;
|
|
21
|
+
* }
|
|
22
|
+
*
|
|
23
|
+
* if (isFeatureAvailable('contactInfo')) {
|
|
24
|
+
* return <ContactInfo />;
|
|
25
|
+
* }
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare function useFeatureFlags(options?: UseFeatureFlagsOptions): UseFeatureFlagsResult;
|
|
29
|
+
/**
|
|
30
|
+
* Hook to check a single feature's availability
|
|
31
|
+
*
|
|
32
|
+
* @param featureId - The feature to check
|
|
33
|
+
* @returns Feature availability and loading state
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```tsx
|
|
37
|
+
* const { available, loading, deprecated } = useFeature('contactInfo');
|
|
38
|
+
*
|
|
39
|
+
* if (loading) return <Spinner />;
|
|
40
|
+
* if (!available) return null;
|
|
41
|
+
*
|
|
42
|
+
* return <ContactInfo />;
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export declare function useFeature(featureId: FeatureId): {
|
|
46
|
+
/** Whether the feature is available */
|
|
47
|
+
available: boolean;
|
|
48
|
+
/** Whether the check is in progress */
|
|
49
|
+
loading: boolean;
|
|
50
|
+
/** Full availability details */
|
|
51
|
+
availability: FeatureAvailability | null;
|
|
52
|
+
/** Whether the feature is enabled (but might need upgrade) */
|
|
53
|
+
enabled: boolean;
|
|
54
|
+
/** Whether using a deprecated version */
|
|
55
|
+
deprecated: boolean;
|
|
56
|
+
/** Whether an upgrade is required */
|
|
57
|
+
upgradeRequired: boolean;
|
|
58
|
+
/** Deprecation warning if applicable */
|
|
59
|
+
deprecationWarning: string | undefined;
|
|
60
|
+
/** Reason feature is unavailable */
|
|
61
|
+
unavailableReason: string | undefined;
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Hook to subscribe to real-time feature flag updates
|
|
65
|
+
*
|
|
66
|
+
* @param callback - Function to call when flags change
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```tsx
|
|
70
|
+
* useFeatureFlagsSubscription((flags) => {
|
|
71
|
+
* if (flags?.maintenanceMode) {
|
|
72
|
+
* showMaintenanceBanner();
|
|
73
|
+
* }
|
|
74
|
+
* });
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
export declare function useFeatureFlagsSubscription(callback: (status: SharedFeaturesStatus | null) => void): void;
|
|
78
|
+
/**
|
|
79
|
+
* Hook to check if shared-features is operational
|
|
80
|
+
*
|
|
81
|
+
* @returns Whether shared-features is operational
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* ```tsx
|
|
85
|
+
* const { operational, maintenanceMessage } = useSharedFeaturesOperational();
|
|
86
|
+
*
|
|
87
|
+
* if (!operational) {
|
|
88
|
+
* return <MaintenancePage message={maintenanceMessage} />;
|
|
89
|
+
* }
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
export declare function useSharedFeaturesOperational(): {
|
|
93
|
+
/** Whether shared-features is operational */
|
|
94
|
+
operational: boolean;
|
|
95
|
+
/** Whether check is in progress */
|
|
96
|
+
loading: boolean;
|
|
97
|
+
/** Maintenance message if in maintenance mode */
|
|
98
|
+
maintenanceMessage: string | undefined;
|
|
99
|
+
/** Whether in maintenance mode */
|
|
100
|
+
maintenanceMode: boolean;
|
|
101
|
+
/** Current API version */
|
|
102
|
+
apiVersion: string;
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* Hook for conditional rendering based on feature availability
|
|
106
|
+
*
|
|
107
|
+
* @param featureId - The feature to check
|
|
108
|
+
* @returns Object with show/hide helpers
|
|
109
|
+
*
|
|
110
|
+
* @example
|
|
111
|
+
* ```tsx
|
|
112
|
+
* const { shouldRender, FallbackOrChildren } = useFeatureGate('contactInfo');
|
|
113
|
+
*
|
|
114
|
+
* return (
|
|
115
|
+
* <FallbackOrChildren fallback={<OldContactInfo />}>
|
|
116
|
+
* <NewContactInfo />
|
|
117
|
+
* </FallbackOrChildren>
|
|
118
|
+
* );
|
|
119
|
+
* ```
|
|
120
|
+
*/
|
|
121
|
+
export declare function useFeatureGate(featureId: FeatureId): {
|
|
122
|
+
/** Whether the feature should be rendered */
|
|
123
|
+
shouldRender: boolean;
|
|
124
|
+
/** Whether still checking availability */
|
|
125
|
+
loading: boolean;
|
|
126
|
+
/** Whether using deprecated version */
|
|
127
|
+
deprecated: boolean;
|
|
128
|
+
/** Component that renders children if available, fallback otherwise */
|
|
129
|
+
FallbackOrChildren: ({ children, fallback, }: {
|
|
130
|
+
children: React.ReactNode;
|
|
131
|
+
fallback?: React.ReactNode;
|
|
132
|
+
}) => import('react').ReactNode;
|
|
133
|
+
};
|
|
134
|
+
//# sourceMappingURL=useFeatureFlags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFeatureFlags.d.ts","sourceRoot":"","sources":["../../src/hooks/useFeatureFlags.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH,OAAO,KAAK,EACV,SAAS,EACT,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EAEtB,MAAM,uBAAuB,CAAC;AAE/B;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,eAAe,CAC7B,OAAO,GAAE,sBAA2B,GACnC,qBAAqB,CAkHvB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,SAAS;IA6C3C,uCAAuC;;IAEvC,uCAAuC;;IAEvC,gCAAgC;;IAEhC,8DAA8D;;IAE9D,yCAAyC;;IAEzC,qCAAqC;;IAErC,wCAAwC;;IAExC,oCAAoC;;EAGvC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI,KAAK,IAAI,QAuBxD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,4BAA4B;IAIxC,6CAA6C;;IAE7C,mCAAmC;;IAEnC,iDAAiD;;IAEjD,kCAAkC;;IAElC,0BAA0B;;EAG7B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,SAAS;IAY/C,6CAA6C;;IAE7C,0CAA0C;;IAE1C,uCAAuC;;IAEvC,uEAAuE;kDAKlE;QACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;QAC1B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;KAC5B;EAON"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { jsxs, jsx, Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { useRef, useEffect, useCallback, useState } from "react";
|
|
3
|
-
import { Box, IconButton, Flex, Text, Button, Card,
|
|
3
|
+
import { Box, IconButton, Flex, Text, Button, Card, Badge, Link, Dialog, Heading, Checkbox, Grid, Separator, Avatar } from "@radix-ui/themes";
|
|
4
4
|
import { Cross2Icon } from "@radix-ui/react-icons";
|
|
5
|
-
import { a as useCampaign,
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
5
|
+
import { a as useCampaign, e as useOneTimeAdModal, k as useUpdateAdModal, b as useCampaigns, u as useAddressInfo, c as useContactInfo, d as useDeveloperInfo, g as useServices, h as useSkills, i as useSocialLinks, j as useTestimonials } from "./useCommonFeatures-DP2YyB7m.js";
|
|
6
|
+
import { Sparkles, X, ExternalLink, Check, Gift, Play, Quote, ChevronLeft, ChevronRight, Megaphone, CheckCircle, AlertTriangle, AlertCircle, Info, Bell, MapPin, Mail, Phone, MessageCircle, Globe, Github, Linkedin, Briefcase, Star, Code, Twitter } from "lucide-react";
|
|
7
|
+
import { O as isInitialized, B as getConfig } from "./commonFeatures-CaqcEOik.js";
|
|
8
8
|
function AdPanel({
|
|
9
9
|
placement,
|
|
10
10
|
variant: _variant = "small_panel_2",
|
|
@@ -1829,11 +1829,199 @@ function AnnouncementModal({
|
|
|
1829
1829
|
}
|
|
1830
1830
|
) });
|
|
1831
1831
|
}
|
|
1832
|
+
const socialIcons = {
|
|
1833
|
+
github: /* @__PURE__ */ jsx(Github, { size: 18 }),
|
|
1834
|
+
linkedin: /* @__PURE__ */ jsx(Linkedin, { size: 18 }),
|
|
1835
|
+
twitter: /* @__PURE__ */ jsx(Twitter, { size: 18 }),
|
|
1836
|
+
facebook: /* @__PURE__ */ jsx(Globe, { size: 18 }),
|
|
1837
|
+
instagram: /* @__PURE__ */ jsx(Globe, { size: 18 }),
|
|
1838
|
+
youtube: /* @__PURE__ */ jsx(Globe, { size: 18 }),
|
|
1839
|
+
tiktok: /* @__PURE__ */ jsx(Globe, { size: 18 }),
|
|
1840
|
+
discord: /* @__PURE__ */ jsx(MessageCircle, { size: 18 }),
|
|
1841
|
+
telegram: /* @__PURE__ */ jsx(MessageCircle, { size: 18 }),
|
|
1842
|
+
whatsapp: /* @__PURE__ */ jsx(MessageCircle, { size: 18 }),
|
|
1843
|
+
medium: /* @__PURE__ */ jsx(Globe, { size: 18 }),
|
|
1844
|
+
devto: /* @__PURE__ */ jsx(Code, { size: 18 }),
|
|
1845
|
+
stackoverflow: /* @__PURE__ */ jsx(Code, { size: 18 }),
|
|
1846
|
+
dribbble: /* @__PURE__ */ jsx(Globe, { size: 18 }),
|
|
1847
|
+
behance: /* @__PURE__ */ jsx(Globe, { size: 18 }),
|
|
1848
|
+
codepen: /* @__PURE__ */ jsx(Code, { size: 18 }),
|
|
1849
|
+
npm: /* @__PURE__ */ jsx(Code, { size: 18 }),
|
|
1850
|
+
website: /* @__PURE__ */ jsx(Globe, { size: 18 }),
|
|
1851
|
+
email: /* @__PURE__ */ jsx(Mail, { size: 18 }),
|
|
1852
|
+
other: /* @__PURE__ */ jsx(ExternalLink, { size: 18 })
|
|
1853
|
+
};
|
|
1854
|
+
function ContactCard({ data: propData, compact = false, showFreelance = true }) {
|
|
1855
|
+
const { data: hookData, loading } = useContactInfo({ autoFetch: !propData });
|
|
1856
|
+
const data = propData ?? hookData;
|
|
1857
|
+
if (loading) return /* @__PURE__ */ jsx(ContactCardSkeleton, {});
|
|
1858
|
+
if (!data) return null;
|
|
1859
|
+
return /* @__PURE__ */ jsx(Card, { size: compact ? "1" : "2", children: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "3", children: [
|
|
1860
|
+
/* @__PURE__ */ jsx(Text, { size: "3", weight: "bold", children: "Contact" }),
|
|
1861
|
+
showFreelance && data.freelanceAvailable && /* @__PURE__ */ jsx(Badge, { color: "green", size: "1", children: "Available for Freelance" }),
|
|
1862
|
+
/* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "2", children: [
|
|
1863
|
+
data.email && /* @__PURE__ */ jsx(Link, { href: `mailto:${data.email}`, size: "2", children: /* @__PURE__ */ jsxs(Flex, { align: "center", gap: "2", children: [
|
|
1864
|
+
/* @__PURE__ */ jsx(Mail, { size: 16 }),
|
|
1865
|
+
/* @__PURE__ */ jsx(Text, { children: data.email })
|
|
1866
|
+
] }) }),
|
|
1867
|
+
data.phone && /* @__PURE__ */ jsx(Link, { href: `tel:${data.phone}`, size: "2", children: /* @__PURE__ */ jsxs(Flex, { align: "center", gap: "2", children: [
|
|
1868
|
+
/* @__PURE__ */ jsx(Phone, { size: 16 }),
|
|
1869
|
+
/* @__PURE__ */ jsx(Text, { children: data.phone })
|
|
1870
|
+
] }) }),
|
|
1871
|
+
data.whatsapp && /* @__PURE__ */ jsx(Link, { href: `https://wa.me/${data.whatsapp.replace(/\D/g, "")}`, target: "_blank", size: "2", children: /* @__PURE__ */ jsxs(Flex, { align: "center", gap: "2", children: [
|
|
1872
|
+
/* @__PURE__ */ jsx(MessageCircle, { size: 16 }),
|
|
1873
|
+
/* @__PURE__ */ jsx(Text, { children: "WhatsApp" })
|
|
1874
|
+
] }) })
|
|
1875
|
+
] }),
|
|
1876
|
+
!compact && data.workingHours && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
1877
|
+
/* @__PURE__ */ jsx(Separator, { size: "4" }),
|
|
1878
|
+
/* @__PURE__ */ jsx(Text, { size: "1", color: "gray", children: data.workingHours })
|
|
1879
|
+
] })
|
|
1880
|
+
] }) });
|
|
1881
|
+
}
|
|
1882
|
+
function ContactCardSkeleton() {
|
|
1883
|
+
return /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "3", children: [
|
|
1884
|
+
/* @__PURE__ */ jsx(Box, { style: { height: 20, width: 80, background: "var(--gray-4)", borderRadius: 4 } }),
|
|
1885
|
+
/* @__PURE__ */ jsx(Box, { style: { height: 16, width: 180, background: "var(--gray-3)", borderRadius: 4 } }),
|
|
1886
|
+
/* @__PURE__ */ jsx(Box, { style: { height: 16, width: 120, background: "var(--gray-3)", borderRadius: 4 } })
|
|
1887
|
+
] }) });
|
|
1888
|
+
}
|
|
1889
|
+
function DeveloperCard({ data: propData, compact = false, showBio = true }) {
|
|
1890
|
+
const { data: hookData, loading } = useDeveloperInfo({ autoFetch: !propData });
|
|
1891
|
+
const data = propData ?? hookData;
|
|
1892
|
+
if (loading) return /* @__PURE__ */ jsx(DeveloperCardSkeleton, {});
|
|
1893
|
+
if (!data) return null;
|
|
1894
|
+
return /* @__PURE__ */ jsx(Card, { size: compact ? "1" : "2", children: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "3", children: [
|
|
1895
|
+
/* @__PURE__ */ jsxs(Flex, { align: "center", gap: "3", children: [
|
|
1896
|
+
data.avatar && /* @__PURE__ */ jsx(Avatar, { src: data.avatar, fallback: data.name?.[0] || "?", size: "4", radius: "full" }),
|
|
1897
|
+
/* @__PURE__ */ jsxs(Box, { children: [
|
|
1898
|
+
/* @__PURE__ */ jsx(Text, { size: "4", weight: "bold", children: data.name }),
|
|
1899
|
+
/* @__PURE__ */ jsx(Text, { size: "2", color: "gray", children: data.title })
|
|
1900
|
+
] })
|
|
1901
|
+
] }),
|
|
1902
|
+
data.availableForHire && /* @__PURE__ */ jsx(Badge, { color: "green", size: "1", children: "Available for Hire" }),
|
|
1903
|
+
showBio && !compact && data.bio && /* @__PURE__ */ jsx(Text, { size: "2", color: "gray", children: data.shortBio || data.bio }),
|
|
1904
|
+
/* @__PURE__ */ jsxs(Flex, { gap: "2", wrap: "wrap", children: [
|
|
1905
|
+
data.website && /* @__PURE__ */ jsx(Link, { href: data.website, target: "_blank", size: "1", children: /* @__PURE__ */ jsxs(Flex, { align: "center", gap: "1", children: [
|
|
1906
|
+
/* @__PURE__ */ jsx(Globe, { size: 14 }),
|
|
1907
|
+
"Website"
|
|
1908
|
+
] }) }),
|
|
1909
|
+
data.github && /* @__PURE__ */ jsx(Link, { href: data.github, target: "_blank", size: "1", children: /* @__PURE__ */ jsxs(Flex, { align: "center", gap: "1", children: [
|
|
1910
|
+
/* @__PURE__ */ jsx(Github, { size: 14 }),
|
|
1911
|
+
"GitHub"
|
|
1912
|
+
] }) }),
|
|
1913
|
+
data.linkedin && /* @__PURE__ */ jsx(Link, { href: data.linkedin, target: "_blank", size: "1", children: /* @__PURE__ */ jsxs(Flex, { align: "center", gap: "1", children: [
|
|
1914
|
+
/* @__PURE__ */ jsx(Linkedin, { size: 14 }),
|
|
1915
|
+
"LinkedIn"
|
|
1916
|
+
] }) })
|
|
1917
|
+
] })
|
|
1918
|
+
] }) });
|
|
1919
|
+
}
|
|
1920
|
+
function DeveloperCardSkeleton() {
|
|
1921
|
+
return /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsxs(Flex, { align: "center", gap: "3", children: [
|
|
1922
|
+
/* @__PURE__ */ jsx(Box, { style: { height: 48, width: 48, background: "var(--gray-4)", borderRadius: "50%" } }),
|
|
1923
|
+
/* @__PURE__ */ jsxs(Box, { children: [
|
|
1924
|
+
/* @__PURE__ */ jsx(Box, { style: { height: 20, width: 120, background: "var(--gray-4)", borderRadius: 4, marginBottom: 4 } }),
|
|
1925
|
+
/* @__PURE__ */ jsx(Box, { style: { height: 16, width: 80, background: "var(--gray-3)", borderRadius: 4 } })
|
|
1926
|
+
] })
|
|
1927
|
+
] }) });
|
|
1928
|
+
}
|
|
1929
|
+
function SocialLinksBar({ data: propData, showIn, gap = "3" }) {
|
|
1930
|
+
const { data: hookData, loading } = useSocialLinks({ autoFetch: !propData, showIn });
|
|
1931
|
+
const data = propData ?? hookData;
|
|
1932
|
+
if (loading || data.length === 0) return null;
|
|
1933
|
+
return /* @__PURE__ */ jsx(Flex, { gap, align: "center", wrap: "wrap", children: data.map((link) => /* @__PURE__ */ jsx(
|
|
1934
|
+
Link,
|
|
1935
|
+
{
|
|
1936
|
+
href: link.url,
|
|
1937
|
+
target: "_blank",
|
|
1938
|
+
title: link.displayName || link.platform,
|
|
1939
|
+
style: { color: "inherit" },
|
|
1940
|
+
children: socialIcons[link.platform]
|
|
1941
|
+
},
|
|
1942
|
+
link.id
|
|
1943
|
+
)) });
|
|
1944
|
+
}
|
|
1945
|
+
function AddressCard({ data: propData, compact = false }) {
|
|
1946
|
+
const { data: hookData, loading } = useAddressInfo({ autoFetch: !propData });
|
|
1947
|
+
const data = propData ?? hookData;
|
|
1948
|
+
if (loading || !data) return null;
|
|
1949
|
+
const address = data.fullAddress || [data.streetAddress, data.city, data.state, data.country].filter(Boolean).join(", ");
|
|
1950
|
+
return /* @__PURE__ */ jsx(Card, { size: compact ? "1" : "2", children: /* @__PURE__ */ jsxs(Flex, { align: "start", gap: "2", children: [
|
|
1951
|
+
/* @__PURE__ */ jsx(MapPin, { size: 18, style: { flexShrink: 0, marginTop: 2 } }),
|
|
1952
|
+
/* @__PURE__ */ jsxs(Box, { children: [
|
|
1953
|
+
data.label && /* @__PURE__ */ jsx(Text, { size: "2", weight: "bold", children: data.label }),
|
|
1954
|
+
/* @__PURE__ */ jsx(Text, { size: "2", color: "gray", children: address }),
|
|
1955
|
+
data.googleMapsUrl && /* @__PURE__ */ jsx(Link, { href: data.googleMapsUrl, target: "_blank", size: "1", children: "View on Maps" })
|
|
1956
|
+
] })
|
|
1957
|
+
] }) });
|
|
1958
|
+
}
|
|
1959
|
+
function SkillsDisplay({ data: propData, featuredOnly = false, showLevel = true, maxItems }) {
|
|
1960
|
+
const { data: hookData, loading } = useSkills({ autoFetch: !propData, featuredOnly });
|
|
1961
|
+
let data = propData ?? hookData;
|
|
1962
|
+
if (maxItems && data.length > maxItems) {
|
|
1963
|
+
data = data.slice(0, maxItems);
|
|
1964
|
+
}
|
|
1965
|
+
if (loading || data.length === 0) return null;
|
|
1966
|
+
const levelColors = {
|
|
1967
|
+
beginner: "gray",
|
|
1968
|
+
intermediate: "blue",
|
|
1969
|
+
advanced: "green",
|
|
1970
|
+
expert: "orange"
|
|
1971
|
+
};
|
|
1972
|
+
return /* @__PURE__ */ jsx(Flex, { gap: "2", wrap: "wrap", children: data.map((skill) => /* @__PURE__ */ jsx(Badge, { color: showLevel ? levelColors[skill.level] : void 0, size: "2", children: skill.name }, skill.id)) });
|
|
1973
|
+
}
|
|
1974
|
+
function TestimonialsGrid({ data: propData, featuredOnly = false, maxItems, columns = "2" }) {
|
|
1975
|
+
const { data: hookData, loading } = useTestimonials({ autoFetch: !propData, featuredOnly, limit: maxItems });
|
|
1976
|
+
const data = propData ?? hookData;
|
|
1977
|
+
if (loading || data.length === 0) return null;
|
|
1978
|
+
return /* @__PURE__ */ jsx(Grid, { columns, gap: "4", children: data.map((testimonial) => /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "3", children: [
|
|
1979
|
+
testimonial.rating && /* @__PURE__ */ jsx(Flex, { gap: "1", children: Array.from({ length: testimonial.rating }).map((_, i) => /* @__PURE__ */ jsx(Star, { size: 14, fill: "var(--amber-9)", color: "var(--amber-9)" }, i)) }),
|
|
1980
|
+
/* @__PURE__ */ jsxs(Text, { size: "2", style: { fontStyle: "italic" }, children: [
|
|
1981
|
+
'"',
|
|
1982
|
+
testimonial.shortContent || testimonial.content,
|
|
1983
|
+
'"'
|
|
1984
|
+
] }),
|
|
1985
|
+
/* @__PURE__ */ jsxs(Flex, { align: "center", gap: "2", children: [
|
|
1986
|
+
testimonial.authorAvatar && /* @__PURE__ */ jsx(Avatar, { src: testimonial.authorAvatar, fallback: testimonial.authorName?.[0] || "?", size: "2", radius: "full" }),
|
|
1987
|
+
/* @__PURE__ */ jsxs(Box, { children: [
|
|
1988
|
+
/* @__PURE__ */ jsx(Text, { size: "2", weight: "bold", children: testimonial.authorName }),
|
|
1989
|
+
(testimonial.authorTitle || testimonial.authorCompany) && /* @__PURE__ */ jsx(Text, { size: "1", color: "gray", children: [testimonial.authorTitle, testimonial.authorCompany].filter(Boolean).join(" at ") })
|
|
1990
|
+
] })
|
|
1991
|
+
] })
|
|
1992
|
+
] }) }, testimonial.id)) });
|
|
1993
|
+
}
|
|
1994
|
+
function ServicesGrid({ data: propData, featuredOnly = false, maxItems, columns = "3" }) {
|
|
1995
|
+
const { data: hookData, loading } = useServices({ autoFetch: !propData, featuredOnly });
|
|
1996
|
+
let data = propData ?? hookData;
|
|
1997
|
+
if (maxItems && data.length > maxItems) {
|
|
1998
|
+
data = data.slice(0, maxItems);
|
|
1999
|
+
}
|
|
2000
|
+
if (loading || data.length === 0) return null;
|
|
2001
|
+
return /* @__PURE__ */ jsx(Grid, { columns, gap: "4", children: data.map((service) => /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "2", children: [
|
|
2002
|
+
/* @__PURE__ */ jsxs(Flex, { align: "center", gap: "2", children: [
|
|
2003
|
+
/* @__PURE__ */ jsx(Briefcase, { size: 18 }),
|
|
2004
|
+
/* @__PURE__ */ jsx(Text, { size: "3", weight: "bold", children: service.title })
|
|
2005
|
+
] }),
|
|
2006
|
+
/* @__PURE__ */ jsx(Text, { size: "2", color: "gray", children: service.shortDescription || service.description }),
|
|
2007
|
+
service.technologies && service.technologies.length > 0 && /* @__PURE__ */ jsx(Flex, { gap: "1", wrap: "wrap", children: service.technologies.slice(0, 5).map((tech, i) => /* @__PURE__ */ jsx(Badge, { size: "1", color: "gray", children: tech }, i)) })
|
|
2008
|
+
] }) }, service.id)) });
|
|
2009
|
+
}
|
|
2010
|
+
function FooterSection({ showContact = true, showSocialLinks = true, showAddress = false }) {
|
|
2011
|
+
return /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "4", align: "center", children: [
|
|
2012
|
+
showSocialLinks && /* @__PURE__ */ jsx(SocialLinksBar, { showIn: ["footer"] }),
|
|
2013
|
+
/* @__PURE__ */ jsxs(Flex, { gap: "4", wrap: "wrap", justify: "center", children: [
|
|
2014
|
+
showContact && /* @__PURE__ */ jsx(ContactCard, { compact: true }),
|
|
2015
|
+
showAddress && /* @__PURE__ */ jsx(AddressCard, { compact: true })
|
|
2016
|
+
] })
|
|
2017
|
+
] });
|
|
2018
|
+
}
|
|
1832
2019
|
export {
|
|
1833
|
-
|
|
2020
|
+
AdBanner as A,
|
|
1834
2021
|
BroadcastBanner as B,
|
|
1835
2022
|
CardVariant as C,
|
|
1836
|
-
|
|
2023
|
+
DeveloperCard as D,
|
|
2024
|
+
FeatureGridVariant as F,
|
|
1837
2025
|
GradientVariant as G,
|
|
1838
2026
|
HeroVariant as H,
|
|
1839
2027
|
LARGE_PANEL_VARIANTS as L,
|
|
@@ -1841,16 +2029,23 @@ export {
|
|
|
1841
2029
|
SMALL_PANEL_VARIANTS as S,
|
|
1842
2030
|
TaglineVariant as T,
|
|
1843
2031
|
VideoVariant as V,
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
1848
|
-
|
|
1849
|
-
|
|
1850
|
-
|
|
2032
|
+
AdModal as a,
|
|
2033
|
+
AdPanel as b,
|
|
2034
|
+
AdSlider as c,
|
|
2035
|
+
AdUpdateModal as d,
|
|
2036
|
+
AddressCard as e,
|
|
2037
|
+
AnnouncementModal as f,
|
|
2038
|
+
BroadcastBanners as g,
|
|
1851
2039
|
ComparisonVariant as h,
|
|
1852
|
-
|
|
1853
|
-
|
|
1854
|
-
|
|
2040
|
+
ContactCard as i,
|
|
2041
|
+
FeaturesVariant as j,
|
|
2042
|
+
FooterSection as k,
|
|
2043
|
+
ServicesGrid as l,
|
|
2044
|
+
SkillsDisplay as m,
|
|
2045
|
+
SocialLinksBar as n,
|
|
2046
|
+
TestimonialVariant as o,
|
|
2047
|
+
TestimonialsGrid as p,
|
|
2048
|
+
getLargePanelVariant as q,
|
|
2049
|
+
getSmallPanelVariant as r
|
|
1855
2050
|
};
|
|
1856
|
-
//# sourceMappingURL=
|
|
2051
|
+
//# sourceMappingURL=index-BeNmzbTD.js.map
|