@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
@@ -1,15 +1,15 @@
1
- import { StrictMode } from "react";
2
- import { createRoot } from "react-dom/client";
3
- import Preview from "./preview";
4
- import "./preview.css";
1
+ import { StrictMode } from 'react'
2
+ import { createRoot } from 'react-dom/client'
3
+ import Preview from './preview'
4
+ import './preview.css'
5
5
 
6
- const rootElement = document.getElementById("root");
6
+ const rootElement = document.getElementById('root')
7
7
  if (!rootElement) {
8
- throw new Error("Root element not found");
8
+ throw new Error('Root element not found')
9
9
  }
10
10
 
11
11
  createRoot(rootElement).render(
12
12
  <StrictMode>
13
13
  <Preview />
14
- </StrictMode>,
15
- );
14
+ </StrictMode>
15
+ )
@@ -88,7 +88,6 @@
88
88
  --sidebar-ring: oklch(0.708 0 0);
89
89
  }
90
90
 
91
-
92
91
  @layer base {
93
92
  * {
94
93
  @apply border-border outline-ring/50;
@@ -18,4 +18,4 @@
18
18
  "theme_color": "#ffffff",
19
19
  "background_color": "#ffffff",
20
20
  "display": "standalone"
21
- }
21
+ }
@@ -1,6 +1,6 @@
1
+ import { resolve } from 'node:path'
1
2
  import { defineConfig } from '@rsbuild/core'
2
3
  import { pluginReact } from '@rsbuild/plugin-react'
3
- import { resolve } from 'path'
4
4
 
