rampkit-mcp-server 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/README.md +160 -0
  2. package/dist/api/rampkit.d.ts +96 -0
  3. package/dist/api/rampkit.d.ts.map +1 -0
  4. package/dist/api/rampkit.js +391 -0
  5. package/dist/api/rampkit.js.map +1 -0
  6. package/dist/detection/platform.d.ts +11 -0
  7. package/dist/detection/platform.d.ts.map +1 -0
  8. package/dist/detection/platform.js +420 -0
  9. package/dist/detection/platform.js.map +1 -0
  10. package/dist/index.d.ts +9 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +13 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/prompts/index.d.ts +24 -0
  15. package/dist/prompts/index.d.ts.map +1 -0
  16. package/dist/prompts/index.js +183 -0
  17. package/dist/prompts/index.js.map +1 -0
  18. package/dist/resources/authoring-guide.d.ts +9 -0
  19. package/dist/resources/authoring-guide.d.ts.map +1 -0
  20. package/dist/resources/authoring-guide.js +487 -0
  21. package/dist/resources/authoring-guide.js.map +1 -0
  22. package/dist/resources/best-practices.d.ts +8 -0
  23. package/dist/resources/best-practices.d.ts.map +1 -0
  24. package/dist/resources/best-practices.js +92 -0
  25. package/dist/resources/best-practices.js.map +1 -0
  26. package/dist/resources/index.d.ts +19 -0
  27. package/dist/resources/index.d.ts.map +1 -0
  28. package/dist/resources/index.js +236 -0
  29. package/dist/resources/index.js.map +1 -0
  30. package/dist/resources/schema.d.ts +42 -0
  31. package/dist/resources/schema.d.ts.map +1 -0
  32. package/dist/resources/schema.js +239 -0
  33. package/dist/resources/schema.js.map +1 -0
  34. package/dist/resources/sdk-guide.d.ts +7 -0
  35. package/dist/resources/sdk-guide.d.ts.map +1 -0
  36. package/dist/resources/sdk-guide.js +368 -0
  37. package/dist/resources/sdk-guide.js.map +1 -0
  38. package/dist/resources/templates.d.ts +9 -0
  39. package/dist/resources/templates.d.ts.map +1 -0
  40. package/dist/resources/templates.js +874 -0
  41. package/dist/resources/templates.js.map +1 -0
  42. package/dist/server.d.ts +10 -0
  43. package/dist/server.d.ts.map +1 -0
  44. package/dist/server.js +109 -0
  45. package/dist/server.js.map +1 -0
  46. package/dist/tools/instructions.d.ts +23 -0
  47. package/dist/tools/instructions.d.ts.map +1 -0
  48. package/dist/tools/instructions.js +74 -0
  49. package/dist/tools/instructions.js.map +1 -0
  50. package/dist/tools/onboarding.d.ts +211 -0
  51. package/dist/tools/onboarding.d.ts.map +1 -0
  52. package/dist/tools/onboarding.js +452 -0
  53. package/dist/tools/onboarding.js.map +1 -0
  54. package/dist/tools/setup.d.ts +61 -0
  55. package/dist/tools/setup.d.ts.map +1 -0
  56. package/dist/tools/setup.js +543 -0
  57. package/dist/tools/setup.js.map +1 -0
  58. package/dist/types.d.ts +280 -0
  59. package/dist/types.d.ts.map +1 -0
  60. package/dist/types.js +5 -0
  61. package/dist/types.js.map +1 -0
  62. package/package.json +51 -0
