@coxwave/tap-sdk 0.0.12 → 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.
package/dist/index.d.ts CHANGED
@@ -1,49 +1,12 @@
1
- import { ChatInitMessage, ChatOpenMessage, ChatCloseMessage, TimelineSeekMessage, AlarmClickMessage, PopUpCloseMessage, PdfEnlargedMessage, PdfShrinkedMessage, ChatInitiatedMessage, ChatOpenedMessage, ChatClosedMessage, AlarmFadeInMessage, PopUpOpenMessage, PdfOpenMessage, PdfCloseMessage, AlarmMessageInstanceType } from '@coxwave/tap-messages';
1
+ import { AlarmMessageInstanceType } from '@coxwave/tap-messages';
2
+ export { AlarmMessageInstanceType, AlarmType } from '@coxwave/tap-messages';
2
3
 
3
- type Unsubscribe = () => void;
4
- type Message = {
5
- type: string;
6
- [key: string]: any;
7
- };
8
- declare abstract class Messenger<TToTargetMessages extends Message = Message, TFromTargetMessage extends Message = Message> {
9
- protected listeners: Map<TFromTargetMessage["type"], ((event: MessageEvent) => void)[]>;
10
- protected unifiedMessageHandler: ((event: MessageEvent) => void) | null;
11
- protected on<T extends TFromTargetMessage["type"]>(messageType: T, callback: (data: Extract<TFromTargetMessage, {
12
- type: T;
13
- }>) => void): Unsubscribe;
14
- removeListener(messageType: TFromTargetMessage["type"]): void;
15
- removeAllListeners(): void;
16
- postMessage(message: TToTargetMessages): boolean;
17
- protected abstract isValidOrigin(event: MessageEvent): boolean;
18
- protected abstract getMessageTarget(): Window | null;
19
- protected abstract getTargetOrigin(): string;
20
- }
21
-
22
- interface HandshakeOptions {
23
- timeout?: number;
24
- maxRetries?: number;
25
- retryInterval?: number;
26
- }
27
-
28
- interface LogEvent {
29
- action: string;
30
- category: string;
31
- label?: string;
32
- value?: number;
33
- customParams?: Record<string, any>;
34
- }
35
- interface EventMiddleware {
36
- handle(event: LogEvent): void;
37
- }
38
- declare class EventLogger {
39
- private middlewares;
40
- addMiddleware(middleware: EventMiddleware): void;
41
- removeMiddleware(middleware: EventMiddleware): void;
42
- log(event: LogEvent): void;
43
- logChatAction(action: "opened" | "closed" | "initialized", customParams?: Record<string, any>): void;
44
- logButtonClick(buttonType: "toggle" | "alarm", state?: string, customParams?: Record<string, any>): void;
45
- logSDKInitialization(success: boolean, startTime: number, error?: string): void;
46
- }
4
+ /**
5
+ * TapSDK Type Definitions
6
+ *
7
+ * Re-exported types for API compatibility with the loader.
8
+ * These types match the actual SDK implementation in tap-sdk-cdn.
9
+ */
47
10
 
