@saasquatch/squatch-js 2.8.2-2 → 2.8.2-20

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.
@@ -1108,366 +1108,89 @@ function delay(duration) {
1108
1108
  setTimeout(resolve, duration);
1109
1109
  });
1110
1110
  }
1111
- const getSkeleton = ({
1112
- height = "500px",
1113
- skeletonBackgroundColor = "#e0e0e0",
1114
- skeletonShimmerColor = "#f5f5f5",
1115
- borderColor = "#ccc"
1116
- }) => {
1117
- return `
1118
- <style>
1119
- * {
1120
- box-sizing: border-box;
1121
- padding: 0;
1122
- margin: 0;
1123
- }
1124
-
1125
- .widget-container {
1126
- background: white;
1127
- width: 100%;
1128
- max-width: 900px;
1129
- padding: 40px;
1130
- border-radius: 12px;
1131
- box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
1132
- box-sizing: border-box;
1133
- }
1134
-
1135
- @keyframes shimmer {
1136
- 0% {
1137
- background-position: -100% 0;
1138
- }
1139
- 100% {
1140
- background-position: 100% 0;
1141
- }
1142
- }
1143
-
1144
- .skeleton {
1145
- background: ${skeletonBackgroundColor};
1146
- background: linear-gradient(
1147
- 90deg,
1148
- ${skeletonBackgroundColor} 25%,
1149
- ${skeletonShimmerColor} 50%,
1150
- ${skeletonBackgroundColor} 75%
1151
- );
1152
- background-size: 200% 100%;
1153
- animation: shimmer 1.5s infinite linear;
1154
- border-radius: 6px;
1155
- margin-bottom: 12px;
1156
- }
1157
-
1158
- .sk-title-lg {
1159
- height: 36px;
1160
- width: 50%;
1161
- margin-bottom: 16px;
1162
- }
1163
- .sk-title-md {
1164
- height: 28px;
1165
- width: 30%;
1166
- margin-bottom: 20px;
1167
- margin-top: 40px;
1168
- }
1169
- .sk-text {
1170
- height: 16px;
1171
- width: 80%;
1172
- margin-bottom: 8px;
1173
- }
1174
- .sk-text-short {
1175
- width: 40%;
1176
- }
1177
- .sk-label {
1178
- height: 14px;
1179
- width: 25%;
1180
- margin-bottom: 10px;
1181
- }
1182
-
1183
- .hero-section {
1184
- display: flex;
1185
- gap: 40px;
1186
- margin-bottom: 40px;
1187
- border-bottom: 1px solid ${borderColor};
1188
- padding-bottom: 40px;
1189
- flex-direction: row;
1190
- }
1191
- .hero-content {
1192
- flex: 1;
1193
- display: flex;
1194
- flex-direction: column;
1195
- justify-content: center;
1196
- }
1197
- .hero-image {
1198
- flex: 1;
1199
- height: 300px;
1200
- border-radius: 12px;
1201
- }
1202
-
1203
- .share-section {
1204
- margin-bottom: 40px;
1205
- }
1206
- .sk-input {
1207
- height: 50px;
1208
- width: 100%;
1209
- border-radius: 8px;
1210
- margin-bottom: 16px;
1211
- }
1212
- .social-buttons {
1213
- display: flex;
1214
- gap: 12px;
1215
- }
1216
- .sk-btn-social {
1217
- flex: 1;
1218
- height: 50px;
1219
- border-radius: 8px;
1220
- }
1221
-
1222
- .stats-section {
1223
- display: flex;
1224
- gap: 24px;
1225
- margin-bottom: 40px;
1226
- padding: 30px 0;
1227
- border-top: 1px solid ${borderColor};
1228
- border-bottom: 1px solid ${borderColor};
1229
- }
1230
- .stat-card {
1231
- flex: 1;
1232
- display: flex;
1233
- flex-direction: column;
1234
- align-items: center;
1235
- }
1236
- .stat-divider {
1237
- padding-left: 24px;
1238
- }
1239
-
1240
- .sk-stat-num {
1241
- height: 48px;
1242
- width: 120px;
1243
- margin-bottom: 8px;
1244
- }
1245
- .sk-stat-label {
1246
- height: 18px;
1247
- width: 80px;
1248
- }
1249
-
1250
- .table-header {
1251
- display: flex;
1252
- gap: 16px;
1253
- margin-bottom: 16px;
1254
- }
1255
- .sk-th {
1256
- height: 16px;
1257
- }
1258
- .table-row {
1259
- display: flex;
1260
- align-items: center;
1261
- gap: 16px;
1262
- padding: 16px 0;
1263
- border-bottom: 1px solid ${borderColor};
1264
- }
1265
-
1266
- .col-user {
1267
- flex: 2;
1268
- }
1269
- .col-status {
1270
- flex: 1;
1271
- }
1272
- .col-reward {
1273
- flex: 2;
1274
- }
1275
- .col-date {
1276
- flex: 1;
1277
- }
1278
-
1279
- .sk-badge {
1280
- height: 28px;
1281
- width: 90px;
1282
- border-radius: 14px;
1283
- }
1284
- .sk-reward-block {
1285
- height: 36px;
1286
- width: 100%;
1287
- border-radius: 6px;
1288
- }
1289
-
1290
- .pagination {
1291
- display: flex;
1292
- justify-content: flex-end;
1293
- gap: 8px;
1294
- margin-top: 24px;
1295
- }
1296
- .sk-btn-page {
1297
- height: 36px;
1298
- width: 64px;
1299
- border-radius: 6px;
1300
- margin-bottom: 0;
1301
- }
1302
-
1303
- @media (max-width: 768px) {
1304
- body {
1305
- padding: 20px;
1306
- }
1307
- .widget-container {
1308
- padding: 24px;
1309
- }
1310
-
1311
- .hero-section {
1312
- flex-direction: column-reverse;
1313
- gap: 24px;
1314
- }
1315
- .hero-image {
1316
- height: 220px;
1317
- width: 100%;
1318
- }
1319
- .sk-title-lg {
1320
- width: 80%;
1321
- }
1322
-
1323
- .col-date {
1324
- display: none;
1325
- }
1326
- }
1327
-
1328
- @media (max-width: 480px) {
1329
- body {
1330
- padding: 10px;
1331
- }
1332
- .widget-container {
1333
- padding: 16px;
1334
- }
1335
-
1336
- .sk-stat-num {
1337
- width: 80px;
1338
- height: 40px;
1339
- }
1340
-
1341
- .col-reward {
1342
- display: none;
1343
- }
1344
-
1345
- .col-user {
1346
- flex: 3;
1347
- }
1348
- .col-status {
1349
- flex: 2;
1350
- display: flex;
1351
- justify-content: flex-end;
1352
- }
1353
- }
1354
- </style>
1355
-
1356
- <div class="widget-container">
1357
- <div class="hero-section">
1358
- <div class="hero-content">
1359
- <div class="skeleton sk-title-lg"></div>
1360
- <div class="skeleton sk-text"></div>
1361
- <div class="skeleton sk-text sk-text-short"></div>
1362
- </div>
1363
- <div class="skeleton hero-image"></div>
1364
- </div>
1365
-
1366
- <div class="share-section">
1367
- <div class="skeleton sk-label"></div>
1368
- <div class="skeleton sk-input"></div>
1369
- <div class="social-buttons">
1370
- <div class="skeleton sk-btn-social"></div>
1371
- <div class="skeleton sk-btn-social"></div>
1372
- <div class="skeleton sk-btn-social"></div>
1373
- <div class="skeleton sk-btn-social"></div>
1374
- </div>
1375
- </div>
1376
-
1377
- <div
1378
- class="skeleton sk-title-md"
1379
- style="margin-top: 0; width: 30%; margin-left: auto; margin-right: auto"
1380
- ></div>
1381
- <div
1382
- class="skeleton sk-text"
1383
- style="width: 60%; margin-left: auto; margin-right: auto"
1384
- ></div>
1385
-
1386
- <div class="stats-section">
1387
- <div class="stat-card">
1388
- <div class="skeleton sk-stat-num"></div>
1389
- <div class="skeleton sk-stat-label"></div>
1390
- </div>
1391
- <div class="stat-card stat-divider">
1392
- <div class="skeleton sk-stat-num"></div>
1393
- <div class="skeleton sk-stat-label"></div>
1394
- </div>
1395
- </div>
1396
-
1397
- <div class="skeleton sk-title-md"></div>
1398
-
1399
- <div class="table-header">
1400
- <div class="skeleton sk-th col-user"></div>
1401
- <div class="skeleton sk-th col-status"></div>
1402
- <div class="skeleton sk-th col-reward"></div>
1403
- <div class="skeleton sk-th col-date"></div>
1404
- </div>
1405
-
1406
- <div class="table-row">
1407
- <div class="col-user">
1408
- <div class="skeleton sk-text" style="width: 70%; margin: 0"></div>
1409
- </div>
1410
- <div class="col-status">
1411
- <div class="skeleton sk-badge" style="margin: 0"></div>
1412
- </div>
1413
- <div class="col-reward">
1414
- <div class="skeleton sk-reward-block" style="margin: 0"></div>
1415
- </div>
1416
- <div class="col-date">
1417
- <div class="skeleton sk-text" style="width: 80%; margin: 0"></div>
1418
- </div>
1419
- </div>
1420
- <div class="table-row">
1421
- <div class="col-user">
1422
- <div class="skeleton sk-text" style="width: 60%; margin: 0"></div>
1423
- </div>
1424
- <div class="col-status">
1425
- <div class="skeleton sk-badge" style="margin: 0"></div>
1426
- </div>
1427
- <div class="col-reward">
1428
- <div class="skeleton sk-reward-block" style="margin: 0"></div>
1429
- </div>
1430
- <div class="col-date">
1431
- <div class="skeleton sk-text" style="width: 80%; margin: 0"></div>
1432
- </div>
1433
- </div>
1434
- <div class="table-row">
1435
- <div class="col-user">
1436
- <div class="skeleton sk-text" style="width: 75%; margin: 0"></div>
1437
- </div>
1438
- <div class="col-status">
1439
- <div class="skeleton sk-badge" style="margin: 0"></div>
1440
- </div>
1441
- <div class="col-reward">
1442
- <div class="skeleton sk-reward-block" style="margin: 0"></div>
1443
- </div>
1444
- <div class="col-date">
1445
- <div class="skeleton sk-text" style="width: 80%; margin: 0"></div>
1446
- </div>
1447
- </div>
1448
-
1449
- <div class="pagination">
1450
- <div class="skeleton sk-btn-page"></div>
1451
- <div class="skeleton sk-btn-page"></div>
1452
- </div>
1453
- </div>
1454
- `;
1455
- };
1456
1111
  const _log$7 = browserExports.debug("squatch-js:EMBEDwidget");
