@guidelytech/guide-runtime 0.15.0 → 0.16.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.
- package/dist/capture.cjs +5 -0
- package/dist/capture.cjs.map +1 -1
- package/dist/capture.js +2 -2
- package/dist/{chunk-H3CROHPR.js → chunk-KEQ2VEEC.js} +2 -2
- package/dist/{chunk-VJSQM23R.js → chunk-KQGSHCNW.js} +6 -1
- package/dist/chunk-KQGSHCNW.js.map +1 -0
- package/dist/{chunk-VQJ7MZ2K.js → chunk-YU6SKJK4.js} +2 -2
- package/dist/index.cjs +100 -24
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +11 -4
- package/dist/index.d.ts +11 -4
- package/dist/index.js +76 -5
- package/dist/index.js.map +1 -1
- package/dist/messenger.js +2 -2
- package/package.json +4 -4
- package/dist/chunk-4FKYF6OB.js +0 -466
- package/dist/chunk-4FKYF6OB.js.map +0 -1
- package/dist/chunk-4UW6YF44.js +0 -464
- package/dist/chunk-4UW6YF44.js.map +0 -1
- package/dist/chunk-7DOGZKWD.js +0 -322
- package/dist/chunk-7DOGZKWD.js.map +0 -1
- package/dist/chunk-GUH2PQJ7.js +0 -462
- package/dist/chunk-GUH2PQJ7.js.map +0 -1
- package/dist/chunk-GUSKGNNR.js +0 -301
- package/dist/chunk-GUSKGNNR.js.map +0 -1
- package/dist/chunk-KJRXCITD.js +0 -515
- package/dist/chunk-KJRXCITD.js.map +0 -1
- package/dist/chunk-PG7CMBHD.js +0 -330
- package/dist/chunk-PG7CMBHD.js.map +0 -1
- package/dist/chunk-VJSQM23R.js.map +0 -1
- package/dist/chunk-VNJPNGZ4.js +0 -301
- package/dist/chunk-VNJPNGZ4.js.map +0 -1
- /package/dist/{chunk-H3CROHPR.js.map → chunk-KEQ2VEEC.js.map} +0 -0
- /package/dist/{chunk-VQJ7MZ2K.js.map → chunk-YU6SKJK4.js.map} +0 -0
package/dist/capture.js
CHANGED
|
@@ -3,10 +3,10 @@ import {
|
|
|
3
3
|
describeElement,
|
|
4
4
|
isGuidelyElement,
|
|
5
5
|
normalizeText
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-YU6SKJK4.js";
|
|
7
7
|
import {
|
|
8
8
|
createScope
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-KQGSHCNW.js";
|
|
10
10
|
|
|
11
11
|
// src/capture-styles.ts
|
|
12
12
|
var CAPTURE_STYLES = `
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
prefersReducedMotion
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-KQGSHCNW.js";
|
|
4
4
|
|
|
5
5
|
// src/sanitize.ts
|
|
6
6
|
import { EMBED_IFRAME_ATTRS, VIDEO_ATTRS, isAllowedEmbedSrc, isSafeMediaUrl } from "@guidelytech/shared/runtime";
|
|
@@ -582,4 +582,4 @@ export {
|
|
|
582
582
|
el,
|
|
583
583
|
createHelpView
|
|
584
584
|
};
|
|
585
|
-
//# sourceMappingURL=chunk-
|
|
585
|
+
//# sourceMappingURL=chunk-KEQ2VEEC.js.map
|
|
@@ -42,6 +42,11 @@ var STYLES = `
|
|
|
42
42
|
.g-close:hover,.g-close:focus-visible{background:var(--g-subtle);color:var(--g-text);outline:none}
|
|
43
43
|
.g-close:focus-visible,.g-btn:focus-visible,.g-task:focus-visible,.g-choice:focus-visible,.g-scale button:focus-visible,.g-launcher:focus-visible,.g-input:focus-visible,.g-rc-item:focus-visible{outline:2px solid var(--g-primary);outline-offset:2px}
|
|
44
44
|
.g-image{display:block;width:100%;max-height:220px;object-fit:cover;border-radius:var(--g-radius) var(--g-radius) 0 0}
|
|
45
|
+
.g-video{position:relative;display:block;width:100%;aspect-ratio:16/9;max-height:240px;overflow:hidden;background:#0f172a;border-radius:var(--g-radius) var(--g-radius) 0 0;cursor:pointer}
|
|
46
|
+
.g-video-poster{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block;pointer-events:none}
|
|
47
|
+
.g-video-play{position:absolute;left:50%;top:50%;width:56px;height:56px;margin:-28px 0 0 -28px;display:flex;align-items:center;justify-content:center;padding-left:3px;box-sizing:border-box;border-radius:999px;background:rgba(15,23,42,.72);color:#fff;box-shadow:0 4px 14px rgba(0,0,0,.3);transition:transform .15s ease,background .15s ease}
|
|
48
|
+
.g-video:hover .g-video-play,.g-video:focus-visible .g-video-play{transform:scale(1.08);background:var(--g-primary);color:var(--g-primary-text)}
|
|
49
|
+
.g-video:focus-visible{outline:2px solid var(--g-primary);outline-offset:-2px}
|
|
45
50
|
.g-title{margin:0 28px 6px 0;font-size:16px;font-weight:600;line-height:1.3}
|
|
46
51
|
.g-body{font-size:14px;color:var(--g-text)}
|
|
47
52
|
.g-body p{margin:0 0 8px}.g-body p:last-child{margin-bottom:0}
|
|
@@ -356,4 +361,4 @@ export {
|
|
|
356
361
|
applyTheme,
|
|
357
362
|
createScope
|
|
358
363
|
};
|
|
359
|
-
//# sourceMappingURL=chunk-
|
|
364
|
+
//# sourceMappingURL=chunk-KQGSHCNW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/styles.ts","../src/host.ts"],"sourcesContent":["/** All runtime CSS, injected once into the Shadow DOM host. Tokens are CSS custom properties. */\nexport const STYLES = `\n:host{all:initial;position:static;display:block;contain:none}\n*,*::before,*::after{box-sizing:border-box}\n.g-scope [hidden]{display:none!important}\n.g-scope{\n --g-primary:#4f46e5;--g-bg:#ffffff;--g-text:#111827;--g-radius:12px;--g-font:Inter,system-ui,-apple-system,sans-serif;--g-z:2147483000;--g-overlay:.5;\n --g-muted:color-mix(in srgb,var(--g-text) 62%,transparent);--g-border:color-mix(in srgb,var(--g-text) 12%,transparent);\n --g-subtle:color-mix(in srgb,var(--g-text) 5%,transparent);--g-shadow:0 10px 40px rgba(0,0,0,.18),0 2px 8px rgba(0,0,0,.08);\n --g-primary-text:#ffffff;\n font-family:var(--g-font);font-size:14px;line-height:1.5;color:var(--g-text);-webkit-font-smoothing:antialiased;\n}\n.g-scope[data-theme=\"dark\"]{--g-shadow:0 10px 40px rgba(0,0,0,.5),0 2px 8px rgba(0,0,0,.3)}\n.g-live{position:fixed;width:1px;height:1px;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}\n.g-layer{position:fixed;inset:0;z-index:var(--g-z);pointer-events:none}\n.g-overlay{position:fixed;inset:0;background:rgba(0,0,0,var(--g-overlay));z-index:calc(var(--g-z) + 3);pointer-events:auto}\n.g-overlay.g-transparent{background:transparent}\n.g-spot-rect{position:fixed;background:rgba(0,0,0,var(--g-overlay));z-index:calc(var(--g-z) + 3);pointer-events:auto}\n.g-spot-ring{position:fixed;z-index:calc(var(--g-z) + 3);pointer-events:none;border-radius:6px;box-shadow:0 0 0 2px var(--g-primary),0 0 0 6px color-mix(in srgb,var(--g-primary) 30%,transparent)}\n.g-card{\n position:fixed;z-index:calc(var(--g-z) + 4);pointer-events:auto;background:var(--g-bg);color:var(--g-text);border-radius:var(--g-radius);\n box-shadow:var(--g-shadow);border:1px solid var(--g-border);width:min(360px,calc(100vw - 32px));max-width:calc(100vw - 32px);max-height:calc(100vh - 32px);overflow:auto;outline:none;\n}\n.g-card.g-modal{left:50%;top:50%;transform:translate(-50%,-50%);width:min(480px,calc(100vw - 32px))}\n.g-card.g-tooltip,.g-card.g-popover,.g-card.g-spotlight-card,.g-card.g-hotspot-card{top:0;left:0;width:min(320px,calc(100vw - 32px))}\n.g-card.g-slideout{width:min(360px,calc(100vw - 32px));margin:16px}\n.g-pos-bottom-right{right:0;bottom:0}.g-pos-bottom-left{left:0;bottom:0}.g-pos-top-right{right:0;top:0}.g-pos-top-left{left:0;top:0}\n.g-pos-center{left:50%;top:50%;transform:translate(-50%,-50%)}\n.g-pos-top{top:0;left:0;right:0}.g-pos-bottom{bottom:0;left:0;right:0}\n.g-banner{position:fixed;left:0;right:0;z-index:calc(var(--g-z) + 1);pointer-events:auto;background:var(--g-primary);color:var(--g-primary-text);padding:10px 48px 10px 16px;display:flex;align-items:center;gap:12px;font-size:14px;box-shadow:0 2px 10px rgba(0,0,0,.15);max-width:100vw}\n.g-banner .g-body{flex:1;min-width:0}\n.g-banner .g-body a{color:inherit;text-decoration:underline}\n.g-banner .g-close{color:inherit;right:8px;top:50%;transform:translateY(-50%)}\n.g-banner .g-btn{background:rgba(255,255,255,.18);color:inherit;border-color:transparent;min-height:36px}\n.g-banner.g-pos-top{top:0}.g-banner.g-pos-bottom{bottom:0}\n.g-inner{padding:20px}\n.g-close{position:absolute;top:8px;right:8px;width:40px;height:40px;display:inline-flex;align-items:center;justify-content:center;border:0;background:transparent;color:var(--g-muted);border-radius:999px;cursor:pointer;font:inherit;font-size:20px;line-height:1}\n.g-close:hover,.g-close:focus-visible{background:var(--g-subtle);color:var(--g-text);outline:none}\n.g-close:focus-visible,.g-btn:focus-visible,.g-task:focus-visible,.g-choice:focus-visible,.g-scale button:focus-visible,.g-launcher:focus-visible,.g-input:focus-visible,.g-rc-item:focus-visible{outline:2px solid var(--g-primary);outline-offset:2px}\n.g-image{display:block;width:100%;max-height:220px;object-fit:cover;border-radius:var(--g-radius) var(--g-radius) 0 0}\n.g-video{position:relative;display:block;width:100%;aspect-ratio:16/9;max-height:240px;overflow:hidden;background:#0f172a;border-radius:var(--g-radius) var(--g-radius) 0 0;cursor:pointer}\n.g-video-poster{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block;pointer-events:none}\n.g-video-play{position:absolute;left:50%;top:50%;width:56px;height:56px;margin:-28px 0 0 -28px;display:flex;align-items:center;justify-content:center;padding-left:3px;box-sizing:border-box;border-radius:999px;background:rgba(15,23,42,.72);color:#fff;box-shadow:0 4px 14px rgba(0,0,0,.3);transition:transform .15s ease,background .15s ease}\n.g-video:hover .g-video-play,.g-video:focus-visible .g-video-play{transform:scale(1.08);background:var(--g-primary);color:var(--g-primary-text)}\n.g-video:focus-visible{outline:2px solid var(--g-primary);outline-offset:-2px}\n.g-title{margin:0 28px 6px 0;font-size:16px;font-weight:600;line-height:1.3}\n.g-body{font-size:14px;color:var(--g-text)}\n.g-body p{margin:0 0 8px}.g-body p:last-child{margin-bottom:0}\n.g-body ul,.g-body ol{margin:6px 0;padding-left:20px}\n.g-body a{color:var(--g-primary)}\n.g-body img{max-width:100%;height:auto;border-radius:6px}\n.g-body video,.g-body iframe{display:block;width:100%;max-width:100%;border:0;border-radius:6px;margin:8px 0;background:#000}\n.g-body video{height:auto;max-height:60vh}\n.g-body iframe{aspect-ratio:16/9;height:auto}\n.g-body .gd-pdf{margin:10px 0;border:1px solid var(--g-border);border-radius:10px;background:var(--g-subtle);overflow:hidden}\n.g-body a.gd-file{display:flex;align-items:center;gap:8px;padding:8px 10px;color:var(--g-text);font-size:13px;font-weight:500;text-decoration:none;min-height:40px;overflow-wrap:anywhere}\n.g-body a.gd-file::before{content:\"PDF\";flex:none;font-size:9px;font-weight:700;letter-spacing:.04em;line-height:1;color:#fff;background:#e5484d;border-radius:4px;padding:4px 5px}\n.g-body a.gd-file::after{content:\"⤢\";margin-left:auto;padding-left:8px;color:var(--g-muted);font-size:15px}\n.g-body a.gd-file:hover::after,.g-body a.gd-file:focus-visible::after{color:var(--g-primary)}\n.g-body a.gd-file:focus-visible{outline:2px solid var(--g-primary);outline-offset:-2px;border-radius:10px}\n.g-body > a.gd-file,.g-body p > a.gd-file{margin:10px 0;border:1px solid var(--g-border);border-radius:10px;background:var(--g-subtle)}\n.g-body > a.gd-file::after,.g-body p > a.gd-file::after,.g-body .gd-pdf:not([data-g-ready]) > a.gd-file::after{content:\"↗\"}\n.g-pdf-viewport{position:relative}\n.g-body .gd-pdf-pages{display:flex;gap:10px;overflow-x:auto;scroll-snap-type:x mandatory;overscroll-behavior-x:contain;scrollbar-width:none;padding:0 10px 10px;scroll-padding:0 10px}\n.g-body .gd-pdf-pages::-webkit-scrollbar{display:none}\n.g-body .gd-pdf-pages:focus-visible{outline:2px solid var(--g-primary);outline-offset:-2px}\n.g-body .gd-pdf-pages img{flex:0 0 100%;width:100%;height:auto;margin:0;scroll-snap-align:center;background:#fff;border-radius:4px;box-shadow:0 1px 3px rgba(0,0,0,.18);cursor:zoom-in}\n.g-pdf-viewport .gd-pdf-pages{padding:0;scroll-padding:0;margin:0 10px 10px}\n.g-pdf-count{position:absolute;right:18px;bottom:18px;padding:2px 8px;border-radius:999px;background:rgba(17,17,17,.72);color:#fff;font-size:11px;font-weight:500;pointer-events:none;font-variant-numeric:tabular-nums}\n.g-pdf-nav{position:absolute;top:calc(50% - 21px);width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;border:0;border-radius:999px;background:rgba(17,17,17,.6);color:#fff;font:inherit;font-size:20px;line-height:1;cursor:pointer;opacity:0;transition:opacity .15s}\n.g-pdf-prev{left:16px}.g-pdf-next{right:16px}\n.g-pdf-viewport:hover .g-pdf-nav,.g-pdf-nav:focus-visible{opacity:1}\n.g-pdf-nav:disabled,.g-pdf-single .g-pdf-nav,.g-pdf-single .g-pdf-count{display:none}\n.g-pdf-nav:focus-visible{outline:2px solid #fff;outline-offset:1px}\n@media (hover:none){.g-pdf-nav{display:none}}\n.g-pdf-reader{position:fixed;inset:0;z-index:calc(var(--g-z) + 10);display:flex;flex-direction:column;background:#0b0b0d;pointer-events:auto;color:#fff}\n.g-pdf-bar{display:flex;align-items:center;gap:10px;padding:8px 8px 8px 16px;min-height:56px}\n.g-pdf-title{flex:1;min-width:0;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.g-pdf-bar .g-btn{min-height:36px;color:#fff;background:rgba(255,255,255,.12);border-color:rgba(255,255,255,.18)}\n.g-pdf-close{position:static;color:#fff}\n.g-pdf-close:hover,.g-pdf-close:focus-visible{background:rgba(255,255,255,.14);color:#fff}\n.g-pdf-scroll{position:relative;flex:1;overflow-y:auto;overscroll-behavior:contain;padding:4px 16px 24px;display:flex;flex-direction:column;align-items:center;gap:12px;outline:none}\n.g-pdf-scroll img{display:block;width:100%;max-width:900px;height:auto;background:#fff;border-radius:2px;box-shadow:0 2px 12px rgba(0,0,0,.4)}\n.g-body code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px;background:var(--g-subtle);padding:1px 4px;border-radius:4px}\n.g-body pre{background:var(--g-subtle);padding:10px;border-radius:6px;overflow:auto}\n.g-body blockquote{margin:6px 0;padding-left:10px;border-left:3px solid var(--g-border);color:var(--g-muted)}\n.g-footer{display:flex;align-items:center;gap:8px;margin-top:14px;flex-wrap:wrap}\n.g-progress{font-size:12px;color:var(--g-muted);margin-right:auto}\n.g-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:40px;padding:8px 14px;border-radius:calc(var(--g-radius) * .66);border:1px solid transparent;font:inherit;font-size:14px;font-weight:500;cursor:pointer;text-decoration:none;transition:background .15s,color .15s,border-color .15s}\n.g-btn-primary{background:var(--g-primary);color:var(--g-primary-text)}\n.g-btn-primary:hover{filter:brightness(1.08)}\n.g-btn-secondary{background:var(--g-subtle);color:var(--g-text);border-color:var(--g-border)}\n.g-btn-secondary:hover{background:color-mix(in srgb,var(--g-text) 10%,transparent)}\n.g-btn-ghost{background:transparent;color:var(--g-muted)}\n.g-btn-ghost:hover{background:var(--g-subtle);color:var(--g-text)}\n.g-btn-link{background:transparent;color:var(--g-primary);padding-left:4px;padding-right:4px}\n.g-btn-link:hover{text-decoration:underline}\n.g-btn:disabled{opacity:.5;cursor:not-allowed}\n.g-arrow{position:absolute;width:12px;height:12px;background:var(--g-bg);transform:rotate(45deg);border:1px solid var(--g-border);z-index:-1}\n.g-hotspot{position:fixed;z-index:calc(var(--g-z) + 1);pointer-events:auto;border-radius:999px;background:var(--g-primary);border:2px solid #fff;box-shadow:0 0 0 2px color-mix(in srgb,var(--g-primary) 40%,transparent);cursor:pointer;padding:0;margin:0}\n.g-hotspot::after{content:\"\";position:absolute;inset:-4px;border-radius:999px;border:2px solid var(--g-primary);opacity:0}\n.g-hotspot.g-pulse::after{animation:g-pulse 1.8s ease-out infinite}\n.g-hotspot-hit{position:absolute;inset:-14px}\n.g-custom{position:fixed;z-index:calc(var(--g-z) + 4);pointer-events:auto;left:50%;top:50%;transform:translate(-50%,-50%);max-width:calc(100vw - 32px);max-height:calc(100vh - 32px);overflow:auto}\n/* animations */\n.g-scope[data-anim=\"fade\"] .g-card,.g-scope[data-anim=\"fade\"] .g-banner,.g-scope[data-anim=\"fade\"] .g-panel{animation:g-fade .18s ease-out}\n.g-scope[data-anim=\"slide\"] .g-card,.g-scope[data-anim=\"slide\"] .g-panel{animation:g-slide .22s ease-out}\n.g-scope[data-anim=\"none\"] *{animation:none!important;transition:none!important}\n@keyframes g-fade{from{opacity:0}to{opacity:1}}\n@keyframes g-slide{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}\n@keyframes g-pulse{0%{transform:scale(.6);opacity:.9}100%{transform:scale(2.2);opacity:0}}\n@media (prefers-reduced-motion:reduce){.g-scope *{animation:none!important;transition:none!important}}\n/* launcher + panel (checklist / resource center) */\n.g-launcher{position:fixed;z-index:calc(var(--g-z) + 1);pointer-events:auto;display:inline-flex;align-items:center;gap:8px;min-height:44px;padding:10px 16px;border-radius:999px;border:0;background:var(--g-primary);color:var(--g-primary-text);font:inherit;font-size:14px;font-weight:600;cursor:pointer;box-shadow:var(--g-shadow);margin:16px}\n.g-launcher .g-ring{width:22px;height:22px;border-radius:999px;background:conic-gradient(#fff var(--g-pct,0%),rgba(255,255,255,.3) 0);display:inline-flex;align-items:center;justify-content:center;font-size:10px;position:relative}\n.g-launcher .g-ring::after{content:\"\";position:absolute;inset:3px;border-radius:999px;background:var(--g-primary)}\n.g-launcher .g-count{position:relative;z-index:1}\n.g-panel{position:fixed;z-index:calc(var(--g-z) + 2);pointer-events:auto;width:min(380px,calc(100vw - 32px));max-height:min(620px,calc(100vh - 100px));display:flex;flex-direction:column;background:var(--g-bg);color:var(--g-text);border-radius:var(--g-radius);box-shadow:var(--g-shadow);border:1px solid var(--g-border);margin:16px;bottom:60px;overflow:hidden}\n.g-panel-head{padding:16px 48px 12px 20px;border-bottom:1px solid var(--g-border);position:relative}\n.g-panel-title{margin:0;font-size:16px;font-weight:600}\n.g-panel-sub{margin:4px 0 0;font-size:12px;color:var(--g-muted)}\n.g-panel-body{overflow:auto;padding:8px 0;flex:1}\n.g-help{display:flex;flex-direction:column;min-height:0;flex:1}\n.g-bar{height:6px;border-radius:999px;background:var(--g-subtle);overflow:hidden;margin-top:10px}\n.g-bar > span{display:block;height:100%;background:var(--g-primary);transition:width .3s}\n.g-task{display:flex;gap:12px;align-items:flex-start;width:100%;padding:12px 20px;border:0;background:transparent;text-align:left;font:inherit;color:inherit;cursor:pointer;min-height:44px}\n.g-task:hover{background:var(--g-subtle)}\n.g-task[disabled]{cursor:not-allowed;opacity:.55}\n.g-task .g-check{flex:none;width:22px;height:22px;border-radius:999px;border:2px solid var(--g-border);display:inline-flex;align-items:center;justify-content:center;font-size:13px;margin-top:1px;color:#fff}\n.g-task.g-done .g-check{background:var(--g-primary);border-color:var(--g-primary)}\n.g-task.g-done .g-task-title{text-decoration:line-through;color:var(--g-muted)}\n.g-task-title{font-weight:500}\n.g-task-desc{font-size:12px;color:var(--g-muted);margin-top:2px}\n.g-panel-foot{padding:10px 20px;border-top:1px solid var(--g-border);display:flex;justify-content:flex-end;gap:8px}\n.g-complete{padding:28px 20px;text-align:center}\n.g-complete .g-title{margin-right:0;font-size:18px}\n/* survey */\n.g-question{margin-bottom:16px}\n.g-q-title{font-weight:600;margin:0 0 4px}\n.g-q-desc{font-size:12px;color:var(--g-muted);margin:0 0 8px}\n.g-scale{display:flex;gap:4px;flex-wrap:wrap}\n.g-scale button{min-width:34px;height:40px;flex:1;padding:0 4px;border-radius:6px;border:1px solid var(--g-border);background:var(--g-subtle);color:var(--g-text);font:inherit;cursor:pointer}\n.g-scale button[aria-pressed=\"true\"],.g-scale button:hover{background:var(--g-primary);color:var(--g-primary-text);border-color:var(--g-primary)}\n.g-scale-labels{display:flex;justify-content:space-between;font-size:11px;color:var(--g-muted);margin-top:4px}\n.g-stars button,.g-thumbs button{font-size:22px;background:transparent;border:0;cursor:pointer;color:var(--g-muted);min-width:40px;height:40px;font:inherit}\n.g-stars button[aria-pressed=\"true\"],.g-stars button.g-on{color:#f59e0b}\n.g-thumbs button[aria-pressed=\"true\"]{color:var(--g-primary)}\n.g-choice{display:flex;align-items:center;gap:10px;padding:8px 10px;border:1px solid var(--g-border);border-radius:8px;margin-bottom:6px;cursor:pointer;min-height:40px;font:inherit;background:transparent;color:inherit;width:100%;text-align:left}\n.g-choice[aria-checked=\"true\"]{border-color:var(--g-primary);background:color-mix(in srgb,var(--g-primary) 8%,transparent)}\n.g-choice .g-dot{width:16px;height:16px;border-radius:999px;border:2px solid var(--g-border);flex:none}\n.g-choice.g-multi .g-dot{border-radius:4px}\n.g-choice[aria-checked=\"true\"] .g-dot{background:var(--g-primary);border-color:var(--g-primary)}\n.g-input{width:100%;min-height:40px;padding:8px 10px;border:1px solid var(--g-border);border-radius:8px;background:var(--g-bg);color:var(--g-text);font:inherit;resize:vertical}\n.g-error{color:#dc2626;font-size:12px;margin-top:4px}\n/* resource center */\n.g-rc-search{padding:12px 20px 4px}\n.g-rc-section{padding:8px 20px 4px;font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--g-muted);font-weight:600}\n.g-rc-section[data-depth]{text-transform:none;letter-spacing:0;font-size:12px}\n.g-rc-item{display:flex;align-items:flex-start;gap:10px;width:100%;padding:10px 20px;border:0;background:transparent;font:inherit;color:inherit;text-align:left;cursor:pointer;min-height:44px;text-decoration:none}\n.g-rc-item:hover{background:var(--g-subtle)}\n.g-rc-item .g-rc-title{font-weight:500}\n.g-rc-item .g-rc-sum{font-size:12px;color:var(--g-muted);margin-top:2px}\n.g-rc-item .g-rc-icon{flex:none;width:20px;text-align:center;color:var(--g-primary)}\n.g-rc-row{display:flex;align-items:center;gap:6px;padding-right:16px}\n.g-rc-row>.g-rc-item{flex:1;min-width:0;padding-right:4px}\n.g-rc-row:hover{background:var(--g-subtle)}\n.g-rc-row:hover>.g-rc-item{background:transparent}\n.g-rc-showme{flex:none;min-height:32px;padding:4px 10px;font-size:12px;white-space:nowrap}\n.g-help-showme{margin:4px 0 12px}\n.g-rc-article{padding:16px 20px}\n.g-resource-center .g-panel{transition:width .2s ease,max-height .2s ease}\n.g-resource-center .g-panel.g-panel-reading{width:min(720px,calc(100vw - 32px));max-height:calc(100vh - 100px)}\n.g-rc-back{margin-bottom:8px}\n.g-rc-empty{padding:24px 20px;color:var(--g-muted);text-align:center}\n.g-faq-a{padding:0 20px 12px 50px;font-size:13px;color:var(--g-muted)}\n.g-faq-a[hidden]{display:none}\n/* authoring */\n.g-auth-bar{position:fixed;top:0;left:0;right:0;z-index:calc(var(--g-z) + 10);pointer-events:auto;display:flex;align-items:center;gap:12px;padding:8px 16px;background:#111827;color:#fff;font:500 13px/1.4 var(--g-font);box-shadow:0 2px 10px rgba(0,0,0,.3)}\n.g-auth-bar .g-dot-live{width:8px;height:8px;border-radius:999px;background:#22c55e;box-shadow:0 0 0 3px rgba(34,197,94,.3)}\n.g-auth-bar .g-spacer{flex:1}\n.g-auth-bar .g-btn{min-height:32px;padding:4px 12px;font-size:13px}\n.g-auth-bar .g-btn-secondary{background:rgba(255,255,255,.12);color:#fff;border-color:transparent}\n.g-auth-outline{position:fixed;z-index:calc(var(--g-z) + 9);pointer-events:none;border:2px solid var(--g-primary);background:color-mix(in srgb,var(--g-primary) 12%,transparent);border-radius:4px;transition:all .06s linear}\n.g-auth-label{position:absolute;left:-2px;top:-24px;background:var(--g-primary);color:#fff;font:600 11px/1 var(--g-font);padding:5px 7px;border-radius:4px;white-space:nowrap;max-width:320px;overflow:hidden;text-overflow:ellipsis}\n.g-auth-outline.g-picked{border-style:dashed;border-color:#22c55e;background:rgba(34,197,94,.12)}\n.g-auth-outline.g-picked .g-auth-label{background:#16a34a}\n.g-highlight{position:fixed;z-index:calc(var(--g-z) + 8);pointer-events:none;border:2px dashed #f59e0b;background:rgba(245,158,11,.12);border-radius:4px}\n@media (max-width:480px){.g-card.g-modal,.g-panel{width:calc(100vw - 32px)}.g-inner{padding:16px}}\n/* resource center: unread badge + \"What's new\" */\n.g-launcher-badge{position:absolute;top:-4px;right:-4px;min-width:20px;height:20px;padding:0 6px;border-radius:999px;background:#dc2626;color:#fff;font-size:11px;font-weight:700;line-height:20px;text-align:center;box-shadow:0 0 0 2px var(--g-bg)}\n.g-rc-news{padding:10px 20px 12px;border-bottom:1px solid var(--g-border)}\n.g-rc-news:last-of-type{border-bottom:0}\n.g-rc-news-head{display:flex;align-items:baseline;gap:8px}\n.g-rc-news-title{margin:0;font-size:14px;font-weight:600;line-height:1.35;flex:1}\n.g-rc-news-new{flex:none;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--g-primary-text);background:var(--g-primary);border-radius:999px;padding:2px 7px}\n.g-rc-news-date{display:block;font-size:12px;color:var(--g-muted);margin:2px 0 6px}\n.g-rc-news-body{font-size:13px}\n.g-rc-news-actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:8px}\n.g-rc-news-actions .g-btn{min-height:32px;padding:6px 12px;font-size:13px}\n/* accessibility */\n.g-sr-only{position:absolute;width:1px;height:1px;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}\n.g-hotspot:focus-visible,.g-custom:focus-visible,.g-card:focus-visible{outline:2px solid var(--g-primary);outline-offset:2px}\n@media (forced-colors:active){.g-card,.g-panel,.g-banner{border:1px solid CanvasText}.g-btn{border:1px solid ButtonText}}\n`;\n","import type { Appearance, ProjectTheme } from \"@guidelytech/shared\";\nimport { readableTextOn, scopeCustomCss } from \"@guidelytech/shared/runtime\";\nimport { STYLES } from \"./styles\";\n\nexport const HOST_ID = \"guidely-root\";\n\nexport interface HostHandle {\n host: HTMLElement;\n shadow: ShadowRoot;\n /** Polite live region for screen-reader announcements. */\n live: HTMLElement;\n announce(text: string): void;\n destroy(): void;\n}\n\nlet current: HostHandle | null = null;\n\n/** Default project theme used when the config has not loaded yet. */\nexport const DEFAULT_THEME: ProjectTheme = {\n primaryColor: \"#4f46e5\",\n backgroundColor: \"#ffffff\",\n textColor: \"#111827\",\n borderRadius: 12,\n fontFamily: \"Inter, system-ui, -apple-system, sans-serif\",\n};\n\n/** Returns (creating when needed) the single Shadow-DOM host appended to `document.body`. */\nexport function ensureHost(doc: Document = document): HostHandle {\n if (current && current.host.isConnected && current.host.ownerDocument === doc) return current;\n let host = doc.getElementById(HOST_ID) as HTMLElement | null;\n if (!host) {\n host = doc.createElement(\"div\");\n host.id = HOST_ID;\n host.setAttribute(\"data-guidely\", \"\");\n (doc.body || doc.documentElement).appendChild(host);\n }\n const shadow = host.shadowRoot ?? host.attachShadow({ mode: \"open\" });\n if (!shadow.querySelector(\"style[data-g-base]\")) {\n const style = doc.createElement(\"style\");\n style.setAttribute(\"data-g-base\", \"\");\n style.textContent = STYLES;\n shadow.appendChild(style);\n }\n let live = shadow.querySelector<HTMLElement>(\".g-live\");\n if (!live) {\n live = doc.createElement(\"div\");\n live.className = \"g-live\";\n live.setAttribute(\"aria-live\", \"polite\");\n live.setAttribute(\"aria-atomic\", \"true\");\n shadow.appendChild(live);\n }\n const liveEl = live;\n current = {\n host,\n shadow,\n live: liveEl,\n announce(text: string) {\n liveEl.textContent = \"\";\n setTimeout(() => {\n liveEl.textContent = text;\n }, 30);\n },\n destroy() {\n host?.remove();\n if (current?.host === host) current = null;\n },\n };\n return current;\n}\n\n/** Removes the host from the document (all overlays with it). */\nexport function destroyHost(): void {\n current?.destroy();\n const stray = typeof document !== \"undefined\" ? document.getElementById(HOST_ID) : null;\n stray?.remove();\n current = null;\n}\n\nexport type ResolvedThemeMode = \"light\" | \"dark\";\n\nfunction prefersDark(): boolean {\n try {\n return typeof window !== \"undefined\" && typeof window.matchMedia === \"function\" && window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n } catch {\n return false;\n }\n}\n\nexport function prefersReducedMotion(): boolean {\n try {\n return typeof window !== \"undefined\" && typeof window.matchMedia === \"function\" && window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n } catch {\n return false;\n }\n}\n\nexport interface ThemeVars {\n primary: string;\n bg: string;\n text: string;\n radius: number;\n font: string;\n z: number;\n overlay: number;\n mode: ResolvedThemeMode;\n animation: Appearance[\"animation\"];\n}\n\n/** Merges project theme + guide appearance into CSS custom property values. */\nexport function resolveTheme(theme: Partial<ProjectTheme> | null | undefined, appearance?: Partial<Appearance> | null): ThemeVars {\n const t = { ...DEFAULT_THEME, ...(theme || {}) };\n const a = appearance || {};\n const requested = a.theme ?? \"auto\";\n const mode: ResolvedThemeMode = requested === \"auto\" ? (prefersDark() ? \"dark\" : \"light\") : requested;\n const dark = mode === \"dark\";\n return {\n primary: a.primaryColor || t.primaryColor,\n bg: a.backgroundColor || (dark ? \"#1f2937\" : t.backgroundColor),\n text: a.textColor || (dark ? \"#f9fafb\" : t.textColor),\n radius: a.borderRadius ?? t.borderRadius,\n font: a.fontFamily || t.fontFamily,\n z: a.zIndex ?? 2147483000,\n overlay: a.overlayOpacity ?? 0.5,\n mode,\n animation: prefersReducedMotion() ? \"none\" : (a.animation ?? \"fade\"),\n };\n}\n\n/** Applies theme variables to a scope element. */\nexport function applyTheme(el: HTMLElement, vars: ThemeVars): void {\n el.style.setProperty(\"--g-primary\", vars.primary);\n // Button labels, banners and badges on the primary colour use whichever of white or dark text reads better (WCAG AA).\n if (/^#[0-9a-f]{3}([0-9a-f]{3})?$/i.test(vars.primary)) el.style.setProperty(\"--g-primary-text\", readableTextOn(vars.primary));\n el.style.setProperty(\"--g-bg\", vars.bg);\n el.style.setProperty(\"--g-text\", vars.text);\n el.style.setProperty(\"--g-radius\", `${vars.radius}px`);\n el.style.setProperty(\"--g-font\", vars.font);\n el.style.setProperty(\"--g-z\", String(vars.z));\n el.style.setProperty(\"--g-overlay\", String(vars.overlay));\n el.setAttribute(\"data-theme\", vars.mode);\n el.setAttribute(\"data-anim\", vars.animation);\n}\n\n/**\n * Creates a themed scope container inside the shadow root. Each guide/widget renders inside its\n * own scope so appearance settings never leak between guides.\n */\nexport function createScope(theme?: Partial<ProjectTheme> | null, appearance?: Partial<Appearance> | null, doc: Document = document): { el: HTMLElement; vars: ThemeVars; destroy(): void } {\n const handle = ensureHost(doc);\n const el = doc.createElement(\"div\");\n el.className = \"g-scope\";\n const vars = resolveTheme(theme, appearance);\n applyTheme(el, vars);\n handle.shadow.appendChild(el);\n // Custom CSS (theme first, then the guide's) is sanitized and prefixed with this scope only. The\n // theme's CSS styles guides (scopes created with an appearance), not the resource center or messenger.\n const css = [appearance ? theme?.customCss : undefined, appearance?.customCss].filter((c): c is string => !!c && !!c.trim());\n let style: HTMLStyleElement | null = null;\n if (css.length) {\n const id = `c${++cssScopeSeq}`;\n el.setAttribute(\"data-g-css\", id);\n style = doc.createElement(\"style\");\n style.setAttribute(\"data-g-custom\", id);\n style.textContent = css.map((c) => scopeCustomCss(c, `.g-scope[data-g-css=\"${id}\"]`)).join(\"\\n\");\n handle.shadow.insertBefore(style, el);\n }\n let mq: MediaQueryList | null = null;\n const onChange = () => applyTheme(el, resolveTheme(theme, appearance));\n if ((appearance?.theme ?? \"auto\") === \"auto\" && typeof window !== \"undefined\" && typeof window.matchMedia === \"function\") {\n try {\n mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\n mq.addEventListener?.(\"change\", onChange);\n } catch {\n mq = null;\n }\n }\n return {\n el,\n vars,\n destroy() {\n mq?.removeEventListener?.(\"change\", onChange);\n style?.remove();\n el.remove();\n },\n };\n}\n\nlet cssScopeSeq = 0;\n"],"mappings":"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","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
__publicField
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-KQGSHCNW.js";
|
|
4
4
|
|
|
5
5
|
// src/selectors.ts
|
|
6
6
|
import { matchUrlPattern } from "@guidelytech/shared/runtime";
|
|
@@ -460,4 +460,4 @@ export {
|
|
|
460
460
|
componentAnchor,
|
|
461
461
|
describeElement
|
|
462
462
|
};
|
|
463
|
-
//# sourceMappingURL=chunk-
|
|
463
|
+
//# sourceMappingURL=chunk-YU6SKJK4.js.map
|
package/dist/index.cjs
CHANGED
|
@@ -44,9 +44,9 @@ __export(src_exports, {
|
|
|
44
44
|
generateSelectors: () => generateSelectors,
|
|
45
45
|
highlightSelectors: () => highlightSelectors,
|
|
46
46
|
isAnchoredStep: () => isAnchoredStep,
|
|
47
|
-
isChecklistComplete: () =>
|
|
47
|
+
isChecklistComplete: () => import_runtime8.isChecklistComplete,
|
|
48
48
|
isGuidelyElement: () => isGuidelyElement,
|
|
49
|
-
isQuestionVisible: () =>
|
|
49
|
+
isQuestionVisible: () => import_runtime9.isQuestionVisible,
|
|
50
50
|
isStableClass: () => isStableClass,
|
|
51
51
|
isStableId: () => isStableId,
|
|
52
52
|
isVisible: () => isVisible,
|
|
@@ -665,6 +665,11 @@ var STYLES = `
|
|
|
665
665
|
.g-close:hover,.g-close:focus-visible{background:var(--g-subtle);color:var(--g-text);outline:none}
|
|
666
666
|
.g-close:focus-visible,.g-btn:focus-visible,.g-task:focus-visible,.g-choice:focus-visible,.g-scale button:focus-visible,.g-launcher:focus-visible,.g-input:focus-visible,.g-rc-item:focus-visible{outline:2px solid var(--g-primary);outline-offset:2px}
|
|
667
667
|
.g-image{display:block;width:100%;max-height:220px;object-fit:cover;border-radius:var(--g-radius) var(--g-radius) 0 0}
|
|
668
|
+
.g-video{position:relative;display:block;width:100%;aspect-ratio:16/9;max-height:240px;overflow:hidden;background:#0f172a;border-radius:var(--g-radius) var(--g-radius) 0 0;cursor:pointer}
|
|
669
|
+
.g-video-poster{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block;pointer-events:none}
|
|
670
|
+
.g-video-play{position:absolute;left:50%;top:50%;width:56px;height:56px;margin:-28px 0 0 -28px;display:flex;align-items:center;justify-content:center;padding-left:3px;box-sizing:border-box;border-radius:999px;background:rgba(15,23,42,.72);color:#fff;box-shadow:0 4px 14px rgba(0,0,0,.3);transition:transform .15s ease,background .15s ease}
|
|
671
|
+
.g-video:hover .g-video-play,.g-video:focus-visible .g-video-play{transform:scale(1.08);background:var(--g-primary);color:var(--g-primary-text)}
|
|
672
|
+
.g-video:focus-visible{outline:2px solid var(--g-primary);outline-offset:-2px}
|
|
668
673
|
.g-title{margin:0 28px 6px 0;font-size:16px;font-weight:600;line-height:1.3}
|
|
669
674
|
.g-body{font-size:14px;color:var(--g-text)}
|
|
670
675
|
.g-body p{margin:0 0 8px}.g-body p:last-child{margin-bottom:0}
|
|
@@ -1191,6 +1196,7 @@ function trackRect(el2, cb) {
|
|
|
1191
1196
|
|
|
1192
1197
|
// src/render.ts
|
|
1193
1198
|
var import_shared = require("@guidelytech/shared");
|
|
1199
|
+
var import_runtime6 = require("@guidelytech/shared/runtime");
|
|
1194
1200
|
var FOCUSABLE = "button:not([disabled]),[href],input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex='-1'])";
|
|
1195
1201
|
var uid = 0;
|
|
1196
1202
|
var nextId = (p) => `g-${p}-${++uid}`;
|
|
@@ -1212,6 +1218,52 @@ function buildButtons(doc, step, canGoBack, onButton) {
|
|
|
1212
1218
|
return btn;
|
|
1213
1219
|
});
|
|
1214
1220
|
}
|
|
1221
|
+
var SVG_NS = "http://www.w3.org/2000/svg";
|
|
1222
|
+
function playIcon(doc) {
|
|
1223
|
+
const svg = doc.createElementNS(SVG_NS, "svg");
|
|
1224
|
+
svg.setAttribute("viewBox", "0 0 24 24");
|
|
1225
|
+
svg.setAttribute("width", "22");
|
|
1226
|
+
svg.setAttribute("height", "22");
|
|
1227
|
+
svg.setAttribute("aria-hidden", "true");
|
|
1228
|
+
const path = doc.createElementNS(SVG_NS, "path");
|
|
1229
|
+
path.setAttribute("fill", "currentColor");
|
|
1230
|
+
path.setAttribute("d", "M8 5.5v13a.75.75 0 0 0 1.14.64l10.4-6.5a.75.75 0 0 0 0-1.28L9.14 4.86A.75.75 0 0 0 8 5.5Z");
|
|
1231
|
+
svg.appendChild(path);
|
|
1232
|
+
return svg;
|
|
1233
|
+
}
|
|
1234
|
+
function buildVideo(doc, step, video, onVideo) {
|
|
1235
|
+
const a = h(doc, "a", "g-video");
|
|
1236
|
+
a.href = video.url;
|
|
1237
|
+
a.target = "_blank";
|
|
1238
|
+
a.rel = "noopener noreferrer";
|
|
1239
|
+
const opened = (e) => {
|
|
1240
|
+
if (e.type === "auxclick" && e.button !== 1) return;
|
|
1241
|
+
onVideo?.(video.url);
|
|
1242
|
+
};
|
|
1243
|
+
a.addEventListener("click", opened);
|
|
1244
|
+
a.addEventListener("auxclick", opened);
|
|
1245
|
+
a.setAttribute("aria-label", `${step.title ? `Play video: ${step.title}` : "Play video"} (opens in a new tab)`);
|
|
1246
|
+
if (video.poster) {
|
|
1247
|
+
const img = h(doc, "img", "g-video-poster");
|
|
1248
|
+
img.src = video.poster;
|
|
1249
|
+
img.alt = "";
|
|
1250
|
+
img.addEventListener("error", () => img.remove());
|
|
1251
|
+
a.appendChild(img);
|
|
1252
|
+
} else if ((0, import_runtime6.isVideoFileUrl)(video.url)) {
|
|
1253
|
+
const v = h(doc, "video", "g-video-poster");
|
|
1254
|
+
v.src = `${video.url}#t=0.1`;
|
|
1255
|
+
v.preload = "metadata";
|
|
1256
|
+
v.muted = true;
|
|
1257
|
+
v.playsInline = true;
|
|
1258
|
+
v.tabIndex = -1;
|
|
1259
|
+
v.setAttribute("aria-hidden", "true");
|
|
1260
|
+
a.appendChild(v);
|
|
1261
|
+
}
|
|
1262
|
+
const play = h(doc, "span", "g-video-play");
|
|
1263
|
+
play.appendChild(playIcon(doc));
|
|
1264
|
+
a.appendChild(play);
|
|
1265
|
+
return a;
|
|
1266
|
+
}
|
|
1215
1267
|
function buildCard(doc, opts, extraClass) {
|
|
1216
1268
|
const { step } = opts;
|
|
1217
1269
|
const card = h(doc, "div", `g-card ${extraClass}`);
|
|
@@ -1220,7 +1272,10 @@ function buildCard(doc, opts, extraClass) {
|
|
|
1220
1272
|
if (step.width) card.style.width = `min(${step.width}px, calc(100vw - 32px))`;
|
|
1221
1273
|
const titleId = nextId("title");
|
|
1222
1274
|
const bodyId = nextId("body");
|
|
1223
|
-
|
|
1275
|
+
const video = (0, import_runtime6.stepVideo)(step);
|
|
1276
|
+
if (video) {
|
|
1277
|
+
card.appendChild(buildVideo(doc, step, video, opts.onVideo));
|
|
1278
|
+
} else if (step.imageUrl) {
|
|
1224
1279
|
const img = h(doc, "img", "g-image");
|
|
1225
1280
|
img.src = step.imageUrl;
|
|
1226
1281
|
img.alt = step.imageAlt ?? "";
|
|
@@ -1623,7 +1678,7 @@ function isAnchoredStep(step) {
|
|
|
1623
1678
|
}
|
|
1624
1679
|
|
|
1625
1680
|
// src/controller.ts
|
|
1626
|
-
var
|
|
1681
|
+
var import_runtime7 = require("@guidelytech/shared/runtime");
|
|
1627
1682
|
function noop() {
|
|
1628
1683
|
}
|
|
1629
1684
|
var escapeHtml = (s) => s.replace(/[&<>"']/g, (c) => `&#${c.charCodeAt(0)};`);
|
|
@@ -1728,7 +1783,7 @@ function runGuide(guide, options = {}) {
|
|
|
1728
1783
|
const ctx = getCtx();
|
|
1729
1784
|
if (step && ctx) {
|
|
1730
1785
|
for (const branch of step.branches) {
|
|
1731
|
-
if ((0,
|
|
1786
|
+
if ((0, import_runtime7.evaluateRules)(branch.when, ctx)) {
|
|
1732
1787
|
target = steps.findIndex((s) => s.id === branch.goTo);
|
|
1733
1788
|
if (target >= 0) break;
|
|
1734
1789
|
}
|
|
@@ -1837,6 +1892,7 @@ function runGuide(guide, options = {}) {
|
|
|
1837
1892
|
const render = (step, target, asModal = false) => {
|
|
1838
1893
|
if (ended) return;
|
|
1839
1894
|
status = "running";
|
|
1895
|
+
const shownIndex = index;
|
|
1840
1896
|
const shown = !target && step.advanceOn === "element_click" && !step.advanceValue && !step.buttons.length ? { ...step, buttons: [{ id: "g-next", label: index + 1 >= total ? "Done" : "Next", action: index + 1 >= total ? "complete" : "next", variant: "primary" }] } : step;
|
|
1841
1897
|
try {
|
|
1842
1898
|
view = renderStep({
|
|
@@ -1849,6 +1905,7 @@ function runGuide(guide, options = {}) {
|
|
|
1849
1905
|
asModal,
|
|
1850
1906
|
onButton: handleButton,
|
|
1851
1907
|
onClose: () => end("dismissed"),
|
|
1908
|
+
onVideo: (url) => emit("guide_video_clicked", step, shownIndex, { videoUrl: url }),
|
|
1852
1909
|
announce,
|
|
1853
1910
|
runCode: options.runCode,
|
|
1854
1911
|
onError
|
|
@@ -1859,6 +1916,20 @@ function runGuide(guide, options = {}) {
|
|
|
1859
1916
|
if (index + 1 < total) return goNext();
|
|
1860
1917
|
return end("skipped");
|
|
1861
1918
|
}
|
|
1919
|
+
if (view && options.onAction) {
|
|
1920
|
+
const shownView = view;
|
|
1921
|
+
shownView.el.addEventListener("click", (e) => {
|
|
1922
|
+
const link = composedTarget(e)?.closest?.("a[href]");
|
|
1923
|
+
const articleId = (0, import_runtime7.articleIdFromHref)(link?.getAttribute("href"));
|
|
1924
|
+
if (!articleId) return;
|
|
1925
|
+
e.preventDefault();
|
|
1926
|
+
options.onAction?.("open_article", articleId);
|
|
1927
|
+
if (step.type === "modal" || step.type === "spotlight" || asModal || shownView.el.querySelector(".g-overlay, .g-spot-rect")) {
|
|
1928
|
+
completeStep();
|
|
1929
|
+
end(shownIndex + 1 >= total ? "completed" : "dismissed");
|
|
1930
|
+
}
|
|
1931
|
+
});
|
|
1932
|
+
}
|
|
1862
1933
|
if (!started) {
|
|
1863
1934
|
started = true;
|
|
1864
1935
|
emit("guide_started", step, index);
|
|
@@ -1877,6 +1948,7 @@ function runGuide(guide, options = {}) {
|
|
|
1877
1948
|
title: "Continue on another page",
|
|
1878
1949
|
body: `<p>The next step${step.title ? `, <strong>${escapeHtml(step.title)}</strong>,` : ""} is on <code>${escapeHtml(where)}</code>.</p>`,
|
|
1879
1950
|
imageUrl: "",
|
|
1951
|
+
videoUrl: "",
|
|
1880
1952
|
buttons: [
|
|
1881
1953
|
...href ? [{ id: "g-go", label: "Take me there", action: "url", value: href, variant: "primary" }] : [],
|
|
1882
1954
|
{ id: "g-exit", label: "Exit", action: "dismiss", variant: href ? "secondary" : "primary" }
|
|
@@ -1921,7 +1993,7 @@ function runGuide(guide, options = {}) {
|
|
|
1921
1993
|
index = i;
|
|
1922
1994
|
const step = steps[i];
|
|
1923
1995
|
const ctx = getCtx();
|
|
1924
|
-
if (step.targeting && step.targeting.rules.length && ctx && !(0,
|
|
1996
|
+
if (step.targeting && step.targeting.rules.length && ctx && !(0, import_runtime7.evaluateRules)(step.targeting, ctx)) {
|
|
1925
1997
|
const nextIndex = i + direction;
|
|
1926
1998
|
if (nextIndex >= total) return end("completed");
|
|
1927
1999
|
if (nextIndex < 0) return;
|
|
@@ -2026,7 +2098,7 @@ function runGuide(guide, options = {}) {
|
|
|
2026
2098
|
}
|
|
2027
2099
|
|
|
2028
2100
|
// src/checklist.ts
|
|
2029
|
-
var
|
|
2101
|
+
var import_runtime8 = require("@guidelytech/shared/runtime");
|
|
2030
2102
|
function renderChecklist(options) {
|
|
2031
2103
|
const { scope, config } = options;
|
|
2032
2104
|
const doc = scope.ownerDocument;
|
|
@@ -2101,7 +2173,7 @@ function renderChecklist(options) {
|
|
|
2101
2173
|
bar.setAttribute("aria-valuemax", "100");
|
|
2102
2174
|
body.textContent = "";
|
|
2103
2175
|
foot.textContent = "";
|
|
2104
|
-
const complete = (0,
|
|
2176
|
+
const complete = (0, import_runtime8.isChecklistComplete)(config, progress);
|
|
2105
2177
|
if (complete) {
|
|
2106
2178
|
const wrap = doc.createElement("div");
|
|
2107
2179
|
wrap.className = "g-complete";
|
|
@@ -2189,7 +2261,7 @@ function renderChecklist(options) {
|
|
|
2189
2261
|
}
|
|
2190
2262
|
|
|
2191
2263
|
// src/survey.ts
|
|
2192
|
-
var
|
|
2264
|
+
var import_runtime9 = require("@guidelytech/shared/runtime");
|
|
2193
2265
|
function renderSurvey(options) {
|
|
2194
2266
|
const { scope, config } = options;
|
|
2195
2267
|
const doc = scope.ownerDocument;
|
|
@@ -2381,14 +2453,14 @@ function renderSurvey(options) {
|
|
|
2381
2453
|
config.questions.forEach((q) => {
|
|
2382
2454
|
const el2 = questionEls.get(q.id);
|
|
2383
2455
|
if (!el2) return;
|
|
2384
|
-
const visible = (0,
|
|
2456
|
+
const visible = (0, import_runtime9.isQuestionVisible)(q, answers);
|
|
2385
2457
|
el2.hidden = !visible;
|
|
2386
2458
|
if (!visible && answers[q.id] !== void 0) delete answers[q.id];
|
|
2387
2459
|
});
|
|
2388
2460
|
}
|
|
2389
2461
|
form.addEventListener("submit", (e) => {
|
|
2390
2462
|
e.preventDefault();
|
|
2391
|
-
const missing = config.questions.filter((q) => q.required && (0,
|
|
2463
|
+
const missing = config.questions.filter((q) => q.required && (0, import_runtime9.isQuestionVisible)(q, answers) && answers[q.id] === void 0);
|
|
2392
2464
|
if (missing.length) {
|
|
2393
2465
|
errorEl.textContent = `Please answer: ${missing.map((q) => q.title).join(", ")}`;
|
|
2394
2466
|
questionEls.get(missing[0].id)?.querySelector("button,textarea")?.focus();
|
|
@@ -2437,10 +2509,10 @@ function renderSurvey(options) {
|
|
|
2437
2509
|
}
|
|
2438
2510
|
|
|
2439
2511
|
// src/resource-center.ts
|
|
2440
|
-
var
|
|
2512
|
+
var import_runtime11 = require("@guidelytech/shared/runtime");
|
|
2441
2513
|
|
|
2442
2514
|
// src/help-view.ts
|
|
2443
|
-
var
|
|
2515
|
+
var import_runtime10 = require("@guidelytech/shared/runtime");
|
|
2444
2516
|
var SHOW_ME_KINDS = /* @__PURE__ */ new Set(["flow", "modal", "tooltip", "announcement"]);
|
|
2445
2517
|
function startableGuide(guides, keyOrId) {
|
|
2446
2518
|
if (!keyOrId || !guides) return null;
|
|
@@ -2459,8 +2531,8 @@ function resultRow(doc, icon, title, summary, onOpen, showMe) {
|
|
|
2459
2531
|
return row;
|
|
2460
2532
|
}
|
|
2461
2533
|
function enhanceShowMe(root, doc, canStart, start) {
|
|
2462
|
-
for (const a of Array.from(root.querySelectorAll(`a[href^="${
|
|
2463
|
-
const key = (0,
|
|
2534
|
+
for (const a of Array.from(root.querySelectorAll(`a[href^="${import_runtime10.SHOW_ME_HREF_PREFIX}"]`))) {
|
|
2535
|
+
const key = (0, import_runtime10.showMeKeyFromHref)(a.getAttribute("href"));
|
|
2464
2536
|
const holder = a.closest("p.gd-show-me") ?? a;
|
|
2465
2537
|
if (!key || !canStart(key)) {
|
|
2466
2538
|
if (holder !== a) holder.remove();
|
|
@@ -2576,10 +2648,10 @@ function createHelpView(options) {
|
|
|
2576
2648
|
const data = options.data();
|
|
2577
2649
|
const member = options.audienceIds?.() ?? [];
|
|
2578
2650
|
searchWrap.hidden = !!data.modules && !data.modules.includes("search");
|
|
2579
|
-
const sections = (0,
|
|
2651
|
+
const sections = (0, import_runtime10.resourceCenterSections)(data.collections, data.articles, member);
|
|
2580
2652
|
const q = query.trim().toLowerCase();
|
|
2581
2653
|
if (q) {
|
|
2582
|
-
const walkthroughs = (data.recommended ?? []).filter((g) => (0,
|
|
2654
|
+
const walkthroughs = (data.recommended ?? []).filter((g) => (0, import_runtime10.matchesHelpQuery)(g.name, q) && startableGuide(options.guides?.() ?? data.recommended, g.id));
|
|
2583
2655
|
if (walkthroughs.length) {
|
|
2584
2656
|
section(`Walkthroughs (${walkthroughs.length})`);
|
|
2585
2657
|
for (const g of walkthroughs) body.appendChild(resultRow(doc, "\u25B6", g.name, "Show me, step by step", () => options.onStartGuide?.(g.id)));
|
|
@@ -2588,10 +2660,10 @@ function createHelpView(options) {
|
|
|
2588
2660
|
body.append(...options.extra?.(q) ?? []);
|
|
2589
2661
|
if (q) {
|
|
2590
2662
|
const visible = sections.flatMap((s) => s.articles);
|
|
2591
|
-
const local = visible.filter((a) => (0,
|
|
2663
|
+
const local = visible.filter((a) => (0, import_runtime10.matchesHelpQuery)(`${a.title} ${a.summary}`, q));
|
|
2592
2664
|
const seen = new Set(local.map((a) => a.id));
|
|
2593
2665
|
const hidden = new Set(data.articles.map((a) => a.id).filter((id) => !visible.some((v) => v.id === id)));
|
|
2594
|
-
const merged = [...local, ...serverResults.filter((a) => !seen.has(a.id) && !hidden.has(a.id) && (0,
|
|
2666
|
+
const merged = [...local, ...serverResults.filter((a) => !seen.has(a.id) && !hidden.has(a.id) && (0, import_runtime10.isArticleListed)(data.collections, a, member))];
|
|
2595
2667
|
section(`Results (${merged.length})`);
|
|
2596
2668
|
if (!merged.length) body.appendChild(el(doc, "div", "g-rc-empty", "No articles match your search."));
|
|
2597
2669
|
merged.forEach(articleButton);
|
|
@@ -2611,7 +2683,7 @@ function createHelpView(options) {
|
|
|
2611
2683
|
},
|
|
2612
2684
|
announcements: () => {
|
|
2613
2685
|
if (!data.announcements?.length) return;
|
|
2614
|
-
section(
|
|
2686
|
+
section(import_runtime10.RC_MODULE_LABELS.announcements);
|
|
2615
2687
|
const seen = data.announcementsSeenAt ? Date.parse(data.announcementsSeenAt) : NaN;
|
|
2616
2688
|
data.announcements.slice(0, 20).forEach((n) => body.appendChild(announcementItem(n, Number.isNaN(seen) || Date.parse(n.publishedAt) > seen)));
|
|
2617
2689
|
},
|
|
@@ -2673,7 +2745,7 @@ function createHelpView(options) {
|
|
|
2673
2745
|
});
|
|
2674
2746
|
}
|
|
2675
2747
|
};
|
|
2676
|
-
for (const id of data.modules ??
|
|
2748
|
+
for (const id of data.modules ?? import_runtime10.RC_MODULE_IDS) renderers[id]?.();
|
|
2677
2749
|
if (!body.childNodes.length) body.appendChild(el(doc, "div", "g-rc-empty", "Nothing here yet."));
|
|
2678
2750
|
}
|
|
2679
2751
|
function announcementItem(n, unread) {
|
|
@@ -2798,10 +2870,10 @@ function renderResourceCenter(options) {
|
|
|
2798
2870
|
const badge = el(doc, "span", "g-launcher-badge");
|
|
2799
2871
|
badge.hidden = true;
|
|
2800
2872
|
launcher.appendChild(badge);
|
|
2801
|
-
const modules = () => (0,
|
|
2802
|
-
const announcements = () => modules().includes("announcements") ? (0,
|
|
2873
|
+
const modules = () => (0, import_runtime11.orderedModules)(config.modules).filter((m) => m.enabled && (!("targeting" in m) || !m.targeting || !options.evaluate || options.evaluate(m.targeting))).map((m) => m.id);
|
|
2874
|
+
const announcements = () => modules().includes("announcements") ? (0, import_runtime11.visibleAnnouncements)(config.announcements, options.audienceIds?.() ?? []) : [];
|
|
2803
2875
|
const updateBadge = () => {
|
|
2804
|
-
const unread = (0,
|
|
2876
|
+
const unread = (0, import_runtime11.unreadAnnouncements)(announcements(), options.announcementsSeenAt?.());
|
|
2805
2877
|
badge.hidden = unread === 0;
|
|
2806
2878
|
badge.textContent = unread > 9 ? "9+" : String(unread);
|
|
2807
2879
|
const label = config.launcher.label || config.title;
|
|
@@ -2881,6 +2953,10 @@ function renderResourceCenter(options) {
|
|
|
2881
2953
|
return {
|
|
2882
2954
|
el: root,
|
|
2883
2955
|
open: () => setOpen(true),
|
|
2956
|
+
openArticle(id) {
|
|
2957
|
+
setOpen(true);
|
|
2958
|
+
help.openArticle(id);
|
|
2959
|
+
},
|
|
2884
2960
|
close: () => setOpen(false),
|
|
2885
2961
|
toggle: () => setOpen(!open),
|
|
2886
2962
|
isOpen: () => open,
|