@datlv-trustshop/shopify-inapp-components 0.2.8 → 0.2.9

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 (226) hide show
  1. package/dist/components/AppList.d.ts +1 -0
  2. package/dist/components/AppList.d.ts.map +1 -0
  3. package/dist/components/AppList.js +1 -0
  4. package/dist/components/AppList.js.map +1 -0
  5. package/dist/components/ArticleList.d.ts +1 -0
  6. package/dist/components/ArticleList.d.ts.map +1 -0
  7. package/dist/components/ArticleList.js +1 -0
  8. package/dist/components/ArticleList.js.map +1 -0
  9. package/dist/components/ArticleSlide.d.ts +1 -0
  10. package/dist/components/ArticleSlide.d.ts.map +1 -0
  11. package/dist/components/ArticleSlide.js +1 -0
  12. package/dist/components/ArticleSlide.js.map +1 -0
  13. package/dist/components/FloatingCard.d.ts +1 -0
  14. package/dist/components/FloatingCard.d.ts.map +1 -0
  15. package/dist/components/FloatingCard.js +5 -4
  16. package/dist/components/FloatingCard.js.map +1 -0
  17. package/dist/components/FooterBanner.d.ts +1 -0
  18. package/dist/components/FooterBanner.d.ts.map +1 -0
  19. package/dist/components/FooterBanner.js +1 -0
  20. package/dist/components/FooterBanner.js.map +1 -0
  21. package/dist/components/GrowApps.d.ts +6 -6
  22. package/dist/components/GrowApps.d.ts.map +1 -0
  23. package/dist/components/GrowApps.js +11 -3
  24. package/dist/components/GrowApps.js.map +1 -0
  25. package/dist/components/ImageLoading.d.ts +1 -0
  26. package/dist/components/ImageLoading.d.ts.map +1 -0
  27. package/dist/components/ImageLoading.js +1 -0
  28. package/dist/components/ImageLoading.js.map +1 -0
  29. package/dist/components/PartnerIntegration.d.ts +8 -8
  30. package/dist/components/PartnerIntegration.d.ts.map +1 -0
  31. package/dist/components/PartnerIntegration.js +15 -76
  32. package/dist/components/PartnerIntegration.js.map +1 -0
  33. package/dist/components/PartnerList.d.ts +1 -0
  34. package/dist/components/PartnerList.d.ts.map +1 -0
  35. package/dist/components/PartnerList.js +1 -0
  36. package/dist/components/PartnerList.js.map +1 -0
  37. package/dist/components/PopupBanner.d.ts +4 -4
  38. package/dist/components/PopupBanner.d.ts.map +1 -0
  39. package/dist/components/PopupBanner.js +5 -1
  40. package/dist/components/PopupBanner.js.map +1 -0
  41. package/dist/components/TopBanner.d.ts +7 -7
  42. package/dist/components/TopBanner.d.ts.map +1 -0
  43. package/dist/components/TopBanner.js +15 -30
  44. package/dist/components/TopBanner.js.map +1 -0
  45. package/dist/components/WhatsNew.d.ts +6 -7
  46. package/dist/components/WhatsNew.d.ts.map +1 -0
  47. package/dist/components/WhatsNew.js +23 -25
  48. package/dist/components/WhatsNew.js.map +1 -0
  49. package/dist/components/index.d.ts +1 -0
  50. package/dist/components/index.d.ts.map +1 -0
  51. package/dist/components/index.js +1 -0
  52. package/dist/components/index.js.map +1 -0
  53. package/dist/components/inlineStyles.d.ts +1 -0
  54. package/dist/components/inlineStyles.d.ts.map +1 -0
  55. package/dist/components/inlineStyles.js +1 -0
  56. package/dist/components/inlineStyles.js.map +1 -0
  57. package/dist/components/styles.d.ts +1 -0
  58. package/dist/components/styles.d.ts.map +1 -0
  59. package/dist/components/styles.js +1 -0
  60. package/dist/components/styles.js.map +1 -0
  61. package/dist/config/component-defaults.d.ts +71 -0
  62. package/dist/config/component-defaults.d.ts.map +1 -0
  63. package/dist/config/component-defaults.js +106 -0
  64. package/dist/config/component-defaults.js.map +1 -0
  65. package/dist/config/internal-config.d.ts +28 -0
  66. package/dist/config/internal-config.d.ts.map +1 -0
  67. package/dist/config/internal-config.js +100 -0
  68. package/dist/config/internal-config.js.map +1 -0
  69. package/dist/core/SDKManager.d.ts +230 -0
  70. package/dist/core/SDKManager.d.ts.map +1 -0
  71. package/dist/core/SDKManager.js +380 -0
  72. package/dist/core/SDKManager.js.map +1 -0
  73. package/dist/core/adapter.d.ts +1 -0
  74. package/dist/core/adapter.d.ts.map +1 -0
  75. package/dist/core/adapter.js +1 -0
  76. package/dist/core/adapter.js.map +1 -0
  77. package/dist/core/engine.d.ts +1 -0
  78. package/dist/core/engine.d.ts.map +1 -0
  79. package/dist/core/engine.js +1 -0
  80. package/dist/core/engine.js.map +1 -0
  81. package/dist/core/fetcher.d.ts +1 -0
  82. package/dist/core/fetcher.d.ts.map +1 -0
  83. package/dist/core/fetcher.js +1 -0
  84. package/dist/core/fetcher.js.map +1 -0
  85. package/dist/core/global-manager.d.ts +1 -0
  86. package/dist/core/global-manager.d.ts.map +1 -0
  87. package/dist/core/global-manager.js +1 -0
  88. package/dist/core/global-manager.js.map +1 -0
  89. package/dist/hooks/index.d.ts +1 -0
  90. package/dist/hooks/index.d.ts.map +1 -0
  91. package/dist/hooks/index.js +1 -0
  92. package/dist/hooks/index.js.map +1 -0
  93. package/dist/hooks/useApps.d.ts +2 -1
  94. package/dist/hooks/useApps.d.ts.map +1 -0
  95. package/dist/hooks/useApps.js +8 -15
  96. package/dist/hooks/useApps.js.map +1 -0
  97. package/dist/hooks/useArticles.d.ts +1 -0
  98. package/dist/hooks/useArticles.d.ts.map +1 -0
  99. package/dist/hooks/useArticles.js +14 -18
  100. package/dist/hooks/useArticles.js.map +1 -0
  101. package/dist/hooks/useBanner.d.ts +2 -1
  102. package/dist/hooks/useBanner.d.ts.map +1 -0
  103. package/dist/hooks/useBanner.js +14 -15
  104. package/dist/hooks/useBanner.js.map +1 -0
  105. package/dist/hooks/useCampaignTracking.d.ts +1 -0
  106. package/dist/hooks/useCampaignTracking.d.ts.map +1 -0
  107. package/dist/hooks/useCampaignTracking.js +1 -0
  108. package/dist/hooks/useCampaignTracking.js.map +1 -0
  109. package/dist/hooks/useDashboard.d.ts +1 -0
  110. package/dist/hooks/useDashboard.d.ts.map +1 -0
  111. package/dist/hooks/useDashboard.js +12 -9
  112. package/dist/hooks/useDashboard.js.map +1 -0
  113. package/dist/hooks/useFloatingCardActions.d.ts +1 -0
  114. package/dist/hooks/useFloatingCardActions.d.ts.map +1 -0
  115. package/dist/hooks/useFloatingCardActions.js +1 -0
  116. package/dist/hooks/useFloatingCardActions.js.map +1 -0
  117. package/dist/hooks/useFloatingCardEngine.d.ts +1 -0
  118. package/dist/hooks/useFloatingCardEngine.d.ts.map +1 -0
  119. package/dist/hooks/useFloatingCardEngine.js +1 -0
  120. package/dist/hooks/useFloatingCardEngine.js.map +1 -0
  121. package/dist/hooks/useFloatingCards.d.ts +3 -2
  122. package/dist/hooks/useFloatingCards.d.ts.map +1 -0
  123. package/dist/hooks/useFloatingCards.js +37 -12
  124. package/dist/hooks/useFloatingCards.js.map +1 -0
  125. package/dist/hooks/useGrowApps.d.ts +1 -0
  126. package/dist/hooks/useGrowApps.d.ts.map +1 -0
  127. package/dist/hooks/useGrowApps.js +1 -0
  128. package/dist/hooks/useGrowApps.js.map +1 -0
  129. package/dist/hooks/usePartnerIntegration.d.ts +5 -4
  130. package/dist/hooks/usePartnerIntegration.d.ts.map +1 -0
  131. package/dist/hooks/usePartnerIntegration.js +10 -38
  132. package/dist/hooks/usePartnerIntegration.js.map +1 -0
  133. package/dist/hooks/useTranslations.d.ts +1 -0
  134. package/dist/hooks/useTranslations.d.ts.map +1 -0
  135. package/dist/hooks/useTranslations.js +5 -3
  136. package/dist/hooks/useTranslations.js.map +1 -0
  137. package/dist/hooks/useWhatsNew.d.ts +1 -0
  138. package/dist/hooks/useWhatsNew.d.ts.map +1 -0
  139. package/dist/hooks/useWhatsNew.js +12 -11
  140. package/dist/hooks/useWhatsNew.js.map +1 -0
  141. package/dist/index.d.ts +38 -22
  142. package/dist/index.d.ts.map +1 -0
  143. package/dist/index.js +76 -22
  144. package/dist/index.js.map +1 -0
  145. package/dist/translations/default.d.ts +1 -0
  146. package/dist/translations/default.d.ts.map +1 -0
  147. package/dist/translations/default.js +1 -0
  148. package/dist/translations/default.js.map +1 -0
  149. package/dist/translations/locales/cn.json +39 -0
  150. package/dist/translations/locales/de.json +39 -0
  151. package/dist/translations/locales/dk.json +39 -0
  152. package/dist/translations/locales/en.json +39 -0
  153. package/dist/translations/locales/es.json +39 -0
  154. package/dist/translations/locales/fr.json +39 -0
  155. package/dist/translations/locales/ie.json +39 -0
  156. package/dist/translations/locales/in.json +39 -0
  157. package/dist/translations/locales/it.json +39 -0
  158. package/dist/translations/locales/jp.json +39 -0
  159. package/dist/translations/locales/nl.json +39 -0
  160. package/dist/translations/locales/nz.json +39 -0
  161. package/dist/translations/locales/pt.json +39 -0
  162. package/dist/translations/locales/se.json +39 -0
  163. package/dist/translations/locales/vi.json +39 -0
  164. package/dist/translations/translation-manager.d.ts +89 -0
  165. package/dist/translations/translation-manager.d.ts.map +1 -0
  166. package/dist/translations/translation-manager.js +239 -0
  167. package/dist/translations/translation-manager.js.map +1 -0
  168. package/dist/types/app.d.ts +1 -0
  169. package/dist/types/app.d.ts.map +1 -0
  170. package/dist/types/app.js +1 -0
  171. package/dist/types/app.js.map +1 -0
  172. package/dist/types/article.d.ts +1 -0
  173. package/dist/types/article.d.ts.map +1 -0
  174. package/dist/types/article.js +1 -0
  175. package/dist/types/article.js.map +1 -0
  176. package/dist/types/banner.d.ts +1 -0
  177. package/dist/types/banner.d.ts.map +1 -0
  178. package/dist/types/banner.js +1 -0
  179. package/dist/types/banner.js.map +1 -0
  180. package/dist/types/component-props.d.ts +140 -0
  181. package/dist/types/component-props.d.ts.map +1 -0
  182. package/dist/types/component-props.js +6 -0
  183. package/dist/types/component-props.js.map +1 -0
  184. package/dist/types/dashboard.d.ts +1 -0
  185. package/dist/types/dashboard.d.ts.map +1 -0
  186. package/dist/types/dashboard.js +1 -0
  187. package/dist/types/dashboard.js.map +1 -0
  188. package/dist/types/index.d.ts +1 -0
  189. package/dist/types/index.d.ts.map +1 -0
  190. package/dist/types/index.js +1 -0
  191. package/dist/types/index.js.map +1 -0
  192. package/dist/types/integration.d.ts +1 -0
  193. package/dist/types/integration.d.ts.map +1 -0
  194. package/dist/types/integration.js +1 -0
  195. package/dist/types/integration.js.map +1 -0
  196. package/dist/types/partner.d.ts +1 -0
  197. package/dist/types/partner.d.ts.map +1 -0
  198. package/dist/types/partner.js +1 -0
  199. package/dist/types/partner.js.map +1 -0
  200. package/dist/types/product-update.d.ts +1 -0
  201. package/dist/types/product-update.d.ts.map +1 -0
  202. package/dist/types/product-update.js +1 -0
  203. package/dist/types/product-update.js.map +1 -0
  204. package/dist/types/translations.d.ts +1 -0
  205. package/dist/types/translations.d.ts.map +1 -0
  206. package/dist/types/translations.js +1 -0
  207. package/dist/types/translations.js.map +1 -0
  208. package/dist/utils/campaignTracking.d.ts +1 -0
  209. package/dist/utils/campaignTracking.d.ts.map +1 -0
  210. package/dist/utils/campaignTracking.js +1 -0
  211. package/dist/utils/campaignTracking.js.map +1 -0
  212. package/dist/utils/cls-monitor.d.ts +1 -0
  213. package/dist/utils/cls-monitor.d.ts.map +1 -0
  214. package/dist/utils/cls-monitor.js +1 -0
  215. package/dist/utils/cls-monitor.js.map +1 -0
  216. package/dist/utils/injectStyles.d.ts +1 -0
  217. package/dist/utils/injectStyles.d.ts.map +1 -0
  218. package/dist/utils/injectStyles.js +1 -0
  219. package/dist/utils/injectStyles.js.map +1 -0
  220. package/dist/utils/sessionManager.d.ts +1 -0
  221. package/dist/utils/sessionManager.d.ts.map +1 -0
  222. package/dist/utils/sessionManager.js +1 -0
  223. package/dist/utils/sessionManager.js.map +1 -0
  224. package/package.json +4 -3
  225. package/dist/provider/DashboardProvider.d.ts +0 -36
  226. package/dist/provider/DashboardProvider.js +0 -200
