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