@translation-cms/sync 1.2.15 → 1.2.17
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/core/cache-internals/params.d.ts.map +1 -1
- package/dist/core/cache-internals/params.js +16 -3
- package/dist/core/cache-internals/params.js.map +1 -1
- package/dist/preview/index.d.ts +1 -0
- package/dist/preview/index.d.ts.map +1 -1
- package/dist/preview/index.js +15 -5
- package/dist/preview/index.js.map +1 -1
- package/dist/preview/internals/interactive.d.ts +14 -0
- package/dist/preview/internals/interactive.d.ts.map +1 -0
- package/dist/preview/internals/interactive.js +124 -0
- package/dist/preview/internals/interactive.js.map +1 -0
- package/dist/preview/internals/state.d.ts +2 -0
- package/dist/preview/internals/state.d.ts.map +1 -1
- package/dist/preview/internals/state.js +7 -0
- package/dist/preview/internals/state.js.map +1 -1
- package/dist/preview/internals/types.d.ts +25 -0
- package/dist/preview/internals/types.d.ts.map +1 -1
- package/dist/preview/internals/ui-indicators.d.ts +23 -0
- package/dist/preview/internals/ui-indicators.d.ts.map +1 -0
- package/dist/preview/internals/ui-indicators.js +157 -0
- package/dist/preview/internals/ui-indicators.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"params.d.ts","sourceRoot":"","sources":["../../../src/core/cache-internals/params.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"params.d.ts","sourceRoot":"","sources":["../../../src/core/cache-internals/params.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAyDpD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAC/B,MAAM,EAAE,MAAM,EAAE,GACjB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAexC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAU3E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAChC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAC/C,IAAI,CAUN;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAC7B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAC9C,kBAAkB,EAAE,MAAM,GAC3B,IAAI,CAoCN"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import fs from 'fs';
|
|
2
2
|
import path from 'path';
|
|
3
|
-
import {
|
|
3
|
+
import { createHash } from 'crypto';
|
|
4
4
|
/**
|
|
5
5
|
* Extract dynamic parameter names from a route string.
|
|
6
6
|
* E.g. "/[locale]/blog/[slug]" → ["locale", "slug"]
|
|
@@ -9,21 +9,34 @@ function extractParamNames(route) {
|
|
|
9
9
|
const matches = route.match(/\[(\w+)\]/g) ?? [];
|
|
10
10
|
return matches.map(m => m.slice(1, -1));
|
|
11
11
|
}
|
|
12
|
+
/**
|
|
13
|
+
* Generate a deterministic UUID for a param ID.
|
|
14
|
+
* Same param name always produces the same UUID (for consistency).
|
|
15
|
+
* Uses MD5 hash of the param name to create a v4-like UUID.
|
|
16
|
+
*/
|
|
17
|
+
function generateDeterministicUUID(paramName) {
|
|
18
|
+
const hash = createHash('md5').update(`cms-param:${paramName}`).digest('hex');
|
|
19
|
+
// Format as UUID v4-like: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
|
|
20
|
+
return `${hash.slice(0, 8)}-${hash.slice(8, 12)}-${hash.slice(12, 16)}-${hash.slice(16, 20)}-${hash.slice(20, 32)}`;
|
|
21
|
+
}
|
|
12
22
|
/**
|
|
13
23
|
* Generate a sensible default value for any dynamic route param name.
|
|
14
24
|
*
|
|
15
25
|
* Matches by suffix/pattern so it works generically — e.g. `productId`,
|
|
16
26
|
* `orderId`, `articleSlug`, `teamName` — without hardcoding every variant.
|
|
17
27
|
*
|
|
28
|
+
* For IDs: generates a deterministic UUID so the same param always produces
|
|
29
|
+
* the same value (important for caching and consistency).
|
|
30
|
+
*
|
|
18
31
|
* Fallback: converts the param name from camelCase to kebab-case, which is
|
|
19
32
|
* both human-readable and a valid value for slug-style params.
|
|
20
33
|
* e.g. `articleSlug` → `"article-slug"`, `teamName` → `"team-name"`
|
|
21
34
|
*/
|
|
22
35
|
function generateDefaultParamValue(paramName) {
|
|
23
36
|
const lower = paramName.toLowerCase();
|
|
24
|
-
// Any param ending in "id" (userId, productId, orderId, …) → UUID
|
|
37
|
+
// Any param ending in "id" (userId, productId, orderId, …) → deterministic UUID
|
|
25
38
|
if (lower.endsWith('id'))
|
|
26
|
-
return
|
|
39
|
+
return generateDeterministicUUID(paramName);
|
|
27
40
|
// Email addresses
|
|
28
41
|
if (lower.includes('email'))
|
|
29
42
|
return 'demo@example.com';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"params.js","sourceRoot":"","sources":["../../../src/core/cache-internals/params.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGpC;;;GAGG;AACH,SAAS,iBAAiB,CAAC,KAAa;IACpC,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAChD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"params.js","sourceRoot":"","sources":["../../../src/core/cache-internals/params.ts"],"names":[],"mappings":"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"}
|
package/dist/preview/index.d.ts
CHANGED
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
* ```
|
|
28
28
|
*/
|
|
29
29
|
export type { PreviewListenerOptions } from './internals/types.js';
|
|
30
|
+
export { updateURLDisplay, updateStateDisplay, showNavigationFeedback, } from './internals/ui-indicators.js';
|
|
30
31
|
import type { PreviewListenerOptions } from './internals/types.js';
|
|
31
32
|
/**
|
|
32
33
|
* Initialize the preview listener.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/preview/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAGH,YAAY,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/preview/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAGH,YAAY,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EACH,gBAAgB,EAChB,kBAAkB,EAClB,sBAAsB,GACzB,MAAM,8BAA8B,CAAC;AAwBtC,OAAO,KAAK,EAIR,sBAAsB,EACzB,MAAM,sBAAsB,CAAC;AAM9B;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAqC1E;AAED,4DAA4D;AAC5D,wBAAgB,sBAAsB,IAAI,IAAI,CAS7C"}
|
package/dist/preview/index.js
CHANGED
|
@@ -26,12 +26,15 @@
|
|
|
26
26
|
* <h1 data-cms-key="blog:post.title">{t('blog:post.title')}</h1>
|
|
27
27
|
* ```
|
|
28
28
|
*/
|
|
29
|
+
export { updateURLDisplay, updateStateDisplay, showNavigationFeedback, } from './internals/ui-indicators.js';
|
|
29
30
|
// Internal imports
|
|
30
31
|
import * as state from './internals/state.js';
|
|
31
32
|
import { highlightTranslationKey, clearHighlights, updateLiveText, } from './internals/highlight.js';
|
|
32
33
|
import { handleLocaleSwitch } from './internals/locales.js';
|
|
33
34
|
import { injectInteractionBlocker, removeInteractionBlocker, } from './internals/interactions.js';
|
|
34
35
|
import { injectStyles } from './internals/styles.js';
|
|
36
|
+
import { initInteractiveMode, cleanupInteractiveMode, } from './internals/interactive.js';
|
|
37
|
+
import { injectUIIndicators, removeUIIndicators, updateURLDisplay, } from './internals/ui-indicators.js';
|
|
35
38
|
// ---------------------------------------------------------------------------
|
|
36
39
|
// Public functions
|
|
37
40
|
// ---------------------------------------------------------------------------
|
|
@@ -54,13 +57,18 @@ export function initPreviewListener(options) {
|
|
|
54
57
|
state.setIsInitialized(true);
|
|
55
58
|
window.addEventListener('message', handleMessage);
|
|
56
59
|
injectStyles();
|
|
57
|
-
// Only inject the interaction blocker when
|
|
58
|
-
// (i.e. the CMS preview context)
|
|
59
|
-
|
|
60
|
-
if (window.top !== window) {
|
|
60
|
+
// Only inject the interaction blocker when NOT in interactive mode
|
|
61
|
+
// and when running inside an iframe (i.e. the CMS preview context)
|
|
62
|
+
if (window.top !== window && !options?.interactiveMode) {
|
|
61
63
|
injectInteractionBlocker();
|
|
62
64
|
}
|
|
63
|
-
|
|
65
|
+
// Initialize interactive mode if enabled
|
|
66
|
+
if (options?.interactiveMode) {
|
|
67
|
+
initInteractiveMode();
|
|
68
|
+
injectUIIndicators();
|
|
69
|
+
updateURLDisplay(window.location.href);
|
|
70
|
+
}
|
|
71
|
+
console.log(`%c[CMS Preview] Ready ${options?.interactiveMode ? '(interactive mode)' : ''}`, 'color: #10b981; font-weight: bold;');
|
|
64
72
|
}
|
|
65
73
|
/** Remove the preview listener and clear all highlights. */
|
|
66
74
|
export function cleanupPreviewListener() {
|
|
@@ -68,6 +76,8 @@ export function cleanupPreviewListener() {
|
|
|
68
76
|
return;
|
|
69
77
|
window.removeEventListener('message', handleMessage);
|
|
70
78
|
removeInteractionBlocker();
|
|
79
|
+
cleanupInteractiveMode();
|
|
80
|
+
removeUIIndicators();
|
|
71
81
|
clearHighlights();
|
|
72
82
|
state.resetState();
|
|
73
83
|
console.log('[CMS Preview] Listener cleaned up');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/preview/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/preview/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interactive preview mode: allow clicks, form interactions, navigation.
|
|
3
|
+
* Editors can explore the app while seeing translations highlighted.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Initialize interactive mode:
|
|
7
|
+
* - Allow form interactions (typing, selecting)
|
|
8
|
+
* - Intercept navigation to report back to CMS
|
|
9
|
+
* - Capture/restore app state when navigating
|
|
10
|
+
*/
|
|
11
|
+
export declare function initInteractiveMode(): void;
|
|
12
|
+
/** Clean up interactive mode event listeners. */
|
|
13
|
+
export declare function cleanupInteractiveMode(): void;
|
|
14
|
+
//# sourceMappingURL=interactive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../../src/preview/internals/interactive.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH;;;;;GAKG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAc1C;AAED,iDAAiD;AACjD,wBAAgB,sBAAsB,IAAI,IAAI,CAG7C"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interactive preview mode: allow clicks, form interactions, navigation.
|
|
3
|
+
* Editors can explore the app while seeing translations highlighted.
|
|
4
|
+
*/
|
|
5
|
+
import * as state from './state.js';
|
|
6
|
+
import { updateURLDisplay, updateStateDisplay, showNavigationFeedback, } from './ui-indicators.js';
|
|
7
|
+
/**
|
|
8
|
+
* Initialize interactive mode:
|
|
9
|
+
* - Allow form interactions (typing, selecting)
|
|
10
|
+
* - Intercept navigation to report back to CMS
|
|
11
|
+
* - Capture/restore app state when navigating
|
|
12
|
+
*/
|
|
13
|
+
export function initInteractiveMode() {
|
|
14
|
+
if (!window.top || window.top === window) {
|
|
15
|
+
// Not in an iframe — no need to intercept navigation
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
// Capture state before navigation
|
|
19
|
+
window.addEventListener('click', handleLinkClick, true);
|
|
20
|
+
window.addEventListener('submit', handleFormSubmit, true);
|
|
21
|
+
// Track URL changes (for Single Page Apps)
|
|
22
|
+
trackURLChanges();
|
|
23
|
+
console.log('[CMS Preview] Interactive mode enabled');
|
|
24
|
+
}
|
|
25
|
+
/** Clean up interactive mode event listeners. */
|
|
26
|
+
export function cleanupInteractiveMode() {
|
|
27
|
+
window.removeEventListener('click', handleLinkClick, true);
|
|
28
|
+
window.removeEventListener('submit', handleFormSubmit, true);
|
|
29
|
+
}
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
// Event handlers
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
/**
|
|
34
|
+
* Intercept link clicks to:
|
|
35
|
+
* 1. Capture current app state
|
|
36
|
+
* 2. Report navigation to CMS
|
|
37
|
+
* 3. Wait for page load, then restore state
|
|
38
|
+
*/
|
|
39
|
+
function handleLinkClick(event) {
|
|
40
|
+
const elem = event.target;
|
|
41
|
+
const link = elem.closest('a');
|
|
42
|
+
if (!link || !link.href)
|
|
43
|
+
return;
|
|
44
|
+
// Don't intercept external links or special links
|
|
45
|
+
if (link.target === '_blank' ||
|
|
46
|
+
link.target === '_parent' ||
|
|
47
|
+
link.target === '_top' ||
|
|
48
|
+
link.hasAttribute('download')) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
// Check if it's a navigation link (not anchor-only)
|
|
52
|
+
const url = new URL(link.href);
|
|
53
|
+
const currentUrl = new URL(window.location.href);
|
|
54
|
+
// If it's just an anchor change, don't capture state
|
|
55
|
+
if (url.hostname === currentUrl.hostname &&
|
|
56
|
+
url.pathname === currentUrl.pathname &&
|
|
57
|
+
url.search === currentUrl.search &&
|
|
58
|
+
url.hash !== currentUrl.hash) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
// Capture state before navigation
|
|
62
|
+
const appState = state.stateCapture?.();
|
|
63
|
+
// Report navigation to CMS
|
|
64
|
+
reportNavigation(url.href, appState);
|
|
65
|
+
// Set up state restoration after page loads
|
|
66
|
+
if (appState && state.stateRestore) {
|
|
67
|
+
window.addEventListener('load', () => {
|
|
68
|
+
state.stateRestore?.(appState);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Intercept form submissions to report to CMS.
|
|
74
|
+
*/
|
|
75
|
+
function handleFormSubmit(event) {
|
|
76
|
+
const form = event.target;
|
|
77
|
+
if (!form || !form.action)
|
|
78
|
+
return;
|
|
79
|
+
const appState = state.stateCapture?.();
|
|
80
|
+
reportNavigation(form.action, appState);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Track URL changes in Single Page Apps (detect history pushes).
|
|
84
|
+
*/
|
|
85
|
+
function trackURLChanges() {
|
|
86
|
+
const originalPushState = window.history.pushState;
|
|
87
|
+
const originalReplaceState = window.history.replaceState;
|
|
88
|
+
window.history.pushState = function (state, unused, url) {
|
|
89
|
+
const result = originalPushState.call(window.history, state, unused, url);
|
|
90
|
+
if (url)
|
|
91
|
+
reportNavigation(String(url));
|
|
92
|
+
return result;
|
|
93
|
+
};
|
|
94
|
+
window.history.replaceState = function (state, unused, url) {
|
|
95
|
+
const result = originalReplaceState.call(window.history, state, unused, url);
|
|
96
|
+
if (url)
|
|
97
|
+
reportNavigation(String(url));
|
|
98
|
+
return result;
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
// ---------------------------------------------------------------------------
|
|
102
|
+
// Message reporting
|
|
103
|
+
// ---------------------------------------------------------------------------
|
|
104
|
+
/**
|
|
105
|
+
* Send navigation event to CMS.
|
|
106
|
+
* Allows the CMS to know which route/URL we're viewing.
|
|
107
|
+
*/
|
|
108
|
+
function reportNavigation(url, appState) {
|
|
109
|
+
if (!window.top || window.top === window)
|
|
110
|
+
return;
|
|
111
|
+
const message = {
|
|
112
|
+
type: 'CMS_NAVIGATE',
|
|
113
|
+
url,
|
|
114
|
+
state: appState,
|
|
115
|
+
};
|
|
116
|
+
// Show navigation feedback
|
|
117
|
+
showNavigationFeedback(window.location.href, url);
|
|
118
|
+
// Update UI displays
|
|
119
|
+
updateURLDisplay(url);
|
|
120
|
+
updateStateDisplay(appState);
|
|
121
|
+
window.top.postMessage(message, '*');
|
|
122
|
+
console.log(`[CMS Preview] Navigated to: ${url}`);
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=interactive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactive.js","sourceRoot":"","sources":["../../../src/preview/internals/interactive.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,8 @@ export declare let pendingHighlight: {
|
|
|
13
13
|
key: string;
|
|
14
14
|
value: string;
|
|
15
15
|
} | null;
|
|
16
|
+
export declare let stateCapture: (() => Record<string, any>) | undefined;
|
|
17
|
+
export declare let stateRestore: ((state: Record<string, any>) => void) | undefined;
|
|
16
18
|
/**
|
|
17
19
|
* Reset all state when cleaning up.
|
|
18
20
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/preview/internals/state.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEzD,eAAO,IAAI,aAAa,SAAQ,CAAC;AACjC,eAAO,IAAI,mBAAmB,EAAE,WAAW,EAAO,CAAC;AACnD,eAAO,IAAI,IAAI,EAAE,sBAA2B,CAAC;AAC7C,eAAO,IAAI,gBAAgB,EAAE,MAAM,GAAG,IAAW,CAAC;AAClD,eAAO,IAAI,kBAAkB,EAAE,MAAM,GAAG,IAAW,CAAC;AACpD,eAAO,IAAI,YAAY,EAAE,MAAM,GAAG,IAAW,CAAC;AAC9C,eAAO,IAAI,yBAAyB,EAAE,cAAc,GAAG,IAAW,CAAC;AACnE,eAAO,IAAI,gBAAgB,EAAE;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACjB,GAAG,IAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/preview/internals/state.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEzD,eAAO,IAAI,aAAa,SAAQ,CAAC;AACjC,eAAO,IAAI,mBAAmB,EAAE,WAAW,EAAO,CAAC;AACnD,eAAO,IAAI,IAAI,EAAE,sBAA2B,CAAC;AAC7C,eAAO,IAAI,gBAAgB,EAAE,MAAM,GAAG,IAAW,CAAC;AAClD,eAAO,IAAI,kBAAkB,EAAE,MAAM,GAAG,IAAW,CAAC;AACpD,eAAO,IAAI,YAAY,EAAE,MAAM,GAAG,IAAW,CAAC;AAC9C,eAAO,IAAI,yBAAyB,EAAE,cAAc,GAAG,IAAW,CAAC;AACnE,eAAO,IAAI,gBAAgB,EAAE;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACjB,GAAG,IAAW,CAAC;AAGhB,eAAO,IAAI,YAAY,EAAE,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC;AACjE,eAAO,IAAI,YAAY,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;AAE5E;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAWjC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,IAAI,CAYrE;AAGD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAErD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAE1D;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAE9D;AAED,wBAAgB,mBAAmB,CAC/B,KAAK,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,GAC7C,IAAI,CAEN;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAEhE;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,IAAI,CAEjE;AAED,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,CAE3D;AAED,wBAAgB,4BAA4B,CACxC,KAAK,EAAE,cAAc,GAAG,IAAI,GAC7B,IAAI,CAEN"}
|
|
@@ -9,6 +9,9 @@ export let currentSearchValue = null;
|
|
|
9
9
|
export let activeLocale = null;
|
|
10
10
|
export let interactionBlockerOverlay = null;
|
|
11
11
|
export let pendingHighlight = null;
|
|
12
|
+
// Interactive mode callbacks
|
|
13
|
+
export let stateCapture;
|
|
14
|
+
export let stateRestore;
|
|
12
15
|
/**
|
|
13
16
|
* Reset all state when cleaning up.
|
|
14
17
|
*/
|
|
@@ -21,12 +24,16 @@ export function resetState() {
|
|
|
21
24
|
activeLocale = null;
|
|
22
25
|
interactionBlockerOverlay = null;
|
|
23
26
|
pendingHighlight = null;
|
|
27
|
+
stateCapture = undefined;
|
|
28
|
+
stateRestore = undefined;
|
|
24
29
|
}
|
|
25
30
|
/**
|
|
26
31
|
* Initialize state with global values.
|
|
27
32
|
*/
|
|
28
33
|
export function initializeState(options) {
|
|
29
34
|
opts = options;
|
|
35
|
+
stateCapture = options.stateCapture;
|
|
36
|
+
stateRestore = options.stateRestore;
|
|
30
37
|
// Seed activeLocale from the URL's ?locale= param so that the first
|
|
31
38
|
// CMS_HIGHLIGHT_KEY doesn't needlessly trigger a locale switch (and
|
|
32
39
|
// re-render) when the iframe already loaded with the correct locale.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/preview/internals/state.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,CAAC,IAAI,aAAa,GAAG,KAAK,CAAC;AACjC,MAAM,CAAC,IAAI,mBAAmB,GAAkB,EAAE,CAAC;AACnD,MAAM,CAAC,IAAI,IAAI,GAA2B,EAAE,CAAC;AAC7C,MAAM,CAAC,IAAI,gBAAgB,GAAkB,IAAI,CAAC;AAClD,MAAM,CAAC,IAAI,kBAAkB,GAAkB,IAAI,CAAC;AACpD,MAAM,CAAC,IAAI,YAAY,GAAkB,IAAI,CAAC;AAC9C,MAAM,CAAC,IAAI,yBAAyB,GAA0B,IAAI,CAAC;AACnE,MAAM,CAAC,IAAI,gBAAgB,GAGhB,IAAI,CAAC;AAEhB;;GAEG;AACH,MAAM,UAAU,UAAU;IACtB,aAAa,GAAG,KAAK,CAAC;IACtB,mBAAmB,GAAG,EAAE,CAAC;IACzB,IAAI,GAAG,EAAE,CAAC;IACV,gBAAgB,GAAG,IAAI,CAAC;IACxB,kBAAkB,GAAG,IAAI,CAAC;IAC1B,YAAY,GAAG,IAAI,CAAC;IACpB,yBAAyB,GAAG,IAAI,CAAC;IACjC,gBAAgB,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/preview/internals/state.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,CAAC,IAAI,aAAa,GAAG,KAAK,CAAC;AACjC,MAAM,CAAC,IAAI,mBAAmB,GAAkB,EAAE,CAAC;AACnD,MAAM,CAAC,IAAI,IAAI,GAA2B,EAAE,CAAC;AAC7C,MAAM,CAAC,IAAI,gBAAgB,GAAkB,IAAI,CAAC;AAClD,MAAM,CAAC,IAAI,kBAAkB,GAAkB,IAAI,CAAC;AACpD,MAAM,CAAC,IAAI,YAAY,GAAkB,IAAI,CAAC;AAC9C,MAAM,CAAC,IAAI,yBAAyB,GAA0B,IAAI,CAAC;AACnE,MAAM,CAAC,IAAI,gBAAgB,GAGhB,IAAI,CAAC;AAEhB,6BAA6B;AAC7B,MAAM,CAAC,IAAI,YAAqD,CAAC;AACjE,MAAM,CAAC,IAAI,YAAgE,CAAC;AAE5E;;GAEG;AACH,MAAM,UAAU,UAAU;IACtB,aAAa,GAAG,KAAK,CAAC;IACtB,mBAAmB,GAAG,EAAE,CAAC;IACzB,IAAI,GAAG,EAAE,CAAC;IACV,gBAAgB,GAAG,IAAI,CAAC;IACxB,kBAAkB,GAAG,IAAI,CAAC;IAC1B,YAAY,GAAG,IAAI,CAAC;IACpB,yBAAyB,GAAG,IAAI,CAAC;IACjC,gBAAgB,GAAG,IAAI,CAAC;IACxB,YAAY,GAAG,SAAS,CAAC;IACzB,YAAY,GAAG,SAAS,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAA+B;IAC3D,IAAI,GAAG,OAAO,CAAC;IACf,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IACpC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IACpC,oEAAoE;IACpE,oEAAoE;IACpE,qEAAqE;IACrE,IAAI,CAAC;QACD,YAAY,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC;QACL,YAAY,GAAG,IAAI,CAAC;IACxB,CAAC;AACL,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC3C,aAAa,GAAG,KAAK,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAoB;IAChD,YAAY,GAAG,KAAK,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAoB;IACpD,gBAAgB,GAAG,KAAK,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAC/B,KAA4C;IAE5C,gBAAgB,GAAG,KAAK,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAoB;IACtD,kBAAkB,GAAG,KAAK,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAoB;IACvD,mBAAmB,GAAG,KAAK,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,EAAe;IACjD,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,4BAA4B,CACxC,KAA4B;IAE5B,yBAAyB,GAAG,KAAK,CAAC;AACtC,CAAC"}
|
|
@@ -21,6 +21,15 @@ export interface CMSSwitchLocaleMessage {
|
|
|
21
21
|
type: 'CMS_SWITCH_LOCALE';
|
|
22
22
|
locale: string;
|
|
23
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Sent from app to CMS when user navigates in interactive mode.
|
|
26
|
+
* Allows CMS to track which route the editor is viewing.
|
|
27
|
+
*/
|
|
28
|
+
export interface CMSNavigateMessage {
|
|
29
|
+
type: 'CMS_NAVIGATE';
|
|
30
|
+
url: string;
|
|
31
|
+
state?: Record<string, any>;
|
|
32
|
+
}
|
|
24
33
|
export interface PreviewListenerOptions {
|
|
25
34
|
/**
|
|
26
35
|
* Custom CSS to apply to highlighted elements.
|
|
@@ -45,5 +54,21 @@ export interface PreviewListenerOptions {
|
|
|
45
54
|
* When omitted, the listener looks for `window.__cmsSetLocale(locale)`.
|
|
46
55
|
*/
|
|
47
56
|
onLocaleSwitch?: (locale: string) => void;
|
|
57
|
+
/**
|
|
58
|
+
* Enable interactive mode: allow clicks, form interactions, navigation.
|
|
59
|
+
* When enabled, the preview is fully interactive instead of read-only.
|
|
60
|
+
* @default false
|
|
61
|
+
*/
|
|
62
|
+
interactiveMode?: boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Capture the current app state (e.g., open dialogs, form values).
|
|
65
|
+
* Called before navigation to preserve context.
|
|
66
|
+
*/
|
|
67
|
+
stateCapture?: () => Record<string, any>;
|
|
68
|
+
/**
|
|
69
|
+
* Restore app state after navigation (e.g., reopen dialogs).
|
|
70
|
+
* Allows editors to maintain their position when clicking through.
|
|
71
|
+
*/
|
|
72
|
+
stateRestore?: (state: Record<string, any>) => void;
|
|
48
73
|
}
|
|
49
74
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/preview/internals/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,WAAW,mBAAmB;IAChC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACjC,IAAI,EAAE,iBAAiB,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACnC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;CAClB;AAMD,MAAM,WAAW,sBAAsB;IACnC;;;OAGG;IACH,eAAe,CAAC,EAAE;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC5B,CAAC;IACF;;;;;;;;;;;OAWG;IACH,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/preview/internals/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,WAAW,mBAAmB;IAChC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACjC,IAAI,EAAE,iBAAiB,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACnC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IAC/B,IAAI,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC/B;AAMD,MAAM,WAAW,sBAAsB;IACnC;;;OAGG;IACH,eAAe,CAAC,EAAE;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC5B,CAAC;IACF;;;;;;;;;;;OAWG;IACH,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACzC;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;CACvD"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI Indicators for interactive preview mode.
|
|
3
|
+
* Shows current URL, state, and navigation feedback.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Create and inject the UI breadcrumb bar showing current URL/state.
|
|
7
|
+
*/
|
|
8
|
+
export declare function injectUIIndicators(): void;
|
|
9
|
+
/** Remove UI indicators. */
|
|
10
|
+
export declare function removeUIIndicators(): void;
|
|
11
|
+
/**
|
|
12
|
+
* Update the URL display in the breadcrumb bar.
|
|
13
|
+
*/
|
|
14
|
+
export declare function updateURLDisplay(url: string): void;
|
|
15
|
+
/**
|
|
16
|
+
* Update the state display (e.g., showing captured state summary).
|
|
17
|
+
*/
|
|
18
|
+
export declare function updateStateDisplay(state: Record<string, any> | undefined): void;
|
|
19
|
+
/**
|
|
20
|
+
* Show a temporary navigation feedback indicator.
|
|
21
|
+
*/
|
|
22
|
+
export declare function showNavigationFeedback(fromUrl: string, toUrl: string): void;
|
|
23
|
+
//# sourceMappingURL=ui-indicators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-indicators.d.ts","sourceRoot":"","sources":["../../../src/preview/internals/ui-indicators.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CA6DzC;AAED,4BAA4B;AAC5B,wBAAgB,kBAAkB,IAAI,IAAI,CAOzC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAUlD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,GACvC,IAAI,CAqBN;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAuC3E"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI Indicators for interactive preview mode.
|
|
3
|
+
* Shows current URL, state, and navigation feedback.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Create and inject the UI breadcrumb bar showing current URL/state.
|
|
7
|
+
*/
|
|
8
|
+
export function injectUIIndicators() {
|
|
9
|
+
// Create container
|
|
10
|
+
const container = document.createElement('div');
|
|
11
|
+
container.id = 'cms-preview-ui-indicators';
|
|
12
|
+
container.setAttribute('data-cms-ui', 'true');
|
|
13
|
+
container.innerHTML = `
|
|
14
|
+
<div style="
|
|
15
|
+
position: fixed;
|
|
16
|
+
top: 0;
|
|
17
|
+
left: 0;
|
|
18
|
+
right: 0;
|
|
19
|
+
height: 40px;
|
|
20
|
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
21
|
+
color: white;
|
|
22
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
|
23
|
+
font-size: 12px;
|
|
24
|
+
padding: 8px 16px;
|
|
25
|
+
display: flex;
|
|
26
|
+
align-items: center;
|
|
27
|
+
justify-content: space-between;
|
|
28
|
+
box-shadow: 0 2px 8px rgba(0,0,0,0.15);
|
|
29
|
+
z-index: 2147483647;
|
|
30
|
+
gap: 16px;
|
|
31
|
+
">
|
|
32
|
+
<div style="flex: 1; display: flex; align-items: center; gap: 8px; overflow: hidden;">
|
|
33
|
+
<span style="
|
|
34
|
+
font-weight: 600;
|
|
35
|
+
padding: 2px 8px;
|
|
36
|
+
background: rgba(255,255,255,0.2);
|
|
37
|
+
border-radius: 4px;
|
|
38
|
+
white-space: nowrap;
|
|
39
|
+
">CMS Preview</span>
|
|
40
|
+
<code id="cms-ui-url" style="
|
|
41
|
+
flex: 1;
|
|
42
|
+
overflow: hidden;
|
|
43
|
+
text-overflow: ellipsis;
|
|
44
|
+
white-space: nowrap;
|
|
45
|
+
background: rgba(0,0,0,0.1);
|
|
46
|
+
padding: 2px 6px;
|
|
47
|
+
border-radius: 2px;
|
|
48
|
+
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
|
|
49
|
+
">...</code>
|
|
50
|
+
</div>
|
|
51
|
+
<div id="cms-ui-state" style="
|
|
52
|
+
font-size: 10px;
|
|
53
|
+
padding: 2px 8px;
|
|
54
|
+
background: rgba(0,0,0,0.1);
|
|
55
|
+
border-radius: 4px;
|
|
56
|
+
max-width: 200px;
|
|
57
|
+
overflow: hidden;
|
|
58
|
+
text-overflow: ellipsis;
|
|
59
|
+
"></div>
|
|
60
|
+
</div>
|
|
61
|
+
`;
|
|
62
|
+
document.body?.insertBefore(container, document.body.firstChild);
|
|
63
|
+
// Adjust body margin to make room for the indicator
|
|
64
|
+
const originalMarginTop = document.body.style.marginTop || '0px';
|
|
65
|
+
document.body.style.marginTop = `calc(${originalMarginTop} + 40px)`;
|
|
66
|
+
console.log('[CMS Preview] UI indicators injected');
|
|
67
|
+
}
|
|
68
|
+
/** Remove UI indicators. */
|
|
69
|
+
export function removeUIIndicators() {
|
|
70
|
+
const container = document.getElementById('cms-preview-ui-indicators');
|
|
71
|
+
if (container) {
|
|
72
|
+
container.remove();
|
|
73
|
+
// Restore body margin
|
|
74
|
+
document.body.style.marginTop = '0px';
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Update the URL display in the breadcrumb bar.
|
|
79
|
+
*/
|
|
80
|
+
export function updateURLDisplay(url) {
|
|
81
|
+
const urlEl = document.getElementById('cms-ui-url');
|
|
82
|
+
if (urlEl) {
|
|
83
|
+
try {
|
|
84
|
+
const urlObj = new URL(url);
|
|
85
|
+
urlEl.textContent = urlObj.pathname + urlObj.search + urlObj.hash;
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
urlEl.textContent = url;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Update the state display (e.g., showing captured state summary).
|
|
94
|
+
*/
|
|
95
|
+
export function updateStateDisplay(state) {
|
|
96
|
+
const stateEl = document.getElementById('cms-ui-state');
|
|
97
|
+
if (!stateEl)
|
|
98
|
+
return;
|
|
99
|
+
if (!state || Object.keys(state).length === 0) {
|
|
100
|
+
stateEl.textContent = '';
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
// Show a summary of captured state
|
|
104
|
+
const summary = Object.entries(state)
|
|
105
|
+
.map(([key, val]) => {
|
|
106
|
+
if (typeof val === 'number')
|
|
107
|
+
return `${key}: ${val}`;
|
|
108
|
+
if (typeof val === 'boolean')
|
|
109
|
+
return `${key}: ${val}`;
|
|
110
|
+
if (typeof val === 'string')
|
|
111
|
+
return `${key}: "${val.slice(0, 10)}"`;
|
|
112
|
+
return `${key}: …`;
|
|
113
|
+
})
|
|
114
|
+
.slice(0, 3)
|
|
115
|
+
.join(', ');
|
|
116
|
+
stateEl.textContent = `State: ${summary}${Object.keys(state).length > 3 ? '…' : ''}`;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Show a temporary navigation feedback indicator.
|
|
120
|
+
*/
|
|
121
|
+
export function showNavigationFeedback(fromUrl, toUrl) {
|
|
122
|
+
const feedback = document.createElement('div');
|
|
123
|
+
feedback.setAttribute('data-cms-feedback', 'true');
|
|
124
|
+
feedback.style.cssText = `
|
|
125
|
+
position: fixed;
|
|
126
|
+
top: 50%;
|
|
127
|
+
left: 50%;
|
|
128
|
+
transform: translate(-50%, -50%);
|
|
129
|
+
background: rgba(102, 126, 234, 0.95);
|
|
130
|
+
color: white;
|
|
131
|
+
padding: 16px 24px;
|
|
132
|
+
border-radius: 8px;
|
|
133
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
|
134
|
+
font-size: 13px;
|
|
135
|
+
box-shadow: 0 8px 24px rgba(0,0,0,0.25);
|
|
136
|
+
z-index: 2147483648;
|
|
137
|
+
pointer-events: none;
|
|
138
|
+
max-width: 400px;
|
|
139
|
+
text-align: center;
|
|
140
|
+
`;
|
|
141
|
+
const fromUrlObj = new URL(fromUrl);
|
|
142
|
+
const toUrlObj = new URL(toUrl);
|
|
143
|
+
feedback.innerHTML = `
|
|
144
|
+
<div style="font-weight: 600; margin-bottom: 4px;">Navigating</div>
|
|
145
|
+
<div style="font-size: 11px; opacity: 0.9;">
|
|
146
|
+
${fromUrlObj.pathname} → ${toUrlObj.pathname}
|
|
147
|
+
</div>
|
|
148
|
+
`;
|
|
149
|
+
document.body?.appendChild(feedback);
|
|
150
|
+
// Auto-remove after 1.5 seconds
|
|
151
|
+
setTimeout(() => {
|
|
152
|
+
feedback.style.opacity = '0';
|
|
153
|
+
feedback.style.transition = 'opacity 0.3s ease';
|
|
154
|
+
setTimeout(() => feedback.remove(), 300);
|
|
155
|
+
}, 1500);
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=ui-indicators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-indicators.js","sourceRoot":"","sources":["../../../src/preview/internals/ui-indicators.ts"],"names":[],"mappings":"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"}
|