clinic-connect-widget 1.0.7 → 1.0.8

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.
@@ -104,7 +104,7 @@ const CONFIG = {
104
104
  // LiveKit Server URL
105
105
  LIVEKIT_URL: "wss://livekit.longvan.vn"
106
106
  };
107
- const styles = ':host{--td-primary: #0e65f1;--td-primary-hover: #0b50c0;--td-bg-light: #ffffff;--td-bg-dark: #1a202c;--td-text-main: #0d131c;--td-text-sub: #49699c;--td-border: #e7ecf4;--td-success: #22c55e;--td-danger: #ef4444;--font-family: "Inter", system-ui, -apple-system, sans-serif;--z-index: 9999;font-family:var(--font-family);color:var(--td-text-main)}*{box-sizing:border-box;margin:0;padding:0}.hidden{display:none!important}.material-symbols-outlined{font-family:Material Symbols Outlined;font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr}.td-widget-fab{position:fixed;bottom:24px;right:24px;display:flex;align-items:center;gap:12px;z-index:var(--z-index);cursor:pointer;font-family:var(--font-family)}.td-fab-card{background:var(--td-bg-light);border:1px solid var(--td-border);border-radius:12px;box-shadow:0 8px 30px #0000001f;display:flex;align-items:center;padding:6px 16px 6px 6px;transition:transform .2s ease,box-shadow .2s ease;max-width:320px;position:relative;overflow:hidden}.td-fab-card:hover{transform:translateY(-4px);box-shadow:0 20px 40px #00000026}.td-avatar-container{width:64px;height:64px;border-radius:8px;overflow:hidden;position:relative;flex-shrink:0}.td-avatar{width:100%;height:100%;background-size:cover;background-position:center}.td-status-dot{position:absolute;bottom:4px;right:4px;width:14px;height:14px;background:var(--td-success);border:2px solid #fff;border-radius:50%}.td-info{margin-left:12px;display:flex;flex-direction:column}.td-brand{display:flex;align-items:center;gap:4px;font-size:10px;font-weight:700;text-transform:uppercase;color:var(--td-primary);letter-spacing:.05em}.td-cta{font-size:15px;font-weight:700;color:var(--td-text-main);margin-top:2px}.td-sub{font-size:12px;color:var(--td-text-sub);margin-top:2px}.td-close-fab{position:absolute;top:4px;right:4px;opacity:0;cursor:pointer;background:none;border:none;color:#94a3b8;transition:opacity .2s;padding:4px}.td-fab-card:hover .td-close-fab{opacity:1}.td-widget-expanded{position:fixed;bottom:100px;right:24px;width:380px;max-height:80vh;background:var(--td-bg-light);border-radius:12px;box-shadow:0 25px 50px -12px #00000040;border:1px solid var(--td-border);display:flex;flex-direction:column;overflow:hidden;z-index:var(--z-index);animation:slideUp .3s cubic-bezier(.16,1,.3,1)}@keyframes slideUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.td-header{display:flex;align-items:center;justify-content:space-between;padding:16px;border-bottom:1px solid var(--td-border)}.td-header-title{display:flex;align-items:center;gap:12px;font-weight:700;font-size:18px}.td-icon-box{width:32px;height:32px;background:#0e65f11a;color:var(--td-primary);border-radius:8px;display:flex;align-items:center;justify-content:center}.td-close-btn{background:transparent;border:none;cursor:pointer;color:#64748b;padding:4px;border-radius:50%;display:flex;align-items:center;justify-content:center}.td-close-btn:hover{background:#f1f5f9}.td-content{flex:1;overflow-y:auto;padding:0}.td-doctor-profile{display:flex;flex-direction:column;align-items:center;padding:32px 24px 24px}.td-online-badge{display:inline-flex;align-items:center;gap:6px;padding:4px 12px;background:#f0fdf4;border:1px solid #dcfce7;border-radius:999px}.td-pulse{width:8px;height:8px;background:var(--td-success);border-radius:50%}.td-badge-text{font-size:12px;font-weight:600;color:#15803d;text-transform:uppercase}.td-online-badge.td-offline{background:#f3f4f6;border-color:#e5e7eb}.td-online-badge.td-offline .td-badge-text{color:#6b7280}.td-online-badge.td-offline .td-pulse{background:#9ca3af;animation:none}.td-trust-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px;padding:0 24px 24px}.td-trust-item{background:#f8f9fc;border:1px solid var(--td-border);border-radius:12px;padding:12px;text-align:center;display:flex;flex-direction:column;align-items:center;gap:8px}.td-trust-title{font-size:12px;font-weight:700}.td-actions{padding:0 24px 24px;display:flex;flex-direction:column;gap:12px}.td-btn{width:100%;height:48px;border-radius:8px;font-size:16px;font-weight:700;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s;border:none}.td-btn-primary{background:var(--td-primary);color:#fff;box-shadow:0 10px 15px -3px #0e65f133}.td-btn-primary:hover{background:var(--td-primary-hover)}.td-btn-outline{background:transparent;border:1px solid var(--td-border);color:var(--td-text-main);font-size:14px}.td-btn-outline:hover{background:#f8f9fc}.td-footer{padding:12px;text-align:center;background:#f8f9fc;border-top:1px solid var(--td-border);font-size:12px;color:var(--td-text-sub)}.td-consultation-modal{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:90vw;height:90vh;max-width:1200px;max-height:800px;background:var(--td-bg-light);border-radius:16px;box-shadow:0 25px 50px -12px #00000080;border:1px solid var(--td-border);display:flex;overflow:hidden;z-index:var(--z-index);animation:fadeIn .3s ease-out}@keyframes fadeIn{0%{opacity:0;transform:translate(-50%,-48%)}to{opacity:1;transform:translate(-50%,-50%)}}.td-video-panel{flex:1;background:#000;position:relative;display:flex;align-items:center;justify-content:center;overflow:hidden}.td-main-video{width:100%;height:100%;background-size:cover;background-position:center}.td-overlay{position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(to bottom,rgba(0,0,0,.3),transparent,rgba(0,0,0,.6))}.td-video-header{position:absolute;top:16px;left:16px;right:16px;display:flex;justify-content:space-between;z-index:10}.td-badge-glass{background:#0006;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);padding:6px 12px;border-radius:20px;display:flex;align-items:center;gap:8px;color:#fff;font-size:12px;font-weight:500}.td-pip{position:absolute;top:24px;right:24px;width:160px;aspect-ratio:16/9;background:#333;border-radius:8px;border:2px solid rgba(255,255,255,.2);overflow:hidden;z-index:20;background-size:cover;background-position:center;box-shadow:0 4px 6px #0000004d}.td-pip-label{position:absolute;bottom:4px;left:4px;background:#0009;color:#fff;font-size:10px;padding:2px 6px;border-radius:4px}.td-controls{position:absolute;bottom:32px;left:50%;transform:translate(-50%);display:flex;align-items:center;gap:16px;z-index:20}.td-ctrl-btn{width:48px;height:48px;border-radius:50%;background:#fff3;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);border:none;color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s}.td-ctrl-btn:hover{background:#fff;color:var(--td-primary)}.td-ctrl-end{height:48px;padding:0 24px;border-radius:24px;background:var(--td-danger);color:#fff;display:flex;align-items:center;gap:8px;font-weight:600;border:none;cursor:pointer}.td-ctrl-end:hover{background:#dc2626}@media (max-width: 768px){.td-consultation-modal{width:100vw;height:100vh;border-radius:0;flex-direction:column}.td-video-panel{height:40vh}.td-chat-panel{width:100%;flex:1}}.td-overlay-wrapper{position:fixed;top:0;right:0;bottom:0;left:0;background:#0006;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:var(--z-index);display:flex;align-items:center;justify-content:center;animation:fadeInOpacity .3s ease-out}.td-modal-centered{background:var(--td-bg-light);width:90%;max-width:480px;border-radius:16px;box-shadow:0 25px 50px -12px #00000040;border:1px solid var(--td-border);display:flex;flex-direction:column;overflow:hidden;max-height:90vh;animation:scaleIn .3s cubic-bezier(.16,1,.3,1);position:relative}@keyframes fadeInOpacity{0%{opacity:0}to{opacity:1}}@keyframes scaleIn{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.td-form-container{display:flex;flex-direction:column;height:100%;padding:0 24px}.td-form-page-header{padding:24px 0 16px}.td-form-title{font-size:24px;font-weight:700;color:var(--td-text-main);margin-bottom:8px}.td-form-desc{font-size:14px;color:var(--td-text-sub);line-height:normal}.td-form{display:flex;flex-direction:column;gap:20px;padding-bottom:24px}.td-input-group{display:flex;flex-direction:column;gap:8px}.td-label{font-size:14px;font-weight:500;color:var(--td-text-main)}.td-input{width:100%;height:48px;padding:0 16px;border-radius:8px;border:1px solid var(--td-border);background:#f8f9fc;font-family:inherit;font-size:16px;color:var(--td-text-main);transition:all .2s}.td-input:focus{outline:none;border-color:var(--td-primary);box-shadow:0 0 0 2px #0e65f133}.td-textarea{width:100%;min-height:100px;padding:16px;border-radius:8px;border:1px solid var(--td-border);background:#f8f9fc;font-family:inherit;font-size:16px;color:var(--td-text-main);resize:none}.td-textarea:focus{outline:none;border-color:var(--td-primary)}.td-chips-group{display:flex;flex-wrap:wrap;gap:8px}.td-chip{padding:8px 16px;border-radius:99px;font-size:14px;font-weight:500;cursor:pointer;border:1px solid var(--td-border);background:#fff;color:var(--td-text-sub);transition:all .2s}.td-chip:hover{border-color:var(--td-primary);color:var(--td-primary);background:#0e65f10d}.td-chip.active{border-color:var(--td-primary);background:#0e65f11a;color:var(--td-primary);display:flex;align-items:center;gap:6px}.td-secure-note{display:flex;align-items:center;justify-content:center;gap:6px;font-size:12px;color:var(--td-text-sub);opacity:.8;margin-top:8px}.td-summary-container{display:flex;flex-direction:column;height:100%}.td-success-header{display:flex;flex-direction:column;align-items:center;padding:32px 24px;text-align:center}.td-success-icon{width:80px;height:80px;background:#0e65f11a;color:var(--td-primary);border-radius:50%;display:flex;align-items:center;justify-content:center;margin-bottom:16px}.td-summary-avatar{width:56px;height:56px;border-radius:50%;background-size:cover;background-position:center;flex-shrink:0}.td-summary-title{font-size:24px;font-weight:700;margin-bottom:8px}.td-summary-desc{font-size:14px;color:var(--td-text-sub);max-width:360px;margin:0 auto}.td-summary-card{margin:0 24px;padding:16px;border-radius:12px;border:1px solid var(--td-border);background:#f8f9fc;display:flex;align-items:center;gap:16px}.td-summary-details{padding:8px 24px}.td-detail-row{display:flex;justify-content:space-between;padding:12px 0;border-bottom:1px dashed var(--td-border);font-size:14px}.td-note-box{margin:16px 24px;padding:16px;background:#0e65f10d;border:1px solid rgba(14,101,241,.1);border-radius:8px}.td-note-title{font-size:14px;font-weight:700;margin-bottom:8px;display:flex;align-items:center;gap:8px}.td-grid-actions{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:12px}';
107
+ const styles = ':host{--td-primary: #0e65f1;--td-primary-hover: #0b50c0;--td-bg-light: #ffffff;--td-bg-dark: #1a202c;--td-text-main: #0d131c;--td-text-sub: #49699c;--td-border: #e7ecf4;--td-success: #22c55e;--td-danger: #ef4444;--font-family: "Inter", system-ui, -apple-system, sans-serif;--z-index: 9999;font-family:var(--font-family);color:var(--td-text-main)}*{box-sizing:border-box;margin:0;padding:0}.hidden{display:none!important}.material-symbols-outlined{font-family:Material Symbols Outlined;font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr}.td-widget-fab{position:fixed;bottom:24px;right:24px;display:flex;align-items:center;gap:12px;z-index:var(--z-index);cursor:pointer;font-family:var(--font-family)}.td-fab-card{background:var(--td-bg-light);border:1px solid var(--td-border);border-radius:12px;box-shadow:0 8px 30px #0000001f;display:flex;align-items:center;padding:6px 16px 6px 6px;transition:transform .2s ease,box-shadow .2s ease;max-width:320px;position:relative;overflow:hidden}.td-fab-card:hover{transform:translateY(-4px);box-shadow:0 20px 40px #00000026}.td-avatar-container{width:64px;height:64px;border-radius:8px;overflow:hidden;position:relative;flex-shrink:0}.td-avatar{width:100%;height:100%;background-size:cover;background-position:center}.td-status-dot{position:absolute;bottom:4px;right:4px;width:14px;height:14px;background:var(--td-success);border:2px solid #fff;border-radius:50%}.td-info{margin-left:12px;display:flex;flex-direction:column}.td-brand{display:flex;align-items:center;gap:4px;font-size:10px;font-weight:700;text-transform:uppercase;color:var(--td-primary);letter-spacing:.05em}.td-cta{font-size:15px;font-weight:700;color:var(--td-text-main);margin-top:2px}.td-sub{font-size:12px;color:var(--td-text-sub);margin-top:2px}.td-close-fab{position:absolute;top:4px;right:4px;opacity:0;cursor:pointer;background:none;border:none;color:#94a3b8;transition:opacity .2s;padding:4px}.td-fab-card:hover .td-close-fab{opacity:1}.td-widget-expanded{position:fixed;bottom:100px;right:24px;width:380px;max-height:80vh;background:var(--td-bg-light);border-radius:12px;box-shadow:0 25px 50px -12px #00000040;border:1px solid var(--td-border);display:flex;flex-direction:column;overflow:hidden;z-index:var(--z-index);animation:slideUp .3s cubic-bezier(.16,1,.3,1)}@keyframes slideUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.td-header{display:flex;align-items:center;justify-content:space-between;padding:16px;border-bottom:1px solid var(--td-border)}.td-header-title{display:flex;align-items:center;gap:12px;font-weight:700;font-size:18px}.td-icon-box{width:32px;height:32px;background:#0e65f11a;color:var(--td-primary);border-radius:8px;display:flex;align-items:center;justify-content:center}.td-close-btn{background:transparent;border:none;cursor:pointer;color:#64748b;padding:4px;border-radius:50%;display:flex;align-items:center;justify-content:center}.td-close-btn:hover{background:#f1f5f9}.td-content{flex:1;overflow-y:auto;padding:0}.td-doctor-profile{display:flex;flex-direction:column;align-items:center;padding:32px 24px 24px}.td-online-badge{display:inline-flex;align-items:center;gap:6px;padding:4px 12px;background:#f0fdf4;border:1px solid #dcfce7;border-radius:999px}.td-pulse{width:8px;height:8px;background:var(--td-success);border-radius:50%}.td-badge-text{font-size:12px;font-weight:600;color:#15803d;text-transform:uppercase}.td-online-badge.td-offline{background:#f3f4f6;border-color:#e5e7eb}.td-online-badge.td-offline .td-badge-text{color:#6b7280}.td-online-badge.td-offline .td-pulse{background:#9ca3af;animation:none}.td-trust-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px;padding:0 24px 24px}.td-trust-item{background:#f8f9fc;border:1px solid var(--td-border);border-radius:12px;padding:12px;text-align:center;display:flex;flex-direction:column;align-items:center;gap:8px}.td-trust-title{font-size:12px;font-weight:700}.td-actions{padding:0 24px 24px;display:flex;flex-direction:column;gap:12px}.td-btn{width:100%;height:48px;border-radius:8px;font-size:16px;font-weight:700;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s;border:none}.td-btn-primary{background:var(--td-primary);color:#fff;box-shadow:0 10px 15px -3px #0e65f133}.td-btn-primary:hover{background:var(--td-primary-hover)}.td-btn-outline{background:transparent;border:1px solid var(--td-border);color:var(--td-text-main);font-size:14px}.td-btn-outline:hover{background:#f8f9fc}.td-footer{padding:12px;text-align:center;background:#f8f9fc;border-top:1px solid var(--td-border);font-size:12px;color:var(--td-text-sub)}.td-consultation-modal{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:90vw;height:90vh;max-width:1200px;max-height:800px;background:var(--td-bg-light);border-radius:16px;box-shadow:0 25px 50px -12px #00000080;border:1px solid var(--td-border);display:flex;overflow:hidden;z-index:var(--z-index);animation:fadeIn .3s ease-out}@keyframes fadeIn{0%{opacity:0;transform:translate(-50%,-48%)}to{opacity:1;transform:translate(-50%,-50%)}}.td-video-panel{flex:1;background:#000;position:relative;display:flex;align-items:center;justify-content:center;overflow:hidden}.td-main-video{width:100%;height:100%;background-size:cover;background-position:center}.td-overlay{position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(to bottom,rgba(0,0,0,.3),transparent,rgba(0,0,0,.6))}.td-video-header{position:absolute;top:16px;left:16px;right:16px;display:flex;justify-content:space-between;z-index:10}.td-badge-glass{background:#0006;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);padding:6px 12px;border-radius:20px;display:flex;align-items:center;gap:8px;color:#fff;font-size:12px;font-weight:500}.td-pip{position:absolute;top:24px;right:24px;width:160px;aspect-ratio:16/9;background:#333;border-radius:8px;border:2px solid rgba(255,255,255,.2);overflow:hidden;z-index:20;background-size:cover;background-position:center;box-shadow:0 4px 6px #0000004d}.td-pip-label{position:absolute;bottom:4px;left:4px;background:#0009;color:#fff;font-size:10px;padding:2px 6px;border-radius:4px}.td-controls{position:absolute;bottom:32px;left:50%;transform:translate(-50%);display:flex;align-items:center;gap:16px;z-index:20}.td-ctrl-btn{width:48px;height:48px;border-radius:50%;background:#fff3;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);border:none;color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s}.td-ctrl-btn:hover{background:#fff;color:var(--td-primary)}.td-ctrl-end{height:48px;padding:0 24px;border-radius:24px;background:var(--td-danger);color:#fff;display:flex;align-items:center;gap:8px;font-weight:600;border:none;cursor:pointer}.td-ctrl-end:hover{background:#dc2626}.td-call-status-badge{height:48px;padding:0 24px;border-radius:24px;background:#0009;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);color:#fff;display:flex;align-items:center;gap:12px;font-size:14px;font-weight:500;border:1px solid rgba(255,255,255,.1);white-space:nowrap}.td-status-pulse{width:8px;height:8px;background:#fbbf24;border-radius:50%;animation:pulse-ring 2s infinite}.td-status-connecting .td-status-pulse{background:#3b82f6}.td-status-left .td-status-pulse{background:#9ca3af;animation:none}@keyframes pulse-ring{0%{box-shadow:0 0 #fbbf24b3}70%{box-shadow:0 0 0 6px #fbbf2400}to{box-shadow:0 0 #fbbf2400}}@media (max-width: 768px){.td-consultation-modal{width:100vw;height:100vh;border-radius:0;flex-direction:column}.td-video-panel{height:40vh}.td-chat-panel{width:100%;flex:1}}.td-overlay-wrapper{position:fixed;top:0;right:0;bottom:0;left:0;background:#0006;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:var(--z-index);display:flex;align-items:center;justify-content:center;animation:fadeInOpacity .3s ease-out}.td-modal-centered{background:var(--td-bg-light);width:90%;max-width:480px;border-radius:16px;box-shadow:0 25px 50px -12px #00000040;border:1px solid var(--td-border);display:flex;flex-direction:column;overflow:hidden;max-height:90vh;animation:scaleIn .3s cubic-bezier(.16,1,.3,1);position:relative}@keyframes fadeInOpacity{0%{opacity:0}to{opacity:1}}@keyframes scaleIn{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.td-form-container{display:flex;flex-direction:column;height:100%;padding:0 24px}.td-form-page-header{padding:24px 0 16px}.td-form-title{font-size:24px;font-weight:700;color:var(--td-text-main);margin-bottom:8px}.td-form-desc{font-size:14px;color:var(--td-text-sub);line-height:normal}.td-form{display:flex;flex-direction:column;gap:20px;padding-bottom:24px}.td-input-group{display:flex;flex-direction:column;gap:8px}.td-label{font-size:14px;font-weight:500;color:var(--td-text-main)}.td-input{width:100%;height:48px;padding:0 16px;border-radius:8px;border:1px solid var(--td-border);background:#f8f9fc;font-family:inherit;font-size:16px;color:var(--td-text-main);transition:all .2s}.td-input:focus{outline:none;border-color:var(--td-primary);box-shadow:0 0 0 2px #0e65f133}.td-textarea{width:100%;min-height:100px;padding:16px;border-radius:8px;border:1px solid var(--td-border);background:#f8f9fc;font-family:inherit;font-size:16px;color:var(--td-text-main);resize:none}.td-textarea:focus{outline:none;border-color:var(--td-primary)}.td-chips-group{display:flex;flex-wrap:wrap;gap:8px}.td-chip{padding:8px 16px;border-radius:99px;font-size:14px;font-weight:500;cursor:pointer;border:1px solid var(--td-border);background:#fff;color:var(--td-text-sub);transition:all .2s}.td-chip:hover{border-color:var(--td-primary);color:var(--td-primary);background:#0e65f10d}.td-chip.active{border-color:var(--td-primary);background:#0e65f11a;color:var(--td-primary);display:flex;align-items:center;gap:6px}.td-secure-note{display:flex;align-items:center;justify-content:center;gap:6px;font-size:12px;color:var(--td-text-sub);opacity:.8;margin-top:8px}.td-summary-container{display:flex;flex-direction:column;height:100%}.td-success-header{display:flex;flex-direction:column;align-items:center;padding:32px 24px;text-align:center}.td-success-icon{width:80px;height:80px;background:#0e65f11a;color:var(--td-primary);border-radius:50%;display:flex;align-items:center;justify-content:center;margin-bottom:16px}.td-summary-avatar{width:56px;height:56px;border-radius:50%;background-size:cover;background-position:center;flex-shrink:0}.td-summary-title{font-size:24px;font-weight:700;margin-bottom:8px}.td-summary-desc{font-size:14px;color:var(--td-text-sub);max-width:360px;margin:0 auto}.td-summary-card{margin:0 24px;padding:16px;border-radius:12px;border:1px solid var(--td-border);background:#f8f9fc;display:flex;align-items:center;gap:16px}.td-summary-details{padding:8px 24px}.td-detail-row{display:flex;justify-content:space-between;padding:12px 0;border-bottom:1px dashed var(--td-border);font-size:14px}.td-note-box{margin:16px 24px;padding:16px;background:#0e65f10d;border:1px solid rgba(14,101,241,.1);border-radius:8px}.td-note-title{font-size:14px;font-weight:700;margin-bottom:8px;display:flex;align-items:center;gap:8px}.td-grid-actions{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:12px}';
108
108
  const collapsedHtml = `<div class="td-widget-fab" id="td-widget-fab">\r
109
109
  <div class="td-fab-card">\r
110
110
  <button class="td-close-fab" id="td-fab-close">\r
@@ -221,6 +221,12 @@ const consultationHtml = `<div class="td-consultation-modal">\r
221
221
  <span class="material-symbols-outlined">call_end</span>\r
