Plugin Directory

Changeset 3481851


Ignore:
Timestamp:
03/13/2026 10:07:58 AM (3 weeks ago)
Author:
appwavedev
Message:

Release version 1.0.25 - Fix duplicate widget buttons on mobile

Location:
bettercx-widget
Files:
12 added
7 edited
22 copied

Legend:

Unmodified
Added
Removed
  • bettercx-widget/tags/1.0.25/assets/bettercx-widget.esm.js

    r3479213 r3481851  
    1 import{p as e,g as a,b as t}from"./p-BnsX22WT.js";export{s as setNonce}from"./p-BnsX22WT.js";(()=>{const a=import.meta.url,s={};return""!==a&&(s.resourcesUrl=new URL(".",a).href),e(s)})().then((async e=>(await a(),t([["p-71e36b4a",[[257,"bcx-chat-list",{apiService:[16,"api-service"],language:[1],theme:[1],chats:[32],selectedChatId:[32],messages:[32],isLoading:[32],isLoadingMore:[32],hasMore:[32],currentPage:[32],error:[32]},null,{language:["onLanguageChange"]}],[257,"bcx-message-composer",{disabled:[4],loading:[4],placeholder:[1],maxLength:[2,"max-length"],theme:[1],isAttachmentsDisabled:[4,"is-attachments-disabled"],message:[32],images:[32]}],[257,"bcx-product-slider",{products:[16],language:[1],showAfterStreaming:[4,"show-after-streaming"],currentIndex:[32],isVisible:[32]},null,{products:["onProductsChange"],showAfterStreaming:["onShowAfterStreamingChange"]}]]],["p-0900f9d9",[[257,"bettercx-widget",{publicKey:[1,"public-key"],theme:[1],debug:[4],baseUrl:[1,"base-url"],aiServiceUrl:[1,"ai-service-url"],autoInit:[4,"auto-init"],position:[1],language:[1],embedded:[4],embeddedSize:[1,"embedded-size"],embeddedPlacement:[1,"embedded-placement"],isAttachmentsDisabled:[4,"is-attachments-disabled"],state:[32],timeUpdateTrigger:[32],isDropdownOpen:[32],isFullscreen:[32],showChatList:[32],hasUserSentMessage:[32],showDelayMessage:[32],delayMessageType:[32],open:[64],close:[64],toggle:[64],sendMessage:[64]},null,{publicKey:["onPublicKeyChange"],theme:["onThemeChange"],language:["onLanguageChange"],"state.messages":["onMessagesChange"],embedded:["onEmbeddedChange"],embeddedSize:["onEmbeddedSizeChange"],embeddedPlacement:["onEmbeddedPlacementChange"]}]]]],e))));
     1import{p as e,g as a,b as t}from"./p-BnsX22WT.js";export{s as setNonce}from"./p-BnsX22WT.js";(()=>{const a=import.meta.url,s={};return""!==a&&(s.resourcesUrl=new URL(".",a).href),e(s)})().then((async e=>(await a(),t([["p-71e36b4a",[[257,"bcx-chat-list",{apiService:[16,"api-service"],language:[1],theme:[1],chats:[32],selectedChatId:[32],messages:[32],isLoading:[32],isLoadingMore:[32],hasMore:[32],currentPage:[32],error:[32]},null,{language:["onLanguageChange"]}],[257,"bcx-message-composer",{disabled:[4],loading:[4],placeholder:[1],maxLength:[2,"max-length"],theme:[1],isAttachmentsDisabled:[4,"is-attachments-disabled"],message:[32],images:[32]}],[257,"bcx-product-slider",{products:[16],language:[1],showAfterStreaming:[4,"show-after-streaming"],currentIndex:[32],isVisible:[32]},null,{products:["onProductsChange"],showAfterStreaming:["onShowAfterStreamingChange"]}]]],["p-fa269bc6",[[257,"bettercx-widget",{publicKey:[1,"public-key"],theme:[1],debug:[4],baseUrl:[1,"base-url"],aiServiceUrl:[1,"ai-service-url"],autoInit:[4,"auto-init"],position:[1],language:[1],embedded:[4],embeddedSize:[1,"embedded-size"],embeddedPlacement:[1,"embedded-placement"],isAttachmentsDisabled:[4,"is-attachments-disabled"],state:[32],timeUpdateTrigger:[32],isDropdownOpen:[32],isFullscreen:[32],showChatList:[32],hasUserSentMessage:[32],showDelayMessage:[32],delayMessageType:[32],open:[64],close:[64],toggle:[64],sendMessage:[64]},null,{publicKey:["onPublicKeyChange"],theme:["onThemeChange"],language:["onLanguageChange"],"state.messages":["onMessagesChange"],embedded:["onEmbeddedChange"],embeddedSize:["onEmbeddedSizeChange"],embeddedPlacement:["onEmbeddedPlacementChange"]}]]]],e))));
  • bettercx-widget/tags/1.0.25/assets/index.esm.js

    r3479213 r3481851  
    1 export{a as ApiService,A as AuthService,B as BetterCXWidget,T as ThemeService}from"./p-agAx4my6.js";import"./p-BnsX22WT.js";import"./p-BU1bGO0l.js";function e(e,r,t){return(e||"")+(r?` ${r}`:"")+(t?` ${t}`:"")}export{e as format}
     1export{a as ApiService,A as AuthService,B as BetterCXWidget,T as ThemeService}from"./p-CUsPTxey.js";import"./p-BnsX22WT.js";import"./p-BU1bGO0l.js";function e(e,r,t){return(e||"")+(r?` ${r}`:"")+(t?` ${t}`:"")}export{e as format}
  • bettercx-widget/tags/1.0.25/assets/p-V8up-zPo.system.js

    r3479213 r3481851  
    1 var __awaiter=this&&this.__awaiter||function(e,t,n,a){function i(e){return e instanceof n?e:new n((function(t){t(e)}))}return new(n||(n=Promise))((function(n,r){function s(e){try{c(a.next(e))}catch(e){r(e)}}function o(e){try{c(a["throw"](e))}catch(e){r(e)}}function c(e){e.done?n(e.value):i(e.value).then(s,o)}c((a=a.apply(e,t||[])).next())}))};var __generator=this&&this.__generator||function(e,t){var n={label:0,sent:function(){if(r[0]&1)throw r[1];return r[1]},trys:[],ops:[]},a,i,r,s;return s={next:o(0),throw:o(1),return:o(2)},typeof Symbol==="function"&&(s[Symbol.iterator]=function(){return this}),s;function o(e){return function(t){return c([e,t])}}function c(o){if(a)throw new TypeError("Generator is already executing.");while(s&&(s=0,o[0]&&(n=0)),n)try{if(a=1,i&&(r=o[0]&2?i["return"]:o[0]?i["throw"]||((r=i["return"])&&r.call(i),0):i.next)&&!(r=r.call(i,o[1])).done)return r;if(i=0,r)o=[o[0]&2,r.value];switch(o[0]){case 0:case 1:r=o;break;case 4:n.label++;return{value:o[1],done:false};case 5:n.label++;i=o[1];o=[0];continue;case 7:o=n.ops.pop();n.trys.pop();continue;default:if(!(r=n.trys,r=r.length>0&&r[r.length-1])&&(o[0]===6||o[0]===2)){n=0;continue}if(o[0]===3&&(!r||o[1]>r[0]&&o[1]<r[3])){n.label=o[1];break}if(o[0]===6&&n.label<r[1]){n.label=r[1];r=o;break}if(r&&n.label<r[2]){n.label=r[2];n.ops.push(o);break}if(r[2])n.ops.pop();n.trys.pop();continue}o=t.call(e,n)}catch(e){o=[6,e];i=0}finally{a=r=0}if(o[0]&5)throw o[1];return{value:o[0]?o[1]:void 0,done:true}}};System.register(["./p-Cbgoi924.system.js"],(function(e,t){"use strict";var n,a,i;return{setters:[function(t){n=t.p;a=t.g;i=t.b;e("setNonce",t.s)}],execute:function(){var e=this;var r=function(){var e=t.meta.url;var a={};if(e!==""){a.resourcesUrl=new URL(".",e).href}return n(a)};r().then((function(t){return __awaiter(e,void 0,void 0,(function(){return __generator(this,(function(e){switch(e.label){case 0:return[4,a()];case 1:e.sent();return[2,i([["p-6cbd07ab.system",[[257,"bcx-chat-list",{apiService:[16,"api-service"],language:[1],theme:[1],chats:[32],selectedChatId:[32],messages:[32],isLoading:[32],isLoadingMore:[32],hasMore:[32],currentPage:[32],error:[32]},null,{language:["onLanguageChange"]}],[257,"bcx-message-composer",{disabled:[4],loading:[4],placeholder:[1],maxLength:[2,"max-length"],theme:[1],isAttachmentsDisabled:[4,"is-attachments-disabled"],message:[32],images:[32]}],[257,"bcx-product-slider",{products:[16],language:[1],showAfterStreaming:[4,"show-after-streaming"],currentIndex:[32],isVisible:[32]},null,{products:["onProductsChange"],showAfterStreaming:["onShowAfterStreamingChange"]}]]],["p-ee803924.system",[[257,"bettercx-widget",{publicKey:[1,"public-key"],theme:[1],debug:[4],baseUrl:[1,"base-url"],aiServiceUrl:[1,"ai-service-url"],autoInit:[4,"auto-init"],position:[1],language:[1],embedded:[4],embeddedSize:[1,"embedded-size"],embeddedPlacement:[1,"embedded-placement"],isAttachmentsDisabled:[4,"is-attachments-disabled"],state:[32],timeUpdateTrigger:[32],isDropdownOpen:[32],isFullscreen:[32],showChatList:[32],hasUserSentMessage:[32],showDelayMessage:[32],delayMessageType:[32],open:[64],close:[64],toggle:[64],sendMessage:[64]},null,{publicKey:["onPublicKeyChange"],theme:["onThemeChange"],language:["onLanguageChange"],"state.messages":["onMessagesChange"],embedded:["onEmbeddedChange"],embeddedSize:["onEmbeddedSizeChange"],embeddedPlacement:["onEmbeddedPlacementChange"]}]]]],t)]}}))}))}))}}}));
     1var __awaiter=this&&this.__awaiter||function(e,t,n,a){function i(e){return e instanceof n?e:new n((function(t){t(e)}))}return new(n||(n=Promise))((function(n,r){function s(e){try{c(a.next(e))}catch(e){r(e)}}function o(e){try{c(a["throw"](e))}catch(e){r(e)}}function c(e){e.done?n(e.value):i(e.value).then(s,o)}c((a=a.apply(e,t||[])).next())}))};var __generator=this&&this.__generator||function(e,t){var n={label:0,sent:function(){if(r[0]&1)throw r[1];return r[1]},trys:[],ops:[]},a,i,r,s;return s={next:o(0),throw:o(1),return:o(2)},typeof Symbol==="function"&&(s[Symbol.iterator]=function(){return this}),s;function o(e){return function(t){return c([e,t])}}function c(o){if(a)throw new TypeError("Generator is already executing.");while(s&&(s=0,o[0]&&(n=0)),n)try{if(a=1,i&&(r=o[0]&2?i["return"]:o[0]?i["throw"]||((r=i["return"])&&r.call(i),0):i.next)&&!(r=r.call(i,o[1])).done)return r;if(i=0,r)o=[o[0]&2,r.value];switch(o[0]){case 0:case 1:r=o;break;case 4:n.label++;return{value:o[1],done:false};case 5:n.label++;i=o[1];o=[0];continue;case 7:o=n.ops.pop();n.trys.pop();continue;default:if(!(r=n.trys,r=r.length>0&&r[r.length-1])&&(o[0]===6||o[0]===2)){n=0;continue}if(o[0]===3&&(!r||o[1]>r[0]&&o[1]<r[3])){n.label=o[1];break}if(o[0]===6&&n.label<r[1]){n.label=r[1];r=o;break}if(r&&n.label<r[2]){n.label=r[2];n.ops.push(o);break}if(r[2])n.ops.pop();n.trys.pop();continue}o=t.call(e,n)}catch(e){o=[6,e];i=0}finally{a=r=0}if(o[0]&5)throw o[1];return{value:o[0]?o[1]:void 0,done:true}}};System.register(["./p-Cbgoi924.system.js"],(function(e,t){"use strict";var n,a,i;return{setters:[function(t){n=t.p;a=t.g;i=t.b;e("setNonce",t.s)}],execute:function(){var e=this;var r=function(){var e=t.meta.url;var a={};if(e!==""){a.resourcesUrl=new URL(".",e).href}return n(a)};r().then((function(t){return __awaiter(e,void 0,void 0,(function(){return __generator(this,(function(e){switch(e.label){case 0:return[4,a()];case 1:e.sent();return[2,i([["p-6cbd07ab.system",[[257,"bcx-chat-list",{apiService:[16,"api-service"],language:[1],theme:[1],chats:[32],selectedChatId:[32],messages:[32],isLoading:[32],isLoadingMore:[32],hasMore:[32],currentPage:[32],error:[32]},null,{language:["onLanguageChange"]}],[257,"bcx-message-composer",{disabled:[4],loading:[4],placeholder:[1],maxLength:[2,"max-length"],theme:[1],isAttachmentsDisabled:[4,"is-attachments-disabled"],message:[32],images:[32]}],[257,"bcx-product-slider",{products:[16],language:[1],showAfterStreaming:[4,"show-after-streaming"],currentIndex:[32],isVisible:[32]},null,{products:["onProductsChange"],showAfterStreaming:["onShowAfterStreamingChange"]}]]],["p-10dff694.system",[[257,"bettercx-widget",{publicKey:[1,"public-key"],theme:[1],debug:[4],baseUrl:[1,"base-url"],aiServiceUrl:[1,"ai-service-url"],autoInit:[4,"auto-init"],position:[1],language:[1],embedded:[4],embeddedSize:[1,"embedded-size"],embeddedPlacement:[1,"embedded-placement"],isAttachmentsDisabled:[4,"is-attachments-disabled"],state:[32],timeUpdateTrigger:[32],isDropdownOpen:[32],isFullscreen:[32],showChatList:[32],hasUserSentMessage:[32],showDelayMessage:[32],delayMessageType:[32],open:[64],close:[64],toggle:[64],sendMessage:[64]},null,{publicKey:["onPublicKeyChange"],theme:["onThemeChange"],language:["onLanguageChange"],"state.messages":["onMessagesChange"],embedded:["onEmbeddedChange"],embeddedSize:["onEmbeddedSizeChange"],embeddedPlacement:["onEmbeddedPlacementChange"]}]]]],t)]}}))}))}))}}}));
  • bettercx-widget/tags/1.0.25/bettercx-widget.php

    r3479213 r3481851  
    44 * Plugin URI: https://wordpress.org/plugins/bettercx-widget/
    55 * Description: Professional AI-powered chat widget for BetterCX platform. Seamlessly integrate intelligent customer support into any website with full WordPress compatibility. Fully functional out of the box with no trial limitations.
    6  * Version: 1.0.24
     6 * Version: 1.0.25
    77 * Author: BetterCX
    88 * Author URI: https://bettercx.ai
     
    1616 *
    1717 * @package BetterCX_Widget
    18  * @version 1.0.24
     18 * @version 1.0.25
    1919 * @author BetterCX
    2020 * @license GPLv2+
     
    3737
    3838// Define plugin constants
    39 define('BETTERCX_WIDGET_VERSION', '1.0.24');
     39define('BETTERCX_WIDGET_VERSION', '1.0.25');
    4040define('BETTERCX_WIDGET_PLUGIN_FILE', __FILE__);
    4141define('BETTERCX_WIDGET_PLUGIN_DIR', plugin_dir_path(__FILE__));
  • bettercx-widget/tags/1.0.25/readme.txt

    r3479213 r3481851  
    55Tested up to: 6.8
    66Requires PHP: 7.4
    7 Stable tag: 1.0.24
     7Stable tag: 1.0.25
    88License: GPLv2 or later
    99License URI: https://www.gnu.org/licenses/gpl-2.0.html
     
    248248== Changelog ==
    249249
     250= 1.0.25 =
     251* Fixed mobile UI bug where two floating widget buttons could appear at the same time
     252
    250253= 1.0.24 =
    251254* Added visible close (X) button next to the menu ("...") in the header on mobile devices for quick widget dismissal without opening the dropdown
     
    420423== Upgrade Notice ==
    421424
     425= 1.0.25 =
     426Fix: Resolved a mobile issue where two widget buttons could be displayed simultaneously.
     427
    422428= 1.0.24 =
    423429Update: Added visible close (X) button in header on mobile for quick widget dismissal. Improved long title handling with ellipsis. Fixed header overflow and online indicator clipping. Enhanced language detection reliability. Added Shopify integration module. Fixed all test failures.
     
    717723
    718724= Last Updated =
    719 2025-12-18
     7252026-03-13
    720726
    721727= Version =
    722 1.0.21
     7281.0.25
    723729
    724730= Minimum WordPress Version =
     
    735741
    736742= Stable Tag =
    737 1.0.21
     7431.0.25
    738744
    739745= Development Version =
    740 1.0.21
     7461.0.25
    741747
    742748= Requires at least =
  • bettercx-widget/tags/1.0.25/src/components/bettercx-widget/bettercx-widget.scss

    r3479213 r3481851  
    458458
    459459  .bcx-widget__header-body {
    460     display: flex;
     460    display: grid;
     461    grid-template-columns: max-content minmax(0, 1fr) max-content;
     462    grid-template-rows: auto;
    461463    align-items: center;
    462     justify-content: center;
     464    column-gap: var(--bcx-space-2);
    463465    width: 100%;
    464466    border-radius: var(--bcx-widget-header-border-radius);
     
    501503    gap: var(--bcx-space-3);
    502504    flex: 1;
     505    width: 100%;
     506    min-width: 0;
     507    grid-column: 1;
     508    grid-row: 1;
    503509    transition:
    504510      flex-direction 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94),
     
    507513      transform 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94);
    508514    will-change: flex-direction, align-items, gap, transform;
    509     min-width: 0; // Allows flex items to shrink below their content size
    510515    transform: translateX(0);
    511516    /* AUDYT: usunięto backface-visibility - animacja 2D (flex-direction change) */
     
    554559  h3 {
    555560    margin: 0;
    556     font-size: var(--bcx-text-2xl);
     561    font-size: var(--bcx-text-lg);
    557562    font-weight: 700;
    558563    letter-spacing: -0.025em;
     
    682687  &--initial {
    683688    .bcx-widget__header-body {
    684       justify-content: center;
     689      grid-template-columns: max-content minmax(0, 1fr) max-content;
     690      grid-template-rows: auto auto;
     691      align-items: start;
    685692    }
    686693
    687694    .bcx-widget__header-content {
    688       flex-direction: column;
    689       align-items: center;
    690       gap: 0;
    691       text-align: center;
    692       transform: translateX(0);
    693       width: 100%;
     695      display: contents;
    694696    }
    695697
    696698    .bcx-widget__header-title {
    697       justify-content: center;
    698       transform: translateX(0);
    699       width: 100%;
     699      display: contents;
    700700    }
    701701
    702702    .bcx-widget__header-avatar {
    703703      transform: translateX(0);
     704      grid-column: 1;
     705      grid-row: 1;
     706      align-self: center;
    704707    }
    705708
    706709    h3 {
    707710      transform: translateX(0);
    708       white-space: normal;
    709       text-align: center;
     711      white-space: nowrap;
     712      overflow: hidden;
     713      text-overflow: ellipsis;
     714      text-align: left;
     715      grid-column: 2;
     716      grid-row: 1;
     717      min-width: 0;
     718      max-width: 100%;
     719      align-self: center;
    710720    }
    711721
    712722    .bcx-widget__header-extra {
     723      grid-column: 1 / 4;
     724      grid-row: 2;
    713725      max-height: 200px;
    714726      opacity: 1;
     
    716728      visibility: visible;
    717729      pointer-events: auto;
    718       margin-top: var(--bcx-space-5);
     730      margin-top: var(--bcx-space-2);
     731      margin-left: var(--bcx-space-1);
    719732      text-align: center;
    720733      align-items: center;
     
    729742    .bcx-widget__close,
    730743    .bcx-widget__dropdown {
    731       position: absolute;
    732       top: var(--bcx-space-2);
    733       right: var(--bcx-space-2);
     744      position: relative;
     745      flex-shrink: 0;
    734746      transition:
    735747        opacity 0.3s ease,
    736748        transform 0.3s ease;
    737749    }
     750
     751    .bcx-widget__header-actions {
     752      grid-column: 3;
     753      grid-row: 1;
     754      justify-self: end;
     755      align-self: start;
     756      width: max-content;
     757    }
    738758  }
    739759
     
    741761  &--compact {
    742762    .bcx-widget__header-body {
    743       justify-content: space-between;
     763      grid-template-columns: max-content minmax(0, 1fr) max-content;
     764      grid-template-rows: auto;
     765      align-items: center;
    744766    }
    745767
    746768    .bcx-widget__header-content {
    747       flex-direction: row;
    748       align-items: center;
    749       justify-content: flex-start;
    750       gap: var(--bcx-space-3);
    751       transform: translateX(0);
    752       width: auto;
    753       flex: 1;
    754       min-width: 0;
     769      display: contents;
    755770    }
    756771
    757772    .bcx-widget__header-title {
    758       justify-content: flex-start;
    759       transform: translateX(0);
    760       width: auto;
     773      display: contents;
    761774    }
    762775
    763776    .bcx-widget__header-avatar {
    764777      transform: translateX(0);
     778      grid-column: 1;
     779      grid-row: 1;
     780      align-self: center;
    765781    }
    766782
     
    772788      pointer-events: none;
    773789      margin-top: 0;
     790      width: 0;
     791      min-width: 0;
     792      flex: 0 0 0;
     793      overflow: hidden;
    774794      transition:
    775795        opacity 0.12s cubic-bezier(0.4, 0, 1, 1) 0s,
     
    789809    }
    790810
     811    .bcx-widget__header-actions {
     812      grid-column: 3;
     813      grid-row: 1;
     814      justify-self: end;
     815      align-self: center;
     816      width: max-content;
     817      margin-left: var(--bcx-space-1);
     818    }
     819
    791820    h3 {
    792       font-size: var(--bcx-text-xl);
     821      font-size: var(--bcx-text-lg);
    793822      white-space: nowrap;
    794823      text-align: left;
    795824      transform: translateX(0);
     825      grid-column: 2;
     826      grid-row: 1;
     827      min-width: 0;
     828      flex: 1;
     829      overflow: hidden;
     830      text-overflow: ellipsis;
     831      max-width: 100%;
    796832    }
    797833  }
     
    808844  align-items: center;
    809845  justify-content: center;
    810   width: 40px; /* Slightly larger for better touch target */
    811   height: 40px;
     846  width: 38px;
     847  height: 38px;
    812848  position: relative;
    813849  z-index: 1;
     
    816852
    817853  svg {
    818     width: 22px;
    819     height: 22px;
     854    width: 20px;
     855    height: 20px;
    820856    stroke-width: 2;
    821857    display: block;
     
    847883  gap: var(--bcx-space-1);
    848884  flex-shrink: 0;
     885  width: max-content;
    849886}
    850887
     
    858895  align-items: center;
    859896  justify-content: center;
    860   width: 40px;
    861   height: 40px;
     897  width: 38px;
     898  height: 38px;
    862899  transition: all var(--bcx-transition-fast);
    863900  border-radius: var(--bcx-radius-md);
     
    865902
    866903  svg {
    867     width: 18px;
    868     height: 18px;
     904    width: 17px;
     905    height: 17px;
    869906    stroke-width: 2;
    870907    display: block;
     
    901938  align-items: center;
    902939  justify-content: center;
    903   width: 40px;
    904   height: 40px;
     940  width: 38px;
     941  height: 38px;
    905942  position: relative;
    906943  transition: all var(--bcx-transition-fast);
     
    909946
    910947  svg {
    911     width: 18px;
    912     height: 18px;
     948    width: 17px;
     949    height: 17px;
    913950    stroke-width: 2;
    914951    display: block;
     
    29963033  .bcx-widget__header {
    29973034    border-radius: 0 !important;
     3035
     3036    h3 {
     3037      font-size: 15px;
     3038    }
     3039
     3040    .bcx-widget__header-subdescription {
     3041      font-size: 13px;
     3042    }
     3043
     3044    .bcx-widget__header-avatar {
     3045      width: 34px;
     3046      height: 34px;
     3047    }
     3048
     3049    .bcx-widget__online-indicator {
     3050      width: 9px;
     3051      height: 9px;
     3052    }
     3053  }
     3054
     3055  .bcx-widget__header-close-mobile,
     3056  .bcx-widget__dropdown-toggle,
     3057  .bcx-widget__close {
     3058    width: 36px;
     3059    height: 36px;
     3060    padding: 7px;
     3061  }
     3062
     3063  .bcx-widget__header-close-mobile svg,
     3064  .bcx-widget__dropdown-toggle svg {
     3065    width: 16px;
     3066    height: 16px;
     3067  }
     3068
     3069  .bcx-widget__close svg {
     3070    width: 18px;
     3071    height: 18px;
    29983072  }
    29993073
  • bettercx-widget/tags/1.0.25/src/services/theme.service.ts

    r3479213 r3481851  
    122122
    123123  /**
    124    * Extract visible text content from the page using TreeWalker
    125    * Skips script/style/noscript/svg/code/pre elements and hidden elements
    126    */
    127   private getVisibleText(): string {
    128     if (!document.body) return '';
    129 
    130     const chunks: string[] = [];
    131     let totalLength = 0;
    132     const maxLength = 5000;
    133 
    134     const skipTags = new Set(['SCRIPT', 'STYLE', 'NOSCRIPT', 'SVG', 'CODE', 'PRE']);
    135 
    136     const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, {
    137       acceptNode(node: Node): number {
    138         const parent = node.parentElement;
    139         if (!parent) return NodeFilter.FILTER_REJECT;
    140         if (skipTags.has(parent.tagName)) return NodeFilter.FILTER_REJECT;
    141 
    142         // Skip hidden elements
    143         try {
    144           const style = window.getComputedStyle(parent);
    145           if (style.display === 'none' || style.visibility === 'hidden' || style.opacity === '0') {
    146             return NodeFilter.FILTER_REJECT;
    147           }
    148         } catch {
    149           // Skip if we can't compute style
    150         }
    151 
    152         return NodeFilter.FILTER_ACCEPT;
    153       },
    154     });
    155 
    156     let node: Node | null;
    157     while ((node = walker.nextNode()) && totalLength < maxLength) {
    158       const text = (node.textContent || '').trim();
    159       if (text.length > 0) {
    160         chunks.push(text);
    161         totalLength += text.length;
    162       }
    163     }
    164 
    165     const result = chunks.join(' ').substring(0, maxLength);
    166 
    167     // Fallback to textContent if TreeWalker returned nothing (e.g. jsdom)
    168     if (result.length === 0) {
    169       const fallback = (document.body.innerText || document.body.textContent || '').trim();
    170       return fallback.substring(0, maxLength);
    171     }
    172 
    173     return result;
    174   }
    175 
    176   /**
    177124   * Apply widget configuration to CSS custom properties
    178125   */
  • bettercx-widget/trunk/assets/bettercx-widget.esm.js

    r3479213 r3481851  
    1 import{p as e,g as a,b as t}from"./p-BnsX22WT.js";export{s as setNonce}from"./p-BnsX22WT.js";(()=>{const a=import.meta.url,s={};return""!==a&&(s.resourcesUrl=new URL(".",a).href),e(s)})().then((async e=>(await a(),t([["p-71e36b4a",[[257,"bcx-chat-list",{apiService:[16,"api-service"],language:[1],theme:[1],chats:[32],selectedChatId:[32],messages:[32],isLoading:[32],isLoadingMore:[32],hasMore:[32],currentPage:[32],error:[32]},null,{language:["onLanguageChange"]}],[257,"bcx-message-composer",{disabled:[4],loading:[4],placeholder:[1],maxLength:[2,"max-length"],theme:[1],isAttachmentsDisabled:[4,"is-attachments-disabled"],message:[32],images:[32]}],[257,"bcx-product-slider",{products:[16],language:[1],showAfterStreaming:[4,"show-after-streaming"],currentIndex:[32],isVisible:[32]},null,{products:["onProductsChange"],showAfterStreaming:["onShowAfterStreamingChange"]}]]],["p-0900f9d9",[[257,"bettercx-widget",{publicKey:[1,"public-key"],theme:[1],debug:[4],baseUrl:[1,"base-url"],aiServiceUrl:[1,"ai-service-url"],autoInit:[4,"auto-init"],position:[1],language:[1],embedded:[4],embeddedSize:[1,"embedded-size"],embeddedPlacement:[1,"embedded-placement"],isAttachmentsDisabled:[4,"is-attachments-disabled"],state:[32],timeUpdateTrigger:[32],isDropdownOpen:[32],isFullscreen:[32],showChatList:[32],hasUserSentMessage:[32],showDelayMessage:[32],delayMessageType:[32],open:[64],close:[64],toggle:[64],sendMessage:[64]},null,{publicKey:["onPublicKeyChange"],theme:["onThemeChange"],language:["onLanguageChange"],"state.messages":["onMessagesChange"],embedded:["onEmbeddedChange"],embeddedSize:["onEmbeddedSizeChange"],embeddedPlacement:["onEmbeddedPlacementChange"]}]]]],e))));
     1import{p as e,g as a,b as t}from"./p-BnsX22WT.js";export{s as setNonce}from"./p-BnsX22WT.js";(()=>{const a=import.meta.url,s={};return""!==a&&(s.resourcesUrl=new URL(".",a).href),e(s)})().then((async e=>(await a(),t([["p-71e36b4a",[[257,"bcx-chat-list",{apiService:[16,"api-service"],language:[1],theme:[1],chats:[32],selectedChatId:[32],messages:[32],isLoading:[32],isLoadingMore:[32],hasMore:[32],currentPage:[32],error:[32]},null,{language:["onLanguageChange"]}],[257,"bcx-message-composer",{disabled:[4],loading:[4],placeholder:[1],maxLength:[2,"max-length"],theme:[1],isAttachmentsDisabled:[4,"is-attachments-disabled"],message:[32],images:[32]}],[257,"bcx-product-slider",{products:[16],language:[1],showAfterStreaming:[4,"show-after-streaming"],currentIndex:[32],isVisible:[32]},null,{products:["onProductsChange"],showAfterStreaming:["onShowAfterStreamingChange"]}]]],["p-fa269bc6",[[257,"bettercx-widget",{publicKey:[1,"public-key"],theme:[1],debug:[4],baseUrl:[1,"base-url"],aiServiceUrl:[1,"ai-service-url"],autoInit:[4,"auto-init"],position:[1],language:[1],embedded:[4],embeddedSize:[1,"embedded-size"],embeddedPlacement:[1,"embedded-placement"],isAttachmentsDisabled:[4,"is-attachments-disabled"],state:[32],timeUpdateTrigger:[32],isDropdownOpen:[32],isFullscreen:[32],showChatList:[32],hasUserSentMessage:[32],showDelayMessage:[32],delayMessageType:[32],open:[64],close:[64],toggle:[64],sendMessage:[64]},null,{publicKey:["onPublicKeyChange"],theme:["onThemeChange"],language:["onLanguageChange"],"state.messages":["onMessagesChange"],embedded:["onEmbeddedChange"],embeddedSize:["onEmbeddedSizeChange"],embeddedPlacement:["onEmbeddedPlacementChange"]}]]]],e))));
  • bettercx-widget/trunk/assets/index.esm.js

    r3479213 r3481851  
    1 export{a as ApiService,A as AuthService,B as BetterCXWidget,T as ThemeService}from"./p-agAx4my6.js";import"./p-BnsX22WT.js";import"./p-BU1bGO0l.js";function e(e,r,t){return(e||"")+(r?` ${r}`:"")+(t?` ${t}`:"")}export{e as format}
     1export{a as ApiService,A as AuthService,B as BetterCXWidget,T as ThemeService}from"./p-CUsPTxey.js";import"./p-BnsX22WT.js";import"./p-BU1bGO0l.js";function e(e,r,t){return(e||"")+(r?` ${r}`:"")+(t?` ${t}`:"")}export{e as format}
  • bettercx-widget/trunk/assets/p-V8up-zPo.system.js

    r3479213 r3481851  
    1 var __awaiter=this&&this.__awaiter||function(e,t,n,a){function i(e){return e instanceof n?e:new n((function(t){t(e)}))}return new(n||(n=Promise))((function(n,r){function s(e){try{c(a.next(e))}catch(e){r(e)}}function o(e){try{c(a["throw"](e))}catch(e){r(e)}}function c(e){e.done?n(e.value):i(e.value).then(s,o)}c((a=a.apply(e,t||[])).next())}))};var __generator=this&&this.__generator||function(e,t){var n={label:0,sent:function(){if(r[0]&1)throw r[1];return r[1]},trys:[],ops:[]},a,i,r,s;return s={next:o(0),throw:o(1),return:o(2)},typeof Symbol==="function"&&(s[Symbol.iterator]=function(){return this}),s;function o(e){return function(t){return c([e,t])}}function c(o){if(a)throw new TypeError("Generator is already executing.");while(s&&(s=0,o[0]&&(n=0)),n)try{if(a=1,i&&(r=o[0]&2?i["return"]:o[0]?i["throw"]||((r=i["return"])&&r.call(i),0):i.next)&&!(r=r.call(i,o[1])).done)return r;if(i=0,r)o=[o[0]&2,r.value];switch(o[0]){case 0:case 1:r=o;break;case 4:n.label++;return{value:o[1],done:false};case 5:n.label++;i=o[1];o=[0];continue;case 7:o=n.ops.pop();n.trys.pop();continue;default:if(!(r=n.trys,r=r.length>0&&r[r.length-1])&&(o[0]===6||o[0]===2)){n=0;continue}if(o[0]===3&&(!r||o[1]>r[0]&&o[1]<r[3])){n.label=o[1];break}if(o[0]===6&&n.label<r[1]){n.label=r[1];r=o;break}if(r&&n.label<r[2]){n.label=r[2];n.ops.push(o);break}if(r[2])n.ops.pop();n.trys.pop();continue}o=t.call(e,n)}catch(e){o=[6,e];i=0}finally{a=r=0}if(o[0]&5)throw o[1];return{value:o[0]?o[1]:void 0,done:true}}};System.register(["./p-Cbgoi924.system.js"],(function(e,t){"use strict";var n,a,i;return{setters:[function(t){n=t.p;a=t.g;i=t.b;e("setNonce",t.s)}],execute:function(){var e=this;var r=function(){var e=t.meta.url;var a={};if(e!==""){a.resourcesUrl=new URL(".",e).href}return n(a)};r().then((function(t){return __awaiter(e,void 0,void 0,(function(){return __generator(this,(function(e){switch(e.label){case 0:return[4,a()];case 1:e.sent();return[2,i([["p-6cbd07ab.system",[[257,"bcx-chat-list",{apiService:[16,"api-service"],language:[1],theme:[1],chats:[32],selectedChatId:[32],messages:[32],isLoading:[32],isLoadingMore:[32],hasMore:[32],currentPage:[32],error:[32]},null,{language:["onLanguageChange"]}],[257,"bcx-message-composer",{disabled:[4],loading:[4],placeholder:[1],maxLength:[2,"max-length"],theme:[1],isAttachmentsDisabled:[4,"is-attachments-disabled"],message:[32],images:[32]}],[257,"bcx-product-slider",{products:[16],language:[1],showAfterStreaming:[4,"show-after-streaming"],currentIndex:[32],isVisible:[32]},null,{products:["onProductsChange"],showAfterStreaming:["onShowAfterStreamingChange"]}]]],["p-ee803924.system",[[257,"bettercx-widget",{publicKey:[1,"public-key"],theme:[1],debug:[4],baseUrl:[1,"base-url"],aiServiceUrl:[1,"ai-service-url"],autoInit:[4,"auto-init"],position:[1],language:[1],embedded:[4],embeddedSize:[1,"embedded-size"],embeddedPlacement:[1,"embedded-placement"],isAttachmentsDisabled:[4,"is-attachments-disabled"],state:[32],timeUpdateTrigger:[32],isDropdownOpen:[32],isFullscreen:[32],showChatList:[32],hasUserSentMessage:[32],showDelayMessage:[32],delayMessageType:[32],open:[64],close:[64],toggle:[64],sendMessage:[64]},null,{publicKey:["onPublicKeyChange"],theme:["onThemeChange"],language:["onLanguageChange"],"state.messages":["onMessagesChange"],embedded:["onEmbeddedChange"],embeddedSize:["onEmbeddedSizeChange"],embeddedPlacement:["onEmbeddedPlacementChange"]}]]]],t)]}}))}))}))}}}));
     1var __awaiter=this&&this.__awaiter||function(e,t,n,a){function i(e){return e instanceof n?e:new n((function(t){t(e)}))}return new(n||(n=Promise))((function(n,r){function s(e){try{c(a.next(e))}catch(e){r(e)}}function o(e){try{c(a["throw"](e))}catch(e){r(e)}}function c(e){e.done?n(e.value):i(e.value).then(s,o)}c((a=a.apply(e,t||[])).next())}))};var __generator=this&&this.__generator||function(e,t){var n={label:0,sent:function(){if(r[0]&1)throw r[1];return r[1]},trys:[],ops:[]},a,i,r,s;return s={next:o(0),throw:o(1),return:o(2)},typeof Symbol==="function"&&(s[Symbol.iterator]=function(){return this}),s;function o(e){return function(t){return c([e,t])}}function c(o){if(a)throw new TypeError("Generator is already executing.");while(s&&(s=0,o[0]&&(n=0)),n)try{if(a=1,i&&(r=o[0]&2?i["return"]:o[0]?i["throw"]||((r=i["return"])&&r.call(i),0):i.next)&&!(r=r.call(i,o[1])).done)return r;if(i=0,r)o=[o[0]&2,r.value];switch(o[0]){case 0:case 1:r=o;break;case 4:n.label++;return{value:o[1],done:false};case 5:n.label++;i=o[1];o=[0];continue;case 7:o=n.ops.pop();n.trys.pop();continue;default:if(!(r=n.trys,r=r.length>0&&r[r.length-1])&&(o[0]===6||o[0]===2)){n=0;continue}if(o[0]===3&&(!r||o[1]>r[0]&&o[1]<r[3])){n.label=o[1];break}if(o[0]===6&&n.label<r[1]){n.label=r[1];r=o;break}if(r&&n.label<r[2]){n.label=r[2];n.ops.push(o);break}if(r[2])n.ops.pop();n.trys.pop();continue}o=t.call(e,n)}catch(e){o=[6,e];i=0}finally{a=r=0}if(o[0]&5)throw o[1];return{value:o[0]?o[1]:void 0,done:true}}};System.register(["./p-Cbgoi924.system.js"],(function(e,t){"use strict";var n,a,i;return{setters:[function(t){n=t.p;a=t.g;i=t.b;e("setNonce",t.s)}],execute:function(){var e=this;var r=function(){var e=t.meta.url;var a={};if(e!==""){a.resourcesUrl=new URL(".",e).href}return n(a)};r().then((function(t){return __awaiter(e,void 0,void 0,(function(){return __generator(this,(function(e){switch(e.label){case 0:return[4,a()];case 1:e.sent();return[2,i([["p-6cbd07ab.system",[[257,"bcx-chat-list",{apiService:[16,"api-service"],language:[1],theme:[1],chats:[32],selectedChatId:[32],messages:[32],isLoading:[32],isLoadingMore:[32],hasMore:[32],currentPage:[32],error:[32]},null,{language:["onLanguageChange"]}],[257,"bcx-message-composer",{disabled:[4],loading:[4],placeholder:[1],maxLength:[2,"max-length"],theme:[1],isAttachmentsDisabled:[4,"is-attachments-disabled"],message:[32],images:[32]}],[257,"bcx-product-slider",{products:[16],language:[1],showAfterStreaming:[4,"show-after-streaming"],currentIndex:[32],isVisible:[32]},null,{products:["onProductsChange"],showAfterStreaming:["onShowAfterStreamingChange"]}]]],["p-10dff694.system",[[257,"bettercx-widget",{publicKey:[1,"public-key"],theme:[1],debug:[4],baseUrl:[1,"base-url"],aiServiceUrl:[1,"ai-service-url"],autoInit:[4,"auto-init"],position:[1],language:[1],embedded:[4],embeddedSize:[1,"embedded-size"],embeddedPlacement:[1,"embedded-placement"],isAttachmentsDisabled:[4,"is-attachments-disabled"],state:[32],timeUpdateTrigger:[32],isDropdownOpen:[32],isFullscreen:[32],showChatList:[32],hasUserSentMessage:[32],showDelayMessage:[32],delayMessageType:[32],open:[64],close:[64],toggle:[64],sendMessage:[64]},null,{publicKey:["onPublicKeyChange"],theme:["onThemeChange"],language:["onLanguageChange"],"state.messages":["onMessagesChange"],embedded:["onEmbeddedChange"],embeddedSize:["onEmbeddedSizeChange"],embeddedPlacement:["onEmbeddedPlacementChange"]}]]]],t)]}}))}))}))}}}));
  • bettercx-widget/trunk/bettercx-widget.php

    r3479213 r3481851  
    44 * Plugin URI: https://wordpress.org/plugins/bettercx-widget/
    55 * Description: Professional AI-powered chat widget for BetterCX platform. Seamlessly integrate intelligent customer support into any website with full WordPress compatibility. Fully functional out of the box with no trial limitations.
    6  * Version: 1.0.24
     6 * Version: 1.0.25
    77 * Author: BetterCX
    88 * Author URI: https://bettercx.ai
     
    1616 *
    1717 * @package BetterCX_Widget
    18  * @version 1.0.24
     18 * @version 1.0.25
    1919 * @author BetterCX
    2020 * @license GPLv2+
     
    3737
    3838// Define plugin constants
    39 define('BETTERCX_WIDGET_VERSION', '1.0.24');
     39define('BETTERCX_WIDGET_VERSION', '1.0.25');
    4040define('BETTERCX_WIDGET_PLUGIN_FILE', __FILE__);
    4141define('BETTERCX_WIDGET_PLUGIN_DIR', plugin_dir_path(__FILE__));
  • bettercx-widget/trunk/readme.txt

    r3479213 r3481851  
    55Tested up to: 6.8
    66Requires PHP: 7.4
    7 Stable tag: 1.0.24
     7Stable tag: 1.0.25
    88License: GPLv2 or later
    99License URI: https://www.gnu.org/licenses/gpl-2.0.html
     
    248248== Changelog ==
    249249
     250= 1.0.25 =
     251* Fixed mobile UI bug where two floating widget buttons could appear at the same time
     252
    250253= 1.0.24 =
    251254* Added visible close (X) button next to the menu ("...") in the header on mobile devices for quick widget dismissal without opening the dropdown
     
    420423== Upgrade Notice ==
    421424
     425= 1.0.25 =
     426Fix: Resolved a mobile issue where two widget buttons could be displayed simultaneously.
     427
    422428= 1.0.24 =
    423429Update: Added visible close (X) button in header on mobile for quick widget dismissal. Improved long title handling with ellipsis. Fixed header overflow and online indicator clipping. Enhanced language detection reliability. Added Shopify integration module. Fixed all test failures.
     
    717723
    718724= Last Updated =
    719 2025-12-18
     7252026-03-13
    720726
    721727= Version =
    722 1.0.21
     7281.0.25
    723729
    724730= Minimum WordPress Version =
     
    735741
    736742= Stable Tag =
    737 1.0.21
     7431.0.25
    738744
    739745= Development Version =
    740 1.0.21
     7461.0.25
    741747
    742748= Requires at least =
  • bettercx-widget/trunk/src/components/bettercx-widget/bettercx-widget.scss

    r3479213 r3481851  
    458458
    459459  .bcx-widget__header-body {
    460     display: flex;
     460    display: grid;
     461    grid-template-columns: max-content minmax(0, 1fr) max-content;
     462    grid-template-rows: auto;
    461463    align-items: center;
    462     justify-content: center;
     464    column-gap: var(--bcx-space-2);
    463465    width: 100%;
    464466    border-radius: var(--bcx-widget-header-border-radius);
     
    501503    gap: var(--bcx-space-3);
    502504    flex: 1;
     505    width: 100%;
     506    min-width: 0;
     507    grid-column: 1;
     508    grid-row: 1;
    503509    transition:
    504510      flex-direction 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94),
     
    507513      transform 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94);
    508514    will-change: flex-direction, align-items, gap, transform;
    509     min-width: 0; // Allows flex items to shrink below their content size
    510515    transform: translateX(0);
    511516    /* AUDYT: usunięto backface-visibility - animacja 2D (flex-direction change) */
     
    554559  h3 {
    555560    margin: 0;
    556     font-size: var(--bcx-text-2xl);
     561    font-size: var(--bcx-text-lg);
    557562    font-weight: 700;
    558563    letter-spacing: -0.025em;
     
    682687  &--initial {
    683688    .bcx-widget__header-body {
    684       justify-content: center;
     689      grid-template-columns: max-content minmax(0, 1fr) max-content;
     690      grid-template-rows: auto auto;
     691      align-items: start;
    685692    }
    686693
    687694    .bcx-widget__header-content {
    688       flex-direction: column;
    689       align-items: center;
    690       gap: 0;
    691       text-align: center;
    692       transform: translateX(0);
    693       width: 100%;
     695      display: contents;
    694696    }
    695697
    696698    .bcx-widget__header-title {
    697       justify-content: center;
    698       transform: translateX(0);
    699       width: 100%;
     699      display: contents;
    700700    }
    701701
    702702    .bcx-widget__header-avatar {
    703703      transform: translateX(0);
     704      grid-column: 1;
     705      grid-row: 1;
     706      align-self: center;
    704707    }
    705708
    706709    h3 {
    707710      transform: translateX(0);
    708       white-space: normal;
    709       text-align: center;
     711      white-space: nowrap;
     712      overflow: hidden;
     713      text-overflow: ellipsis;
     714      text-align: left;
     715      grid-column: 2;
     716      grid-row: 1;
     717      min-width: 0;
     718      max-width: 100%;
     719      align-self: center;
    710720    }
    711721
    712722    .bcx-widget__header-extra {
     723      grid-column: 1 / 4;
     724      grid-row: 2;
    713725      max-height: 200px;
    714726      opacity: 1;
     
    716728      visibility: visible;
    717729      pointer-events: auto;
    718       margin-top: var(--bcx-space-5);
     730      margin-top: var(--bcx-space-2);
     731      margin-left: var(--bcx-space-1);
    719732      text-align: center;
    720733      align-items: center;
     
    729742    .bcx-widget__close,
    730743    .bcx-widget__dropdown {
    731       position: absolute;
    732       top: var(--bcx-space-2);
    733       right: var(--bcx-space-2);
     744      position: relative;
     745      flex-shrink: 0;
    734746      transition:
    735747        opacity 0.3s ease,
    736748        transform 0.3s ease;
    737749    }
     750
     751    .bcx-widget__header-actions {
     752      grid-column: 3;
     753      grid-row: 1;
     754      justify-self: end;
     755      align-self: start;
     756      width: max-content;
     757    }
    738758  }
    739759
     
    741761  &--compact {
    742762    .bcx-widget__header-body {
    743       justify-content: space-between;
     763      grid-template-columns: max-content minmax(0, 1fr) max-content;
     764      grid-template-rows: auto;
     765      align-items: center;
    744766    }
    745767
    746768    .bcx-widget__header-content {
    747       flex-direction: row;
    748       align-items: center;
    749       justify-content: flex-start;
    750       gap: var(--bcx-space-3);
    751       transform: translateX(0);
    752       width: auto;
    753       flex: 1;
    754       min-width: 0;
     769      display: contents;
    755770    }
    756771
    757772    .bcx-widget__header-title {
    758       justify-content: flex-start;
    759       transform: translateX(0);
    760       width: auto;
     773      display: contents;
    761774    }
    762775
    763776    .bcx-widget__header-avatar {
    764777      transform: translateX(0);
     778      grid-column: 1;
     779      grid-row: 1;
     780      align-self: center;
    765781    }
    766782
     
    772788      pointer-events: none;
    773789      margin-top: 0;
     790      width: 0;
     791      min-width: 0;
     792      flex: 0 0 0;
     793      overflow: hidden;
    774794      transition:
    775795        opacity 0.12s cubic-bezier(0.4, 0, 1, 1) 0s,
     
    789809    }
    790810
     811    .bcx-widget__header-actions {
     812      grid-column: 3;
     813      grid-row: 1;
     814      justify-self: end;
     815      align-self: center;
     816      width: max-content;
     817      margin-left: var(--bcx-space-1);
     818    }
     819
    791820    h3 {
    792       font-size: var(--bcx-text-xl);
     821      font-size: var(--bcx-text-lg);
    793822      white-space: nowrap;
    794823      text-align: left;
    795824      transform: translateX(0);
     825      grid-column: 2;
     826      grid-row: 1;
     827      min-width: 0;
     828      flex: 1;
     829      overflow: hidden;
     830      text-overflow: ellipsis;
     831      max-width: 100%;
    796832    }
    797833  }
     
    808844  align-items: center;
    809845  justify-content: center;
    810   width: 40px; /* Slightly larger for better touch target */
    811   height: 40px;
     846  width: 38px;
     847  height: 38px;
    812848  position: relative;
    813849  z-index: 1;
     
    816852
    817853  svg {
    818     width: 22px;
    819     height: 22px;
     854    width: 20px;
     855    height: 20px;
    820856    stroke-width: 2;
    821857    display: block;
     
    847883  gap: var(--bcx-space-1);
    848884  flex-shrink: 0;
     885  width: max-content;
    849886}
    850887
     
    858895  align-items: center;
    859896  justify-content: center;
    860   width: 40px;
    861   height: 40px;
     897  width: 38px;
     898  height: 38px;
    862899  transition: all var(--bcx-transition-fast);
    863900  border-radius: var(--bcx-radius-md);
     
    865902
    866903  svg {
    867     width: 18px;
    868     height: 18px;
     904    width: 17px;
     905    height: 17px;
    869906    stroke-width: 2;
    870907    display: block;
     
    901938  align-items: center;
    902939  justify-content: center;
    903   width: 40px;
    904   height: 40px;
     940  width: 38px;
     941  height: 38px;
    905942  position: relative;
    906943  transition: all var(--bcx-transition-fast);
     
    909946
    910947  svg {
    911     width: 18px;
    912     height: 18px;
     948    width: 17px;
     949    height: 17px;
    913950    stroke-width: 2;
    914951    display: block;
     
    29963033  .bcx-widget__header {
    29973034    border-radius: 0 !important;
     3035
     3036    h3 {
     3037      font-size: 15px;
     3038    }
     3039
     3040    .bcx-widget__header-subdescription {
     3041      font-size: 13px;
     3042    }
     3043
     3044    .bcx-widget__header-avatar {
     3045      width: 34px;
     3046      height: 34px;
     3047    }
     3048
     3049    .bcx-widget__online-indicator {
     3050      width: 9px;
     3051      height: 9px;
     3052    }
     3053  }
     3054
     3055  .bcx-widget__header-close-mobile,
     3056  .bcx-widget__dropdown-toggle,
     3057  .bcx-widget__close {
     3058    width: 36px;
     3059    height: 36px;
     3060    padding: 7px;
     3061  }
     3062
     3063  .bcx-widget__header-close-mobile svg,
     3064  .bcx-widget__dropdown-toggle svg {
     3065    width: 16px;
     3066    height: 16px;
     3067  }
     3068
     3069  .bcx-widget__close svg {
     3070    width: 18px;
     3071    height: 18px;
    29983072  }
    29993073
  • bettercx-widget/trunk/src/services/theme.service.ts

    r3479213 r3481851  
    122122
    123123  /**
    124    * Extract visible text content from the page using TreeWalker
    125    * Skips script/style/noscript/svg/code/pre elements and hidden elements
    126    */
    127   private getVisibleText(): string {
    128     if (!document.body) return '';
    129 
    130     const chunks: string[] = [];
    131     let totalLength = 0;
    132     const maxLength = 5000;
    133 
    134     const skipTags = new Set(['SCRIPT', 'STYLE', 'NOSCRIPT', 'SVG', 'CODE', 'PRE']);
    135 
    136     const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, {
    137       acceptNode(node: Node): number {
    138         const parent = node.parentElement;
    139         if (!parent) return NodeFilter.FILTER_REJECT;
    140         if (skipTags.has(parent.tagName)) return NodeFilter.FILTER_REJECT;
    141 
    142         // Skip hidden elements
    143         try {
    144           const style = window.getComputedStyle(parent);
    145           if (style.display === 'none' || style.visibility === 'hidden' || style.opacity === '0') {
    146             return NodeFilter.FILTER_REJECT;
    147           }
    148         } catch {
    149           // Skip if we can't compute style
    150         }
    151 
    152         return NodeFilter.FILTER_ACCEPT;
    153       },
    154     });
    155 
    156     let node: Node | null;
    157     while ((node = walker.nextNode()) && totalLength < maxLength) {
    158       const text = (node.textContent || '').trim();
    159       if (text.length > 0) {
    160         chunks.push(text);
    161         totalLength += text.length;
    162       }
    163     }
    164 
    165     const result = chunks.join(' ').substring(0, maxLength);
    166 
    167     // Fallback to textContent if TreeWalker returned nothing (e.g. jsdom)
    168     if (result.length === 0) {
    169       const fallback = (document.body.innerText || document.body.textContent || '').trim();
    170       return fallback.substring(0, maxLength);
    171     }
    172 
    173     return result;
    174   }
    175 
    176   /**
    177124   * Apply widget configuration to CSS custom properties
    178125   */
Note: See TracChangeset for help on using the changeset viewer.