@rovela-ai/sdk 0.3.10 → 0.3.12
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.
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare function AdminBarBanner(): import("react
|
|
1
|
+
export declare function AdminBarBanner(): import("react").ReactPortal | null;
|
|
2
2
|
//# sourceMappingURL=AdminBarBanner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminBarBanner.d.ts","sourceRoot":"","sources":["../../../src/admin/components/AdminBarBanner.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AdminBarBanner.d.ts","sourceRoot":"","sources":["../../../src/admin/components/AdminBarBanner.tsx"],"names":[],"mappings":"AAqDA,wBAAgB,cAAc,uCAyH7B"}
|
|
@@ -3,154 +3,253 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
3
3
|
/**
|
|
4
4
|
* @rovela/sdk/admin/components/AdminBarBanner
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
* signed-in admin browses the public store. Customers and anonymous
|
|
6
|
+
* Linear/Vercel-style admin session bar shown above the storefront whenever
|
|
7
|
+
* a signed-in admin browses the public store. Customers and anonymous
|
|
8
8
|
* visitors never see it.
|
|
9
9
|
*
|
|
10
|
-
* Design rules:
|
|
10
|
+
* Design rules (unchanged from v1):
|
|
11
11
|
*
|
|
12
|
-
* 1. Self-gating
|
|
13
|
-
*
|
|
14
|
-
* or when the user is inside the admin dashboard (`/admin/*`). Safe to
|
|
15
|
-
* mount unconditionally at the root of a customer layout.
|
|
12
|
+
* 1. Self-gating. No props. Renders `null` while loading, for sessions
|
|
13
|
+
* without a role, and on /admin/*.
|
|
16
14
|
*
|
|
17
|
-
* 2.
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* theme; inline styles survive every theme edit. This is intentional
|
|
21
|
-
* — the admin bar is "platform chrome" and should look identical
|
|
22
|
-
* across every merchant's store.
|
|
15
|
+
* 2. Portal-rendered to <html>. Combined with a `translateZ(0)` on
|
|
16
|
+
* <body> and a 40px body margin, fixed/sticky store chrome is pushed
|
|
17
|
+
* below the bar instead of overlapping it.
|
|
23
18
|
*
|
|
24
|
-
* 3.
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
19
|
+
* 3. Theme-proof. Inline styles + one scoped <style> element.
|
|
20
|
+
*
|
|
21
|
+
* 4. Navigation-only. Server-side guards still authorize.
|
|
22
|
+
*
|
|
23
|
+
* v2 changes:
|
|
24
|
+
* - Two actions instead of one: "Edit store" (rovela.ai/generate/{id})
|
|
25
|
+
* and "Manage store" (/admin). Both open in a new tab.
|
|
26
|
+
* - "Edit store" only renders when NEXT_PUBLIC_ROVELA_PROJECT_ID is set.
|
|
27
|
+
* This gives a graceful degradation path for stores whose env var
|
|
28
|
+
* hasn't propagated yet.
|
|
29
|
+
* - Rovela logo (same CDN asset as AdminNav sidebar footer) as the
|
|
30
|
+
* Edit-store glyph; Lucide LayoutDashboard as the Manage-store glyph.
|
|
28
31
|
*/
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
32
|
+
import { useEffect, useState } from 'react';
|
|
33
|
+
import { createPortal } from 'react-dom';
|
|
34
|
+
import { usePathname } from 'next/navigation';
|
|
35
|
+
import { LayoutDashboard } from 'lucide-react';
|
|
31
36
|
import { useAdminAuth } from '../hooks/useAdminAuth';
|
|
32
37
|
import { roleLabel } from '../permissions';
|
|
33
38
|
// =============================================================================
|
|
34
|
-
//
|
|
39
|
+
// Constants
|
|
35
40
|
// =============================================================================
|
|
36
|
-
//
|
|
37
|
-
// Inline style objects keep the bar immune to storefront CSS resets, global
|
|
38
|
-
// Tailwind classes, and aggressive theme rewrites. Values match Shopify's
|
|
39
|
-
// merchant bar roughly: high-contrast dark background, 40px tall, left/right
|
|
40
|
-
// padding that respects safe areas on mobile.
|
|
41
41
|
const BAR_HEIGHT_PX = 40;
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
42
|
+
const PORTAL_ROOT_ID = 'rovela-admin-bar-root';
|
|
43
|
+
const STYLE_TAG_ID = 'rovela-admin-bar-style';
|
|
44
|
+
const DEFAULT_ROVELA_URL = 'https://rovela.ai';
|
|
45
|
+
const ROVELA_LOGO_SRC = 'https://rovela.ai/logo.png';
|
|
46
|
+
// =============================================================================
|
|
47
|
+
// Component
|
|
48
|
+
// =============================================================================
|
|
49
|
+
export function AdminBarBanner() {
|
|
50
|
+
const pathname = usePathname();
|
|
51
|
+
const { admin, isAuthenticated, isLoading } = useAdminAuth();
|
|
52
|
+
const [portalRoot, setPortalRoot] = useState(null);
|
|
53
|
+
const visible = !isLoading &&
|
|
54
|
+
isAuthenticated &&
|
|
55
|
+
Boolean(admin?.role) &&
|
|
56
|
+
!pathname?.startsWith('/admin');
|
|
57
|
+
useEffect(() => {
|
|
58
|
+
if (typeof document === 'undefined')
|
|
59
|
+
return;
|
|
60
|
+
if (!visible)
|
|
61
|
+
return;
|
|
62
|
+
// --- Portal root (<html> child, sibling of <body>) ---
|
|
63
|
+
let root = document.getElementById(PORTAL_ROOT_ID);
|
|
64
|
+
let ownsRoot = false;
|
|
65
|
+
if (!root) {
|
|
66
|
+
root = document.createElement('div');
|
|
67
|
+
root.id = PORTAL_ROOT_ID;
|
|
68
|
+
document.documentElement.appendChild(root);
|
|
69
|
+
ownsRoot = true;
|
|
70
|
+
}
|
|
71
|
+
setPortalRoot(root);
|
|
72
|
+
// --- Scoped global stylesheet (pseudo-states + responsive hides) ---
|
|
73
|
+
let styleEl = document.getElementById(STYLE_TAG_ID);
|
|
74
|
+
let ownsStyle = false;
|
|
75
|
+
if (!styleEl) {
|
|
76
|
+
styleEl = document.createElement('style');
|
|
77
|
+
styleEl.id = STYLE_TAG_ID;
|
|
78
|
+
styleEl.textContent = GLOBAL_CSS;
|
|
79
|
+
document.head.appendChild(styleEl);
|
|
80
|
+
ownsStyle = true;
|
|
81
|
+
}
|
|
82
|
+
// --- Push the storefront down + reparent fixed descendants ---
|
|
83
|
+
const prevBodyMarginTop = document.body.style.marginTop;
|
|
84
|
+
const prevBodyTransform = document.body.style.transform;
|
|
85
|
+
document.body.style.marginTop = `${BAR_HEIGHT_PX}px`;
|
|
86
|
+
document.body.style.transform = 'translateZ(0)';
|
|
87
|
+
return () => {
|
|
88
|
+
document.body.style.marginTop = prevBodyMarginTop;
|
|
89
|
+
document.body.style.transform = prevBodyTransform;
|
|
90
|
+
if (ownsStyle && styleEl?.parentNode) {
|
|
91
|
+
styleEl.parentNode.removeChild(styleEl);
|
|
92
|
+
}
|
|
93
|
+
if (ownsRoot && root?.parentNode) {
|
|
94
|
+
root.parentNode.removeChild(root);
|
|
95
|
+
}
|
|
96
|
+
setPortalRoot(null);
|
|
97
|
+
};
|
|
98
|
+
}, [visible]);
|
|
99
|
+
if (!visible || !portalRoot || !admin)
|
|
100
|
+
return null;
|
|
101
|
+
const role = roleLabel(admin.role).toLowerCase();
|
|
102
|
+
// Deep-link to Rovela platform. Only shown when the project ID env var is
|
|
103
|
+
// present — which is the case for every store that has redeployed since
|
|
104
|
+
// the env var was added to buildStoreEnvVars(). Older stores see only the
|
|
105
|
+
// "Manage store" button until their next rebuild.
|
|
106
|
+
const projectId = getEnv('NEXT_PUBLIC_ROVELA_PROJECT_ID');
|
|
107
|
+
const rovelaBase = getEnv('NEXT_PUBLIC_ROVELA_URL') || DEFAULT_ROVELA_URL;
|
|
108
|
+
const editUrl = projectId ? `${rovelaBase.replace(/\/$/, '')}/generate/${projectId}` : null;
|
|
109
|
+
return createPortal(_jsx("div", { "data-rovela-admin-bar": "", style: wrapStyle, children: _jsxs("div", { style: innerStyle, children: [_jsxs("div", { style: leftGroupStyle, children: [_jsx("span", { "aria-hidden": "true", style: dotStyle }), _jsx("span", { "data-rovela-tablet-only": "", style: labelStyle, children: "Admin session" }), _jsx("span", { "aria-hidden": "true", "data-rovela-desktop-only": "", style: dividerStyle, children: "\u00B7" }), _jsx("span", { "data-rovela-desktop-only": "", style: roleStyle, children: role })] }), _jsxs("div", { style: actionsStyle, children: [editUrl && (_jsxs("a", { href: editUrl, target: "_blank", rel: "noopener noreferrer", "data-rovela-action": "", "aria-label": "Edit store in Rovela", style: buttonStyle, children: [_jsx("img", { src: ROVELA_LOGO_SRC, alt: "", "aria-hidden": "true", style: rovelaIconStyle }), _jsx("span", { "data-rovela-desktop-only": "", children: "Edit store" })] })), _jsxs("a", { href: "/admin", target: "_blank", rel: "noopener noreferrer", "data-rovela-action": "", "aria-label": "Open the admin dashboard", style: buttonStyle, children: [_jsx(LayoutDashboard, { "aria-hidden": "true", style: lucideIconStyle, strokeWidth: 1.8 }), _jsx("span", { "data-rovela-desktop-only": "", children: "Manage store" })] })] })] }) }), portalRoot);
|
|
110
|
+
}
|
|
111
|
+
// =============================================================================
|
|
112
|
+
// Helpers
|
|
113
|
+
// =============================================================================
|
|
114
|
+
/**
|
|
115
|
+
* `NEXT_PUBLIC_*` vars get statically inlined by Next.js when a component
|
|
116
|
+
* is bundled, so reading via `process.env[name]` with a dynamic key does
|
|
117
|
+
* not work in the SDK (no direct access to the compile-time substitution).
|
|
118
|
+
* We read the literal strings so the bundler can substitute them.
|
|
119
|
+
*/
|
|
120
|
+
function getEnv(key) {
|
|
121
|
+
if (key === 'NEXT_PUBLIC_ROVELA_PROJECT_ID')
|
|
122
|
+
return process.env.NEXT_PUBLIC_ROVELA_PROJECT_ID;
|
|
123
|
+
if (key === 'NEXT_PUBLIC_ROVELA_URL')
|
|
124
|
+
return process.env.NEXT_PUBLIC_ROVELA_URL;
|
|
125
|
+
return undefined;
|
|
126
|
+
}
|
|
127
|
+
// =============================================================================
|
|
128
|
+
// Styles
|
|
129
|
+
// =============================================================================
|
|
130
|
+
const wrapStyle = {
|
|
131
|
+
position: 'fixed',
|
|
132
|
+
top: 0,
|
|
133
|
+
left: 0,
|
|
134
|
+
right: 0,
|
|
135
|
+
height: `${BAR_HEIGHT_PX}px`,
|
|
136
|
+
zIndex: 2147483647,
|
|
137
|
+
background: 'rgba(10, 10, 12, 0.85)',
|
|
138
|
+
backdropFilter: 'blur(12px) saturate(140%)',
|
|
139
|
+
WebkitBackdropFilter: 'blur(12px) saturate(140%)',
|
|
140
|
+
borderBottom: '1px solid rgba(255, 255, 255, 0.06)',
|
|
53
141
|
color: '#FFFFFF',
|
|
54
142
|
fontFamily: 'ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',
|
|
55
143
|
fontSize: '13px',
|
|
56
144
|
lineHeight: 1.3,
|
|
57
|
-
|
|
145
|
+
letterSpacing: '-0.005em',
|
|
58
146
|
boxSizing: 'border-box',
|
|
59
147
|
};
|
|
60
|
-
const
|
|
148
|
+
const innerStyle = {
|
|
149
|
+
maxWidth: '1280px',
|
|
150
|
+
height: '100%',
|
|
151
|
+
margin: '0 auto',
|
|
152
|
+
padding: '0 16px',
|
|
153
|
+
display: 'flex',
|
|
154
|
+
alignItems: 'center',
|
|
155
|
+
justifyContent: 'space-between',
|
|
156
|
+
gap: '12px',
|
|
157
|
+
boxSizing: 'border-box',
|
|
158
|
+
};
|
|
159
|
+
const leftGroupStyle = {
|
|
61
160
|
display: 'inline-flex',
|
|
62
161
|
alignItems: 'center',
|
|
63
162
|
gap: '8px',
|
|
64
163
|
minWidth: 0,
|
|
65
164
|
overflow: 'hidden',
|
|
66
|
-
textOverflow: 'ellipsis',
|
|
67
|
-
whiteSpace: 'nowrap',
|
|
68
165
|
};
|
|
69
166
|
const dotStyle = {
|
|
70
167
|
width: '6px',
|
|
71
168
|
height: '6px',
|
|
72
169
|
borderRadius: '9999px',
|
|
73
170
|
background: '#22C55E',
|
|
171
|
+
boxShadow: '0 0 0 0 rgba(34, 197, 94, 0.6)',
|
|
172
|
+
animation: 'rab-pulse 2.4s infinite',
|
|
74
173
|
flexShrink: 0,
|
|
75
174
|
};
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
175
|
+
const labelStyle = {
|
|
176
|
+
color: 'rgba(255, 255, 255, 0.92)',
|
|
177
|
+
fontWeight: 500,
|
|
178
|
+
whiteSpace: 'nowrap',
|
|
179
|
+
};
|
|
180
|
+
const dividerStyle = {
|
|
181
|
+
color: 'rgba(255, 255, 255, 0.3)',
|
|
182
|
+
};
|
|
183
|
+
const roleStyle = {
|
|
184
|
+
color: 'rgba(255, 255, 255, 0.55)',
|
|
185
|
+
whiteSpace: 'nowrap',
|
|
81
186
|
};
|
|
82
|
-
const
|
|
187
|
+
const actionsStyle = {
|
|
83
188
|
display: 'inline-flex',
|
|
84
189
|
alignItems: 'center',
|
|
85
190
|
gap: '6px',
|
|
86
|
-
|
|
87
|
-
padding: '0 10px',
|
|
88
|
-
borderRadius: '6px',
|
|
89
|
-
fontSize: '12px',
|
|
90
|
-
fontWeight: 500,
|
|
91
|
-
color: '#0B0B0F',
|
|
92
|
-
background: '#FFFFFF',
|
|
93
|
-
textDecoration: 'none',
|
|
94
|
-
border: '1px solid #FFFFFF',
|
|
95
|
-
cursor: 'pointer',
|
|
96
|
-
whiteSpace: 'nowrap',
|
|
191
|
+
flexShrink: 0,
|
|
97
192
|
};
|
|
98
|
-
const
|
|
193
|
+
const buttonStyle = {
|
|
99
194
|
display: 'inline-flex',
|
|
100
195
|
alignItems: 'center',
|
|
101
196
|
gap: '6px',
|
|
102
197
|
height: '28px',
|
|
103
198
|
padding: '0 10px',
|
|
104
199
|
borderRadius: '6px',
|
|
105
|
-
fontSize: '
|
|
200
|
+
fontSize: '12.5px',
|
|
106
201
|
fontWeight: 500,
|
|
107
202
|
color: '#FFFFFF',
|
|
108
|
-
background: '
|
|
109
|
-
border: '1px solid rgba(255, 255, 255, 0.
|
|
203
|
+
background: 'rgba(255, 255, 255, 0.1)',
|
|
204
|
+
border: '1px solid rgba(255, 255, 255, 0.12)',
|
|
205
|
+
textDecoration: 'none',
|
|
110
206
|
cursor: 'pointer',
|
|
111
207
|
whiteSpace: 'nowrap',
|
|
112
|
-
|
|
208
|
+
flexShrink: 0,
|
|
209
|
+
transition: 'background 120ms ease, border-color 120ms ease',
|
|
113
210
|
};
|
|
114
|
-
const
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
fontSize: '11px',
|
|
121
|
-
fontWeight: 600,
|
|
122
|
-
letterSpacing: '0.02em',
|
|
123
|
-
textTransform: 'uppercase',
|
|
211
|
+
const rovelaIconStyle = {
|
|
212
|
+
width: '14px',
|
|
213
|
+
height: '14px',
|
|
214
|
+
objectFit: 'contain',
|
|
215
|
+
// Force the logo to render pure white so it reads correctly on the dark bar
|
|
216
|
+
filter: 'brightness(0) invert(1)',
|
|
124
217
|
flexShrink: 0,
|
|
125
218
|
};
|
|
126
|
-
const
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
whiteSpace: 'nowrap',
|
|
219
|
+
const lucideIconStyle = {
|
|
220
|
+
width: '14px',
|
|
221
|
+
height: '14px',
|
|
222
|
+
flexShrink: 0,
|
|
131
223
|
};
|
|
132
|
-
//
|
|
133
|
-
//
|
|
134
|
-
//
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
224
|
+
// Scoped under [data-rovela-admin-bar] so no rules can escape into the
|
|
225
|
+
// storefront. Injected on mount, removed on unmount.
|
|
226
|
+
//
|
|
227
|
+
// Responsive hide rules:
|
|
228
|
+
// - [data-rovela-desktop-only] hidden below 640px (role tag, button labels)
|
|
229
|
+
// - [data-rovela-tablet-only] hidden below 480px ("Admin session" label)
|
|
230
|
+
const GLOBAL_CSS = `
|
|
231
|
+
@keyframes rab-pulse {
|
|
232
|
+
0% { box-shadow: 0 0 0 0 rgba(34, 197, 94, 0.55); }
|
|
233
|
+
70% { box-shadow: 0 0 0 6px rgba(34, 197, 94, 0); }
|
|
234
|
+
100% { box-shadow: 0 0 0 0 rgba(34, 197, 94, 0); }
|
|
235
|
+
}
|
|
236
|
+
[data-rovela-admin-bar] a[data-rovela-action]:hover {
|
|
237
|
+
background: rgba(255, 255, 255, 0.18) !important;
|
|
238
|
+
border-color: rgba(255, 255, 255, 0.2) !important;
|
|
239
|
+
}
|
|
240
|
+
[data-rovela-admin-bar] a[data-rovela-action]:focus-visible {
|
|
241
|
+
outline: 2px solid rgba(255, 255, 255, 0.6);
|
|
242
|
+
outline-offset: 2px;
|
|
243
|
+
}
|
|
244
|
+
@media (max-width: 639px) {
|
|
245
|
+
[data-rovela-admin-bar] [data-rovela-desktop-only] { display: none !important; }
|
|
246
|
+
}
|
|
247
|
+
@media (max-width: 479px) {
|
|
248
|
+
[data-rovela-admin-bar] [data-rovela-tablet-only] { display: none !important; }
|
|
249
|
+
[data-rovela-admin-bar] a[data-rovela-action] { padding: 0 8px; }
|
|
250
|
+
}
|
|
251
|
+
@media (prefers-reduced-motion: reduce) {
|
|
252
|
+
[data-rovela-admin-bar] [aria-hidden="true"] { animation: none !important; }
|
|
155
253
|
}
|
|
254
|
+
`;
|
|
156
255
|
//# sourceMappingURL=AdminBarBanner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminBarBanner.js","sourceRoot":"","sources":["../../../src/admin/components/AdminBarBanner.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ
|
|
1
|
+
{"version":3,"file":"AdminBarBanner.js","sourceRoot":"","sources":["../../../src/admin/components/AdminBarBanner.tsx"],"names":[],"mappings":"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"}
|