@@ -11,3 +11,4 @@ export interface AppListProps {
11
11
  gridColumns?: number;
12
12
  }
13
13
  export declare const AppList: React.FC<AppListProps>;
14
+ //# sourceMappingURL=AppList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AppList.d.ts","sourceRoot":"","sources":["../../src/components/AppList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAG7C,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;IACpC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CAoJ1C,CAAC"}
@@ -62,3 +62,4 @@ export const AppList = ({ group, className = "", onAppClick, showRating = true,
62
62
  color: "#999",
63
63
  }, children: [_jsxs("div", { style: { display: "flex", alignItems: "center", gap: "12px" }, children: [showRating && app.rating && (_jsxs("div", { style: { display: "flex", alignItems: "center" }, children: [_jsx("span", { style: { color: "#ffa500", marginRight: "4px" }, children: "\u2605" }), _jsx("span", { children: app.rating.toFixed(1) })] })), showInstalls && app.installs && (_jsxs("div", { children: [app.installs.toLocaleString(), " installs"] }))] }), showPrice && (_jsx("div", { style: { fontWeight: "600", color: "#333" }, children: app.price || "Free" }))] })] }, app.id))) }));
64
64
  };
65
+ //# sourceMappingURL=AppList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AppList.js","sourceRoot":"","sources":["../../src/components/AppList.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from \"react\";\nimport { AppItem, AppGroup } from \"../types\";\nimport { useApps } from \"../hooks/useApps\";\n\nexport interface AppListProps {\n group?: AppGroup;\n className?: string;\n onAppClick?: (app: AppItem) => void;\n showRating?: boolean;\n showInstalls?: boolean;\n showPrice?: boolean;\n limit?: number;\n gridColumns?: number;\n}\n\nexport const AppList: React.FC<AppListProps> = ({\n group,\n className = \"\",\n onAppClick,\n showRating = true,\n showInstalls = false,\n showPrice = false,\n limit,\n gridColumns = 3,\n}) => {\n const apps = useApps(group);\n const displayApps = limit ? apps.slice(0, limit) : apps;\n\n const handleAppClick = (app: AppItem) => {\n if (app.link) {\n window.open(app.link, \"_blank\");\n }\n onAppClick?.(app);\n };\n\n if (displayApps.length === 0) {\n return (\n <div className={`app-list-empty ${className}`}>\n <p style={{ textAlign: \"center\", color: \"#999\" }}>No apps available</p>\n </div>\n );\n }\n\n return (\n <div\n className={`app-list ${className}`}\n style={{\n display: \"grid\",\n gridTemplateColumns: `repeat(${gridColumns}, 1fr)`,\n gap: \"20px\",\n }}\n >\n {displayApps.map((app) => (\n <div\n key={app.id}\n className=\"app-item\"\n style={{\n padding: \"16px\",\n border: \"1px solid #e0e0e0\",\n borderRadius: \"8px\",\n cursor: \"pointer\",\n transition: \"box-shadow 0.2s\",\n backgroundColor: \"#ffffff\",\n }}\n onClick={() => handleAppClick(app)}\n onMouseEnter={(e) => {\n e.currentTarget.style.boxShadow = \"0 4px 8px rgba(0, 0, 0, 0.1)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.boxShadow = \"none\";\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"start\",\n marginBottom: \"12px\",\n }}\n >\n {app.icon && (\n <img\n src={app.icon}\n alt={app.title}\n style={{\n width: \"48px\",\n height: \"48px\",\n borderRadius: \"8px\",\n marginRight: \"12px\",\n }}\n />\n )}\n <div style={{ flex: 1 }}>\n <h3\n style={{\n margin: \"0 0 4px 0\",\n fontSize: \"16px\",\n fontWeight: \"600\",\n color: \"#333\",\n }}\n >\n {app.title}\n </h3>\n {app.featured && (\n <span\n style={{\n display: \"inline-block\",\n padding: \"2px 6px\",\n backgroundColor: \"#ffd700\",\n color: \"#333\",\n fontSize: \"10px\",\n fontWeight: \"bold\",\n borderRadius: \"3px\",\n }}\n >\n FEATURED\n </span>\n )}\n </div>\n </div>\n\n <p\n style={{\n margin: \"0 0 12px 0\",\n fontSize: \"14px\",\n color: \"#666\",\n lineHeight: \"1.4\",\n }}\n >\n {app.description}\n </p>\n\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n fontSize: \"12px\",\n color: \"#999\",\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"12px\" }}>\n {showRating && app.rating && (\n <div style={{ display: \"flex\", alignItems: \"center\" }}>\n <span style={{ color: \"#ffa500\", marginRight: \"4px\" }}>\n ★\n </span>\n <span>{app.rating.toFixed(1)}</span>\n </div>\n )}\n {showInstalls && app.installs && (\n <div>{app.installs.toLocaleString()} installs</div>\n )}\n </div>\n {showPrice && (\n <div style={{ fontWeight: \"600\", color: \"#333\" }}>\n {app.price || \"Free\"}\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n );\n};\n"]}
@@ -18,3 +18,4 @@ export interface ArticleListProps {
18
18
  }) => React.ReactNode;
19
19
  }
20
20
  export declare const ArticleList: React.FC<ArticleListProps>;