222
222
  Kết thúc\r
223
223
  </button>\r
224
+ \r
225
+ <!-- Dynamic Status Badge (Replaces End Button when waiting) -->\r
226
+ <div class="td-call-status-badge" id="td-call-status-badge" style="display: none;">\r
227
+ <span class="td-status-pulse"></span>\r
228
+ <span class="td-status-text">Đang chờ bác sĩ...</span>\r
229
+ </div>\r
224
230
  </div>\r
225
231
  </div>\r
226
232
  \r
@@ -447,6 +453,32 @@ const render = (template, data) => {
447
453
  output = output.replace(/{{containerStyle}}/g, containerStyle);
448
454
  output = output.replace(/{{rowStyle}}/g, rowStyle);
449
455
  output = output.replace(/{{footerStyle}}/g, footerStyle);
456
+ const callStatus = data.callStatus || "WAITING";
457
+ let consultEndBtnStyle = "display: none;";
458
+ let consultBadgeStyle = "display: flex;";
459
+ let consultBadgeText = "Đang chờ bác sĩ...";
460
+ let consultBadgeClass = "";
461
+ switch (callStatus) {
462
+ case "CONNECTED":
463
+ consultEndBtnStyle = "display: flex;";
464
+ consultBadgeStyle = "display: none;";
465
+ break;
466
+ case "CONNECTING":
467
+ consultBadgeText = "Bác sĩ chuẩn bị vào phòng...";
468
+ consultBadgeClass = "td-status-connecting";
469
+ break;
470
+ case "DOCTOR_LEFT":
471
+ consultBadgeText = "Bác sĩ đã rời phòng";
472
+ consultBadgeClass = "td-status-left";
473
+ break;
474
+ case "WAITING":
475
+ default:
476
+ consultBadgeText = "Đang chờ bác sĩ...";
477
+ break;
478
+ }
479
+ output = output.replace('id="td-call-status-badge" style="display: none;"', `id="td-call-status-badge" style="${consultBadgeStyle}" class="td-call-status-badge ${consultBadgeClass}"`);
480
+ output = output.replace(">Đang chờ bác sĩ...<", `>${consultBadgeText}<`);
481
+ output = output.replace('id="td-consult-end"', `id="td-consult-end" style="${consultEndBtnStyle}"`);
450
482
  return output;
451
483
  };
