@uptrademedia/site-kit 1.0.0

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 (120) hide show
  1. package/README.md +305 -0
  2. package/dist/analytics/index.js +88 -0
  3. package/dist/analytics/index.js.map +1 -0
  4. package/dist/analytics/index.mjs +70 -0
  5. package/dist/analytics/index.mjs.map +1 -0
  6. package/dist/api-N35S3EES.js +57 -0
  7. package/dist/api-N35S3EES.js.map +1 -0
  8. package/dist/api-SYBTK7Z7.mjs +4 -0
  9. package/dist/api-SYBTK7Z7.mjs.map +1 -0
  10. package/dist/blog/index.js +200 -0
  11. package/dist/blog/index.js.map +1 -0
  12. package/dist/blog/index.mjs +194 -0
  13. package/dist/blog/index.mjs.map +1 -0
  14. package/dist/chunk-3MUOUXHV.js +3721 -0
  15. package/dist/chunk-3MUOUXHV.js.map +1 -0
  16. package/dist/chunk-4HVYXYQL 2.mjs +255 -0
  17. package/dist/chunk-4HVYXYQL.mjs +255 -0
  18. package/dist/chunk-4HVYXYQL.mjs.map +1 -0
  19. package/dist/chunk-7H6I3ECV.mjs +120 -0
  20. package/dist/chunk-7H6I3ECV.mjs.map +1 -0
  21. package/dist/chunk-COI6GOX2.mjs +3679 -0
  22. package/dist/chunk-COI6GOX2.mjs.map +1 -0
  23. package/dist/chunk-EQCVQC35.js +35 -0
  24. package/dist/chunk-EQCVQC35.js 2.map +1 -0
  25. package/dist/chunk-EQCVQC35.js.map +1 -0
  26. package/dist/chunk-FEBYQGY4 2.mjs +251 -0
  27. package/dist/chunk-FEBYQGY4.mjs +251 -0
  28. package/dist/chunk-FEBYQGY4.mjs.map +1 -0
  29. package/dist/chunk-FKVJOT2F.mjs +796 -0
  30. package/dist/chunk-FKVJOT2F.mjs.map +1 -0
  31. package/dist/chunk-GQ6ZOU2N.mjs +134 -0
  32. package/dist/chunk-GQ6ZOU2N.mjs.map +1 -0
  33. package/dist/chunk-HCFPU7TU.js +137 -0
  34. package/dist/chunk-HCFPU7TU.js.map +1 -0
  35. package/dist/chunk-NYKRE2FL 2.mjs +31 -0
  36. package/dist/chunk-NYKRE2FL.mjs +31 -0
  37. package/dist/chunk-NYKRE2FL.mjs 2.map +1 -0
  38. package/dist/chunk-NYKRE2FL.mjs.map +1 -0
  39. package/dist/chunk-QP5NCO2E.js +133 -0
  40. package/dist/chunk-QP5NCO2E.js.map +1 -0
  41. package/dist/chunk-RV7H3I6J.js +255 -0
  42. package/dist/chunk-RV7H3I6J.js 2.map +1 -0
  43. package/dist/chunk-RV7H3I6J.js.map +1 -0
  44. package/dist/chunk-SBVEYCSV.js +140 -0
  45. package/dist/chunk-SBVEYCSV.js.map +1 -0
  46. package/dist/chunk-TUKGA3UK.js +257 -0
  47. package/dist/chunk-TUKGA3UK.js 2.map +1 -0
  48. package/dist/chunk-TUKGA3UK.js.map +1 -0
  49. package/dist/chunk-V3F5J6CV.js +801 -0
  50. package/dist/chunk-V3F5J6CV.js.map +1 -0
  51. package/dist/chunk-WPSRS352.mjs +135 -0
  52. package/dist/chunk-WPSRS352.mjs.map +1 -0
  53. package/dist/commerce/index.js +157 -0
  54. package/dist/commerce/index.js.map +1 -0
  55. package/dist/commerce/index.mjs +4 -0
  56. package/dist/commerce/index.mjs.map +1 -0
  57. package/dist/commerce/server.js +186 -0
  58. package/dist/commerce/server.js.map +1 -0
  59. package/dist/commerce/server.mjs +176 -0
  60. package/dist/commerce/server.mjs.map +1 -0
  61. package/dist/engage/index.js +50 -0
  62. package/dist/engage/index.js.map +1 -0
  63. package/dist/engage/index.mjs +44 -0
  64. package/dist/engage/index.mjs.map +1 -0
  65. package/dist/forms/index.js +1053 -0
  66. package/dist/forms/index.js.map +1 -0
  67. package/dist/forms/index.mjs +1035 -0
  68. package/dist/forms/index.mjs.map +1 -0
  69. package/dist/generators-7Y5ABRYV 2.mjs +161 -0
  70. package/dist/generators-7Y5ABRYV.mjs +161 -0
  71. package/dist/generators-7Y5ABRYV.mjs 2.map +1 -0
  72. package/dist/generators-7Y5ABRYV.mjs.map +1 -0
  73. package/dist/generators-GWIYCA5M.js +171 -0
  74. package/dist/generators-GWIYCA5M.js 2.map +1 -0
  75. package/dist/generators-GWIYCA5M.js.map +1 -0
  76. package/dist/index 2.mjs +74 -0
  77. package/dist/index.js +326 -0
  78. package/dist/index.js 2.map +1 -0
  79. package/dist/index.js.map +1 -0
  80. package/dist/index.mjs +222 -0
  81. package/dist/index.mjs.map +1 -0
  82. package/dist/migrator-V6KS75EA 2.mjs +265 -0
  83. package/dist/migrator-V6KS75EA.mjs +265 -0
  84. package/dist/migrator-V6KS75EA.mjs 2.map +1 -0
  85. package/dist/migrator-V6KS75EA.mjs.map +1 -0
  86. package/dist/migrator-XKM7YQCY.js +272 -0
  87. package/dist/migrator-XKM7YQCY.js 2.map +1 -0
  88. package/dist/migrator-XKM7YQCY.js.map +1 -0
  89. package/dist/scanner-MF7P3CDE 2.mjs +14386 -0
  90. package/dist/scanner-MF7P3CDE.mjs +14386 -0
  91. package/dist/scanner-MF7P3CDE.mjs 2.map +1 -0
  92. package/dist/scanner-MF7P3CDE.mjs.map +1 -0
  93. package/dist/scanner-NT6YG4TD 2.js +14397 -0
  94. package/dist/scanner-NT6YG4TD.js +14397 -0
  95. package/dist/scanner-NT6YG4TD.js 2.map +1 -0
  96. package/dist/scanner-NT6YG4TD.js.map +1 -0
  97. package/dist/seo/index.js +447 -0
  98. package/dist/seo/index.js.map +1 -0
  99. package/dist/seo/index.mjs +411 -0
  100. package/dist/seo/index.mjs.map +1 -0
  101. package/dist/seo/server.js +66 -0
  102. package/dist/seo/server.js.map +1 -0
  103. package/dist/seo/server.mjs +5 -0
  104. package/dist/seo/server.mjs.map +1 -0
  105. package/dist/setup/index.js +1050 -0
  106. package/dist/setup/index.js.map +1 -0
  107. package/dist/setup/index.mjs +1046 -0
  108. package/dist/setup/index.mjs.map +1 -0
  109. package/dist/sitemap/index.js +212 -0
  110. package/dist/sitemap/index.js.map +1 -0
  111. package/dist/sitemap/index.mjs +206 -0
  112. package/dist/sitemap/index.mjs.map +1 -0
  113. package/dist/web-vitals-BH55V7EJ.js +252 -0
  114. package/dist/web-vitals-BH55V7EJ.js 2.map +1 -0
  115. package/dist/web-vitals-BH55V7EJ.js.map +1 -0
  116. package/dist/web-vitals-RJYPWAR3 2.mjs +241 -0
  117. package/dist/web-vitals-RJYPWAR3.mjs +241 -0
  118. package/dist/web-vitals-RJYPWAR3.mjs 2.map +1 -0
  119. package/dist/web-vitals-RJYPWAR3.mjs.map +1 -0
  120. package/package.json +118 -0