48
11
  type TapSDKConfig = {
49
12
  apiKey: string;
@@ -71,155 +34,86 @@ type PositionType = {
71
34
  right?: string;
72
35
  bottom?: string;
73
36
  };
74
-
75
37
  type SeekTimelineParamsType = {
76
38
  clipId: string;
77
39
  clipPlayHead: number;
78
40
  };
79
41
 
80
- type ToTapMessage = ChatInitMessage | ChatOpenMessage | ChatCloseMessage | TimelineSeekMessage | AlarmClickMessage | PopUpCloseMessage | PdfEnlargedMessage | PdfShrinkedMessage;
81
- type FromTapMessage = ChatInitiatedMessage | ChatOpenedMessage | ChatClosedMessage | AlarmFadeInMessage | PopUpOpenMessage | PdfOpenMessage | PdfCloseMessage | TimelineSeekMessage;
82
- interface ChatInitConfig {
83
- course: Course;
84
- container?: ContainerStyle;
85
- }
86
- declare class TapIframeBridge extends Messenger<ToTapMessage, FromTapMessage> {
87
- #private;
88
- protected hostOrigin: string;
89
- protected apiKey: string;
90
- protected iframe: HTMLIFrameElement | null;
91
- private eventLogger;
92
- constructor({ hostOrigin, apiKey, eventLogger, }: {
93
- hostOrigin: string;
94
- apiKey: string;
95
- eventLogger?: EventLogger;
96
- });
97
- protected isValidOrigin(_event: MessageEvent): boolean;
98
- protected getMessageTarget(): Window | null;
99
- protected getTargetOrigin(): string;
100
- renderIframe(iframeRootElement?: HTMLElement): Promise<HTMLIFrameElement>;
101
- hasIframe(): boolean;
102
- ensureIframe(rootElement?: HTMLElement): Promise<HTMLIFrameElement>;
103
- removeIframe(): void;
104
- postToTap: (message: ToTapMessage) => boolean;
105
- listenToTap: <T extends "timeline:seek" | "chat:opened" | "chat:initiated" | "chat:closed" | "alarm:fadeIn" | "popUp:open" | "pdf:open" | "pdf:close">(messageType: T, callback: (data: Extract<TimelineSeekMessage, {
106
- type: T;
107
- }> | Extract<ChatInitiatedMessage, {
108
- type: T;
109
- }> | Extract<ChatOpenedMessage, {
110
- type: T;
111
- }> | Extract<ChatClosedMessage, {
112
- type: T;
113
- }> | Extract<AlarmFadeInMessage, {
114
- type: T;
115
- }> | Extract<PopUpOpenMessage, {
116
- type: T;
117
- }> | Extract<PdfOpenMessage, {
118
- type: T;
119
- }> | Extract<PdfCloseMessage, {
120
- type: T;
121
- }>) => void) => () => void;
122
- performHandshake(config: ChatInitConfig, options?: HandshakeOptions): Promise<ChatInitiatedMessage>;
123
- static defaultHandshakeOptions: HandshakeOptions;
124
- }
42
+ /**
43
+ * TapSDK - npm package wrapper
44
+ *
45
+ * Simply loads the CDN loader which handles version management and SDK loading.
46
+ * This keeps the npm package minimal and allows instant updates via CDN.
47
+ */
125
48
 
126
- declare class EventManager {
127
- private iframeBridge;
128
- constructor(iframeBridge: TapIframeBridge);
129
- /**
130
- * Updates timeline position in the chat interface
131
- * @param params - Timeline seek parameters
132
- */
133
- seekTimeline({ clipId, clipPlayHead }: SeekTimelineParamsType): void;
134
- onTimelineSeek(handler: (clipPlayHead: number, clipId: string) => void): void;
135
- onChatOpened(handler: () => void): void;
136
- onChatClosed(handler: () => void): void;
137
- onChatInitiated(handler: () => void): void;
138
- onAlarmFadeIn(handler: (messageInfo: AlarmMessageInstanceType) => void): void;
139
- onPopUpOpen(handler: (popUpInfo: PopUpOpenMessage["popUpInfo"]) => void): void;
140
- onPdfOpen(handler: () => void): void;
141
- onPdfClose(handler: () => void): void;
49
+ type TapSDKConstructor = new (config: TapSDKConfig) => TapSDKInstance;
50
+ declare global {
51
+ interface Window {
52
+ TapSDK?: TapSDKConstructor;
53
+ __TAP_SDK_LOADER_LOADED__?: boolean;
54
+ __TAP_SDK_LOADER_LOADING__?: Promise<void>;
55
+ }
56
+ }
57
+ interface TapSDKInstance {
58
+ events: {
59
+ seekTimeline: (params: SeekTimelineParamsType) => void;
60
+ onTimelineSeek: (callback: (clipPlayHead: number, clipId: string) => void) => void;
61
+ onChatInitiated: (handler: () => void) => void;
62
+ onChatOpened: (handler: () => void) => void;
63
+ onChatClosed: (handler: () => void) => void;
64
+ onAlarmFadeIn: (handler: (messageInfo: AlarmMessageInstanceType) => void) => void;
65
+ onPopUpOpen: (handler: (popUpInfo: any) => void) => void;
66
+ onPdfOpen: (handler: () => void) => void;
67
+ onPdfClose: (handler: () => void) => void;
68
+ };
69
+ isOpen: boolean;
70
+ isInitialized: boolean;
71
+ init(params: TapSDKInitParams): Promise<void>;
72
+ destroy(): void;
73
+ initChat(params: TapSDKInitParams): Promise<void>;
74
+ postChatInfo(params: {
75
+ clipId: string;
76
+ clipPlayHead: number;
77
+ }): Promise<void>;
78
+ getTimelineInfo(params: {
79
+ callback: (clipPlayHead: number, clipId: string) => void;
80
+ }): Promise<void>;
142
81
  }
143
-
144
82
  /**
145
- * TapSDK - Interactive chat SDK with toggle button and iframe communication
83
+ * TapSDK Wrapper Class
146
84
  *
147
- * @example
148
- * ```typescript
149
- * const sdk = new TapSDK({ apiKey: 'your-key' });
150
- * await sdk.init({ course: { userId: 'user1', courseId: 'course1' } });
151
- * ```
85
+ * Loads the CDN loader and proxies all calls to the actual SDK
152
86
  */
153
- declare class TapSDK {
154
- private apiKey;
155
- private iframeBridge;
156
- events: EventManager;
157
- private eventLogger;
158
- private container;
159
- private button;
160
- private alarm;
161
- private containerVisible;
162
- private isPdfOpen;
163
- private _isInitialized;
164
- /**
165
- * Creates a new TapSDK instance
166
- * @param config - SDK configuration options
167
- */
168
- constructor({ apiKey }: TapSDKConfig);
87
+ declare class TapSDK implements TapSDKInstance {
88
+ private config;
89
+ private sdkInstance?;
90
+ private loadPromise;
91
+ constructor(config: TapSDKConfig);
92
+ private loadAndInitialize;
93
+ private ensureLoaded;
94
+ get events(): {
95
+ seekTimeline: (params: SeekTimelineParamsType) => void;
96
+ onTimelineSeek: (callback: (clipPlayHead: number, clipId: string) => void) => void;
97
+ onChatInitiated: (handler: () => void) => void;
98
+ onChatOpened: (handler: () => void) => void;
99
+ onChatClosed: (handler: () => void) => void;
100
+ onAlarmFadeIn: (handler: (messageInfo: AlarmMessageInstanceType) => void) => void;
101
+ onPopUpOpen: (handler: (popUpInfo: any) => void) => void;
102
+ onPdfOpen: (handler: () => void) => void;
103
+ onPdfClose: (handler: () => void) => void;
104
+ };
169
105
  get isOpen(): boolean;
170
106
  get isInitialized(): boolean;
171
- /**
172
- * Initializes the TapSDK with course data and optional container styles
173
- * @param params - Initialization parameters
174
- * @param params.course - Course information for chat context
175
- * @param params.container - Optional container styling options
176
- * @throws {Error} When initialization fails
177
- */
178
- init({ buttonId, course, container }: TapSDKInitParams): Promise<void>;
179
- /**
180
- * Destroys the SDK instance and cleans up all resources
181
- */
107
+ init(params: TapSDKInitParams): Promise<void>;
182
108
  destroy(): void;
183
- private setupEventLogger;
184
- private toggleChatOpen;
185
- private validateEnvironment;
186
- private setupContainer;
187
- private updateContainerStyles;
188
- private setupButton;
189
- private setupEventListeners;
190
- /**
191
- * Update container styles dynamically
192
- */
193
- updateStyles(container: ContainerStyle): void;
194
- /**
195
- * POC: Dynamically set container size
196
- */
197
- setContainerSize(width: string, height: string): void;
198
- /**
199
- * POC: Animate container resize
200
- */
201
- animateContainerResize(width: string, height: string, duration?: number): void;
202
- /**
203
- * POC: Set responsive mode
204
- */
205
- setResponsiveMode(mode: "compact" | "normal" | "expanded"): void;
206
- /**
207
- * @deprecated Use `init` method instead. Will be removed in v1.0.0
208
- */
209
109
  initChat(params: TapSDKInitParams): Promise<void>;
210
- /**
211
- * @deprecated Use `events.seekTimeline` method instead. Will be removed in v1.0.0
212
- */
213
- postChatInfo({ clipId, clipPlayHead, }: {
110
+ postChatInfo(params: {
214
111
  clipId: string;
215
112
  clipPlayHead: number;
216
- }): void;
217
- /**
218
- * @deprecated Use `events.onTimelineSeek` method instead. Will be removed in v1.0.0
219
- */
220
- getTimelineInfo({ callback, }: {
113
+ }): Promise<void>;
114
+ getTimelineInfo(params: {
221
115
  callback: (clipPlayHead: number, clipId: string) => void;
222
- }): void;
116
+ }): Promise<void>;
223
117
  }
224
118
 
225
- export { TapSDK as default };
119
+ export { type ContainerStyle, type Course, type PositionType, type SeekTimelineParamsType, TapSDK, type TapSDKConfig, type TapSDKConstructor, type TapSDKInitParams, type TapSDKInstance, TapSDK as default };
@@ -1,24 +1,3 @@
1
-
2
- // Auto-injected CSS
3
- (function() {
4
- if (typeof document !== 'undefined') {
5
- const style = document.createElement('style');
6
- style.id = 'tap-sdk-styles';
7
- style.textContent = "@keyframes _16e62km0{0%{opacity:0;transform:translateY(30px)}to{opacity:1;transform:translateY(0)}}@keyframes _16e62km1{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(30px);display:none}}._16e62km2{opacity:0;transform:translateY(30px);transition:opacity .4s ease,transform .4s ease;pointer-events:none;display:none}._16e62km3{animation:_16e62km0 .4s ease forwards;pointer-events:auto}._16e62km4{animation:_16e62km1 .4s ease forwards;pointer-events:none}._16e62km5{border:none!important}@keyframes wtjce00{0%{opacity:1;pointer-events:auto}50%{opacity:1}to{opacity:0}}.wtjce01{pointer-events:none;opacity:0;display:flex;position:absolute;width:max-content;top:calc(100% + 5px);right:0;flex-direction:column;justify-content:center;align-items:flex-end;padding-top:2px;cursor:pointer;z-index:999;transition:opacity .3s ease}.wtjce02{pointer-events:auto;animation:wtjce00 18s forwards}.wtjce03{opacity:0;pointer-events:none;animation:none}.wtjce04{display:flex;justify-content:flex-end;border-radius:var(--Radius-radiusSM, 8px);width:max-content;gap:5px}.wtjce05{display:flex;padding:8px 12px 6px;justify-content:flex-end;align-items:center;border-radius:var(--Radius-radiusSM, 8px);max-width:340px}.wtjce06{background-color:#171b1f}.wtjce07{background-color:#fa6b4b}.wtjce08{color:#fff;text-align:right;font-family:Pretendard;font-size:14px;font-style:normal;font-weight:400;line-height:20px;white-space:pre-wrap;word-break:keep-all;overflow-wrap:break-word}.wtjce09{display:flex;padding:0 23px;align-items:flex-start;gap:10px}.wtjce0a{width:15px}.wtjce0b{color:#171b1f}.wtjce0c{color:#fa6b4b}.wtjce0d{cursor:pointer;justify-content:center;align-items:center;width:20px;height:20px;border-radius:100px;z-index:999;transition:all .2s ease}.wtjce0d:hover{width:63px;left:-72px}.wtjce04:hover .wtjce0d{display:flex}.wtjce0e,.wtjce0f{display:none;background-color:#171b1f}.wtjce0g{color:#fff}.wtjce0d:hover .wtjce0g{display:none}.wtjce0h{color:#fff;text-align:center;font-family:Pretendard;font-size:12px;font-style:normal;font-weight:400;line-height:20px;display:none}.wtjce0d:hover .wtjce0h{display:block}._1mnmljf0{width:100%;min-width:max-content;table-layout:auto;border-collapse:separate;border-spacing:0;border:.4px solid rgba(118,118,128,.12);border-radius:8px;overflow:auto;background-color:#fff;cursor:pointer}._1mnmljf1{border:.4px solid rgba(118,118,128,.12);padding:10px;background-color:#f2f2f2;text-align:left;font-family:Pretendard;color:#090909;font-size:12px;font-weight:500;white-space:normal;overflow-wrap:break-word;word-break:break-word}._1mnmljf2{border:.4px solid rgba(118,118,128,.12);padding:10px;color:#090909;font-family:Pretendard;font-size:12px;font-weight:400;width:fit-content;max-width:400px;white-space:normal;overflow-wrap:break-word;word-break:break-word}._1mnmljf3{position:relative;background-color:#fafafa;border-radius:8px;padding:8px;overflow-y:auto}._1mnmljf4{display:flex;align-items:center;justify-content:space-between;padding-bottom:4px}._1mnmljf5{color:#4a5568;padding:2px 6px;font-size:12px;border-radius:4px;z-index:10;font-family:Pretendard}._1mnmljf6{z-index:10;cursor:pointer;display:flex;align-items:center;width:max-content;color:#4a5568;padding:2px 6px;font-size:12px;border:none;font-family:Pretendard}._1mnmljf7{white-space:nowrap}._1mnmljf8{display:flex;width:12px;height:12px;margin-bottom:4px;color:#4a5568;flex-shrink:0}._1mnmljf9{position:fixed;top:0;left:0;width:100vw;height:100vh;background:#0006;z-index:10000002}._1mnmljfa{position:fixed;display:flex;flex-direction:column;width:max-content;max-width:calc(100vw - 100px);overflow:auto;background:#fff;padding:20px;border:1px solid #ccc;box-shadow:0 4px 20px #0003;z-index:10000003;border-radius:8px}\n/*# sourceMappingURL=index.css.map */";
8
- if (!document.getElementById('tap-sdk-styles')) {
9
- document.head.appendChild(style);
10
- }
11
- }
12
- })();
13
-
14
- var TapSDK=(function(){'use strict';var je=Object.defineProperty;var Y=i=>{throw TypeError(i)};var De=(i,e,t)=>e in i?je(i,e,{enumerable:true,configurable:true,writable:true,value:t}):i[e]=t;var o=(i,e,t)=>De(i,typeof e!="symbol"?e+"":e,t),Oe=(i,e,t)=>e.has(i)||Y("Cannot "+t);var w=(i,e,t)=>e.has(i)?Y("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(i):e.set(i,t);var m=(i,e,t)=>(Oe(i,e,"access private method"),t);var Q="_16e62km2",E="_16e62km4";var L="_16e62km3";var d=class d{constructor(){o(this,"$container",null);o(this,"containerIdCounter",0);if(d.instance)return d.instance;this.$container=null,d.instance=this;}static resetInstance(){d.instance&&(d.instance.forceRemove(),d.instance=null);}get element(){return this.$container??void 0}createContainer({customContainer:e}){this.forceRemove(),this.containerIdCounter++;let t=`cw-tap-container-${this.containerIdCounter}-${Date.now()}`;return this.$container=document.createElement("div"),this.$container.id=t,this.$container.className=Q,this.updateStyles(e),document.body.appendChild(this.$container),this.$container}forceRemove(){this.$container&&(this.$container.remove(),this.$container=null),document.querySelectorAll("[id^='cw-tap-container']").forEach(t=>{t.remove();});}updateStyles(e){if(!this.$container){e?this.createContainer({customContainer:e}):this.createContainer({});return}let t={top:e?.position?.top??"50px",right:e?.position?.right??"24px",left:e?.position?.left??"unset",bottom:e?.position?.bottom??"unset",width:e?.width??"340px",height:e?.height??"calc(100% - 116px)",overflow:"hidden",backgroundColor:"transparent",borderRadius:e?.borderRadius??"16px",boxShadow:`
15
- rgba(255, 255, 255, 0.12) 0px 0px 2px 0px inset,
16
- rgba(0, 0, 0, 0.05) 0px 0px 2px 1px,
17
- rgba(0, 0, 0, 0.3) 0px 12px 60px
18
- `,willChange:"transform, opacity, width, max-height, max-width"};this.$container.style.cssText="",this.$container.style.setProperty("position","fixed","important"),this.$container.style.setProperty("z-index","10000001","important"),this.$container.style.setProperty("top",t.top,"important"),this.$container.style.setProperty("right",t.right,"important"),this.$container.style.setProperty("left",t.left,"important"),this.$container.style.setProperty("bottom",t.bottom,"important"),this.$container.style.setProperty("width",t.width,"important"),this.$container.style.setProperty("height",t.height,"important"),this.$container.style.setProperty("overflow",t.overflow,"important"),this.$container.style.setProperty("background-color",t.backgroundColor,"important"),this.$container.style.setProperty("border-radius",t.borderRadius,"important"),this.$container.style.setProperty("box-shadow",t.boxShadow,"important"),this.$container.style.setProperty("will-change",t.willChange,"important"),this.$container.offsetHeight;}getBoundingClientRect(){return this.$container?this.$container.getBoundingClientRect():null}getComputedStyles(){if(!this.$container)return null;let e=window.getComputedStyle(this.$container);console.log("[Container] Raw computed styles:",{width:e.width,height:e.height,borderRadius:e.borderRadius,top:e.top,right:e.right,left:e.left,bottom:e.bottom});let t=(r,s)=>r&&r!=="auto"?r:s,n={width:t(e.width,"340px"),height:"calc(100vh - 116px)",borderRadius:t(e.borderRadius,"16px"),position:{top:t(e.top,"50px"),right:t(e.right,"24px"),left:e.left==="auto"?"unset":e.left,bottom:e.bottom==="auto"?"unset":e.bottom}};return console.log("[Container] Processed computed styles:",n),n}toggleVisibility(e){if(!this.$container)return;this.$container.classList.remove(L,E),this.$container.style.display="block";let t=()=>{this.$container&&(this.$container.classList.contains(E)&&(this.$container.style.display="none"),this.$container.removeEventListener("animationend",t));};this.$container.addEventListener("animationend",t),requestAnimationFrame(()=>{this.$container?.classList.add(e?L:E);});}removeContainer(){this.forceRemove();}resizeContainer(e,t){if(!this.$container)return;let n=t?.width??"340px",r=parseInt(n,10),s=r/3*10-r,u=e?`${r+s}px`:`${r}px`;this.$container.style.width=u;}setDynamicSize(e,t){this.$container&&(this.$container.style.transition="width 0.3s ease, height 0.3s ease",this.$container.style.width=e,this.$container.style.height=t);}animateResize(e,t,n=300){this.$container&&(this.$container.style.transition=`width ${n}ms ease, height ${n}ms ease`,this.$container.style.width=e,this.$container.style.height=t);}setResponsiveMode(e){if(!this.$container)return;let t={compact:{width:"280px",height:"calc(100% - 200px)"},normal:{width:"340px",height:"calc(100% - 116px)"},expanded:{width:"480px",height:"calc(100% - 80px)"}},{width:n,height:r}=t[e];this.animateResize(n,r,400);}};o(d,"instance",null);var z=d,N=z;var R=class{constructor(){o(this,"buttonElement");}create(e){let t=document.getElementById(e);if(!t)throw new Error(`Element with id '${e}' not found`);return t.style.setProperty("position","relative","important"),t.style.setProperty("z-index","10000001","important"),this.buttonElement=t,this.buttonElement}onClick(e){if(!this.buttonElement)throw new Error("not initialized");this.buttonElement.addEventListener("click",e);}},ee=R;var te="wtjce01",q={default:"wtjce0b wtjce0a","call-to-action":"wtjce0c wtjce0a"},ne="wtjce0a",re="wtjce09",B={default:"wtjce0e wtjce0d","call-to-action":"wtjce0f wtjce0d"},ie="wtjce0d",se="wtjce0h",ue="wtjce0g",H="wtjce03",oe="wtjce08",G={default:"wtjce06 wtjce05","call-to-action":"wtjce07 wtjce05"},ae="wtjce05",F="wtjce02",le="wtjce04";var f,ce,pe,fe,he,ye,V=class{constructor(){w(this,f);o(this,"container");o(this,"alarmTimeout");o(this,"alarmCornerSVG");o(this,"textContainer");o(this,"circleElement");o(this,"textInTextContainer");o(this,"messageInfo");}render({rootElement:e}){this.container=document.createElement("div"),this.container.id="alarm-container",this.container.className=te,this.container.addEventListener("click",n=>{n.stopPropagation();}),e.appendChild(this.container),m(this,f,ce).call(this,this.container);let t=m(this,f,pe).call(this,this.container);m(this,f,he).call(this,t),m(this,f,fe).call(this,t);}fadeIn(e){e.type==="default"||e.type==="hourSpent"?(this.textContainer.className=G.default,this.alarmCornerSVG.setAttribute("class",q.default),this.circleElement.className=B.default):(this.textContainer.className=G["call-to-action"],this.alarmCornerSVG.setAttribute("class",q["call-to-action"]),this.circleElement.className=B["call-to-action"]),this.messageInfo=e,this.textInTextContainer.textContent=e.message,this.toggleVisibility(true),this.alarmTimeout=setTimeout(()=>{this.toggleVisibility(false);},18*1e3);}onAlarmClick(e){this.container.addEventListener("click",()=>{this.toggleVisibility(false),e(this.messageInfo);});}toggleVisibility(e){this.container.classList.remove(F,H),requestAnimationFrame(()=>{this.container?.classList.add(e?F:H);});}remove(){this.container&&this.toggleVisibility(false),this.alarmTimeout&&clearTimeout(this.alarmTimeout);}};f=new WeakSet,ce=function(e){let t=document.createElement("div");t.className=re,e.appendChild(t);let n=document.createElementNS("http://www.w3.org/2000/svg","svg");n.setAttribute("width","11"),n.setAttribute("height","8"),n.setAttribute("viewBox","0 0 11 8"),n.setAttribute("fill","currentColor"),n.setAttribute("class",ne);let r=document.createElementNS("http://www.w3.org/2000/svg","path");r.setAttribute("d","M5.5 0L11.1292 8.25H-0.129165L5.5 0Z"),r.setAttribute("fill","currentColor"),n.appendChild(r),this.alarmCornerSVG=n,t.appendChild(n);},pe=function(e){let t=document.createElement("div");return t.className=le,e.appendChild(t),t},fe=function(e){this.textContainer=document.createElement("div"),this.textContainer.className=ae,e.appendChild(this.textContainer),this.textInTextContainer=document.createElement("span"),this.textInTextContainer.className=oe,this.textContainer.appendChild(this.textInTextContainer);},he=function(e){let t=document.createElement("div");t.className=ie,e.appendChild(t),t.addEventListener("click",r=>{r.stopPropagation(),this.remove();});let n=document.createElement("span");n.className=se,t.appendChild(n),n.textContent="\uC54C\uB9BC \uB044\uAE30",m(this,f,ye).call(this,t),this.circleElement=t;},ye=function(e){let t=document.createElementNS("http://www.w3.org/2000/svg","svg");t.setAttribute("width","10"),t.setAttribute("height","10"),t.setAttribute("viewBox","0 0 14 14"),t.setAttribute("fill","none"),t.setAttribute("class",ue);let n=document.createElementNS("http://www.w3.org/2000/svg","path");n.setAttribute("d","M1 1L13 13M13 1L1 13"),n.setAttribute("stroke","currentColor"),n.setAttribute("stroke-width","2"),n.setAttribute("stroke-linecap","round"),t.appendChild(n),e.appendChild(t);};var me=V;var U;function de(i){return {lang:i?.lang??U?.lang,message:i?.message,abortEarly:i?.abortEarly??U?.abortEarly,abortPipeEarly:i?.abortPipeEarly??U?.abortPipeEarly}}var Le;function ze(i){return Le?.get(i)}var Ne;function Re(i){return Ne?.get(i)}var qe;function Be(i,e){return qe?.get(i)?.get(e)}function ve(i){let e=typeof i;return e==="string"?`"${i}"`:e==="number"||e==="bigint"||e==="boolean"?`${i}`:e==="object"||e==="function"?(i&&Object.getPrototypeOf(i)?.constructor?.name)??"null":e}function k(i,e,t,n,r){let s=r&&"input"in r?r.input:t.value,u=r?.expected??i.expects??null,a=r?.received??ve(s),l={kind:i.kind,type:i.type,input:s,expected:u,received:a,message:`Invalid ${e}: ${u?`Expected ${u} but r`:"R"}eceived ${a}`,requirement:i.requirement,path:r?.path,issues:r?.issues,lang:n.lang,abortEarly:n.abortEarly,abortPipeEarly:n.abortPipeEarly},p=i.kind==="schema",c=r?.message??i.message??Be(i.reference,l.lang)??(p?Re(l.lang):null)??n.message??ze(l.lang);c!==void 0&&(l.message=typeof c=="function"?c(l):c),p&&(t.typed=false),t.issues?t.issues.push(l):t.issues=[l];}function x(i){return {version:1,vendor:"valibot",validate(e){return i["~run"]({value:e},de())}}}function He(i,e){return Object.hasOwn(i,e)&&e!=="__proto__"&&e!=="prototype"&&e!=="constructor"}function Ge(i,e,t){return typeof i.fallback=="function"?i.fallback(e,t):i.fallback}function Fe(i,e,t){return typeof i.default=="function"?i.default(e,t):i.default}function X(){return {kind:"schema",type:"any",reference:X,expects:"any",async:false,get"~standard"(){return x(this)},"~run"(i){return i.typed=true,i}}}function _(i,e){return {kind:"schema",type:"literal",reference:_,expects:ve(i),async:false,literal:i,message:e,get"~standard"(){return x(this)},"~run"(t,n){return t.value===this.literal?t.typed=true:k(this,"type",t,n),t}}}function I(i,e){return {kind:"schema",type:"object",reference:I,expects:"Object",async:false,entries:i,message:e,get"~standard"(){return x(this)},"~run"(t,n){let r=t.value;if(r&&typeof r=="object"){t.typed=true,t.value={};for(let s in this.entries){let u=this.entries[s];if(s in r||(u.type==="exact_optional"||u.type==="optional"||u.type==="nullish")&&u.default!==void 0){let a=s in r?r[s]:Fe(u),l=u["~run"]({value:a},n);if(l.issues){let p={type:"object",origin:"value",input:r,key:s,value:a};for(let c of l.issues)c.path?c.path.unshift(p):c.path=[p],t.issues?.push(c);if(t.issues||(t.issues=l.issues),n.abortEarly){t.typed=false;break}}l.typed||(t.typed=false),t.value[s]=l.value;}else if(u.fallback!==void 0)t.value[s]=Ge(u);else if(u.type!=="exact_optional"&&u.type!=="optional"&&u.type!=="nullish"&&(k(this,"key",t,n,{input:void 0,expected:`"${s}"`,path:[{type:"object",origin:"key",input:r,key:s,value:r[s]}]}),n.abortEarly))break}}else k(this,"type",t,n);return t}}}function W(i,e,t){return {kind:"schema",type:"record",reference:W,expects:"Object",async:false,key:i,value:e,message:t,get"~standard"(){return x(this)},"~run"(n,r){let s=n.value;if(s&&typeof s=="object"){n.typed=true,n.value={};for(let u in s)if(He(s,u)){let a=s[u],l=this.key["~run"]({value:u},r);if(l.issues){let c={type:"object",origin:"key",input:s,key:u,value:a};for(let h of l.issues)h.path=[c],n.issues?.push(h);if(n.issues||(n.issues=l.issues),r.abortEarly){n.typed=false;break}}let p=this.value["~run"]({value:a},r);if(p.issues){let c={type:"object",origin:"value",input:s,key:u,value:a};for(let h of p.issues)h.path?h.path.unshift(c):h.path=[c],n.issues?.push(h);if(n.issues||(n.issues=p.issues),r.abortEarly){n.typed=false;break}}(!l.typed||!p.typed)&&(n.typed=false),l.typed&&(n.value[l.value]=p.value);}}else k(this,"type",n,r);return n}}}function C(i){return {kind:"schema",type:"string",reference:C,expects:"string",async:false,message:i,get"~standard"(){return x(this)},"~run"(e,t){return typeof e.value=="string"?e.typed=true:k(this,"type",e,t),e}}}function ge(i,e,t){let n=i["~run"]({value:e},de(t));return {typed:n.typed,success:!n.issues,output:n.value,issues:n.issues}}var ke="chat:init",Ve="chat:initiated";var xe=I({type:_(Ve),gaId:C()});I({type:_("GA_EVENT"),payload:W(C(),X())});var T=class{constructor(){o(this,"listeners",new Map);o(this,"unifiedMessageHandler",null);}on(e,t){let n=s=>{if(this.isValidOrigin(s))try{let u=s.data,a=typeof u=="string"?JSON.parse(u):u,{type:l}=a;l===e&&t(a);}catch(u){console.warn("Messenger: Failed to parse message data",u);}},r=this.listeners.get(e)||[];return r.push(n),this.listeners.set(e,r),this.unifiedMessageHandler||(this.unifiedMessageHandler=s=>{this.listeners.forEach(u=>u.forEach(a=>a(s)));},window.addEventListener("message",this.unifiedMessageHandler)),()=>{this.unifiedMessageHandler&&(window.removeEventListener("message",this.unifiedMessageHandler),this.unifiedMessageHandler=null);}}removeListener(e){this.listeners.delete(e);}removeAllListeners(){this.listeners.clear(),this.unifiedMessageHandler&&(window.removeEventListener("message",this.unifiedMessageHandler),this.unifiedMessageHandler=null);}postMessage(e){try{let t=this.getMessageTarget();return t?(t.postMessage(e,this.getTargetOrigin()),!0):(console.warn("Messenger: Message target not available"),!1)}catch(t){return console.error("Messenger: postMessage failed",t),false}}};var v=class extends Error{constructor(t,n,r){super(`Handshake failed: ${t}${n?` - ${n}`:""}`);this.reason=t;this.details=n;this.originalError=r;this.name="HandshakeError";}},$=class{constructor(e,t,n){this.getTargetWindow=e;this.getTargetOrigin=t;this.isValidOrigin=n;o(this,"abortController",null);o(this,"messageListener",null);}async execute(e,t={}){let{timeout:n=1e4,maxRetries:r=10,retryInterval:s=500}=t;return this.cancel(),this.abortController=new AbortController,new Promise((u,a)=>{let l=0,p,c=()=>{p&&clearTimeout(p),this.messageListener&&(window.removeEventListener("message",this.messageListener),this.messageListener=null);},h=()=>{c(),a(new v("TIMEOUT","Handshake was cancelled"));};this.abortController?.signal.addEventListener("abort",h),this.messageListener=y=>{if(this.isValidOrigin(y))try{let g=y.data,Me=typeof g=="string"?JSON.parse(g):g,Z=ge(xe,Me);if(Z.success){c(),this.abortController=null,u(Z.output);return}}catch{}},window.addEventListener("message",this.messageListener),p=setTimeout(()=>{c(),this.abortController=null,a(new v("TIMEOUT",`No valid response received within ${n}ms`));},n);let J=()=>{if(!this.abortController?.signal.aborted)try{let y=this.getTargetWindow(),g=this.getTargetOrigin();if(!y)throw new v("NO_TARGET_WINDOW","Target iframe window is not available");y.postMessage(e,g),l++,l<r&&setTimeout(()=>{this.abortController?.signal.aborted||J();},s);}catch(y){c(),this.abortController=null,y instanceof v?a(y):a(new v("MESSAGE_SEND_FAILED","Failed to send handshake message",y));}};J();})}cancel(){this.abortController&&(this.abortController.abort(),this.abortController=null),this.messageListener&&(window.removeEventListener("message",this.messageListener),this.messageListener=null);}isActive(){return this.abortController!==null&&!this.abortController.signal.aborted}};var b,we,Ee,M=class M extends T{constructor({hostOrigin:t,apiKey:n,eventLogger:r}){super();w(this,b);o(this,"hostOrigin");o(this,"apiKey");o(this,"iframe");o(this,"eventLogger");o(this,"postToTap",t=>{if(!this.iframe)return console.error("TapIframeBridge: iframe not found - ensure createIframeChat() was called first"),console.error("Failed to send message:",t),(t.type==="chat:open"||t.type==="chat:close")&&console.error("Chat cannot be opened/closed - iframe is not initialized"),this.eventLogger?.log({action:"iframe_message_failed",category:"error",label:t.type,customParams:{reason:"iframe_not_initialized"}}),false;let n=super.postMessage(t);return this.eventLogger?.log({action:"iframe_message_sent",category:"communication",label:t.type,customParams:{success:n}}),n});o(this,"listenToTap",super.on);this.hostOrigin=t,this.apiKey=n,this.eventLogger=r;}isValidOrigin(t){return true}getMessageTarget(){return this.iframe?.contentWindow||null}getTargetOrigin(){if(!this.iframe?.src)return "*";try{return new URL(this.iframe.src).origin}catch{return "*"}}renderIframe(t){return new Promise(n=>{this.iframe&&(this.iframe.remove(),this.iframe=null),this.iframe=document.createElement("iframe"),this.iframe.style.setProperty("display","flex","important"),this.iframe.style.setProperty("border","none","important"),this.iframe.src=m(this,b,we).call(this),this.iframe.style.width="100%",this.iframe.style.height="100%",this.iframe.onload=()=>{n(this.iframe);},t?.appendChild(this.iframe);})}hasIframe(){return this.iframe!==null&&this.iframe!==void 0}async ensureIframe(t){return this.hasIframe()?this.iframe:this.renderIframe(t)}removeIframe(){this.iframe?.remove(),this.iframe=null,this.removeAllListeners();}async performHandshake(t,n=M.defaultHandshakeOptions){if(!this.iframe)throw new Error("TapIframeBridge: iframe not available for handshake");this.eventLogger?.log({action:"handshake_started",category:"communication",customParams:{iframeSrc:this.iframe.src,targetOrigin:this.getTargetOrigin(),messageTargetAvailable:!!this.getMessageTarget()}});let r=new $(()=>this.getMessageTarget(),()=>this.getTargetOrigin(),a=>this.isValidOrigin(a)),s={type:ke,hostOrigin:this.hostOrigin,apiKey:this.apiKey,chatApiParams:{...t.course,clipPlayHead:t.course.clipPlayHead??0},apiUrl:m(this,b,Ee).call(this)||""};this.eventLogger?.log({action:"handshake_message_sending",category:"communication",customParams:{messageType:s.type,hostOrigin:s.hostOrigin,hasApiKey:!!s.apiKey,apiUrl:s.apiUrl,chatApiParams:s.chatApiParams}});let u=Date.now();try{let a=await r.execute(s,n);return this.eventLogger?.log({action:"iframe_handshake",category:"system",label:"success",value:Date.now()-u,customParams:{apiUrl:s.apiUrl,targetOrigin:this.getTargetOrigin()}}),a}catch(a){throw console.error("[TapIframeBridge] Handshake failed:",a),this.eventLogger?.log({action:"iframe_handshake",category:"error",label:"failed",value:Date.now()-u,customParams:{error:a instanceof Error?a.message:"Unknown error",apiUrl:s.apiUrl}}),a instanceof Error?new Error(`TapIframeBridge handshake failed: ${a.message}`):a}}};b=new WeakSet,we=function(){if(typeof window>"u"||typeof localStorage>"u")throw new Error("TapIframeBridge: window or localStorage is not defined");try{let t=localStorage.getItem("tap-url-storage");if(t){let n=JSON.parse(t);this.eventLogger?.log({action:"custom_tap_url_found",category:"configuration",customParams:{stored:n}});let r=n?.state?.tapUrl;if(r)return this.eventLogger?.log({action:"custom_tap_url_used",category:"configuration",customParams:{customTapUrl:r}}),`${r}/chat`}}catch{}return "https://ax-tap-fe-edutap-poc.vercel.app/chat"},Ee=function(){if(!(typeof window>"u"||typeof localStorage>"u"))try{let t=localStorage.getItem("tap-api-url-storage");return t?JSON.parse(t)?.state?.apiUrl:void 0}catch{return}},o(M,"defaultHandshakeOptions",{retryInterval:500,maxRetries:3,timeout:3e4});var A=M;var j=class{constructor(e){this.iframeBridge=e;}seekTimeline({clipId:e,clipPlayHead:t}){this.iframeBridge.postToTap({type:"timeline:seek",clipId:e,clipPlayHead:t});}onTimelineSeek(e){this.iframeBridge.listenToTap("timeline:seek",t=>e(t.clipPlayHead,t.clipId));}onChatOpened(e){this.iframeBridge.listenToTap("chat:opened",e);}onChatClosed(e){this.iframeBridge.listenToTap("chat:closed",e);}onChatInitiated(e){this.iframeBridge.listenToTap("chat:initiated",e);}onAlarmFadeIn(e){this.iframeBridge.listenToTap("alarm:fadeIn",t=>{e(t.messageInfo);});}onPopUpOpen(e){this.iframeBridge.listenToTap("popUp:open",t=>{e(t.popUpInfo);});}onPdfOpen(e){this.iframeBridge.listenToTap("pdf:open",e);}onPdfClose(e){this.iframeBridge.listenToTap("pdf:close",e);}};var Ue="G-27C0E436HL",D=class{constructor(e=Ue){this.gaId=e;this.gaId&&typeof window<"u"&&this.initializeGA(this.gaId);}initializeGA(e){if(document.querySelector(`script[src*="googletagmanager.com/gtag/js?id=${e}"]`))return;let t=document.createElement("script");if(t.async=true,t.src=`https://www.googletagmanager.com/gtag/js?id=${e}`,document.head.appendChild(t),typeof window.gtag!="function"){let n=document.createElement("script");n.innerHTML=`
19
- window.dataLayer = window.dataLayer || [];
20
- function gtag(){dataLayer.push(arguments);}
21
- gtag('js', new Date());
22
- gtag('config', '${e}');
23
- `,document.head.appendChild(n);}}handle(e){typeof window.gtag=="function"?window.gtag("event",e.action,{event_category:e.category,event_label:e.label,value:e.value,...e.customParams}):this.gaId&&console.warn("[GAMiddleware] gtag not available, event queued:",e);}},O=class{constructor(e=false){this.enabled=e;}handle(e){this.enabled&&console.log("[TapSDK Event]",e);}},P=class{constructor(){o(this,"middlewares",[]);}addMiddleware(e){this.middlewares.push(e);}removeMiddleware(e){let t=this.middlewares.indexOf(e);t>-1&&this.middlewares.splice(t,1);}log(e){this.middlewares.forEach(t=>{try{t.handle(e);}catch(n){console.warn("[EventLogger] Middleware error:",n);}});}logChatAction(e,t){this.log({action:`chat_${e}`,category:"engagement",customParams:{timestamp:Date.now(),...t}});}logButtonClick(e,t,n){let r={action:`${e}_button_clicked`,category:"user_interaction",customParams:{timestamp:Date.now(),...n}};t!==void 0&&(r.label=t),this.log(r);}logSDKInitialization(e,t,n){let r=Date.now()-t,s={action:"sdk_initialization",category:"system",label:e?"success":"failure",value:r,customParams:{timestamp:Date.now(),...n&&{error:n}}};this.log(s);}};var _e="_1mnmljf6",Ie="_1mnmljf7",Ce="_1mnmljf8";var Te="_1mnmljf9";var $e="_1mnmljfa";var S=15;function We({htmlString:i,callback:e,containerRect:t}){let n=document.createElement("div");n.className=Te;let r=document.createElement("div");if(r.className=$e,t){let c=t.left-S;r.style.top=`${t.top}px`,r.style.left="unset",r.style.bottom="unset",c<S?(r.style.left=`${t.right+S}px`,r.style.right="unset"):r.style.right=`${window.innerWidth-c}px`;}else r.style.top="50px",r.style.right=`${S+340+24}px`,r.style.left="unset",r.style.bottom="unset";r.style.maxHeight="calc(100vh - 116px)";let s=document.createElement("div");s.innerHTML=i,n.addEventListener("click",()=>{document.body.removeChild(n),document.body.removeChild(r),e();}),r.addEventListener("click",c=>{c.stopPropagation();}),r.appendChild(s),document.body.appendChild(n),document.body.appendChild(r);let u=document.querySelector(`.${_e}`),a=document.querySelector(".cw-plugin-code-block"),l=document.querySelector(`.${Ce}`),p=document.querySelector(`.${Ie}`);u&&a&&l&&p&&u.addEventListener("click",()=>{navigator.clipboard.writeText(a.textContent??""),l.style.display="none",p.textContent="\uBCF5\uC0AC\uB428",setTimeout(()=>{p.textContent="\uBCF5\uC0AC",l.style.display="inline";},1e3);});}var Ae=We;var K=class{constructor({apiKey:e}){o(this,"apiKey");o(this,"iframeBridge");o(this,"events");o(this,"eventLogger");o(this,"container");o(this,"button");o(this,"alarm");o(this,"containerVisible");o(this,"isPdfOpen");o(this,"_isInitialized",false);this.apiKey=e,this.eventLogger=new P,this.setupEventLogger(),this.iframeBridge=new A({hostOrigin:window.location.origin,apiKey:this.apiKey,eventLogger:this.eventLogger}),this.events=new j(this.iframeBridge),this.button=new ee,this.alarm=new me,this.container=new N,this.containerVisible="closed",this.isPdfOpen=false;}get isOpen(){return this.containerVisible==="open"}get isInitialized(){return this._isInitialized}async init({buttonId:e,course:t,container:n}){if(this._isInitialized){this.eventLogger.log({action:"sdk_already_initialized",category:"warning",customParams:{timestamp:Date.now()}});return}let r=Date.now();try{await this.validateEnvironment(),await this.setupContainer(n),await Promise.all([this.setupButton(e),this.iframeBridge.ensureIframe(this.container.element)]),this.setupEventListeners(n),await this.iframeBridge.performHandshake({course:t,...n&&{container:n}}),this._isInitialized=!0,this.eventLogger.logSDKInitialization(!0,r);}catch(s){let u=s instanceof Error?s.message:"Unknown error";throw this.eventLogger.logSDKInitialization(false,r,u),s}}destroy(){if(!this._isInitialized){this.eventLogger.log({action:"sdk_destroy_not_initialized",category:"warning",customParams:{timestamp:Date.now()}});return}N.resetInstance(),this.alarm.remove(),this.iframeBridge.removeIframe(),this.containerVisible="closed",this._isInitialized=false;}setupEventLogger(){if(typeof window>"u"||typeof localStorage>"u")return;localStorage.getItem("tap-environment")==="local"?this.eventLogger.addMiddleware(new O(true)):this.eventLogger.addMiddleware(new D);}toggleChatOpen(){let e=this.containerVisible==="open"?"chat:close":"chat:open";try{this.iframeBridge.postToTap({type:e})||this.eventLogger.log({action:"chat_message_send_failed",category:"error",label:e,customParams:{timestamp:Date.now()}});}catch(t){this.eventLogger.log({action:"chat_message_send_error",category:"error",customParams:{messageType:e,error:t instanceof Error?t.message:"Unknown error",timestamp:Date.now()}});}}async validateEnvironment(){if(typeof window>"u"||typeof document>"u")throw new Error("Not running in client environment: window is not defined")}async setupContainer(e){if(this.container.element)this.updateContainerStyles(e);else if(!this.container.createContainer({...e&&{customContainer:e}}))throw new Error("Failed to create container")}updateContainerStyles(e){e&&this.container.updateStyles(e);}async setupButton(e){let t=this.button.create(e);this.button.onClick(async()=>{await this.iframeBridge.ensureIframe(this.container.element);let n=this.containerVisible==="open"?"open":"closed";this.eventLogger.logButtonClick("toggle",n),this.toggleChatOpen();}),this.alarm.render({rootElement:t}),this.alarm.onAlarmClick(n=>{this.eventLogger.logButtonClick("alarm"),this.iframeBridge.postToTap({type:"chat:open",isAlarm:true}),this.iframeBridge.postToTap({type:"alarm:click",messageInfo:n});});}setupEventListeners(e){this.iframeBridge.listenToTap("chat:opened",()=>{this.containerVisible="open",this.container.toggleVisibility(this.containerVisible==="open"),this.alarm.remove(),this.eventLogger.logChatAction("opened");}),this.iframeBridge.listenToTap("chat:closed",()=>{this.containerVisible="closed",this.container.toggleVisibility(false),this.eventLogger.logChatAction("closed");}),this.iframeBridge.listenToTap("alarm:fadeIn",t=>{this.containerVisible!=="open"&&this.alarm.fadeIn(t.messageInfo);}),this.iframeBridge.listenToTap("popUp:open",t=>{let n=this.container.getBoundingClientRect();Ae({htmlString:t.popUpInfo.html,callback:()=>this.iframeBridge.postToTap({type:"popUp:close"}),containerRect:n});}),this.iframeBridge.listenToTap("pdf:open",()=>{this.isPdfOpen=true,this.container.resizeContainer(this.isPdfOpen,e),this.iframeBridge.postToTap({type:"pdf:enlarged"});}),this.iframeBridge.listenToTap("pdf:close",()=>{this.isPdfOpen=false,this.container.resizeContainer(this.isPdfOpen,e),this.iframeBridge.postToTap({type:"pdf:shrinked"});});}updateStyles(e){if(!this._isInitialized){console.warn("SDK not initialized. Call init() first.");return}this.updateContainerStyles(e);}setContainerSize(e,t){if(!this._isInitialized){console.warn("SDK not initialized. Call init() first.");return}this.container.setDynamicSize(e,t);}animateContainerResize(e,t,n){if(!this._isInitialized){console.warn("SDK not initialized. Call init() first.");return}this.container.animateResize(e,t,n);}setResponsiveMode(e){if(!this._isInitialized){console.warn("SDK not initialized. Call init() first.");return}this.container.setResponsiveMode(e);}async initChat(e){return this.init(e)}postChatInfo({clipId:e,clipPlayHead:t}){this.events.seekTimeline({clipId:e,clipPlayHead:t});}getTimelineInfo({callback:e}){this.events.onTimelineSeek(e);}},Kt=K;return Kt;})();//# sourceMappingURL=index.global.js.map
1
+ var TapSDK=(function(exports){'use strict';var p=Object.defineProperty;var l=(i,e,n)=>e in i?p(i,e,{enumerable:true,configurable:true,writable:true,value:n}):i[e]=n;var t=(i,e,n)=>l(i,typeof e!="symbol"?e+"":e,n);var s="https://files.edutap.ai/tap-sdk/loader.js";function c(){if(window.__TAP_SDK_LOADER_LOADED__&&window.TapSDK)return Promise.resolve();if(window.__TAP_SDK_LOADER_LOADING__)return window.__TAP_SDK_LOADER_LOADING__;let i=new Promise((e,n)=>{if(typeof document>"u"){n(new Error("TapSDK requires browser environment (document is undefined)"));return}let o=document.createElement("script");o.src=s,o.async=true,o.onload=()=>{let a=()=>{window.TapSDK?(window.__TAP_SDK_LOADER_LOADED__=true,window.__TAP_SDK_LOADER_LOADING__=void 0,e()):setTimeout(a,50);};a();},o.onerror=()=>{window.__TAP_SDK_LOADER_LOADING__=void 0,n(new Error(`Failed to load TapSDK CDN loader: ${s}`));};let d=document.querySelector(`script[src="${s}"]`);d?(d.addEventListener("load",()=>{let a=()=>{window.TapSDK?e():setTimeout(a,50);};a();}),d.addEventListener("error",()=>n(new Error(`Failed to load TapSDK CDN loader: ${s}`)))):document.head.appendChild(o);});return window.__TAP_SDK_LOADER_LOADING__=i,i}var r=class{constructor(e){t(this,"config");t(this,"sdkInstance");t(this,"loadPromise");this.config=e,this.loadPromise=this.loadAndInitialize();}async loadAndInitialize(){if(await c(),!window.TapSDK)throw new Error("TapSDK not available after loading CDN loader");this.sdkInstance=new window.TapSDK(this.config);}async ensureLoaded(){if(await this.loadPromise,!this.sdkInstance)throw new Error("TapSDK instance not initialized");return this.sdkInstance}get events(){return {seekTimeline:e=>{this.ensureLoaded().then(n=>n.events.seekTimeline(e));},onTimelineSeek:e=>{this.ensureLoaded().then(n=>n.events.onTimelineSeek(e));},onChatInitiated:e=>{this.ensureLoaded().then(n=>n.events.onChatInitiated(e));},onChatOpened:e=>{this.ensureLoaded().then(n=>n.events.onChatOpened(e));},onChatClosed:e=>{this.ensureLoaded().then(n=>n.events.onChatClosed(e));},onAlarmFadeIn:e=>{this.ensureLoaded().then(n=>n.events.onAlarmFadeIn(e));},onPopUpOpen:e=>{this.ensureLoaded().then(n=>n.events.onPopUpOpen(e));},onPdfOpen:e=>{this.ensureLoaded().then(n=>n.events.onPdfOpen(e));},onPdfClose:e=>{this.ensureLoaded().then(n=>n.events.onPdfClose(e));}}}get isOpen(){return this.sdkInstance?.isOpen??false}get isInitialized(){return this.sdkInstance?.isInitialized??false}async init(e){return (await this.ensureLoaded()).init(e)}destroy(){this.sdkInstance&&this.sdkInstance.destroy();}async initChat(e){return (await this.ensureLoaded()).initChat(e)}async postChatInfo(e){return (await this.ensureLoaded()).postChatInfo(e)}async getTimelineInfo(e){return (await this.ensureLoaded()).getTimelineInfo(e)}},D=r;
2
+ exports.TapSDK=r;exports.default=D;Object.defineProperty(exports,'__esModule',{value:true});return exports;})({});//# sourceMappingURL=index.global.js.map
24
3
  //# sourceMappingURL=index.global.js.map