21
+ //# sourceMappingURL=ArticleList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArticleList.d.ts","sourceRoot":"","sources":["../../src/components/ArticleList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAGnD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGvC,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;IAChD,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IACnC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,YAAY,CAAC,EAAE,CACb,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE;QACR,OAAO,EAAE,MAAM,IAAI,CAAC;KACrB,KACE,KAAK,CAAC,SAAS,CAAC;CACtB;AAED,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CA0UlD,CAAC"}
@@ -172,3 +172,4 @@ export const ArticleList = ({ limit, className = "", onArticleClick, layout = "s
172
172
  }
173
173
  return null;
174
174
  };
175
+ //# sourceMappingURL=ArticleList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArticleList.js","sourceRoot":"","sources":["../../src/components/ArticleList.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useEffect } from \"react\";\nimport { Button, Box } from \"@shopify/polaris\";\nimport { ExternalIcon } from \"@shopify/polaris-icons\";\nimport { ArticleItem } from \"../types\";\nimport { useDashboard } from \"../hooks/useDashboard\";\n\nexport interface ArticleListProps {\n limit?: number;\n className?: string;\n onArticleClick?: (article: ArticleItem) => void;\n layout?: \"slide\" | \"list\" | \"grid\";\n showThumbnail?: boolean;\n showAuthor?: boolean;\n showDate?: boolean;\n currentIndex?: number;\n showNavigation?: boolean;\n autoPlay?: boolean;\n autoPlayInterval?: number;\n onSlideChange?: (index: number) => void;\n renderButton?: (\n article: ArticleItem,\n handlers: {\n onClick: () => void;\n },\n ) => React.ReactNode;\n}\n\nexport const ArticleList: React.FC<ArticleListProps> = ({\n limit,\n className = \"\",\n onArticleClick,\n layout = \"slide\",\n showThumbnail = true,\n currentIndex: externalCurrentIndex,\n showNavigation = true,\n autoPlay = false,\n autoPlayInterval = 5000,\n onSlideChange,\n renderButton,\n}) => {\n const { data } = useDashboard();\n const articles = data?.articles || [];\n const displayArticles = limit ? articles.slice(0, limit) : articles;\n const [isMobile, setIsMobile] = useState(false);\n const [internalCurrentIndex, setInternalCurrentIndex] = useState(0);\n\n const currentIndex =\n externalCurrentIndex !== undefined\n ? externalCurrentIndex\n : internalCurrentIndex;\n\n useEffect(() => {\n const checkMobile = () => {\n setIsMobile(window.innerWidth <= 768);\n };\n\n checkMobile();\n window.addEventListener(\"resize\", checkMobile);\n\n return () => window.removeEventListener(\"resize\", checkMobile);\n }, []);\n\n useEffect(() => {\n if (!autoPlay || layout !== \"slide\" || displayArticles.length <= 1) return;\n\n const interval = setInterval(() => {\n const newIndex = (currentIndex + 1) % displayArticles.length;\n if (externalCurrentIndex === undefined) {\n setInternalCurrentIndex(newIndex);\n }\n onSlideChange?.(newIndex);\n }, autoPlayInterval);\n\n return () => clearInterval(interval);\n }, [\n autoPlay,\n layout,\n displayArticles.length,\n currentIndex,\n autoPlayInterval,\n externalCurrentIndex,\n onSlideChange,\n ]);\n\n const handleSlideChange = (newIndex: number) => {\n if (externalCurrentIndex === undefined) {\n setInternalCurrentIndex(newIndex);\n }\n onSlideChange?.(newIndex);\n };\n\n const handlePrevious = () => {\n const newIndex =\n currentIndex === 0 ? displayArticles.length - 1 : currentIndex - 1;\n handleSlideChange(newIndex);\n };\n\n const handleNext = () => {\n const newIndex = (currentIndex + 1) % displayArticles.length;\n handleSlideChange(newIndex);\n };\n\n const handleArticleClick = (article: ArticleItem) => {\n if (article.link) {\n window.open(article.link, \"_blank\");\n }\n onArticleClick?.(article);\n };\n\n if (displayArticles.length === 0) {\n return (\n <div className={className} style={{ width: \"100%\" }}>\n <p style={{ textAlign: \"center\", color: \"#999\" }}>\n No articles available\n </p>\n </div>\n );\n }\n\n if (layout === \"slide\") {\n let slidePercentage: number;\n if (isMobile) {\n slidePercentage = currentIndex * 90;\n } else {\n const itemWidth = 100 / displayArticles.length;\n slidePercentage = currentIndex * itemWidth * 1.5;\n }\n\n return (\n <div\n className={className}\n style={{\n position: \"relative\",\n overflow: \"hidden\",\n width: \"100%\",\n }}\n >\n <div\n style={{\n overflow: \"hidden\",\n position: \"relative\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n transition: \"transform 0.5s ease-in-out\",\n gap: \"20px\",\n willChange: \"transform\",\n transform: `translateX(-${slidePercentage}%)`,\n }}\n >\n {displayArticles.map((article) => (\n <div\n key={article.id}\n style={{\n flex: \"0 0 auto\",\n width: isMobile ? \"90%\" : \"270px\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"4px\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"10px\",\n }}\n >\n {showThumbnail && article.imageUrl && (\n <div\n style={{\n width: isMobile ? \"100%\" : \"270px\",\n height: \"152px\",\n overflow: \"hidden\",\n borderRadius: \"8px\",\n }}\n >\n <img\n src={\n article.imageUrl ||\n \"https://asset.trustshop.io/dashboard/news-review-summary.png\"\n }\n alt={article.title}\n style={{\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n }}\n />\n </div>\n )}\n {article.category && (\n <div\n style={{\n color: \"var(--p-color-text-emphasis, #616161)\",\n }}\n >\n <span style={{ fontSize: \"13px\" }}>\n {article.category}\n </span>\n </div>\n )}\n </div>\n\n <div\n className=\"title-button\"\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"6px\",\n }}\n >\n <h3\n style={{\n margin: 0,\n fontSize: \"14px\",\n fontWeight: \"bold\",\n color: \"#303030\",\n lineHeight: \"1.4\",\n }}\n >\n {article.title}\n </h3>\n\n {renderButton ? (\n renderButton(article, {\n onClick: () => handleArticleClick(article),\n })\n ) : (\n <Box>\n <Button\n icon={ExternalIcon}\n onClick={() => handleArticleClick(article)}\n variant=\"plain\"\n >\n {article.buttonText || (article.link ? \"Read article\" : \"Learn more\")}\n </Button>\n </Box>\n )}\n </div>\n </div>\n </div>\n ))}\n </div>\n\n {showNavigation && displayArticles.length > 1 && (\n <>\n <button\n onClick={handlePrevious}\n aria-label=\"Previous slide\"\n style={{\n position: \"absolute\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n left: \"10px\",\n background: \"rgba(255, 255, 255, 0.9)\",\n border: \"1px solid #e3e3e3\",\n borderRadius: \"50%\",\n width: \"32px\",\n height: \"32px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n zIndex: 10,\n transition: \"background-color 0.2s\",\n padding: 0,\n }}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"#303030\">\n <path\n d=\"M10.5 13L5.5 8l5-5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n </button>\n <button\n onClick={handleNext}\n aria-label=\"Next slide\"\n style={{\n position: \"absolute\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n right: \"10px\",\n background: \"rgba(255, 255, 255, 0.9)\",\n border: \"1px solid #e3e3e3\",\n borderRadius: \"50%\",\n width: \"32px\",\n height: \"32px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n zIndex: 10,\n transition: \"background-color 0.2s\",\n padding: 0,\n }}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"#303030\">\n <path\n d=\"M5.5 13l5-5-5-5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n </button>\n </>\n )}\n </div>\n\n {showNavigation && displayArticles.length > 1 && (\n <div\n style={{\n display: \"flex\",\n justifyContent: \"center\",\n gap: \"8px\",\n marginTop: \"16px\",\n }}\n >\n {displayArticles.map((_, index) => (\n <button\n key={index}\n onClick={() => handleSlideChange(index)}\n aria-label={`Go to slide ${index + 1}`}\n style={{\n width: \"8px\",\n height: \"8px\",\n borderRadius: \"50%\",\n backgroundColor:\n index === currentIndex ? \"#303030\" : \"#e3e3e3\",\n cursor: \"pointer\",\n transition: \"background-color 0.3s\",\n border: \"none\",\n padding: 0,\n }}\n />\n ))}\n </div>\n )}\n </div>\n );\n }\n\n return null;\n};\n"]}
@@ -12,3 +12,4 @@ export interface ArticleSlideProps {
12
12
  }) => React.ReactNode;
13
13
  }
14
14
  export declare const ArticleSlide: React.FC<ArticleSlideProps>;
15
+ //# sourceMappingURL=ArticleSlide.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArticleSlide.d.ts","sourceRoot":"","sources":["../../src/components/ArticleSlide.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGvC,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;IAChD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,CACb,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE;QACR,OAAO,EAAE,MAAM,IAAI,CAAC;KACrB,KACE,KAAK,CAAC,SAAS,CAAC;CACtB;AAED,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CA4SpD,CAAC"}
@@ -149,3 +149,4 @@ export const ArticleSlide = ({ limit, className = "", onArticleClick, autoPlay =
149
149
  padding: 0,
150
150
  } }, index))) }))] }));
151
151
  };
