@linktr.ee/linkapp 0.0.48 → 0.0.49

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 (203) hide show
  1. package/README.md +1 -1
  2. package/dev-server/components/form/array-field.tsx +115 -0
  3. package/dev-server/components/form/file-field.tsx +48 -0
  4. package/dev-server/components/form/form-element.tsx +304 -0
  5. package/dev-server/components/form/link-behavior-field.tsx +68 -0
  6. package/dev-server/components/form/location-field.tsx +60 -0
  7. package/dev-server/components/settings-preview.tsx +138 -302
  8. package/dev-server/components/ui/checkbox.tsx +29 -0
  9. package/dev-server/components/ui/dialog.tsx +2 -10
  10. package/dev-server/components/ui/field.tsx +24 -49
  11. package/dev-server/components/ui/input.tsx +20 -21
  12. package/dev-server/components/ui/label.tsx +4 -4
  13. package/dev-server/components/ui/radio-group.tsx +37 -0
  14. package/dev-server/components/ui/select.tsx +153 -0
  15. package/dev-server/components/ui/switch.tsx +31 -0
  16. package/dev-server/components/ui/tabs.tsx +1 -1
  17. package/dev-server/components/ui/textarea.tsx +18 -19
  18. package/dev-server/env.d.ts +4 -1
  19. package/dev-server/expanded/main.tsx +20 -22
  20. package/dev-server/expanded.html +0 -1
  21. package/dev-server/featured/main.tsx +29 -36
  22. package/dev-server/featured-carousel.html +0 -1
  23. package/dev-server/featured.html +0 -1
  24. package/dev-server/index.html +1 -7
  25. package/dev-server/lib/utils.ts +3 -3
  26. package/dev-server/package.json +3 -3
  27. package/dev-server/postcss/tailwind-source-fallback.js +2 -7
  28. package/dev-server/postcss.config.mjs +2 -2
  29. package/dev-server/preview/Preview.tsx +310 -350
  30. package/dev-server/preview/main.tsx +8 -8
  31. package/dev-server/preview/preview.css +0 -1
  32. package/dev-server/public/site.webmanifest +1 -1
  33. package/dev-server/rsbuild.config.ts +1 -1
  34. package/dev-server/shared/dev-parent-simulator.ts +219 -0
  35. package/dev-server/shared/theme-presets.ts +71 -75
  36. package/dev-server/shared/theme-utils.ts +11 -11
  37. package/dist/cli.js +18 -12
  38. package/dist/cli.js.map +1 -1
  39. package/dist/commands/add.d.ts.map +1 -1
  40. package/dist/commands/add.js +27 -42
  41. package/dist/commands/add.js.map +1 -1
  42. package/dist/commands/build.d.ts.map +1 -1
  43. package/dist/commands/build.js +26 -16
  44. package/dist/commands/build.js.map +1 -1
  45. package/dist/commands/deploy.d.ts +1 -11
  46. package/dist/commands/deploy.d.ts.map +1 -1
  47. package/dist/commands/deploy.js +3 -13
  48. package/dist/commands/deploy.js.map +1 -1
  49. package/dist/commands/dev.d.ts.map +1 -1
  50. package/dist/commands/dev.js +132 -388
  51. package/dist/commands/dev.js.map +1 -1
  52. package/dist/commands/login.d.ts.map +1 -1
  53. package/dist/commands/login.js +17 -29
  54. package/dist/commands/login.js.map +1 -1
  55. package/dist/commands/logout.d.ts.map +1 -1
  56. package/dist/commands/logout.js +6 -11
  57. package/dist/commands/logout.js.map +1 -1
  58. package/dist/commands/rollback.d.ts +10 -0
  59. package/dist/commands/rollback.d.ts.map +1 -0
  60. package/dist/commands/rollback.js +148 -0
  61. package/dist/commands/rollback.js.map +1 -0
  62. package/dist/commands/status.d.ts +8 -0
  63. package/dist/commands/status.d.ts.map +1 -0
  64. package/dist/commands/status.js +96 -0
  65. package/dist/commands/status.js.map +1 -0
  66. package/dist/commands/test-url-match-rules.d.ts.map +1 -1
  67. package/dist/commands/test-url-match-rules.js +20 -26
  68. package/dist/commands/test-url-match-rules.js.map +1 -1
  69. package/dist/lib/auth/device-flow.d.ts +1 -1
  70. package/dist/lib/auth/device-flow.d.ts.map +1 -1
  71. package/dist/lib/auth/device-flow.js +3 -3
  72. package/dist/lib/auth/device-flow.js.map +1 -1
  73. package/dist/lib/auth/token-storage.d.ts.map +1 -1
  74. package/dist/lib/auth/token-storage.js +14 -37
  75. package/dist/lib/auth/token-storage.js.map +1 -1
  76. package/dist/lib/build/detect-layouts.d.ts.map +1 -1
  77. package/dist/lib/build/detect-layouts.js +27 -13
  78. package/dist/lib/build/detect-layouts.js.map +1 -1
  79. package/dist/lib/config/load-config.d.ts.map +1 -1
  80. package/dist/lib/config/load-config.js +0 -2
  81. package/dist/lib/config/load-config.js.map +1 -1
  82. package/dist/lib/deploy/deploy-output.d.ts +2 -1
  83. package/dist/lib/deploy/deploy-output.d.ts.map +1 -1
  84. package/dist/lib/deploy/deploy-output.js +9 -1
  85. package/dist/lib/deploy/deploy-output.js.map +1 -1
  86. package/dist/lib/deploy/deploy-phases.d.ts +2 -0
  87. package/dist/lib/deploy/deploy-phases.d.ts.map +1 -1
  88. package/dist/lib/deploy/deploy-phases.js +9 -23
  89. package/dist/lib/deploy/deploy-phases.js.map +1 -1
  90. package/dist/lib/deploy/deploy-utils.d.ts +15 -7
  91. package/dist/lib/deploy/deploy-utils.d.ts.map +1 -1
  92. package/dist/lib/deploy/deploy-utils.js +49 -36
  93. package/dist/lib/deploy/deploy-utils.js.map +1 -1
  94. package/dist/lib/deploy/generate-manifest-files.d.ts.map +1 -1
  95. package/dist/lib/deploy/generate-manifest-files.js +13 -39
  96. package/dist/lib/deploy/generate-manifest-files.js.map +1 -1
  97. package/dist/lib/deploy/pack-project.d.ts.map +1 -1
  98. package/dist/lib/deploy/pack-project.js +34 -20
  99. package/dist/lib/deploy/pack-project.js.map +1 -1
  100. package/dist/lib/deploy/slot-manager.d.ts +54 -0
  101. package/dist/lib/deploy/slot-manager.d.ts.map +1 -0
  102. package/dist/lib/deploy/slot-manager.js +72 -0
  103. package/dist/lib/deploy/slot-manager.js.map +1 -0
  104. package/dist/lib/deploy/test-url-match-rules.d.ts +10 -2
  105. package/dist/lib/deploy/test-url-match-rules.d.ts.map +1 -1
  106. package/dist/lib/deploy/test-url-match-rules.js +1 -1
  107. package/dist/lib/deploy/test-url-match-rules.js.map +1 -1
  108. package/dist/lib/deploy/upload.d.ts +1 -0
  109. package/dist/lib/deploy/upload.d.ts.map +1 -1
  110. package/dist/lib/deploy/upload.js +15 -24
  111. package/dist/lib/deploy/upload.js.map +1 -1
  112. package/dist/lib/deploy/validation.d.ts.map +1 -1
  113. package/dist/lib/deploy/validation.js +43 -48
  114. package/dist/lib/deploy/validation.js.map +1 -1
  115. package/dist/lib/rsbuild/config-factory.d.ts.map +1 -1
  116. package/dist/lib/rsbuild/config-factory.js +10 -17
  117. package/dist/lib/rsbuild/config-factory.js.map +1 -1
  118. package/dist/lib/rsbuild/plugins/asset-versioning.d.ts.map +1 -1
  119. package/dist/lib/rsbuild/plugins/asset-versioning.js +4 -14
  120. package/dist/lib/rsbuild/plugins/asset-versioning.js.map +1 -1
  121. package/dist/lib/rsbuild/plugins/brotli-compression.d.ts.map +1 -1
  122. package/dist/lib/rsbuild/plugins/brotli-compression.js +4 -4
  123. package/dist/lib/rsbuild/plugins/brotli-compression.js.map +1 -1
  124. package/dist/lib/rsbuild/plugins/copy-public.d.ts.map +1 -1
  125. package/dist/lib/rsbuild/plugins/copy-public.js.map +1 -1
  126. package/dist/lib/rsbuild/postcss/tailwind-source-fallback.d.ts.map +1 -1
  127. package/dist/lib/rsbuild/postcss/tailwind-source-fallback.js +1 -3
  128. package/dist/lib/rsbuild/postcss/tailwind-source-fallback.js.map +1 -1
  129. package/dist/lib/utils/console.d.ts +8 -0
  130. package/dist/lib/utils/console.d.ts.map +1 -0
  131. package/dist/lib/utils/console.js +10 -0
  132. package/dist/lib/utils/console.js.map +1 -0
  133. package/dist/lib/utils/filesystem.d.ts +9 -0
  134. package/dist/lib/utils/filesystem.d.ts.map +1 -0
  135. package/dist/lib/utils/filesystem.js +30 -0
  136. package/dist/lib/utils/filesystem.js.map +1 -0
  137. package/dist/lib/utils/formatters.d.ts +8 -0
  138. package/dist/lib/utils/formatters.d.ts.map +1 -0
  139. package/dist/lib/utils/formatters.js +22 -0
  140. package/dist/lib/utils/formatters.js.map +1 -0
  141. package/dist/lib/utils/index.d.ts +7 -0
  142. package/dist/lib/utils/index.d.ts.map +1 -0
  143. package/dist/lib/utils/index.js +7 -0
  144. package/dist/lib/utils/index.js.map +1 -0
  145. package/dist/lib/utils/setup-runtime.d.ts.map +1 -1
  146. package/dist/lib/utils/setup-runtime.js +22 -63
  147. package/dist/lib/utils/setup-runtime.js.map +1 -1
  148. package/dist/schema/config.schema.d.ts +9 -48
  149. package/dist/schema/config.schema.d.ts.map +1 -1
  150. package/dist/schema/config.schema.js +119 -120
  151. package/dist/schema/config.schema.js.map +1 -1
  152. package/dist/sdk/hooks/mocks.d.ts +9 -0
  153. package/dist/sdk/hooks/mocks.d.ts.map +1 -0
  154. package/dist/sdk/hooks/mocks.js +17 -0
  155. package/dist/sdk/hooks/mocks.js.map +1 -0
  156. package/dist/sdk/hooks/use-audience-manager.d.ts +44 -0
  157. package/dist/sdk/hooks/use-audience-manager.d.ts.map +1 -0
  158. package/dist/sdk/hooks/use-audience-manager.js +109 -0
  159. package/dist/sdk/hooks/use-audience-manager.js.map +1 -0
  160. package/dist/sdk/hooks/use-ip.d.ts +45 -0
  161. package/dist/sdk/hooks/use-ip.d.ts.map +1 -0
  162. package/dist/sdk/hooks/use-ip.js +46 -0
  163. package/dist/sdk/hooks/use-ip.js.map +1 -0
  164. package/dist/sdk/hooks/use-sdk-request.d.ts +46 -0
  165. package/dist/sdk/hooks/use-sdk-request.d.ts.map +1 -0
  166. package/dist/sdk/hooks/use-sdk-request.js +65 -0
  167. package/dist/sdk/hooks/use-sdk-request.js.map +1 -0
  168. package/dist/sdk/hooks/use-theme.d.ts +45 -0
  169. package/dist/sdk/hooks/use-theme.d.ts.map +1 -0
  170. package/dist/sdk/hooks/use-theme.js +97 -0
  171. package/dist/sdk/hooks/use-theme.js.map +1 -0
  172. package/dist/sdk/hooks/use-visitor.d.ts +41 -0
  173. package/dist/sdk/hooks/use-visitor.d.ts.map +1 -0
  174. package/dist/sdk/hooks/use-visitor.js +42 -0
  175. package/dist/sdk/hooks/use-visitor.js.map +1 -0
  176. package/dist/sdk/hooks/validation.d.ts +8 -0
  177. package/dist/sdk/hooks/validation.d.ts.map +1 -0
  178. package/dist/sdk/hooks/validation.js +13 -0
  179. package/dist/sdk/hooks/validation.js.map +1 -0
  180. package/dist/sdk/index.d.ts +17 -5
  181. package/dist/sdk/index.d.ts.map +1 -1
  182. package/dist/sdk/index.js +16 -5
  183. package/dist/sdk/index.js.map +1 -1
  184. package/dist/sdk/message-bus.d.ts +59 -0
  185. package/dist/sdk/message-bus.d.ts.map +1 -0
  186. package/dist/sdk/message-bus.js +152 -0
  187. package/dist/sdk/message-bus.js.map +1 -0
  188. package/dist/sdk/messages.d.ts +121 -0
  189. package/dist/sdk/messages.d.ts.map +1 -0
  190. package/dist/sdk/messages.js +9 -0
  191. package/dist/sdk/messages.js.map +1 -0
  192. package/dist/sdk/send-message.d.ts +1 -1
  193. package/dist/sdk/send-message.js +18 -18
  194. package/dist/sdk/send-message.js.map +1 -1
  195. package/dist/sdk/use-expand-link-app.d.ts +3 -3
  196. package/dist/sdk/use-expand-link-app.d.ts.map +1 -1
  197. package/dist/sdk/use-expand-link-app.js +9 -5
  198. package/dist/sdk/use-expand-link-app.js.map +1 -1
  199. package/dist/types.d.ts +235 -55
  200. package/dist/types.d.ts.map +1 -1
  201. package/dist/types.js +8 -3
  202. package/dist/types.js.map +1 -1
  203. package/package.json +3 -9