452
484
  const getCollapsedHtml = (data) => render(collapsedHtml, data);
@@ -28096,16 +28128,35 @@ class LiveKitService {
28096
28128
  });
28097
28129
  });
28098
28130
  }
28131
+ setCallbacks(callbacks) {
28132
+ this.callbacks = callbacks;
28133
+ }
28099
28134
  bindEvents() {
28100
28135
  if (!this.room) return;
28101
28136
  this.room.on(RoomEvent.SignalConnected, () => {
28102
28137
  console.log("[LiveKit] Signal connected");
28138
+ }).on(RoomEvent.ParticipantConnected, (participant) => {
28139
+ var _a;
28140
+ console.log("[LiveKit] Participant Connected:", participant.identity);
28141
+ if ((_a = this.callbacks) == null ? void 0 : _a.onParticipantConnected) {
28142
+ this.callbacks.onParticipantConnected(participant);
28143
+ }
28144
+ }).on(RoomEvent.ParticipantDisconnected, (participant) => {
28145
+ var _a;
28146
+ console.log("[LiveKit] Participant Disconnected:", participant.identity);
28147
+ if ((_a = this.callbacks) == null ? void 0 : _a.onParticipantDisconnected) {
28148
+ this.callbacks.onParticipantDisconnected(participant);
28149
+ }
28103
28150
  }).on(RoomEvent.TrackSubscribed, (track, publication, participant) => {
28104
28151
  this.handleTrackSubscribed(track, participant);
28105
28152
  }).on(RoomEvent.TrackUnsubscribed, (track, publication, participant) => {
28106
28153
  this.handleTrackUnsubscribed(track, participant);
28107
28154
  }).on(RoomEvent.Disconnected, () => {
28155
+ var _a;
28108
28156
  console.log("[LiveKit] Disconnected");
28157
+ if ((_a = this.callbacks) == null ? void 0 : _a.onDisconnected) {
28158
+ this.callbacks.onDisconnected();
28159
+ }
28109
28160
  }).on(RoomEvent.MediaDevicesError, (e2) => {
28110
28161
  console.error("[LiveKit] Media Device Error:", e2);
28111
28162
  });
@@ -28164,15 +28215,22 @@ class LiveKitService {
28164
28215
  const remoteContainer = this.wrapper.querySelector(".td-main-video");
28165
28216
  console.log("[LiveKit] Remote Container found:", remoteContainer, "Is Connected:", remoteContainer == null ? void 0 : remoteContainer.isConnected);
28166
28217
  if (remoteContainer) {
28167
- console.log("[LiveKit] Clearing container content. Current innerHTML length:", remoteContainer.innerHTML.length);
28168
- remoteContainer.innerHTML = "";
28169
- remoteContainer.style.backgroundImage = "none";
28218
+ const oldVideos = remoteContainer.querySelectorAll(".td-livekit-video");
28219
+ oldVideos.forEach((v) => v.remove());
28170
28220
  const videoEl = track.attach();
28221
+ videoEl.classList.add("td-livekit-video");
28171
28222
  videoEl.style.width = "100%";
28172
28223
  videoEl.style.height = "100%";
28173
28224
  videoEl.style.objectFit = "cover";
28225
+ videoEl.style.position = "absolute";
28226
+ videoEl.style.top = "0";
28227
+ videoEl.style.left = "0";
28228
+ videoEl.style.zIndex = "1";
28229
+ videoEl.style.opacity = "0";
28230
+ videoEl.style.transition = "opacity 0.5s ease-in-out";
28231
+ videoEl.id = "td-remote-video";
28174
28232
  remoteContainer.appendChild(videoEl);
28175
- console.log("[LiveKit] Remote video attached");
28233
+ console.log("[LiveKit] Remote video attached (hidden initially)");
28176
28234
  } else {
28177
28235
  console.warn("[LiveKit] Remote container not found!");
28178
28236
  }
@@ -28337,6 +28395,9 @@ class ClinicWidget {
28337
28395
  }
28338
28396
  }
28339
28397
  }