152
+ //# sourceMappingURL=ArticleSlide.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArticleSlide.js","sourceRoot":"","sources":["../../src/components/ArticleSlide.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useEffect } from \"react\";\nimport { ArticleItem } from \"../types\";\nimport { useDashboard } from \"../hooks/useDashboard\";\n\nexport interface ArticleSlideProps {\n limit?: number;\n className?: string;\n onArticleClick?: (article: ArticleItem) => void;\n autoPlay?: boolean;\n autoPlayInterval?: number;\n showNavigation?: boolean;\n renderButton?: (\n article: ArticleItem,\n handlers: {\n onClick: () => void;\n },\n ) => React.ReactNode;\n}\n\nexport const ArticleSlide: React.FC<ArticleSlideProps> = ({\n limit,\n className = \"\",\n onArticleClick,\n autoPlay = false,\n autoPlayInterval = 5000,\n showNavigation = true,\n renderButton,\n}) => {\n const { data } = useDashboard();\n const articles = data?.articles || [];\n const displayArticles = limit ? articles.slice(0, limit) : articles;\n const [currentIndex, setCurrentIndex] = useState(0);\n const [isMobile, setIsMobile] = useState(false);\n\n useEffect(() => {\n const checkMobile = () => {\n setIsMobile(window.innerWidth <= 768);\n };\n\n checkMobile();\n window.addEventListener(\"resize\", checkMobile);\n\n return () => window.removeEventListener(\"resize\", checkMobile);\n }, []);\n\n useEffect(() => {\n if (!autoPlay || displayArticles.length <= 1) return;\n\n const interval = setInterval(() => {\n setCurrentIndex((prev) => (prev + 1) % displayArticles.length);\n }, autoPlayInterval);\n\n return () => clearInterval(interval);\n }, [autoPlay, autoPlayInterval, displayArticles.length]);\n\n const handleArticleClick = (article: ArticleItem) => {\n if (article.link) {\n window.open(article.link, \"_blank\");\n }\n onArticleClick?.(article);\n };\n\n const handlePrevious = () => {\n setCurrentIndex((prev) =>\n prev === 0 ? displayArticles.length - 1 : prev - 1,\n );\n };\n\n const handleNext = () => {\n setCurrentIndex((prev) => (prev + 1) % displayArticles.length);\n };\n\n if (displayArticles.length === 0) {\n return (\n <div className={className} style={{ width: \"100%\" }}>\n <p style={{ textAlign: \"center\", color: \"#999\" }}>\n No articles available\n </p>\n </div>\n );\n }\n\n let slidePercentage: number;\n if (isMobile) {\n slidePercentage = currentIndex * 90;\n } else {\n const itemWidth = 100 / displayArticles.length;\n slidePercentage = currentIndex * itemWidth * 1.5;\n }\n\n return (\n <div \n className={className}\n style={{\n position: \"relative\",\n overflow: \"hidden\",\n width: \"100%\",\n }}\n >\n <div style={{\n overflow: \"hidden\",\n position: \"relative\",\n }}>\n <div\n style={{\n display: \"flex\",\n transition: \"transform 0.5s ease-in-out\",\n gap: \"20px\",\n willChange: \"transform\",\n transform: `translateX(-${slidePercentage}%)`,\n }}\n >\n {displayArticles.map((article) => (\n <div\n key={article.id}\n style={{\n flex: \"0 0 auto\",\n width: isMobile ? \"90%\" : \"270px\",\n }}\n >\n <div\n style={{ display: \"flex\", flexDirection: \"column\", gap: \"4px\" }}\n >\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"10px\",\n }}\n >\n {article.thumbnail && (\n <div style={{\n width: isMobile ? \"100%\" : \"270px\",\n height: \"152px\",\n overflow: \"hidden\",\n borderRadius: \"8px\",\n }}>\n <img\n src={\n article.thumbnail ||\n \"https://asset.trustshop.io/dashboard/news-review-summary.png\"\n }\n alt={article.title}\n style={{\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n }}\n />\n </div>\n )}\n {article.category && (\n <div\n style={{ color: \"var(--p-color-text-emphasis, #616161)\" }}\n >\n <span style={{ fontSize: \"13px\" }}>\n {article.category}\n </span>\n </div>\n )}\n </div>\n\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"6px\",\n }}\n >\n <h3\n style={{\n margin: 0,\n fontSize: \"14px\",\n fontWeight: \"bold\",\n color: \"#303030\",\n lineHeight: \"1.4\",\n }}\n >\n {article.title}\n </h3>\n\n {renderButton ? (\n renderButton(article, {\n onClick: () => handleArticleClick(article),\n })\n ) : (\n <button\n onClick={() => handleArticleClick(article)}\n style={{\n background: \"none\",\n border: \"none\",\n color: \"var(--p-color-text, #303030)\",\n cursor: \"pointer\",\n padding: \"4px 0\",\n fontSize: \"14px\",\n textAlign: \"left\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"4px\",\n }}\n >\n {article.buttonText || (article.link ? \"Read article\" : \"Learn more\")}\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path d=\"M17 2a1 1 0 0 1 1 1v4a1 1 0 1 1-2 0V4.414l-7.293 7.293a1 1 0 0 1-1.414-1.414L14.586 3H12a1 1 0 1 1 0-2h5Z\" />\n <path d=\"M3 6a1 1 0 0 1 1-1h5a1 1 0 1 1 0 2H5v10h10v-4a1 1 0 1 1 2 0v5a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V6Z\" />\n </svg>\n </button>\n )}\n </div>\n </div>\n </div>\n ))}\n </div>\n\n {showNavigation && displayArticles.length > 1 && (\n <>\n <button\n onClick={handlePrevious}\n aria-label=\"Previous slide\"\n style={{\n position: \"absolute\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n left: \"10px\",\n background: \"rgba(255, 255, 255, 0.9)\",\n border: \"1px solid #e3e3e3\",\n borderRadius: \"50%\",\n width: \"32px\",\n height: \"32px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n zIndex: 10,\n transition: \"background-color 0.2s\",\n padding: 0,\n }}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"#303030\">\n <path\n d=\"M10.5 13L5.5 8l5-5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n </button>\n <button\n onClick={handleNext}\n aria-label=\"Next slide\"\n style={{\n position: \"absolute\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n right: \"10px\",\n background: \"rgba(255, 255, 255, 0.9)\",\n border: \"1px solid #e3e3e3\",\n borderRadius: \"50%\",\n width: \"32px\",\n height: \"32px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n zIndex: 10,\n transition: \"background-color 0.2s\",\n padding: 0,\n }}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"#303030\">\n <path\n d=\"M5.5 13l5-5-5-5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n </button>\n </>\n )}\n </div>\n\n {showNavigation && displayArticles.length > 1 && (\n <div style={{\n display: \"flex\",\n justifyContent: \"center\",\n gap: \"8px\",\n marginTop: \"16px\",\n }}>\n {displayArticles.map((_, index) => (\n <button\n key={index}\n onClick={() => setCurrentIndex(index)}\n aria-label={`Go to slide ${index + 1}`}\n style={{\n width: \"8px\",\n height: \"8px\",\n borderRadius: \"50%\",\n backgroundColor: index === currentIndex ? \"#303030\" : \"#e3e3e3\",\n cursor: \"pointer\",\n transition: \"background-color 0.3s\",\n border: \"none\",\n padding: 0,\n }}\n />\n ))}\n </div>\n )}\n </div>\n );\n};\n"]}
@@ -44,3 +44,4 @@ interface FloatingCardProps {
44
44
  }
45
45
  export declare const FloatingCard: React.FC<FloatingCardProps>;
46
46
  export default FloatingCard;
47
+ //# sourceMappingURL=FloatingCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FloatingCard.d.ts","sourceRoot":"","sources":["../../src/components/FloatingCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAwB,MAAM,OAAO,CAAC;AAa7C,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,KAAK,CAAC;KAC3D,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE;QACf,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,OAAO,CAAC;QAClB,OAAO,EAAE,SAAS,GAAG,WAAW,CAAC;KAClC,CAAC;IACF,gBAAgB,CAAC,EAAE;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,OAAO,CAAC;QAClB,OAAO,EAAE,SAAS,GAAG,WAAW,CAAC;KAClC,CAAC;IACF,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC/B;AAED,UAAU,iBAAiB;IACzB,IAAI,EAAE,gBAAgB,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACnD,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACrD,QAAQ,CAAC,EAAE,cAAc,GAAG,aAAa,GAAG,WAAW,GAAG,UAAU,CAAC;IACrE,aAAa,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACjC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CA6PpD,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -2,11 +2,11 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import React from "react";
3
3
  import { Card, BlockStack, InlineStack, Text, Badge, Button, Box, } from "@shopify/polaris";
4
4
  import { useCampaignTracking } from "../hooks/useCampaignTracking";
5
- import { DashboardContext } from "../provider/DashboardProvider";
5
+ import { useSDK } from "../core/SDKManager";
6
6
  export const FloatingCard = ({ data, shopId: propsShopId, onDismiss, onPrimaryAction, onSecondaryAction, position = 'bottom-right', showCloseButton = true, }) => {
7
- // Get shopId from context if not provided via props
8
- const dashboardContext = React.useContext(DashboardContext);
9
- const contextShopId = dashboardContext?.engine?.config?.shopId;
7
+ // Get shopId from SDK shopInfo if not provided via props
8
+ const sdk = useSDK({});
9
+ const contextShopId = sdk.shopInfo?.id;
10
10
  const shopId = propsShopId || contextShopId;
11
11
  // Use the campaign ID from data or fallback to regular id
12
12
  const campaignId = data.campaign_id || data.id;
@@ -162,3 +162,4 @@ export const FloatingCard = ({ data, shopId: propsShopId, onDismiss, onPrimaryAc
162
162
  : "plain", onClick: handlePrimaryAction, children: data.primary_action.label })), data.secondary_action && (_jsx(Button, { variant: "tertiary", onClick: handleSecondaryAction, children: data.secondary_action.label }))] })] }) })] })] }) }));
163
163
  };
164
164
  export default FloatingCard;