5
5
  export default defineConfig({
6
6
  plugins: [pluginReact()],
@@ -0,0 +1,219 @@
1
+ /**
2
+ * Dev Parent Simulator - Simulates parent window behavior for SDK hooks in development
3
+ *
4
+ * This module handles messages from LinkApp iframes during development,
5
+ * returning mock data for visitor, IP, theme, and subscribe operations.
6
+ */
7
+
8
+ import type { THEME_PRESETS, ThemePreset } from './theme-presets'
9
+
10
+ interface SimulatorConfig {
11
+ /** Current theme from URL or settings */
12
+ getCurrentTheme: () => ThemePreset
13
+ /** Mock visitor settings */
14
+ mockVisitor?: {
15
+ mobileDetected?: boolean
16
+ isFollowing?: boolean
17
+ followerEmail?: string
18
+ }
19
+ /** Mock IP/geo settings */
20
+ mockIP?: {
21
+ countryCode?: string
22
+ city?: string
23
+ }
24
+ /** Simulate subscribe failure for testing */
25
+ simulateSubscribeFailure?: boolean
26
+ /** Simulate captcha failure for testing */
27
+ simulateCaptchaFailure?: boolean
28
+ }
29
+
30
+ interface DevParentSimulator {
31
+ /** Set up message listeners */
32
+ init: () => void
33
+ /** Clean up listeners */
34
+ destroy: () => void
35
+ /** Update mock settings */
36
+ updateConfig: (config: Partial<SimulatorConfig>) => void
37
+ }
38
+
39
+ /**
40
+ * Creates a dev parent simulator that handles SDK messages from iframes
41
+ */
42
+ export function createDevParentSimulator(initialConfig: SimulatorConfig): DevParentSimulator {
43
+ let config = { ...initialConfig }
44
+ let messageHandler: ((event: MessageEvent) => void) | null = null
45
+
46
+ const handleMessage = (event: MessageEvent) => {
47
+ const message = event.data
48
+ if (!message || message.source !== 'linkapp') return
49
+
50
+ const iframe = event.source as Window | null
51
+ if (!iframe) return
52
+
53
+ const { type, payload } = message
54
+
55
+ switch (type) {
56
+ case 'REQUEST_VISITOR': {
57
+ const visitorResponse = {
58
+ type: 'VISITOR_RESPONSE',
59
+ payload: {
60
+ requestId: payload.requestId,
61
+ visitor: {
62
+ mobileDetected:
63
+ config.mockVisitor?.mobileDetected ??
64
+ /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),
65
+ userAgent: navigator.userAgent,
66
+ isFollowing: config.mockVisitor?.isFollowing ?? false,
67
+ followerEmail: config.mockVisitor?.followerEmail,
68
+ },
69
+ },
70
+ }
71
+ iframe.postMessage(visitorResponse, '*')
72
+ console.log('[Dev Simulator] VISITOR_RESPONSE sent:', visitorResponse.payload.visitor)
73
+ break
74
+ }
75
+
76
+ case 'REQUEST_IP': {
77
+ const ipResponse = {
78
+ type: 'IP_RESPONSE',
79
+ payload: {
80
+ requestId: payload.requestId,
81
+ ip: {
82
+ countryCode: config.mockIP?.countryCode ?? 'US',
83
+ city: config.mockIP?.city ?? 'san francisco',
84
+ },
85
+ },
86
+ }
87
+ iframe.postMessage(ipResponse, '*')
88
+ console.log('[Dev Simulator] IP_RESPONSE sent:', ipResponse.payload.ip)
89
+ break
90
+ }
91
+
92
+ case 'REQUEST_CAPTCHA': {
93
+ // Simulate captcha with delay
94
+ setTimeout(
95
+ () => {
96
+ if (config.simulateCaptchaFailure) {
97
+ iframe.postMessage(
98
+ {
99
+ type: 'CAPTCHA_RESPONSE',
100
+ payload: {
101
+ requestId: payload.requestId,
102
+ success: false,
103
+ error: 'Simulated captcha failure',
104
+ },
105
+ },
106
+ '*'
107
+ )
108
+ console.log('[Dev Simulator] CAPTCHA_RESPONSE sent (simulated failure)')
109
+ } else {
110
+ iframe.postMessage(
111
+ {
112
+ type: 'CAPTCHA_RESPONSE',
113
+ payload: {
114
+ requestId: payload.requestId,
115
+ success: true,
116
+ token: `dev-captcha-token-${Date.now()}`,
117
+ },
118
+ },
119
+ '*'
120
+ )
121
+ console.log('[Dev Simulator] CAPTCHA_RESPONSE sent (success)')
122
+ }
123
+ },
124
+ 500 // Simulate reCAPTCHA delay
125
+ )
126
+ break
127
+ }
128
+
129
+ case 'SUBMIT_SUBSCRIBE': {
130
+ // Simulate subscribe with delay
131
+ setTimeout(() => {
132
+ if (config.simulateSubscribeFailure) {
133
+ iframe.postMessage(
134
+ {
135
+ type: 'SUBSCRIBE_RESULT',
136
+ payload: {
137
+ requestId: payload.requestId,
138
+ success: false,
139
+ error: 'Simulated subscribe failure',
140
+ errorCode: 'RATE_LIMITED',
141
+ },
142
+ },
143
+ '*'
144
+ )
145
+ console.log('[Dev Simulator] SUBSCRIBE_RESULT sent (simulated failure)')
146
+ } else {
147
+ iframe.postMessage(
148
+ {
149
+ type: 'SUBSCRIBE_RESULT',
150
+ payload: {
151
+ requestId: payload.requestId,
152
+ success: true,
153
+ },
154
+ },
155
+ '*'
156
+ )
157
+ console.log('[Dev Simulator] SUBSCRIBE_RESULT sent (success) - Email:', payload.email)
158
+ }
159
+ }, 300)
160
+ break
161
+ }
162
+
163
+ case 'EXPAND_LINK_APP': {
164
+ // This is handled by Preview.tsx existing logic
165
+ console.log('[Dev Simulator] EXPAND_LINK_APP received:', payload)
166
+ break
167
+ }
168
+
169
+ default:
170
+ console.log('[Dev Simulator] Unknown message type:', type)
171
+ }
172
+ }
173
+
174
+ return {
175
+ init() {
176
+ if (messageHandler) return // Already initialized
177
+ messageHandler = handleMessage
178
+ window.addEventListener('message', messageHandler)
179
+ console.log('[Dev Simulator] Initialized - listening for SDK messages')
180
+ },
181
+
182
+ destroy() {
183
+ if (messageHandler) {
184
+ window.removeEventListener('message', messageHandler)
185
+ messageHandler = null
186
+ console.log('[Dev Simulator] Destroyed - stopped listening for SDK messages')
187
+ }
188
+ },
189
+
190
+ updateConfig(newConfig: Partial<SimulatorConfig>) {
191
+ config = { ...config, ...newConfig }
192
+ console.log('[Dev Simulator] Config updated:', newConfig)
193
+ },
194
+ }
195
+ }
196
+
197
+ /**
198
+ * Broadcast a theme update to all iframes
199
+ */
200
+ export function broadcastThemeUpdate(variables: Record<string, string>, name: string): void {
201
+ const iframes = document.querySelectorAll('iframe')
202
+ const message = {
203
+ type: 'THEME_UPDATE',
204
+ payload: {
205
+ name,
206
+ variables,
207
+ },
208
+ }
209
+
210
+ iframes.forEach((iframe) => {
211
+ try {
212
+ iframe.contentWindow?.postMessage(message, '*')
213
+ } catch {
214
+ // Iframe might be cross-origin, ignore
215
+ }
216
+ })
217
+
218
+ console.log('[Dev Simulator] Broadcast THEME_UPDATE to', iframes.length, 'iframes')
219
+ }
@@ -17,107 +17,103 @@ export type ThemePreset = {
17
17
 
18
18
  export const THEME_PRESETS: Record<string, ThemePreset> = {
19
19
  default: {
20
- name: "Default (Light)",
20
+ name: 'Default (Light)',
21
21
  variables: {
22
- "--button-style-text": "#000000",
23
- "--button-style-background": "#ffffff",
24
- "--button-style-background-hover":
25
- "color-mix(in srgb, #ffffff 93%, #000000 7%)",
26
- "--button-style-border": "none",
27
- "--button-style-border-color": "transparent",
28
- "--button-style-shadow": "none",
29
- "--button-style-shadow-color": "#000000",
30
- "--button-style-contrast-color": "#000000",
31
- "--button-style-radius": "8px",
32
- "--button-style-inner-radius": "min(8px, max(4px, calc(8px - 8px)))",
33
- "--button-style-skeleton-color": "rgba(0, 0, 0, 0.05)",
22
+ '--button-style-text': '#000000',
23
+ '--button-style-background': '#ffffff',
24
+ '--button-style-background-hover': 'color-mix(in srgb, #ffffff 93%, #000000 7%)',
25
+ '--button-style-border': 'none',
26
+ '--button-style-border-color': 'transparent',
27
+ '--button-style-shadow': 'none',
28
+ '--button-style-shadow-color': '#000000',
29
+ '--button-style-contrast-color': '#000000',
30
+ '--button-style-radius': '8px',
31
+ '--button-style-inner-radius': 'min(8px, max(4px, calc(8px - 8px)))',
32
+ '--button-style-skeleton-color': 'rgba(0, 0, 0, 0.05)',
34
33
  },
35
34
  font: {
36
- fontFamily: "Inter, sans-serif",
37
- cssUrl: "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap",
35
+ fontFamily: 'Inter, sans-serif',
36
+ cssUrl: 'https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap',
38
37
  },
39
38
  },
40
39
  dark: {
41
- name: "Dark",
40
+ name: 'Dark',
42
41
  variables: {
43
- "--button-style-text": "#ffffff",
44
- "--button-style-background": "#1f2937",
45
- "--button-style-background-hover":
46
- "color-mix(in srgb, #1f2937 93%, #ffffff 7%)",
47
- "--button-style-border": "none",
48
- "--button-style-border-color": "transparent",
49
- "--button-style-shadow": "none",
50
- "--button-style-shadow-color": "#000000",
51
- "--button-style-contrast-color": "#ffffff",
52
- "--button-style-radius": "8px",
53
- "--button-style-inner-radius": "min(8px, max(4px, calc(8px - 8px)))",
54
- "--button-style-skeleton-color": "rgba(255, 255, 255, 0.1)",
42
+ '--button-style-text': '#ffffff',
43
+ '--button-style-background': '#1f2937',
44
+ '--button-style-background-hover': 'color-mix(in srgb, #1f2937 93%, #ffffff 7%)',
45
+ '--button-style-border': 'none',
46
+ '--button-style-border-color': 'transparent',
47
+ '--button-style-shadow': 'none',
48
+ '--button-style-shadow-color': '#000000',
49
+ '--button-style-contrast-color': '#ffffff',
50
+ '--button-style-radius': '8px',
51
+ '--button-style-inner-radius': 'min(8px, max(4px, calc(8px - 8px)))',
52
+ '--button-style-skeleton-color': 'rgba(255, 255, 255, 0.1)',
55
53
  },
56
54
  font: {
57
- fontFamily: "Roboto, sans-serif",
58
- cssUrl: "https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap",
55
+ fontFamily: 'Roboto, sans-serif',
56
+ cssUrl: 'https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap',
59
57
  },
60
58
  },
61
59
  purple: {
62
- name: "Purple",
60
+ name: 'Purple',
63
61
  variables: {
64
- "--button-style-text": "#ffffff",
65
- "--button-style-background": "#7c3aed",
66
- "--button-style-background-hover":
67
- "color-mix(in srgb, #7c3aed 93%, #ffffff 7%)",
68
- "--button-style-border": "none",
69
- "--button-style-border-color": "transparent",
70
- "--button-style-shadow": "none",
71
- "--button-style-shadow-color": "#000000",
72
- "--button-style-contrast-color": "#ede9fe",
73
- "--button-style-radius": "16px",
74
- "--button-style-inner-radius": "min(16px, max(4px, calc(16px - 8px)))",
75
- "--button-style-skeleton-color": "rgba(124, 58, 237, 0.1)",
62
+ '--button-style-text': '#ffffff',
63
+ '--button-style-background': '#7c3aed',
64
+ '--button-style-background-hover': 'color-mix(in srgb, #7c3aed 93%, #ffffff 7%)',
65
+ '--button-style-border': 'none',
66
+ '--button-style-border-color': 'transparent',
67
+ '--button-style-shadow': 'none',
68
+ '--button-style-shadow-color': '#000000',
69
+ '--button-style-contrast-color': '#ede9fe',
70
+ '--button-style-radius': '16px',
71
+ '--button-style-inner-radius': 'min(16px, max(4px, calc(16px - 8px)))',
72
+ '--button-style-skeleton-color': 'rgba(124, 58, 237, 0.1)',
76
73
  },
77
74
  font: {
78
- fontFamily: "Poppins, sans-serif",
79
- cssUrl: "https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&display=swap",
75
+ fontFamily: 'Poppins, sans-serif',
76
+ cssUrl: 'https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&display=swap',
80
77
  },
81
78
  },
82
79
  outline: {
83
- name: "Outline Style",
80
+ name: 'Outline Style',
84
81
  variables: {
85
- "--button-style-text": "#000000",
86
- "--button-style-background": "transparent",
87
- "--button-style-background-hover": "rgba(0, 0, 0, 0.05)",
88
- "--button-style-border": "2px solid currentColor",
89
- "--button-style-border-color": "#000000",
90
- "--button-style-shadow": "none",
91
- "--button-style-shadow-color": "#000000",
92
- "--button-style-contrast-color": "#ffffff",
93
- "--button-style-radius": "24px",
94
- "--button-style-inner-radius": "min(24px, max(4px, calc(24px - 8px)))",
95
- "--button-style-skeleton-color": "rgba(0, 0, 0, 0.05)",
82
+ '--button-style-text': '#000000',
83
+ '--button-style-background': 'transparent',
84
+ '--button-style-background-hover': 'rgba(0, 0, 0, 0.05)',
85
+ '--button-style-border': '2px solid currentColor',
86
+ '--button-style-border-color': '#000000',
87
+ '--button-style-shadow': 'none',
88
+ '--button-style-shadow-color': '#000000',
89
+ '--button-style-contrast-color': '#ffffff',
90
+ '--button-style-radius': '24px',
91
+ '--button-style-inner-radius': 'min(24px, max(4px, calc(24px - 8px)))',
92
+ '--button-style-skeleton-color': 'rgba(0, 0, 0, 0.05)',
96
93
  },
97
94
  font: {
98
- fontFamily: "Montserrat, sans-serif",
99
- cssUrl: "https://fonts.googleapis.com/css2?family=Montserrat:wght@400;500;600;700&display=swap",
95
+ fontFamily: 'Montserrat, sans-serif',
96
+ cssUrl: 'https://fonts.googleapis.com/css2?family=Montserrat:wght@400;500;600;700&display=swap',
100
97
  },
101
98
  },
102
99
  rounded: {
103
- name: "Fully Rounded",
100
+ name: 'Fully Rounded',
104
101
  variables: {
105
- "--button-style-text": "#ffffff",
106
- "--button-style-background": "#059669",
107
- "--button-style-background-hover":
108
- "color-mix(in srgb, #059669 93%, #ffffff 7%)",
109
- "--button-style-border": "none",
110
- "--button-style-border-color": "transparent",
111
- "--button-style-shadow": "none",
112
- "--button-style-shadow-color": "#000000",
113
- "--button-style-contrast-color": "#d1fae5",
114
- "--button-style-radius": "28px",
115
- "--button-style-inner-radius": "28px",
116
- "--button-style-skeleton-color": "rgba(5, 150, 105, 0.1)",
102
+ '--button-style-text': '#ffffff',
103
+ '--button-style-background': '#059669',
104
+ '--button-style-background-hover': 'color-mix(in srgb, #059669 93%, #ffffff 7%)',
105
+ '--button-style-border': 'none',
106
+ '--button-style-border-color': 'transparent',
107
+ '--button-style-shadow': 'none',
108
+ '--button-style-shadow-color': '#000000',
109
+ '--button-style-contrast-color': '#d1fae5',
110
+ '--button-style-radius': '28px',
111
+ '--button-style-inner-radius': '28px',
112
+ '--button-style-skeleton-color': 'rgba(5, 150, 105, 0.1)',
117
113
  },
118
114
  font: {
119
- fontFamily: "Nunito, sans-serif",
120
- cssUrl: "https://fonts.googleapis.com/css2?family=Nunito:wght@400;500;600;700&display=swap",
115
+ fontFamily: 'Nunito, sans-serif',
116
+ cssUrl: 'https://fonts.googleapis.com/css2?family=Nunito:wght@400;500;600;700&display=swap',
121
117
  },
122
118
  },
123
- };
119
+ }
@@ -17,22 +17,22 @@ export function mergeThemeProps(
17
17
  theme: {
18
18
  cssVariables: themeVariables,
19
19
  // Legacy properties (deprecated) - derived from cssVariables
20
- textColor: themeVariables["--button-style-text"] || "#000000",
21
- backgroundColor: themeVariables["--button-style-background"] || "#ffffff",
22
- borderRadius: themeVariables["--button-style-inner-radius"] || "12px",
23
- borderColor: themeVariables["--button-style-border-color"] || "#e5e7eb",
24
- backgroundHover: themeVariables["--button-style-background-hover"] || "#f3f4f6",
25
- contrastColor: themeVariables["--button-style-contrast-color"] || "#ffffff",
26
- textHoverColor: themeVariables["--linkHoverText"] || "#111827",
20
+ textColor: themeVariables['--button-style-text'] || '#000000',
21
+ backgroundColor: themeVariables['--button-style-background'] || '#ffffff',
22
+ borderRadius: themeVariables['--button-style-inner-radius'] || '12px',
23
+ borderColor: themeVariables['--button-style-border-color'] || '#e5e7eb',
24
+ backgroundHover: themeVariables['--button-style-background-hover'] || '#f3f4f6',
25
+ contrastColor: themeVariables['--button-style-contrast-color'] || '#ffffff',
26
+ textHoverColor: themeVariables['--linkHoverText'] || '#111827',
27
27
  },
28
- };
28
+ }
29
29
  }