28398
+ if (current.status === WidgetStates.CONSULTATION && prev.callStatus !== current.callStatus) {
28399
+ this.updateConsultationUI(current);
28400
+ }
28340
28401
  }
28341
28402
  render(status, stateOverride = null) {
28342
28403
  const existingContent = this.shadowRoot.querySelector(".td-widget-content");
@@ -28749,8 +28810,84 @@ class ClinicWidget {
28749
28810
  });
28750
28811
  }
28751
28812
  }
28813
+ updateConsultationUI(state) {
28814
+ const badge = this.shadowRoot.getElementById("td-call-status-badge");
28815
+ const endBtn = this.shadowRoot.getElementById("td-consult-end");
28816
+ if (!badge || !endBtn) return;
28817
+ const callStatus = state.callStatus || "WAITING";
28818
+ let badgeText = "";
28819
+ let badgeClass = "";
28820
+ let showBadge = true;
28821
+ let showBtn = false;
28822
+ const remoteVideo = this.shadowRoot.getElementById("td-remote-video");
28823
+ const introContainer = this.shadowRoot.getElementById("td-video-container");
28824
+ switch (callStatus) {
28825
+ case "CONNECTED":
28826
+ showBtn = true;
28827
+ showBadge = false;
28828
+ if (remoteVideo) {
28829
+ remoteVideo.style.opacity = "1";
28830
+ }
28831
+ if (introContainer) {
28832
+ console.log("[Widget] Removing Intro Video container...");
28833
+ introContainer.style.transition = "opacity 0.5s";
28834
+ introContainer.style.opacity = "0";
28835
+ setTimeout(() => {
28836
+ introContainer.remove();
28837
+ }, 500);
28838
+ }
28839
+ break;
28840
+ case "CONNECTING":
28841
+ badgeText = "Bác sĩ chuẩn bị vào phòng...";
28842
+ badgeClass = "td-status-connecting";
28843
+ break;
28844
+ case "DOCTOR_LEFT":
28845
+ badgeText = "Bác sĩ đã rời phòng";
28846
+ badgeClass = "td-status-left";
28847
+ showBtn = true;
28848
+ break;
28849
+ case "WAITING":
28850
+ default:
28851
+ badgeText = "Đang chờ bác sĩ...";
28852
+ break;
28853
+ }
28854
+ if (showBadge) {
28855
+ badge.style.display = "flex";
28856
+ const textSpan = badge.querySelector(".td-status-text");
28857
+ if (textSpan) textSpan.textContent = badgeText;
28858
+ badge.classList.remove("td-status-connecting", "td-status-left");
28859
+ if (badgeClass) {
28860
+ badge.classList.add(badgeClass);
28861
+ }
28862
+ } else {
28863
+ badge.style.display = "none";
28864
+ }
28865
+ endBtn.style.display = showBtn ? "flex" : "none";
28866
+ }
28752
28867
  joinVideoCall() {
28753
28868
  var _a;
28869
+ console.log("[Widget] Joining Video Call...");
28870
+ store.setState({ callStatus: "WAITING" });
28871
+ if (!this.livekit) {
28872
+ this.livekit = new LiveKitService();
28873
+ }
28874
+ this.livekit.setCallbacks({
28875
+ onParticipantConnected: (participant) => {
28876
+ console.log("[Widget] Participant connected:", participant);
28877
+ if (store.getState().callStatus === "CONNECTED") return;
28878
+ store.setState({ callStatus: "CONNECTING" });
28879
+ setTimeout(() => {
28880
+ store.setState({ callStatus: "CONNECTED" });
28881
+ }, 3e3);
28882
+ },
28883
+ onParticipantDisconnected: (participant) => {
28884
+ console.log("[Widget] Participant disconnected:", participant);
28885
+ store.setState({ callStatus: "DOCTOR_LEFT" });
28886
+ },
28887
+ onDisconnected: () => {
28888
+ store.setState({ status: WidgetStates.COMPLETED });
28889
+ }
28890
+ });
28754
28891
  const state = store.getState();
28755
28892
  const { user, doctor } = state;
28756
28893
  const userId = "guest_6rakxwiai";