165
+ //# sourceMappingURL=FloatingCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FloatingCard.js","sourceRoot":"","sources":["../../src/components/FloatingCard.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { CSSProperties } from \"react\";\nimport {\n Card,\n BlockStack,\n InlineStack,\n Text,\n Badge,\n Button,\n Box,\n} from \"@shopify/polaris\";\nimport { useCampaignTracking } from \"../hooks/useCampaignTracking\";\nimport { useSDK } from \"../core/SDKManager\";\n\nexport interface FloatingCardData {\n id: number;\n key: string;\n type: string;\n priority: number;\n title: string;\n description: string;\n date: string;\n tag?: {\n label: string;\n tone: \"success\" | \"info\" | \"warning\" | \"critical\" | \"new\";\n };\n img_url: string;\n image_alt?: string | null;\n image_type: string;\n primary_action?: {\n label: string;\n url: string;\n external: boolean;\n variant: \"primary\" | \"secondary\";\n };\n secondary_action?: {\n label: string;\n url: string;\n external: boolean;\n variant: \"primary\" | \"secondary\";\n };\n dismissible: boolean;\n auto_close_after?: number | null;\n reappear_interval?: number | null;\n display_pages?: string[];\n campaign_id?: string | number; // Added for tracking purposes\n}\n\ninterface FloatingCardProps {\n data: FloatingCardData;\n shopId?: string; // Required for tracking\n onDismiss?: () => void;\n onPrimaryAction?: (data: FloatingCardData) => void;\n onSecondaryAction?: (data: FloatingCardData) => void;\n position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';\n animationType?: 'slide' | 'fade';\n showCloseButton?: boolean;\n}\n\nexport const FloatingCard: React.FC<FloatingCardProps> = ({\n data,\n shopId: propsShopId,\n onDismiss,\n onPrimaryAction,\n onSecondaryAction,\n position = 'bottom-right',\n showCloseButton = true,\n}) => {\n // Get shopId from SDK shopInfo if not provided via props\n const sdk = useSDK({});\n const contextShopId = sdk.shopInfo?.id;\n const shopId = propsShopId || contextShopId;\n \n // Use the campaign ID from data or fallback to regular id\n const campaignId = data.campaign_id || data.id;\n \n // Set up campaign tracking\n const tracking = shopId && campaignId ? useCampaignTracking({\n shopId,\n campaignId,\n threshold: 0.5, // Track when 50% visible\n visibilityDuration: 1000, // Track view after 1 second\n metadata: {\n card_type: data.type,\n card_key: data.key,\n },\n }) : null;\n const handlePrimaryAction = () => {\n // Track the click\n tracking?.trackPrimaryAction();\n \n if (data.primary_action) {\n const url = data.primary_action.url;\n \n // Check if it's an external URL\n if (data.primary_action.external) {\n window.open(url, \"_blank\");\n } \n // Check if it's a modal trigger\n else if (url === \"modal\" || url === \"/pricing\") {\n // Pass the full card data to the handler for modal handling\n onPrimaryAction?.(data);\n }\n // Check if it's an internal route\n else if (url?.startsWith(\"/\")) {\n // Pass the full card data for internal navigation\n onPrimaryAction?.(data);\n }\n // Default: just call the handler\n else {\n onPrimaryAction?.(data);\n }\n }\n };\n\n const handleSecondaryAction = () => {\n // Track the click\n tracking?.trackSecondaryAction();\n \n if (data.secondary_action) {\n const url = data.secondary_action.url;\n \n if (data.secondary_action.external) {\n window.open(url, \"_blank\");\n } else if (url?.startsWith(\"/\") || url === \"modal\") {\n // Pass the full card data for internal handling\n onSecondaryAction?.(data);\n } else {\n onSecondaryAction?.(data);\n }\n }\n };\n \n const handleDismiss = () => {\n // Track the dismiss\n tracking?.trackDismiss();\n onDismiss?.();\n };\n\n // CSS-in-JS styles - no external CSS file needed\n const floatingCardStyles: CSSProperties = {\n position: 'fixed',\n zIndex: 9999,\n width: '300px',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n borderRadius: '8px',\n boxShadow: '0 4px 26px 0 rgba(0, 0, 0, 0.10)',\n overflow: 'hidden',\n animation: 'slideInUp 0.3s ease-out',\n ...(position === 'bottom-right' && { bottom: '20px', right: '20px' }),\n ...(position === 'bottom-left' && { bottom: '20px', left: '20px' }),\n ...(position === 'top-right' && { top: '20px', right: '20px' }),\n ...(position === 'top-left' && { top: '20px', left: '20px' }),\n };\n\n const closeButtonStyles: CSSProperties = {\n display: 'flex',\n padding: '4px 2px',\n justifyContent: 'center',\n alignItems: 'center',\n gap: '2px',\n position: 'absolute',\n right: '7px',\n top: '7px',\n borderRadius: '8px',\n background: 'rgba(255, 255, 255, 0.10)',\n border: 'none',\n cursor: 'pointer',\n transition: 'background 0.2s ease',\n zIndex: 10,\n backdropFilter: 'blur(10px)',\n WebkitBackdropFilter: 'blur(10px)',\n };\n\n const imageContainerStyles: CSSProperties = {\n position: 'relative',\n height: '168.75px',\n aspectRatio: '16/9',\n width: '100%',\n overflow: 'hidden',\n borderRadius: '8px 8px 0 0',\n backgroundColor: '#f5f5f5',\n };\n\n // Add keyframe animation dynamically\n React.useEffect(() => {\n // Check if animation already exists\n const styleId = 'floating-card-animations';\n if (!document.getElementById(styleId)) {\n const style = document.createElement('style');\n style.id = styleId;\n style.innerHTML = `\n @keyframes slideInUp {\n from {\n transform: translateY(100%);\n opacity: 0;\n }\n to {\n transform: translateY(0);\n opacity: 1;\n }\n }\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n `;\n document.head.appendChild(style);\n }\n }, []);\n\n return (\n <div ref={tracking?.elementRef} style={floatingCardStyles}>\n <Card padding=\"0\" roundedAbove=\"sm\">\n {(showCloseButton && data.dismissible !== false) && (\n <button\n style={closeButtonStyles}\n onClick={handleDismiss}\n aria-label=\"Close\"\n >\n <div style={{\n width: \"20px\",\n height: \"20ox\"\n }}>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\">\n <path d=\"M6.71967 7.78033C7.01256 8.07322 7.48744 8.07322 7.78033 7.78033C8.07322 7.48744 8.07322 7.01256 7.78033 6.71967L5.06066 4L7.78033 1.28033C8.07322 0.987437 8.07322 0.512563 7.78033 0.21967C7.48744 -0.073223 7.01256 -0.073223 6.71967 0.21967L4 2.93934L1.28033 0.21967C0.987437 -0.0732233 0.512564 -0.0732233 0.21967 0.21967C-0.0732225 0.512563 -0.0732226 0.987437 0.21967 1.28033L2.93934 4L0.21967 6.71967C-0.0732233 7.01256 -0.0732233 7.48744 0.21967 7.78033C0.512563 8.07322 0.987437 8.07322 1.28033 7.78033L4 5.06066L6.71967 7.78033Z\" fill=\"white\" fillOpacity=\"0.6\"/>\n </svg>\n </div>\n </button>\n )}\n\n <BlockStack gap=\"0\">\n {data.img_url && (\n <div style={imageContainerStyles}>\n <img\n src={data.img_url}\n alt={data.image_alt || data.title}\n style={{\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n }}\n onError={(e) => {\n console.error(\"Image failed to load:\", data.img_url);\n (e.target as HTMLImageElement).style.display = \"none\";\n }}\n />\n </div>\n )}\n\n <Box padding=\"400\">\n <BlockStack gap=\"500\">\n <BlockStack gap=\"300\">\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"6px\",\n }}\n >\n <div style={{\n display: \"flex\",\n flexDirection: \"row\",\n gap: \"6px\",\n alignItems: \"start\"\n }}>\n <Text as=\"h2\" variant=\"bodyLg\" fontWeight=\"semibold\">\n {data.title}\n </Text>\n {data.tag && (\n <Badge tone={data.tag.tone || \"success\"}>\n {data.tag.label}\n </Badge>\n )}\n </div>\n\n <Text as=\"p\" variant=\"bodySm\">\n {data.date}\n </Text>\n </div>\n\n <Text as=\"p\" variant=\"bodyMd\">\n {data.description}\n </Text>\n </BlockStack>\n <InlineStack gap=\"200\">\n {data.primary_action && (\n <Button\n variant={\n data.primary_action.variant === \"primary\"\n ? \"primary\"\n : \"plain\"\n }\n onClick={handlePrimaryAction}\n >\n {data.primary_action.label}\n </Button>\n )}\n {data.secondary_action && (\n <Button variant=\"tertiary\" onClick={handleSecondaryAction}>\n {data.secondary_action.label}\n </Button>\n )}\n </InlineStack>\n </BlockStack>\n </Box>\n </BlockStack>\n </Card>\n </div>\n );\n};\n\nexport default FloatingCard;\n"]}
@@ -8,3 +8,4 @@ export interface FooterBannerProps {
8
8
  sticky?: boolean;
9
9
  }
10
10
  export declare const FooterBanner: React.FC<FooterBannerProps>;
11
+ //# sourceMappingURL=FooterBanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FooterBanner.d.ts","sourceRoot":"","sources":["../../src/components/FooterBanner.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGtC,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CA4IpD,CAAC"}
@@ -70,3 +70,4 @@ export const FooterBanner = ({ className = "", onClose, onAction, closable = tru
70
70
  padding: "0 4px",
71
71
  }, "aria-label": "Close banner", children: "\u00D7" }))] })] }));
72
72
  };