1457
1112
  class EmbedWidget extends Widget {
1458
1113
  constructor(params, container) {
1459
1114
  super(params);
1460
1115
  __publicField(this, "show", this.open);
1461
1116
  __publicField(this, "hide", this.close);
1462
- if (container) this.container = container;
1463
- }
1117
+ if (container) {
1118
+ this.container = container;
1119
+ }
1120
+ }
1121
+ //Old code for testing
1122
+ // async load() {
1123
+ // const brandingConfig = this.context.widgetConfig?.values?.brandingConfig;
1124
+ // const sizes = brandingConfig?.widgetSize?.embeddedWidgets;
1125
+ // const maxWidth = sizes?.maxWidth ? formatWidth(sizes.maxWidth) : "";
1126
+ // const minWidth = sizes?.minWidth ? formatWidth(sizes.minWidth) : "";
1127
+ // const frame = this._createFrame({ minWidth, maxWidth });
1128
+ // const element = this._findElement();
1129
+ // if (this.context?.container) {
1130
+ // // Custom container is used
1131
+ // element.style.visibility = "hidden";
1132
+ // element.style.height = "0";
1133
+ // element.style["overflow-y"] = "hidden";
1134
+ // }
1135
+ // if (this.container) {
1136
+ // if (element.shadowRoot) {
1137
+ // if (element.shadowRoot.lastChild?.nodeName === "IFRAME") {
1138
+ // element.shadowRoot.replaceChild(frame, element.shadowRoot.lastChild);
1139
+ // } else {
1140
+ // element.shadowRoot.appendChild(frame);
1141
+ // }
1142
+ // }
1143
+ // // Widget reloaded - replace existing element
1144
+ // else if (element.firstChild) {
1145
+ // element.replaceChild(frame, element.firstChild);
1146
+ // // Add iframe for the first time
1147
+ // } else {
1148
+ // element.appendChild(frame);
1149
+ // }
1150
+ // } else if (!element.firstChild || element.firstChild.nodeName === "#text") {
1151
+ // element.appendChild(frame);
1152
+ // }
1153
+ // const { contentWindow } = frame;
1154
+ // if (!contentWindow) {
1155
+ // throw new Error("Frame needs a content window");
1156
+ // }
1157
+ // const frameDoc = contentWindow.document;
1158
+ // frameDoc.open();
1159
+ // frameDoc.write(this.content);
1160
+ // frameDoc.write(
1161
+ // `<script src="${this.npmCdn}/resize-observer-polyfill@1.5.x"><\/script>`
1162
+ // );
1163
+ // frameDoc.close();
1164
+ // domready(frameDoc, async () => {
1165
+ // const _sqh = contentWindow.squatch || contentWindow.widgetIdent;
1166
+ // // @ts-ignore -- number will be cast to string by browsers
1167
+ // frame.height = frameDoc.body.scrollHeight;
1168
+ // // Adjust frame height when size of body changes
1169
+ // /* istanbul ignore next: hard to test */
1170
+ // const ro = new contentWindow["ResizeObserver"]((entries) => {
1171
+ // for (const entry of entries) {
1172
+ // const { height } = entry.contentRect;
1173
+ // // @ts-ignore -- number will be cast to string by browsers
1174
+ // frame.height = height;
1175
+ // }
1176
+ // });
1177
+ // const container = await this._findInnerContainer(frame);
1178
+ // ro.observe(container);
1179
+ // if (this._shouldFireLoadEvent()) {
1180
+ // this._loadEvent(_sqh);
1181
+ // _log("loaded");
1182
+ // } else if (frameDoc) {
1183
+ // this._attachLoadEventListener(frameDoc, _sqh);
1184
+ // }
1185
+ // });
1186
+ // }
1464
1187
  async load() {
1465
1188
  var _a2, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
1466
1189
  const brandingConfig = (_b = (_a2 = this.context.widgetConfig) == null ? void 0 : _a2.values) == null ? void 0 : _b.brandingConfig;
1467
1190
  const initialHeight = brandingConfig == null ? void 0 : brandingConfig.loadingHeight;
1468
- const skeletonBackgroundColor = (_d = (_c = brandingConfig == null ? void 0 : brandingConfig.color) == null ? void 0 : _c.loadingSkeleton) == null ? void 0 : _d.background;
1469
- const skeletonShimmerColor = (_f = (_e = brandingConfig == null ? void 0 : brandingConfig.color) == null ? void 0 : _e.loadingSkeleton) == null ? void 0 : _f.animationBackground;
1470
- const borderColor = (_g = brandingConfig == null ? void 0 : brandingConfig.border) == null ? void 0 : _g.borderColor;
1191
+ (_d = (_c = brandingConfig == null ? void 0 : brandingConfig.color) == null ? void 0 : _c.loadingSkeleton) == null ? void 0 : _d.background;
1192
+ (_f = (_e = brandingConfig == null ? void 0 : brandingConfig.color) == null ? void 0 : _e.loadingSkeleton) == null ? void 0 : _f.animationBackground;
1193
+ (_g = brandingConfig == null ? void 0 : brandingConfig.border) == null ? void 0 : _g.borderColor;
1471
1194
  const sizes = (_h = brandingConfig == null ? void 0 : brandingConfig.widgetSize) == null ? void 0 : _h.embeddedWidgets;
1472
1195
  const maxWidth = (sizes == null ? void 0 : sizes.maxWidth) ? formatWidth(sizes.maxWidth) : "";
1473
1196
  const minWidth = (sizes == null ? void 0 : sizes.minWidth) ? formatWidth(sizes.minWidth) : "";
@@ -1476,25 +1199,12 @@ class EmbedWidget extends Widget {
1476
1199
  initialHeight,
1477
1200
  widgetConfig: this.context.widgetConfig
1478
1201
  });
