@adstage/web-sdk 1.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 (68) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +70 -0
  3. package/dist/index.cjs.js +2304 -0
  4. package/dist/index.d.ts +416 -0
  5. package/dist/index.esm.js +2288 -0
  6. package/dist/index.standalone.js +2331 -0
  7. package/examples/README.md +33 -0
  8. package/examples/banner-ads.html +512 -0
  9. package/examples/index.html +338 -0
  10. package/examples/native-ads.html +634 -0
  11. package/examples/react-app/README.md +70 -0
  12. package/examples/react-app/index.html +13 -0
  13. package/examples/react-app/package-lock.json +3042 -0
  14. package/examples/react-app/package.json +26 -0
  15. package/examples/react-app/pnpm-lock.yaml +1857 -0
  16. package/examples/react-app/public/index.standalone.js +2331 -0
  17. package/examples/react-app/src/App.tsx +226 -0
  18. package/examples/react-app/src/index.css +37 -0
  19. package/examples/react-app/src/main.tsx +10 -0
  20. package/examples/react-app/tsconfig.json +25 -0
  21. package/examples/react-app/tsconfig.node.json +10 -0
  22. package/examples/react-app/vite.config.ts +15 -0
  23. package/examples/react-nextjs/app/globals.css +200 -0
  24. package/examples/react-nextjs/app/layout.tsx +27 -0
  25. package/examples/react-nextjs/app/page.tsx +258 -0
  26. package/examples/react-nextjs/next.config.js +9 -0
  27. package/examples/react-nextjs/package.json +22 -0
  28. package/examples/react-nextjs/pnpm-lock.yaml +343 -0
  29. package/examples/react-nextjs/tsconfig.json +34 -0
  30. package/examples/text-ads.html +597 -0
  31. package/examples/video-ads.html +739 -0
  32. package/package.json +83 -0
  33. package/src/global.d.ts +20 -0
  34. package/src/index.ts +350 -0
  35. package/src/managers/device-info-collector.ts +127 -0
  36. package/src/managers/event-tracker.ts +131 -0
  37. package/src/managers/fade-slider-manager.ts +276 -0
  38. package/src/managers/impression-tracker.ts +88 -0
  39. package/src/managers/slider-manager.ts +405 -0
  40. package/src/react/components/AdErrorBoundary.tsx +75 -0
  41. package/src/react/components/AdSlot.tsx +144 -0
  42. package/src/react/components/BannerAd.tsx +24 -0
  43. package/src/react/components/InterstitialAd.tsx +24 -0
  44. package/src/react/components/NativeAd.tsx +24 -0
  45. package/src/react/components/TextAd.tsx +24 -0
  46. package/src/react/components/VideoAd.tsx +24 -0
  47. package/src/react/components/index.ts +8 -0
  48. package/src/react/hooks/index.ts +4 -0
  49. package/src/react/hooks/useAdSlot.ts +83 -0
  50. package/src/react/hooks/useAdStage.ts +14 -0
  51. package/src/react/hooks/useAdTracking.ts +61 -0
  52. package/src/react/index.ts +4 -0
  53. package/src/react/providers/AdStageProvider.tsx +86 -0
  54. package/src/react/providers/index.ts +2 -0
  55. package/src/renderers/banner-renderer.ts +35 -0
  56. package/src/renderers/base-renderer.ts +207 -0
  57. package/src/renderers/index.ts +71 -0
  58. package/src/renderers/interstitial-renderer.ts +70 -0
  59. package/src/renderers/native-renderer.ts +35 -0
  60. package/src/renderers/text-renderer.ts +94 -0
  61. package/src/renderers/video-renderer.ts +63 -0
  62. package/src/types/advertisement.ts +197 -0
  63. package/src/types/api.ts +173 -0
  64. package/src/types/config.ts +174 -0
  65. package/src/types/events.ts +60 -0
  66. package/src/types/index.ts +6 -0
  67. package/src/utils/dom-utils.ts +237 -0
  68. package/src/utils/sdk-utils.ts +134 -0