73
+ //# sourceMappingURL=FooterBanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FooterBanner.js","sourceRoot":"","sources":["../../src/components/FooterBanner.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState } from \"react\";\nimport { BannerItem } from \"../types\";\nimport { useFooterBanner } from \"../hooks/useBanner\";\n\nexport interface FooterBannerProps {\n className?: string;\n onClose?: () => void;\n onAction?: (banner: BannerItem) => void;\n closable?: boolean;\n sticky?: boolean;\n}\n\nexport const FooterBanner: React.FC<FooterBannerProps> = ({\n className = \"\",\n onClose,\n onAction,\n closable = true,\n sticky = true,\n}) => {\n const banner = useFooterBanner();\n const [isVisible, setIsVisible] = useState(true);\n\n const handleClose = () => {\n setIsVisible(false);\n onClose?.();\n };\n\n const handleAction = () => {\n if (banner) {\n if (banner.link) {\n window.open(\n banner.link,\n banner.openType === \"new_tab\" ? \"_blank\" : \"_self\",\n );\n }\n onAction?.(banner);\n }\n };\n\n if (!banner || !isVisible) {\n return null;\n }\n\n const styles: React.CSSProperties = {\n backgroundColor: banner.style?.backgroundColor || \"#333333\",\n color: banner.style?.textColor || \"#ffffff\",\n };\n\n const buttonStyles: React.CSSProperties = {\n backgroundColor: banner.style?.buttonColor || \"#ffffff\",\n color: banner.style?.buttonTextColor || \"#333333\",\n };\n\n return (\n <div\n className={`footer-banner ${className}`}\n style={{\n ...styles,\n position: sticky ? \"fixed\" : \"relative\",\n bottom: 0,\n left: 0,\n right: 0,\n padding: \"16px 20px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n zIndex: sticky ? 1000 : \"auto\",\n boxShadow: \"0 -2px 4px rgba(0, 0, 0, 0.1)\",\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", flex: 1 }}>\n {banner.icon && (\n <img\n src={banner.icon}\n alt=\"\"\n style={{\n width: \"32px\",\n height: \"32px\",\n marginRight: \"16px\",\n }}\n />\n )}\n\n <div style={{ flex: 1 }}>\n <div\n style={{\n fontSize: \"16px\",\n fontWeight: \"bold\",\n marginBottom: \"4px\",\n }}\n >\n {banner.title}\n </div>\n {banner.description && (\n <div style={{ fontSize: \"14px\", opacity: 0.9 }}>\n {banner.description}\n </div>\n )}\n </div>\n\n {banner.image && (\n <img\n src={banner.image}\n alt=\"\"\n style={{\n maxHeight: \"60px\",\n marginLeft: \"20px\",\n borderRadius: \"4px\",\n }}\n />\n )}\n </div>\n\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"12px\" }}>\n {banner.link && (\n <button\n onClick={handleAction}\n style={{\n ...buttonStyles,\n padding: \"8px 20px\",\n border: \"none\",\n borderRadius: \"4px\",\n fontSize: \"14px\",\n fontWeight: \"600\",\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n }}\n >\n {banner.linkText || \"Learn More\"}\n </button>\n )}\n\n {closable && (\n <button\n onClick={handleClose}\n style={{\n background: \"none\",\n border: \"none\",\n fontSize: \"24px\",\n cursor: \"pointer\",\n color: styles.color,\n opacity: 0.7,\n padding: \"0 4px\",\n }}\n aria-label=\"Close banner\"\n >\n ×\n </button>\n )}\n </div>\n </div>\n );\n};\n"]}
@@ -1,13 +1,13 @@
1
1
  import React from "react";
2
2
  import { GrowApp } from "../types/dashboard";
3
- export interface GrowAppsProps {
3
+ import { type UseSDKOptions } from "../core/SDKManager";
4
+ export interface GrowAppsProps extends UseSDKOptions {
5
+ /** Optional CSS class */
4
6
  className?: string;
7
+ /** Handle app clicks */
5
8
  onAppClick?: (app: GrowApp) => void;
9
+ /** Optional dismiss callback */
6
10
  onDismiss?: () => void;
7
- dismissKey?: string;
8
- dismissDuration?: number;
9
- showDismiss?: boolean;
10
- showNavigation?: boolean;
11
- maxItems?: number;
12
11
  }
13
12
  export declare const GrowApps: React.FC<GrowAppsProps>;
13
+ //# sourceMappingURL=GrowApps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GrowApps.d.ts","sourceRoot":"","sources":["../../src/components/GrowApps.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4D,MAAM,OAAO,CAAC;AAejF,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAG7C,OAAO,EAAU,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEhE,MAAM,WAAW,aAAc,SAAQ,aAAa;IAClD,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,wBAAwB;IACxB,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;IAEpC,gCAAgC;IAChC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAQD,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CA8iB5C,CAAC"}
@@ -4,14 +4,21 @@ import { Card, Text, BlockStack, Box, InlineStack, Button, Popover, ActionList,
4
4
  import { ExternalIcon, MenuHorizontalIcon } from "@shopify/polaris-icons";
5
5
  import { useDashboard } from "../hooks/useDashboard";
6
6
  import { useTranslation } from "../hooks/useTranslations";
7
- const DEFAULT_DISMISS_KEY = "ts-dashboard-growapps-dismissed";
8
- const DEFAULT_DISMISS_DURATION = 7 * 24 * 60 * 60 * 1000;
7
+ import { COMPONENT_DEFAULTS } from "../config/component-defaults";
8
+ import { useSDK } from "../core/SDKManager";
9
9
  // Fixed dimensions to prevent layout shifts
10
10
  const CARD_WIDTH = 282;
11
11
  const CARD_MIN_HEIGHT = 140; // Reduced from 180 to avoid excessive white space
12
12
  const ICON_SIZE = 60;
13
13
  const GAP_SIZE = 20;
14
- export const GrowApps = ({ className = "", onAppClick, onDismiss, dismissKey = DEFAULT_DISMISS_KEY, dismissDuration = DEFAULT_DISMISS_DURATION, showDismiss = true, showNavigation = true, maxItems = 6, }) => {
14
+ export const GrowApps = ({ className = "", onAppClick, onDismiss,
15
+ // SDK options (optional)
16
+ shopInfo, locale, translations, config, }) => {
17
+ // Connect to SDK Manager (auto-initializes)
18
+ // @ts-ignore - Will be used in future refactoring
19
+ const _sdk = useSDK({ shopInfo, locale, translations, config });
20
+ // Use internal defaults
21
+ const { dismissKey, dismissDuration, showDismiss, showNavigation, maxItems, } = COMPONENT_DEFAULTS.growApps;
15
22
  const slidesContainerRef = useRef(null);
16
23
  const [currentPosition, setCurrentPosition] = useState(0);
17
24
  const { data, loading } = useDashboard();
@@ -284,3 +291,4 @@ export const GrowApps = ({ className = "", onAppClick, onDismiss, dismissKey = D
284
291
  }, children: _jsx(Button, { icon: ExternalIcon, variant: "secondary", size: "medium", onClick: () => handleGetAppClick(app), children: buttonText }) })] })] }) }) }) }, app.id || index));
285
292
  }) }) })] }) }) }) }));
286
293
  };