@@ -0,0 +1,152 @@
1
+ /**
2
+ * MessageBus for bidirectional communication between LinkApp iframe and parent window
3
+ *
4
+ * Provides:
5
+ * - send(message): Fire-and-forget message to parent
6
+ * - request<T>(message, timeout): Send request and await response with correlation
7
+ * - on(type, handler): Subscribe to incoming message types
8
+ */
9
+ /**
10
+ * Singleton message bus for LinkApp SDK communication
11
+ */
12
+ class LinkAppMessageBus {
13
+ handlers = new Map();
14
+ pendingRequests = new Map();
15
+ listenerAttached = false;
16
+ constructor() {
17
+ if (typeof window !== 'undefined') {
18
+ this.setupMessageListener();
19
+ }
20
+ }
21
+ setupMessageListener() {
22
+ if (this.listenerAttached)
23
+ return;
24
+ this.listenerAttached = true;
25
+ window.addEventListener('message', this.handleMessage.bind(this));
26
+ }
27
+ handleMessage(event) {
28
+ // Basic structure validation
29
+ const message = event.data;
30
+ if (!message || typeof message !== 'object' || !message.type) {
31
+ return;
32
+ }
33
+ // Handle request-response correlation
34
+ const payload = message.payload;
35
+ if (payload?.requestId) {
36
+ const pending = this.pendingRequests.get(payload.requestId);
37
+ if (pending && message.type === pending.responseType) {
38
+ clearTimeout(pending.timeout);
39
+ this.pendingRequests.delete(payload.requestId);
40
+ // Check for error responses
41
+ const errorPayload = payload;
42
+ if (errorPayload.success === false && errorPayload.error) {
43
+ pending.reject(new Error(errorPayload.error));
44
+ }
45
+ else {
46
+ pending.resolve(message);
47
+ }
48
+ return;
49
+ }
50
+ }
51
+ // Dispatch to registered handlers
52
+ const handlers = this.handlers.get(message.type);
53
+ if (handlers) {
54
+ for (const handler of handlers) {
55
+ try {
56
+ handler(message);
57
+ }
58
+ catch (err) {
59
+ console.error(`[LinkApp SDK] Handler error for ${message.type}:`, err);
60
+ }
61
+ }
62
+ }
63
+ }
64
+ /**
65
+ * Check if running inside an iframe
66
+ */
67
+ isInIframe() {
68
+ if (typeof window === 'undefined')
69
+ return false;
70
+ return window !== window.parent;
71
+ }
72
+ /**
73
+ * Generate a unique request ID for correlation
74
+ */
75
+ generateRequestId() {
76
+ return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;
77
+ }
78
+ /**
79
+ * Send a message to the parent window (fire-and-forget)
80
+ */
81
+ send(message) {
82
+ if (typeof window === 'undefined') {
83
+ console.warn('[LinkApp SDK] Cannot send message in non-browser environment');
84
+ return;
85
+ }
86
+ if (!this.isInIframe()) {
87
+ console.warn('[LinkApp SDK] Cannot send message outside iframe context');
88
+ return;
89
+ }
90
+ window.parent.postMessage(message, '*');
91
+ }
92
+ /**
93
+ * Send a request and await the response
94
+ *
95
+ * @param message - The request message to send
96
+ * @param responseType - The expected response message type
97
+ * @param timeoutMs - Timeout in milliseconds (default: 10000)
98
+ * @returns Promise that resolves with the response message
99
+ */
100
+ async request(message, responseType, timeoutMs = 10000) {
101
+ // In dev mode (not in iframe), reject with helpful message
102
+ if (!this.isInIframe()) {
103
+ return Promise.reject(new Error(`[LinkApp SDK] ${message.type} requires iframe context. Use dev server for testing.`));
104
+ }
105
+ const requestId = message.payload.requestId;
106
+ if (!requestId) {
107
+ return Promise.reject(new Error('[LinkApp SDK] Request message must have a requestId in payload'));
108
+ }
109
+ return new Promise((resolve, reject) => {
110
+ const timeout = setTimeout(() => {
111
+ this.pendingRequests.delete(requestId);
112
+ reject(new Error(`[LinkApp SDK] Request ${message.type} timed out after ${timeoutMs}ms`));
113
+ }, timeoutMs);
114
+ this.pendingRequests.set(requestId, {
115
+ resolve,
116
+ reject,
117
+ timeout,
118
+ responseType,
119
+ });
120
+ this.send(message);
121
+ });
122
+ }
123
+ /**
124
+ * Subscribe to a specific message type from parent
125
+ *
126
+ * @param type - The message type to listen for
127
+ * @param handler - Callback function when message is received
128
+ * @returns Unsubscribe function
129
+ */
130
+ on(type, handler) {
131
+ if (!this.handlers.has(type)) {
132
+ this.handlers.set(type, new Set());
133
+ }
134
+ this.handlers.get(type)?.add(handler);
135
+ // Return unsubscribe function
136
+ return () => {
137
+ this.handlers.get(type)?.delete(handler);
138
+ };
139
+ }
140
+ /**
141
+ * Clear all pending requests (for testing)
142
+ */
143
+ clearPendingRequests() {
144
+ for (const [, pending] of this.pendingRequests) {
145
+ clearTimeout(pending.timeout);
146
+ }
147
+ this.pendingRequests.clear();
148
+ }
149
+ }
150
+ // Singleton instance
151
+ export const messageBus = new LinkAppMessageBus();
152
+ //# sourceMappingURL=message-bus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-bus.js","sourceRoot":"","sources":["../../src/sdk/message-bus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Message types for bidirectional communication between LinkApp iframe and parent window
3
+ *
4
+ * Protocol:
5
+ * - LinkApp sends REQUEST_* messages to parent with a unique requestId
6
+ * - Parent responds with *_RESPONSE messages containing the same requestId
7
+ */
8
+ /** Unique identifier for request-response correlation */
9
+ export type RequestId = string;
10
+ /** Visitor data from the parent profile page */
11
+ export interface VisitorData {
12
+ /** Whether the visitor is on a mobile device */
13
+ mobileDetected: boolean;
14
+ /** Browser user agent string */
15
+ userAgent: string;
16
+ /** Whether the visitor is following this profile */
17
+ isFollowing?: boolean | undefined;
18
+ /** Visitor's email if they are a verified follower */
19
+ followerEmail?: string | undefined;
20
+ }
21
+ /** IP and geolocation data */
22
+ export interface IPData {
23
+ /** ISO 3166-1 alpha-2 country code (e.g., "US") */
24
+ countryCode?: string | undefined;
25
+ /** City name in lowercase (e.g., "san francisco") */
26
+ city?: string | undefined;
27
+ }
28
+ /** Subscribe operation result */
29
+ export interface SubscribeResult {
30
+ success: boolean;
31
+ error?: string | undefined;
32
+ errorCode?: 'INVALID_EMAIL' | 'ALREADY_SUBSCRIBED' | 'CAPTCHA_FAILED' | 'RATE_LIMITED' | undefined;
33
+ }
34
+ /** Request visitor data from parent */
35
+ export interface RequestVisitorMessage {
36
+ source: 'linkapp';
37
+ type: 'REQUEST_VISITOR';
38
+ payload: {
39
+ requestId: RequestId;
40
+ };
41
+ }
42
+ /** Request IP/geo data from parent */
43
+ export interface RequestIPMessage {
44
+ source: 'linkapp';
45
+ type: 'REQUEST_IP';
46
+ payload: {
47
+ requestId: RequestId;
48
+ };
49
+ }
50
+ /** Request reCAPTCHA token from parent (domain-bound) */
51
+ export interface RequestCaptchaMessage {
52
+ source: 'linkapp';
53
+ type: 'REQUEST_CAPTCHA';
54
+ payload: {
55
+ requestId: RequestId;
56
+ /** reCAPTCHA action name (e.g., "subscribe") */
57
+ action: string;
58
+ };
59
+ }
60
+ /** Submit email subscription via parent */
61
+ export interface SubmitSubscribeMessage {
62
+ source: 'linkapp';
63
+ type: 'SUBMIT_SUBSCRIBE';
64
+ payload: {
65
+ requestId: RequestId;
66
+ email: string;
67
+ captchaToken: string;
68
+ };
69
+ }
70
+ /** Message to expand LinkApp into modal view (existing) */
71
+ export interface ExpandLinkAppMessage {
72
+ source: 'linkapp';
73
+ type: 'EXPAND_LINK_APP';
74
+ payload: {
75
+ data?: Record<string, unknown> | undefined;
76
+ };
77
+ }
78
+ /** Union of all messages sent FROM LinkApp iframe TO parent window */
79
+ export type LinkAppToParentMessage = RequestVisitorMessage | RequestIPMessage | RequestCaptchaMessage | SubmitSubscribeMessage | ExpandLinkAppMessage;
80
+ /** Visitor data response */
81
+ export interface VisitorResponseMessage {
82
+ type: 'VISITOR_RESPONSE';
83
+ payload: {
84
+ requestId: RequestId;
85
+ visitor: VisitorData;
86
+ };
87
+ }
88
+ /** IP data response */
89
+ export interface IPResponseMessage {
90
+ type: 'IP_RESPONSE';
91
+ payload: {
92
+ requestId: RequestId;
93
+ ip: IPData;
94
+ };
95
+ }
96
+ /** reCAPTCHA token response */
97
+ export interface CaptchaResponseMessage {
98
+ type: 'CAPTCHA_RESPONSE';
99
+ payload: {
100
+ requestId: RequestId;
101
+ success: boolean;
102
+ token?: string | undefined;
103
+ error?: string | undefined;
104
+ };
105
+ }
106
+ /** Subscribe operation result */
107
+ export interface SubscribeResultMessage {
108
+ type: 'SUBSCRIBE_RESULT';
109
+ payload: {
110
+ requestId: RequestId;
111
+ success: boolean;
112
+ error?: string | undefined;
113
+ errorCode?: 'INVALID_EMAIL' | 'ALREADY_SUBSCRIBED' | 'CAPTCHA_FAILED' | 'RATE_LIMITED' | undefined;
114
+ };
115
+ }
116
+ /** Union of all messages sent FROM parent window TO LinkApp iframe */
117
+ export type ParentToLinkAppMessage = VisitorResponseMessage | IPResponseMessage | CaptchaResponseMessage | SubscribeResultMessage;
118
+ /** All possible message types for type guards */
119
+ export type LinkAppMessageType = LinkAppToParentMessage['type'];
120
+ export type ParentMessageType = ParentToLinkAppMessage['type'];
121
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/sdk/messages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Message types for bidirectional communication between LinkApp iframe and parent window
3
+ *
4
+ * Protocol:
5
+ * - LinkApp sends REQUEST_* messages to parent with a unique requestId
6
+ * - Parent responds with *_RESPONSE messages containing the same requestId
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/sdk/messages.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -13,4 +13,4 @@
13
13
  * The parent window must implement a message listener to handle these messages.