30
30
 
31
31
  /**
32
32
  * Gets theme variables from URL parameters
33
33
  */
34
34
  export function getThemeFromUrl(presets: Record<string, Record<string, string>>): Record<string, string> {
35
- const params = new URLSearchParams(window.location.search);
36
- const themeParam = params.get('theme') || 'default';
37
- return presets[themeParam] || presets.default;
35
+ const params = new URLSearchParams(window.location.search)
36
+ const themeParam = params.get('theme') || 'default'
37
+ return presets[themeParam] || presets.default
38
38
  }
package/dist/cli.js CHANGED
@@ -1,22 +1,23 @@
1
1
  #!/usr/bin/env node
2
2
  import { cac } from 'cac';
3
- import { devCommand } from './commands/dev.js';
3
+ import { addCommand } from './commands/add.js';
4
4
  import { buildCommand } from './commands/build.js';
5
5
  import { deployCommand } from './commands/deploy.js';
6
- import { addCommand } from './commands/add.js';
6
+ import { devCommand } from './commands/dev.js';
7
7
  import { loginCommand } from './commands/login.js';
8
8
  import { logoutCommand } from './commands/logout.js';
9
+ import { rollbackCommand } from './commands/rollback.js';
10
+ import { statusCommand } from './commands/status.js';
9
11
  import { testUrlMatchRulesCommand } from './commands/test-url-match-rules.js';