294
+ //# sourceMappingURL=GrowApps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GrowApps.js","sourceRoot":"","sources":["../../src/components/GrowApps.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useRef, useCallback, useEffect, useMemo } from \"react\";\nimport {\n Card,\n Text,\n BlockStack,\n Box,\n InlineStack,\n Button,\n Popover,\n ActionList,\n SkeletonBodyText,\n SkeletonThumbnail,\n} from \"@shopify/polaris\";\nimport { ExternalIcon, MenuHorizontalIcon } from \"@shopify/polaris-icons\";\nimport { useDashboard } from \"../hooks/useDashboard\";\nimport { GrowApp } from \"../types/dashboard\";\nimport { useTranslation } from \"../hooks/useTranslations\";\nimport { COMPONENT_DEFAULTS } from \"../config/component-defaults\";\nimport { useSDK, type UseSDKOptions } from \"../core/SDKManager\";\n\nexport interface GrowAppsProps extends UseSDKOptions {\n /** Optional CSS class */\n className?: string;\n \n /** Handle app clicks */\n onAppClick?: (app: GrowApp) => void;\n \n /** Optional dismiss callback */\n onDismiss?: () => void;\n}\n\n// Fixed dimensions to prevent layout shifts\nconst CARD_WIDTH = 282;\nconst CARD_MIN_HEIGHT = 140; // Reduced from 180 to avoid excessive white space\nconst ICON_SIZE = 60;\nconst GAP_SIZE = 20;\n\nexport const GrowApps: React.FC<GrowAppsProps> = ({\n className = \"\",\n onAppClick,\n onDismiss,\n // SDK options (optional)\n shopInfo,\n locale,\n translations,\n config,\n}) => {\n // Connect to SDK Manager (auto-initializes)\n // @ts-ignore - Will be used in future refactoring\n const _sdk = useSDK({ shopInfo, locale, translations, config });\n \n // Use internal defaults\n const {\n dismissKey,\n dismissDuration,\n showDismiss,\n showNavigation,\n maxItems,\n } = COMPONENT_DEFAULTS.growApps;\n const slidesContainerRef = useRef<HTMLDivElement>(null);\n const [currentPosition, setCurrentPosition] = useState(0);\n const { data, loading } = useDashboard();\n const growAppsTranslations = useTranslation(\"growApps\");\n\n const allGrowApps = data?.grow_apps || [];\n const displayLimit = data?.grow_apps_display_limit || maxItems;\n const growApps = allGrowApps.slice(0, displayLimit);\n\n const [currentIndex, setCurrentIndex] = useState(0);\n const [maxIndex, setMaxIndex] = useState(0);\n const [popoverActive, setPopoverActive] = useState(false);\n const [isVisible, setIsVisible] = useState(true);\n const [isContentReady, setIsContentReady] = useState(false);\n const [touchDelta, setTouchDelta] = useState(0);\n const [isSwiping, setIsSwiping] = useState(false);\n\n const touchStartX = useRef<number | null>(null);\n const touchEndX = useRef<number | null>(null);\n const swiping = useRef(false);\n const lastDelta = useRef(0);\n\n const togglePopoverActive = () => setPopoverActive((active) => !active);\n\n const handleDismiss = () => {\n setIsVisible(false);\n setPopoverActive(false);\n\n const dismissData = {\n timestamp: Date.now(),\n dismissed: true,\n };\n localStorage.setItem(dismissKey, JSON.stringify(dismissData));\n onDismiss?.();\n };\n\n useEffect(() => {\n const dismissedData = localStorage.getItem(dismissKey);\n if (dismissedData) {\n try {\n const { timestamp } = JSON.parse(dismissedData);\n const now = Date.now();\n\n if (now - timestamp < dismissDuration) {\n setIsVisible(false);\n } else {\n localStorage.removeItem(dismissKey);\n }\n } catch (error) {\n localStorage.removeItem(dismissKey);\n }\n }\n }, [dismissKey, dismissDuration]);\n\n // Mark content as ready when data loads\n useEffect(() => {\n if (!loading && growApps.length >= 0) {\n // Small delay to ensure DOM is ready\n requestAnimationFrame(() => {\n setIsContentReady(true);\n });\n }\n }, [loading, growApps.length]);\n\n const handleGetAppClick = (app: GrowApp) => {\n const url = app.button_install_link || app.app_url || app.get_app || \"#\";\n\n if (url && url !== \"#\") {\n window.open(url, \"_blank\");\n }\n onAppClick?.(app);\n };\n\n const handleSlide = useCallback(\n (direction: number) => {\n if (!slidesContainerRef.current) {\n return;\n }\n\n const slideWrap =\n slidesContainerRef.current.querySelector<HTMLElement>(\n \".slides-wrapper\",\n );\n if (!slideWrap) return;\n\n const containerWidth = slidesContainerRef.current.offsetWidth;\n const totalWidth = slideWrap.scrollWidth;\n const slideWidth = CARD_WIDTH;\n const gap = GAP_SIZE;\n const slideStep = slideWidth + gap;\n\n const maxSlides = Math.max(\n 0,\n Math.ceil((totalWidth - containerWidth) / slideStep),\n );\n const newIndex = Math.max(\n 0,\n Math.min(currentIndex + direction, maxSlides),\n );\n\n if (\n (direction < 0 && currentIndex === 0) ||\n (direction > 0 && currentIndex >= maxSlides)\n ) {\n return;\n }\n\n const newPosition = -newIndex * slideStep;\n\n // Remove direct DOM manipulation - let React handle it\n setCurrentPosition(newPosition);\n setCurrentIndex(newIndex);\n setMaxIndex(maxSlides);\n },\n [currentIndex],\n );\n\n const handleTouchStart = useCallback((e: React.TouchEvent) => {\n touchStartX.current = e.touches[0].clientX;\n touchEndX.current = e.touches[0].clientX; // Initialize end position\n swiping.current = true;\n setIsSwiping(true);\n setTouchDelta(0);\n }, []);\n\n const handleTouchMove = useCallback((e: React.TouchEvent) => {\n if (!swiping.current || touchStartX.current === null) return;\n \n touchEndX.current = e.touches[0].clientX;\n const delta = touchEndX.current - touchStartX.current;\n \n // Only update if delta changed significantly (reduce jitter)\n if (Math.abs(delta - lastDelta.current) > 1) {\n lastDelta.current = delta;\n setTouchDelta(delta);\n }\n }, []);\n\n const handleTouchEnd = useCallback(() => {\n if (!swiping.current) return;\n\n const swipeThreshold = 50;\n const diff = (touchStartX.current || 0) - (touchEndX.current || 0);\n\n if (Math.abs(diff) > swipeThreshold) {\n if (diff > 0) {\n handleSlide(1);\n } else {\n handleSlide(-1);\n }\n } else {\n // Snap back if swipe wasn't far enough\n setTouchDelta(0);\n }\n\n swiping.current = false;\n touchStartX.current = null;\n touchEndX.current = null;\n lastDelta.current = 0;\n setIsSwiping(false);\n setTouchDelta(0);\n }, [handleSlide]);\n\n useEffect(() => {\n const calculateMaxIndex = () => {\n if (!slidesContainerRef.current) return;\n\n const slideWrap =\n slidesContainerRef.current.querySelector<HTMLElement>(\n \".slides-wrapper\",\n );\n if (!slideWrap) return;\n\n const containerWidth = slidesContainerRef.current.offsetWidth;\n const totalWidth = slideWrap.scrollWidth;\n const slideStep = CARD_WIDTH + GAP_SIZE;\n\n const maxSlides = Math.max(\n 0,\n Math.ceil((totalWidth - containerWidth) / slideStep),\n );\n setMaxIndex(maxSlides);\n };\n\n // Use requestAnimationFrame instead of setTimeout for better performance\n const rafId = requestAnimationFrame(calculateMaxIndex);\n\n const handleResize = () => {\n requestAnimationFrame(calculateMaxIndex);\n };\n window.addEventListener(\"resize\", handleResize);\n\n return () => {\n cancelAnimationFrame(rafId);\n window.removeEventListener(\"resize\", handleResize);\n };\n }, [growApps.length]);\n\n // Memoize navigation button styles to prevent recalculation\n // Must be defined before any returns to follow React hooks rules\n const navButtonStyle = useMemo(() => ({\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"24px\",\n height: \"24px\",\n padding: 0,\n border: \"none\",\n borderRadius: \"4px\",\n backgroundColor: \"transparent\",\n transition: \"opacity 0.2s ease\", // Only animate opacity\n }), []);\n\n // Don't render at all if dismissed to prevent CLS\n if (!isVisible) {\n return null;\n }\n\n // Show skeleton while loading to reserve space\n if (loading || !isContentReady) {\n return (\n <div className={className} style={{ width: \"100%\" }}>\n <Card>\n <Box>\n <BlockStack gap=\"200\">\n {/* Header skeleton */}\n <BlockStack gap=\"100\">\n <SkeletonBodyText lines={1} />\n <SkeletonBodyText lines={1} />\n </BlockStack>\n {/* Cards skeleton */}\n <div style={{ display: \"flex\", gap: `${GAP_SIZE}px`, overflow: \"hidden\" }}>\n {[1, 2, 3].map((idx) => (\n <div\n key={idx}\n style={{\n flexShrink: 0,\n width: `${CARD_WIDTH}px`,\n minHeight: `${CARD_MIN_HEIGHT}px`,\n }}\n >\n <Card>\n <Box>\n <BlockStack gap=\"300\">\n <SkeletonThumbnail size=\"large\" />\n <BlockStack gap=\"200\">\n <SkeletonBodyText lines={1} />\n <SkeletonBodyText lines={2} />\n </BlockStack>\n </BlockStack>\n </Box>\n </Card>\n </div>\n ))}\n </div>\n </BlockStack>\n </Box>\n </Card>\n </div>\n );\n }\n\n // Handle empty state with reserved space\n if (growApps.length === 0) {\n return (\n <div className={className} style={{ width: \"100%\" }}>\n <Card>\n <Box>\n <Text variant=\"bodyMd\" tone=\"subdued\" as=\"p\">\n {growAppsTranslations?.noData || \"No apps available\"}\n </Text>\n </Box>\n </Card>\n </div>\n );\n }\n\n const activator = (\n <Button\n icon={MenuHorizontalIcon}\n variant=\"tertiary\"\n onClick={togglePopoverActive}\n ariaExpanded={popoverActive}\n />\n );\n\n return (\n <div className={className} style={{ width: \"100%\" }}>\n <Card>\n <Box>\n <BlockStack gap=\"200\">\n <InlineStack\n align=\"space-between\"\n blockAlign=\"center\"\n wrap={false}\n gap=\"300\"\n >\n <BlockStack gap=\"100\">\n <Text variant=\"headingMd\" as=\"h3\">\n {growAppsTranslations?.title || \"Grow faster with apps\"}\n </Text>\n <Text variant=\"bodyMd\" tone=\"subdued\" as=\"p\">\n {growAppsTranslations?.subtitle ||\n \"Discover powerful apps to enhance your store, streamline workflows, and boost sales.\"}\n </Text>\n </BlockStack>\n <InlineStack gap=\"100\" wrap={false}>\n {showDismiss && (\n <Box padding=\"150\">\n <Popover\n active={popoverActive}\n activator={activator}\n onClose={togglePopoverActive}\n ariaHaspopup={false}\n >\n <ActionList\n actionRole=\"menuitem\"\n items={[\n {\n content: growAppsTranslations?.dismiss || \"Dismiss\",\n onAction: handleDismiss,\n },\n ]}\n />\n </Popover>\n </Box>\n )}\n {showNavigation && growApps.length > 3 && (\n <div\n style={{\n position: \"relative\",\n width: \"fit-content\",\n boxSizing: \"content-box\",\n padding: \"4px 6px\",\n display: \"flex\",\n flexDirection: \"row\",\n flexWrap: \"nowrap\",\n gap: \"4px\",\n borderRadius: \"8px\",\n backgroundColor: \"#e3e3e3\",\n }}\n >\n <button\n onClick={() => handleSlide(-1)}\n disabled={currentIndex === 0}\n style={{\n ...navButtonStyle,\n cursor: currentIndex === 0 ? \"not-allowed\" : \"pointer\",\n opacity: currentIndex === 0 ? 0.5 : 1,\n }}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n >\n <path\n d=\"M10.5 13L5.5 8l5-5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n </button>\n <button\n onClick={() => handleSlide(1)}\n disabled={currentIndex >= maxIndex}\n style={{\n ...navButtonStyle,\n cursor: currentIndex >= maxIndex ? \"not-allowed\" : \"pointer\",\n opacity: currentIndex >= maxIndex ? 0.5 : 1,\n }}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n >\n <path\n d=\"M5.5 13l5-5-5-5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n </button>\n </div>\n )}\n </InlineStack>\n </InlineStack>\n\n <div\n className=\"slides-container\"\n style={{\n overflow: \"hidden\",\n width: \"100%\",\n touchAction: \"pan-y pinch-zoom\", // Allow vertical scroll and pinch, handle horizontal\n WebkitOverflowScrolling: \"touch\", // iOS momentum scrolling\n userSelect: \"none\", // Prevent text selection during swipe\n WebkitUserSelect: \"none\"\n // Removed minHeight to avoid excessive white space\n }}\n ref={slidesContainerRef}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n >\n <div\n className=\"slides-wrapper\"\n style={{\n display: \"flex\",\n gap: `${GAP_SIZE}px`,\n transition: isSwiping ? \"none\" : \"transform 0.3s cubic-bezier(0.4, 0, 0.2, 1)\", // Better easing\n transform: `translate3d(${currentPosition + touchDelta}px, 0, 0)`, // Use translate3d for GPU\n willChange: isSwiping ? \"transform\" : \"auto\", // Only during interaction\n backfaceVisibility: \"hidden\", // Force GPU acceleration\n perspective: 1000, // Create 3D rendering context\n }}\n >\n {growApps.map((app: GrowApp, index: number) => {\n const iconUrl = app.icon_url || app.imageUrl || \"\";\n const buttonText =\n app.button_install_text ||\n app.button_text ||\n app.button_get_app ||\n growAppsTranslations?.install ||\n \"Get app\";\n\n return (\n <div\n key={app.id || index}\n data-index={index}\n style={{\n flexShrink: 0,\n width: `${CARD_WIDTH}px`,\n // Remove per-card transition that causes CLS\n }}\n >\n <Card>\n <Box minWidth={`${CARD_WIDTH - 32}px`}>\n <BlockStack gap=\"300\">\n <InlineStack gap=\"400\" blockAlign=\"start\">\n {iconUrl ? (\n <img\n src={iconUrl}\n alt={app.title}\n width={ICON_SIZE}\n height={ICON_SIZE}\n style={{\n borderRadius: \"8px\",\n flexShrink: 0,\n objectFit: \"cover\",\n }}\n loading=\"eager\"\n decoding=\"async\"\n />\n ) : (\n <div\n style={{\n width: `${ICON_SIZE}px`,\n height: `${ICON_SIZE}px`,\n borderRadius: \"8px\",\n backgroundColor: \"#f0f0f0\",\n flexShrink: 0,\n }}\n />\n )}\n </InlineStack>\n\n <BlockStack gap=\"200\">\n <div\n style={{\n display: \"-webkit-box\",\n fontSize: \"13px\",\n fontWeight: 650,\n color: \"#303030\",\n WebkitLineClamp: 1,\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n minHeight: \"20px\", // Reserve space\n }}\n >\n {app.title}\n </div>\n\n <div\n style={{\n display: \"-webkit-box\",\n WebkitLineClamp: 2,\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n fontSize: \"13px\",\n color: \"#616161\",\n lineHeight: 1.4,\n minHeight: \"36px\", // Reserve space for 2 lines\n }}\n >\n {app.content}\n </div>\n <div\n style={{\n alignSelf: \"flex-start\",\n minHeight: \"36px\", // Reserve space for button\n }}\n >\n <Button\n icon={ExternalIcon}\n variant=\"secondary\"\n size=\"medium\"\n onClick={() => handleGetAppClick(app)}\n >\n {buttonText}\n </Button>\n </div>\n </BlockStack>\n </BlockStack>\n </Box>\n </Card>\n </div>\n );\n })}\n </div>\n </div>\n </BlockStack>\n </Box>\n </Card>\n </div>\n );\n};\n"]}
@@ -13,3 +13,4 @@ interface ImageLoadingProps {
13
13
  }