14
14
  */
15
15
  export declare function sendMessage(type: string, payload: unknown): void;
16
- //# sourceMappingURL=send-message.d.ts.map
16
+ //# sourceMappingURL=send-message.d.ts.map
@@ -13,22 +13,22 @@
13
13
  * The parent window must implement a message listener to handle these messages.
14
14
  */
15
15
  export function sendMessage(type, payload) {
16
- // Check if running in an iframe
17
- if (typeof window === 'undefined') {
18
- console.warn('[LinkApp SDK] sendMessage called in non-browser environment');
19
- return;
20
- }
21
- if (window === window.parent) {
22
- console.warn('[LinkApp SDK] sendMessage called outside of iframe context');
23
- return;
24
- }
25
- const message = {
26
- source: 'linkapp',
27
- type: type,
28
- payload: payload,
29
- };
30
- // Send to parent window
31
- // Using '*' as targetOrigin for now - parent should validate message.source
32
- window.parent.postMessage(message, '*');
16
+ // Check if running in an iframe
17
+ if (typeof window === "undefined") {
18
+ console.warn("[LinkApp SDK] sendMessage called in non-browser environment");
19
+ return;
20
+ }
21
+ if (window === window.parent) {
22
+ console.warn("[LinkApp SDK] sendMessage called outside of iframe context");
23
+ return;
24
+ }
25
+ const message = {
26
+ source: "linkapp",
27
+ type: type,
28
+ payload: payload,
29
+ };
30
+ // Send to parent window
31
+ // Using '*' as targetOrigin for now - parent should validate message.source
32
+ window.parent.postMessage(message, "*");
33
33
  }
