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.
Files changed (91) hide show
  1. package/README.md +205 -2
  2. package/dist/{admin-notifications-D9n9h-eY.cjs → admin-notifications-CLzQc8zF.cjs} +20 -20
  3. package/dist/{admin-notifications-D9n9h-eY.cjs.map → admin-notifications-CLzQc8zF.cjs.map} +1 -1
  4. package/dist/{admin-notifications-p1dy3zIP.js → admin-notifications-C_7ReIMi.js} +13 -13
  5. package/dist/{admin-notifications-p1dy3zIP.js.map → admin-notifications-C_7ReIMi.js.map} +1 -1
  6. package/dist/{broadcasts-3_WfQMNL.cjs → broadcasts-6w_9X92Z.cjs} +10 -10
  7. package/dist/{broadcasts-3_WfQMNL.cjs.map → broadcasts-6w_9X92Z.cjs.map} +1 -1
  8. package/dist/{broadcasts-DgZUzqMf.js → broadcasts-CK4sGMz4.js} +12 -12
  9. package/dist/{broadcasts-DgZUzqMf.js.map → broadcasts-CK4sGMz4.js.map} +1 -1
  10. package/dist/commonFeatures-CaqcEOik.js +1255 -0
  11. package/dist/commonFeatures-CaqcEOik.js.map +1 -0
  12. package/dist/commonFeatures-DhWaBEv_.cjs +222 -0
  13. package/dist/commonFeatures-DhWaBEv_.cjs.map +1 -0
  14. package/dist/commonFeatures-XJ9fuxg_.js +223 -0
  15. package/dist/commonFeatures-XJ9fuxg_.js.map +1 -0
  16. package/dist/commonFeatures-ofZOjnZ0.cjs +1276 -0
  17. package/dist/commonFeatures-ofZOjnZ0.cjs.map +1 -0
  18. package/dist/components/common/index.d.ts +60 -0
  19. package/dist/components/common/index.d.ts.map +1 -0
  20. package/dist/components/index.cjs +31 -23
  21. package/dist/components/index.cjs.map +1 -1
  22. package/dist/components/index.d.ts +1 -0
  23. package/dist/components/index.d.ts.map +1 -1
  24. package/dist/components/index.js +21 -13
  25. package/dist/firebase/config.d.ts +34 -0
  26. package/dist/firebase/config.d.ts.map +1 -1
  27. package/dist/hooks/index.cjs +26 -13
  28. package/dist/hooks/index.cjs.map +1 -1
  29. package/dist/hooks/index.d.ts +2 -0
  30. package/dist/hooks/index.d.ts.map +1 -1
  31. package/dist/hooks/index.js +24 -11
  32. package/dist/hooks/useCommonFeatures.d.ts +102 -0
  33. package/dist/hooks/useCommonFeatures.d.ts.map +1 -0
  34. package/dist/hooks/useFeatureFlags.d.ts +134 -0
  35. package/dist/hooks/useFeatureFlags.d.ts.map +1 -0
  36. package/dist/{AnnouncementModal-sxH4K5gy.js → index-BeNmzbTD.js} +212 -17
  37. package/dist/index-BeNmzbTD.js.map +1 -0
  38. package/dist/{AnnouncementModal-Bqy0pn3V.cjs → index-DB40ObYe.cjs} +209 -14
  39. package/dist/index-DB40ObYe.cjs.map +1 -0
  40. package/dist/index.cjs +127 -60
  41. package/dist/index.cjs.map +1 -1
  42. package/dist/index.d.ts +10 -5
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +175 -108
  45. package/dist/index.js.map +1 -1
  46. package/dist/notifications/index.js +14 -14
  47. package/dist/services/commonFeatures.d.ts +25 -0
  48. package/dist/services/commonFeatures.d.ts.map +1 -0
  49. package/dist/services/featureFlags.d.ts +71 -0
  50. package/dist/services/featureFlags.d.ts.map +1 -0
  51. package/dist/services/index.cjs +49 -17
  52. package/dist/services/index.cjs.map +1 -1
  53. package/dist/services/index.d.ts +2 -0
  54. package/dist/services/index.d.ts.map +1 -1
  55. package/dist/services/index.js +75 -43
  56. package/dist/services/index.js.map +1 -1
  57. package/dist/types/commonFeatures.d.ts +232 -0
  58. package/dist/types/commonFeatures.d.ts.map +1 -0
  59. package/dist/types/featureFlags.d.ts +203 -0
  60. package/dist/types/featureFlags.d.ts.map +1 -0
  61. package/dist/types/index.cjs +17 -0
  62. package/dist/types/index.cjs.map +1 -1
  63. package/dist/types/index.d.ts +3 -1
  64. package/dist/types/index.d.ts.map +1 -1
  65. package/dist/types/index.js +17 -0
  66. package/dist/types/index.js.map +1 -1
  67. package/dist/useCommonFeatures-0EU_VRqi.cjs +488 -0
  68. package/dist/useCommonFeatures-0EU_VRqi.cjs.map +1 -0
  69. package/dist/useCommonFeatures-DP2YyB7m.js +489 -0
  70. package/dist/useCommonFeatures-DP2YyB7m.js.map +1 -0
  71. package/dist/useFeatureFlags-DHnOm0sA.js +368 -0
  72. package/dist/useFeatureFlags-DHnOm0sA.js.map +1 -0
  73. package/dist/useFeatureFlags-DRR1r3rt.cjs +367 -0
  74. package/dist/useFeatureFlags-DRR1r3rt.cjs.map +1 -0
  75. package/dist/{useNotificationEvents-D8DVxah1.js → useNotificationEvents-DAmR7FYF.js} +14 -14
  76. package/dist/{useNotificationEvents-D8DVxah1.js.map → useNotificationEvents-DAmR7FYF.js.map} +1 -1
  77. package/package.json +15 -8
  78. package/dist/AnnouncementModal-Bqy0pn3V.cjs.map +0 -1
  79. package/dist/AnnouncementModal-sxH4K5gy.js.map +0 -1
  80. package/dist/analytics-40-S_fHC.js +0 -440
  81. package/dist/analytics-40-S_fHC.js.map +0 -1
  82. package/dist/analytics-lEzOx2vl.cjs +0 -461
  83. package/dist/analytics-lEzOx2vl.cjs.map +0 -1
  84. package/dist/useBroadcasts-DzpCcbC8.js +0 -161
  85. package/dist/useBroadcasts-DzpCcbC8.js.map +0 -1
  86. package/dist/useBroadcasts-FP6ZrcY_.cjs +0 -160
  87. package/dist/useBroadcasts-FP6ZrcY_.cjs.map +0 -1
  88. package/dist/useCampaigns-BOZ9dDsG.cjs +0 -152
  89. package/dist/useCampaigns-BOZ9dDsG.cjs.map +0 -1
  90. package/dist/useCampaigns-D46b9zuf.js +0 -153
  91. 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, Link, Badge, Dialog, Heading, Checkbox, Grid } from "@radix-ui/themes";
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, b as useOneTimeAdModal, c as useUpdateAdModal, u as useCampaigns } from "./useCampaigns-D46b9zuf.js";
6
- import { ExternalLink, X, Check, Sparkles, Gift, Quote, Play, ChevronLeft, ChevronRight, Megaphone, CheckCircle, AlertTriangle, AlertCircle, Info, Bell } from "lucide-react";
7
- import { e as isInitialized, d as getConfig } from "./analytics-40-S_fHC.js";
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
- AdPanel as A,
2020
+ AdBanner as A,
1834
2021
  BroadcastBanner as B,
1835
2022
  CardVariant as C,
1836
- FeaturesVariant as F,
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
- AdSlider as a,
1845
- AdModal as b,
1846
- AdUpdateModal as c,
1847
- AdBanner as d,
1848
- FeatureGridVariant as e,
1849
- TestimonialVariant as f,
1850
- getSmallPanelVariant as g,
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
- getLargePanelVariant as i,
1853
- BroadcastBanners as j,
1854
- AnnouncementModal as k
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=AnnouncementModal-sxH4K5gy.js.map
2051
+ //# sourceMappingURL=index-BeNmzbTD.js.map