14
14
  declare const ImageLoading: import("react").NamedExoticComponent<ImageLoadingProps>;
15
15
  export default ImageLoading;
16
+ //# sourceMappingURL=ImageLoading.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageLoading.d.ts","sourceRoot":"","sources":["../../src/components/ImageLoading.tsx"],"names":[],"mappings":"AAEA,UAAU,iBAAiB;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,QAAA,MAAM,YAAY,yDAiGjB,CAAC;AAIF,eAAe,YAAY,CAAC"}
@@ -64,3 +64,4 @@ const ImageLoading = memo(({ src, alt, width, height, background = "var(--p-colo
64
64
  });
65
65
  ImageLoading.displayName = "ImageLoading";
66
66
  export default ImageLoading;
67
+ //# sourceMappingURL=ImageLoading.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageLoading.js","sourceRoot":"","sources":["../../src/components/ImageLoading.tsx"],"names":[],"mappings":"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","sourcesContent":["import { memo, useEffect, useRef } from \"react\";\n\ninterface ImageLoadingProps {\n src: string;\n alt: string;\n width: number;\n height: number;\n background?: string;\n className?: string;\n onLoad?: () => void;\n onError?: () => void;\n aspectRatio?: number;\n borderRadius?: number;\n overflow?: string;\n}\n\nconst ImageLoading = memo<ImageLoadingProps>(\n ({\n src,\n alt,\n width,\n height,\n background = \"var(--p-color-bg-fill-tertiary)\",\n className = \"\",\n onLoad,\n onError,\n aspectRatio,\n borderRadius = 0,\n overflow = \"hidden\",\n }) => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n const devicePixelRatio = window.devicePixelRatio || 1;\n\n canvas.width = width * devicePixelRatio;\n canvas.height = height * devicePixelRatio;\n\n ctx.scale(devicePixelRatio, devicePixelRatio);\n ctx.fillStyle = \"#f3f4f6\";\n ctx.fillRect(0, 0, width, height);\n\n const img = new Image();\n\n img.onload = () => {\n ctx.clearRect(0, 0, width, height);\n ctx.imageSmoothingEnabled = true;\n ctx.imageSmoothingQuality = \"high\";\n\n const imgAspect = img.naturalWidth / img.naturalHeight;\n const canvasAspect = width / height;\n let drawWidth, drawHeight, offsetX, offsetY;\n\n if (imgAspect > canvasAspect) {\n drawHeight = height;\n drawWidth = height * imgAspect;\n offsetX = (width - drawWidth) / 2;\n offsetY = 0;\n } else {\n drawWidth = width;\n drawHeight = width / imgAspect;\n offsetX = 0;\n offsetY = (height - drawHeight) / 2;\n }\n\n ctx.drawImage(img, offsetX, offsetY, drawWidth, drawHeight);\n onLoad?.();\n };\n\n img.onerror = () => {\n onError?.();\n };\n\n img.src = src;\n\n return () => {\n img.onload = null;\n img.onerror = null;\n };\n }, [src, width, height, onLoad, onError]);\n\n return (\n <div\n style={{\n width: \"100%\",\n aspectRatio: height ? `${width / height}` : `${aspectRatio}`,\n background: background,\n borderRadius: borderRadius + \"px\",\n overflow: overflow,\n }}\n className={className}\n >\n <canvas\n ref={canvasRef}\n role=\"img\"\n aria-label={alt}\n style={{\n display: \"block\",\n width: \"100%\",\n height: \"100%\",\n maxWidth: width + \"px\",\n maxHeight: height + \"px\",\n aspectRatio: width / height,\n }}\n />\n </div>\n );\n },\n);\n\nImageLoading.displayName = \"ImageLoading\";\n\nexport default ImageLoading;\n"]}
@@ -1,4 +1,5 @@
1
1
  import React from "react";
2
+ import { type UseSDKOptions } from "../core/SDKManager";
2
3
  import { IntegrationItem } from "../types/integration";
3
4
  export type IntegrationStatusInfo = {
4
5
  isConnected?: boolean;
@@ -11,19 +12,18 @@ export type IntegrationStatusInfo = {
11
12
  upgradeBadgePlan?: "basic" | "pro";
12
13
  };
13
14
  export type IntegrationStatusProvider = (integration: IntegrationItem) => IntegrationStatusInfo | undefined;
14
- export interface PartnerIntegrationProps {
15
+ export interface PartnerIntegrationProps extends UseSDKOptions {
16
+ /** Optional CSS class */
15
17
  className?: string;
18
+ /** Handle manage action */
16
19
  onManage?: (item: IntegrationItem) => void;
20
+ /** Handle install action */
17
21
  onInstall?: (item: IntegrationItem) => void;
22
+ /** Handle open action */
18
23
  onOpen?: (item: IntegrationItem) => void;
24
+ /** Handle upgrade click */
19
25
  onUpgradeClick?: (item: IntegrationItem) => void;
20
- renderCard?: (item: IntegrationItem, handlers: {
21
- onManage: () => void;
22
- onInstall: () => void;
23
- onOpen: () => void;
24
- }) => React.ReactNode;
25
- showEmptyState?: boolean;
26
- statusProvider?: IntegrationStatusProvider;
27
26
  }
28
27
  export declare const PartnerIntegration: React.FC<PartnerIntegrationProps>;
29
28
  export default PartnerIntegration;
29
+ //# sourceMappingURL=PartnerIntegration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PartnerIntegration.d.ts","sourceRoot":"","sources":["../../src/components/PartnerIntegration.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAe1B,OAAO,EAAU,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD,MAAM,MAAM,qBAAqB,GAAG;IAClC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACnC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gBAAgB,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG,CACtC,WAAW,EAAE,eAAe,KACzB,qBAAqB,GAAG,SAAS,CAAC;AAEvC,MAAM,WAAW,uBAAwB,SAAQ,aAAa;IAC5D,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IAE3C,4BAA4B;IAC5B,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IAE5C,yBAAyB;IACzB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IAEzC,2BAA2B;IAC3B,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;CAClD;AAED,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAgNhE,CAAC;AAEF,eAAe,kBAAkB,CAAC"}