@rovela-ai/sdk 0.3.11 → 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 +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,41 +3,36 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
3
3
|
/**
|
|
4
4
|
* @rovela/sdk/admin/components/AdminBarBanner
|
|
5
5
|
*
|
|
6
|
-
* Linear/Vercel-style admin session bar
|
|
7
|
-
*
|
|
8
|
-
*
|
|
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
|
+
* visitors never see it.
|
|
9
9
|
*
|
|
10
|
-
* Design rules:
|
|
10
|
+
* Design rules (unchanged from v1):
|
|
11
11
|
*
|
|
12
|
-
* 1. Self-gating.
|
|
13
|
-
*
|
|
14
|
-
* user is on an `/admin/*` route. Safe to mount unconditionally at
|
|
15
|
-
* 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. Portal-rendered to <html
|
|
18
|
-
*
|
|
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.
|
|
19
18
|
*
|
|
20
|
-
* 3.
|
|
21
|
-
* `margin-top: 40px` + `transform: translateZ(0)` to <body>. The
|
|
22
|
-
* transform reparents the containing block of every `position: fixed`
|
|
23
|
-
* descendant from the viewport to <body>, so sticky/fixed store
|
|
24
|
-
* headers sit *below* our bar instead of overlapping it. The banner
|
|
25
|
-
* itself lives outside <body> (in the portal root appended to
|
|
26
|
-
* <html>), so the same transform does not affect it — it stays
|
|
27
|
-
* pinned to the real viewport at `top: 0`.
|
|
19
|
+
* 3. Theme-proof. Inline styles + one scoped <style> element.
|
|
28
20
|
*
|
|
29
|
-
* 4.
|
|
30
|
-
* for pseudo-states and media queries. Storefront Tailwind/CSS edits
|
|
31
|
-
* cannot regress this.
|
|
21
|
+
* 4. Navigation-only. Server-side guards still authorize.
|
|
32
22
|
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
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.
|
|
37
31
|
*/
|
|
38
32
|
import { useEffect, useState } from 'react';
|
|
39
33
|
import { createPortal } from 'react-dom';
|
|
40
34
|
import { usePathname } from 'next/navigation';
|
|
35
|
+
import { LayoutDashboard } from 'lucide-react';
|
|
41
36
|
import { useAdminAuth } from '../hooks/useAdminAuth';
|
|
42
37
|
import { roleLabel } from '../permissions';
|
|
43
38
|
// =============================================================================
|
|
@@ -46,6 +41,8 @@ import { roleLabel } from '../permissions';
|
|
|
46
41
|
const BAR_HEIGHT_PX = 40;
|
|
47
42
|
const PORTAL_ROOT_ID = 'rovela-admin-bar-root';
|
|
48
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';
|
|
49
46
|
// =============================================================================
|
|
50
47
|
// Component
|
|
51
48
|
// =============================================================================
|
|
@@ -53,8 +50,6 @@ export function AdminBarBanner() {
|
|
|
53
50
|
const pathname = usePathname();
|
|
54
51
|
const { admin, isAuthenticated, isLoading } = useAdminAuth();
|
|
55
52
|
const [portalRoot, setPortalRoot] = useState(null);
|
|
56
|
-
// Visibility gate. Any change here triggers mount/unmount side-effects
|
|
57
|
-
// via the `useEffect` below.
|
|
58
53
|
const visible = !isLoading &&
|
|
59
54
|
isAuthenticated &&
|
|
60
55
|
Boolean(admin?.role) &&
|
|
@@ -64,7 +59,7 @@ export function AdminBarBanner() {
|
|
|
64
59
|
return;
|
|
65
60
|
if (!visible)
|
|
66
61
|
return;
|
|
67
|
-
// ---
|
|
62
|
+
// --- Portal root (<html> child, sibling of <body>) ---
|
|
68
63
|
let root = document.getElementById(PORTAL_ROOT_ID);
|
|
69
64
|
let ownsRoot = false;
|
|
70
65
|
if (!root) {
|
|
@@ -74,7 +69,7 @@ export function AdminBarBanner() {
|
|
|
74
69
|
ownsRoot = true;
|
|
75
70
|
}
|
|
76
71
|
setPortalRoot(root);
|
|
77
|
-
// ---
|
|
72
|
+
// --- Scoped global stylesheet (pseudo-states + responsive hides) ---
|
|
78
73
|
let styleEl = document.getElementById(STYLE_TAG_ID);
|
|
79
74
|
let ownsStyle = false;
|
|
80
75
|
if (!styleEl) {
|
|
@@ -84,14 +79,10 @@ export function AdminBarBanner() {
|
|
|
84
79
|
document.head.appendChild(styleEl);
|
|
85
80
|
ownsStyle = true;
|
|
86
81
|
}
|
|
87
|
-
// ---
|
|
88
|
-
// Remember previous inline values so we restore precisely on unmount.
|
|
82
|
+
// --- Push the storefront down + reparent fixed descendants ---
|
|
89
83
|
const prevBodyMarginTop = document.body.style.marginTop;
|
|
90
84
|
const prevBodyTransform = document.body.style.transform;
|
|
91
85
|
document.body.style.marginTop = `${BAR_HEIGHT_PX}px`;
|
|
92
|
-
// `translateZ(0)` creates a new containing block for any descendant
|
|
93
|
-
// with `position: fixed`. Combined with the body margin above, this
|
|
94
|
-
// shifts sticky/fixed store chrome out from under our bar.
|
|
95
86
|
document.body.style.transform = 'translateZ(0)';
|
|
96
87
|
return () => {
|
|
97
88
|
document.body.style.marginTop = prevBodyMarginTop;
|
|
@@ -108,7 +99,30 @@ export function AdminBarBanner() {
|
|
|
108
99
|
if (!visible || !portalRoot || !admin)
|
|
109
100
|
return null;
|
|
110
101
|
const role = roleLabel(admin.role).toLowerCase();
|
|
111
|
-
|
|
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;
|
|
112
126
|
}
|
|
113
127
|
// =============================================================================
|
|
114
128
|
// Styles
|
|
@@ -119,8 +133,6 @@ const wrapStyle = {
|
|
|
119
133
|
left: 0,
|
|
120
134
|
right: 0,
|
|
121
135
|
height: `${BAR_HEIGHT_PX}px`,
|
|
122
|
-
// Max 32-bit signed int — safely above any storefront z-index stacking
|
|
123
|
-
// context (Intercom widgets cap at ~2147483000; we still sit above).
|
|
124
136
|
zIndex: 2147483647,
|
|
125
137
|
background: 'rgba(10, 10, 12, 0.85)',
|
|
126
138
|
backdropFilter: 'blur(12px) saturate(140%)',
|
|
@@ -172,12 +184,18 @@ const roleStyle = {
|
|
|
172
184
|
color: 'rgba(255, 255, 255, 0.55)',
|
|
173
185
|
whiteSpace: 'nowrap',
|
|
174
186
|
};
|
|
187
|
+
const actionsStyle = {
|
|
188
|
+
display: 'inline-flex',
|
|
189
|
+
alignItems: 'center',
|
|
190
|
+
gap: '6px',
|
|
191
|
+
flexShrink: 0,
|
|
192
|
+
};
|
|
175
193
|
const buttonStyle = {
|
|
176
194
|
display: 'inline-flex',
|
|
177
195
|
alignItems: 'center',
|
|
178
196
|
gap: '6px',
|
|
179
197
|
height: '28px',
|
|
180
|
-
padding: '0
|
|
198
|
+
padding: '0 10px',
|
|
181
199
|
borderRadius: '6px',
|
|
182
200
|
fontSize: '12.5px',
|
|
183
201
|
fontWeight: 500,
|
|
@@ -190,14 +208,25 @@ const buttonStyle = {
|
|
|
190
208
|
flexShrink: 0,
|
|
191
209
|
transition: 'background 120ms ease, border-color 120ms ease',
|
|
192
210
|
};
|
|
193
|
-
const
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
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)',
|
|
217
|
+
flexShrink: 0,
|
|
198
218
|
};
|
|
199
|
-
|
|
200
|
-
|
|
219
|
+
const lucideIconStyle = {
|
|
220
|
+
width: '14px',
|
|
221
|
+
height: '14px',
|
|
222
|
+
flexShrink: 0,
|
|
223
|
+
};
|
|
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)
|
|
201
230
|
const GLOBAL_CSS = `
|
|
202
231
|
@keyframes rab-pulse {
|
|
203
232
|
0% { box-shadow: 0 0 0 0 rgba(34, 197, 94, 0.55); }
|
|
@@ -212,9 +241,13 @@ const GLOBAL_CSS = `
|
|
|
212
241
|
outline: 2px solid rgba(255, 255, 255, 0.6);
|
|
213
242
|
outline-offset: 2px;
|
|
214
243
|
}
|
|
215
|
-
@media (max-width:
|
|
244
|
+
@media (max-width: 639px) {
|
|
216
245
|
[data-rovela-admin-bar] [data-rovela-desktop-only] { display: none !important; }
|
|
217
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
|
+
}
|
|
218
251
|
@media (prefers-reduced-motion: reduce) {
|
|
219
252
|
[data-rovela-admin-bar] [aria-hidden="true"] { animation: none !important; }
|
|
220
253
|
}
|
|
@@ -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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"}
|