34
- //# sourceMappingURL=send-message.js.map
34
+ //# sourceMappingURL=send-message.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"send-message.js","sourceRoot":"","sources":["../../src/sdk/send-message.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,OAAgB;IACxD,gCAAgC;IAChC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,OAAO,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAA;QAC3E,OAAM;IACR,CAAC;IAED,IAAI,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAA;QAC1E,OAAM;IACR,CAAC;IAED,MAAM,OAAO,GAAmB;QAC9B,MAAM,EAAE,SAAS;QACjB,IAAI,EAAE,IAA8B;QACpC,OAAO,EAAE,OAAoC;KAC9C,CAAA;IAED,wBAAwB;IACxB,4EAA4E;IAC5E,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;AACzC,CAAC"}
1
+ {"version":3,"file":"send-message.js","sourceRoot":"","sources":["../../src/sdk/send-message.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,OAAgB;IACxD,gCAAgC;IAChC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,OAAO,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;QAC5E,OAAO;IACT,CAAC;IAED,IAAI,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;QAC3E,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAmB;QAC9B,MAAM,EAAE,SAAS;QACjB,IAAI,EAAE,IAA8B;QACpC,OAAO,EAAE,OAAoC;KAC9C,CAAC;IAEF,wBAAwB;IACxB,4EAA4E;IAC5E,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAC1C,CAAC"}
@@ -1,7 +1,7 @@
1
1
  /**
2
- * Hook to open a popup/modal in the parent Linktree window
2
+ * Hook to expand the LinkApp into an overlay in the parent Linktree window
3
3
  *
4
- * @returns A callback function to trigger the popup with optional data
4
+ * @returns A callback function to trigger the expand with optional data
5
5
  *
6
6
  * @example
7
7
  * ```tsx
@@ -17,7 +17,7 @@
17
17
  * ```
18
18
  *
19
19
  * Note: This only works when the LinkApp is embedded in Linktree.
20
- * The parent window identifies the LinkApp from the iframe's event.source.
20
+ * In dev mode (not in iframe), logs a warning to console.
21
21
  */
22
22
  export declare function useExpandLinkApp(): (data?: Record<string, unknown>) => void;
23
23
  //# sourceMappingURL=use-expand-link-app.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-expand-link-app.d.ts","sourceRoot":"","sources":["../../src/sdk/use-expand-link-app.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,gBAAgB,YACH,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,UAGnD"}
1
+ {"version":3,"file":"use-expand-link-app.d.ts","sourceRoot":"","sources":["../../src/sdk/use-expand-link-app.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,gBAAgB,YACH,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,UAOnD"}
@@ -1,9 +1,9 @@
1
1
  import { useCallback } from 'react';
2
- import { sendMessage } from './send-message.js';
2
+ import { messageBus } from './message-bus.js';
3
3
  /**
4
- * Hook to open a popup/modal in the parent Linktree window
4
+ * Hook to expand the LinkApp into an overlay in the parent Linktree window
5
5
  *
6
- * @returns A callback function to trigger the popup with optional data
6
+ * @returns A callback function to trigger the expand with optional data
7
7
  *
8
8
  * @example
9
9
  * ```tsx
@@ -19,11 +19,15 @@ import { sendMessage } from './send-message.js';
19
19
  * ```
20
20
  *
21
21
  * Note: This only works when the LinkApp is embedded in Linktree.
22
- * The parent window identifies the LinkApp from the iframe's event.source.
22
+ * In dev mode (not in iframe), logs a warning to console.
23
23
  */
24
24
  export function useExpandLinkApp() {
25
25
  return useCallback((data) => {
26
- sendMessage('EXPAND_LINK_APP', { data });
26
+ messageBus.send({
27
+ source: 'linkapp',
28
+ type: 'EXPAND_LINK_APP',
29
+ payload: { data },
30
+ });
27
31
  }, []);
28
32
  }
29
33
  //# sourceMappingURL=use-expand-link-app.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-expand-link-app.js","sourceRoot":"","sources":["../../src/sdk/use-expand-link-app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,WAAW,CAAC,CAAC,IAA8B,EAAE,EAAE;QACpD,WAAW,CAAC,iBAAiB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;IAC1C,CAAC,EAAE,EAAE,CAAC,CAAA;AACR,CAAC"}
1
+ {"version":3,"file":"use-expand-link-app.js","sourceRoot":"","sources":["../../src/sdk/use-expand-link-app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,WAAW,CAAC,CAAC,IAA8B,EAAE,EAAE;QACpD,UAAU,CAAC,IAAI,CAAC;YACd,MAAM,EAAE,SAAS;YACjB,IAAI,EAAE,iBAAiB;YACvB,OAAO,EAAE,EAAE,IAAI,EAAE;SAClB,CAAC,CAAA;IACJ,CAAC,EAAE,EAAE,CAAC,CAAA;AACR,CAAC"}