@rovela-ai/sdk 0.18.3 → 0.18.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/dist/admin/components/AdminLayout.d.ts.map +1 -1
- package/dist/admin/components/AdminLayout.js +2 -1
- package/dist/admin/components/AdminLayout.js.map +1 -1
- package/dist/admin/components/AdminSaveBar.d.ts.map +1 -1
- package/dist/admin/components/AdminSaveBar.js +8 -0
- package/dist/admin/components/AdminSaveBar.js.map +1 -1
- package/dist/admin/components/AdminToaster.d.ts +20 -0
- package/dist/admin/components/AdminToaster.d.ts.map +1 -0
- package/dist/admin/components/AdminToaster.js +137 -0
- package/dist/admin/components/AdminToaster.js.map +1 -0
- package/dist/admin/components/BrandingAssetUpload.d.ts.map +1 -1
- package/dist/admin/components/BrandingAssetUpload.js +5 -8
- package/dist/admin/components/BrandingAssetUpload.js.map +1 -1
- package/dist/admin/components/EmailsManager.d.ts.map +1 -1
- package/dist/admin/components/EmailsManager.js +7 -11
- package/dist/admin/components/EmailsManager.js.map +1 -1
- package/dist/admin/components/LowStockAlert.d.ts.map +1 -1
- package/dist/admin/components/LowStockAlert.js +8 -4
- package/dist/admin/components/LowStockAlert.js.map +1 -1
- package/dist/admin/components/RecentOrders.d.ts.map +1 -1
- package/dist/admin/components/RecentOrders.js +5 -2
- package/dist/admin/components/RecentOrders.js.map +1 -1
- package/dist/admin/components/ShippingSettings.d.ts.map +1 -1
- package/dist/admin/components/ShippingSettings.js +8 -10
- package/dist/admin/components/ShippingSettings.js.map +1 -1
- package/dist/admin/components/StoreSettings.d.ts.map +1 -1
- package/dist/admin/components/StoreSettings.js +8 -8
- package/dist/admin/components/StoreSettings.js.map +1 -1
- package/dist/admin/components/TaxSettings.d.ts.map +1 -1
- package/dist/admin/components/TaxSettings.js +8 -7
- package/dist/admin/components/TaxSettings.js.map +1 -1
- package/dist/admin/components/UsersTable.d.ts.map +1 -1
- package/dist/admin/components/UsersTable.js +8 -6
- package/dist/admin/components/UsersTable.js.map +1 -1
- package/dist/admin/components/emails/EmailThemePanel.d.ts +1 -2
- package/dist/admin/components/emails/EmailThemePanel.d.ts.map +1 -1
- package/dist/admin/components/emails/EmailThemePanel.js +3 -3
- package/dist/admin/components/emails/EmailThemePanel.js.map +1 -1
- package/dist/admin/components/index.d.ts +2 -0
- package/dist/admin/components/index.d.ts.map +1 -1
- package/dist/admin/components/index.js +1 -0
- package/dist/admin/components/index.js.map +1 -1
- package/dist/admin/hooks/useAdminStats.d.ts.map +1 -1
- package/dist/admin/hooks/useAdminStats.js +10 -0
- package/dist/admin/hooks/useAdminStats.js.map +1 -1
- package/dist/admin/index.d.ts +2 -2
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +2 -0
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/styles/admin-theme.css +118 -0
- package/dist/admin/types.d.ts +6 -0
- package/dist/admin/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminLayout.d.ts","sourceRoot":"","sources":["../../../src/admin/components/AdminLayout.tsx"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAEH,OAAO,EAAY,KAAK,OAAO,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"AdminLayout.d.ts","sourceRoot":"","sources":["../../../src/admin/components/AdminLayout.tsx"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAEH,OAAO,EAAY,KAAK,OAAO,EAAE,MAAM,YAAY,CAAA;AAGnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAQtC,OAAO,2BAA2B,CAAA;AAMlC,UAAU,wBAAyB,SAAQ,gBAAgB;IACzD,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;IACpB,+BAA+B;IAC/B,IAAI,CAAC,EAAE,SAAS,CAAA;CACjB;AAMD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,SAAS,EACT,SAAmB,EACnB,QAAc,EACd,QAAQ,EACR,IAAI,EACJ,SAAc,GACf,EAAE,wBAAwB,2CA+B1B"}
|
|
@@ -9,6 +9,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
9
9
|
*/
|
|
10
10
|
import { AdminNav } from './AdminNav';
|
|
11
11
|
import { AdminTopBar } from './AdminTopBar';
|
|
12
|
+
import { AdminToaster } from './AdminToaster';
|
|
12
13
|
// `ExampleContentBanner` (R107) was retired in favor of the SetupGuide,
|
|
13
14
|
// which subsumes the "review your example content" nudge into its
|
|
14
15
|
// "Add or edit your first product" task. The banner component is still
|
|
@@ -35,6 +36,6 @@ import '../styles/admin-theme.css';
|
|
|
35
36
|
* ```
|
|
36
37
|
*/
|
|
37
38
|
export function AdminLayout({ children, activeNav, storeName = 'Admin', storeUrl = '/', navItems, logo, className = '', }) {
|
|
38
|
-
return (
|
|
39
|
+
return (_jsxs("div", { className: `rovela-admin-theme ${className}`, children: [_jsxs("div", { className: "admin-shell", children: [_jsx(AdminTopBar, { storeName: storeName, logo: logo, storeUrl: storeUrl }), _jsxs("div", { className: "admin-shell-body", children: [_jsx(AdminNav, { activeNav: activeNav, items: navItems }), _jsx("div", { className: "admin-layout-main", children: _jsx("main", { className: "admin-layout-content", children: children }) })] })] }), _jsx(AdminToaster, {})] }));
|
|
39
40
|
}
|
|
40
41
|
//# sourceMappingURL=AdminLayout.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminLayout.js","sourceRoot":"","sources":["../../../src/admin/components/AdminLayout.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAgB,MAAM,YAAY,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"AdminLayout.js","sourceRoot":"","sources":["../../../src/admin/components/AdminLayout.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAgB,MAAM,YAAY,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAI7C,wEAAwE;AACxE,kEAAkE;AAClE,uEAAuE;AACvE,2DAA2D;AAE3D,gCAAgC;AAChC,OAAO,2BAA2B,CAAA;AAiBlC,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,WAAW,CAAC,EAC1B,QAAQ,EACR,SAAS,EACT,SAAS,GAAG,OAAO,EACnB,QAAQ,GAAG,GAAG,EACd,QAAQ,EACR,IAAI,EACJ,SAAS,GAAG,EAAE,GACW;IACzB,OAAO,CACL,eAAK,SAAS,EAAE,sBAAsB,SAAS,EAAE,aAI/C,eAAK,SAAS,EAAC,aAAa,aAC1B,KAAC,WAAW,IAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,GAAI,EAErE,eAAK,SAAS,EAAC,kBAAkB,aAE/B,KAAC,QAAQ,IAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,GAAI,EAGnD,cAAK,SAAS,EAAC,mBAAmB,YAChC,eAAM,SAAS,EAAC,sBAAsB,YAKnC,QAAQ,GACJ,GACH,IACF,IACF,EAIN,KAAC,YAAY,KAAG,IACZ,CACP,CAAA;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminSaveBar.d.ts","sourceRoot":"","sources":["../../../src/admin/components/AdminSaveBar.tsx"],"names":[],"mappings":"AAyCA,MAAM,WAAW,iBAAiB;IAChC,oEAAoE;IACpE,OAAO,EAAE,OAAO,CAAA;IAChB,gEAAgE;IAChE,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;OAIG;IACH,MAAM,EAAE,MAAM,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC3D,sEAAsE;IACtE,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAUD,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,YAAoB,EACpB,aAAa,EACb,SAAkB,EAClB,MAAM,EACN,SAAS,EACT,SAAc,GACf,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"AdminSaveBar.d.ts","sourceRoot":"","sources":["../../../src/admin/components/AdminSaveBar.tsx"],"names":[],"mappings":"AAyCA,MAAM,WAAW,iBAAiB;IAChC,oEAAoE;IACpE,OAAO,EAAE,OAAO,CAAA;IAChB,gEAAgE;IAChE,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;OAIG;IACH,MAAM,EAAE,MAAM,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC3D,sEAAsE;IACtE,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAUD,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,YAAoB,EACpB,aAAa,EACb,SAAkB,EAClB,MAAM,EACN,SAAS,EACT,SAAc,GACf,EAAE,iBAAiB,kDAqKnB"}
|
|
@@ -77,6 +77,14 @@ export function AdminSaveBar({ isDirty, forceVisible = false, changedFields, sav
|
|
|
77
77
|
if (shakeTimer.current)
|
|
78
78
|
window.clearTimeout(shakeTimer.current);
|
|
79
79
|
}, []);
|
|
80
|
+
// Signal the bar's presence to the rest of the chrome — the AdminToaster
|
|
81
|
+
// reads `body[data-admin-savebar]` to raise its stack above the bar.
|
|
82
|
+
useEffect(() => {
|
|
83
|
+
if (!visible)
|
|
84
|
+
return;
|
|
85
|
+
document.body.setAttribute('data-admin-savebar', '');
|
|
86
|
+
return () => document.body.removeAttribute('data-admin-savebar');
|
|
87
|
+
}, [visible]);
|
|
80
88
|
// Guard: browser-native leave warning while dirty
|
|
81
89
|
useEffect(() => {
|
|
82
90
|
if (!isDirty)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminSaveBar.js","sourceRoot":"","sources":["../../../src/admin/components/AdminSaveBar.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AdminSaveBar.js","sourceRoot":"","sources":["../../../src/admin/components/AdminSaveBar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface AdminToastAction {
|
|
2
|
+
label: string;
|
|
3
|
+
onClick: () => void;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Fire an admin notification (an EVENT — see the grammar above).
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* adminToast.success('Discount deleted')
|
|
10
|
+
* adminToast.success('Test email sent to you', { action: { label: 'View', onClick } })
|
|
11
|
+
* adminToast.error("Couldn't send the invite. Check the email address and try again.")
|
|
12
|
+
*/
|
|
13
|
+
export declare const adminToast: {
|
|
14
|
+
success(message: string, opts?: {
|
|
15
|
+
action?: AdminToastAction;
|
|
16
|
+
}): void;
|
|
17
|
+
error(message: string): void;
|
|
18
|
+
};
|
|
19
|
+
export declare function AdminToaster(): import("react/jsx-runtime").JSX.Element | null;
|
|
20
|
+
//# sourceMappingURL=AdminToaster.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminToaster.d.ts","sourceRoot":"","sources":["../../../src/admin/components/AdminToaster.tsx"],"names":[],"mappings":"AAuCA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAsBD;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU;qBACJ,MAAM,SAAS;QAAE,MAAM,CAAC,EAAE,gBAAgB,CAAA;KAAE;mBAG9C,MAAM;CAGtB,CAAA;AAUD,wBAAgB,YAAY,mDAuH3B"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* @rovela-ai/sdk/admin/components/AdminToaster + adminToast
|
|
5
|
+
*
|
|
6
|
+
* THE notification system for the admin (LEDGER grammar — events vs states):
|
|
7
|
+
*
|
|
8
|
+
* · An EVENT (something just happened: deleted, sent, marked paid, failed
|
|
9
|
+
* to send) is ALWAYS a toast fired through the `adminToast` singleton —
|
|
10
|
+
* an ink pill in the bottom-right stack.
|
|
11
|
+
* · A STATE (something is wrong here and stays wrong: fetch failed,
|
|
12
|
+
* invalid field, auth error) is an inline `admin-alert` at the thing it
|
|
13
|
+
* describes, and never auto-dismisses. Not this system.
|
|
14
|
+
* · Document saves are neither — the AdminSaveBar's morph is their
|
|
15
|
+
* feedback. Never two channels for one outcome.
|
|
16
|
+
*
|
|
17
|
+
* Behavior: success toasts speak the button's words ("Delete discount" →
|
|
18
|
+
* "Discount deleted") and auto-dismiss after 3s (hover pauses the timer);
|
|
19
|
+
* error toasts are STICKY with a dismiss ✕ and say what went wrong and how
|
|
20
|
+
* to fix it. Stack caps at 3 (oldest collapses). The stack rises above the
|
|
21
|
+
* AdminSaveBar when both exist (via `body[data-admin-savebar]`).
|
|
22
|
+
*
|
|
23
|
+
* Architecture: a module-level emitter instead of a React context — usable
|
|
24
|
+
* from any hook, handler or non-React call site with a plain import, no
|
|
25
|
+
* provider threading. `<AdminToaster/>` is mounted ONCE by AdminLayout;
|
|
26
|
+
* events fired before it mounts queue and drain on mount.
|
|
27
|
+
*
|
|
28
|
+
* The legacy single-slot `AdminToast` component remains exported for
|
|
29
|
+
* back-compat (older stores + CC-generated custom pages) but new code MUST
|
|
30
|
+
* use `adminToast`.
|
|
31
|
+
*/
|
|
32
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
33
|
+
import { Check, X } from 'lucide-react';
|
|
34
|
+
let activeListener = null;
|
|
35
|
+
let preMountQueue = [];
|
|
36
|
+
function emit(t) {
|
|
37
|
+
if (activeListener)
|
|
38
|
+
activeListener(t);
|
|
39
|
+
else
|
|
40
|
+
preMountQueue.push(t);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Fire an admin notification (an EVENT — see the grammar above).
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* adminToast.success('Discount deleted')
|
|
47
|
+
* adminToast.success('Test email sent to you', { action: { label: 'View', onClick } })
|
|
48
|
+
* adminToast.error("Couldn't send the invite. Check the email address and try again.")
|
|
49
|
+
*/
|
|
50
|
+
export const adminToast = {
|
|
51
|
+
success(message, opts) {
|
|
52
|
+
emit({ type: 'success', message, action: opts?.action });
|
|
53
|
+
},
|
|
54
|
+
error(message) {
|
|
55
|
+
emit({ type: 'error', message });
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
// =============================================================================
|
|
59
|
+
// Component (mounted once by AdminLayout)
|
|
60
|
+
// =============================================================================
|
|
61
|
+
const SUCCESS_DISMISS_MS = 3000;
|
|
62
|
+
const HOVER_RESUME_MS = 1500;
|
|
63
|
+
const MAX_STACK = 3;
|
|
64
|
+
export function AdminToaster() {
|
|
65
|
+
const [toasts, setToasts] = useState([]);
|
|
66
|
+
const nextId = useRef(0);
|
|
67
|
+
const timers = useRef(new Map());
|
|
68
|
+
const remove = useCallback((id) => {
|
|
69
|
+
setToasts((prev) => prev.filter((t) => t.id !== id));
|
|
70
|
+
const timer = timers.current.get(id);
|
|
71
|
+
if (timer)
|
|
72
|
+
window.clearTimeout(timer);
|
|
73
|
+
timers.current.delete(id);
|
|
74
|
+
}, []);
|
|
75
|
+
const scheduleDismiss = useCallback((id, ms) => {
|
|
76
|
+
const timer = window.setTimeout(() => remove(id), ms);
|
|
77
|
+
timers.current.set(id, timer);
|
|
78
|
+
}, [remove]);
|
|
79
|
+
useEffect(() => {
|
|
80
|
+
const timersMap = timers.current;
|
|
81
|
+
const push = (t) => {
|
|
82
|
+
const id = ++nextId.current;
|
|
83
|
+
setToasts((prev) => {
|
|
84
|
+
const next = [...prev, { ...t, id }];
|
|
85
|
+
// Cap the stack — the oldest collapses (its timer is cleaned lazily
|
|
86
|
+
// by remove() never finding it; clear it here to be tidy).
|
|
87
|
+
if (next.length > MAX_STACK) {
|
|
88
|
+
const dropped = next.slice(0, next.length - MAX_STACK);
|
|
89
|
+
for (const d of dropped) {
|
|
90
|
+
const timer = timersMap.get(d.id);
|
|
91
|
+
if (timer)
|
|
92
|
+
window.clearTimeout(timer);
|
|
93
|
+
timersMap.delete(d.id);
|
|
94
|
+
}
|
|
95
|
+
return next.slice(next.length - MAX_STACK);
|
|
96
|
+
}
|
|
97
|
+
return next;
|
|
98
|
+
});
|
|
99
|
+
if (t.type === 'success')
|
|
100
|
+
scheduleDismiss(id, SUCCESS_DISMISS_MS);
|
|
101
|
+
};
|
|
102
|
+
activeListener = push;
|
|
103
|
+
// Drain events fired before mount — async so setState never runs
|
|
104
|
+
// synchronously inside the effect body.
|
|
105
|
+
const pending = preMountQueue;
|
|
106
|
+
preMountQueue = [];
|
|
107
|
+
const raf = pending.length
|
|
108
|
+
? window.requestAnimationFrame(() => pending.forEach(push))
|
|
109
|
+
: null;
|
|
110
|
+
return () => {
|
|
111
|
+
activeListener = null;
|
|
112
|
+
if (raf !== null)
|
|
113
|
+
window.cancelAnimationFrame(raf);
|
|
114
|
+
timersMap.forEach((timer) => window.clearTimeout(timer));
|
|
115
|
+
timersMap.clear();
|
|
116
|
+
};
|
|
117
|
+
}, [scheduleDismiss]);
|
|
118
|
+
// Hover pauses a success toast's timer; leaving restarts a short fuse.
|
|
119
|
+
const pause = useCallback((id) => {
|
|
120
|
+
const timer = timers.current.get(id);
|
|
121
|
+
if (timer) {
|
|
122
|
+
window.clearTimeout(timer);
|
|
123
|
+
timers.current.delete(id);
|
|
124
|
+
}
|
|
125
|
+
}, []);
|
|
126
|
+
const resume = useCallback((t) => {
|
|
127
|
+
if (t.type === 'success')
|
|
128
|
+
scheduleDismiss(t.id, HOVER_RESUME_MS);
|
|
129
|
+
}, [scheduleDismiss]);
|
|
130
|
+
if (toasts.length === 0)
|
|
131
|
+
return null;
|
|
132
|
+
return (_jsx("div", { className: "admin-toaster", "aria-live": "polite", children: toasts.map((t) => (_jsxs("div", { role: t.type === 'error' ? 'alert' : 'status', className: `admin-toast-v2 ${t.type === 'error' ? 'admin-toast-v2-error' : ''}`.trim(), onMouseEnter: () => pause(t.id), onMouseLeave: () => resume(t), children: [t.type === 'success' ? (_jsx(Check, { className: "admin-toast-v2-icon", "aria-hidden": "true" })) : (_jsx(X, { className: "admin-toast-v2-icon", "aria-hidden": "true" })), _jsx("span", { className: "admin-toast-v2-msg", children: t.message }), t.action && (_jsx("button", { type: "button", className: "admin-toast-v2-action", onClick: () => {
|
|
133
|
+
t.action?.onClick();
|
|
134
|
+
remove(t.id);
|
|
135
|
+
}, children: t.action.label })), t.type === 'error' && (_jsx("button", { type: "button", className: "admin-toast-v2-x", onClick: () => remove(t.id), "aria-label": "Dismiss notification", children: _jsx(X, { "aria-hidden": "true" }) }))] }, t.id))) }));
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=AdminToaster.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminToaster.js","sourceRoot":"","sources":["../../../src/admin/components/AdminToaster.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BrandingAssetUpload.d.ts","sourceRoot":"","sources":["../../../src/admin/components/BrandingAssetUpload.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"BrandingAssetUpload.d.ts","sourceRoot":"","sources":["../../../src/admin/components/BrandingAssetUpload.tsx"],"names":[],"mappings":"AAwBA,MAAM,WAAW,wBAAwB;IACvC,uDAAuD;IACvD,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AA0DD,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,SAAc,GACf,EAAE,wBAAwB,GAAG;IAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,2CA6SzD;AAMD,MAAM,MAAM,kBAAkB,GAAG,wBAAwB,CAAA;AAEzD,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,2CAEtD"}
|
|
@@ -15,6 +15,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
15
15
|
*/
|
|
16
16
|
import { useState, useEffect, useRef, useCallback } from 'react';
|
|
17
17
|
import { fetchAdminApi } from '../hooks/fetchAdminApi';
|
|
18
|
+
import { adminToast } from './AdminToaster';
|
|
18
19
|
const BASE_TYPES = ['image/png', 'image/jpeg', 'image/jpg', 'image/webp', 'image/svg+xml'];
|
|
19
20
|
const BASE_ACCEPT = 'image/png,image/jpeg,image/jpg,image/webp,image/svg+xml';
|
|
20
21
|
const KIND_CONFIG = {
|
|
@@ -55,7 +56,6 @@ export function BrandingAssetUpload({ kind, onUpload, onDelete, className = '',
|
|
|
55
56
|
});
|
|
56
57
|
const [preview, setPreview] = useState(null);
|
|
57
58
|
const [isDragging, setIsDragging] = useState(false);
|
|
58
|
-
const [successMessage, setSuccessMessage] = useState(null);
|
|
59
59
|
const [cacheBuster, setCacheBuster] = useState(() => Date.now());
|
|
60
60
|
const fileInputRef = useRef(null);
|
|
61
61
|
// Fetch status on mount — the GET is an R2 HEAD, so this reflects the
|
|
@@ -107,13 +107,12 @@ export function BrandingAssetUpload({ kind, onUpload, onDelete, className = '',
|
|
|
107
107
|
error: null,
|
|
108
108
|
});
|
|
109
109
|
setPreview(null);
|
|
110
|
-
|
|
111
|
-
|
|
110
|
+
// Event → THE toaster (the error banner below stays inline: a state).
|
|
111
|
+
adminToast.success(`${cfg.label} uploaded`);
|
|
112
112
|
onUpload?.(res.data.data.url);
|
|
113
113
|
}, [cfg.endpoint, cfg.formField, cfg.label, onUpload]);
|
|
114
114
|
const handleFileSelect = useCallback((file) => {
|
|
115
115
|
setAsset((prev) => ({ ...prev, error: null }));
|
|
116
|
-
setSuccessMessage(null);
|
|
117
116
|
if (!cfg.allowedTypes.includes(file.type)) {
|
|
118
117
|
setAsset((prev) => ({ ...prev, error: cfg.invalidTypeMessage }));
|
|
119
118
|
return;
|
|
@@ -133,7 +132,6 @@ export function BrandingAssetUpload({ kind, onUpload, onDelete, className = '',
|
|
|
133
132
|
if (!asset.exists)
|
|
134
133
|
return;
|
|
135
134
|
setAsset((prev) => ({ ...prev, isDeleting: true, error: null }));
|
|
136
|
-
setSuccessMessage(null);
|
|
137
135
|
const res = await fetchAdminApi(cfg.endpoint, { method: 'DELETE' });
|
|
138
136
|
if (!res.ok) {
|
|
139
137
|
setAsset((prev) => ({ ...prev, isDeleting: false, error: res.error }));
|
|
@@ -147,8 +145,7 @@ export function BrandingAssetUpload({ kind, onUpload, onDelete, className = '',
|
|
|
147
145
|
isDeleting: false,
|
|
148
146
|
error: null,
|
|
149
147
|
});
|
|
150
|
-
|
|
151
|
-
setTimeout(() => setSuccessMessage(null), 3000);
|
|
148
|
+
adminToast.success(`${cfg.label} removed`);
|
|
152
149
|
onDelete?.();
|
|
153
150
|
};
|
|
154
151
|
const handleFileInputChange = (e) => {
|
|
@@ -185,7 +182,7 @@ export function BrandingAssetUpload({ kind, onUpload, onDelete, className = '',
|
|
|
185
182
|
};
|
|
186
183
|
const displayUrl = getDisplayUrl();
|
|
187
184
|
const isWorking = asset.isLoading || asset.isUploading || asset.isDeleting;
|
|
188
|
-
return (_jsxs("div", { className: className, children: [_jsx("label", { className: "admin-label", children: cfg.label }), _jsx("p", { className: "admin-helper-text mb-3", children: cfg.helper }), asset.error && (_jsx("div", { className: "admin-alert admin-alert-error mb-3", children: _jsx("div", { className: "admin-alert-description text-sm", children: asset.error }) })),
|
|
185
|
+
return (_jsxs("div", { className: className, children: [_jsx("label", { className: "admin-label", children: cfg.label }), _jsx("p", { className: "admin-helper-text mb-3", children: cfg.helper }), asset.error && (_jsx("div", { className: "admin-alert admin-alert-error mb-3", children: _jsx("div", { className: "admin-alert-description text-sm", children: asset.error }) })), displayUrl ? (_jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "relative rounded-lg border border-[hsl(var(--admin-border))] bg-[hsl(var(--admin-background-subtle))] p-4", children: [_jsx("div", { className: cfg.preview === 'tile'
|
|
189
186
|
? 'flex items-center justify-center min-h-[56px]'
|
|
190
187
|
: 'flex items-center justify-center min-h-[80px]', children: _jsx("img", { src: displayUrl, alt: cfg.label, className: cfg.preview === 'tile'
|
|
191
188
|
? 'h-12 w-12 rounded-md object-contain'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BrandingAssetUpload.js","sourceRoot":"","sources":["../../../src/admin/components/BrandingAssetUpload.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"BrandingAssetUpload.js","sourceRoot":"","sources":["../../../src/admin/components/BrandingAssetUpload.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmailsManager.d.ts","sourceRoot":"","sources":["../../../src/admin/components/EmailsManager.tsx"],"names":[],"mappings":"AAiHA,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,aAAa,CAAC,EAAE,SAAc,EAAE,EAAE,kBAAkB,
|
|
1
|
+
{"version":3,"file":"EmailsManager.d.ts","sourceRoot":"","sources":["../../../src/admin/components/EmailsManager.tsx"],"names":[],"mappings":"AAiHA,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,aAAa,CAAC,EAAE,SAAc,EAAE,EAAE,kBAAkB,2CA22BnE"}
|
|
@@ -26,10 +26,11 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
26
26
|
* displayed in an inbox-style crossfading preview pane.
|
|
27
27
|
*/
|
|
28
28
|
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
29
|
-
import { Mail, Palette, ChevronRight, Send,
|
|
29
|
+
import { Mail, Palette, ChevronRight, Send, Plus, Trash2, RotateCcw, PenLine, Globe, } from 'lucide-react';
|
|
30
30
|
import { LOCALE_LABELS } from '../../core/i18n/types';
|
|
31
31
|
import { AdminSelect } from './AdminSelect';
|
|
32
32
|
import { AdminPageHeader } from './AdminPageHeader';
|
|
33
|
+
import { adminToast } from './AdminToaster';
|
|
33
34
|
import { DeleteConfirmDialog } from './DeleteConfirmDialog';
|
|
34
35
|
import { EmailPreviewPane } from './emails/EmailPreviewPane';
|
|
35
36
|
import { EmailThemePanel } from './emails/EmailThemePanel';
|
|
@@ -57,7 +58,6 @@ export function EmailsManager({ className = '' }) {
|
|
|
57
58
|
const [nameDraft, setNameDraft] = useState('');
|
|
58
59
|
const [themeDraft, setThemeDraft] = useState({});
|
|
59
60
|
const [isSaving, setIsSaving] = useState(false);
|
|
60
|
-
const [saveFlash, setSaveFlash] = useState(null);
|
|
61
61
|
const [actionError, setActionError] = useState(null);
|
|
62
62
|
const [isSendingTest, setIsSendingTest] = useState(false);
|
|
63
63
|
const [createOpen, setCreateOpen] = useState(false);
|
|
@@ -150,7 +150,6 @@ export function EmailsManager({ className = '' }) {
|
|
|
150
150
|
setNameDraft(rows.find((r) => r.locale === DEFAULT_ROW)?.name ?? '');
|
|
151
151
|
setActiveLocale(DEFAULT_ROW);
|
|
152
152
|
setActionError(null);
|
|
153
|
-
setSaveFlash(null);
|
|
154
153
|
setSendToOpen(false);
|
|
155
154
|
setConfirmDelete(false);
|
|
156
155
|
clearPreview();
|
|
@@ -244,8 +243,7 @@ export function EmailsManager({ className = '' }) {
|
|
|
244
243
|
});
|
|
245
244
|
if (!res.ok)
|
|
246
245
|
throw new Error();
|
|
247
|
-
|
|
248
|
-
window.setTimeout(() => setSaveFlash(null), 2000);
|
|
246
|
+
adminToast.success('Saved');
|
|
249
247
|
// Refresh the module state so list badges stay accurate.
|
|
250
248
|
const fresh = await fetch('/api/admin/emails').then((r) => (r.ok ? r.json() : null));
|
|
251
249
|
if (fresh)
|
|
@@ -269,8 +267,7 @@ export function EmailsManager({ className = '' }) {
|
|
|
269
267
|
});
|
|
270
268
|
if (!res.ok)
|
|
271
269
|
throw new Error();
|
|
272
|
-
|
|
273
|
-
window.setTimeout(() => setSaveFlash(null), 2000);
|
|
270
|
+
adminToast.success('Saved');
|
|
274
271
|
const fresh = await fetch('/api/admin/emails').then((r) => (r.ok ? r.json() : null));
|
|
275
272
|
if (fresh) {
|
|
276
273
|
setData(fresh);
|
|
@@ -302,8 +299,7 @@ export function EmailsManager({ className = '' }) {
|
|
|
302
299
|
const json = await res.json().catch(() => null);
|
|
303
300
|
if (!res.ok)
|
|
304
301
|
throw new Error(json?.error);
|
|
305
|
-
|
|
306
|
-
window.setTimeout(() => setSaveFlash(null), 3500);
|
|
302
|
+
adminToast.success(`Sent to ${json?.to ?? 'your address'}`);
|
|
307
303
|
if (sendTo) {
|
|
308
304
|
setSendToOpen(false);
|
|
309
305
|
setSendToEmail('');
|
|
@@ -402,7 +398,7 @@ export function EmailsManager({ className = '' }) {
|
|
|
402
398
|
return (_jsxs("div", { className: `space-y-6 ${className}`, children: [_jsx(AdminPageHeader, { onBack: () => setView('list'), backLabel: "Back to emails", eyebrow: "Emails", title: "Email theme", subtitle: "One shared theme styles every email your store sends. It starts from your brand (logo, colors, fonts). Adjust anything below and every email updates at once." }), _jsxs("div", { className: "admin-card admin-card-body", children: [actionError && (_jsx("div", { className: "admin-alert-inline admin-alert-inline-error mb-4", children: actionError })), _jsxs("div", { className: "flex flex-col gap-8 lg:flex-row", children: [_jsx(EmailThemePanel, { draft: themeDraft, derived: data.theme.derived, palette: data.theme.palette, suggestedFonts: data.theme.suggestedFonts, onChange: (patch) => setThemeDraft((p) => ({ ...p, ...patch })), onSave: () => saveTheme(themeDraft), onReset: () => {
|
|
403
399
|
setThemeDraft({});
|
|
404
400
|
saveTheme({});
|
|
405
|
-
}, isSaving: isSaving
|
|
401
|
+
}, isSaving: isSaving }), previewPane] })] })] }));
|
|
406
402
|
}
|
|
407
403
|
// ── EMAIL DETAIL VIEW ──────────────────────────────────────────────────────
|
|
408
404
|
if (activeKey) {
|
|
@@ -426,7 +422,7 @@ export function EmailsManager({ className = '' }) {
|
|
|
426
422
|
return (_jsxs("div", { className: `space-y-6 ${className}`, children: [_jsx(AdminPageHeader, { onBack: () => {
|
|
427
423
|
setView('list');
|
|
428
424
|
load();
|
|
429
|
-
}, backLabel: "Back to emails", eyebrow: "Emails", title: displayName, badge: _jsxs(_Fragment, { children: [isCustomKey && (_jsx("span", { className: "admin-badge admin-badge-neutral", children: "Your email" })), activeKey && disabledKeys.has(activeKey) && (_jsx("span", { className: "admin-badge admin-badge-neutral", children: "Off" }))] }) }), _jsxs("div", { className: "admin-card admin-card-body", children: [_jsxs("div", { className: "mb-2 flex flex-wrap items-center justify-between gap-x-6 gap-y-2", children: [_jsx("p", { className: "max-w-xl text-sm text-[hsl(var(--admin-foreground-muted))]", children: activeEntry?.trigger ?? 'Your own email — send it to a customer whenever you like.' }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Globe, { className: "h-4 w-4 shrink-0 text-[hsl(var(--admin-foreground-muted))]" }), _jsx("span", { className: "text-xs font-semibold uppercase tracking-wide text-[hsl(var(--admin-foreground-muted))]", children: "Language" }), isMultilingual ? (_jsx(AdminSelect, { className: "w-48", size: "sm", value: activeLocale, onChange: (v) => setActiveLocale(v), options: localeRows.map((row) => ({ value: row, label: localeRowLabel(row) })) })) : (_jsx("span", { className: "text-sm font-medium", children: localeRowLabel(DEFAULT_ROW) }))] })] }), _jsx("div", { className: "mb-4 flex justify-end", children: isMultilingual && activeLocale !== DEFAULT_ROW && !rowHasOwnContent ? (_jsxs("p", { className: "text-xs text-[hsl(var(--admin-foreground-muted))]", children: ["Showing your ", localeName(data.defaultLocale), " content \u2014 anything you save here becomes the ", localeName(editingLocale), " version."] })) : !isMultilingual ? (_jsxs("p", { className: "text-xs text-[hsl(var(--admin-foreground-subtle))]", children: ["Your store sends emails in ", localeName(editingLocale), ". Add languages in", ' ', _jsx("a", { href: "/admin/settings", className: "underline hover:text-[hsl(var(--admin-primary))]", children: "Settings \u2192 Languages" }), "."] })) : (_jsx("span", {})) }), actionError && (_jsx("div", { className: "admin-alert-inline admin-alert-inline-error mb-4", children: actionError })), _jsxs("div", { className: "flex flex-col gap-8 lg:flex-row", children: [_jsxs("div", { className: "w-full space-y-4 lg:max-w-md", children: [isCustomKey && (_jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Name" }), _jsx("input", { className: "admin-input w-full", value: nameDraft, onChange: (e) => setNameDraft(e.target.value), maxLength: 80 })] })), activeEntry?.canDisable && (_jsxs("label", { className: "flex cursor-pointer items-center gap-2 text-sm", children: [_jsx("input", { type: "checkbox", className: "admin-checkbox", checked: enabledDraft, onChange: (e) => setEnabledDraft(e.target.checked) }), "Send this email"] })), _jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Subject" }), _jsx("input", { className: "admin-input w-full", value: draft.subject, onChange: (e) => setDraftField('subject', e.target.value), placeholder: isCustomKey ? 'The subject your customer sees' : 'Leave empty to use the standard subject', maxLength: 200 }), _jsx("div", { className: "mt-1.5 flex flex-wrap gap-1", children: variables.map((v) => (_jsxs("button", { type: "button", onClick: () => setDraftField('subject', `${draft.subject}{{${v}}}`), className: "rounded-full border border-[hsl(var(--admin-border))] px-2 py-0.5 text-xs text-[hsl(var(--admin-foreground-muted))] hover:border-[hsl(var(--admin-primary))] hover:text-[hsl(var(--admin-primary))]", children: ['{{', v, '}}'] }, v))) })] }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("label", { className: "admin-label !mb-0", children: "Content" }), isCustomKey || hasRowBlocks ? (!isCustomKey && (_jsxs("button", { type: "button", onClick: () => setResetConfirmOpen(true), className: "admin-action-link inline-flex items-center gap-1 text-xs", children: [_jsx(RotateCcw, { className: "h-3 w-3" }), " Reset to standard layout"] }))) : (_jsxs("button", { type: "button", onClick: seedBlocks, className: "admin-action-link inline-flex items-center gap-1 text-xs", children: [_jsx(PenLine, { className: "h-3 w-3" }), " Customize layout"] }))] }), !hasRowBlocks && !isCustomKey && defaultRowBlocks !== null && activeLocale !== DEFAULT_ROW && (_jsxs("p", { className: "text-xs text-[hsl(var(--admin-foreground-muted))]", children: ["This language currently uses your ", localeName(data.defaultLocale), " layout \u2014 customizing creates a ", localeName(editingLocale), " version."] }))] }), isCustomKey || hasRowBlocks ? (_jsx(BlocksEditor, { blocks: rowBlocks ?? defaultRowBlocks ?? [], onChange: (next) => setBlockDrafts((prev) => ({ ...prev, [activeLocale]: next })), slots: slots, variables: variables, locale: editingLocale })) : (_jsxs(_Fragment, { children: [_jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Intro note (optional)" }), _jsx("textarea", { className: "admin-input w-full", rows: 3, value: draft.intro, onChange: (e) => setDraftField('intro', e.target.value), placeholder: "A short personal note shown at the top of the email", maxLength: 2000 })] }), _jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Footer note (optional)" }), _jsx("textarea", { className: "admin-input w-full", rows: 3, value: draft.outro, onChange: (e) => setDraftField('outro', e.target.value), placeholder: "A short note shown at the bottom, before the footer", maxLength: 2000 })] })] })), _jsxs("div", { className: "flex flex-wrap items-center gap-2 pt-2", children: [_jsx("button", { type: "button", onClick: saveOverride, disabled: isSaving, className: "admin-btn admin-btn-primary admin-btn-sm disabled:opacity-50", children: isSaving ? 'Saving…' : 'Save' }), _jsxs("button", { type: "button", onClick: () => sendTest(), disabled: isSendingTest, title: `Sends a test to you — ${data.viewer.email}`, className: "admin-btn admin-btn-secondary admin-btn-sm inline-flex items-center gap-1 disabled:opacity-50", children: [_jsx(Send, { className: "h-3.5 w-3.5" }), " ", isSendingTest ? 'Sending…' : 'Send test'] }), isCustomKey && (_jsxs("button", { type: "button", onClick: () => setSendToOpen((o) => !o), className: "admin-btn admin-btn-secondary admin-btn-sm inline-flex items-center gap-1", children: [_jsx(Mail, { className: "h-3.5 w-3.5" }), " Send to a customer"] }))
|
|
425
|
+
}, backLabel: "Back to emails", eyebrow: "Emails", title: displayName, badge: _jsxs(_Fragment, { children: [isCustomKey && (_jsx("span", { className: "admin-badge admin-badge-neutral", children: "Your email" })), activeKey && disabledKeys.has(activeKey) && (_jsx("span", { className: "admin-badge admin-badge-neutral", children: "Off" }))] }) }), _jsxs("div", { className: "admin-card admin-card-body", children: [_jsxs("div", { className: "mb-2 flex flex-wrap items-center justify-between gap-x-6 gap-y-2", children: [_jsx("p", { className: "max-w-xl text-sm text-[hsl(var(--admin-foreground-muted))]", children: activeEntry?.trigger ?? 'Your own email — send it to a customer whenever you like.' }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Globe, { className: "h-4 w-4 shrink-0 text-[hsl(var(--admin-foreground-muted))]" }), _jsx("span", { className: "text-xs font-semibold uppercase tracking-wide text-[hsl(var(--admin-foreground-muted))]", children: "Language" }), isMultilingual ? (_jsx(AdminSelect, { className: "w-48", size: "sm", value: activeLocale, onChange: (v) => setActiveLocale(v), options: localeRows.map((row) => ({ value: row, label: localeRowLabel(row) })) })) : (_jsx("span", { className: "text-sm font-medium", children: localeRowLabel(DEFAULT_ROW) }))] })] }), _jsx("div", { className: "mb-4 flex justify-end", children: isMultilingual && activeLocale !== DEFAULT_ROW && !rowHasOwnContent ? (_jsxs("p", { className: "text-xs text-[hsl(var(--admin-foreground-muted))]", children: ["Showing your ", localeName(data.defaultLocale), " content \u2014 anything you save here becomes the ", localeName(editingLocale), " version."] })) : !isMultilingual ? (_jsxs("p", { className: "text-xs text-[hsl(var(--admin-foreground-subtle))]", children: ["Your store sends emails in ", localeName(editingLocale), ". Add languages in", ' ', _jsx("a", { href: "/admin/settings", className: "underline hover:text-[hsl(var(--admin-primary))]", children: "Settings \u2192 Languages" }), "."] })) : (_jsx("span", {})) }), actionError && (_jsx("div", { className: "admin-alert-inline admin-alert-inline-error mb-4", children: actionError })), _jsxs("div", { className: "flex flex-col gap-8 lg:flex-row", children: [_jsxs("div", { className: "w-full space-y-4 lg:max-w-md", children: [isCustomKey && (_jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Name" }), _jsx("input", { className: "admin-input w-full", value: nameDraft, onChange: (e) => setNameDraft(e.target.value), maxLength: 80 })] })), activeEntry?.canDisable && (_jsxs("label", { className: "flex cursor-pointer items-center gap-2 text-sm", children: [_jsx("input", { type: "checkbox", className: "admin-checkbox", checked: enabledDraft, onChange: (e) => setEnabledDraft(e.target.checked) }), "Send this email"] })), _jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Subject" }), _jsx("input", { className: "admin-input w-full", value: draft.subject, onChange: (e) => setDraftField('subject', e.target.value), placeholder: isCustomKey ? 'The subject your customer sees' : 'Leave empty to use the standard subject', maxLength: 200 }), _jsx("div", { className: "mt-1.5 flex flex-wrap gap-1", children: variables.map((v) => (_jsxs("button", { type: "button", onClick: () => setDraftField('subject', `${draft.subject}{{${v}}}`), className: "rounded-full border border-[hsl(var(--admin-border))] px-2 py-0.5 text-xs text-[hsl(var(--admin-foreground-muted))] hover:border-[hsl(var(--admin-primary))] hover:text-[hsl(var(--admin-primary))]", children: ['{{', v, '}}'] }, v))) })] }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("label", { className: "admin-label !mb-0", children: "Content" }), isCustomKey || hasRowBlocks ? (!isCustomKey && (_jsxs("button", { type: "button", onClick: () => setResetConfirmOpen(true), className: "admin-action-link inline-flex items-center gap-1 text-xs", children: [_jsx(RotateCcw, { className: "h-3 w-3" }), " Reset to standard layout"] }))) : (_jsxs("button", { type: "button", onClick: seedBlocks, className: "admin-action-link inline-flex items-center gap-1 text-xs", children: [_jsx(PenLine, { className: "h-3 w-3" }), " Customize layout"] }))] }), !hasRowBlocks && !isCustomKey && defaultRowBlocks !== null && activeLocale !== DEFAULT_ROW && (_jsxs("p", { className: "text-xs text-[hsl(var(--admin-foreground-muted))]", children: ["This language currently uses your ", localeName(data.defaultLocale), " layout \u2014 customizing creates a ", localeName(editingLocale), " version."] }))] }), isCustomKey || hasRowBlocks ? (_jsx(BlocksEditor, { blocks: rowBlocks ?? defaultRowBlocks ?? [], onChange: (next) => setBlockDrafts((prev) => ({ ...prev, [activeLocale]: next })), slots: slots, variables: variables, locale: editingLocale })) : (_jsxs(_Fragment, { children: [_jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Intro note (optional)" }), _jsx("textarea", { className: "admin-input w-full", rows: 3, value: draft.intro, onChange: (e) => setDraftField('intro', e.target.value), placeholder: "A short personal note shown at the top of the email", maxLength: 2000 })] }), _jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Footer note (optional)" }), _jsx("textarea", { className: "admin-input w-full", rows: 3, value: draft.outro, onChange: (e) => setDraftField('outro', e.target.value), placeholder: "A short note shown at the bottom, before the footer", maxLength: 2000 })] })] })), _jsxs("div", { className: "flex flex-wrap items-center gap-2 pt-2", children: [_jsx("button", { type: "button", onClick: saveOverride, disabled: isSaving, className: "admin-btn admin-btn-primary admin-btn-sm disabled:opacity-50", children: isSaving ? 'Saving…' : 'Save' }), _jsxs("button", { type: "button", onClick: () => sendTest(), disabled: isSendingTest, title: `Sends a test to you — ${data.viewer.email}`, className: "admin-btn admin-btn-secondary admin-btn-sm inline-flex items-center gap-1 disabled:opacity-50", children: [_jsx(Send, { className: "h-3.5 w-3.5" }), " ", isSendingTest ? 'Sending…' : 'Send test'] }), isCustomKey && (_jsxs("button", { type: "button", onClick: () => setSendToOpen((o) => !o), className: "admin-btn admin-btn-secondary admin-btn-sm inline-flex items-center gap-1", children: [_jsx(Mail, { className: "h-3.5 w-3.5" }), " Send to a customer"] }))] }), _jsxs("p", { className: "text-xs text-[hsl(var(--admin-foreground-subtle))]", children: ["Tests go to you \u2014 ", data.viewer.email] }), isCustomKey && sendToOpen && (_jsxs("div", { className: "space-y-2 rounded-lg border border-[hsl(var(--admin-border))] p-3", children: [_jsx("p", { className: "text-xs font-semibold uppercase tracking-wide text-[hsl(var(--admin-foreground-muted))]", children: "Send to a customer" }), _jsx("p", { className: "text-xs text-[hsl(var(--admin-foreground-muted))]", children: "Sends the SAVED version of this email \u2014 save your changes first." }), _jsx(CustomerPicker, { onPick: (c) => {
|
|
430
426
|
setSendToEmail(c.email);
|
|
431
427
|
setSendToName(c.name);
|
|
432
428
|
} }), _jsx("p", { className: "text-xs text-[hsl(var(--admin-foreground-subtle))]", children: "Or enter an email manually:" }), _jsx("input", { className: "admin-input w-full", type: "email", value: sendToEmail, onChange: (e) => setSendToEmail(e.target.value), placeholder: "customer@example.com" }), _jsx("input", { className: "admin-input w-full", value: sendToName, onChange: (e) => setSendToName(e.target.value), placeholder: "Customer's first name (for {{customerName}})" }), _jsx("button", { type: "button", disabled: isSendingTest || !sendToEmail.trim(), onClick: () => sendTest({ email: sendToEmail.trim(), name: sendToName }), className: "admin-btn admin-btn-primary admin-btn-sm disabled:opacity-50", children: isSendingTest ? 'Sending…' : 'Send now' })] })), isCustomKey && (_jsx("div", { className: "border-t border-[hsl(var(--admin-border))] pt-3", children: confirmDelete ? (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-sm", children: "Delete this email for good?" }), _jsx("button", { type: "button", onClick: deleteCustomEmail, disabled: isSaving, className: "admin-btn admin-btn-sm bg-red-600 text-white hover:bg-red-700 disabled:opacity-50", children: "Delete" }), _jsx("button", { type: "button", onClick: () => setConfirmDelete(false), className: "admin-btn admin-btn-secondary admin-btn-sm", children: "Cancel" })] })) : (_jsxs("button", { type: "button", onClick: () => setConfirmDelete(true), className: "inline-flex items-center gap-1 text-sm text-red-600 hover:underline", children: [_jsx(Trash2, { className: "h-3.5 w-3.5" }), " Delete this email"] })) }))] }), previewPane] })] }), _jsx(DeleteConfirmDialog, { isOpen: resetConfirmOpen, title: "Reset layout", itemName: displayName, description: `Go back to the standard layout? Your customized layout${isMultilingual ? ` for ${localeName(editingLocale)}` : ''} will be removed when you save.`, confirmLabel: "Reset layout", variant: "primary", onConfirm: () => {
|