10
12
  const cli = cac('linkapp');
11
- // Package info
12
13
  const version = '0.0.1';
13
14
  cli.version(version).help();
14
- // Dev command
15
15
  cli
16
16
  .command('dev', 'Start development server with preview')
17
- .option('--port <port>', 'Preview server port (default: 3000)', { default: 3000 })
17
+ .option('--port <port>', 'Preview server port (default: 3000)', {
18
+ default: 3000,
19
+ })
18
20
  .action(devCommand);
19
- // Build command
20
21
  cli
21
22
  .command('build', 'Build LinkApp for production')
22
23
  .option('--analyze', 'Generate bundle analysis report (deprecated, use --profile)')
@@ -24,32 +25,37 @@ cli
24
25
  .option('--sourcemap', 'Generate sourcemaps for production build')
25
26
  .option('--compress', 'Generate Brotli-compressed (.br) files for optimal CDN delivery')
26
27
  .action(buildCommand);
27
- // Deploy command
28
28
  cli
29
29
  .command('deploy', 'Deploy LinkApp to Linktree')
30
30
  .option('--qa', 'Deploy to QA environment instead of production')
31
+ .option('--canary', 'Deploy to canary path for testing before promotion')
31
32
  .option('--skip-confirm', 'Skip deployment confirmation prompt')