1479
- const skeletonHTML = getSkeleton({
1480
- height: initialHeight,
1481
- skeletonBackgroundColor,
1482
- skeletonShimmerColor,
1483
- borderColor
1484
- });
1485
- const skeletonContainer = document.createElement("div");
1486
- skeletonContainer.innerHTML = skeletonHTML;
1487
1202
  const frame = this._createFrame({
1488
1203
  minWidth,
1489
1204
  maxWidth,
1490
1205
  initialHeight
1491
1206
  });
1492
1207
  const element = this._findElement();
1493
- frame.style.display = "none";
1494
- const injectContents = (target) => {
1495
- target.appendChild(skeletonContainer);
1496
- target.appendChild(frame);
1497
- };
1498
1208
  if ((_i = this.context) == null ? void 0 : _i.container) {
1499
1209
  element.style.visibility = "hidden";
1500
1210
  element.style.height = "0";
@@ -1505,16 +1215,15 @@ class EmbedWidget extends Widget {
1505
1215
  if (((_j = element.shadowRoot.lastChild) == null ? void 0 : _j.nodeName) === "IFRAME") {
1506
1216
  element.shadowRoot.replaceChild(frame, element.shadowRoot.lastChild);
1507
1217
  } else {
1508
- injectContents(element.shadowRoot);
1218
+ element.shadowRoot.appendChild(frame);
1509
1219
  }
1510
1220
  } else if (element.firstChild) {
1511
- element.innerHTML = "";
1512
- injectContents(element);
1221
+ element.replaceChild(frame, element.firstChild);
1513
1222
  } else {
1514
- injectContents(element);
1223
+ element.appendChild(frame);
1515
1224
  }
1516
1225
  } else if (!element.firstChild || element.firstChild.nodeName === "#text") {
1517
- injectContents(element);
1226
+ element.appendChild(frame);
1518
1227
  }
