@translation-cms/sync 1.2.28 → 1.2.30
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/api.d.ts +105 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +208 -0
- package/dist/api.js.map +1 -0
- package/dist/bin.d.ts +25 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +208 -0
- package/dist/bin.js.map +1 -0
- package/dist/commands/init.d.ts +10 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +107 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/pull.d.ts +10 -0
- package/dist/commands/pull.d.ts.map +1 -0
- package/dist/commands/pull.js +35 -0
- package/dist/commands/pull.js.map +1 -0
- package/dist/commands/status.d.ts +15 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +62 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/sync.d.ts +24 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +131 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/watch.d.ts +18 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +71 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/config/config-internals/args.d.ts +11 -0
- package/dist/config/config-internals/args.d.ts.map +1 -0
- package/dist/config/config-internals/args.js +22 -0
- package/dist/config/config-internals/args.js.map +1 -0
- package/dist/config/config-internals/env.d.ts +10 -0
- package/dist/config/config-internals/env.d.ts.map +1 -0
- package/dist/config/config-internals/env.js +35 -0
- package/dist/config/config-internals/env.js.map +1 -0
- package/dist/config/config-internals/file.d.ts +11 -0
- package/dist/config/config-internals/file.d.ts.map +1 -0
- package/dist/config/config-internals/file.js +28 -0
- package/dist/config/config-internals/file.js.map +1 -0
- package/dist/config/config-internals/resolve.d.ts +21 -0
- package/dist/config/config-internals/resolve.d.ts.map +1 -0
- package/dist/config/config-internals/resolve.js +73 -0
- package/dist/config/config-internals/resolve.js.map +1 -0
- package/dist/config/config-internals/root.d.ts +9 -0
- package/dist/config/config-internals/root.d.ts.map +1 -0
- package/dist/config/config-internals/root.js +22 -0
- package/dist/config/config-internals/root.js.map +1 -0
- package/dist/config/config-internals/types.d.ts +91 -0
- package/dist/config/config-internals/types.d.ts.map +1 -0
- package/dist/config/config-internals/types.js +9 -0
- package/dist/config/config-internals/types.js.map +1 -0
- package/dist/config/resolve-config.d.ts +11 -0
- package/dist/config/resolve-config.d.ts.map +1 -0
- package/dist/config/resolve-config.js +10 -0
- package/dist/config/resolve-config.js.map +1 -0
- package/dist/core/api-internals/helpers.d.ts +9 -0
- package/dist/core/api-internals/helpers.d.ts.map +1 -0
- package/dist/core/api-internals/helpers.js +14 -0
- package/dist/core/api-internals/helpers.js.map +1 -0
- package/dist/core/api-internals/pull.d.ts +19 -0
- package/dist/core/api-internals/pull.d.ts.map +1 -0
- package/dist/core/api-internals/pull.js +269 -0
- package/dist/core/api-internals/pull.js.map +1 -0
- package/dist/core/api-internals/route-config.d.ts +13 -0
- package/dist/core/api-internals/route-config.d.ts.map +1 -0
- package/dist/core/api-internals/route-config.js +34 -0
- package/dist/core/api-internals/route-config.js.map +1 -0
- package/dist/core/api-internals/sync.d.ts +19 -0
- package/dist/core/api-internals/sync.d.ts.map +1 -0
- package/dist/core/api-internals/sync.js +139 -0
- package/dist/core/api-internals/sync.js.map +1 -0
- package/dist/core/api-internals/types.d.ts +33 -0
- package/dist/core/api-internals/types.d.ts.map +1 -0
- package/dist/core/api-internals/types.js +5 -0
- package/dist/core/api-internals/types.js.map +1 -0
- package/dist/core/api.d.ts +11 -0
- package/dist/core/api.d.ts.map +1 -0
- package/dist/core/api.js +11 -0
- package/dist/core/api.js.map +1 -0
- package/dist/core/cache-internals/format.d.ts +20 -0
- package/dist/core/cache-internals/format.d.ts.map +1 -0
- package/dist/core/cache-internals/format.js +33 -0
- package/dist/core/cache-internals/format.js.map +1 -0
- package/dist/core/cache-internals/params.d.ts +33 -0
- package/dist/core/cache-internals/params.d.ts.map +1 -0
- package/dist/core/cache-internals/params.js +155 -0
- package/dist/core/cache-internals/params.js.map +1 -0
- package/dist/core/cache-internals/pull.d.ts +17 -0
- package/dist/core/cache-internals/pull.d.ts.map +1 -0
- package/dist/core/cache-internals/pull.js +34 -0
- package/dist/core/cache-internals/pull.js.map +1 -0
- package/dist/core/cache-internals/sync.d.ts +29 -0
- package/dist/core/cache-internals/sync.d.ts.map +1 -0
- package/dist/core/cache-internals/sync.js +104 -0
- package/dist/core/cache-internals/sync.js.map +1 -0
- package/dist/core/cache-internals/types.d.ts +48 -0
- package/dist/core/cache-internals/types.d.ts.map +1 -0
- package/dist/core/cache-internals/types.js +2 -0
- package/dist/core/cache-internals/types.js.map +1 -0
- package/dist/core/cache.d.ts +13 -0
- package/dist/core/cache.d.ts.map +1 -0
- package/dist/core/cache.js +33 -0
- package/dist/core/cache.js.map +1 -0
- package/dist/core/scanner-internals/ast.d.ts +40 -0
- package/dist/core/scanner-internals/ast.d.ts.map +1 -0
- package/dist/core/scanner-internals/ast.js +100 -0
- package/dist/core/scanner-internals/ast.js.map +1 -0
- package/dist/core/scanner-internals/file-walker.d.ts +10 -0
- package/dist/core/scanner-internals/file-walker.d.ts.map +1 -0
- package/dist/core/scanner-internals/file-walker.js +23 -0
- package/dist/core/scanner-internals/file-walker.js.map +1 -0
- package/dist/core/scanner-internals/import-resolver.d.ts +21 -0
- package/dist/core/scanner-internals/import-resolver.d.ts.map +1 -0
- package/dist/core/scanner-internals/import-resolver.js +119 -0
- package/dist/core/scanner-internals/import-resolver.js.map +1 -0
- package/dist/core/scanner-internals/key-extractor.d.ts +20 -0
- package/dist/core/scanner-internals/key-extractor.d.ts.map +1 -0
- package/dist/core/scanner-internals/key-extractor.js +274 -0
- package/dist/core/scanner-internals/key-extractor.js.map +1 -0
- package/dist/core/scanner-internals/nav-config-scanner.d.ts +30 -0
- package/dist/core/scanner-internals/nav-config-scanner.d.ts.map +1 -0
- package/dist/core/scanner-internals/nav-config-scanner.js +170 -0
- package/dist/core/scanner-internals/nav-config-scanner.js.map +1 -0
- package/dist/core/scanner-internals/route-detector.d.ts +27 -0
- package/dist/core/scanner-internals/route-detector.d.ts.map +1 -0
- package/dist/core/scanner-internals/route-detector.js +78 -0
- package/dist/core/scanner-internals/route-detector.js.map +1 -0
- package/dist/core/scanner-internals/types.d.ts +60 -0
- package/dist/core/scanner-internals/types.d.ts.map +1 -0
- package/dist/core/scanner-internals/types.js +29 -0
- package/dist/core/scanner-internals/types.js.map +1 -0
- package/dist/core/scanner.d.ts +21 -0
- package/dist/core/scanner.d.ts.map +1 -0
- package/dist/core/scanner.js +162 -0
- package/dist/core/scanner.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/next.d.ts +33 -0
- package/dist/next.d.ts.map +1 -0
- package/dist/next.js +110 -0
- package/dist/next.js.map +1 -0
- package/dist/preview/index.d.ts +39 -0
- package/dist/preview/index.d.ts.map +1 -0
- package/dist/preview/index.js +123 -0
- package/dist/preview/index.js.map +1 -0
- package/dist/preview/internals/highlight.d.ts +31 -0
- package/dist/preview/internals/highlight.d.ts.map +1 -0
- package/dist/preview/internals/highlight.js +184 -0
- package/dist/preview/internals/highlight.js.map +1 -0
- package/dist/preview/internals/interactions.d.ts +15 -0
- package/dist/preview/internals/interactions.d.ts.map +1 -0
- package/dist/preview/internals/interactions.js +38 -0
- package/dist/preview/internals/interactions.js.map +1 -0
- 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 +122 -0
- package/dist/preview/internals/interactive.js.map +1 -0
- package/dist/preview/internals/locales.d.ts +9 -0
- package/dist/preview/internals/locales.d.ts.map +1 -0
- package/dist/preview/internals/locales.js +24 -0
- package/dist/preview/internals/locales.js.map +1 -0
- package/dist/preview/internals/state.d.ts +37 -0
- package/dist/preview/internals/state.d.ts.map +1 -0
- package/dist/preview/internals/state.js +74 -0
- package/dist/preview/internals/state.js.map +1 -0
- package/dist/preview/internals/styles.d.ts +8 -0
- package/dist/preview/internals/styles.d.ts.map +1 -0
- package/dist/preview/internals/styles.js +28 -0
- package/dist/preview/internals/styles.js.map +1 -0
- package/dist/preview/internals/types.d.ts +74 -0
- package/dist/preview/internals/types.d.ts.map +1 -0
- package/dist/preview/internals/types.js +5 -0
- package/dist/preview/internals/types.js.map +1 -0
- package/dist/preview/internals/ui-indicators.d.ts +15 -0
- package/dist/preview/internals/ui-indicators.d.ts.map +1 -0
- package/dist/preview/internals/ui-indicators.js +92 -0
- package/dist/preview/internals/ui-indicators.js.map +1 -0
- package/dist/scaffold/index.d.ts +3 -0
- package/dist/scaffold/index.d.ts.map +1 -0
- package/dist/scaffold/index.js +3 -0
- package/dist/scaffold/index.js.map +1 -0
- package/dist/scaffold/intenrals/scaffold.d.ts +24 -0
- package/dist/scaffold/intenrals/scaffold.d.ts.map +1 -0
- package/dist/scaffold/intenrals/scaffold.js +53 -0
- package/dist/scaffold/intenrals/scaffold.js.map +1 -0
- package/dist/scaffold/intenrals/templates.d.ts +10 -0
- package/dist/scaffold/intenrals/templates.d.ts.map +1 -0
- package/dist/scaffold/intenrals/templates.js +344 -0
- package/dist/scaffold/intenrals/templates.js.map +1 -0
- package/dist/scaffold/intenrals/types.d.ts +14 -0
- package/dist/scaffold/intenrals/types.d.ts.map +1 -0
- package/dist/scaffold/intenrals/types.js +5 -0
- package/dist/scaffold/intenrals/types.js.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,122 @@
|
|
|
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 { updateStateDisplay } 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
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
109
|
+
function reportNavigation(url, appState) {
|
|
110
|
+
if (!window.top || window.top === window)
|
|
111
|
+
return;
|
|
112
|
+
const message = {
|
|
113
|
+
type: 'CMS_NAVIGATE',
|
|
114
|
+
url,
|
|
115
|
+
state: appState,
|
|
116
|
+
};
|
|
117
|
+
// Update UI displays
|
|
118
|
+
updateStateDisplay(appState);
|
|
119
|
+
window.top.postMessage(message, '*');
|
|
120
|
+
console.log(`[CMS Preview] Navigated to: ${url}`);
|
|
121
|
+
}
|
|
122
|
+
//# 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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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Locale switching logic for preview listener.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Handle a locale switch request from the CMS.
|
|
6
|
+
* Tries the provided callback first, then falls back to window.__cmsSetLocale.
|
|
7
|
+
*/
|
|
8
|
+
export declare function handleLocaleSwitch(locale: string): void;
|
|
9
|
+
//# sourceMappingURL=locales.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../../../src/preview/internals/locales.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAmBvD"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Locale switching logic for preview listener.
|
|
3
|
+
*/
|
|
4
|
+
import * as state from './state.js';
|
|
5
|
+
/**
|
|
6
|
+
* Handle a locale switch request from the CMS.
|
|
7
|
+
* Tries the provided callback first, then falls back to window.__cmsSetLocale.
|
|
8
|
+
*/
|
|
9
|
+
export function handleLocaleSwitch(locale) {
|
|
10
|
+
console.log(`[CMS Preview] Switching locale to: ${locale}`);
|
|
11
|
+
if (state.opts.onLocaleSwitch) {
|
|
12
|
+
state.opts.onLocaleSwitch(locale);
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
// Fallback: look for window.__cmsSetLocale (set by the consuming app)
|
|
16
|
+
const globalObj = globalThis;
|
|
17
|
+
if (typeof globalObj['__cmsSetLocale'] === 'function') {
|
|
18
|
+
globalObj['__cmsSetLocale'](locale);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
console.warn('[CMS Preview] No locale switch handler found. ' +
|
|
22
|
+
'Provide onLocaleSwitch option or expose window.__cmsSetLocale(locale).');
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=locales.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"locales.js","sourceRoot":"","sources":["../../../src/preview/internals/locales.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AAEpC;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC7C,OAAO,CAAC,GAAG,CAAC,sCAAsC,MAAM,EAAE,CAAC,CAAC;IAE5D,IAAI,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAClC,OAAO;IACX,CAAC;IAED,sEAAsE;IACtE,MAAM,SAAS,GAAG,UAAqC,CAAC;IACxD,IAAI,OAAO,SAAS,CAAC,gBAAgB,CAAC,KAAK,UAAU,EAAE,CAAC;QACnD,SAAS,CAAC,gBAAgB,CAAyB,CAAC,MAAM,CAAC,CAAC;QAC7D,OAAO;IACX,CAAC;IAED,OAAO,CAAC,IAAI,CACR,gDAAgD;QAC5C,wEAAwE,CAC/E,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State management for preview listener.
|
|
3
|
+
*/
|
|
4
|
+
import type { PreviewListenerOptions } from './types.js';
|
|
5
|
+
export declare let isInitialized: boolean;
|
|
6
|
+
export declare let highlightedElements: HTMLElement[];
|
|
7
|
+
export declare let opts: PreviewListenerOptions;
|
|
8
|
+
export declare let currentLiveValue: string | null;
|
|
9
|
+
export declare let currentSearchValue: string | null;
|
|
10
|
+
export declare let activeLocale: string | null;
|
|
11
|
+
export declare let interactionBlockerOverlay: HTMLDivElement | null;
|
|
12
|
+
export declare let pendingHighlight: {
|
|
13
|
+
key: string;
|
|
14
|
+
value: string;
|
|
15
|
+
} | null;
|
|
16
|
+
export declare let stateCapture: (() => Record<string, any>) | undefined;
|
|
17
|
+
export declare let stateRestore: ((state: Record<string, any>) => void) | undefined;
|
|
18
|
+
/**
|
|
19
|
+
* Reset all state when cleaning up.
|
|
20
|
+
*/
|
|
21
|
+
export declare function resetState(): void;
|
|
22
|
+
/**
|
|
23
|
+
* Initialize state with global values.
|
|
24
|
+
*/
|
|
25
|
+
export declare function initializeState(options: PreviewListenerOptions): void;
|
|
26
|
+
export declare function setIsInitialized(value: boolean): void;
|
|
27
|
+
export declare function setActiveLocale(value: string | null): void;
|
|
28
|
+
export declare function setCurrentLiveValue(value: string | null): void;
|
|
29
|
+
export declare function setPendingHighlight(value: {
|
|
30
|
+
key: string;
|
|
31
|
+
value: string;
|
|
32
|
+
} | null): void;
|
|
33
|
+
export declare function setCurrentSearchValue(value: string | null): void;
|
|
34
|
+
export declare function setHighlightedElements(value: HTMLElement[]): void;
|
|
35
|
+
export declare function addHighlightedElement(el: HTMLElement): void;
|
|
36
|
+
export declare function setInteractionBlockerOverlay(value: HTMLDivElement | null): void;
|
|
37
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +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;AAIhB,eAAO,IAAI,YAAY,EAAE,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC;AAEjE,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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State management for preview listener.
|
|
3
|
+
*/
|
|
4
|
+
export let isInitialized = false;
|
|
5
|
+
export let highlightedElements = [];
|
|
6
|
+
export let opts = {};
|
|
7
|
+
export let currentLiveValue = null;
|
|
8
|
+
export let currentSearchValue = null;
|
|
9
|
+
export let activeLocale = null;
|
|
10
|
+
export let interactionBlockerOverlay = null;
|
|
11
|
+
export let pendingHighlight = null;
|
|
12
|
+
// Interactive mode callbacks
|
|
13
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
14
|
+
export let stateCapture;
|
|
15
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
16
|
+
export let stateRestore;
|
|
17
|
+
/**
|
|
18
|
+
* Reset all state when cleaning up.
|
|
19
|
+
*/
|
|
20
|
+
export function resetState() {
|
|
21
|
+
isInitialized = false;
|
|
22
|
+
highlightedElements = [];
|
|
23
|
+
opts = {};
|
|
24
|
+
currentLiveValue = null;
|
|
25
|
+
currentSearchValue = null;
|
|
26
|
+
activeLocale = null;
|
|
27
|
+
interactionBlockerOverlay = null;
|
|
28
|
+
pendingHighlight = null;
|
|
29
|
+
stateCapture = undefined;
|
|
30
|
+
stateRestore = undefined;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Initialize state with global values.
|
|
34
|
+
*/
|
|
35
|
+
export function initializeState(options) {
|
|
36
|
+
opts = options;
|
|
37
|
+
stateCapture = options.stateCapture;
|
|
38
|
+
stateRestore = options.stateRestore;
|
|
39
|
+
// Seed activeLocale from the URL's ?locale= param so that the first
|
|
40
|
+
// CMS_HIGHLIGHT_KEY doesn't needlessly trigger a locale switch (and
|
|
41
|
+
// re-render) when the iframe already loaded with the correct locale.
|
|
42
|
+
try {
|
|
43
|
+
activeLocale = new URL(window.location.href).searchParams.get('locale');
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
activeLocale = null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Setter functions for accessing from different modules
|
|
50
|
+
export function setIsInitialized(value) {
|
|
51
|
+
isInitialized = value;
|
|
52
|
+
}
|
|
53
|
+
export function setActiveLocale(value) {
|
|
54
|
+
activeLocale = value;
|
|
55
|
+
}
|
|
56
|
+
export function setCurrentLiveValue(value) {
|
|
57
|
+
currentLiveValue = value;
|
|
58
|
+
}
|
|
59
|
+
export function setPendingHighlight(value) {
|
|
60
|
+
pendingHighlight = value;
|
|
61
|
+
}
|
|
62
|
+
export function setCurrentSearchValue(value) {
|
|
63
|
+
currentSearchValue = value;
|
|
64
|
+
}
|
|
65
|
+
export function setHighlightedElements(value) {
|
|
66
|
+
highlightedElements = value;
|
|
67
|
+
}
|
|
68
|
+
export function addHighlightedElement(el) {
|
|
69
|
+
highlightedElements.push(el);
|
|
70
|
+
}
|
|
71
|
+
export function setInteractionBlockerOverlay(value) {
|
|
72
|
+
interactionBlockerOverlay = value;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +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,6BAA6B;AAC7B,8DAA8D;AAC9D,MAAM,CAAC,IAAI,YAAqD,CAAC;AACjE,8DAA8D;AAC9D,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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../src/preview/internals/styles.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAoBnC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CSS styles for preview highlight elements.
|
|
3
|
+
*/
|
|
4
|
+
import * as state from './state.js';
|
|
5
|
+
/**
|
|
6
|
+
* Inject highlight styles into the document.
|
|
7
|
+
*/
|
|
8
|
+
export function injectStyles() {
|
|
9
|
+
const custom = state.opts.highlightStyles ?? {};
|
|
10
|
+
const outline = custom.outline ?? '2px solid #3B82F6';
|
|
11
|
+
const outlineOffset = custom.outlineOffset ?? '3px';
|
|
12
|
+
const borderRadius = custom.borderRadius ?? '3px';
|
|
13
|
+
const backgroundColor = custom.backgroundColor ?? 'transparent';
|
|
14
|
+
const style = document.createElement('style');
|
|
15
|
+
style.textContent = `
|
|
16
|
+
.cms-preview-highlight {
|
|
17
|
+
outline: ${outline} !important;
|
|
18
|
+
outline-offset: ${outlineOffset} !important;
|
|
19
|
+
border-radius: ${borderRadius};
|
|
20
|
+
background-color: ${backgroundColor};
|
|
21
|
+
position: relative;
|
|
22
|
+
z-index: 9999;
|
|
23
|
+
transition: outline 0.15s ease;
|
|
24
|
+
}
|
|
25
|
+
`;
|
|
26
|
+
document.head.appendChild(style);
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=styles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../src/preview/internals/styles.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AAEpC;;GAEG;AACH,MAAM,UAAU,YAAY;IACxB,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC;IAChD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,mBAAmB,CAAC;IACtD,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,IAAI,KAAK,CAAC;IACpD,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,KAAK,CAAC;IAClD,MAAM,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI,aAAa,CAAC;IAEhE,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC9C,KAAK,CAAC,WAAW,GAAG;;uBAED,OAAO;8BACA,aAAa;6BACd,YAAY;gCACT,eAAe;;;;;KAK1C,CAAC;IACF,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message types and public API types for preview listener.
|
|
3
|
+
*/
|
|
4
|
+
export interface CMSHighlightMessage {
|
|
5
|
+
type: 'CMS_HIGHLIGHT_KEY';
|
|
6
|
+
key: string;
|
|
7
|
+
value: string;
|
|
8
|
+
locale: string;
|
|
9
|
+
}
|
|
10
|
+
export interface CMSLiveUpdateMessage {
|
|
11
|
+
type: 'CMS_LIVE_UPDATE';
|
|
12
|
+
oldValue: string;
|
|
13
|
+
newValue: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Switch the active locale without reloading the page.
|
|
17
|
+
* Requires your app to expose a `window.__cmsSetLocale(locale)` callback.
|
|
18
|
+
* The CMS sends this when the user changes locale in the preview toolbar.
|
|
19
|
+
*/
|
|
20
|
+
export interface CMSSwitchLocaleMessage {
|
|
21
|
+
type: 'CMS_SWITCH_LOCALE';
|
|
22
|
+
locale: string;
|
|
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
|
+
}
|
|
33
|
+
export interface PreviewListenerOptions {
|
|
34
|
+
/**
|
|
35
|
+
* Custom CSS to apply to highlighted elements.
|
|
36
|
+
* If not provided, uses default blue outline.
|
|
37
|
+
*/
|
|
38
|
+
highlightStyles?: {
|
|
39
|
+
outline?: string;
|
|
40
|
+
outlineOffset?: string;
|
|
41
|
+
borderRadius?: string;
|
|
42
|
+
backgroundColor?: string;
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Called when the CMS requests a locale switch.
|
|
46
|
+
* Use this to integrate with your i18n library:
|
|
47
|
+
*
|
|
48
|
+
* ```ts
|
|
49
|
+
* initPreviewListener({
|
|
50
|
+
* onLocaleSwitch: (locale) => i18n.changeLanguage(locale),
|
|
51
|
+
* });
|
|
52
|
+
* ```
|
|
53
|
+
*
|
|
54
|
+
* When omitted, the listener looks for `window.__cmsSetLocale(locale)`.
|
|
55
|
+
*/
|
|
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;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +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;AAED;;;GAGG;AAEH,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;IAEH,YAAY,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACzC;;;OAGG;IAEH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;CACvD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/preview/internals/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,15 @@
|
|
|
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 state display (e.g., showing captured state summary).
|
|
13
|
+
*/
|
|
14
|
+
export declare function updateStateDisplay(state: Record<string, any> | undefined): void;
|
|
15
|
+
//# 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,CAkDzC;AAED,4BAA4B;AAC5B,wBAAgB,kBAAkB,IAAI,IAAI,CAOzC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,GACvC,IAAI,CAqBN"}
|
|
@@ -0,0 +1,92 @@
|
|
|
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: #3b82f6;
|
|
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;">
|
|
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
|
+
</div>
|
|
41
|
+
<div id="cms-ui-state" style="
|
|
42
|
+
font-size: 10px;
|
|
43
|
+
padding: 2px 8px;
|
|
44
|
+
background: rgba(0,0,0,0.1);
|
|
45
|
+
border-radius: 4px;
|
|
46
|
+
max-width: 200px;
|
|
47
|
+
overflow: hidden;
|
|
48
|
+
text-overflow: ellipsis;
|
|
49
|
+
"></div>
|
|
50
|
+
</div>
|
|
51
|
+
`;
|
|
52
|
+
document.body?.insertBefore(container, document.body.firstChild);
|
|
53
|
+
// Adjust body padding to make room for the indicator
|
|
54
|
+
document.body.style.paddingTop = '40px';
|
|
55
|
+
console.log('[CMS Preview] UI indicators injected');
|
|
56
|
+
}
|
|
57
|
+
/** Remove UI indicators. */
|
|
58
|
+
export function removeUIIndicators() {
|
|
59
|
+
const container = document.getElementById('cms-preview-ui-indicators');
|
|
60
|
+
if (container) {
|
|
61
|
+
container.remove();
|
|
62
|
+
// Restore body padding
|
|
63
|
+
document.body.style.paddingTop = '0px';
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Update the state display (e.g., showing captured state summary).
|
|
68
|
+
*/
|
|
69
|
+
export function updateStateDisplay(state) {
|
|
70
|
+
const stateEl = document.getElementById('cms-ui-state');
|
|
71
|
+
if (!stateEl)
|
|
72
|
+
return;
|
|
73
|
+
if (!state || Object.keys(state).length === 0) {
|
|
74
|
+
stateEl.textContent = '';
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
// Show a summary of captured state
|
|
78
|
+
const summary = Object.entries(state)
|
|
79
|
+
.map(([key, val]) => {
|
|
80
|
+
if (typeof val === 'number')
|
|
81
|
+
return `${key}: ${val}`;
|
|
82
|
+
if (typeof val === 'boolean')
|
|
83
|
+
return `${key}: ${val}`;
|
|
84
|
+
if (typeof val === 'string')
|
|
85
|
+
return `${key}: "${val.slice(0, 10)}"`;
|
|
86
|
+
return `${key}: …`;
|
|
87
|
+
})
|
|
88
|
+
.slice(0, 3)
|
|
89
|
+
.join(', ');
|
|
90
|
+
stateEl.textContent = `State: ${summary}${Object.keys(state).length > 3 ? '…' : ''}`;
|
|
91
|
+
}
|
|
92
|
+
//# 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":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAC9B,mBAAmB;IACnB,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAChD,SAAS,CAAC,EAAE,GAAG,2BAA2B,CAAC;IAC3C,SAAS,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAC9C,SAAS,CAAC,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAsCrB,CAAC;IACF,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAEjE,qDAAqD;IACrD,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC;IAExC,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;AACxD,CAAC;AAED,4BAA4B;AAC5B,MAAM,UAAU,kBAAkB;IAC9B,MAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,2BAA2B,CAAC,CAAC;IACvE,IAAI,SAAS,EAAE,CAAC;QACZ,SAAS,CAAC,MAAM,EAAE,CAAC;QACnB,uBAAuB;QACvB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC;IAC3C,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAC9B,KAAsC;IAEtC,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;IACxD,IAAI,CAAC,OAAO;QAAE,OAAO;IAErB,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5C,OAAO,CAAC,WAAW,GAAG,EAAE,CAAC;QACzB,OAAO;IACX,CAAC;IAED,mCAAmC;IACnC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;SAChC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE;QAChB,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,GAAG,GAAG,KAAK,GAAG,EAAE,CAAC;QACrD,IAAI,OAAO,GAAG,KAAK,SAAS;YAAE,OAAO,GAAG,GAAG,KAAK,GAAG,EAAE,CAAC;QACtD,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,GAAG,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC;QACpE,OAAO,GAAG,GAAG,KAAK,CAAC;IACvB,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,IAAI,CAAC,IAAI,CAAC,CAAC;IAEhB,OAAO,CAAC,WAAW,GAAG,UAAU,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACzF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scaffold/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scaffold/index.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* i18n scaffolding logic.
|
|
3
|
+
* Creates i18n configuration files and dictionary placeholders.
|
|
4
|
+
*/
|
|
5
|
+
import { ScaffoldOptions, ScaffoldResult } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Generate the i18n boilerplate inside `opts.i18nDir` (e.g. `src/lib/i18n/`).
|
|
8
|
+
*
|
|
9
|
+
* Writes five TypeScript modules and two placeholder JSON dictionaries:
|
|
10
|
+
* - `settings.ts` — locale list, default locale, namespace config
|
|
11
|
+
* - `types.ts` — shared `I18nKey` type and locale type
|
|
12
|
+
* - `client.ts` — `useTranslation` re-export for client components
|
|
13
|
+
* - `server.ts` — `getTranslation` helper for server components
|
|
14
|
+
* - `provider.tsx` — `<I18nProvider>` wrapper component
|
|
15
|
+
* - `dictionaries/en.json` — empty English dictionary placeholder
|
|
16
|
+
* - `dictionaries/nl.json` — empty Dutch dictionary placeholder
|
|
17
|
+
*
|
|
18
|
+
* Existing files are skipped unless `overwrite: true` is set, so re-running
|
|
19
|
+
* the command after the user has edited their i18n setup is safe by default.
|
|
20
|
+
*
|
|
21
|
+
* @returns Lists of written and skipped relative paths for CLI reporting.
|
|
22
|
+
*/
|
|
23
|
+
export declare function scaffoldI18n(opts: ScaffoldOptions): ScaffoldResult;
|
|
24
|
+
//# sourceMappingURL=scaffold.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../../src/scaffold/intenrals/scaffold.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE7D;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,eAAe,GAAG,cAAc,CAgClE"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* i18n scaffolding logic.
|
|
3
|
+
* Creates i18n configuration files and dictionary placeholders.
|
|
4
|
+
*/
|
|
5
|
+
import fs from 'fs';
|
|
6
|
+
import path from 'path';
|
|
7
|
+
import { SETTINGS_TS, TYPES_TS, CLIENT_TS, SERVER_TS, PROVIDER_TSX, PLACEHOLDER_DICT, } from './templates.js';
|
|
8
|
+
/**
|
|
9
|
+
* Generate the i18n boilerplate inside `opts.i18nDir` (e.g. `src/lib/i18n/`).
|
|
10
|
+
*
|
|
11
|
+
* Writes five TypeScript modules and two placeholder JSON dictionaries:
|
|
12
|
+
* - `settings.ts` — locale list, default locale, namespace config
|
|
13
|
+
* - `types.ts` — shared `I18nKey` type and locale type
|
|
14
|
+
* - `client.ts` — `useTranslation` re-export for client components
|
|
15
|
+
* - `server.ts` — `getTranslation` helper for server components
|
|
16
|
+
* - `provider.tsx` — `<I18nProvider>` wrapper component
|
|
17
|
+
* - `dictionaries/en.json` — empty English dictionary placeholder
|
|
18
|
+
* - `dictionaries/nl.json` — empty Dutch dictionary placeholder
|
|
19
|
+
*
|
|
20
|
+
* Existing files are skipped unless `overwrite: true` is set, so re-running
|
|
21
|
+
* the command after the user has edited their i18n setup is safe by default.
|
|
22
|
+
*
|
|
23
|
+
* @returns Lists of written and skipped relative paths for CLI reporting.
|
|
24
|
+
*/
|
|
25
|
+
export function scaffoldI18n(opts) {
|
|
26
|
+
const { i18nDir, overwrite = false } = opts;
|
|
27
|
+
const dictsDir = path.join(i18nDir, 'dictionaries');
|
|
28
|
+
// Ensure both the i18n root and the dictionaries sub-directory exist
|
|
29
|
+
fs.mkdirSync(dictsDir, { recursive: true });
|
|
30
|
+
const files = [
|
|
31
|
+
{ rel: 'settings.ts', content: SETTINGS_TS },
|
|
32
|
+
{ rel: 'types.ts', content: TYPES_TS },
|
|
33
|
+
{ rel: 'client.ts', content: CLIENT_TS },
|
|
34
|
+
{ rel: 'server.ts', content: SERVER_TS },
|
|
35
|
+
{ rel: 'provider.tsx', content: PROVIDER_TSX },
|
|
36
|
+
{ rel: 'dictionaries/en.json', content: PLACEHOLDER_DICT },
|
|
37
|
+
{ rel: 'dictionaries/nl.json', content: PLACEHOLDER_DICT },
|
|
38
|
+
];
|
|
39
|
+
const written = [];
|
|
40
|
+
const skipped = [];
|
|
41
|
+
for (const { rel, content } of files) {
|
|
42
|
+
const abs = path.join(i18nDir, rel);
|
|
43
|
+
// Skip files that already exist unless the caller explicitly asked to overwrite
|
|
44
|
+
if (fs.existsSync(abs) && !overwrite) {
|
|
45
|
+
skipped.push(rel);
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
fs.writeFileSync(abs, content, 'utf-8');
|
|
49
|
+
written.push(rel);
|
|
50
|
+
}
|
|
51
|
+
return { written, skipped };
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=scaffold.js.map
|