32
33
  .option('--force', 'Force deployment even if LinkApp is published')
33
34
  .action(deployCommand);
34
- // Add command
35
+ cli
36
+ .command('rollback', 'Roll back to previous deployment version')
37
+ .option('--qa', 'Rollback in QA environment instead of production')
38
+ .option('--skip-confirm', 'Skip rollback confirmation prompt')
39
+ .option('--version <timestamp>', 'Specific version timestamp to roll back to')
40
+ .action(rollbackCommand);
41
+ cli
42
+ .command('status', 'Show deployment status and versions')
43
+ .option('--qa', 'Show QA environment status instead of production')
44
+ .action(statusCommand);
35
45
  cli
36
46
  .command('add [component]', 'Add a component from the registry')
37
47
  .option('--yes', 'Skip confirmation prompts')
38
48
  .option('--overwrite', 'Overwrite existing files')
39
49
  .option('--registry <url>', 'Custom registry URL')
40
50
  .action(addCommand);
41
- // Login command
42
51
  cli
43
52
  .command('login', 'Authenticate with Linktree')
44
53
  .option('--qa', 'Login to QA environment instead of production')
45
54
  .action(loginCommand);
46
- // Logout command
47
55
  cli
48
56
  .command('logout', 'Sign out of Linktree')
49
57
  .option('--qa', 'Logout from QA environment instead of production')