@@ -0,0 +1,874 @@
1
+ /**
2
+ * HTML Templates for Onboarding Screens
3
+ *
4
+ * Ready-to-use templates for common onboarding screen types.
5
+ * All elements have both data-ramp-id (unique identifier) and data-ramp-type (element type).
6
+ * Valid types: text, image, button, video, lottie, input
7
+ */
8
+ export const HTML_TEMPLATES = {
9
+ welcome: `<!DOCTYPE html>
10
+ <html>
11
+ <head>
12
+ <meta charset="utf-8">
13
+ <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
14
+ <style>
15
+ * { margin: 0; padding: 0; box-sizing: border-box; }
16
+ :root {
17
+ --ramp-primary: #007AFF;
18
+ --ramp-background: #FFFFFF;
19
+ --ramp-text: #1C1C1E;
20
+ --ramp-text-secondary: #8E8E93;
21
+ --ramp-safe-area-top: env(safe-area-inset-top, 44px);
22
+ --ramp-safe-area-bottom: env(safe-area-inset-bottom, 34px);
23
+ }
24
+ body {
25
+ font-family: -apple-system, BlinkMacSystemFont, 'SF Pro', sans-serif;
26
+ background: var(--ramp-background);
27
+ color: var(--ramp-text);
28
+ min-height: 100vh;
29
+ }
30
+ .screen {
31
+ min-height: 100vh;
32
+ display: flex;
33
+ flex-direction: column;
34
+ padding: calc(var(--ramp-safe-area-top) + 60px) 24px calc(var(--ramp-safe-area-bottom) + 20px);
35
+ }
36
+ .content {
37
+ flex: 1;
38
+ display: flex;
39
+ flex-direction: column;
40
+ align-items: center;
41
+ text-align: center;
42
+ }
43
+ .icon {
44
+ width: 120px;
45
+ height: 120px;
46
+ margin-bottom: 32px;
47
+ border-radius: 28px;
48
+ background: linear-gradient(135deg, var(--ramp-primary), #5856D6);
49
+ display: flex;
50
+ align-items: center;
51
+ justify-content: center;
52
+ font-size: 48px;
53
+ }
54
+ h1 {
55
+ font-size: 28px;
56
+ font-weight: 700;
57
+ margin-bottom: 12px;
58
+ line-height: 1.2;
59
+ }
60
+ .subtitle {
61
+ font-size: 17px;
62
+ color: var(--ramp-text-secondary);
63
+ line-height: 1.5;
64
+ max-width: 300px;
65
+ }
66
+ .actions {
67
+ display: flex;
68
+ flex-direction: column;
69
+ gap: 12px;
70
+ width: 100%;
71
+ }
72
+ .btn-primary {
73
+ background: var(--ramp-primary);
74
+ color: white;
75
+ border: none;
76
+ padding: 16px;
77
+ border-radius: 14px;
78
+ font-size: 17px;
79
+ font-weight: 600;
80
+ cursor: pointer;
81
+ width: 100%;
82
+ }
83
+ .btn-secondary {
84
+ background: transparent;
85
+ color: var(--ramp-primary);
86
+ border: none;
87
+ padding: 12px;
88
+ font-size: 15px;
89
+ font-weight: 500;
90
+ cursor: pointer;
91
+ }
92
+ </style>
93
+ </head>
94
+ <body>
95
+ <div class="screen">
96
+ <div class="content">
97
+ <div class="icon" data-ramp-id="icon" data-ramp-type="text">👋</div>
98
+ <h1 data-ramp-id="title" data-ramp-type="text">Welcome to AppName</h1>
99
+ <p class="subtitle" data-ramp-id="subtitle" data-ramp-type="text">
100
+ Discover amazing features that will help you achieve your goals faster than ever.
101
+ </p>
102
+ </div>
103
+ <div class="actions">
104
+ <button class="btn-primary" data-ramp-id="cta" data-ramp-type="button" data-tap-dynamic='{"action":"navigate","target":"next"}'>
105
+ Get Started
106
+ </button>
107
+ <button class="btn-secondary" data-ramp-id="skip" data-ramp-type="button" data-tap-dynamic='{"action":"dismiss"}'>
108
+ Skip for now
109
+ </button>
110
+ </div>
111
+ </div>
112
+ </body>
113
+ </html>`,
114
+ features: `<!DOCTYPE html>
115
+ <html>
116
+ <head>
117
+ <meta charset="utf-8">
118
+ <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
119
+ <style>
120
+ * { margin: 0; padding: 0; box-sizing: border-box; }
121
+ :root {
122
+ --ramp-primary: #007AFF;
123
+ --ramp-background: #FFFFFF;
124
+ --ramp-text: #1C1C1E;
125
+ --ramp-text-secondary: #8E8E93;
126
+ --ramp-safe-area-top: env(safe-area-inset-top, 44px);
127
+ --ramp-safe-area-bottom: env(safe-area-inset-bottom, 34px);
128
+ }
129
+ body {
130
+ font-family: -apple-system, BlinkMacSystemFont, 'SF Pro', sans-serif;
131
+ background: var(--ramp-background);
132
+ color: var(--ramp-text);
133
+ min-height: 100vh;
134
+ }
135
+ .screen {
136
+ min-height: 100vh;
137
+ display: flex;
138
+ flex-direction: column;
139
+ padding: calc(var(--ramp-safe-area-top) + 40px) 24px calc(var(--ramp-safe-area-bottom) + 20px);
140
+ }
141
+ .header {
142
+ text-align: center;
143
+ margin-bottom: 40px;
144
+ }
145
+ h1 {
146
+ font-size: 28px;
147
+ font-weight: 700;
148
+ margin-bottom: 8px;
149
+ }
150
+ .header p {
151
+ font-size: 15px;
152
+ color: var(--ramp-text-secondary);
153
+ }
154
+ .features {
155
+ flex: 1;
156
+ display: flex;
157
+ flex-direction: column;
158
+ gap: 20px;
159
+ }
160
+ .feature {
161
+ display: flex;
162
+ gap: 16px;
163
+ align-items: flex-start;
164
+ }
165
+ .feature-icon {
166
+ width: 48px;
167
+ height: 48px;
168
+ border-radius: 12px;
169
+ background: #F2F2F7;
170
+ display: flex;
171
+ align-items: center;
172
+ justify-content: center;
173
+ font-size: 24px;
174
+ flex-shrink: 0;
175
+ }
176
+ .feature-content h3 {
177
+ font-size: 17px;
178
+ font-weight: 600;
179
+ margin-bottom: 4px;
180
+ }
181
+ .feature-content p {
182
+ font-size: 15px;
183
+ color: var(--ramp-text-secondary);
184
+ line-height: 1.4;
185
+ }
186
+ .actions {
187
+ display: flex;
188
+ flex-direction: column;
189
+ gap: 12px;
190
+ margin-top: 24px;
191
+ }
192
+ .btn-primary {
193
+ background: var(--ramp-primary);
194
+ color: white;
195
+ border: none;
196
+ padding: 16px;
197
+ border-radius: 14px;
198
+ font-size: 17px;
199
+ font-weight: 600;
200
+ cursor: pointer;
201
+ }
202
+ </style>
203
+ </head>
204
+ <body>
205
+ <div class="screen">
206
+ <div class="header">
207
+ <h1 data-ramp-id="title" data-ramp-type="text">Powerful Features</h1>
208
+ <p data-ramp-id="subtitle" data-ramp-type="text">Everything you need in one app</p>
209
+ </div>
210
+ <div class="features">
211
+ <div class="feature">
212
+ <div class="feature-icon" data-ramp-id="feature1_icon" data-ramp-type="text">⚡</div>
213
+ <div class="feature-content">
214
+ <h3 data-ramp-id="feature1_title" data-ramp-type="text">Lightning Fast</h3>
215
+ <p data-ramp-id="feature1_desc" data-ramp-type="text">Experience blazing fast performance with our optimized engine.</p>
216
+ </div>
217
+ </div>
218
+ <div class="feature">
219
+ <div class="feature-icon" data-ramp-id="feature2_icon" data-ramp-type="text">🔒</div>
220
+ <div class="feature-content">
221
+ <h3 data-ramp-id="feature2_title" data-ramp-type="text">Secure by Default</h3>
222
+ <p data-ramp-id="feature2_desc" data-ramp-type="text">Your data is encrypted and protected at all times.</p>
223
+ </div>
224
+ </div>
225
+ <div class="feature">
226
+ <div class="feature-icon" data-ramp-id="feature3_icon" data-ramp-type="text">☁️</div>
227
+ <div class="feature-content">
228
+ <h3 data-ramp-id="feature3_title" data-ramp-type="text">Sync Everywhere</h3>
229
+ <p data-ramp-id="feature3_desc" data-ramp-type="text">Access your content from any device, automatically synced.</p>
230
+ </div>
231
+ </div>
232
+ </div>
233
+ <div class="actions">
234
+ <button class="btn-primary" data-ramp-id="cta" data-ramp-type="button" data-tap-dynamic='{"action":"navigate","target":"next"}'>
235
+ Continue
236
+ </button>
237
+ </div>
238
+ </div>
239
+ </body>
240
+ </html>`,
241
+ permissions: `<!DOCTYPE html>
242
+ <html>
243
+ <head>
244
+ <meta charset="utf-8">
245
+ <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
246
+ <style>
247
+ * { margin: 0; padding: 0; box-sizing: border-box; }
248
+ :root {
249
+ --ramp-primary: #007AFF;
250
+ --ramp-background: #FFFFFF;
251
+ --ramp-text: #1C1C1E;
252
+ --ramp-text-secondary: #8E8E93;
253
+ --ramp-safe-area-top: env(safe-area-inset-top, 44px);
254
+ --ramp-safe-area-bottom: env(safe-area-inset-bottom, 34px);
255
+ }
256
+ body {
257
+ font-family: -apple-system, BlinkMacSystemFont, 'SF Pro', sans-serif;
258
+ background: var(--ramp-background);
259
+ color: var(--ramp-text);
260
+ min-height: 100vh;
261
+ }
262
+ .screen {
263
+ min-height: 100vh;
264
+ display: flex;
265
+ flex-direction: column;
266
+ padding: calc(var(--ramp-safe-area-top) + 60px) 24px calc(var(--ramp-safe-area-bottom) + 20px);
267
+ }
268
+ .content {
269
+ flex: 1;
270
+ display: flex;
271
+ flex-direction: column;
272
+ align-items: center;
273
+ text-align: center;
274
+ }
275
+ .icon {
276
+ width: 100px;
277
+ height: 100px;
278
+ margin-bottom: 24px;
279
+ border-radius: 50%;
280
+ background: #F2F2F7;
281
+ display: flex;
282
+ align-items: center;
283
+ justify-content: center;
284
+ font-size: 48px;
285
+ }
286
+ h1 {
287
+ font-size: 26px;
288
+ font-weight: 700;
289
+ margin-bottom: 12px;
290
+ }
291
+ .description {
292
+ font-size: 16px;
293
+ color: var(--ramp-text-secondary);
294
+ line-height: 1.5;
295
+ max-width: 300px;
296
+ margin-bottom: 32px;
297
+ }
298
+ .benefits {
299
+ display: flex;
300
+ flex-direction: column;
301
+ gap: 12px;
302
+ text-align: left;
303
+ width: 100%;
304
+ max-width: 300px;
305
+ }
306
+ .benefit {
307
+ display: flex;
308
+ align-items: center;
309
+ gap: 12px;
310
+ font-size: 15px;
311
+ }
312
+ .benefit-check {
313
+ color: #34C759;
314
+ font-size: 18px;
315
+ }
316
+ .actions {
317
+ display: flex;
318
+ flex-direction: column;
319
+ gap: 12px;
320
+ width: 100%;
321
+ }
322
+ .btn-primary {
323
+ background: var(--ramp-primary);
324
+ color: white;
325
+ border: none;
326
+ padding: 16px;
327
+ border-radius: 14px;
328
+ font-size: 17px;
329
+ font-weight: 600;
330
+ cursor: pointer;
331
+ }
332
+ .btn-secondary {
333
+ background: transparent;
334
+ color: var(--ramp-text-secondary);
335
+ border: none;
336
+ padding: 12px;
337
+ font-size: 15px;
338
+ cursor: pointer;
339
+ }
340
+ </style>
341
+ </head>
342
+ <body>
343
+ <div class="screen">
344
+ <div class="content">
345
+ <div class="icon" data-ramp-id="icon" data-ramp-type="text">🔔</div>
346
+ <h1 data-ramp-id="title" data-ramp-type="text">Enable Notifications</h1>
347
+ <p class="description" data-ramp-id="description" data-ramp-type="text">
348
+ Stay updated with important alerts and never miss what matters.
349
+ </p>
350
+ <div class="benefits">
351
+ <div class="benefit">
352
+ <span class="benefit-check">✓</span>
353
+ <span data-ramp-id="benefit1" data-ramp-type="text">Get notified of new messages</span>
354
+ </div>
355
+ <div class="benefit">
356
+ <span class="benefit-check">✓</span>
357
+ <span data-ramp-id="benefit2" data-ramp-type="text">Receive important reminders</span>
358
+ </div>
359
+ <div class="benefit">
360
+ <span class="benefit-check">✓</span>
361
+ <span data-ramp-id="benefit3" data-ramp-type="text">Stay on top of updates</span>
362
+ </div>
363
+ </div>
364
+ </div>
365
+ <div class="actions">
366
+ <button class="btn-primary" data-ramp-id="cta" data-ramp-type="button" data-tap-dynamic='{"action":"requestPermission","permission":"notifications"}'>
367
+ Enable Notifications
368
+ </button>
369
+ <button class="btn-secondary" data-ramp-id="skip" data-ramp-type="button" data-tap-dynamic='{"action":"navigate","target":"next"}'>
370
+ Maybe Later
371
+ </button>
372
+ </div>
373
+ </div>
374
+ </body>
375
+ </html>`,
376
+ personalization: `<!DOCTYPE html>
377
+ <html>
378
+ <head>
379
+ <meta charset="utf-8">
380
+ <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
381
+ <style>
382
+ * { margin: 0; padding: 0; box-sizing: border-box; }
383
+ :root {
384
+ --ramp-primary: #007AFF;
385
+ --ramp-background: #FFFFFF;
386
+ --ramp-text: #1C1C1E;
387
+ --ramp-text-secondary: #8E8E93;
388
+ --ramp-safe-area-top: env(safe-area-inset-top, 44px);
389
+ --ramp-safe-area-bottom: env(safe-area-inset-bottom, 34px);
390
+ }
391
+ body {
392
+ font-family: -apple-system, BlinkMacSystemFont, 'SF Pro', sans-serif;
393
+ background: var(--ramp-background);
394
+ color: var(--ramp-text);
395
+ min-height: 100vh;
396
+ }
397
+ .screen {
398
+ min-height: 100vh;
399
+ display: flex;
400
+ flex-direction: column;
401
+ padding: calc(var(--ramp-safe-area-top) + 40px) 24px calc(var(--ramp-safe-area-bottom) + 20px);
402
+ }
403
+ .header {
404
+ text-align: center;
405
+ margin-bottom: 32px;
406
+ }
407
+ h1 {
408
+ font-size: 26px;
409
+ font-weight: 700;
410
+ margin-bottom: 8px;
411
+ }
412
+ .header p {
413
+ font-size: 15px;
414
+ color: var(--ramp-text-secondary);
415
+ }
416
+ .options {
417
+ flex: 1;
418
+ display: flex;
419
+ flex-direction: column;
420
+ gap: 12px;
421
+ }
422
+ .option {
423
+ display: flex;
424
+ align-items: center;
425
+ gap: 16px;
426
+ padding: 16px;
427
+ border: 2px solid #E5E5EA;
428
+ border-radius: 14px;
429
+ cursor: pointer;
430
+ transition: all 0.2s;
431
+ }
432
+ .option.selected {
433
+ border-color: var(--ramp-primary);
434
+ background: rgba(0, 122, 255, 0.05);
435
+ }
436
+ .option-icon {
437
+ font-size: 28px;
438
+ }
439
+ .option-content {
440
+ flex: 1;
441
+ }
442
+ .option-content h3 {
443
+ font-size: 17px;
444
+ font-weight: 600;
445
+ margin-bottom: 2px;
446
+ }
447
+ .option-content p {
448
+ font-size: 14px;
449
+ color: var(--ramp-text-secondary);
450
+ }
451
+ .option-check {
452
+ width: 24px;
453
+ height: 24px;
454
+ border-radius: 50%;
455
+ border: 2px solid #E5E5EA;
456
+ display: flex;
457
+ align-items: center;
458
+ justify-content: center;
459
+ color: white;
460
+ font-size: 14px;
461
+ }
462
+ .option.selected .option-check {
463
+ background: var(--ramp-primary);
464
+ border-color: var(--ramp-primary);
465
+ }
466
+ .actions {
467
+ margin-top: 24px;
468
+ }
469
+ .btn-primary {
470
+ background: var(--ramp-primary);
471
+ color: white;
472
+ border: none;
473
+ padding: 16px;
474
+ border-radius: 14px;
475
+ font-size: 17px;
476
+ font-weight: 600;
477
+ cursor: pointer;
478
+ width: 100%;
479
+ }
480
+ .btn-primary:disabled {
481
+ opacity: 0.5;
482
+ }
483
+ </style>
484
+ </head>
485
+ <body>
486
+ <div class="screen">
487
+ <div class="header">
488
+ <h1 data-ramp-id="title" data-ramp-type="text">What brings you here?</h1>
489
+ <p data-ramp-id="subtitle" data-ramp-type="text">Select what best describes you</p>
490
+ </div>
491
+ <div class="options">
492
+ <div class="option" data-value="personal" onclick="selectOption(this)">
493
+ <span class="option-icon" data-ramp-id="option1_icon" data-ramp-type="text">🏠</span>
494
+ <div class="option-content">
495
+ <h3 data-ramp-id="option1_title" data-ramp-type="text">Personal Use</h3>
496
+ <p data-ramp-id="option1_desc" data-ramp-type="text">For my own projects and tasks</p>
497
+ </div>
498
+ <div class="option-check">✓</div>
499
+ </div>
500
+ <div class="option" data-value="work" onclick="selectOption(this)">
501
+ <span class="option-icon" data-ramp-id="option2_icon" data-ramp-type="text">💼</span>
502
+ <div class="option-content">
503
+ <h3 data-ramp-id="option2_title" data-ramp-type="text">Work</h3>
504
+ <p data-ramp-id="option2_desc" data-ramp-type="text">For my job and professional tasks</p>
505
+ </div>
506
+ <div class="option-check">✓</div>
507
+ </div>
508
+ <div class="option" data-value="student" onclick="selectOption(this)">
509
+ <span class="option-icon" data-ramp-id="option3_icon" data-ramp-type="text">📚</span>
510
+ <div class="option-content">
511
+ <h3 data-ramp-id="option3_title" data-ramp-type="text">Student</h3>
512
+ <p data-ramp-id="option3_desc" data-ramp-type="text">For school and studying</p>
513
+ </div>
514
+ <div class="option-check">✓</div>
515
+ </div>
516
+ </div>
517
+ <div class="actions">
518
+ <button class="btn-primary" data-ramp-id="cta" data-ramp-type="button" disabled data-tap-dynamic='{"action":"navigate","target":"next"}'>
519
+ Continue
520
+ </button>
521
+ </div>
522
+ </div>
523
+ <script>
524
+ let selectedValue = null;
525
+
526
+ function selectOption(el) {
527
+ document.querySelectorAll('.option').forEach(o => o.classList.remove('selected'));
528
+ el.classList.add('selected');
529
+ selectedValue = el.dataset.value;
530
+ document.querySelector('.btn-primary').disabled = false;
531
+ }
532
+ </script>
533
+ </body>
534
+ </html>`,
535
+ paywall: `<!DOCTYPE html>
536
+ <html>
537
+ <head>
538
+ <meta charset="utf-8">
539
+ <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
540
+ <style>
541
+ * { margin: 0; padding: 0; box-sizing: border-box; }
542
+ :root {
543
+ --ramp-primary: #007AFF;
544
+ --ramp-background: #FFFFFF;
545
+ --ramp-text: #1C1C1E;
546
+ --ramp-text-secondary: #8E8E93;
547
+ --ramp-safe-area-top: env(safe-area-inset-top, 44px);
548
+ --ramp-safe-area-bottom: env(safe-area-inset-bottom, 34px);
549
+ }
550
+ body {
551
+ font-family: -apple-system, BlinkMacSystemFont, 'SF Pro', sans-serif;
552
+ background: var(--ramp-background);
553
+ color: var(--ramp-text);
554
+ min-height: 100vh;
555
+ }
556
+ .screen {
557
+ min-height: 100vh;
558
+ display: flex;
559
+ flex-direction: column;
560
+ padding: calc(var(--ramp-safe-area-top) + 20px) 24px calc(var(--ramp-safe-area-bottom) + 20px);
561
+ }
562
+ .close-btn {
563
+ position: absolute;
564
+ top: calc(var(--ramp-safe-area-top) + 12px);
565
+ right: 16px;
566
+ width: 30px;
567
+ height: 30px;
568
+ border-radius: 50%;
569
+ background: #E5E5EA;
570
+ border: none;
571
+ font-size: 18px;
572
+ cursor: pointer;
573
+ display: flex;
574
+ align-items: center;
575
+ justify-content: center;
576
+ }
577
+ .header {
578
+ text-align: center;
579
+ margin: 20px 0 24px;
580
+ }
581
+ .badge {
582
+ display: inline-block;
583
+ background: linear-gradient(135deg, #FFD700, #FFA500);
584
+ color: #1C1C1E;
585
+ font-size: 12px;
586
+ font-weight: 700;
587
+ padding: 6px 12px;
588
+ border-radius: 20px;
589
+ margin-bottom: 16px;
590
+ }
591
+ h1 {
592
+ font-size: 28px;
593
+ font-weight: 700;
594
+ margin-bottom: 8px;
595
+ }
596
+ .header p {
597
+ font-size: 16px;
598
+ color: var(--ramp-text-secondary);
599
+ }
600
+ .benefits {
601
+ margin-bottom: 24px;
602
+ }
603
+ .benefit-item {
604
+ display: flex;
605
+ align-items: center;
606
+ gap: 12px;
607
+ padding: 12px 0;
608
+ border-bottom: 1px solid #F2F2F7;
609
+ }
610
+ .benefit-item:last-child {
611
+ border-bottom: none;
612
+ }
613
+ .benefit-icon {
614
+ width: 40px;
615
+ height: 40px;
616
+ border-radius: 10px;
617
+ background: #F2F2F7;
618
+ display: flex;
619
+ align-items: center;
620
+ justify-content: center;
621
+ font-size: 20px;
622
+ }
623
+ .benefit-text {
624
+ flex: 1;
625
+ }
626
+ .benefit-text strong {
627
+ display: block;
628
+ font-size: 16px;
629
+ margin-bottom: 2px;
630
+ }
631
+ .benefit-text span {
632
+ font-size: 14px;
633
+ color: var(--ramp-text-secondary);
634
+ }
635
+ .plans {
636
+ display: flex;
637
+ gap: 12px;
638
+ margin-bottom: 20px;
639
+ }
640
+ .plan {
641
+ flex: 1;
642
+ border: 2px solid #E5E5EA;
643
+ border-radius: 16px;
644
+ padding: 16px;
645
+ cursor: pointer;
646
+ position: relative;
647
+ transition: all 0.2s;
648
+ }
649
+ .plan.selected {
650
+ border-color: var(--ramp-primary);
651
+ }
652
+ .plan.popular::before {
653
+ content: 'BEST VALUE';
654
+ position: absolute;
655
+ top: -10px;
656
+ left: 50%;
657
+ transform: translateX(-50%);
658
+ background: var(--ramp-primary);
659
+ color: white;
660
+ font-size: 10px;
661
+ font-weight: 700;
662
+ padding: 4px 8px;
663
+ border-radius: 4px;
664
+ }
665
+ .plan-period {
666
+ font-size: 14px;
667
+ font-weight: 600;
668
+ margin-bottom: 4px;
669
+ }
670
+ .plan-price {
671
+ font-size: 24px;
672
+ font-weight: 700;
673
+ }
674
+ .plan-price span {
675
+ font-size: 14px;
676
+ font-weight: 400;
677
+ color: var(--ramp-text-secondary);
678
+ }
679
+ .plan-savings {
680
+ font-size: 12px;
681
+ color: #34C759;
682
+ margin-top: 4px;
683
+ }
684
+ .actions {
685
+ margin-top: auto;
686
+ }
687
+ .btn-primary {
688
+ background: var(--ramp-primary);
689
+ color: white;
690
+ border: none;
691
+ padding: 16px;
692
+ border-radius: 14px;
693
+ font-size: 17px;
694
+ font-weight: 600;
695
+ cursor: pointer;
696
+ width: 100%;
697
+ margin-bottom: 12px;
698
+ }
699
+ .terms {
700
+ text-align: center;
701
+ font-size: 12px;
702
+ color: var(--ramp-text-secondary);
703
+ }
704
+ .terms a {
705
+ color: var(--ramp-primary);
706
+ text-decoration: none;
707
+ }
708
+ </style>
709
+ </head>
710
+ <body>
711
+ <div class="screen">
712
+ <button class="close-btn" data-ramp-id="close" data-ramp-type="button" data-tap-dynamic='{"action":"dismiss"}'>✕</button>
713
+
714
+ <div class="header">
715
+ <span class="badge" data-ramp-id="badge" data-ramp-type="text">PRO</span>
716
+ <h1 data-ramp-id="title" data-ramp-type="text">Unlock Everything</h1>
717
+ <p data-ramp-id="subtitle" data-ramp-type="text">Get unlimited access to all features</p>
718
+ </div>
719
+
720
+ <div class="benefits">
721
+ <div class="benefit-item">
722
+ <div class="benefit-icon" data-ramp-id="benefit1_icon" data-ramp-type="text">🚀</div>
723
+ <div class="benefit-text">
724
+ <strong data-ramp-id="benefit1_title" data-ramp-type="text">Unlimited Projects</strong>
725
+ <span data-ramp-id="benefit1_desc" data-ramp-type="text">Create as many as you need</span>
726
+ </div>
727
+ </div>
728
+ <div class="benefit-item">
729
+ <div class="benefit-icon" data-ramp-id="benefit2_icon" data-ramp-type="text">📊</div>
730
+ <div class="benefit-text">
731
+ <strong data-ramp-id="benefit2_title" data-ramp-type="text">Advanced Analytics</strong>
732
+ <span data-ramp-id="benefit2_desc" data-ramp-type="text">Deep insights and reports</span>
733
+ </div>
734
+ </div>
735
+ <div class="benefit-item">
736
+ <div class="benefit-icon" data-ramp-id="benefit3_icon" data-ramp-type="text">⭐</div>
737
+ <div class="benefit-text">
738
+ <strong data-ramp-id="benefit3_title" data-ramp-type="text">Priority Support</strong>
739
+ <span data-ramp-id="benefit3_desc" data-ramp-type="text">Get help when you need it</span>
740
+ </div>
741
+ </div>
742
+ </div>
743
+
744
+ <div class="plans">
745
+ <div class="plan" data-plan="monthly" onclick="selectPlan(this)">
746
+ <div class="plan-period" data-ramp-id="monthly_label" data-ramp-type="text">Monthly</div>
747
+ <div class="plan-price" data-ramp-id="monthly_price" data-ramp-type="text">$9.99<span>/mo</span></div>
748
+ </div>
749
+ <div class="plan popular selected" data-plan="annual" onclick="selectPlan(this)">
750
+ <div class="plan-period" data-ramp-id="annual_label" data-ramp-type="text">Annual</div>
751
+ <div class="plan-price" data-ramp-id="annual_price" data-ramp-type="text">$4.99<span>/mo</span></div>
752
+ <div class="plan-savings" data-ramp-id="savings" data-ramp-type="text">Save 50%</div>
753
+ </div>
754
+ </div>
755
+
756
+ <div class="actions">
757
+ <button class="btn-primary" data-ramp-id="cta" data-ramp-type="button" data-tap-dynamic='{"action":"purchase","productId":"annual"}'>
758
+ Start Free Trial
759
+ </button>
760
+ <p class="terms" data-ramp-id="terms" data-ramp-type="text">
761
+ 7-day free trial, then billed annually.
762
+ </p>
763
+ </div>
764
+ </div>
765
+ <script>
766
+ let selectedPlan = 'annual';
767
+
768
+ function selectPlan(el) {
769
+ document.querySelectorAll('.plan').forEach(p => p.classList.remove('selected'));
770
+ el.classList.add('selected');
771
+ selectedPlan = el.dataset.plan;
772
+ }
773
+ </script>
774
+ </body>
775
+ </html>`,
776
+ complete: `<!DOCTYPE html>
777
+ <html>
778
+ <head>
779
+ <meta charset="utf-8">
780
+ <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
781
+ <style>
782
+ * { margin: 0; padding: 0; box-sizing: border-box; }
783
+ :root {
784
+ --ramp-primary: #007AFF;
785
+ --ramp-background: #FFFFFF;
786
+ --ramp-text: #1C1C1E;
787
+ --ramp-text-secondary: #8E8E93;
788
+ --ramp-safe-area-top: env(safe-area-inset-top, 44px);
789
+ --ramp-safe-area-bottom: env(safe-area-inset-bottom, 34px);
790
+ }
791
+ body {
792
+ font-family: -apple-system, BlinkMacSystemFont, 'SF Pro', sans-serif;
793
+ background: var(--ramp-background);
794
+ color: var(--ramp-text);
795
+ min-height: 100vh;
796
+ }
797
+ .screen {
798
+ min-height: 100vh;
799
+ display: flex;
800
+ flex-direction: column;
801
+ padding: calc(var(--ramp-safe-area-top) + 60px) 24px calc(var(--ramp-safe-area-bottom) + 20px);
802
+ }
803
+ .content {
804
+ flex: 1;
805
+ display: flex;
806
+ flex-direction: column;
807
+ align-items: center;
808
+ justify-content: center;
809
+ text-align: center;
810
+ }
811
+ .success-icon {
812
+ width: 120px;
813
+ height: 120px;
814
+ border-radius: 50%;
815
+ background: #34C759;
816
+ display: flex;
817
+ align-items: center;
818
+ justify-content: center;
819
+ font-size: 56px;
820
+ color: white;
821
+ margin-bottom: 32px;
822
+ animation: scaleIn 0.5s ease-out;
823
+ }
824
+ @keyframes scaleIn {
825
+ 0% { transform: scale(0); opacity: 0; }
826
+ 50% { transform: scale(1.1); }
827
+ 100% { transform: scale(1); opacity: 1; }
828
+ }
829
+ h1 {
830
+ font-size: 28px;
831
+ font-weight: 700;
832
+ margin-bottom: 12px;
833
+ }
834
+ .subtitle {
835
+ font-size: 17px;
836
+ color: var(--ramp-text-secondary);
837
+ line-height: 1.5;
838
+ max-width: 280px;
839
+ }
840
+ .actions {
841
+ width: 100%;
842
+ }
843
+ .btn-primary {
844
+ background: var(--ramp-primary);
845
+ color: white;
846
+ border: none;
847
+ padding: 16px;
848
+ border-radius: 14px;
849
+ font-size: 17px;
850
+ font-weight: 600;
851
+ cursor: pointer;
852
+ width: 100%;
853
+ }
854
+ </style>
855
+ </head>
856
+ <body>
857
+ <div class="screen">
858
+ <div class="content">
859
+ <div class="success-icon" data-ramp-id="icon" data-ramp-type="text">✓</div>
860
+ <h1 data-ramp-id="title" data-ramp-type="text">You're All Set!</h1>
861
+ <p class="subtitle" data-ramp-id="subtitle" data-ramp-type="text">
862
+ Everything is ready. Start exploring and make the most of your experience.
863
+ </p>
864
+ </div>
865
+ <div class="actions">
866
+ <button class="btn-primary" data-ramp-id="cta" data-ramp-type="button" data-tap-dynamic='{"action":"finish"}'>
867
+ Let's Go
868
+ </button>
869
+ </div>
870
+ </div>
871
+ </body>
872
+ </html>`,
873
+ };
874
+ //# sourceMappingURL=templates.js.map