@cshah18/sdk 4.9.0 → 4.10.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.
@@ -1323,7 +1323,7 @@ class GroupListModal {
1323
1323
  el.style.opacity = disabled ? "0.5" : "1";
1324
1324
  el.style.cursor = disabled ? "not-allowed" : "pointer";
1325
1325
  el.setAttribute("aria-disabled", disabled ? "true" : "false");
1326
- if (typeof el.disabled !== "undefined") {
1326
+ if (el.disabled !== undefined) {
1327
1327
  el.disabled = disabled;
1328
1328
  }
1329
1329
  });
@@ -1353,7 +1353,7 @@ class GroupListModal {
1353
1353
  createGroupCard(group) {
1354
1354
  const card = document.createElement("div");
1355
1355
  card.className = "cobuy-group-card";
1356
- card.setAttribute("data-group-id", group.name || group.groupId);
1356
+ card.dataset.groupId = group.name || group.groupId;
1357
1357
  const header = document.createElement("div");
1358
1358
  header.className = "cobuy-group-card-header";
1359
1359
  const groupId = document.createElement("div");
@@ -2084,7 +2084,7 @@ function isRedemptionValid(expiryDate) {
2084
2084
  * LobbyModal - Renders and manages the group buying lobby modal
2085
2085
  */
2086
2086
  class LobbyModal {
2087
- constructor(data, callbacks, apiClient, analyticsClient, socketManager = null, debug = false) {
2087
+ constructor(data, callbacks, apiClient, socketManager = null, debug = false) {
2088
2088
  this.modalElement = null;
2089
2089
  this.timerInterval = null;
2090
2090
  this.activityInterval = null;
@@ -2093,21 +2093,6 @@ class LobbyModal {
2093
2093
  this.currentGroupId = null;
2094
2094
  this.shareOverlay = null;
2095
2095
  this.keyboardHandler = null;
2096
- /**
2097
- * Unsubscribe from socket events - testing out flow will remove once we have conviction
2098
- */
2099
- // private unsubscribeFromSocketEvents(): void {
2100
- // if (typeof window === "undefined" || !this.socketListenerRegistered) {
2101
- // return;
2102
- // }
2103
- // window.removeEventListener("group:fulfilled", this.handleSocketGroupUpdate as EventListener);
2104
- // window.removeEventListener(
2105
- // "group:member:joined",
2106
- // this.handleSocketGroupUpdate as EventListener,
2107
- // );
2108
- // window.removeEventListener("group:created", this.handleSocketGroupUpdate as EventListener);
2109
- // this.socketListenerRegistered = false;
2110
- // }
2111
2096
  /**
2112
2097
  * Handle socket group update events
2113
2098
  */
@@ -2198,7 +2183,6 @@ class LobbyModal {
2198
2183
  };
2199
2184
  this.logger = new Logger(debug);
2200
2185
  this.apiClient = apiClient;
2201
- this.analyticsClient = analyticsClient;
2202
2186
  this.socketManager = socketManager;
2203
2187
  // Log the group data being passed into the modal
2204
2188
  this.logger.info("LobbyModal initialized with group data", {
@@ -2245,7 +2229,7 @@ class LobbyModal {
2245
2229
  getTitleText(data) {
2246
2230
  var _a, _b;
2247
2231
  const remainingRaw = ((_a = data.totalMembers) !== null && _a !== void 0 ? _a : 0) - ((_b = data.currentMembers) !== null && _b !== void 0 ? _b : 0);
2248
- const remaining = remainingRaw > 0 ? remainingRaw : 0;
2232
+ const remaining = Math.max(0, remainingRaw);
2249
2233
  const unlocked = !this.computeIsLocked(data);
2250
2234
  if (unlocked) {
2251
2235
  return {
@@ -2373,7 +2357,7 @@ class LobbyModal {
2373
2357
  createModalStructure() {
2374
2358
  const modal = document.createElement("div");
2375
2359
  modal.className = "cb-lobby-modal-container";
2376
- modal.setAttribute("data-product-id", this.data.productId);
2360
+ modal.dataset.productId = this.data.productId;
2377
2361
  // Background
2378
2362
  const background = document.createElement("div");
2379
2363
  background.className = "cb-lobby-bg";
@@ -2907,1491 +2891,6 @@ class LobbyModal {
2907
2891
  `;
2908
2892
  document.head.appendChild(style);
2909
2893
  }
2910
- injectLobbyStyles() {
2911
- // Only inject once per page load
2912
- if (LobbyModal.stylesInjected) {
2913
- return;
2914
- }
2915
- LobbyModal.stylesInjected = true;
2916
- const style = document.createElement("style");
2917
- style.id = "cobuy-lobby-styles";
2918
- style.textContent = `
2919
- /* Screen reader only - hide visually but keep available to AT */
2920
- .sr-only {
2921
- position: absolute;
2922
- width: 1px;
2923
- height: 1px;
2924
- padding: 0;
2925
- margin: -1px;
2926
- overflow: hidden;
2927
- clip: rect(0, 0, 0, 0);
2928
- white-space: nowrap;
2929
- border-width: 0;
2930
- }
2931
-
2932
- .cb-lobby-modal-container {
2933
- position: fixed;
2934
- top: 0;
2935
- left: 0;
2936
- width: 100%;
2937
- height: 100%;
2938
- z-index: 10000;
2939
- }
2940
-
2941
- .cb-lobby-modal-container * {
2942
- margin: 0;
2943
- padding: 0;
2944
- box-sizing: border-box;
2945
- }
2946
-
2947
- .cb-lobby-modal-container html,
2948
- .cb-lobby-modal-container body {
2949
- font-family: "Inter", sans-serif;
2950
- width: 100%;
2951
- height: 100%;
2952
- overflow-x: hidden;
2953
- }
2954
-
2955
- .cb-lobby-main {
2956
- padding: 80px;
2957
- background-color: color-mix(in oklab, #fff 5%, transparent);
2958
- box-shadow: 0 25px 50px -12px #00000040;
2959
- backdrop-filter: blur(4px);
2960
- border-radius: 50px;
2961
- width: 100%;
2962
- position: relative;
2963
- z-index: 1;
2964
- }
2965
-
2966
- .cb-lobby-bg {
2967
- position: fixed;
2968
- top: 0;
2969
- left: 0;
2970
- width: 100vw;
2971
- height: 100vh;
2972
- background-image: url("https://cobuy-dev.s3.af-south-1.amazonaws.com/public/sdk/cb-back-image.png");
2973
- background-size: cover;
2974
- background-position: center;
2975
- background-repeat: no-repeat;
2976
- z-index: -1;
2977
- }
2978
-
2979
- .cb-lobby-main-wp {
2980
- display: flex;
2981
- align-items: center;
2982
- justify-content: center;
2983
- padding: 40px 80px;
2984
- }
2985
-
2986
- .lobby-indicator {
2987
- display: flex;
2988
- align-items: center;
2989
- gap: 12px;
2990
- padding: 6px 12px;
2991
- border-radius: 24px;
2992
- background: rgba(16, 185, 129, 0.1);
2993
- border: 1px solid rgba(16, 185, 129, 0.3);
2994
- backdrop-filter: blur(8px);
2995
- margin-bottom: 16px;
2996
- width: fit-content;
2997
- }
2998
-
2999
- .lobby-indicator-logo {
3000
- height: 34px;
3001
- width: auto;
3002
- display: block;
3003
- flex-shrink: 0;
3004
- }
3005
-
3006
- .pulsing-dot {
3007
- display: flex;
3008
- align-items: center;
3009
- justify-content: center;
3010
- position: relative;
3011
- width: 8px;
3012
- height: 8px;
3013
- }
3014
-
3015
- .pulsing-dot::after {
3016
- content: "";
3017
- position: absolute;
3018
- width: 100%;
3019
- height: 100%;
3020
- border-radius: 50%;
3021
- background: #10b981;
3022
- animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
3023
- }
3024
-
3025
- .pulsing-dot::before {
3026
- content: "";
3027
- position: absolute;
3028
- width: 100%;
3029
- height: 100%;
3030
- border-radius: 50%;
3031
- background: #10b981;
3032
- }
3033
-
3034
- @keyframes pulse {
3035
- 0%, 100% {
3036
- opacity: 1;
3037
- }
3038
- 50% {
3039
- opacity: 0.5;
3040
- }
3041
- }
3042
-
3043
- .indicator-text {
3044
- font-size: 11px;
3045
- font-weight: 800;
3046
- text-transform: uppercase;
3047
- letter-spacing: 0.5px;
3048
- color: #047857;
3049
- line-height: 1;
3050
- }
3051
-
3052
- .lobby-status-section {
3053
- display: flex;
3054
- flex-direction: column;
3055
- margin-bottom: 24px;
3056
- }
3057
-
3058
- .lobby-status {
3059
- font-size: 10px;
3060
- line-height: 1.2;
3061
- font-weight: 600;
3062
- padding: 6px 10px;
3063
- background: #fff;
3064
- border-radius: 4px;
3065
- text-transform: uppercase;
3066
- color: #000;
3067
- }
3068
-
3069
- .lobby-status.active {
3070
- background: #155dfc;
3071
- color: #fff;
3072
- }
3073
-
3074
- .lobby-status.complete {
3075
- background: #10b981;
3076
- color: #fff;
3077
- }
3078
-
3079
- .lobby-status-wp {
3080
- display: flex;
3081
- flex-wrap: wrap;
3082
- align-items: center;
3083
- gap: 10px;
3084
- }
3085
-
3086
- .lobby-number {
3087
- background: rgb(255 255 255 / 20%);
3088
- padding: 5px 8px;
3089
- box-shadow: 0 25px 50px -12px #00000040;
3090
- backdrop-filter: blur(3px);
3091
- border-radius: 4px;
3092
- text-transform: uppercase;
3093
- letter-spacing: 1px;
3094
- font-size: 12px;
3095
- line-height: 1.2;
3096
- font-weight: 700;
3097
- }
3098
-
3099
- .title-wp {
3100
- margin-top: 25px;
3101
- }
3102
-
3103
- .title-wp h2 {
3104
- font-size: 60px;
3105
- line-height: 1;
3106
- margin-bottom: 15px;
3107
- font-weight: 900;
3108
- }
3109
-
3110
- .sub-title {
3111
- font-size: 16px;
3112
- line-height: 1.5;
3113
- margin-bottom: 0;
3114
- color: #1e293b;
3115
- font-weight: 700;
3116
- background-image: linear-gradient(90deg, #1e293b 0%, #2563eb 25%, #1e293b 50%);
3117
- background-size: 200% auto;
3118
- background-clip: text;
3119
- -webkit-background-clip: text;
3120
- -webkit-text-fill-color: transparent;
3121
- animation: gradient-flow 4s linear infinite;
3122
- }
3123
-
3124
- @keyframes gradient-flow {
3125
- 0% {
3126
- background-position: 200% 0;
3127
- }
3128
- 100% {
3129
- background-position: -200% 0;
3130
- }
3131
- }
3132
-
3133
- .sub-title.completed {
3134
- background-image: none;
3135
- -webkit-text-fill-color: unset;
3136
- background-clip: unset;
3137
- -webkit-background-clip: unset;
3138
- color: #1e293b;
3139
- }
3140
-
3141
- .connected-section {
3142
- display: flex;
3143
- flex-direction: column;
3144
- gap: 20px;
3145
- padding: 24px;
3146
- margin-top: 24px;
3147
- border-radius: 24px;
3148
- background: rgba(255, 255, 255, 0.05);
3149
- border: 1px solid rgba(255, 255, 255, 0.1);
3150
- backdrop-filter: blur(4px);
3151
- box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
3152
- transition: all 0.3s ease;
3153
- }
3154
-
3155
- .connected-section:hover {
3156
- background: rgba(255, 255, 255, 0.1);
3157
- box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.08);
3158
- }
3159
-
3160
- .link-share-container {
3161
- display: flex;
3162
- flex-direction: column;
3163
- }
3164
-
3165
- .link-share-wrapper {
3166
- display: flex;
3167
- align-items: center;
3168
- gap: 12px;
3169
- width: 100%;
3170
- }
3171
-
3172
- .lobby-link-box {
3173
- display: flex;
3174
- align-items: center;
3175
- justify-content: space-between;
3176
- gap: 16px;
3177
- padding: 16px 20px;
3178
- border-radius: 14px;
3179
- backdrop-filter: blur(8px);
3180
- background-color: rgb(255 255 255 / 40%);
3181
- border: 1px solid rgb(255 255 255 / 30%);
3182
- box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
3183
- flex: 1;
3184
- transition: all 0.2s ease;
3185
- min-height: 50px;
3186
- }
3187
-
3188
- .lobby-link-box:hover {
3189
- background-color: rgb(255 255 255 / 50%);
3190
- box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.08);
3191
- }
3192
-
3193
- .lobby-link-text {
3194
- font-size: 10px;
3195
- line-height: 1.2;
3196
- font-weight: 700;
3197
- text-transform: uppercase;
3198
- letter-spacing: 0.6px;
3199
- margin-bottom: 6px;
3200
- color: #71717a;
3201
- }
3202
-
3203
- .copy-link-btn {
3204
- padding: 0;
3205
- display: flex;
3206
- align-items: center;
3207
- justify-content: center;
3208
- gap: 6px;
3209
- cursor: pointer;
3210
- color: #64748b;
3211
- background: transparent;
3212
- border: none;
3213
- font-size: 13px;
3214
- font-weight: 600;
3215
- border-radius: 6px;
3216
- transition: all 0.2s ease;
3217
- white-space: nowrap;
3218
- flex-shrink: 0;
3219
- }
3220
-
3221
- .copy-link-btn:hover {
3222
- color: #1e293b;
3223
- }
3224
-
3225
- .copy-link-btn .copy-text {
3226
- display: none;
3227
- }
3228
-
3229
- .copy-link-btn svg {
3230
- width: 18px;
3231
- height: 18px;
3232
- flex-shrink: 0;
3233
- }
3234
-
3235
- @media (min-width: 640px) {
3236
- .copy-link-btn .copy-text {
3237
- display: inline;
3238
- }
3239
- }
3240
-
3241
- .lobby-link-url {
3242
- font-size: 15px;
3243
- line-height: 1.4;
3244
- font-weight: 700;
3245
- color: #1e293b;
3246
- word-break: break-all;
3247
- }
3248
-
3249
- .link-box-container {
3250
- flex: 1;
3251
- min-width: 0;
3252
- }
3253
-
3254
- .share-btn {
3255
- background: #1e293b;
3256
- color: #fff;
3257
- padding: 35px 24px;
3258
- border-radius: 14px;
3259
- height: 50px;
3260
- min-width: auto;
3261
- display: flex;
3262
- align-items: center;
3263
- justify-content: center;
3264
- gap: 8px;
3265
- cursor: pointer;
3266
- border: none;
3267
- font-weight: 600;
3268
- font-size: 15px;
3269
- transition: all 0.2s ease;
3270
- box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.1);
3271
- flex-shrink: 0;
3272
- }
3273
-
3274
- .share-btn .share-text {
3275
- display: inline;
3276
- color: #fff;
3277
- font-size: 15px;
3278
- }
3279
-
3280
- .share-btn svg {
3281
- color: #fff;
3282
- }
3283
-
3284
- @media (max-width: 640px) {
3285
- .share-btn {
3286
- padding: 0 18px;
3287
- font-size: 14px;
3288
- height: 50px;
3289
- }
3290
- .share-btn .share-text {
3291
- display: inline;
3292
- color: #fff;
3293
- }
3294
- }
3295
-
3296
- .share-btn:hover {
3297
- background: #0f172a;
3298
- box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.15);
3299
- transform: translateY(-1px);
3300
- }
3301
-
3302
- .share-btn:active {
3303
- transform: scale(0.95);
3304
- }
3305
-
3306
- .share-btn svg {
3307
- width: 18px;
3308
- height: 18px;
3309
- flex-shrink: 0;
3310
- }
3311
-
3312
- .lobby-offer-box {
3313
- display: flex;
3314
- align-items: center;
3315
- gap: 30px;
3316
- padding: 15px 20px;
3317
- border-radius: 1rem;
3318
- backdrop-filter: blur(8px);
3319
- border: 1px solid rgba(59, 130, 246, 0.125);
3320
- background-color: rgba(59, 130, 246, 0.063);
3321
- margin-top: 30px;
3322
- }
3323
-
3324
- .offer-box-icon {
3325
- background: linear-gradient(135deg, rgb(59, 130, 246), rgba(59, 130, 246, 0.867));
3326
- box-shadow: rgba(59, 130, 246, 0.314) 0px 10px 15px -3px;
3327
- color: #fff;
3328
- padding: 5px;
3329
- border-radius: 10px;
3330
- width: 56px;
3331
- height: 56px;
3332
- display: flex;
3333
- align-items: center;
3334
- justify-content: center;
3335
- cursor: pointer;
3336
- }
3337
-
3338
- .offer-lock-status {
3339
- display: flex;
3340
- align-items: center;
3341
- gap: 6px;
3342
- margin-bottom: 2px;
3343
- }
3344
-
3345
- .offer-lock-status span {
3346
- font-size: 14px;
3347
- line-height: 1;
3348
- font-weight: 700;
3349
- }
3350
-
3351
- .offer-box-content h3 {
3352
- font-size: 30px;
3353
- line-height: 1.2;
3354
- font-weight: 900;
3355
- }
3356
-
3357
- .cb-lobby-top {
3358
- display: grid;
3359
- grid-template-columns: 7fr 5fr;
3360
- gap: 100px;
3361
- }
3362
-
3363
- .group-info {
3364
- background-color: color-mix(in oklab, #fff 5%, transparent);
3365
- backdrop-filter: blur(8px);
3366
- border-radius: 20px;
3367
- padding: 30px;
3368
- box-shadow: 0 10px 15px -3px #0000001a;
3369
- }
3370
-
3371
- .progress-header {
3372
- display: flex;
3373
- justify-content: space-between;
3374
- align-items: center;
3375
- margin-bottom: 14px;
3376
- }
3377
-
3378
- .progress-header .title {
3379
- position: relative;
3380
- display: flex;
3381
- justify-content: center;
3382
- align-items: center;
3383
- font-size: 14px;
3384
- font-weight: 900;
3385
- letter-spacing: 0.7px;
3386
- color: #000;
3387
- }
3388
-
3389
- .progress-badge {
3390
- background: #3b82f6;
3391
- color: #fff;
3392
- font-size: 13px;
3393
- font-weight: 700;
3394
- padding: 6px 12px;
3395
- border-radius: 999px;
3396
- box-shadow: 0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a;
3397
- }
3398
-
3399
- .cb-lobby-modal-container .progress-bar {
3400
- width: 100%;
3401
- height: 14px;
3402
- background: #ffffff;
3403
- border-radius: 999px;
3404
- overflow: hidden;
3405
- }
3406
-
3407
- .cb-lobby-modal-container .progress-fill {
3408
- height: 100%;
3409
- width: 0;
3410
- border-radius: 999px;
3411
- position: relative;
3412
- background: #3b82f6;
3413
- background-image: linear-gradient(120deg, rgba(255, 255, 255, 0.15) 25%, rgba(255, 255, 255, 0.45) 37%, rgba(255, 255, 255, 0.15) 63%);
3414
- background-size: 200% 100%;
3415
- animation: shimmer 2.7s infinite linear;
3416
- transition: width 0.6s ease;
3417
- }
3418
-
3419
- @keyframes shimmer {
3420
- 0% {
3421
- background-position: -200% 0;
3422
- }
3423
- 100% {
3424
- background-position: 200% 0;
3425
- }
3426
- }
3427
-
3428
- .progress-labels {
3429
- display: flex;
3430
- justify-content: space-between;
3431
- margin-top: 8px;
3432
- font-size: 12px;
3433
- color: #474d56;
3434
- }
3435
-
3436
- .team-card {
3437
- margin-top: 40px;
3438
- }
3439
-
3440
- .team-card .icon-box svg {
3441
- width: 16px;
3442
- }
3443
-
3444
- .team-card .team-header {
3445
- display: flex;
3446
- justify-content: space-between;
3447
- align-items: center;
3448
- }
3449
-
3450
- .team-card .team-title {
3451
- display: flex;
3452
- align-items: center;
3453
- gap: 12px;
3454
- font-size: 14px;
3455
- font-weight: 600;
3456
- letter-spacing: 1px;
3457
- }
3458
-
3459
- .team-card .icon-box {
3460
- width: 2rem;
3461
- height: 2rem;
3462
- border-radius: 0.5rem;
3463
- display: flex;
3464
- align-items: center;
3465
- justify-content: center;
3466
- font-size: 18px;
3467
- background-color: #3b82f6;
3468
- color: #fff;
3469
- box-shadow: 0 10px 15px -3px #3b82f64d;
3470
- }
3471
-
3472
- .team-card .team-title span {
3473
- font-size: 14px;
3474
- font-weight: 900;
3475
- letter-spacing: 0.7px;
3476
- color: #000;
3477
- }
3478
-
3479
- .team-card .team-count {
3480
- padding: 6px 12px;
3481
- border-radius: 9999px;
3482
- color: #fff;
3483
- font-weight: 700;
3484
- font-size: 13px;
3485
- letter-spacing: 0.7px;
3486
- background-color: #3b82f6;
3487
- box-shadow: 0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a;
3488
- }
3489
-
3490
- .team-card .team-members {
3491
- display: flex;
3492
- align-items: center;
3493
- justify-content: center;
3494
- gap: 14px;
3495
- margin-top: 20px;
3496
- }
3497
-
3498
- .team-card .member {
3499
- position: relative;
3500
- width: 56px;
3501
- height: 56px;
3502
- border-radius: 50%;
3503
- display: flex;
3504
- align-items: center;
3505
- justify-content: center;
3506
- font-size: 22px;
3507
- color: #fff;
3508
- border: 3px solid #fff;
3509
- box-shadow: 0 4px 12px #0000001a;
3510
- }
3511
-
3512
- .team-card .member::after {
3513
- content: "";
3514
- position: absolute;
3515
- bottom: -4px;
3516
- right: -4px;
3517
- width: 12px;
3518
- height: 12px;
3519
- background: #3b82f6;
3520
- background-image: url("https://cobuy-dev.s3.af-south-1.amazonaws.com/public/sdk/tick-mark-icon.svg");
3521
- background-size: 75%;
3522
- background-repeat: no-repeat;
3523
- background-position: center;
3524
- color: #fff;
3525
- border-radius: 50%;
3526
- display: flex;
3527
- align-items: center;
3528
- justify-content: center;
3529
- border: 2px solid #fff;
3530
- padding: 2px;
3531
- }
3532
-
3533
- .team-card .member.blue {
3534
- background: #2563eb;
3535
- }
3536
-
3537
- .team-card .member.purple {
3538
- background: #9333ea;
3539
- }
3540
-
3541
- .team-card .member.pink {
3542
- background: #ec4899;
3543
- }
3544
-
3545
- .team-card .member.orange {
3546
- background: #f97316;
3547
- }
3548
-
3549
- .team-card .member.empty {
3550
- background: #f8fafc;
3551
- color: #9ca3af;
3552
- }
3553
-
3554
- .team-card .member.empty::after {
3555
- display: none;
3556
- }
3557
-
3558
- .time-card {
3559
- border-radius: 20px;
3560
- padding: 15px;
3561
- display: flex;
3562
- align-items: center;
3563
- gap: 14px;
3564
- margin-top: 30px;
3565
- background: rgba(255, 255, 255, 0.2);
3566
- border: 1px solid rgba(255, 255, 255, 0.2);
3567
- backdrop-filter: blur(8px);
3568
- }
3569
-
3570
- .time-card .time-icon {
3571
- width: 48px;
3572
- height: 48px;
3573
- background: #3b82f6;
3574
- color: #fff;
3575
- border-radius: 14px;
3576
- display: flex;
3577
- align-items: center;
3578
- justify-content: center;
3579
- font-size: 22px;
3580
- flex-shrink: 0;
3581
- }
3582
-
3583
- .time-card .time-content {
3584
- display: flex;
3585
- flex-direction: column;
3586
- }
3587
-
3588
- .time-card .time-label {
3589
- font-size: 12px;
3590
- font-weight: 600;
3591
- letter-spacing: 0.6px;
3592
- color: #4b5563;
3593
- }
3594
-
3595
- .time-card .time-value {
3596
- font-size: 22px;
3597
- font-weight: 900;
3598
- color: #111827;
3599
- }
3600
-
3601
- .group-info-box {
3602
- background: color-mix(in oklab, #fff 5%, transparent);
3603
- border: 1px solid color-mix(in oklab, #fff 20%, transparent);
3604
- backdrop-filter: blur(8px);
3605
- padding: 30px;
3606
- box-shadow: 0 10px 15px -3px #0000001a;
3607
- border-radius: 1.5rem;
3608
- }
3609
-
3610
- .offer-lock-status svg {
3611
- width: 16px;
3612
- height: 16px;
3613
- }
3614
-
3615
- .cb-lobby-modal-container .offer-box-content .reward-text {
3616
- font-size: 14px;
3617
- line-height: 1;
3618
- margin-top: 4px;
3619
- color: #000;
3620
- background: unset;
3621
- border: none;
3622
- }
3623
-
3624
- .progress-header .title:before {
3625
- content: "";
3626
- position: relative;
3627
- display: inline-block;
3628
- width: 8px;
3629
- height: 8px;
3630
- background: rgb(59, 130, 246);
3631
- border-radius: 50%;
3632
- margin-right: 8px;
3633
- }
3634
-
3635
- .live-activity-wrapper {
3636
- padding: 16px;
3637
- background-color: color-mix(in oklab, #fff 80%, transparent);
3638
- border-radius: 18px;
3639
- box-shadow: 0 30px 80px rgba(0, 0, 0, 0.15);
3640
- backdrop-filter: blur(8px);
3641
- }
3642
-
3643
- .live-activity-header {
3644
- display: flex;
3645
- justify-content: space-between;
3646
- margin-bottom: 12px;
3647
- gap: 10px;
3648
- }
3649
-
3650
- .live-activity-header .title {
3651
- font-weight: 600;
3652
- display: flex;
3653
- align-items: center;
3654
- gap: 8px;
3655
- font-size: 14px;
3656
- font-weight: 900;
3657
- letter-spacing: 0.7px;
3658
- color: #000;
3659
- }
3660
-
3661
- .live-activity-header .dot {
3662
- position: relative;
3663
- width: 8px;
3664
- height: 8px;
3665
- background: #3b82f6;
3666
- border-radius: 50%;
3667
- }
3668
-
3669
- .live-activity-header .dot::after {
3670
- content: "";
3671
- position: absolute;
3672
- inset: 0;
3673
- border-radius: 50%;
3674
- background: rgba(59, 130, 246, 0.6);
3675
- animation: livePulse 1.6s ease-out infinite;
3676
- }
3677
-
3678
- @keyframes livePulse {
3679
- 0% {
3680
- transform: scale(1);
3681
- opacity: 0.8;
3682
- }
3683
- 70% {
3684
- transform: scale(2.4);
3685
- opacity: 0;
3686
- }
3687
- 100% {
3688
- opacity: 0;
3689
- }
3690
- }
3691
-
3692
- .activity-stats {
3693
- display: flex;
3694
- align-items: center;
3695
- gap: 8px;
3696
- }
3697
-
3698
- .activity-stats-badge {
3699
- padding: 4px 10px;
3700
- border-radius: 999px;
3701
- font-size: 12px;
3702
- line-height: 1;
3703
- font-weight: 500;
3704
- background-color: rgba(59, 130, 246, 0.082);
3705
- color: rgb(59, 130, 246);
3706
- }
3707
-
3708
- .activity-stats-badge.light {
3709
- background-color: #f9f3f4;
3710
- color: #45556c;
3711
- }
3712
-
3713
- .activity-list {
3714
- position: relative;
3715
- height: 104px;
3716
- overflow: hidden;
3717
- }
3718
-
3719
- .activity-card {
3720
- position: absolute;
3721
- inset: 0;
3722
- height: 58px;
3723
- display: flex;
3724
- align-items: center;
3725
- gap: 10px;
3726
- padding: 12px 10px;
3727
- background: linear-gradient(90deg, #fff, #f2f6ff);
3728
- border-radius: 14px;
3729
- border: 1px solid #dbeafe;
3730
- transition: transform 600ms cubic-bezier(0.22, 0.61, 0.36, 1), opacity 600ms;
3731
- }
3732
-
3733
- .activity-card .text {
3734
- font-size: 14px;
3735
- }
3736
-
3737
- .activity-card .avatar {
3738
- width: 30px;
3739
- height: 30px;
3740
- border-radius: 50%;
3741
- display: flex;
3742
- align-items: center;
3743
- justify-content: center;
3744
- color: #fff;
3745
- flex: 0 0 30px;
3746
- }
3747
-
3748
- .activity-card .pink {
3749
- background: linear-gradient(135deg, #ec4899, #f472b6);
3750
- }
3751
-
3752
- .activity-card .purple {
3753
- background: linear-gradient(135deg, #8b5cf6, #a78bfa);
3754
- }
3755
-
3756
- .activity-card .blue {
3757
- background: linear-gradient(135deg, #3b82f6, #60a5fa);
3758
- }
3759
-
3760
- .activity-card .green {
3761
- background: linear-gradient(135deg, #10b981, #34d399);
3762
- }
3763
-
3764
- .activity-card .orange {
3765
- background: linear-gradient(135deg, #f97316, #fb923c);
3766
- }
3767
-
3768
- .activity-card .text p {
3769
- margin: 2px 0 0;
3770
- font-size: 12px;
3771
- color: #6b7280;
3772
- }
3773
-
3774
- .activity-card .time {
3775
- margin-left: auto;
3776
- font-size: 10px;
3777
- color: #94a3b8;
3778
- }
3779
-
3780
- .lobby-activity-wp {
3781
- margin-top: 50px;
3782
- padding: 8px;
3783
- border-radius: 25px;
3784
- backdrop-filter: blur(12px);
3785
- background-color: rgb(255 255 255 / 40%);
3786
- border: 1px solid rgb(255 255 255 / 20%);
3787
- box-shadow: 0 1px 3px 0 #0000001a;
3788
- }
3789
-
3790
- .lobby-close-icon {
3791
- position: fixed;
3792
- top: 30px;
3793
- right: 30px;
3794
- display: flex;
3795
- align-items: center;
3796
- justify-content: center;
3797
- background-color: color-mix(in oklab, #000 80%, transparent);
3798
- color: #fff;
3799
- width: 34px;
3800
- height: 34px;
3801
- border-radius: 50%;
3802
- cursor: pointer;
3803
- z-index: 99;
3804
- }
3805
-
3806
- .lobby-close-icon svg {
3807
- width: 20px;
3808
- height: 20px;
3809
- }
3810
-
3811
- @media screen and (max-width: 1600px) {
3812
- .cb-lobby-main {
3813
- padding: 50px;
3814
- border-radius: 30px;
3815
- }
3816
- .title-wp h2 {
3817
- font-size: 48px;
3818
- margin-bottom: 12px;
3819
- }
3820
- .sub-title {
3821
- font-size: 16px;
3822
- }
3823
- .title-wp {
3824
- margin-top: 20px;
3825
- }
3826
- .lobby-link-section {
3827
- margin-top: 30px;
3828
- }
3829
- .offer-box-content h3 {
3830
- font-size: 26px;
3831
- }
3832
- .lobby-offer-box {
3833
- gap: 24px;
3834
- padding: 15px;
3835
- }
3836
- .cb-lobby-top {
3837
- gap: 80px;
3838
- }
3839
- .group-info-box {
3840
- padding: 22px;
3841
- border-radius: 20px;
3842
- }
3843
- .team-card {
3844
- margin-top: 30px;
3845
- }
3846
- .team-card .team-members {
3847
- margin-top: 12px;
3848
- }
3849
- .lobby-activity-wp {
3850
- margin-top: 40px;
3851
- }
3852
- .lobby-close-icon {
3853
- top: 20px;
3854
- width: 30px;
3855
- height: 30px;
3856
- }
3857
- }
3858
-
3859
- @media screen and (max-width: 1280px) {
3860
- .cb-lobby-main-wp {
3861
- padding: 40px;
3862
- }
3863
- .cb-lobby-main {
3864
- padding: 40px;
3865
- }
3866
- .title-wp h2 {
3867
- font-size: 42px;
3868
- }
3869
- .cb-lobby-top {
3870
- gap: 60px;
3871
- }
3872
- }
3873
-
3874
- @media screen and (max-width: 1120px) {
3875
- .title-wp h2 {
3876
- font-size: 38px;
3877
- }
3878
- }
3879
-
3880
- @media screen and (max-width: 991px) {
3881
- .cb-lobby-top {
3882
- grid-template-columns: 1fr;
3883
- gap: 30px;
3884
- }
3885
- .cb-lobby-main {
3886
- padding: 30px;
3887
- border-radius: 15px;
3888
- }
3889
- .cb-lobby-main-wp {
3890
- padding: 30px;
3891
- }
3892
- .lobby-close-icon {
3893
- right: 20px;
3894
- }
3895
- .lobby-link-box {
3896
- border-radius: 10px;
3897
- }
3898
- .share-btn {
3899
- border-radius: 8px;
3900
- }
3901
- .offer-box-content h3 {
3902
- font-size: 24px;
3903
- }
3904
- .lobby-offer-box {
3905
- margin-top: 20px;
3906
- border-radius: 15px;
3907
- }
3908
- .time-card {
3909
- margin-top: 20px;
3910
- border-radius: 15px;
3911
- }
3912
- .lobby-activity-wp {
3913
- margin-top: 20px;
3914
- border-radius: 15px;
3915
- }
3916
- .live-activity-wrapper {
3917
- border-radius: 10px;
3918
- }
3919
- .group-info-box {
3920
- border-radius: 15px;
3921
- }
3922
- }
3923
-
3924
- @media screen and (max-width: 575px) {
3925
- .cb-lobby-main-wp {
3926
- padding: 20px;
3927
- }
3928
- .cb-lobby-main {
3929
- padding: 20px;
3930
- }
3931
- .title-wp h2 {
3932
- font-size: 30px;
3933
- }
3934
- .lobby-link-text {
3935
- font-size: 11px;
3936
- margin-bottom: 4px;
3937
- }
3938
- .lobby-link-url {
3939
- font-size: 14px;
3940
- }
3941
- .lobby-link-box {
3942
- padding: 12px 16px;
3943
- min-height: 48px;
3944
- }
3945
- .link-share-wrapper {
3946
- gap: 10px;
3947
- }
3948
- .share-btn {
3949
- height: 48px;
3950
- min-width: auto;
3951
- border-radius: 8px;
3952
- padding: 0 14px;
3953
- font-size: 13px;
3954
- }
3955
- .lobby-offer-box {
3956
- padding: 10px;
3957
- }
3958
- .offer-box-content h3 {
3959
- font-size: 20px;
3960
- }
3961
- .offer-box-content .reward-text {
3962
- font-size: 13px;
3963
- }
3964
- .group-info-box {
3965
- padding: 13px;
3966
- }
3967
- .progress-header .title {
3968
- font-size: 13px;
3969
- }
3970
- .team-card .team-title span {
3971
- font-size: 13px;
3972
- }
3973
- .team-card .member {
3974
- width: 40px;
3975
- height: 40px;
3976
- }
3977
- .team-card .member::after {
3978
- width: 8px;
3979
- height: 8px;
3980
- }
3981
- .team-card .team-members {
3982
- margin-top: 12px;
3983
- gap: 10px;
3984
- }
3985
- .time-card {
3986
- padding: 13px;
3987
- }
3988
- .team-card {
3989
- margin-top: 22px;
3990
- }
3991
- .activity-card .text {
3992
- font-size: 12px;
3993
- }
3994
- .activity-card .text p {
3995
- font-size: 11px;
3996
- }
3997
- .live-activity-header .title {
3998
- font-size: 12px;
3999
- }
4000
- .time-card .time-value {
4001
- font-size: 20px;
4002
- }
4003
- }
4004
-
4005
- @media screen and (max-width: 480px) {
4006
- .cb-lobby-main-wp {
4007
- padding: 20px 12px;
4008
- }
4009
- .cb-lobby-main {
4010
- padding: 15px 12px;
4011
- }
4012
- .lobby-status {
4013
- font-size: 9px;
4014
- }
4015
- .lobby-number {
4016
- font-size: 10px;
4017
- }
4018
- .title-wp h2 {
4019
- font-size: 28px;
4020
- margin-bottom: 7px;
4021
- }
4022
- .sub-title {
4023
- font-size: 14px;
4024
- }
4025
- .lobby-link-section {
4026
- gap: 10px;
4027
- margin-top: 20px;
4028
- }
4029
- .lobby-offer-box {
4030
- gap: 12px;
4031
- }
4032
- .offer-box-icon {
4033
- width: 45px;
4034
- height: 45px;
4035
- }
4036
- .offer-lock-status span {
4037
- font-size: 12px;
4038
- }
4039
- .offer-box-content .reward-text {
4040
- font-size: 12px;
4041
- }
4042
- .cb-lobby-top {
4043
- gap: 20px;
4044
- }
4045
- .lobby-close-icon {
4046
- right: 10px;
4047
- top: 10px;
4048
- }
4049
- .live-activity-header {
4050
- flex-direction: column;
4051
- gap: 5px;
4052
- }
4053
- .activity-card {
4054
- padding: 6px;
4055
- border-radius: 9px;
4056
- }
4057
- }
4058
-
4059
- .share-overlay {
4060
- position: fixed;
4061
- inset: 0;
4062
- background: rgba(0, 0, 0, 0.45);
4063
- display: flex;
4064
- align-items: center;
4065
- justify-content: center;
4066
- opacity: 0;
4067
- visibility: hidden;
4068
- transition: 0.3s ease;
4069
- z-index: 999;
4070
- }
4071
-
4072
- .share-overlay.active {
4073
- opacity: 1;
4074
- visibility: visible;
4075
- }
4076
-
4077
- .share-popup {
4078
- background: #fff;
4079
- width: 420px;
4080
- border-radius: 18px;
4081
- padding: 24px;
4082
- transform: translateY(30px);
4083
- transition: 0.35s ease;
4084
- position: relative;
4085
- max-height: 90%;
4086
- overflow: auto;
4087
- }
4088
-
4089
- .share-overlay.active .share-popup {
4090
- transform: translateY(0);
4091
- }
4092
-
4093
- .share-popup .close-btn {
4094
- position: absolute;
4095
- right: 14px;
4096
- top: 14px;
4097
- border: none;
4098
- background: rgb(243, 244, 246);
4099
- border-radius: 50%;
4100
- width: 32px;
4101
- height: 32px;
4102
- display: flex;
4103
- align-items: center;
4104
- justify-content: center;
4105
- cursor: pointer;
4106
- transition: 0.3s;
4107
- }
4108
-
4109
- .share-popup .close-btn:hover {
4110
- background: rgb(238 236 236);
4111
- }
4112
-
4113
- .share-popup h2 {
4114
- margin-bottom: 10px;
4115
- font-size: 22px;
4116
- line-height: 1;
4117
- font-weight: 600;
4118
- }
4119
-
4120
- .share-popup .subtitle {
4121
- color: #4a5565;
4122
- font-size: 14px;
4123
- margin: 6px 0 30px;
4124
- }
4125
-
4126
- .share-popup .share-grid {
4127
- display: grid;
4128
- grid-template-columns: repeat(2, 1fr);
4129
- gap: 14px;
4130
- }
4131
-
4132
- .share-popup .share-card {
4133
- background: #f2f6f9;
4134
- border-radius: 14px;
4135
- padding: 16px;
4136
- text-align: center;
4137
- cursor: pointer;
4138
- position: relative;
4139
- transition: 0.25s ease;
4140
- display: flex;
4141
- flex-direction: column;
4142
- align-items: center;
4143
- }
4144
-
4145
- .share-popup .share-card:hover {
4146
- transform: translateY(-3px);
4147
- }
4148
-
4149
- .share-popup .share-card .icon {
4150
- font-size: 30px;
4151
- margin-bottom: 8px;
4152
- width: 50px;
4153
- height: 50px;
4154
- text-align: center;
4155
- display: flex;
4156
- align-items: center;
4157
- justify-content: center;
4158
- background: rgb(24, 119, 242);
4159
- border-radius: 50%;
4160
- color: #fff;
4161
- }
4162
-
4163
- .share-popup .share-card span {
4164
- font-size: 13px;
4165
- font-weight: 500;
4166
- }
4167
-
4168
- .share-popup .share-card.whatsapp {
4169
- background: #ecfdf5;
4170
- border: 2px solid #22c55e;
4171
- color: #22c55e;
4172
- }
4173
-
4174
- .share-popup .share-card.whatsapp .icon {
4175
- background: #22c55e;
4176
- }
4177
-
4178
- .share-popup .share-card .badge {
4179
- position: absolute;
4180
- top: -8px;
4181
- right: 10px;
4182
- background: #2563eb;
4183
- color: #fff;
4184
- font-size: 11px;
4185
- padding: 4px 10px;
4186
- border-radius: 12px;
4187
- }
4188
-
4189
- .share-popup .link-box {
4190
- background: #fbf9fa;
4191
- border-radius: 14px;
4192
- padding: 14px;
4193
- margin-top: 18px;
4194
- border: 1px solid #ebe6e7;
4195
- }
4196
-
4197
- .share-popup .link-box label {
4198
- font-size: 13px;
4199
- color: #64748b;
4200
- }
4201
-
4202
- .share-popup .link-row {
4203
- display: flex;
4204
- gap: 8px;
4205
- margin-top: 6px;
4206
- }
4207
-
4208
- .share-popup .link-row input {
4209
- flex: 1;
4210
- border: none;
4211
- background: transparent;
4212
- font-size: 13px;
4213
- letter-spacing: 0.8px;
4214
- line-height: 1.2;
4215
- color: #334155;
4216
- outline: none;
4217
- }
4218
-
4219
- .share-popup .link-row button {
4220
- background: #fff;
4221
- border-radius: 10px;
4222
- cursor: pointer;
4223
- padding: 6px 8px;
4224
- border: 1px solid #ebe6e7;
4225
- display: flex;
4226
- align-items: center;
4227
- justify-content: center;
4228
- width: 35px;
4229
- height: 35px;
4230
- }
4231
-
4232
- .share-popup .success {
4233
- display: block;
4234
- margin-top: 6px;
4235
- color: #2563eb;
4236
- font-size: 12px;
4237
- opacity: 0;
4238
- transition: opacity 0.3s;
4239
- }
4240
-
4241
- .share-popup .success.show {
4242
- opacity: 1;
4243
- }
4244
-
4245
- .share-popup .footer-text {
4246
- margin-top: 14px;
4247
- text-align: center;
4248
- font-size: 12px;
4249
- color: #64748b;
4250
- }
4251
-
4252
- .share-popup .share-card.twitter .icon {
4253
- background: #000;
4254
- }
4255
-
4256
- .share-popup .share-card.facebook .icon {
4257
- background: rgb(24, 119, 242);
4258
- }
4259
-
4260
- .share-popup .share-card.sms .icon {
4261
- background: #059669;
4262
- }
4263
-
4264
- .share-popup .share-card.copied .icon {
4265
- background: #2563eb;
4266
- }
4267
-
4268
- @keyframes entrance-fade-in {
4269
- from {
4270
- opacity: 0;
4271
- }
4272
- to {
4273
- opacity: 1;
4274
- }
4275
- }
4276
-
4277
- @keyframes entrance-scale-in {
4278
- from {
4279
- opacity: 0;
4280
- transform: scale(0.9) translateY(20px);
4281
- }
4282
- to {
4283
- opacity: 1;
4284
- transform: scale(1) translateY(0);
4285
- }
4286
- }
4287
-
4288
- @keyframes entrance-text-fade-in {
4289
- from {
4290
- opacity: 0;
4291
- }
4292
- to {
4293
- opacity: 1;
4294
- }
4295
- }
4296
-
4297
- @keyframes exit-blur-scale {
4298
- from {
4299
- opacity: 1;
4300
- transform: scale(1);
4301
- filter: blur(0px);
4302
- }
4303
- to {
4304
- opacity: 0;
4305
- transform: scale(1.1);
4306
- filter: blur(10px);
4307
- }
4308
- }
4309
-
4310
- @keyframes pulse-dot {
4311
- 0%, 100% {
4312
- opacity: 1;
4313
- }
4314
- 50% {
4315
- opacity: 0.5;
4316
- }
4317
- }
4318
-
4319
- .entrance-animation-overlay {
4320
- position: fixed;
4321
- inset: 0;
4322
- z-index: 9999;
4323
- display: flex;
4324
- flex-direction: column;
4325
- align-items: center;
4326
- justify-content: center;
4327
- background-color: #0f172a;
4328
- color: white;
4329
- animation: entrance-fade-in 0.8s ease-in-out forwards;
4330
- }
4331
-
4332
- .entrance-animation-overlay.exit {
4333
- animation: exit-blur-scale 0.8s ease-in-out forwards;
4334
- }
4335
-
4336
- .entrance-content {
4337
- display: flex;
4338
- flex-direction: column;
4339
- align-items: center;
4340
- animation: entrance-scale-in 0.5s ease-out 0.2s both;
4341
- }
4342
-
4343
- .entrance-icon-box {
4344
- width: 64px;
4345
- height: 64px;
4346
- margin-bottom: 24px;
4347
- border-radius: 16px;
4348
- background: #2563eb;
4349
- display: flex;
4350
- align-items: center;
4351
- justify-content: center;
4352
- box-shadow: 0 10px 25px rgba(37, 99, 235, 0.2);
4353
- }
4354
-
4355
- .entrance-icon-box svg {
4356
- width: 32px;
4357
- height: 32px;
4358
- color: white;
4359
- }
4360
-
4361
- .entrance-title {
4362
- font-size: 32px;
4363
- font-weight: 700;
4364
- letter-spacing: -0.5px;
4365
- margin-bottom: 12px;
4366
- }
4367
-
4368
- @media (min-width: 768px) {
4369
- .entrance-title {
4370
- font-size: 48px;
4371
- }
4372
- }
4373
-
4374
- .entrance-message {
4375
- color: #60a5fa;
4376
- font-weight: 500;
4377
- font-size: 18px;
4378
- display: flex;
4379
- align-items: center;
4380
- gap: 8px;
4381
- animation: entrance-text-fade-in 0.5s ease-out 0.5s both;
4382
- }
4383
-
4384
- .entrance-pulse-dot {
4385
- width: 8px;
4386
- height: 8px;
4387
- border-radius: 50%;
4388
- background-color: #60a5fa;
4389
- animation: pulse-dot 1.5s ease-in-out infinite;
4390
- }
4391
- `;
4392
- document.head.appendChild(style);
4393
- this.logger.info("Lobby styles injected successfully");
4394
- }
4395
2894
  /**
4396
2895
  * Trigger the same checkout flow as clicking "Continue to Checkout" on the widget
4397
2896
  */
@@ -5043,8 +3542,6 @@ class LobbyModal {
5043
3542
  groupNumber: this.data.groupNumber,
5044
3543
  status: this.data.status,
5045
3544
  });
5046
- // Inject lobby styles (only happens once per page load)
5047
- this.injectLobbyStyles();
5048
3545
  // Show entrance animation, then open modal after animation completes
5049
3546
  this.showEntranceAnimation(() => {
5050
3547
  this.modalElement = this.createModalStructure();
@@ -5095,12 +3592,10 @@ class LobbyModal {
5095
3592
  lastElement.focus();
5096
3593
  }
5097
3594
  }
5098
- else {
3595
+ else if (activeElement === lastElement) {
5099
3596
  // TAB pressed - move forwards
5100
- if (activeElement === lastElement) {
5101
- event.preventDefault();
5102
- firstElement.focus();
5103
- }
3597
+ event.preventDefault();
3598
+ firstElement.focus();
5104
3599
  }
5105
3600
  }
5106
3601
  };
@@ -5145,11 +3640,6 @@ class LobbyModal {
5145
3640
  this.stopActivityAnimation();
5146
3641
  // Remove keyboard event listeners
5147
3642
  this.removeKeyboardAccessibility();
5148
- // // Unsubscribe from socket events and group - testing out flow will remove once we have conviction
5149
- // this.unsubscribeFromSocketEvents();
5150
- // if (this.socketManager && this.currentGroupId) {
5151
- // this.socketManager.unsubscribeFromGroup(this.currentGroupId);
5152
- // }
5153
3643
  // Remove modal from DOM
5154
3644
  document.body.removeChild(this.modalElement);
5155
3645
  this.modalElement = null;
@@ -5336,8 +3826,8 @@ class LobbyModal {
5336
3826
  "orange",
5337
3827
  ];
5338
3828
  const randomColor = colors[Math.floor(Math.random() * colors.length)];
5339
- let emoji = "👤";
5340
- let action = "joined the group";
3829
+ let emoji;
3830
+ let action;
5341
3831
  switch (eventType) {
5342
3832
  case "group:member:joined":
5343
3833
  emoji = "👤";
@@ -5412,11 +3902,6 @@ class LobbyModal {
5412
3902
  }
5413
3903
  }
5414
3904
  }
5415
- /**
5416
- * Inject lobby styles into the document head
5417
- * This is called once when the first lobby modal is created
5418
- */
5419
- LobbyModal.stylesInjected = false;
5420
3905
 
5421
3906
  /**
5422
3907
  * Offline Redemption Modal
@@ -5975,7 +4460,7 @@ class WidgetRoot {
5975
4460
  }
5976
4461
  else if (this.currentGroupData) {
5977
4462
  // Check if data actually changed using participant count
5978
- const currentParticipants = groupContainer.getAttribute("data-participants");
4463
+ const currentParticipants = groupContainer.dataset.participants;
5979
4464
  const newParticipants = String(this.currentGroupData.participants_count || 0);
5980
4465
  if (currentParticipants !== newParticipants) {
5981
4466
  // Data changed, re-render
@@ -5983,7 +4468,7 @@ class WidgetRoot {
5983
4468
  const groupEl = this.renderGroupInfo();
5984
4469
  if (groupEl) {
5985
4470
  // Store current participants for next diff
5986
- groupContainer.setAttribute("data-participants", newParticipants);
4471
+ groupContainer.dataset.participants = newParticipants;
5987
4472
  groupContainer.style.display = "";
5988
4473
  groupContainer.appendChild(groupEl);
5989
4474
  }
@@ -6099,8 +4584,8 @@ class WidgetRoot {
6099
4584
  // Match static HTML structure: cobuy-progress container
6100
4585
  const root = document.createElement("div");
6101
4586
  root.className = "cobuy-progress";
6102
- root.setAttribute("data-current", String(participants));
6103
- root.setAttribute("data-target", String(max));
4587
+ root.dataset.current = String(participants);
4588
+ root.dataset.target = String(max);
6104
4589
  // Progress header with two spans
6105
4590
  const header = document.createElement("div");
6106
4591
  header.className = "progress-header";
@@ -6124,7 +4609,7 @@ class WidgetRoot {
6124
4609
  const expiry = Date.parse(data.expiry_at);
6125
4610
  this.updateTimer(progressText, expiry, remaining);
6126
4611
  const interval = window.setInterval(() => this.updateTimer(progressText, expiry, remaining), 1000);
6127
- progressText.setAttribute("data-timer-id", String(interval));
4612
+ progressText.dataset.timerId = String(interval);
6128
4613
  root.appendChild(header);
6129
4614
  root.appendChild(progressBar);
6130
4615
  // Create footer with timer on left and View all Groups link on right
@@ -6298,7 +4783,7 @@ class WidgetRoot {
6298
4783
  totalMembers: joinData.group.max_participants,
6299
4784
  timeLeft: joinData.group.timeLeftSeconds,
6300
4785
  };
6301
- const lobbyModal = new LobbyModal(lobbyData, {}, null, null, null, this.config.debug);
4786
+ const lobbyModal = new LobbyModal(lobbyData, {}, null, null, this.config.debug);
6302
4787
  lobbyModal.open(joinData.group.id);
6303
4788
  });
6304
4789
  // Set callback for viewing progress on already joined group
@@ -6315,7 +4800,7 @@ class WidgetRoot {
6315
4800
  currentMembers: groupData.joined,
6316
4801
  totalMembers: groupData.total,
6317
4802
  };
6318
- const lobbyModal = new LobbyModal(lobbyData, {}, null, null, null, this.config.debug);
4803
+ const lobbyModal = new LobbyModal(lobbyData, {}, null, null, this.config.debug);
6319
4804
  lobbyModal.open(groupId);
6320
4805
  });
6321
4806
  }
@@ -6431,7 +4916,7 @@ class WidgetRoot {
6431
4916
  // Listen for realtime fulfillment updates once per page
6432
4917
  this.subscribeToSocketEvents();
6433
4918
  // Host safety + idempotency markers
6434
- container.setAttribute("data-cobuy-mounted", "true");
4919
+ container.dataset.cobuyMounted = "true";
6435
4920
  container.style.maxWidth = "100%";
6436
4921
  container.style.width = "100%";
6437
4922
  container.style.boxSizing = "border-box";
@@ -6967,29 +5452,6 @@ class WidgetRoot {
6967
5452
  rewardLine.style.opacity = "0";
6968
5453
  rewardLine.style.animation =
6969
5454
  "cobuy-fadeIn var(--cobuy-animation-duration, 300ms) var(--cobuy-animation-easing, ease-out) forwards";
6970
- // if (isFulfilled) {
6971
- // const rewardText = this.formatRewardText(activeReward);
6972
- // rewardLine.textContent = rewardText
6973
- // ? `Reward available: ${rewardText}`
6974
- // : "Reward available for this group";
6975
- // rewardLine.setAttribute(
6976
- // "aria-label",
6977
- // rewardText ? `Reward locked in: ${rewardText}` : "Reward available for this group",
6978
- // );
6979
- // rewardLine.title = rewardLine.textContent;
6980
- // } else if (activeReward) {
6981
- // const rewardText = this.formatRewardText(activeReward);
6982
- // rewardLine.textContent = rewardText
6983
- // ? `Save up to ${rewardText} with CoBuy`
6984
- // : "CoBuy reward available";
6985
- // rewardLine.setAttribute("aria-label", `Eligible for CoBuy reward: ${rewardLine.textContent}`);
6986
- // rewardLine.title = rewardLine.textContent;
6987
- // } else {
6988
- // rewardLine.textContent = "CoBuy offer loading or unavailable";
6989
- // rewardLine.setAttribute("aria-label", "CoBuy offer loading or unavailable");
6990
- // rewardLine.title = "CoBuy offer loading or unavailable";
6991
- // rewardLine.style.color = "#6b7280";
6992
- // }
6993
5455
  sections.reward = rewardLine;
6994
5456
  // Button - semantic button element with accessibility
6995
5457
  const button = document.createElement("button");
@@ -13910,7 +12372,7 @@ class CoBuy {
13910
12372
  }
13911
12373
  try {
13912
12374
  const botd = await load();
13913
- const result = (await botd.detect());
12375
+ const result = botd.detect();
13914
12376
  const score = typeof result.score === "number" ? result.score : result.bot ? 1 : 0;
13915
12377
  this.botdScore = score;
13916
12378
  if (this.apiClient) {
@@ -14310,7 +12772,7 @@ class CoBuy {
14310
12772
  },
14311
12773
  onCopyLink: options.onCopyLink,
14312
12774
  onShare: options.onShare,
14313
- }, this.apiClient, this.analyticsClient, this.socketManager, config.debug);
12775
+ }, this.apiClient, this.socketManager, config.debug);
14314
12776
  // Store in map for persistence
14315
12777
  this.modals.set(modalKey, modal);
14316
12778
  // Maintain backward compatibility