@@ -0,0 +1,338 @@
1
+ <!DOCTYPE html>
2
+ <html lang="ko">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>AdStage SDK - ESM ์˜ˆ์ œ</title>
7
+ <style>
8
+ * {
9
+ box-sizing: border-box;
10
+ margin: 0;
11
+ padding: 0;
12
+ }
13
+
14
+ body {
15
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif;
16
+ line-height: 1.6;
17
+ color: #333;
18
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
19
+ min-height: 100vh;
20
+ padding: 20px;
21
+ }
22
+
23
+ .container {
24
+ max-width: 1200px;
25
+ margin: 0 auto;
26
+ background: white;
27
+ border-radius: 12px;
28
+ box-shadow: 0 10px 30px rgba(0,0,0,0.1);
29
+ overflow: hidden;
30
+ }
31
+
32
+ .header {
33
+ background: linear-gradient(135deg, #667eea, #764ba2);
34
+ color: white;
35
+ text-align: center;
36
+ padding: 40px 20px;
37
+ }
38
+
39
+ .header h1 {
40
+ font-size: 2.5rem;
41
+ margin-bottom: 10px;
42
+ }
43
+
44
+ .header p {
45
+ font-size: 1.2rem;
46
+ opacity: 0.9;
47
+ }
48
+
49
+ .nav {
50
+ background: #f8f9fa;
51
+ padding: 20px;
52
+ border-bottom: 1px solid #dee2e6;
53
+ }
54
+
55
+ .nav h2 {
56
+ margin-bottom: 15px;
57
+ color: #495057;
58
+ }
59
+
60
+ .nav-grid {
61
+ display: grid;
62
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
63
+ gap: 15px;
64
+ }
65
+
66
+ .nav-item {
67
+ background: white;
68
+ border: 2px solid #e9ecef;
69
+ border-radius: 8px;
70
+ padding: 15px;
71
+ text-decoration: none;
72
+ color: #495057;
73
+ transition: all 0.3s ease;
74
+ }
75
+
76
+ .nav-item:hover {
77
+ border-color: #667eea;
78
+ transform: translateY(-2px);
79
+ box-shadow: 0 4px 12px rgba(102, 126, 234, 0.15);
80
+ }
81
+
82
+ .nav-item h3 {
83
+ color: #667eea;
84
+ margin-bottom: 8px;
85
+ }
86
+
87
+ .content {
88
+ padding: 40px;
89
+ }
90
+
91
+ .demo-section {
92
+ margin-bottom: 40px;
93
+ }
94
+
95
+ .demo-section h2 {
96
+ color: #495057;
97
+ margin-bottom: 20px;
98
+ padding-bottom: 10px;
99
+ border-bottom: 2px solid #667eea;
100
+ }
101
+
102
+ .ad-grid {
103
+ display: grid;
104
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
105
+ gap: 20px;
106
+ margin-top: 20px;
107
+ }
108
+
109
+ .ad-slot {
110
+ border: 2px dashed #dee2e6;
111
+ border-radius: 8px;
112
+ padding: 20px;
113
+ text-align: center;
114
+ background: #f8f9fa;
115
+ min-height: 120px;
116
+ display: flex;
117
+ align-items: center;
118
+ justify-content: center;
119
+ position: relative;
120
+ }
121
+
122
+ .ad-slot::before {
123
+ content: attr(data-label);
124
+ position: absolute;
125
+ top: 8px;
126
+ left: 8px;
127
+ font-size: 0.8rem;
128
+ color: #6c757d;
129
+ background: white;
130
+ padding: 2px 6px;
131
+ border-radius: 4px;
132
+ }
133
+
134
+ .status {
135
+ margin-top: 20px;
136
+ padding: 15px;
137
+ background: #e7f3ff;
138
+ border-left: 4px solid #0066cc;
139
+ border-radius: 4px;
140
+ }
141
+
142
+ .code-snippet {
143
+ background: #2d3748;
144
+ color: #e2e8f0;
145
+ padding: 20px;
146
+ border-radius: 8px;
147
+ font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
148
+ font-size: 0.9rem;
149
+ overflow-x: auto;
150
+ margin: 15px 0;
151
+ }
152
+
153
+ .feature-grid {
154
+ display: grid;
155
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
156
+ gap: 20px;
157
+ margin: 20px 0;
158
+ }
159
+
160
+ .feature-card {
161
+ background: #f8f9fa;
162
+ border: 1px solid #e9ecef;
163
+ border-radius: 8px;
164
+ padding: 20px;
165
+ text-align: center;
166
+ }
167
+
168
+ .feature-icon {
169
+ font-size: 2rem;
170
+ margin-bottom: 10px;
171
+ }
172
+
173
+ .feature-title {
174
+ font-weight: 600;
175
+ color: #495057;
176
+ margin-bottom: 8px;
177
+ }
178
+
179
+ .feature-desc {
180
+ font-size: 0.9rem;
181
+ color: #6c757d;
182
+ }
183
+ </style>
184
+ </head>
185
+ <body>
186
+ <div class="container">
187
+ <div class="header">
188
+ <h1>๐Ÿš€ AdStage SDK</h1>
189
+ <p>ES Modules (ESM) ๋ฐฉ์‹ ์˜ˆ์ œ</p>
190
+ </div>
191
+
192
+ <div class="nav">
193
+ <h2>๐Ÿ“– ์˜ˆ์ œ ํŽ˜์ด์ง€</h2>
194
+ <div class="nav-grid">
195
+ <a href="banner-ads.html" class="nav-item">
196
+ <h3>๐Ÿ–ผ๏ธ ๋ฐฐ๋„ˆ ๊ด‘๊ณ </h3>
197
+ <p>๋‹ค์–‘ํ•œ ํฌ๊ธฐ์˜ ์ด๋ฏธ์ง€ ๋ฐฐ๋„ˆ ๊ด‘๊ณ </p>
198
+ </a>
199
+ <a href="text-ads.html" class="nav-item">
200
+ <h3>๐Ÿ“ ํ…์ŠคํŠธ ๊ด‘๊ณ </h3>
201
+ <p>ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ๊ด‘๊ณ </p>
202
+ </a>
203
+ <a href="native-ads.html" class="nav-item">
204
+ <h3>๐ŸŽฏ ๋„ค์ดํ‹ฐ๋ธŒ ๊ด‘๊ณ </h3>
205
+ <p>์ฝ˜ํ…์ธ ์™€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์–ด์šธ๋ฆฌ๋Š” ๊ด‘๊ณ </p>
206
+ </a>
207
+ <a href="video-ads.html" class="nav-item">
208
+ <h3>๐ŸŽฌ ๋น„๋””์˜ค ๊ด‘๊ณ </h3>
209
+ <p>๋น„๋””์˜ค ์ฝ˜ํ…์ธ  ๊ด‘๊ณ </p>
210
+ </a>
211
+ </div>
212
+ </div>
213
+
214
+ <div class="content">
215
+ <div class="demo-section">
216
+ <h2>๐ŸŽฎ ์‹ค์‹œ๊ฐ„ ๋ฐ๋ชจ</h2>
217
+ <div class="code-snippet">
218
+ import AdStageSDK, { AdType } from '../dist/index.standalone.js';
219
+
220
+ // SDK ์ดˆ๊ธฐํ™”
221
+ const sdk = AdStageSDK.init({
222
+ apiKey: 'demo-api-key',
223
+ debug: true
224
+ });
225
+ </div>
226
+
227
+ <div class="ad-grid">
228
+ <div class="ad-slot" data-label="๋ฐฐ๋„ˆ" id="demo-banner" adstage="demo-banner" ad-type="BANNER"></div>
229
+ <div class="ad-slot" data-label="ํ…์ŠคํŠธ" id="demo-text" adstage="demo-text" ad-type="TEXT"></div>
230
+ <div class="ad-slot" data-label="๋„ค์ดํ‹ฐ๋ธŒ" id="demo-native" adstage="demo-native" ad-type="NATIVE"></div>
231
+ </div>
232
+
233
+ <div class="status" id="status">
234
+ SDK ๋กœ๋”ฉ ์ค‘...
235
+ </div>
236
+ </div>
237
+
238
+ <div class="demo-section">
239
+ <h2>โœจ ์ฃผ์š” ๊ธฐ๋Šฅ</h2>
240
+ <div class="feature-grid">
241
+ <div class="feature-card">
242
+ <div class="feature-icon">๐ŸŽฏ</div>
243
+ <div class="feature-title">ํƒ€๊ฒŸํŒ…</div>
244
+ <div class="feature-desc">์ •ํ™•ํ•œ ์‚ฌ์šฉ์ž ํƒ€๊ฒŸํŒ…</div>
245
+ </div>
246
+ <div class="feature-card">
247
+ <div class="feature-icon">๐Ÿ“Š</div>
248
+ <div class="feature-title">๋ถ„์„</div>
249
+ <div class="feature-desc">์‹ค์‹œ๊ฐ„ ์„ฑ๊ณผ ๋ถ„์„</div>
250
+ </div>
251
+ <div class="feature-card">
252
+ <div class="feature-icon">๐Ÿ”„</div>
253
+ <div class="feature-title">์ž๋™ํ™”</div>
254
+ <div class="feature-desc">์Šค๋งˆํŠธ ๊ด‘๊ณ  ์ตœ์ ํ™”</div>
255
+ </div>
256
+ <div class="feature-card">
257
+ <div class="feature-icon">โšก</div>
258
+ <div class="feature-title">๋น ๋ฅธ ๋กœ๋”ฉ</div>
259
+ <div class="feature-desc">ESM ๋ชจ๋“ˆ ์‹œ์Šคํ…œ</div>
260
+ </div>
261
+ </div>
262
+ </div>
263
+
264
+ <div class="demo-section">
265
+ <h2>๐Ÿ”ง ์‚ฌ์šฉ ๋ฐฉ๋ฒ•</h2>
266
+ <p><strong>1๋‹จ๊ณ„:</strong> ESM ๋ฐฉ์‹์œผ๋กœ SDK Import</p>
267
+ <div class="code-snippet">
268
+ &lt;script type="module"&gt;
269
+ import AdStageSDK, { AdType } from '../dist/index.standalone.js';
270
+ &lt;/script&gt;
271
+ </div>
272
+
273
+ <p><strong>2๋‹จ๊ณ„:</strong> HTML์— ๊ด‘๊ณ  ์Šฌ๋กฏ ์ถ”๊ฐ€</p>
274
+ <div class="code-snippet">
275
+ &lt;div adstage="my-ad" ad-type="BANNER"&gt;&lt;/div&gt;
276
+ </div>
277
+
278
+ <p><strong>3๋‹จ๊ณ„:</strong> SDK ์ดˆ๊ธฐํ™”</p>
279
+ <div class="code-snippet">
280
+ const sdk = AdStageSDK.init({
281
+ apiKey: 'YOUR_API_KEY',
282
+ debug: true
283
+ });
284
+ </div>
285
+ </div>
286
+ </div>
287
+ </div>
288
+
289
+ <script type="module">
290
+ import AdStageSDK, { AdType } from './dist/index.standalone.js';
291
+
292
+ const statusEl = document.getElementById('status');
293
+
294
+ try {
295
+ // SDK ์ดˆ๊ธฐํ™”
296
+ const sdk = AdStageSDK.init({
297
+ apiKey: '7dfddcfda637fbb73225bac3731688b80b90675942fe9f2057a88e2379aba2a4',
298
+ debug: true
299
+ });
300
+
301
+ statusEl.innerHTML = 'โœ… SDK ์ดˆ๊ธฐํ™” ์™„๋ฃŒ - ์‹ค์ œ ๊ด‘๊ณ  ๋กœ๋”ฉ ์ค‘...';
302
+ statusEl.style.background = '#d4edda';
303
+ statusEl.style.borderColor = '#28a745';
304
+
305
+ // ์‹ค์ œ API์—์„œ ๊ด‘๊ณ  ์ž๋™ ๋กœ๋“œ
306
+ await sdk.autoLoadSlots();
307
+
308
+ // ๊ด‘๊ณ  ์Šฌ๋กฏ๋“ค ํด๋ฆญ ์ด๋ฒคํŠธ ์ถ”๊ฐ€
309
+ document.querySelectorAll('.ad-slot').forEach(slot => {
310
+ slot.addEventListener('click', function() {
311
+ const adType = this.getAttribute('ad-type');
312
+ const slotId = this.getAttribute('adstage');
313
+ console.log(`${adType} ๊ด‘๊ณ  ์Šฌ๋กฏ ํด๋ฆญ๋จ:`, slotId);
314
+
315
+ // ์‹œ๊ฐ์  ํ”ผ๋“œ๋ฐฑ
316
+ this.style.background = '#e3f2fd';
317
+ setTimeout(() => {
318
+ this.style.background = '#f8f9fa';
319
+ }, 300);
320
+ });
321
+ });
322
+
323
+ // ๋กœ๋”ฉ ์™„๋ฃŒ ๋ฉ”์‹œ์ง€
324
+ setTimeout(() => {
325
+ statusEl.innerHTML = '๐ŸŽฏ ์‹ค์ œ ๊ด‘๊ณ  ๋กœ๋”ฉ ์™„๋ฃŒ! beta-api.adstage.app์—์„œ ๊ฐ€์ ธ์˜จ ๊ด‘๊ณ ์ž…๋‹ˆ๋‹ค.';
326
+ }, 2000);
327
+
328
+ console.log('AdStage SDK ์‹ค์ œ API ๊ด‘๊ณ  ๋กœ๋“œ ์™„๋ฃŒ');
329
+
330
+ } catch (error) {
331
+ console.error('SDK ์ดˆ๊ธฐํ™” ์˜ค๋ฅ˜:', error);
332
+ statusEl.innerHTML = 'โŒ SDK ์ดˆ๊ธฐํ™” ์‹คํŒจ: ' + error.message;
333
+ statusEl.style.background = '#f8d7da';
334
+ statusEl.style.borderColor = '#dc3545';
335
+ }
336
+ </script>
337
+ </body>
338
+ </html>