@preprio/toolkit 0.3.2 → 0.3.5
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/README.md +32 -9
- package/dist/astro/index.cjs +1 -1
- package/dist/astro/index.js +1 -1
- package/dist/{chunk-GIEOTQD4.js → chunk-HXQ6JUZM.js} +81 -17
- package/dist/index.cjs +82 -18
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +2 -2
- package/dist/nextjs/components.cjs +81 -17
- package/dist/nextjs/components.d.cts +1 -1
- package/dist/nextjs/components.d.ts +1 -1
- package/dist/nextjs/components.js +1 -1
- package/dist/nextjs/index.cjs +1 -1
- package/dist/nextjs/index.d.cts +14 -0
- package/dist/nextjs/index.d.ts +14 -0
- package/dist/nextjs/index.js +1 -1
- package/dist/nuxt/index.cjs +1 -1
- package/dist/nuxt/index.js +1 -1
- package/dist/{pixel-Dd72wuJp.d.cts → pixel-B6FtY-11.d.cts} +14 -0
- package/dist/{pixel-Dd72wuJp.d.ts → pixel-B6FtY-11.d.ts} +14 -0
- package/dist/react/components.cjs +81 -17
- package/dist/react/components.d.cts +14 -0
- package/dist/react/components.d.ts +14 -0
- package/dist/react/components.js +81 -17
- package/dist/sveltekit/index.cjs +1 -1
- package/dist/sveltekit/index.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -631,14 +631,14 @@ controller.destroy();
|
|
|
631
631
|
| Option | Type | Description |
|
|
632
632
|
| ------------ | ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
633
633
|
| `props` | `PreprToolbarProps` | From `getToolbarProps`. Optional — a headless preview has no segment list to pass. |
|
|
634
|
-
| `options` | `PreprPreviewOptions` | `{ debug?, locale?, features?, ui?, allowedEditorOrigins? }`. See [Preview options](#preview-options).
|
|
634
|
+
| `options` | `PreprPreviewOptions` | `{ debug?, locale?, features?, ui?, allowedEditorOrigins?, autoClean? }`. See [Preview options](#preview-options). |
|
|
635
635
|
| `navigation` | `PreprNavigationAdapter` | How segment/variant switches navigate. Optional — omitted, the toolbar uses `window.location.assign` (a full page load). `reload` is optional too, runs after a preview-mode toggle, and defaults to `window.location.reload()`. The Next.js and SvelteKit wrappers wire all of this up for you. |
|
|
636
636
|
|
|
637
637
|
`createPreprPreview` is a no-op outside a browser (no `window`/`document`) and returns a controller whose `destroy()` does nothing, so it is safe to call during SSR. Call it **once per page** — two calls start two bridges and announce the preview twice.
|
|
638
638
|
|
|
639
639
|
#### Tracking
|
|
640
640
|
|
|
641
|
-
- **`loadTrackingPixel(id, config?)`** — installs the CDN tracking pixel. Idempotent, and a no-op outside a browser. A typed facade over Prepr's existing CDN pixel (`https://cdn.tracking.prepr.io/js/prepr
|
|
641
|
+
- **`loadTrackingPixel(id, config?)`** — installs the CDN tracking pixel. Idempotent, and a no-op outside a browser. A typed facade over Prepr's existing CDN pixel (`https://cdn.tracking.prepr.io/js/prepr.min.js`), reproducing the legacy `<script>` snippet's queue-stub semantics: calls made before the CDN script loads are queued and flushed once it is ready.
|
|
642
642
|
- **`trackEvent(name, data?)`** — sends a custom tracking event: `trackEvent('add_to_cart', { productId: 'abc123' })`.
|
|
643
643
|
- **`setTrackingParam(key, value)`** — sets a persistent tracking parameter: `setTrackingParam('user_type', 'returning')`.
|
|
644
644
|
|
|
@@ -689,13 +689,14 @@ createPreprMiddleware(request, response, { preview });
|
|
|
689
689
|
createPreprPreview({ props, options: { debug: true, locale: 'nl' } });
|
|
690
690
|
```
|
|
691
691
|
|
|
692
|
-
| Option | Type | Default | Description
|
|
693
|
-
| ---------------------- | --------------- | ------------- |
|
|
694
|
-
| `debug` | `boolean` | `false` | Enable debug logging.
|
|
695
|
-
| `locale` | `'en' \| 'nl'` | auto-detected | UI language. Falls back to the first supported browser language, then `en`.
|
|
696
|
-
| `features` | `PreprFeatures` | all enabled | Which features run. See [Feature flags](#feature-flags).
|
|
697
|
-
| `ui` | `boolean` | `true` | Mount the visible toolbar. See [Headless preview](#headless-preview-no-toolbar-ui).
|
|
698
|
-
| `allowedEditorOrigins` | `string[]` | `*.prepr.io` | Exact editor origins allowed to drive this preview, for self-hosted editors. Replaces the wildcard.
|
|
692
|
+
| Option | Type | Default | Description |
|
|
693
|
+
| ---------------------- | --------------- | ------------- | -------------------------------------------------------------------------------------------------------- |
|
|
694
|
+
| `debug` | `boolean` | `false` | Enable debug logging. |
|
|
695
|
+
| `locale` | `'en' \| 'nl'` | auto-detected | UI language. Falls back to the first supported browser language, then `en`. |
|
|
696
|
+
| `features` | `PreprFeatures` | all enabled | Which features run. See [Feature flags](#feature-flags). |
|
|
697
|
+
| `ui` | `boolean` | `true` | Mount the visible toolbar. See [Headless preview](#headless-preview-no-toolbar-ui). |
|
|
698
|
+
| `allowedEditorOrigins` | `string[]` | `*.prepr.io` | Exact editor origins allowed to drive this preview, for self-hosted editors. Replaces the wildcard. |
|
|
699
|
+
| `autoClean` | `boolean` | `true` | Strip the invisible stega characters from visible text. See [Stega auto-cleaning](#stega-auto-cleaning). |
|
|
699
700
|
|
|
700
701
|
`features` and `ui` are independent: `features` decides _what runs_, `ui` decides _whether the toolbar is visible_.
|
|
701
702
|
|
|
@@ -898,6 +899,28 @@ With edit mode enabled, the toolkit scans for stega-encoded content, strips the
|
|
|
898
899
|
|
|
899
900
|
Stega cleaning is automatic. There is no need to call `vercelStegaSplit` or to strip the payload yourself before rendering — the data attributes the toolkit relies on survive the clean, so edit mode still activates instantly.
|
|
900
901
|
|
|
902
|
+
#### Stega auto-cleaning
|
|
903
|
+
|
|
904
|
+
Preview content carries its edit payload inside the text itself, as a run of invisible Unicode characters. The toolkit strips them from the DOM after load and keeps stripping them as your framework re-renders.
|
|
905
|
+
|
|
906
|
+
Leaving them in place is not cosmetic. The characters are real string content: they inflate `String.length`, break text measurement and truncation, and are announced by screen readers.
|
|
907
|
+
|
|
908
|
+
Turn the stripping off with `autoClean: false`:
|
|
909
|
+
|
|
910
|
+
```typescript
|
|
911
|
+
createPreprPreview({ props, options: { autoClean: false } });
|
|
912
|
+
```
|
|
913
|
+
|
|
914
|
+
Only do this when your app already strips the payload itself — for example by passing every field through `stegaClean` as it renders:
|
|
915
|
+
|
|
916
|
+
```typescript
|
|
917
|
+
import { stegaClean } from '@preprio/toolkit';
|
|
918
|
+
|
|
919
|
+
<h1>{stegaClean(page.title)}</h1>;
|
|
920
|
+
```
|
|
921
|
+
|
|
922
|
+
Click-to-edit is unaffected by this option. Elements are still tagged from the payload, so the overlay, tooltip and edit bridge keep working either way.
|
|
923
|
+
|
|
901
924
|
#### Choosing the element that becomes editable
|
|
902
925
|
|
|
903
926
|
The element that gets the outline, the tooltip and the click handler is the **parent of the encoded text node**. Rendering `{title}` inside an `<h2>` makes the `<h2>` editable, which is what you want almost every time.
|
package/dist/astro/index.cjs
CHANGED
package/dist/astro/index.js
CHANGED
|
@@ -252,8 +252,13 @@ var StegaElements = class {
|
|
|
252
252
|
if (mutation.type === "characterData") {
|
|
253
253
|
addedNodes.add(mutation.target);
|
|
254
254
|
}
|
|
255
|
+
if (mutation.type === "attributes") {
|
|
256
|
+
addedNodes.add(mutation.target);
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
addedNodes.forEach((node) => {
|
|
260
|
+
if (node.isConnected) this.scanNode(node);
|
|
255
261
|
});
|
|
256
|
-
addedNodes.forEach((node) => this.scanNode(node));
|
|
257
262
|
pending = [];
|
|
258
263
|
this.elements = document.querySelectorAll("[data-prepr-encoded]");
|
|
259
264
|
onUpdate?.();
|
|
@@ -266,7 +271,11 @@ var StegaElements = class {
|
|
|
266
271
|
this.observer.observe(document.body, {
|
|
267
272
|
childList: true,
|
|
268
273
|
subtree: true,
|
|
269
|
-
characterData: true
|
|
274
|
+
characterData: true,
|
|
275
|
+
// Reveal-on-class/style (dropdowns, accordions) changes no text and adds
|
|
276
|
+
// no nodes, but does change what is hoverable and needs a rescan.
|
|
277
|
+
attributes: true,
|
|
278
|
+
attributeFilter: ["class", "style", "hidden", "open", "aria-expanded"]
|
|
270
279
|
});
|
|
271
280
|
}
|
|
272
281
|
/** Drops the active class but keeps the data attributes, unlike cleanup(). */
|
|
@@ -355,11 +364,13 @@ var StegaOverlay = class {
|
|
|
355
364
|
const maxTop = window.scrollY + window.innerHeight - tooltip.clientHeight - 4;
|
|
356
365
|
const minLeft = window.scrollX + 4;
|
|
357
366
|
const maxLeft = window.scrollX + window.innerWidth - tooltip.clientWidth - 4;
|
|
358
|
-
|
|
367
|
+
const below = top < minTop;
|
|
368
|
+
if (below) {
|
|
359
369
|
top = rect.bottom + window.scrollY + 2;
|
|
360
370
|
}
|
|
361
371
|
top = Math.max(minTop, Math.min(top, maxTop));
|
|
362
372
|
left = Math.max(minLeft, Math.min(left, maxLeft));
|
|
373
|
+
tooltip.dataset.preprPlacement = below ? "below" : "above";
|
|
363
374
|
tooltip.style.top = `${top}px`;
|
|
364
375
|
tooltip.style.left = `${left}px`;
|
|
365
376
|
});
|
|
@@ -491,7 +502,7 @@ var StegaProximity = class {
|
|
|
491
502
|
};
|
|
492
503
|
|
|
493
504
|
// src/core/stega/stega.generated.ts
|
|
494
|
-
var STEGA_STYLES = '[data-prepr-encoded]{position:relative}.prepr-overlay{pointer-events:none;z-index:10000;border:2px solid #4f46e5;border-radius:4px 0 4px 4px;transition:all .2s ease-in-out;position:absolute}.prepr-tooltip{color:#fff;white-space:nowrap;z-index:10001;text-align:center;pointer-events:auto;cursor:pointer;background-color:#4f46e5;border-radius:4px 4px 0 0;min-width:80px;padding:4px 8px;font-size:12px;line-height:1;transition:opacity .2s ease-in-out;position:absolute}.prepr-tooltip:hover{background-color:#4338ca}.prepr-proximity-highlight{z-index:1;position:relative}.prepr-proximity-highlight,.prepr-proximity-highlight *{overflow:visible!important}.prepr-proximity-highlight:before{content:"";pointer-events:none;background:radial-gradient(circle var(--gradient-size) at var(--cursor-x) var(--cursor-y), #4f46e526 0%, #2563eb00 70%);z-index:9999;border:2px solid #4f46e526;border-radius:4px;transition:all .2s;position:absolute;top:-2px;bottom:-2px;left:-4px;right:-4px;overflow:visible}';
|
|
505
|
+
var STEGA_STYLES = '[data-prepr-encoded]{position:relative}.prepr-overlay{pointer-events:none;z-index:10000;border:2px solid #4f46e5;border-radius:4px 0 4px 4px;transition:all .2s ease-in-out;position:absolute}.prepr-tooltip{color:#fff;white-space:nowrap;z-index:10001;text-align:center;pointer-events:auto;cursor:pointer;background-color:#4f46e5;border-radius:4px 4px 0 0;min-width:80px;padding:4px 8px;font-size:12px;line-height:1;transition:opacity .2s ease-in-out;position:absolute}.prepr-tooltip[data-prepr-placement=below]{border-radius:0 0 4px 4px}.prepr-tooltip:hover{background-color:#4338ca}.prepr-proximity-highlight{z-index:1;position:relative}.prepr-proximity-highlight,.prepr-proximity-highlight *{overflow:visible!important}.prepr-proximity-highlight:before{content:"";pointer-events:none;background:radial-gradient(circle var(--gradient-size) at var(--cursor-x) var(--cursor-y), #4f46e526 0%, #2563eb00 70%);z-index:9999;border:2px solid #4f46e526;border-radius:4px;transition:all .2s;position:absolute;top:-2px;bottom:-2px;left:-4px;right:-4px;overflow:visible}';
|
|
495
506
|
|
|
496
507
|
// src/core/stega/styles.ts
|
|
497
508
|
var STEGA_STYLE_MARKER = "data-prepr-stega";
|
|
@@ -627,28 +638,45 @@ function createStegaController(opts) {
|
|
|
627
638
|
// src/core/stega/auto-clean.ts
|
|
628
639
|
import { vercelStegaSplit } from "@vercel/stega";
|
|
629
640
|
var debug6 = createScopedLogger("stega:auto-clean");
|
|
630
|
-
function createStegaAutoClean() {
|
|
641
|
+
function createStegaAutoClean(options) {
|
|
642
|
+
const stripText = options?.enabled ?? true;
|
|
631
643
|
let observer = null;
|
|
632
644
|
let processing = false;
|
|
633
645
|
let cleaned = /* @__PURE__ */ new WeakMap();
|
|
646
|
+
let pendingHidden = /* @__PURE__ */ new Set();
|
|
647
|
+
let pendingDirty = /* @__PURE__ */ new Set();
|
|
634
648
|
let debounceTimeout = null;
|
|
635
649
|
function cleanTextNode(textNode) {
|
|
636
650
|
if (isIgnoredTextNode(textNode)) return false;
|
|
637
651
|
const textContent = textNode.textContent;
|
|
638
652
|
const info = cleaned.get(textNode);
|
|
639
|
-
|
|
653
|
+
const settled = stripText ? info?.cleaned : info?.original;
|
|
654
|
+
if (info && textContent === settled) {
|
|
655
|
+
const shown = resolveEditTarget(textNode);
|
|
656
|
+
if (!shown) return false;
|
|
657
|
+
pendingHidden.delete(textNode);
|
|
658
|
+
if (shown.hasAttribute("data-prepr-encoded")) return false;
|
|
659
|
+
tagEncodedElement(shown, info.decoded);
|
|
660
|
+
return true;
|
|
661
|
+
}
|
|
640
662
|
try {
|
|
641
663
|
const { cleaned: stripped, encoded } = vercelStegaSplit(textContent);
|
|
642
664
|
if (!encoded || stripped === textContent) return false;
|
|
643
665
|
const decoded = decodeStega(textContent);
|
|
644
666
|
if (!decoded?.href) return false;
|
|
645
|
-
cleaned.set(textNode, {
|
|
646
|
-
|
|
667
|
+
cleaned.set(textNode, {
|
|
668
|
+
original: textContent,
|
|
669
|
+
cleaned: stripped,
|
|
670
|
+
decoded
|
|
671
|
+
});
|
|
672
|
+
if (stripText) textNode.textContent = stripped;
|
|
647
673
|
const target = resolveEditTarget(textNode);
|
|
648
674
|
if (target) {
|
|
675
|
+
pendingHidden.delete(textNode);
|
|
649
676
|
tagEncodedElement(target, decoded);
|
|
650
677
|
return true;
|
|
651
678
|
}
|
|
679
|
+
pendingHidden.add(textNode);
|
|
652
680
|
} catch (error) {
|
|
653
681
|
debug6.log("error cleaning text node", error);
|
|
654
682
|
}
|
|
@@ -657,8 +685,10 @@ function createStegaAutoClean() {
|
|
|
657
685
|
function scanAndClean() {
|
|
658
686
|
processing = true;
|
|
659
687
|
walkTextNodes(document.body, cleanTextNode);
|
|
660
|
-
|
|
661
|
-
|
|
688
|
+
if (stripText) {
|
|
689
|
+
const title = vercelStegaSplit(document.title);
|
|
690
|
+
if (title.encoded) document.title = title.cleaned;
|
|
691
|
+
}
|
|
662
692
|
processing = false;
|
|
663
693
|
}
|
|
664
694
|
function collectAffected(mutations) {
|
|
@@ -683,15 +713,37 @@ function createStegaAutoClean() {
|
|
|
683
713
|
});
|
|
684
714
|
return affected;
|
|
685
715
|
}
|
|
716
|
+
function retryPendingHidden() {
|
|
717
|
+
if (pendingHidden.size === 0) return;
|
|
718
|
+
processing = true;
|
|
719
|
+
[...pendingHidden].forEach((textNode) => {
|
|
720
|
+
if (!textNode.isConnected) {
|
|
721
|
+
pendingHidden.delete(textNode);
|
|
722
|
+
return;
|
|
723
|
+
}
|
|
724
|
+
cleanTextNode(textNode);
|
|
725
|
+
});
|
|
726
|
+
processing = false;
|
|
727
|
+
}
|
|
686
728
|
function handleMutations(mutations) {
|
|
687
729
|
if (processing) return;
|
|
688
730
|
const affected = collectAffected(mutations);
|
|
689
|
-
if (affected.size === 0)
|
|
731
|
+
if (affected.size === 0) {
|
|
732
|
+
retryPendingHidden();
|
|
733
|
+
return;
|
|
734
|
+
}
|
|
735
|
+
affected.forEach((textNode) => pendingDirty.add(textNode));
|
|
690
736
|
if (debounceTimeout) clearTimeout(debounceTimeout);
|
|
691
737
|
debounceTimeout = setTimeout(() => {
|
|
738
|
+
debounceTimeout = null;
|
|
692
739
|
processing = true;
|
|
693
|
-
|
|
740
|
+
const batch = [...pendingDirty];
|
|
741
|
+
pendingDirty.clear();
|
|
742
|
+
batch.forEach((textNode) => {
|
|
743
|
+
if (textNode.isConnected) cleanTextNode(textNode);
|
|
744
|
+
});
|
|
694
745
|
processing = false;
|
|
746
|
+
retryPendingHidden();
|
|
695
747
|
}, 50);
|
|
696
748
|
}
|
|
697
749
|
function setupObserver() {
|
|
@@ -699,7 +751,11 @@ function createStegaAutoClean() {
|
|
|
699
751
|
observer.observe(document.body, {
|
|
700
752
|
childList: true,
|
|
701
753
|
subtree: true,
|
|
702
|
-
characterData: true
|
|
754
|
+
characterData: true,
|
|
755
|
+
// A dropdown opening only toggles a class or inline style; without these
|
|
756
|
+
// the nodes it reveals are never revisited and stay untagged.
|
|
757
|
+
attributes: true,
|
|
758
|
+
attributeFilter: ["class", "style", "hidden", "open", "aria-expanded"]
|
|
703
759
|
});
|
|
704
760
|
}
|
|
705
761
|
function start() {
|
|
@@ -718,6 +774,8 @@ function createStegaAutoClean() {
|
|
|
718
774
|
observer = null;
|
|
719
775
|
}
|
|
720
776
|
cleaned = /* @__PURE__ */ new WeakMap();
|
|
777
|
+
pendingHidden = /* @__PURE__ */ new Set();
|
|
778
|
+
pendingDirty = /* @__PURE__ */ new Set();
|
|
721
779
|
debug6.log("stega auto-clean stopped");
|
|
722
780
|
}
|
|
723
781
|
return { start, stop };
|
|
@@ -1041,7 +1099,7 @@ var CLOSE_ICON_SVG = `<svg width="10" height="10" viewBox="0 0 10 10" fill="none
|
|
|
1041
1099
|
</svg>`;
|
|
1042
1100
|
|
|
1043
1101
|
// src/core/ui/toolbar.generated.ts
|
|
1044
|
-
var TOOLBAR_CSS = ":host{--prepr-primary:#4338ca;--prepr-bg:#eef2ff;--prepr-text:#1f2937;--prepr-radius:8px;--prepr-shadow:0px 0px 40px 0px #1f29373d;--prepr-z-index:10000;--prepr-primary-50:#eef2ff;--prepr-primary-100:#e0e7ff;--prepr-primary-800:#3730a3;--prepr-indigo-600:#4f46e5;--prepr-indigo-50:#eef2ff;--prepr-indigo-700:#4338ca;--prepr-secondary-400:#fb923c;--prepr-secondary-500:#f97316;--prepr-gray-100:#f3f4f6;--prepr-gray-200:#e5e7eb;--prepr-gray-300:#d1d5db;--prepr-gray-400:#9ca3af;--prepr-gray-500:#6b7280;--prepr-gray-700:#374151;--prepr-gray-800:#1f2937;--prepr-gray-900:#111827;--prepr-shadow-sm:0px 0px 12px 0px #c3c3c3cc;color:var(--prepr-text);box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;font-size:14px;line-height:1.5}:host *,:host :before,:host :after,*,:before,:after{box-sizing:border-box}button{font-family:inherit;font-size:inherit;margin:0}.prepr-regular-text{font-size:.875rem;font-weight:500;line-height:1.5}.prepr-backdrop{z-index:calc(var(--prepr-z-index) - 1);opacity:0;pointer-events:none;background:#0000001a;transition:opacity .2s ease-in-out;position:fixed;top:0;bottom:0;left:0;right:0}.prepr-backdrop[data-open=true]{opacity:1;pointer-events:auto;animation:.2s ease-in-out prepr-fade-in}.prepr-container{z-index:var(--prepr-z-index);justify-content:flex-end;align-items:center;display:flex;position:fixed;top:calc(50% - 64px);right:0}.prepr-toggle-holder{padding:.5rem}.prepr-toggle{cursor:pointer;background:var(--prepr-primary);color:#fff;border:none;border-radius:9999px;justify-content:center;align-items:center;width:2.25rem;height:2.25rem;display:flex}.prepr-toggle>span{display:flex}.prepr-toggle svg{color:#fff}.prepr-panel{z-index:var(--prepr-z-index);opacity:0;pointer-events:none;justify-content:flex-end;padding:.75rem;transition:opacity .2s ease-in-out;display:flex;position:fixed;top:50%;right:0;transform:translateY(-50%)}.prepr-panel[data-open=true]{opacity:1;pointer-events:auto;animation:.2s ease-in-out prepr-fade-in}.prepr-content{box-shadow:var(--prepr-shadow);border-radius:var(--prepr-radius);background:var(--prepr-bg);flex-direction:column;gap:2.5rem;width:100%;padding:1.5rem;display:flex}@media (min-width:640px){.prepr-panel{margin-right:4rem;padding:0}.prepr-content{width:502px;padding:2.5rem}}.prepr-header{justify-content:space-between;align-items:center;gap:.5rem;display:flex}.prepr-header-left{align-items:flex-start;gap:.75rem;display:flex}.prepr-badge{background:var(--prepr-primary-100);height:1.5rem;color:var(--prepr-primary);border-radius:4px;align-items:center;padding:.25rem .75rem;font-size:.875rem;display:flex}.prepr-header-close{cursor:pointer;background:var(--prepr-primary-100);width:2rem;height:2rem;color:var(--prepr-gray-700);border:none;border-radius:6px;justify-content:center;align-items:center;display:flex}.prepr-section{flex-direction:column;gap:.5rem;display:flex}.prepr-section-label{color:var(--prepr-gray-400);font-size:.875rem}.prepr-row{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.5rem 1.5rem;display:flex}.prepr-row-title{color:var(--prepr-gray-800);margin:0;font-size:1rem;font-weight:600}.prepr-radiogroup{border-radius:var(--prepr-radius);border:1px solid var(--prepr-gray-300);background:#fff;align-items:center;gap:.25rem;height:2.5rem;padding:.25rem;display:flex}.prepr-radiogroup[data-disabled=true]{cursor:not-allowed;opacity:.5}.prepr-radiogroup[data-disabled=true] .prepr-radio{pointer-events:none}.prepr-radio{cursor:pointer;white-space:nowrap;text-align:center;height:2rem;color:var(--prepr-gray-900);background:0 0;border:none;border-radius:6px;justify-content:center;align-items:center;padding:.5rem 1.125rem;font-size:.875rem;font-weight:500;transition:all .2s ease-in-out;display:flex}.prepr-radio[data-checked=true]{background:var(--prepr-indigo-600);color:#fff;box-shadow:var(--prepr-shadow-sm)}.prepr-radio[data-checked=true][data-off=true]{background:var(--prepr-gray-800);color:#fff}.prepr-radio-variant{width:82px}.prepr-listbox{position:relative}.prepr-segment-button{border-radius:var(--prepr-radius);border:1px solid var(--prepr-gray-300);width:240px;height:2.5rem;color:var(--prepr-gray-500);cursor:pointer;background:#fff;flex-shrink:0;align-items:center;gap:.5rem;padding:0 .5rem;font-size:.875rem;font-weight:500;display:flex;overflow:hidden}@media (min-width:768px){.prepr-segment-button{padding:0 1rem}}.prepr-segment-button:disabled{cursor:not-allowed;background:var(--prepr-gray-200);color:var(--prepr-gray-400)}.prepr-segment-button[aria-expanded=true]{border-bottom-color:#fff;border-bottom-right-radius:0;border-bottom-left-radius:0}.prepr-segment-label{white-space:nowrap;text-overflow:ellipsis;text-align:left;width:100%;margin-right:auto;overflow:hidden}.prepr-segment-caret{color:var(--prepr-gray-800);display:flex}.prepr-options{z-index:calc(var(--prepr-z-index) + 1);border-left:1px solid var(--prepr-gray-300);border-right:1px solid var(--prepr-gray-300);border-bottom:1px solid var(--prepr-gray-300);-ms-overflow-style:none;scrollbar-width:none;background:#fff;border-radius:0 0 6px 6px;width:240px;max-height:300px;margin:0;padding:0;list-style:none;position:absolute;top:100%;left:0;overflow-y:auto;box-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a}.prepr-options::-webkit-scrollbar{display:none}.prepr-options[hidden]{display:none}.prepr-option-search{background:#fff;padding:.5rem;position:-webkit-sticky;position:sticky;top:0}.prepr-segment-search{border:1px solid var(--prepr-gray-300);border-radius:var(--prepr-radius);width:100%;height:2rem;font:inherit;color:var(--prepr-gray-900);box-sizing:border-box;background:#fff;padding:0 .5rem;font-size:.875rem}.prepr-segment-search::placeholder{color:var(--prepr-gray-400)}.prepr-segment-search:focus{border-color:var(--prepr-gray-400);outline:none}.prepr-option{cursor:pointer;width:100%;color:var(--prepr-gray-900);background:#fff;align-items:center;padding:.5rem 1rem;font-size:.875rem;font-weight:500;display:flex}.prepr-option:hover{background:var(--prepr-gray-100)}.prepr-option[aria-selected=true]{background:var(--prepr-indigo-50);color:var(--prepr-indigo-700)}.prepr-option-label{white-space:nowrap;text-overflow:ellipsis;text-align:left;width:100%;margin-right:auto;overflow:hidden}.prepr-reset{background:var(--prepr-secondary-400);color:#fff;cursor:pointer;border:none;border-radius:6px;justify-content:center;align-items:center;gap:.5rem;width:100%;height:2.5rem;padding:.5rem .75rem;font-size:.875rem;font-weight:500;display:flex}.prepr-reset:hover:not(:disabled){background:var(--prepr-secondary-500)}.prepr-reset:disabled{background:var(--prepr-gray-400);color:var(--prepr-gray-500);cursor:not-allowed}@media (min-width:768px){.prepr-reset{width:108px}}.prepr-indicators{z-index:var(--prepr-z-index);gap:.75rem;display:flex;position:fixed;bottom:1.5rem;right:1.5rem}.prepr-status-pill{background:var(--prepr-primary);color:#fff;cursor:pointer;border:none;border-radius:9999px;align-items:center;gap:.5rem;padding:.5rem 1rem;font-size:.75rem;font-weight:500;transition:background-color .15s;display:flex;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a}.prepr-status-pill:hover{background:var(--prepr-primary-800)}.prepr-status-pill[hidden]{display:none}.prepr-status-viewing{color:#fff9;font-size:10px}.prepr-status-segment{text-overflow:ellipsis;white-space:nowrap;max-width:120px;display:inline-block;overflow:hidden}.prepr-status-variant{text-overflow:ellipsis;white-space:nowrap;background:#fff3;border-radius:4px;max-width:80px;padding:0 .5rem;display:inline-block;overflow:hidden}.prepr-status-x{color:#fff;width:.75rem;height:.75rem}.prepr-close-edit-pill{background:var(--prepr-primary-50);color:var(--prepr-gray-800);cursor:pointer;border:none;border-radius:9999px;align-items:center;gap:.5rem;padding:.5rem 1rem;font-size:.75rem;font-weight:500;transition:background-color .15s;display:flex;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a}.prepr-close-edit-pill:hover{background:var(--prepr-primary-100)}.prepr-close-edit-pill[hidden]{display:none}.prepr-close-edit-x{width:1rem;height:1rem;color:var(--prepr-gray-500);transition:color .15s}.prepr-close-edit-pill:hover .prepr-close-edit-x{color:var(--prepr-gray-700)}.prepr-tip{z-index:calc(var(--prepr-z-index) + 2);overflow-wrap:break-word;background:var(--prepr-gray-900);color:#fff;pointer-events:none;border-radius:6px;width:auto;max-width:min(420px,100vw - 16px);padding:.5rem .75rem;font-size:.75rem;font-weight:500;position:fixed;box-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a}.prepr-tip-arrow{border-left:6px solid #0000;border-right:6px solid #0000;border-top:6px solid var(--prepr-gray-900);width:0;height:0;position:absolute;top:100%;transform:translate(-50%)}[hidden]{display:none!important}@keyframes prepr-fade-in{0%{opacity:0}to{opacity:1}}";
|
|
1102
|
+
var TOOLBAR_CSS = ":host{--prepr-primary:#4338ca;--prepr-bg:#eef2ff;--prepr-text:#1f2937;--prepr-radius:8px;--prepr-shadow:0px 0px 40px 0px #1f29373d;--prepr-z-index:10000;--prepr-primary-50:#eef2ff;--prepr-primary-100:#e0e7ff;--prepr-primary-800:#3730a3;--prepr-indigo-600:#4f46e5;--prepr-indigo-50:#eef2ff;--prepr-indigo-700:#4338ca;--prepr-secondary-400:#fb923c;--prepr-secondary-500:#f97316;--prepr-gray-100:#f3f4f6;--prepr-gray-200:#e5e7eb;--prepr-gray-300:#d1d5db;--prepr-gray-400:#9ca3af;--prepr-gray-500:#6b7280;--prepr-gray-700:#374151;--prepr-gray-800:#1f2937;--prepr-gray-900:#111827;--prepr-shadow-sm:0px 0px 12px 0px #c3c3c3cc;color:var(--prepr-text);box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;font-size:14px;line-height:1.5}:host *,:host :before,:host :after,*,:before,:after{box-sizing:border-box}button{font-family:inherit;font-size:inherit;margin:0}.prepr-regular-text{font-size:.875rem;font-weight:500;line-height:1.5}.prepr-backdrop{z-index:calc(var(--prepr-z-index) - 1);opacity:0;pointer-events:none;background:#0000001a;transition:opacity .2s ease-in-out;position:fixed;top:0;bottom:0;left:0;right:0}.prepr-backdrop[data-open=true]{opacity:1;pointer-events:auto;animation:.2s ease-in-out prepr-fade-in}.prepr-container{z-index:var(--prepr-z-index);justify-content:flex-end;align-items:center;display:flex;position:fixed;top:calc(50% - 64px);right:0}.prepr-toggle-holder{padding:.5rem}.prepr-toggle{cursor:pointer;background:var(--prepr-primary);color:#fff;border:none;border-radius:9999px;justify-content:center;align-items:center;width:2.25rem;height:2.25rem;display:flex}.prepr-toggle>span{display:flex}.prepr-toggle svg{color:#fff}.prepr-panel{z-index:var(--prepr-z-index);opacity:0;pointer-events:none;justify-content:flex-end;padding:.75rem;transition:opacity .2s ease-in-out;display:flex;position:fixed;top:50%;right:0;transform:translateY(-50%)}.prepr-panel[data-open=true]{opacity:1;pointer-events:auto;animation:.2s ease-in-out prepr-fade-in}.prepr-content{box-shadow:var(--prepr-shadow);border-radius:var(--prepr-radius);background:var(--prepr-bg);flex-direction:column;gap:2.5rem;width:100%;padding:1.5rem;display:flex}@media (min-width:640px){.prepr-panel{margin-right:4rem;padding:0}.prepr-content{width:502px;padding:2.5rem}}.prepr-header{justify-content:space-between;align-items:center;gap:.5rem;display:flex}.prepr-header-left{align-items:flex-start;gap:.75rem;display:flex}.prepr-badge{background:var(--prepr-primary-100);height:1.5rem;color:var(--prepr-primary);border-radius:4px;align-items:center;padding:.25rem .75rem;font-size:.875rem;display:flex}.prepr-header-close{cursor:pointer;background:var(--prepr-primary-100);width:2rem;height:2rem;color:var(--prepr-gray-700);border:none;border-radius:6px;justify-content:center;align-items:center;display:flex}.prepr-section{flex-direction:column;gap:.5rem;display:flex}.prepr-section-label{color:var(--prepr-gray-400);font-size:.875rem}.prepr-row{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.5rem 1.5rem;display:flex}.prepr-row-title{color:var(--prepr-gray-800);margin:0;font-size:1rem;font-weight:600}.prepr-radiogroup{border-radius:var(--prepr-radius);border:1px solid var(--prepr-gray-300);background:#fff;align-items:center;gap:.25rem;height:2.5rem;padding:.25rem;display:flex}.prepr-radiogroup[data-disabled=true]{cursor:not-allowed;opacity:.5}.prepr-radiogroup[data-disabled=true] .prepr-radio{pointer-events:none}.prepr-radio{cursor:pointer;white-space:nowrap;text-align:center;height:2rem;color:var(--prepr-gray-900);background:0 0;border:none;border-radius:6px;justify-content:center;align-items:center;padding:.5rem 1.125rem;font-size:.875rem;font-weight:500;transition:all .2s ease-in-out;display:flex}.prepr-radio[data-checked=true]{background:var(--prepr-indigo-600);color:#fff;box-shadow:var(--prepr-shadow-sm)}.prepr-radio[data-checked=true][data-off=true]{background:var(--prepr-gray-800);color:#fff}.prepr-radio-variant{width:82px}.prepr-listbox{position:relative}.prepr-segment-button{border-radius:var(--prepr-radius);border:1px solid var(--prepr-gray-300);width:240px;height:2.5rem;color:var(--prepr-gray-500);cursor:pointer;background:#fff;flex-shrink:0;align-items:center;gap:.5rem;padding:0 .5rem;font-size:.875rem;font-weight:500;display:flex;overflow:hidden}@media (min-width:768px){.prepr-segment-button{padding:0 1rem}}.prepr-segment-button:disabled{cursor:not-allowed;background:var(--prepr-gray-200);color:var(--prepr-gray-400)}.prepr-segment-button[aria-expanded=true]{border-bottom-color:#fff;border-bottom-right-radius:0;border-bottom-left-radius:0}.prepr-segment-label{white-space:nowrap;text-overflow:ellipsis;text-align:left;width:100%;margin-right:auto;overflow:hidden}.prepr-segment-caret{color:var(--prepr-gray-800);display:flex}.prepr-options{z-index:calc(var(--prepr-z-index) + 1);border-left:1px solid var(--prepr-gray-300);border-right:1px solid var(--prepr-gray-300);border-bottom:1px solid var(--prepr-gray-300);-ms-overflow-style:none;scrollbar-width:none;background:#fff;border-radius:0 0 6px 6px;width:240px;max-height:300px;margin:0;padding:0;list-style:none;position:absolute;top:100%;left:0;overflow-y:auto;box-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a}.prepr-options::-webkit-scrollbar{display:none}.prepr-options[hidden]{display:none}.prepr-option-search{background:#fff;padding:.5rem;position:-webkit-sticky;position:sticky;top:0}.prepr-segment-search{border:1px solid var(--prepr-gray-300);border-radius:var(--prepr-radius);width:100%;height:2rem;font:inherit;color:var(--prepr-gray-900);box-sizing:border-box;background:#fff;padding:0 .5rem;font-size:.875rem}.prepr-segment-search::placeholder{color:var(--prepr-gray-400)}.prepr-segment-search:focus{border-color:var(--prepr-gray-400);outline:none}.prepr-option{cursor:pointer;width:100%;color:var(--prepr-gray-900);background:#fff;align-items:center;padding:.5rem 1rem;font-size:.875rem;font-weight:500;display:flex}.prepr-option:hover{background:var(--prepr-gray-100)}.prepr-option[aria-selected=true]{background:var(--prepr-indigo-50);color:var(--prepr-indigo-700)}.prepr-option-label{white-space:nowrap;text-overflow:ellipsis;text-align:left;width:100%;margin-right:auto;overflow:hidden}.prepr-reset{background:var(--prepr-secondary-400);color:#fff;cursor:pointer;border:none;border-radius:6px;justify-content:center;align-items:center;gap:.5rem;width:100%;height:2.5rem;padding:.5rem .75rem;font-size:.875rem;font-weight:500;display:flex}.prepr-reset:hover:not(:disabled){background:var(--prepr-secondary-500)}.prepr-reset:disabled{background:var(--prepr-gray-400);color:var(--prepr-gray-500);cursor:not-allowed}@media (min-width:768px){.prepr-reset{width:108px}}.prepr-indicators{z-index:var(--prepr-z-index);gap:.75rem;display:flex;position:fixed;bottom:1.5rem;right:1.5rem}.prepr-status-pill{background:var(--prepr-primary);color:#fff;cursor:pointer;border:none;border-radius:9999px;align-items:center;gap:.5rem;padding:.5rem 1rem;font-size:.75rem;font-weight:500;transition:background-color .15s;display:flex;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a}.prepr-status-pill[data-interactive=false]{cursor:default;opacity:1;color:#fff}.prepr-status-pill[data-interactive=true]:hover{background:var(--prepr-primary-800)}.prepr-status-pill[hidden]{display:none}.prepr-status-viewing{color:#fff9;font-size:10px}.prepr-status-segment{text-overflow:ellipsis;white-space:nowrap;max-width:120px;display:inline-block;overflow:hidden}.prepr-status-variant{text-overflow:ellipsis;white-space:nowrap;background:#fff3;border-radius:4px;max-width:80px;padding:0 .5rem;display:inline-block;overflow:hidden}.prepr-status-x{color:#fff;width:.75rem;height:.75rem}.prepr-close-edit-pill{background:var(--prepr-primary-50);color:var(--prepr-gray-800);cursor:pointer;border:none;border-radius:9999px;align-items:center;gap:.5rem;padding:.5rem 1rem;font-size:.75rem;font-weight:500;transition:background-color .15s;display:flex;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a}.prepr-close-edit-pill:hover{background:var(--prepr-primary-100)}.prepr-close-edit-pill[hidden]{display:none}.prepr-close-edit-x{width:1rem;height:1rem;color:var(--prepr-gray-500);transition:color .15s}.prepr-close-edit-pill:hover .prepr-close-edit-x{color:var(--prepr-gray-700)}.prepr-tip{z-index:calc(var(--prepr-z-index) + 2);overflow-wrap:break-word;background:var(--prepr-gray-900);color:#fff;pointer-events:none;border-radius:6px;width:auto;max-width:min(420px,100vw - 16px);padding:.5rem .75rem;font-size:.75rem;font-weight:500;position:fixed;box-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a}.prepr-tip-arrow{border-left:6px solid #0000;border-right:6px solid #0000;border-top:6px solid var(--prepr-gray-900);width:0;height:0;position:absolute;top:100%;transform:translate(-50%)}[hidden]{display:none!important}@keyframes prepr-fade-in{0%{opacity:0}to{opacity:1}}";
|
|
1045
1103
|
|
|
1046
1104
|
// ../../node_modules/.pnpm/preact@10.29.7/node_modules/preact/jsx-runtime/dist/jsxRuntime.mjs
|
|
1047
1105
|
var f2 = 0;
|
|
@@ -1300,13 +1358,17 @@ function StatusPill({
|
|
|
1300
1358
|
} else {
|
|
1301
1359
|
segmentLabel = defaultSegmentName;
|
|
1302
1360
|
}
|
|
1361
|
+
const dirty = features.segments && state.selectedSegment !== null || features.abTesting && state.selectedVariant === "B";
|
|
1362
|
+
const interactive = !state.previewMode || dirty;
|
|
1303
1363
|
return /* @__PURE__ */ u2(
|
|
1304
1364
|
"button",
|
|
1305
1365
|
{
|
|
1306
1366
|
type: "button",
|
|
1307
1367
|
class: "prepr-status-pill",
|
|
1308
1368
|
"data-prepr": "status-pill",
|
|
1369
|
+
"data-interactive": String(interactive),
|
|
1309
1370
|
hidden: state.isIframe,
|
|
1371
|
+
disabled: !interactive,
|
|
1310
1372
|
onClick: () => handlers.onStatusPill(),
|
|
1311
1373
|
children: [
|
|
1312
1374
|
/* @__PURE__ */ u2("span", { class: "prepr-status-viewing", "data-prepr": "status-viewing", children: t3("common.viewingAs") }),
|
|
@@ -1325,7 +1387,7 @@ function StatusPill({
|
|
|
1325
1387
|
{
|
|
1326
1388
|
class: "prepr-status-x",
|
|
1327
1389
|
"data-prepr": "status-x",
|
|
1328
|
-
hidden: !state.previewMode || !
|
|
1390
|
+
hidden: !state.previewMode || !dirty,
|
|
1329
1391
|
children: /* @__PURE__ */ u2(RawSvg, { svg: XMARK_ICON_SVG })
|
|
1330
1392
|
}
|
|
1331
1393
|
)
|
|
@@ -2129,7 +2191,9 @@ function createPreprPreview(opts = {}) {
|
|
|
2129
2191
|
}
|
|
2130
2192
|
}
|
|
2131
2193
|
});
|
|
2132
|
-
const autoClean = createStegaAutoClean(
|
|
2194
|
+
const autoClean = createStegaAutoClean({
|
|
2195
|
+
enabled: options?.autoClean
|
|
2196
|
+
});
|
|
2133
2197
|
autoClean.start();
|
|
2134
2198
|
const handleChange = createChangeHandler({
|
|
2135
2199
|
store,
|
|
@@ -2175,7 +2239,7 @@ function createPreprPreview(opts = {}) {
|
|
|
2175
2239
|
}
|
|
2176
2240
|
|
|
2177
2241
|
// src/core/pixel.ts
|
|
2178
|
-
var PIXEL_SCRIPT_URL = "https://cdn.tracking.prepr.io/js/prepr
|
|
2242
|
+
var PIXEL_SCRIPT_URL = "https://cdn.tracking.prepr.io/js/prepr.min.js";
|
|
2179
2243
|
var CACHE_BUST_INTERVAL_MS = 24 * 60 * 60 * 1e3;
|
|
2180
2244
|
var warnedNoPixel = false;
|
|
2181
2245
|
function warnNoPixelOnce() {
|
package/dist/index.cjs
CHANGED
|
@@ -44,7 +44,7 @@ __export(src_exports, {
|
|
|
44
44
|
module.exports = __toCommonJS(src_exports);
|
|
45
45
|
|
|
46
46
|
// src/version.ts
|
|
47
|
-
var VERSION = "0.3.
|
|
47
|
+
var VERSION = "0.3.5";
|
|
48
48
|
|
|
49
49
|
// src/core/features.ts
|
|
50
50
|
function isEnabled(config) {
|
|
@@ -442,28 +442,45 @@ function tagEncodedElement(element, decoded) {
|
|
|
442
442
|
|
|
443
443
|
// src/core/stega/auto-clean.ts
|
|
444
444
|
var debug2 = createScopedLogger("stega:auto-clean");
|
|
445
|
-
function createStegaAutoClean() {
|
|
445
|
+
function createStegaAutoClean(options) {
|
|
446
|
+
const stripText = options?.enabled ?? true;
|
|
446
447
|
let observer = null;
|
|
447
448
|
let processing = false;
|
|
448
449
|
let cleaned = /* @__PURE__ */ new WeakMap();
|
|
450
|
+
let pendingHidden = /* @__PURE__ */ new Set();
|
|
451
|
+
let pendingDirty = /* @__PURE__ */ new Set();
|
|
449
452
|
let debounceTimeout = null;
|
|
450
453
|
function cleanTextNode(textNode) {
|
|
451
454
|
if (isIgnoredTextNode(textNode)) return false;
|
|
452
455
|
const textContent = textNode.textContent;
|
|
453
456
|
const info = cleaned.get(textNode);
|
|
454
|
-
|
|
457
|
+
const settled = stripText ? info?.cleaned : info?.original;
|
|
458
|
+
if (info && textContent === settled) {
|
|
459
|
+
const shown = resolveEditTarget(textNode);
|
|
460
|
+
if (!shown) return false;
|
|
461
|
+
pendingHidden.delete(textNode);
|
|
462
|
+
if (shown.hasAttribute("data-prepr-encoded")) return false;
|
|
463
|
+
tagEncodedElement(shown, info.decoded);
|
|
464
|
+
return true;
|
|
465
|
+
}
|
|
455
466
|
try {
|
|
456
467
|
const { cleaned: stripped, encoded } = (0, import_stega2.vercelStegaSplit)(textContent);
|
|
457
468
|
if (!encoded || stripped === textContent) return false;
|
|
458
469
|
const decoded = decodeStega(textContent);
|
|
459
470
|
if (!decoded?.href) return false;
|
|
460
|
-
cleaned.set(textNode, {
|
|
461
|
-
|
|
471
|
+
cleaned.set(textNode, {
|
|
472
|
+
original: textContent,
|
|
473
|
+
cleaned: stripped,
|
|
474
|
+
decoded
|
|
475
|
+
});
|
|
476
|
+
if (stripText) textNode.textContent = stripped;
|
|
462
477
|
const target = resolveEditTarget(textNode);
|
|
463
478
|
if (target) {
|
|
479
|
+
pendingHidden.delete(textNode);
|
|
464
480
|
tagEncodedElement(target, decoded);
|
|
465
481
|
return true;
|
|
466
482
|
}
|
|
483
|
+
pendingHidden.add(textNode);
|
|
467
484
|
} catch (error) {
|
|
468
485
|
debug2.log("error cleaning text node", error);
|
|
469
486
|
}
|
|
@@ -472,8 +489,10 @@ function createStegaAutoClean() {
|
|
|
472
489
|
function scanAndClean() {
|
|
473
490
|
processing = true;
|
|
474
491
|
walkTextNodes(document.body, cleanTextNode);
|
|
475
|
-
|
|
476
|
-
|
|
492
|
+
if (stripText) {
|
|
493
|
+
const title = (0, import_stega2.vercelStegaSplit)(document.title);
|
|
494
|
+
if (title.encoded) document.title = title.cleaned;
|
|
495
|
+
}
|
|
477
496
|
processing = false;
|
|
478
497
|
}
|
|
479
498
|
function collectAffected(mutations) {
|
|
@@ -498,15 +517,37 @@ function createStegaAutoClean() {
|
|
|
498
517
|
});
|
|
499
518
|
return affected;
|
|
500
519
|
}
|
|
520
|
+
function retryPendingHidden() {
|
|
521
|
+
if (pendingHidden.size === 0) return;
|
|
522
|
+
processing = true;
|
|
523
|
+
[...pendingHidden].forEach((textNode) => {
|
|
524
|
+
if (!textNode.isConnected) {
|
|
525
|
+
pendingHidden.delete(textNode);
|
|
526
|
+
return;
|
|
527
|
+
}
|
|
528
|
+
cleanTextNode(textNode);
|
|
529
|
+
});
|
|
530
|
+
processing = false;
|
|
531
|
+
}
|
|
501
532
|
function handleMutations(mutations) {
|
|
502
533
|
if (processing) return;
|
|
503
534
|
const affected = collectAffected(mutations);
|
|
504
|
-
if (affected.size === 0)
|
|
535
|
+
if (affected.size === 0) {
|
|
536
|
+
retryPendingHidden();
|
|
537
|
+
return;
|
|
538
|
+
}
|
|
539
|
+
affected.forEach((textNode) => pendingDirty.add(textNode));
|
|
505
540
|
if (debounceTimeout) clearTimeout(debounceTimeout);
|
|
506
541
|
debounceTimeout = setTimeout(() => {
|
|
542
|
+
debounceTimeout = null;
|
|
507
543
|
processing = true;
|
|
508
|
-
|
|
544
|
+
const batch = [...pendingDirty];
|
|
545
|
+
pendingDirty.clear();
|
|
546
|
+
batch.forEach((textNode) => {
|
|
547
|
+
if (textNode.isConnected) cleanTextNode(textNode);
|
|
548
|
+
});
|
|
509
549
|
processing = false;
|
|
550
|
+
retryPendingHidden();
|
|
510
551
|
}, 50);
|
|
511
552
|
}
|
|
512
553
|
function setupObserver() {
|
|
@@ -514,7 +555,11 @@ function createStegaAutoClean() {
|
|
|
514
555
|
observer.observe(document.body, {
|
|
515
556
|
childList: true,
|
|
516
557
|
subtree: true,
|
|
517
|
-
characterData: true
|
|
558
|
+
characterData: true,
|
|
559
|
+
// A dropdown opening only toggles a class or inline style; without these
|
|
560
|
+
// the nodes it reveals are never revisited and stay untagged.
|
|
561
|
+
attributes: true,
|
|
562
|
+
attributeFilter: ["class", "style", "hidden", "open", "aria-expanded"]
|
|
518
563
|
});
|
|
519
564
|
}
|
|
520
565
|
function start() {
|
|
@@ -533,6 +578,8 @@ function createStegaAutoClean() {
|
|
|
533
578
|
observer = null;
|
|
534
579
|
}
|
|
535
580
|
cleaned = /* @__PURE__ */ new WeakMap();
|
|
581
|
+
pendingHidden = /* @__PURE__ */ new Set();
|
|
582
|
+
pendingDirty = /* @__PURE__ */ new Set();
|
|
536
583
|
debug2.log("stega auto-clean stopped");
|
|
537
584
|
}
|
|
538
585
|
return { start, stop };
|
|
@@ -601,8 +648,13 @@ var StegaElements = class {
|
|
|
601
648
|
if (mutation.type === "characterData") {
|
|
602
649
|
addedNodes.add(mutation.target);
|
|
603
650
|
}
|
|
651
|
+
if (mutation.type === "attributes") {
|
|
652
|
+
addedNodes.add(mutation.target);
|
|
653
|
+
}
|
|
654
|
+
});
|
|
655
|
+
addedNodes.forEach((node) => {
|
|
656
|
+
if (node.isConnected) this.scanNode(node);
|
|
604
657
|
});
|
|
605
|
-
addedNodes.forEach((node) => this.scanNode(node));
|
|
606
658
|
pending = [];
|
|
607
659
|
this.elements = document.querySelectorAll("[data-prepr-encoded]");
|
|
608
660
|
onUpdate?.();
|
|
@@ -615,7 +667,11 @@ var StegaElements = class {
|
|
|
615
667
|
this.observer.observe(document.body, {
|
|
616
668
|
childList: true,
|
|
617
669
|
subtree: true,
|
|
618
|
-
characterData: true
|
|
670
|
+
characterData: true,
|
|
671
|
+
// Reveal-on-class/style (dropdowns, accordions) changes no text and adds
|
|
672
|
+
// no nodes, but does change what is hoverable and needs a rescan.
|
|
673
|
+
attributes: true,
|
|
674
|
+
attributeFilter: ["class", "style", "hidden", "open", "aria-expanded"]
|
|
619
675
|
});
|
|
620
676
|
}
|
|
621
677
|
/** Drops the active class but keeps the data attributes, unlike cleanup(). */
|
|
@@ -704,11 +760,13 @@ var StegaOverlay = class {
|
|
|
704
760
|
const maxTop = window.scrollY + window.innerHeight - tooltip.clientHeight - 4;
|
|
705
761
|
const minLeft = window.scrollX + 4;
|
|
706
762
|
const maxLeft = window.scrollX + window.innerWidth - tooltip.clientWidth - 4;
|
|
707
|
-
|
|
763
|
+
const below = top < minTop;
|
|
764
|
+
if (below) {
|
|
708
765
|
top = rect.bottom + window.scrollY + 2;
|
|
709
766
|
}
|
|
710
767
|
top = Math.max(minTop, Math.min(top, maxTop));
|
|
711
768
|
left = Math.max(minLeft, Math.min(left, maxLeft));
|
|
769
|
+
tooltip.dataset.preprPlacement = below ? "below" : "above";
|
|
712
770
|
tooltip.style.top = `${top}px`;
|
|
713
771
|
tooltip.style.left = `${left}px`;
|
|
714
772
|
});
|
|
@@ -840,7 +898,7 @@ var StegaProximity = class {
|
|
|
840
898
|
};
|
|
841
899
|
|
|
842
900
|
// src/core/stega/stega.generated.ts
|
|
843
|
-
var STEGA_STYLES = '[data-prepr-encoded]{position:relative}.prepr-overlay{pointer-events:none;z-index:10000;border:2px solid #4f46e5;border-radius:4px 0 4px 4px;transition:all .2s ease-in-out;position:absolute}.prepr-tooltip{color:#fff;white-space:nowrap;z-index:10001;text-align:center;pointer-events:auto;cursor:pointer;background-color:#4f46e5;border-radius:4px 4px 0 0;min-width:80px;padding:4px 8px;font-size:12px;line-height:1;transition:opacity .2s ease-in-out;position:absolute}.prepr-tooltip:hover{background-color:#4338ca}.prepr-proximity-highlight{z-index:1;position:relative}.prepr-proximity-highlight,.prepr-proximity-highlight *{overflow:visible!important}.prepr-proximity-highlight:before{content:"";pointer-events:none;background:radial-gradient(circle var(--gradient-size) at var(--cursor-x) var(--cursor-y), #4f46e526 0%, #2563eb00 70%);z-index:9999;border:2px solid #4f46e526;border-radius:4px;transition:all .2s;position:absolute;top:-2px;bottom:-2px;left:-4px;right:-4px;overflow:visible}';
|
|
901
|
+
var STEGA_STYLES = '[data-prepr-encoded]{position:relative}.prepr-overlay{pointer-events:none;z-index:10000;border:2px solid #4f46e5;border-radius:4px 0 4px 4px;transition:all .2s ease-in-out;position:absolute}.prepr-tooltip{color:#fff;white-space:nowrap;z-index:10001;text-align:center;pointer-events:auto;cursor:pointer;background-color:#4f46e5;border-radius:4px 4px 0 0;min-width:80px;padding:4px 8px;font-size:12px;line-height:1;transition:opacity .2s ease-in-out;position:absolute}.prepr-tooltip[data-prepr-placement=below]{border-radius:0 0 4px 4px}.prepr-tooltip:hover{background-color:#4338ca}.prepr-proximity-highlight{z-index:1;position:relative}.prepr-proximity-highlight,.prepr-proximity-highlight *{overflow:visible!important}.prepr-proximity-highlight:before{content:"";pointer-events:none;background:radial-gradient(circle var(--gradient-size) at var(--cursor-x) var(--cursor-y), #4f46e526 0%, #2563eb00 70%);z-index:9999;border:2px solid #4f46e526;border-radius:4px;transition:all .2s;position:absolute;top:-2px;bottom:-2px;left:-4px;right:-4px;overflow:visible}';
|
|
844
902
|
|
|
845
903
|
// src/core/stega/styles.ts
|
|
846
904
|
var STEGA_STYLE_MARKER = "data-prepr-stega";
|
|
@@ -1389,7 +1447,7 @@ var CLOSE_ICON_SVG = `<svg width="10" height="10" viewBox="0 0 10 10" fill="none
|
|
|
1389
1447
|
</svg>`;
|
|
1390
1448
|
|
|
1391
1449
|
// src/core/ui/toolbar.generated.ts
|
|
1392
|
-
var TOOLBAR_CSS = ":host{--prepr-primary:#4338ca;--prepr-bg:#eef2ff;--prepr-text:#1f2937;--prepr-radius:8px;--prepr-shadow:0px 0px 40px 0px #1f29373d;--prepr-z-index:10000;--prepr-primary-50:#eef2ff;--prepr-primary-100:#e0e7ff;--prepr-primary-800:#3730a3;--prepr-indigo-600:#4f46e5;--prepr-indigo-50:#eef2ff;--prepr-indigo-700:#4338ca;--prepr-secondary-400:#fb923c;--prepr-secondary-500:#f97316;--prepr-gray-100:#f3f4f6;--prepr-gray-200:#e5e7eb;--prepr-gray-300:#d1d5db;--prepr-gray-400:#9ca3af;--prepr-gray-500:#6b7280;--prepr-gray-700:#374151;--prepr-gray-800:#1f2937;--prepr-gray-900:#111827;--prepr-shadow-sm:0px 0px 12px 0px #c3c3c3cc;color:var(--prepr-text);box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;font-size:14px;line-height:1.5}:host *,:host :before,:host :after,*,:before,:after{box-sizing:border-box}button{font-family:inherit;font-size:inherit;margin:0}.prepr-regular-text{font-size:.875rem;font-weight:500;line-height:1.5}.prepr-backdrop{z-index:calc(var(--prepr-z-index) - 1);opacity:0;pointer-events:none;background:#0000001a;transition:opacity .2s ease-in-out;position:fixed;top:0;bottom:0;left:0;right:0}.prepr-backdrop[data-open=true]{opacity:1;pointer-events:auto;animation:.2s ease-in-out prepr-fade-in}.prepr-container{z-index:var(--prepr-z-index);justify-content:flex-end;align-items:center;display:flex;position:fixed;top:calc(50% - 64px);right:0}.prepr-toggle-holder{padding:.5rem}.prepr-toggle{cursor:pointer;background:var(--prepr-primary);color:#fff;border:none;border-radius:9999px;justify-content:center;align-items:center;width:2.25rem;height:2.25rem;display:flex}.prepr-toggle>span{display:flex}.prepr-toggle svg{color:#fff}.prepr-panel{z-index:var(--prepr-z-index);opacity:0;pointer-events:none;justify-content:flex-end;padding:.75rem;transition:opacity .2s ease-in-out;display:flex;position:fixed;top:50%;right:0;transform:translateY(-50%)}.prepr-panel[data-open=true]{opacity:1;pointer-events:auto;animation:.2s ease-in-out prepr-fade-in}.prepr-content{box-shadow:var(--prepr-shadow);border-radius:var(--prepr-radius);background:var(--prepr-bg);flex-direction:column;gap:2.5rem;width:100%;padding:1.5rem;display:flex}@media (min-width:640px){.prepr-panel{margin-right:4rem;padding:0}.prepr-content{width:502px;padding:2.5rem}}.prepr-header{justify-content:space-between;align-items:center;gap:.5rem;display:flex}.prepr-header-left{align-items:flex-start;gap:.75rem;display:flex}.prepr-badge{background:var(--prepr-primary-100);height:1.5rem;color:var(--prepr-primary);border-radius:4px;align-items:center;padding:.25rem .75rem;font-size:.875rem;display:flex}.prepr-header-close{cursor:pointer;background:var(--prepr-primary-100);width:2rem;height:2rem;color:var(--prepr-gray-700);border:none;border-radius:6px;justify-content:center;align-items:center;display:flex}.prepr-section{flex-direction:column;gap:.5rem;display:flex}.prepr-section-label{color:var(--prepr-gray-400);font-size:.875rem}.prepr-row{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.5rem 1.5rem;display:flex}.prepr-row-title{color:var(--prepr-gray-800);margin:0;font-size:1rem;font-weight:600}.prepr-radiogroup{border-radius:var(--prepr-radius);border:1px solid var(--prepr-gray-300);background:#fff;align-items:center;gap:.25rem;height:2.5rem;padding:.25rem;display:flex}.prepr-radiogroup[data-disabled=true]{cursor:not-allowed;opacity:.5}.prepr-radiogroup[data-disabled=true] .prepr-radio{pointer-events:none}.prepr-radio{cursor:pointer;white-space:nowrap;text-align:center;height:2rem;color:var(--prepr-gray-900);background:0 0;border:none;border-radius:6px;justify-content:center;align-items:center;padding:.5rem 1.125rem;font-size:.875rem;font-weight:500;transition:all .2s ease-in-out;display:flex}.prepr-radio[data-checked=true]{background:var(--prepr-indigo-600);color:#fff;box-shadow:var(--prepr-shadow-sm)}.prepr-radio[data-checked=true][data-off=true]{background:var(--prepr-gray-800);color:#fff}.prepr-radio-variant{width:82px}.prepr-listbox{position:relative}.prepr-segment-button{border-radius:var(--prepr-radius);border:1px solid var(--prepr-gray-300);width:240px;height:2.5rem;color:var(--prepr-gray-500);cursor:pointer;background:#fff;flex-shrink:0;align-items:center;gap:.5rem;padding:0 .5rem;font-size:.875rem;font-weight:500;display:flex;overflow:hidden}@media (min-width:768px){.prepr-segment-button{padding:0 1rem}}.prepr-segment-button:disabled{cursor:not-allowed;background:var(--prepr-gray-200);color:var(--prepr-gray-400)}.prepr-segment-button[aria-expanded=true]{border-bottom-color:#fff;border-bottom-right-radius:0;border-bottom-left-radius:0}.prepr-segment-label{white-space:nowrap;text-overflow:ellipsis;text-align:left;width:100%;margin-right:auto;overflow:hidden}.prepr-segment-caret{color:var(--prepr-gray-800);display:flex}.prepr-options{z-index:calc(var(--prepr-z-index) + 1);border-left:1px solid var(--prepr-gray-300);border-right:1px solid var(--prepr-gray-300);border-bottom:1px solid var(--prepr-gray-300);-ms-overflow-style:none;scrollbar-width:none;background:#fff;border-radius:0 0 6px 6px;width:240px;max-height:300px;margin:0;padding:0;list-style:none;position:absolute;top:100%;left:0;overflow-y:auto;box-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a}.prepr-options::-webkit-scrollbar{display:none}.prepr-options[hidden]{display:none}.prepr-option-search{background:#fff;padding:.5rem;position:-webkit-sticky;position:sticky;top:0}.prepr-segment-search{border:1px solid var(--prepr-gray-300);border-radius:var(--prepr-radius);width:100%;height:2rem;font:inherit;color:var(--prepr-gray-900);box-sizing:border-box;background:#fff;padding:0 .5rem;font-size:.875rem}.prepr-segment-search::placeholder{color:var(--prepr-gray-400)}.prepr-segment-search:focus{border-color:var(--prepr-gray-400);outline:none}.prepr-option{cursor:pointer;width:100%;color:var(--prepr-gray-900);background:#fff;align-items:center;padding:.5rem 1rem;font-size:.875rem;font-weight:500;display:flex}.prepr-option:hover{background:var(--prepr-gray-100)}.prepr-option[aria-selected=true]{background:var(--prepr-indigo-50);color:var(--prepr-indigo-700)}.prepr-option-label{white-space:nowrap;text-overflow:ellipsis;text-align:left;width:100%;margin-right:auto;overflow:hidden}.prepr-reset{background:var(--prepr-secondary-400);color:#fff;cursor:pointer;border:none;border-radius:6px;justify-content:center;align-items:center;gap:.5rem;width:100%;height:2.5rem;padding:.5rem .75rem;font-size:.875rem;font-weight:500;display:flex}.prepr-reset:hover:not(:disabled){background:var(--prepr-secondary-500)}.prepr-reset:disabled{background:var(--prepr-gray-400);color:var(--prepr-gray-500);cursor:not-allowed}@media (min-width:768px){.prepr-reset{width:108px}}.prepr-indicators{z-index:var(--prepr-z-index);gap:.75rem;display:flex;position:fixed;bottom:1.5rem;right:1.5rem}.prepr-status-pill{background:var(--prepr-primary);color:#fff;cursor:pointer;border:none;border-radius:9999px;align-items:center;gap:.5rem;padding:.5rem 1rem;font-size:.75rem;font-weight:500;transition:background-color .15s;display:flex;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a}.prepr-status-pill:hover{background:var(--prepr-primary-800)}.prepr-status-pill[hidden]{display:none}.prepr-status-viewing{color:#fff9;font-size:10px}.prepr-status-segment{text-overflow:ellipsis;white-space:nowrap;max-width:120px;display:inline-block;overflow:hidden}.prepr-status-variant{text-overflow:ellipsis;white-space:nowrap;background:#fff3;border-radius:4px;max-width:80px;padding:0 .5rem;display:inline-block;overflow:hidden}.prepr-status-x{color:#fff;width:.75rem;height:.75rem}.prepr-close-edit-pill{background:var(--prepr-primary-50);color:var(--prepr-gray-800);cursor:pointer;border:none;border-radius:9999px;align-items:center;gap:.5rem;padding:.5rem 1rem;font-size:.75rem;font-weight:500;transition:background-color .15s;display:flex;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a}.prepr-close-edit-pill:hover{background:var(--prepr-primary-100)}.prepr-close-edit-pill[hidden]{display:none}.prepr-close-edit-x{width:1rem;height:1rem;color:var(--prepr-gray-500);transition:color .15s}.prepr-close-edit-pill:hover .prepr-close-edit-x{color:var(--prepr-gray-700)}.prepr-tip{z-index:calc(var(--prepr-z-index) + 2);overflow-wrap:break-word;background:var(--prepr-gray-900);color:#fff;pointer-events:none;border-radius:6px;width:auto;max-width:min(420px,100vw - 16px);padding:.5rem .75rem;font-size:.75rem;font-weight:500;position:fixed;box-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a}.prepr-tip-arrow{border-left:6px solid #0000;border-right:6px solid #0000;border-top:6px solid var(--prepr-gray-900);width:0;height:0;position:absolute;top:100%;transform:translate(-50%)}[hidden]{display:none!important}@keyframes prepr-fade-in{0%{opacity:0}to{opacity:1}}";
|
|
1450
|
+
var TOOLBAR_CSS = ":host{--prepr-primary:#4338ca;--prepr-bg:#eef2ff;--prepr-text:#1f2937;--prepr-radius:8px;--prepr-shadow:0px 0px 40px 0px #1f29373d;--prepr-z-index:10000;--prepr-primary-50:#eef2ff;--prepr-primary-100:#e0e7ff;--prepr-primary-800:#3730a3;--prepr-indigo-600:#4f46e5;--prepr-indigo-50:#eef2ff;--prepr-indigo-700:#4338ca;--prepr-secondary-400:#fb923c;--prepr-secondary-500:#f97316;--prepr-gray-100:#f3f4f6;--prepr-gray-200:#e5e7eb;--prepr-gray-300:#d1d5db;--prepr-gray-400:#9ca3af;--prepr-gray-500:#6b7280;--prepr-gray-700:#374151;--prepr-gray-800:#1f2937;--prepr-gray-900:#111827;--prepr-shadow-sm:0px 0px 12px 0px #c3c3c3cc;color:var(--prepr-text);box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;font-size:14px;line-height:1.5}:host *,:host :before,:host :after,*,:before,:after{box-sizing:border-box}button{font-family:inherit;font-size:inherit;margin:0}.prepr-regular-text{font-size:.875rem;font-weight:500;line-height:1.5}.prepr-backdrop{z-index:calc(var(--prepr-z-index) - 1);opacity:0;pointer-events:none;background:#0000001a;transition:opacity .2s ease-in-out;position:fixed;top:0;bottom:0;left:0;right:0}.prepr-backdrop[data-open=true]{opacity:1;pointer-events:auto;animation:.2s ease-in-out prepr-fade-in}.prepr-container{z-index:var(--prepr-z-index);justify-content:flex-end;align-items:center;display:flex;position:fixed;top:calc(50% - 64px);right:0}.prepr-toggle-holder{padding:.5rem}.prepr-toggle{cursor:pointer;background:var(--prepr-primary);color:#fff;border:none;border-radius:9999px;justify-content:center;align-items:center;width:2.25rem;height:2.25rem;display:flex}.prepr-toggle>span{display:flex}.prepr-toggle svg{color:#fff}.prepr-panel{z-index:var(--prepr-z-index);opacity:0;pointer-events:none;justify-content:flex-end;padding:.75rem;transition:opacity .2s ease-in-out;display:flex;position:fixed;top:50%;right:0;transform:translateY(-50%)}.prepr-panel[data-open=true]{opacity:1;pointer-events:auto;animation:.2s ease-in-out prepr-fade-in}.prepr-content{box-shadow:var(--prepr-shadow);border-radius:var(--prepr-radius);background:var(--prepr-bg);flex-direction:column;gap:2.5rem;width:100%;padding:1.5rem;display:flex}@media (min-width:640px){.prepr-panel{margin-right:4rem;padding:0}.prepr-content{width:502px;padding:2.5rem}}.prepr-header{justify-content:space-between;align-items:center;gap:.5rem;display:flex}.prepr-header-left{align-items:flex-start;gap:.75rem;display:flex}.prepr-badge{background:var(--prepr-primary-100);height:1.5rem;color:var(--prepr-primary);border-radius:4px;align-items:center;padding:.25rem .75rem;font-size:.875rem;display:flex}.prepr-header-close{cursor:pointer;background:var(--prepr-primary-100);width:2rem;height:2rem;color:var(--prepr-gray-700);border:none;border-radius:6px;justify-content:center;align-items:center;display:flex}.prepr-section{flex-direction:column;gap:.5rem;display:flex}.prepr-section-label{color:var(--prepr-gray-400);font-size:.875rem}.prepr-row{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.5rem 1.5rem;display:flex}.prepr-row-title{color:var(--prepr-gray-800);margin:0;font-size:1rem;font-weight:600}.prepr-radiogroup{border-radius:var(--prepr-radius);border:1px solid var(--prepr-gray-300);background:#fff;align-items:center;gap:.25rem;height:2.5rem;padding:.25rem;display:flex}.prepr-radiogroup[data-disabled=true]{cursor:not-allowed;opacity:.5}.prepr-radiogroup[data-disabled=true] .prepr-radio{pointer-events:none}.prepr-radio{cursor:pointer;white-space:nowrap;text-align:center;height:2rem;color:var(--prepr-gray-900);background:0 0;border:none;border-radius:6px;justify-content:center;align-items:center;padding:.5rem 1.125rem;font-size:.875rem;font-weight:500;transition:all .2s ease-in-out;display:flex}.prepr-radio[data-checked=true]{background:var(--prepr-indigo-600);color:#fff;box-shadow:var(--prepr-shadow-sm)}.prepr-radio[data-checked=true][data-off=true]{background:var(--prepr-gray-800);color:#fff}.prepr-radio-variant{width:82px}.prepr-listbox{position:relative}.prepr-segment-button{border-radius:var(--prepr-radius);border:1px solid var(--prepr-gray-300);width:240px;height:2.5rem;color:var(--prepr-gray-500);cursor:pointer;background:#fff;flex-shrink:0;align-items:center;gap:.5rem;padding:0 .5rem;font-size:.875rem;font-weight:500;display:flex;overflow:hidden}@media (min-width:768px){.prepr-segment-button{padding:0 1rem}}.prepr-segment-button:disabled{cursor:not-allowed;background:var(--prepr-gray-200);color:var(--prepr-gray-400)}.prepr-segment-button[aria-expanded=true]{border-bottom-color:#fff;border-bottom-right-radius:0;border-bottom-left-radius:0}.prepr-segment-label{white-space:nowrap;text-overflow:ellipsis;text-align:left;width:100%;margin-right:auto;overflow:hidden}.prepr-segment-caret{color:var(--prepr-gray-800);display:flex}.prepr-options{z-index:calc(var(--prepr-z-index) + 1);border-left:1px solid var(--prepr-gray-300);border-right:1px solid var(--prepr-gray-300);border-bottom:1px solid var(--prepr-gray-300);-ms-overflow-style:none;scrollbar-width:none;background:#fff;border-radius:0 0 6px 6px;width:240px;max-height:300px;margin:0;padding:0;list-style:none;position:absolute;top:100%;left:0;overflow-y:auto;box-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a}.prepr-options::-webkit-scrollbar{display:none}.prepr-options[hidden]{display:none}.prepr-option-search{background:#fff;padding:.5rem;position:-webkit-sticky;position:sticky;top:0}.prepr-segment-search{border:1px solid var(--prepr-gray-300);border-radius:var(--prepr-radius);width:100%;height:2rem;font:inherit;color:var(--prepr-gray-900);box-sizing:border-box;background:#fff;padding:0 .5rem;font-size:.875rem}.prepr-segment-search::placeholder{color:var(--prepr-gray-400)}.prepr-segment-search:focus{border-color:var(--prepr-gray-400);outline:none}.prepr-option{cursor:pointer;width:100%;color:var(--prepr-gray-900);background:#fff;align-items:center;padding:.5rem 1rem;font-size:.875rem;font-weight:500;display:flex}.prepr-option:hover{background:var(--prepr-gray-100)}.prepr-option[aria-selected=true]{background:var(--prepr-indigo-50);color:var(--prepr-indigo-700)}.prepr-option-label{white-space:nowrap;text-overflow:ellipsis;text-align:left;width:100%;margin-right:auto;overflow:hidden}.prepr-reset{background:var(--prepr-secondary-400);color:#fff;cursor:pointer;border:none;border-radius:6px;justify-content:center;align-items:center;gap:.5rem;width:100%;height:2.5rem;padding:.5rem .75rem;font-size:.875rem;font-weight:500;display:flex}.prepr-reset:hover:not(:disabled){background:var(--prepr-secondary-500)}.prepr-reset:disabled{background:var(--prepr-gray-400);color:var(--prepr-gray-500);cursor:not-allowed}@media (min-width:768px){.prepr-reset{width:108px}}.prepr-indicators{z-index:var(--prepr-z-index);gap:.75rem;display:flex;position:fixed;bottom:1.5rem;right:1.5rem}.prepr-status-pill{background:var(--prepr-primary);color:#fff;cursor:pointer;border:none;border-radius:9999px;align-items:center;gap:.5rem;padding:.5rem 1rem;font-size:.75rem;font-weight:500;transition:background-color .15s;display:flex;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a}.prepr-status-pill[data-interactive=false]{cursor:default;opacity:1;color:#fff}.prepr-status-pill[data-interactive=true]:hover{background:var(--prepr-primary-800)}.prepr-status-pill[hidden]{display:none}.prepr-status-viewing{color:#fff9;font-size:10px}.prepr-status-segment{text-overflow:ellipsis;white-space:nowrap;max-width:120px;display:inline-block;overflow:hidden}.prepr-status-variant{text-overflow:ellipsis;white-space:nowrap;background:#fff3;border-radius:4px;max-width:80px;padding:0 .5rem;display:inline-block;overflow:hidden}.prepr-status-x{color:#fff;width:.75rem;height:.75rem}.prepr-close-edit-pill{background:var(--prepr-primary-50);color:var(--prepr-gray-800);cursor:pointer;border:none;border-radius:9999px;align-items:center;gap:.5rem;padding:.5rem 1rem;font-size:.75rem;font-weight:500;transition:background-color .15s;display:flex;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a}.prepr-close-edit-pill:hover{background:var(--prepr-primary-100)}.prepr-close-edit-pill[hidden]{display:none}.prepr-close-edit-x{width:1rem;height:1rem;color:var(--prepr-gray-500);transition:color .15s}.prepr-close-edit-pill:hover .prepr-close-edit-x{color:var(--prepr-gray-700)}.prepr-tip{z-index:calc(var(--prepr-z-index) + 2);overflow-wrap:break-word;background:var(--prepr-gray-900);color:#fff;pointer-events:none;border-radius:6px;width:auto;max-width:min(420px,100vw - 16px);padding:.5rem .75rem;font-size:.75rem;font-weight:500;position:fixed;box-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a}.prepr-tip-arrow{border-left:6px solid #0000;border-right:6px solid #0000;border-top:6px solid var(--prepr-gray-900);width:0;height:0;position:absolute;top:100%;transform:translate(-50%)}[hidden]{display:none!important}@keyframes prepr-fade-in{0%{opacity:0}to{opacity:1}}";
|
|
1393
1451
|
|
|
1394
1452
|
// ../../node_modules/.pnpm/preact@10.29.7/node_modules/preact/jsx-runtime/dist/jsxRuntime.mjs
|
|
1395
1453
|
var f2 = 0;
|
|
@@ -1648,13 +1706,17 @@ function StatusPill({
|
|
|
1648
1706
|
} else {
|
|
1649
1707
|
segmentLabel = defaultSegmentName;
|
|
1650
1708
|
}
|
|
1709
|
+
const dirty = features.segments && state.selectedSegment !== null || features.abTesting && state.selectedVariant === "B";
|
|
1710
|
+
const interactive = !state.previewMode || dirty;
|
|
1651
1711
|
return /* @__PURE__ */ u2(
|
|
1652
1712
|
"button",
|
|
1653
1713
|
{
|
|
1654
1714
|
type: "button",
|
|
1655
1715
|
class: "prepr-status-pill",
|
|
1656
1716
|
"data-prepr": "status-pill",
|
|
1717
|
+
"data-interactive": String(interactive),
|
|
1657
1718
|
hidden: state.isIframe,
|
|
1719
|
+
disabled: !interactive,
|
|
1658
1720
|
onClick: () => handlers.onStatusPill(),
|
|
1659
1721
|
children: [
|
|
1660
1722
|
/* @__PURE__ */ u2("span", { class: "prepr-status-viewing", "data-prepr": "status-viewing", children: t3("common.viewingAs") }),
|
|
@@ -1673,7 +1735,7 @@ function StatusPill({
|
|
|
1673
1735
|
{
|
|
1674
1736
|
class: "prepr-status-x",
|
|
1675
1737
|
"data-prepr": "status-x",
|
|
1676
|
-
hidden: !state.previewMode || !
|
|
1738
|
+
hidden: !state.previewMode || !dirty,
|
|
1677
1739
|
children: /* @__PURE__ */ u2(RawSvg, { svg: XMARK_ICON_SVG })
|
|
1678
1740
|
}
|
|
1679
1741
|
)
|
|
@@ -2177,7 +2239,9 @@ function createPreprPreview(opts = {}) {
|
|
|
2177
2239
|
}
|
|
2178
2240
|
}
|
|
2179
2241
|
});
|
|
2180
|
-
const autoClean = createStegaAutoClean(
|
|
2242
|
+
const autoClean = createStegaAutoClean({
|
|
2243
|
+
enabled: options?.autoClean
|
|
2244
|
+
});
|
|
2181
2245
|
autoClean.start();
|
|
2182
2246
|
const handleChange = createChangeHandler({
|
|
2183
2247
|
store,
|
|
@@ -2533,7 +2597,7 @@ function processPreprRequest(request, opts) {
|
|
|
2533
2597
|
}
|
|
2534
2598
|
|
|
2535
2599
|
// src/core/pixel.ts
|
|
2536
|
-
var PIXEL_SCRIPT_URL = "https://cdn.tracking.prepr.io/js/prepr
|
|
2600
|
+
var PIXEL_SCRIPT_URL = "https://cdn.tracking.prepr.io/js/prepr.min.js";
|
|
2537
2601
|
var CACHE_BUST_INTERVAL_MS = 24 * 60 * 60 * 1e3;
|
|
2538
2602
|
var warnedNoPixel = false;
|
|
2539
2603
|
function warnNoPixelOnce() {
|