1519
1228
  const { contentWindow } = frame;
1520
1229
  if (!contentWindow) {
@@ -1522,16 +1231,15 @@ class EmbedWidget extends Widget {
1522
1231
  }
1523
1232
  const frameDoc = contentWindow.document;
1524
1233
  frameDoc.open();
1525
- console.log({ content: this.content, context: this.context, this: this });
1526
1234
  const domain = this.widgetApi.domain;
1527
1235
  frameDoc.write(`
1528
- ${((_k = brandingConfig == null ? void 0 : brandingConfig.main) == null ? void 0 : _k.brandFont) && `
1236
+ ${((_k = brandingConfig == null ? void 0 : brandingConfig.main) == null ? void 0 : _k.brandFont) ? `
1529
1237
  <link rel="preconnect" href="https://fast${domain === "https://staging.referralsaasquatch.com" && "-staging"}.ssqt.io">
1530
1238
  <link rel="preconnect" href="https://fonts.gstatic.com">
1531
1239
  <link rel="preconnect" href="https://fonts.googleapis.com">
1532
1240
  <link rel="preload" href="https://fonts.googleapis.com/css2?family=${encodeURIComponent(
1533
1241
  (_l = brandingConfig == null ? void 0 : brandingConfig.main) == null ? void 0 : _l.brandFont
1534
- )}">`}
1242
+ )}" as="style">` : ""}
1535
1243
  <script src="${this.npmCdn}/resize-observer-polyfill@1.5.x"><\/script>