50
58
  .action(logoutCommand);
51
- // Test URL match rules
52
59
  cli.command('test-url-match-rules <url>', 'Test URL match rules against a URL').action(testUrlMatchRulesCommand);
53
- // Parse and run
54
60
  cli.parse();
55
61
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAA;AAE7E,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAA;AAE1B,eAAe;AACf,MAAM,OAAO,GAAG,OAAO,CAAA;AAEvB,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;AAE3B,cAAc;AACd,GAAG;KACA,OAAO,CAAC,KAAK,EAAE,uCAAuC,CAAC;KACvD,MAAM,CAAC,eAAe,EAAE,qCAAqC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;KACjF,MAAM,CAAC,UAAU,CAAC,CAAA;AAErB,gBAAgB;AAChB,GAAG;KACA,OAAO,CAAC,OAAO,EAAE,8BAA8B,CAAC;KAChD,MAAM,CAAC,WAAW,EAAE,6DAA6D,CAAC;KAClF,MAAM,CAAC,WAAW,EAAE,4CAA4C,CAAC;KACjE,MAAM,CAAC,aAAa,EAAE,0CAA0C,CAAC;KACjE,MAAM,CAAC,YAAY,EAAE,iEAAiE,CAAC;KACvF,MAAM,CAAC,YAAY,CAAC,CAAA;AAEvB,iBAAiB;AACjB,GAAG;KACA,OAAO,CAAC,QAAQ,EAAE,4BAA4B,CAAC;KAC/C,MAAM,CAAC,MAAM,EAAE,gDAAgD,CAAC;KAChE,MAAM,CAAC,gBAAgB,EAAE,qCAAqC,CAAC;KAC/D,MAAM,CAAC,SAAS,EAAE,+CAA+C,CAAC;KAClE,MAAM,CAAC,aAAa,CAAC,CAAA;AAExB,cAAc;AACd,GAAG;KACA,OAAO,CAAC,iBAAiB,EAAE,mCAAmC,CAAC;KAC/D,MAAM,CAAC,OAAO,EAAE,2BAA2B,CAAC;KAC5C,MAAM,CAAC,aAAa,EAAE,0BAA0B,CAAC;KACjD,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC;KACjD,MAAM,CAAC,UAAU,CAAC,CAAA;AAErB,gBAAgB;AAChB,GAAG;KACA,OAAO,CAAC,OAAO,EAAE,4BAA4B,CAAC;KAC9C,MAAM,CAAC,MAAM,EAAE,+CAA+C,CAAC;KAC/D,MAAM,CAAC,YAAY,CAAC,CAAA;AAEvB,iBAAiB;AACjB,GAAG;KACA,OAAO,CAAC,QAAQ,EAAE,sBAAsB,CAAC;KACzC,MAAM,CAAC,MAAM,EAAE,kDAAkD,CAAC;KAClE,MAAM,CAAC,aAAa,CAAC,CAAA;AAExB,uBAAuB;AACvB,GAAG,CAAC,OAAO,CAAC,4BAA4B,EAAE,oCAAoC,CAAC,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAA;AAEhH,gBAAgB;AAChB,GAAG,CAAC,KAAK,EAAE,CAAA"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAA;AAE7E,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAA;AAE1B,MAAM,OAAO,GAAG,OAAO,CAAA;AAEvB,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;AAE3B,GAAG;KACA,OAAO,CAAC,KAAK,EAAE,uCAAuC,CAAC;KACvD,MAAM,CAAC,eAAe,EAAE,qCAAqC,EAAE;IAC9D,OAAO,EAAE,IAAI;CACd,CAAC;KACD,MAAM,CAAC,UAAU,CAAC,CAAA;AAErB,GAAG;KACA,OAAO,CAAC,OAAO,EAAE,8BAA8B,CAAC;KAChD,MAAM,CAAC,WAAW,EAAE,6DAA6D,CAAC;KAClF,MAAM,CAAC,WAAW,EAAE,4CAA4C,CAAC;KACjE,MAAM,CAAC,aAAa,EAAE,0CAA0C,CAAC;KACjE,MAAM,CAAC,YAAY,EAAE,iEAAiE,CAAC;KACvF,MAAM,CAAC,YAAY,CAAC,CAAA;AAEvB,GAAG;KACA,OAAO,CAAC,QAAQ,EAAE,4BAA4B,CAAC;KAC/C,MAAM,CAAC,MAAM,EAAE,gDAAgD,CAAC;KAChE,MAAM,CAAC,UAAU,EAAE,oDAAoD,CAAC;KACxE,MAAM,CAAC,gBAAgB,EAAE,qCAAqC,CAAC;KAC/D,MAAM,CAAC,SAAS,EAAE,+CAA+C,CAAC;KAClE,MAAM,CAAC,aAAa,CAAC,CAAA;AAExB,GAAG;KACA,OAAO,CAAC,UAAU,EAAE,0CAA0C,CAAC;KAC/D,MAAM,CAAC,MAAM,EAAE,kDAAkD,CAAC;KAClE,MAAM,CAAC,gBAAgB,EAAE,mCAAmC,CAAC;KAC7D,MAAM,CAAC,uBAAuB,EAAE,4CAA4C,CAAC;KAC7E,MAAM,CAAC,eAAe,CAAC,CAAA;AAE1B,GAAG;KACA,OAAO,CAAC,QAAQ,EAAE,qCAAqC,CAAC;KACxD,MAAM,CAAC,MAAM,EAAE,kDAAkD,CAAC;KAClE,MAAM,CAAC,aAAa,CAAC,CAAA;AAExB,GAAG;KACA,OAAO,CAAC,iBAAiB,EAAE,mCAAmC,CAAC;KAC/D,MAAM,CAAC,OAAO,EAAE,2BAA2B,CAAC;KAC5C,MAAM,CAAC,aAAa,EAAE,0BAA0B,CAAC;KACjD,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC;KACjD,MAAM,CAAC,UAAU,CAAC,CAAA;AAErB,GAAG;KACA,OAAO,CAAC,OAAO,EAAE,4BAA4B,CAAC;KAC9C,MAAM,CAAC,MAAM,EAAE,+CAA+C,CAAC;KAC/D,MAAM,CAAC,YAAY,CAAC,CAAA;AAEvB,GAAG;KACA,OAAO,CAAC,QAAQ,EAAE,sBAAsB,CAAC;KACzC,MAAM,CAAC,MAAM,EAAE,kDAAkD,CAAC;KAClE,MAAM,CAAC,aAAa,CAAC,CAAA;AAExB,GAAG,CAAC,OAAO,CAAC,4BAA4B,EAAE,oCAAoC,CAAC,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAA;AAEhH,GAAG,CAAC,KAAK,EAAE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAOA,UAAU,UAAU;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAuBD,wBAAsB,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAwB5F"}
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAOA,UAAU,UAAU;IAClB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAcD,wBAAsB,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB5F"}