@@ -0,0 +1,186 @@
1
+ 'use strict';
2
+
3
+ require('../chunk-EQCVQC35.js');
4
+ var supabaseJs = require('@supabase/supabase-js');
5
+
6
+ function getSupabaseClient(config) {
7
+ return supabaseJs.createClient(config.supabaseUrl, config.supabaseKey);
8
+ }
9
+ function transformOffering(data) {
10
+ return {
11
+ id: data.id,
12
+ project_id: data.project_id,
13
+ type: data.type,
14
+ status: data.status,
15
+ name: data.name,
16
+ slug: data.slug,
17
+ description: data.description,
18
+ short_description: data.short_description,
19
+ long_description: data.long_description,
20
+ featured_image_url: data.featured_image_url,
21
+ gallery_images: data.gallery_image_urls || [],
22
+ price_type: data.price_type,
23
+ price: data.price,
24
+ compare_at_price: data.compare_at_price,
25
+ currency: data.currency || "USD",
26
+ price_is_public: data.price_is_public ?? true,
27
+ billing_period: data.billing_period,
28
+ track_inventory: data.track_inventory,
29
+ inventory_count: data.inventory_count,
30
+ allow_backorder: data.allow_backorder,
31
+ duration_minutes: data.duration_minutes,
32
+ capacity: data.capacity,
33
+ location: data.location,
34
+ is_virtual: data.is_virtual,
35
+ virtual_meeting_url: data.virtual_meeting_url,
36
+ requires_booking: data.requires_booking,
37
+ booking_lead_time_hours: data.booking_lead_time_hours,
38
+ category: data.category,
39
+ category_id: data.category_id,
40
+ tags: data.tags || [],
41
+ seo_title: data.seo_title,
42
+ seo_description: data.seo_description,
43
+ features: data.features || [],
44
+ specifications: data.specifications || {},
45
+ schedules: data.schedules || [],
46
+ variants: data.variants || [],
47
+ created_at: data.created_at,
48
+ updated_at: data.updated_at
49
+ };
50
+ }
51
+ async function getProductPaths(config) {
52
+ const supabase = getSupabaseClient(config);
53
+ const { data, error } = await supabase.from("commerce_offerings").select("slug").eq("project_id", config.projectId).eq("type", "product").eq("status", "active");
54
+ if (error || !data) return [];
55
+ return data.map((item) => ({ params: { slug: item.slug } }));
56
+ }
57
+ async function getEventPaths(config) {
58
+ const supabase = getSupabaseClient(config);
59
+ const { data, error } = await supabase.from("commerce_offerings").select("slug").eq("project_id", config.projectId).eq("type", "event").eq("status", "active");
60
+ if (error || !data) return [];
61
+ return data.map((item) => ({ params: { slug: item.slug } }));
62
+ }
63
+ async function getOfferingPaths(config, type) {
64
+ const supabase = getSupabaseClient(config);
65
+ let query = supabase.from("commerce_offerings").select("slug").eq("project_id", config.projectId).eq("status", "active");
66
+ if (type) {
67
+ if (Array.isArray(type)) {
68
+ query = query.in("type", type);
69
+ } else {
70
+ query = query.eq("type", type);
71
+ }
72
+ }
73
+ const { data, error } = await query;
74
+ if (error || !data) return [];
75
+ return data.map((item) => ({ params: { slug: item.slug } }));
76
+ }
77
+ async function getOfferingBySlug(config, slug) {
78
+ const supabase = getSupabaseClient(config);
79
+ const { data, error } = await supabase.from("commerce_offerings").select(`
80
+ *,
81
+ category:commerce_categories(id, name, slug),
82
+ variants:commerce_variants(*),
83
+ schedules:commerce_schedules(*)
84
+ `).eq("project_id", config.projectId).eq("slug", slug).single();
85
+ if (error || !data) return null;
86
+ return transformOffering(data);
87
+ }
88
+ async function getOfferings(config, options = {}) {
89
+ const supabase = getSupabaseClient(config);
90
+ let query = supabase.from("commerce_offerings").select(`
91
+ *,
92
+ category:commerce_categories(id, name, slug),
93
+ variants:commerce_variants(*),
94
+ schedules:commerce_schedules(*)
95
+ `).eq("project_id", config.projectId).eq("status", options.status || "active").order("sort_order", { ascending: true });
96
+ if (options.type) {
97
+ if (Array.isArray(options.type)) {
98
+ query = query.in("type", options.type);
99
+ } else {
100
+ query = query.eq("type", options.type);
101
+ }
102
+ }
103
+ if (options.category) {
104
+ query = query.eq("category_id", options.category);
105
+ }
106
+ if (options.limit) {
107
+ query = query.limit(options.limit);
108
+ }
109
+ const { data, error } = await query;
110
+ if (error || !data) return [];
111
+ return data.map(transformOffering);
112
+ }
113
+ async function getUpcomingEvents(config, options = {}) {
114
+ const supabase = getSupabaseClient(config);
115
+ const now = (/* @__PURE__ */ new Date()).toISOString();
116
+ let query = supabase.from("commerce_offerings").select(`
117
+ *,
118
+ category:commerce_categories(id, name, slug),
119
+ schedules:commerce_schedules(*)
120
+ `).eq("project_id", config.projectId).eq("type", "event").eq("status", "active");
121
+ if (options.category) {
122
+ query = query.eq("category_id", options.category);
123
+ }
124
+ const { data, error } = await query;
125
+ if (error || !data) return [];
126
+ const eventsWithSchedules = data.map((event) => {
127
+ const schedules = (event.schedules || []).filter((s) => new Date(s.starts_at) >= new Date(now) && s.status === "scheduled").sort((a, b) => new Date(a.starts_at).getTime() - new Date(b.starts_at).getTime());
128
+ return {
129
+ ...transformOffering(event),
130
+ schedules,
131
+ next_schedule: schedules[0] || null
132
+ };
133
+ }).filter((event) => event.schedules.length > 0).sort((a, b) => {
134
+ const aDate = a.next_schedule?.starts_at;
135
+ const bDate = b.next_schedule?.starts_at;
136
+ if (!aDate || !bDate) return 0;
137
+ return new Date(aDate).getTime() - new Date(bDate).getTime();
138
+ });
139
+ if (options.limit) {
140
+ return eventsWithSchedules.slice(0, options.limit);
141
+ }
142
+ return eventsWithSchedules;
143
+ }
144
+ async function getNextEvent(config, category) {
145
+ const events = await getUpcomingEvents(config, { limit: 1, category });
146
+ return events[0] || null;
147
+ }
148
+ function generateOfferingMetadata(offering, siteUrl) {
149
+ if (!offering) return null;
150
+ const title = offering.seo_title || offering.name;
151
+ const description = offering.seo_description || offering.short_description || offering.description || "";
152
+ const images = offering.featured_image_url ? [offering.featured_image_url] : [];
153
+ const typeMap = {
154
+ product: "product",
155
+ service: "website",
156
+ event: "website",
157
+ class: "website",
158
+ subscription: "product"
159
+ };
160
+ return {
161
+ title,
162
+ description,
163
+ openGraph: {
164
+ title,
165
+ description,
166
+ images,
167
+ type: typeMap[offering.type] || "website",
168
+ url: `${siteUrl}/${offering.type}s/${offering.slug}`
169
+ }
170
+ };
171
+ }
172
+ function createServerConfig(supabaseUrl, supabaseKey, projectId) {
173
+ return { supabaseUrl, supabaseKey, projectId };
174
+ }
175
+
176
+ exports.createServerConfig = createServerConfig;
177
+ exports.generateOfferingMetadata = generateOfferingMetadata;
178
+ exports.getEventPaths = getEventPaths;
179
+ exports.getNextEvent = getNextEvent;
180
+ exports.getOfferingBySlug = getOfferingBySlug;
181
+ exports.getOfferingPaths = getOfferingPaths;
182
+ exports.getOfferings = getOfferings;
183
+ exports.getProductPaths = getProductPaths;
184
+ exports.getUpcomingEvents = getUpcomingEvents;
185
+ //# sourceMappingURL=server.js.map
186
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/commerce/server.ts"],"names":["createClient"],"mappings":"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","file":"server.js","sourcesContent":["/**\n * @uptrade/site-kit/commerce - Server-side utilities\n * \n * Helpers for server-side rendering and dynamic routes.\n * Use in Next.js getStaticPaths, getStaticProps, or App Router.\n */\n\nimport { createClient } from '@supabase/supabase-js'\nimport type { CommerceOffering, OfferingType } from './types'\n\ninterface ServerConfig {\n supabaseUrl: string\n supabaseKey: string\n projectId: string\n}\n\nfunction getSupabaseClient(config: ServerConfig) {\n return createClient(config.supabaseUrl, config.supabaseKey)\n}\n\nfunction transformOffering(data: any): CommerceOffering {\n return {\n id: data.id,\n project_id: data.project_id,\n type: data.type,\n status: data.status,\n name: data.name,\n slug: data.slug,\n description: data.description,\n short_description: data.short_description,\n long_description: data.long_description,\n featured_image_url: data.featured_image_url,\n gallery_images: data.gallery_image_urls || [],\n price_type: data.price_type,\n price: data.price,\n compare_at_price: data.compare_at_price,\n currency: data.currency || 'USD',\n price_is_public: data.price_is_public ?? true,\n billing_period: data.billing_period,\n track_inventory: data.track_inventory,\n inventory_count: data.inventory_count,\n allow_backorder: data.allow_backorder,\n duration_minutes: data.duration_minutes,\n capacity: data.capacity,\n location: data.location,\n is_virtual: data.is_virtual,\n virtual_meeting_url: data.virtual_meeting_url,\n requires_booking: data.requires_booking,\n booking_lead_time_hours: data.booking_lead_time_hours,\n category: data.category,\n category_id: data.category_id,\n tags: data.tags || [],\n seo_title: data.seo_title,\n seo_description: data.seo_description,\n features: data.features || [],\n specifications: data.specifications || {},\n schedules: data.schedules || [],\n variants: data.variants || [],\n created_at: data.created_at,\n updated_at: data.updated_at,\n }\n}\n\n// ============================================\n// Static Path Generators\n// ============================================\n\n/**\n * Get all product slugs for static generation\n * \n * @example Next.js Pages Router\n * export async function getStaticPaths() {\n * const paths = await getProductPaths(config)\n * return { paths, fallback: 'blocking' }\n * }\n */\nexport async function getProductPaths(config: ServerConfig): Promise<{ params: { slug: string } }[]> {\n const supabase = getSupabaseClient(config)\n \n const { data, error } = await supabase\n .from('commerce_offerings')\n .select('slug')\n .eq('project_id', config.projectId)\n .eq('type', 'product')\n .eq('status', 'active')\n \n if (error || !data) return []\n \n return data.map(item => ({ params: { slug: item.slug } }))\n}\n\n/**\n * Get all event slugs for static generation\n */\nexport async function getEventPaths(config: ServerConfig): Promise<{ params: { slug: string } }[]> {\n const supabase = getSupabaseClient(config)\n \n const { data, error } = await supabase\n .from('commerce_offerings')\n .select('slug')\n .eq('project_id', config.projectId)\n .eq('type', 'event')\n .eq('status', 'active')\n \n if (error || !data) return []\n \n return data.map(item => ({ params: { slug: item.slug } }))\n}\n\n/**\n * Get all offering slugs for static generation (any type)\n */\nexport async function getOfferingPaths(\n config: ServerConfig,\n type?: OfferingType | OfferingType[]\n): Promise<{ params: { slug: string } }[]> {\n const supabase = getSupabaseClient(config)\n \n let query = supabase\n .from('commerce_offerings')\n .select('slug')\n .eq('project_id', config.projectId)\n .eq('status', 'active')\n \n if (type) {\n if (Array.isArray(type)) {\n query = query.in('type', type)\n } else {\n query = query.eq('type', type)\n }\n }\n \n const { data, error } = await query\n \n if (error || !data) return []\n \n return data.map(item => ({ params: { slug: item.slug } }))\n}\n\n// ============================================\n// Data Fetchers\n// ============================================\n\n/**\n * Fetch a single offering by slug (server-side)\n * \n * @example Next.js Pages Router\n * export async function getStaticProps({ params }) {\n * const product = await getOfferingBySlug(config, params.slug)\n * if (!product) return { notFound: true }\n * return { props: { product }, revalidate: 60 }\n * }\n */\nexport async function getOfferingBySlug(\n config: ServerConfig,\n slug: string\n): Promise<CommerceOffering | null> {\n const supabase = getSupabaseClient(config)\n \n const { data, error } = await supabase\n .from('commerce_offerings')\n .select(`\n *,\n category:commerce_categories(id, name, slug),\n variants:commerce_variants(*),\n schedules:commerce_schedules(*)\n `)\n .eq('project_id', config.projectId)\n .eq('slug', slug)\n .single()\n \n if (error || !data) return null\n \n return transformOffering(data)\n}\n\n/**\n * Fetch all offerings of a type (server-side)\n */\nexport async function getOfferings(\n config: ServerConfig,\n options: {\n type?: OfferingType | OfferingType[]\n category?: string\n limit?: number\n status?: string\n } = {}\n): Promise<CommerceOffering[]> {\n const supabase = getSupabaseClient(config)\n \n let query = supabase\n .from('commerce_offerings')\n .select(`\n *,\n category:commerce_categories(id, name, slug),\n variants:commerce_variants(*),\n schedules:commerce_schedules(*)\n `)\n .eq('project_id', config.projectId)\n .eq('status', options.status || 'active')\n .order('sort_order', { ascending: true })\n \n if (options.type) {\n if (Array.isArray(options.type)) {\n query = query.in('type', options.type)\n } else {\n query = query.eq('type', options.type)\n }\n }\n \n if (options.category) {\n query = query.eq('category_id', options.category)\n }\n \n if (options.limit) {\n query = query.limit(options.limit)\n }\n \n const { data, error } = await query\n \n if (error || !data) return []\n \n return data.map(transformOffering)\n}\n\n/**\n * Fetch upcoming events (server-side)\n */\nexport async function getUpcomingEvents(\n config: ServerConfig,\n options: { limit?: number; category?: string } = {}\n): Promise<CommerceOffering[]> {\n const supabase = getSupabaseClient(config)\n const now = new Date().toISOString()\n \n let query = supabase\n .from('commerce_offerings')\n .select(`\n *,\n category:commerce_categories(id, name, slug),\n schedules:commerce_schedules(*)\n `)\n .eq('project_id', config.projectId)\n .eq('type', 'event')\n .eq('status', 'active')\n \n if (options.category) {\n query = query.eq('category_id', options.category)\n }\n \n const { data, error } = await query\n \n if (error || !data) return []\n \n // Filter events with upcoming schedules and sort\n const eventsWithSchedules = data\n .map(event => {\n const schedules = (event.schedules || [])\n .filter((s: any) => new Date(s.starts_at) >= new Date(now) && s.status === 'scheduled')\n .sort((a: any, b: any) => new Date(a.starts_at).getTime() - new Date(b.starts_at).getTime())\n \n return {\n ...transformOffering(event),\n schedules,\n next_schedule: schedules[0] || null,\n }\n })\n .filter(event => event.schedules.length > 0)\n .sort((a, b) => {\n const aDate = (a as any).next_schedule?.starts_at\n const bDate = (b as any).next_schedule?.starts_at\n if (!aDate || !bDate) return 0\n return new Date(aDate).getTime() - new Date(bDate).getTime()\n })\n \n if (options.limit) {\n return eventsWithSchedules.slice(0, options.limit)\n }\n \n return eventsWithSchedules\n}\n\n/**\n * Get next upcoming event (server-side)\n */\nexport async function getNextEvent(\n config: ServerConfig,\n category?: string\n): Promise<CommerceOffering | null> {\n const events = await getUpcomingEvents(config, { limit: 1, category })\n return events[0] || null\n}\n\n// ============================================\n// Metadata Helpers\n// ============================================\n\n/**\n * Generate page metadata for an offering\n * \n * @example Next.js App Router\n * export async function generateMetadata({ params }) {\n * const product = await getOfferingBySlug(config, params.slug)\n * return generateOfferingMetadata(product, 'https://example.com')\n * }\n */\nexport function generateOfferingMetadata(\n offering: CommerceOffering | null,\n siteUrl: string\n): {\n title: string\n description: string\n openGraph: {\n title: string\n description: string\n images: string[]\n type: string\n url: string\n }\n} | null {\n if (!offering) return null\n \n const title = offering.seo_title || offering.name\n const description = offering.seo_description || offering.short_description || offering.description || ''\n const images = offering.featured_image_url ? [offering.featured_image_url] : []\n \n const typeMap: Record<OfferingType, string> = {\n product: 'product',\n service: 'website',\n event: 'website',\n class: 'website',\n subscription: 'product',\n }\n \n return {\n title,\n description,\n openGraph: {\n title,\n description,\n images,\n type: typeMap[offering.type] || 'website',\n url: `${siteUrl}/${offering.type}s/${offering.slug}`,\n },\n }\n}\n\n// ============================================\n// Export config builder\n// ============================================\n\nexport function createServerConfig(\n supabaseUrl: string,\n supabaseKey: string,\n projectId: string\n): ServerConfig {\n return { supabaseUrl, supabaseKey, projectId }\n}\n"]}
@@ -0,0 +1,176 @@
1
+ import '../chunk-NYKRE2FL.mjs';
2
+ import { createClient } from '@supabase/supabase-js';
3
+
4
+ function getSupabaseClient(config) {
5
+ return createClient(config.supabaseUrl, config.supabaseKey);
6
+ }
7
+ function transformOffering(data) {
8
+ return {
9
+ id: data.id,
10
+ project_id: data.project_id,
11
+ type: data.type,
12
+ status: data.status,
13
+ name: data.name,
14
+ slug: data.slug,
15
+ description: data.description,
16
+ short_description: data.short_description,
17
+ long_description: data.long_description,
18
+ featured_image_url: data.featured_image_url,
19
+ gallery_images: data.gallery_image_urls || [],
20
+ price_type: data.price_type,
21
+ price: data.price,
22
+ compare_at_price: data.compare_at_price,
23
+ currency: data.currency || "USD",
24
+ price_is_public: data.price_is_public ?? true,
25
+ billing_period: data.billing_period,
26
+ track_inventory: data.track_inventory,
27
+ inventory_count: data.inventory_count,
28
+ allow_backorder: data.allow_backorder,
29
+ duration_minutes: data.duration_minutes,
30
+ capacity: data.capacity,
31
+ location: data.location,
32
+ is_virtual: data.is_virtual,
33
+ virtual_meeting_url: data.virtual_meeting_url,
34
+ requires_booking: data.requires_booking,
35
+ booking_lead_time_hours: data.booking_lead_time_hours,
36
+ category: data.category,
37
+ category_id: data.category_id,
38
+ tags: data.tags || [],
39
+ seo_title: data.seo_title,
40
+ seo_description: data.seo_description,
41
+ features: data.features || [],
42
+ specifications: data.specifications || {},
43
+ schedules: data.schedules || [],
44
+ variants: data.variants || [],
45
+ created_at: data.created_at,
46
+ updated_at: data.updated_at
47
+ };
48
+ }
49
+ async function getProductPaths(config) {
50
+ const supabase = getSupabaseClient(config);
51
+ const { data, error } = await supabase.from("commerce_offerings").select("slug").eq("project_id", config.projectId).eq("type", "product").eq("status", "active");
52
+ if (error || !data) return [];
53
+ return data.map((item) => ({ params: { slug: item.slug } }));
54
+ }
55
+ async function getEventPaths(config) {
56
+ const supabase = getSupabaseClient(config);
57
+ const { data, error } = await supabase.from("commerce_offerings").select("slug").eq("project_id", config.projectId).eq("type", "event").eq("status", "active");
58
+ if (error || !data) return [];
59
+ return data.map((item) => ({ params: { slug: item.slug } }));
60
+ }
61
+ async function getOfferingPaths(config, type) {
62
+ const supabase = getSupabaseClient(config);
63
+ let query = supabase.from("commerce_offerings").select("slug").eq("project_id", config.projectId).eq("status", "active");
64
+ if (type) {
65
+ if (Array.isArray(type)) {
66
+ query = query.in("type", type);
67
+ } else {
68
+ query = query.eq("type", type);
69
+ }
70
+ }
71
+ const { data, error } = await query;
72
+ if (error || !data) return [];
73
+ return data.map((item) => ({ params: { slug: item.slug } }));
74
+ }
75
+ async function getOfferingBySlug(config, slug) {
76
+ const supabase = getSupabaseClient(config);
77
+ const { data, error } = await supabase.from("commerce_offerings").select(`
78
+ *,
79
+ category:commerce_categories(id, name, slug),
80
+ variants:commerce_variants(*),
81
+ schedules:commerce_schedules(*)
82
+ `).eq("project_id", config.projectId).eq("slug", slug).single();
83
+ if (error || !data) return null;
84
+ return transformOffering(data);
85
+ }
86
+ async function getOfferings(config, options = {}) {
87
+ const supabase = getSupabaseClient(config);
88
+ let query = supabase.from("commerce_offerings").select(`
89
+ *,
90
+ category:commerce_categories(id, name, slug),
91
+ variants:commerce_variants(*),
92
+ schedules:commerce_schedules(*)
93
+ `).eq("project_id", config.projectId).eq("status", options.status || "active").order("sort_order", { ascending: true });
94
+ if (options.type) {
95
+ if (Array.isArray(options.type)) {
96
+ query = query.in("type", options.type);
97
+ } else {
98
+ query = query.eq("type", options.type);
99
+ }
100
+ }
101
+ if (options.category) {
102
+ query = query.eq("category_id", options.category);
103
+ }
104
+ if (options.limit) {
105
+ query = query.limit(options.limit);
106
+ }
107
+ const { data, error } = await query;
108
+ if (error || !data) return [];
109
+ return data.map(transformOffering);
110
+ }
111
+ async function getUpcomingEvents(config, options = {}) {
112
+ const supabase = getSupabaseClient(config);
113
+ const now = (/* @__PURE__ */ new Date()).toISOString();
114
+ let query = supabase.from("commerce_offerings").select(`
115
+ *,
116
+ category:commerce_categories(id, name, slug),
117
+ schedules:commerce_schedules(*)
118
+ `).eq("project_id", config.projectId).eq("type", "event").eq("status", "active");
119
+ if (options.category) {
120
+ query = query.eq("category_id", options.category);
121
+ }
122
+ const { data, error } = await query;
123
+ if (error || !data) return [];
124
+ const eventsWithSchedules = data.map((event) => {
125
+ const schedules = (event.schedules || []).filter((s) => new Date(s.starts_at) >= new Date(now) && s.status === "scheduled").sort((a, b) => new Date(a.starts_at).getTime() - new Date(b.starts_at).getTime());
126
+ return {
127
+ ...transformOffering(event),
128
+ schedules,
129
+ next_schedule: schedules[0] || null
130
+ };
131
+ }).filter((event) => event.schedules.length > 0).sort((a, b) => {
132
+ const aDate = a.next_schedule?.starts_at;
133
+ const bDate = b.next_schedule?.starts_at;
134
+ if (!aDate || !bDate) return 0;
135
+ return new Date(aDate).getTime() - new Date(bDate).getTime();
136
+ });
137
+ if (options.limit) {
138
+ return eventsWithSchedules.slice(0, options.limit);
139
+ }
140
+ return eventsWithSchedules;
141
+ }
142
+ async function getNextEvent(config, category) {
143
+ const events = await getUpcomingEvents(config, { limit: 1, category });
144
+ return events[0] || null;
145
+ }
146
+ function generateOfferingMetadata(offering, siteUrl) {
147
+ if (!offering) return null;
148
+ const title = offering.seo_title || offering.name;
149
+ const description = offering.seo_description || offering.short_description || offering.description || "";
150
+ const images = offering.featured_image_url ? [offering.featured_image_url] : [];
151
+ const typeMap = {
152
+ product: "product",
153
+ service: "website",
154
+ event: "website",
155
+ class: "website",
156
+ subscription: "product"
157
+ };
158
+ return {
159
+ title,
160
+ description,
161
+ openGraph: {
162
+ title,
163
+ description,
164
+ images,
165
+ type: typeMap[offering.type] || "website",
166
+ url: `${siteUrl}/${offering.type}s/${offering.slug}`
167
+ }
168
+ };
169
+ }
170
+ function createServerConfig(supabaseUrl, supabaseKey, projectId) {
171
+ return { supabaseUrl, supabaseKey, projectId };
172
+ }
173
+
174
+ export { createServerConfig, generateOfferingMetadata, getEventPaths, getNextEvent, getOfferingBySlug, getOfferingPaths, getOfferings, getProductPaths, getUpcomingEvents };
175
+ //# sourceMappingURL=server.mjs.map
176
+ //# sourceMappingURL=server.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/commerce/server.ts"],"names":[],"mappings":"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","file":"server.mjs","sourcesContent":["/**\n * @uptrade/site-kit/commerce - Server-side utilities\n * \n * Helpers for server-side rendering and dynamic routes.\n * Use in Next.js getStaticPaths, getStaticProps, or App Router.\n */\n\nimport { createClient } from '@supabase/supabase-js'\nimport type { CommerceOffering, OfferingType } from './types'\n\ninterface ServerConfig {\n supabaseUrl: string\n supabaseKey: string\n projectId: string\n}\n\nfunction getSupabaseClient(config: ServerConfig) {\n return createClient(config.supabaseUrl, config.supabaseKey)\n}\n\nfunction transformOffering(data: any): CommerceOffering {\n return {\n id: data.id,\n project_id: data.project_id,\n type: data.type,\n status: data.status,\n name: data.name,\n slug: data.slug,\n description: data.description,\n short_description: data.short_description,\n long_description: data.long_description,\n featured_image_url: data.featured_image_url,\n gallery_images: data.gallery_image_urls || [],\n price_type: data.price_type,\n price: data.price,\n compare_at_price: data.compare_at_price,\n currency: data.currency || 'USD',\n price_is_public: data.price_is_public ?? true,\n billing_period: data.billing_period,\n track_inventory: data.track_inventory,\n inventory_count: data.inventory_count,\n allow_backorder: data.allow_backorder,\n duration_minutes: data.duration_minutes,\n capacity: data.capacity,\n location: data.location,\n is_virtual: data.is_virtual,\n virtual_meeting_url: data.virtual_meeting_url,\n requires_booking: data.requires_booking,\n booking_lead_time_hours: data.booking_lead_time_hours,\n category: data.category,\n category_id: data.category_id,\n tags: data.tags || [],\n seo_title: data.seo_title,\n seo_description: data.seo_description,\n features: data.features || [],\n specifications: data.specifications || {},\n schedules: data.schedules || [],\n variants: data.variants || [],\n created_at: data.created_at,\n updated_at: data.updated_at,\n }\n}\n\n// ============================================\n// Static Path Generators\n// ============================================\n\n/**\n * Get all product slugs for static generation\n * \n * @example Next.js Pages Router\n * export async function getStaticPaths() {\n * const paths = await getProductPaths(config)\n * return { paths, fallback: 'blocking' }\n * }\n */\nexport async function getProductPaths(config: ServerConfig): Promise<{ params: { slug: string } }[]> {\n const supabase = getSupabaseClient(config)\n \n const { data, error } = await supabase\n .from('commerce_offerings')\n .select('slug')\n .eq('project_id', config.projectId)\n .eq('type', 'product')\n .eq('status', 'active')\n \n if (error || !data) return []\n \n return data.map(item => ({ params: { slug: item.slug } }))\n}\n\n/**\n * Get all event slugs for static generation\n */\nexport async function getEventPaths(config: ServerConfig): Promise<{ params: { slug: string } }[]> {\n const supabase = getSupabaseClient(config)\n \n const { data, error } = await supabase\n .from('commerce_offerings')\n .select('slug')\n .eq('project_id', config.projectId)\n .eq('type', 'event')\n .eq('status', 'active')\n \n if (error || !data) return []\n \n return data.map(item => ({ params: { slug: item.slug } }))\n}\n\n/**\n * Get all offering slugs for static generation (any type)\n */\nexport async function getOfferingPaths(\n config: ServerConfig,\n type?: OfferingType | OfferingType[]\n): Promise<{ params: { slug: string } }[]> {\n const supabase = getSupabaseClient(config)\n \n let query = supabase\n .from('commerce_offerings')\n .select('slug')\n .eq('project_id', config.projectId)\n .eq('status', 'active')\n \n if (type) {\n if (Array.isArray(type)) {\n query = query.in('type', type)\n } else {\n query = query.eq('type', type)\n }\n }\n \n const { data, error } = await query\n \n if (error || !data) return []\n \n return data.map(item => ({ params: { slug: item.slug } }))\n}\n\n// ============================================\n// Data Fetchers\n// ============================================\n\n/**\n * Fetch a single offering by slug (server-side)\n * \n * @example Next.js Pages Router\n * export async function getStaticProps({ params }) {\n * const product = await getOfferingBySlug(config, params.slug)\n * if (!product) return { notFound: true }\n * return { props: { product }, revalidate: 60 }\n * }\n */\nexport async function getOfferingBySlug(\n config: ServerConfig,\n slug: string\n): Promise<CommerceOffering | null> {\n const supabase = getSupabaseClient(config)\n \n const { data, error } = await supabase\n .from('commerce_offerings')\n .select(`\n *,\n category:commerce_categories(id, name, slug),\n variants:commerce_variants(*),\n schedules:commerce_schedules(*)\n `)\n .eq('project_id', config.projectId)\n .eq('slug', slug)\n .single()\n \n if (error || !data) return null\n \n return transformOffering(data)\n}\n\n/**\n * Fetch all offerings of a type (server-side)\n */\nexport async function getOfferings(\n config: ServerConfig,\n options: {\n type?: OfferingType | OfferingType[]\n category?: string\n limit?: number\n status?: string\n } = {}\n): Promise<CommerceOffering[]> {\n const supabase = getSupabaseClient(config)\n \n let query = supabase\n .from('commerce_offerings')\n .select(`\n *,\n category:commerce_categories(id, name, slug),\n variants:commerce_variants(*),\n schedules:commerce_schedules(*)\n `)\n .eq('project_id', config.projectId)\n .eq('status', options.status || 'active')\n .order('sort_order', { ascending: true })\n \n if (options.type) {\n if (Array.isArray(options.type)) {\n query = query.in('type', options.type)\n } else {\n query = query.eq('type', options.type)\n }\n }\n \n if (options.category) {\n query = query.eq('category_id', options.category)\n }\n \n if (options.limit) {\n query = query.limit(options.limit)\n }\n \n const { data, error } = await query\n \n if (error || !data) return []\n \n return data.map(transformOffering)\n}\n\n/**\n * Fetch upcoming events (server-side)\n */\nexport async function getUpcomingEvents(\n config: ServerConfig,\n options: { limit?: number; category?: string } = {}\n): Promise<CommerceOffering[]> {\n const supabase = getSupabaseClient(config)\n const now = new Date().toISOString()\n \n let query = supabase\n .from('commerce_offerings')\n .select(`\n *,\n category:commerce_categories(id, name, slug),\n schedules:commerce_schedules(*)\n `)\n .eq('project_id', config.projectId)\n .eq('type', 'event')\n .eq('status', 'active')\n \n if (options.category) {\n query = query.eq('category_id', options.category)\n }\n \n const { data, error } = await query\n \n if (error || !data) return []\n \n // Filter events with upcoming schedules and sort\n const eventsWithSchedules = data\n .map(event => {\n const schedules = (event.schedules || [])\n .filter((s: any) => new Date(s.starts_at) >= new Date(now) && s.status === 'scheduled')\n .sort((a: any, b: any) => new Date(a.starts_at).getTime() - new Date(b.starts_at).getTime())\n \n return {\n ...transformOffering(event),\n schedules,\n next_schedule: schedules[0] || null,\n }\n })\n .filter(event => event.schedules.length > 0)\n .sort((a, b) => {\n const aDate = (a as any).next_schedule?.starts_at\n const bDate = (b as any).next_schedule?.starts_at\n if (!aDate || !bDate) return 0\n return new Date(aDate).getTime() - new Date(bDate).getTime()\n })\n \n if (options.limit) {\n return eventsWithSchedules.slice(0, options.limit)\n }\n \n return eventsWithSchedules\n}\n\n/**\n * Get next upcoming event (server-side)\n */\nexport async function getNextEvent(\n config: ServerConfig,\n category?: string\n): Promise<CommerceOffering | null> {\n const events = await getUpcomingEvents(config, { limit: 1, category })\n return events[0] || null\n}\n\n// ============================================\n// Metadata Helpers\n// ============================================\n\n/**\n * Generate page metadata for an offering\n * \n * @example Next.js App Router\n * export async function generateMetadata({ params }) {\n * const product = await getOfferingBySlug(config, params.slug)\n * return generateOfferingMetadata(product, 'https://example.com')\n * }\n */\nexport function generateOfferingMetadata(\n offering: CommerceOffering | null,\n siteUrl: string\n): {\n title: string\n description: string\n openGraph: {\n title: string\n description: string\n images: string[]\n type: string\n url: string\n }\n} | null {\n if (!offering) return null\n \n const title = offering.seo_title || offering.name\n const description = offering.seo_description || offering.short_description || offering.description || ''\n const images = offering.featured_image_url ? [offering.featured_image_url] : []\n \n const typeMap: Record<OfferingType, string> = {\n product: 'product',\n service: 'website',\n event: 'website',\n class: 'website',\n subscription: 'product',\n }\n \n return {\n title,\n description,\n openGraph: {\n title,\n description,\n images,\n type: typeMap[offering.type] || 'website',\n url: `${siteUrl}/${offering.type}s/${offering.slug}`,\n },\n }\n}\n\n// ============================================\n// Export config builder\n// ============================================\n\nexport function createServerConfig(\n supabaseUrl: string,\n supabaseKey: string,\n projectId: string\n): ServerConfig {\n return { supabaseUrl, supabaseKey, projectId }\n}\n"]}
@@ -0,0 +1,50 @@
1
+ 'use strict';
2
+
3
+ var chunkTUKGA3UK_js = require('../chunk-TUKGA3UK.js');
4
+ require('../chunk-EQCVQC35.js');
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+
7
+ function ChatWidget({ projectId, config }) {
8
+ return /* @__PURE__ */ jsxRuntime.jsx(
9
+ "div",
10
+ {
11
+ style: {
12
+ position: "fixed",
13
+ [config?.position === "bottom-left" ? "left" : "right"]: 20,
14
+ bottom: 20,
15
+ width: 60,
16
+ height: 60,
17
+ borderRadius: "50%",
18
+ backgroundColor: config?.buttonColor || "#0066cc",
19
+ display: "flex",
20
+ alignItems: "center",
21
+ justifyContent: "center",
22
+ cursor: "pointer",
23
+ boxShadow: "0 4px 12px rgba(0, 0, 0, 0.2)"
24
+ },
25
+ title: "Chat with us",
26
+ children: /* @__PURE__ */ jsxRuntime.jsx(
27
+ "svg",
28
+ {
29
+ width: "28",
30
+ height: "28",
31
+ viewBox: "0 0 24 24",
32
+ fill: "none",
33
+ stroke: "white",
34
+ strokeWidth: "2",
35
+ strokeLinecap: "round",
36
+ strokeLinejoin: "round",
37
+ children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" })
38
+ }
39
+ )
40
+ }
41
+ );
42
+ }
43
+
44
+ Object.defineProperty(exports, "EngageWidget", {
45
+ enumerable: true,
46
+ get: function () { return chunkTUKGA3UK_js.EngageWidget; }
47
+ });
48
+ exports.ChatWidget = ChatWidget;
49
+ //# sourceMappingURL=index.js.map
50
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/engage/ChatWidget.tsx"],"names":["jsx"],"mappings":";;;;;;AAgBO,SAAS,UAAA,CAAW,EAAE,SAAA,EAAW,MAAA,EAAO,EAAoB;AAUjE,EAAA,uBACEA,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,OAAA;AAAA,QACV,CAAC,MAAA,EAAQ,QAAA,KAAa,aAAA,GAAgB,MAAA,GAAS,OAAO,GAAG,EAAA;AAAA,QACzD,MAAA,EAAQ,EAAA;AAAA,QACR,KAAA,EAAO,EAAA;AAAA,QACP,MAAA,EAAQ,EAAA;AAAA,QACR,YAAA,EAAc,KAAA;AAAA,QACd,eAAA,EAAiB,QAAQ,WAAA,IAAe,SAAA;AAAA,QACxC,OAAA,EAAS,MAAA;AAAA,QACT,UAAA,EAAY,QAAA;AAAA,QACZ,cAAA,EAAgB,QAAA;AAAA,QAChB,MAAA,EAAQ,SAAA;AAAA,QACR,SAAA,EAAW;AAAA,OACb;AAAA,MACA,KAAA,EAAM,cAAA;AAAA,MAGN,QAAA,kBAAAA,cAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,IAAA;AAAA,UACN,MAAA,EAAO,IAAA;AAAA,UACP,OAAA,EAAQ,WAAA;AAAA,UACR,IAAA,EAAK,MAAA;AAAA,UACL,MAAA,EAAO,OAAA;AAAA,UACP,WAAA,EAAY,GAAA;AAAA,UACZ,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe,OAAA;AAAA,UAEf,QAAA,kBAAAA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,+DAAA,EAAgE;AAAA;AAAA;AAC1E;AAAA,GACF;AAEJ","file":"index.js","sourcesContent":["/**\n * @uptrade/site-kit/engage - Chat Widget (Placeholder)\n * \n * AI/Live chat widget - implementation TBD\n */\n\n'use client'\n\nimport React from 'react'\nimport type { ChatConfig } from './types'\n\ninterface ChatWidgetProps {\n projectId: string\n config?: Partial<ChatConfig>\n}\n\nexport function ChatWidget({ projectId, config }: ChatWidgetProps) {\n // Placeholder - full implementation will include:\n // - Chat bubble button\n // - Expandable chat window\n // - Message history\n // - AI (Echo) integration\n // - Live agent handoff\n // - Typing indicators\n // - File attachments\n \n return (\n <div\n style={{\n position: 'fixed',\n [config?.position === 'bottom-left' ? 'left' : 'right']: 20,\n bottom: 20,\n width: 60,\n height: 60,\n borderRadius: '50%',\n backgroundColor: config?.buttonColor || '#0066cc',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.2)',\n }}\n title=\"Chat with us\"\n >\n {/* Chat icon */}\n <svg\n width=\"28\"\n height=\"28\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n </div>\n )\n}\n"]}
@@ -0,0 +1,44 @@
1
+ export { EngageWidget } from '../chunk-4HVYXYQL.mjs';
2
+ import '../chunk-NYKRE2FL.mjs';
3
+ import { jsx } from 'react/jsx-runtime';
4
+
5
+ function ChatWidget({ projectId, config }) {
6
+ return /* @__PURE__ */ jsx(
7
+ "div",
8
+ {
9
+ style: {
10
+ position: "fixed",
11
+ [config?.position === "bottom-left" ? "left" : "right"]: 20,
12
+ bottom: 20,
13
+ width: 60,
14
+ height: 60,
15
+ borderRadius: "50%",
16
+ backgroundColor: config?.buttonColor || "#0066cc",
17
+ display: "flex",
18
+ alignItems: "center",
19
+ justifyContent: "center",
20
+ cursor: "pointer",
21
+ boxShadow: "0 4px 12px rgba(0, 0, 0, 0.2)"
22
+ },
23
+ title: "Chat with us",
24
+ children: /* @__PURE__ */ jsx(
25
+ "svg",
26
+ {
27
+ width: "28",
28
+ height: "28",
29
+ viewBox: "0 0 24 24",
30
+ fill: "none",
31
+ stroke: "white",
32
+ strokeWidth: "2",
33
+ strokeLinecap: "round",
34
+ strokeLinejoin: "round",
35
+ children: /* @__PURE__ */ jsx("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" })
36
+ }
37
+ )
38
+ }
39
+ );
40
+ }
41
+
42
+ export { ChatWidget };
43
+ //# sourceMappingURL=index.mjs.map
44
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/engage/ChatWidget.tsx"],"names":[],"mappings":";;;;AAgBO,SAAS,UAAA,CAAW,EAAE,SAAA,EAAW,MAAA,EAAO,EAAoB;AAUjE,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,OAAA;AAAA,QACV,CAAC,MAAA,EAAQ,QAAA,KAAa,aAAA,GAAgB,MAAA,GAAS,OAAO,GAAG,EAAA;AAAA,QACzD,MAAA,EAAQ,EAAA;AAAA,QACR,KAAA,EAAO,EAAA;AAAA,QACP,MAAA,EAAQ,EAAA;AAAA,QACR,YAAA,EAAc,KAAA;AAAA,QACd,eAAA,EAAiB,QAAQ,WAAA,IAAe,SAAA;AAAA,QACxC,OAAA,EAAS,MAAA;AAAA,QACT,UAAA,EAAY,QAAA;AAAA,QACZ,cAAA,EAAgB,QAAA;AAAA,QAChB,MAAA,EAAQ,SAAA;AAAA,QACR,SAAA,EAAW;AAAA,OACb;AAAA,MACA,KAAA,EAAM,cAAA;AAAA,MAGN,QAAA,kBAAA,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,IAAA;AAAA,UACN,MAAA,EAAO,IAAA;AAAA,UACP,OAAA,EAAQ,WAAA;AAAA,UACR,IAAA,EAAK,MAAA;AAAA,UACL,MAAA,EAAO,OAAA;AAAA,UACP,WAAA,EAAY,GAAA;AAAA,UACZ,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe,OAAA;AAAA,UAEf,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,+DAAA,EAAgE;AAAA;AAAA;AAC1E;AAAA,GACF;AAEJ","file":"index.mjs","sourcesContent":["/**\n * @uptrade/site-kit/engage - Chat Widget (Placeholder)\n * \n * AI/Live chat widget - implementation TBD\n */\n\n'use client'\n\nimport React from 'react'\nimport type { ChatConfig } from './types'\n\ninterface ChatWidgetProps {\n projectId: string\n config?: Partial<ChatConfig>\n}\n\nexport function ChatWidget({ projectId, config }: ChatWidgetProps) {\n // Placeholder - full implementation will include:\n // - Chat bubble button\n // - Expandable chat window\n // - Message history\n // - AI (Echo) integration\n // - Live agent handoff\n // - Typing indicators\n // - File attachments\n \n return (\n <div\n style={{\n position: 'fixed',\n [config?.position === 'bottom-left' ? 'left' : 'right']: 20,\n bottom: 20,\n width: 60,\n height: 60,\n borderRadius: '50%',\n backgroundColor: config?.buttonColor || '#0066cc',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.2)',\n }}\n title=\"Chat with us\"\n >\n {/* Chat icon */}\n <svg\n width=\"28\"\n height=\"28\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n </div>\n )\n}\n"]}