1536
1244
  <style data-styles>
1537
1245
  html { visibility:hidden;}
@@ -1541,10 +1249,6 @@ class EmbedWidget extends Widget {
1541
1249
  `);
1542
1250
  frameDoc.close();
1543
1251
  domready(frameDoc, async () => {
1544
- if (skeletonContainer && skeletonContainer.parentNode) {
1545
- skeletonContainer.parentNode.removeChild(skeletonContainer);
1546
- }
1547
- frame.style.display = "block";
1548
1252
  const _sqh = contentWindow.squatch || contentWindow.widgetIdent;
1549
1253
  frame.height = initialHeight || frameDoc.body.scrollHeight;
1550
1254
  console.log({ height: frameDoc.body.scrollHeight });
@@ -2462,12 +2166,24 @@ class DeclarativeEmbedWidget extends DeclarativeWidget {
2462
2166
  }
2463
2167
  }
2464
2168
  async connectedCallback() {
2465
- var _a2, _b;
2466
2169
  this.loaded = true;
2467
2170
  this.container = this.getAttribute("container");
2171
+ const skeletonHTML = `
2172
+ <div>
2173
+ <h1>Do I see this text ????</h1>
2174
+ </div>
2175
+ `;
2176
+ const skeletonContainer = document.createElement("div");
2177
+ skeletonContainer.id = "loading-skeleton";
2178
+ skeletonContainer.innerHTML = skeletonHTML;
2179
+ const root = this.shadowRoot || this.attachShadow({ mode: "open" });
2180
+ root.innerHTML = "";
2181
+ root.appendChild(skeletonContainer);
2468
2182
  await this.renderWidget();
2469
- const slot = (_a2 = this.shadowRoot && Array.from(this.shadowRoot.children)) == null ? void 0 : _a2.find((c) => c.tagName === "SLOT");
2470
- if (slot) (_b = this.shadowRoot) == null ? void 0 : _b.removeChild(slot);
2183
+ const loadingElement = root.getElementById("loading-skeleton");
2184
+ if (loadingElement) {
2185
+ loadingElement.remove();
2186
+ }
2471
2187
  if (this.getAttribute("open") !== null) this.open();
2472
2188
  }
2473
2189
  }
@@ -2494,9 +2210,29 @@ class DeclarativePopupWidget extends DeclarativeWidget {
2494
2210
  }
2495
2211
  }
2496
2212
  async connectedCallback() {
2213
+ var _a2;
2497
2214
  this.loaded = true;
2498
2215
  this.container = this.getAttribute("container");
2216
+ const skeletonHTML = `
2217
+ <div>
2218
+ <h1>Dynamic Content</h1>
2219
+ <p>This content was dynamically added to the widget before it loaded.</p>
2220
+ </div>
2221
+ `;
2222
+ const skeletonContainer = document.createElement("div");
2223
+ skeletonContainer.id = "loading-skeleton";
2224
+ skeletonContainer.innerHTML = skeletonHTML;
2225
+ if (!this.shadowRoot) {
2226
+ this.attachShadow({ mode: "open" });
2227
+ }
2228
+ if (this.shadowRoot) {
2229
+ this.shadowRoot.innerHTML = skeletonHTML;
2230
+ }
2499
2231
  await this.renderWidget();
2232
+ const loadingElement = (_a2 = this.shadowRoot) == null ? void 0 : _a2.getElementById("loading-skeleton");
2233
+ if (loadingElement) {
2234
+ loadingElement.remove();
2235
+ }
2500
2236
  if (this.getAttribute("open") !== null) this.open();
2501
2237
  }
2502
2238
  }