@rovela-ai/sdk 0.18.5 → 0.18.7
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/AdminAcceptInviteForm.d.ts.map +1 -1
- package/dist/admin/components/AdminAcceptInviteForm.js +17 -6
- package/dist/admin/components/AdminAcceptInviteForm.js.map +1 -1
- package/dist/admin/components/AdminAccountPage.d.ts.map +1 -1
- package/dist/admin/components/AdminAccountPage.js +7 -10
- package/dist/admin/components/AdminAccountPage.js.map +1 -1
- package/dist/admin/components/AdminAuthShell.d.ts +32 -0
- package/dist/admin/components/AdminAuthShell.d.ts.map +1 -0
- package/dist/admin/components/AdminAuthShell.js +17 -0
- package/dist/admin/components/AdminAuthShell.js.map +1 -0
- package/dist/admin/components/AdminBrandTile.d.ts +10 -0
- package/dist/admin/components/AdminBrandTile.d.ts.map +1 -0
- package/dist/admin/components/AdminBrandTile.js +46 -0
- package/dist/admin/components/AdminBrandTile.js.map +1 -0
- package/dist/admin/components/AdminEmptyState.d.ts +33 -0
- package/dist/admin/components/AdminEmptyState.d.ts.map +1 -0
- package/dist/admin/components/AdminEmptyState.js +12 -0
- package/dist/admin/components/AdminEmptyState.js.map +1 -0
- package/dist/admin/components/AdminForgotPasswordForm.d.ts.map +1 -1
- package/dist/admin/components/AdminForgotPasswordForm.js +8 -6
- package/dist/admin/components/AdminForgotPasswordForm.js.map +1 -1
- package/dist/admin/components/AdminLoginForm.js +1 -1
- package/dist/admin/components/AdminLoginForm.js.map +1 -1
- package/dist/admin/components/AdminModal.d.ts +51 -0
- package/dist/admin/components/AdminModal.d.ts.map +1 -0
- package/dist/admin/components/AdminModal.js +118 -0
- package/dist/admin/components/AdminModal.js.map +1 -0
- package/dist/admin/components/AdminPagination.d.ts +22 -0
- package/dist/admin/components/AdminPagination.d.ts.map +1 -0
- package/dist/admin/components/AdminPagination.js +15 -0
- package/dist/admin/components/AdminPagination.js.map +1 -0
- package/dist/admin/components/AdminResetPasswordForm.d.ts.map +1 -1
- package/dist/admin/components/AdminResetPasswordForm.js +12 -6
- package/dist/admin/components/AdminResetPasswordForm.js.map +1 -1
- package/dist/admin/components/AdminSearchInput.d.ts +14 -0
- package/dist/admin/components/AdminSearchInput.d.ts.map +1 -0
- package/dist/admin/components/AdminSearchInput.js +56 -0
- package/dist/admin/components/AdminSearchInput.js.map +1 -0
- package/dist/admin/components/AdminSelect.d.ts +3 -1
- package/dist/admin/components/AdminSelect.d.ts.map +1 -1
- package/dist/admin/components/AdminSelect.js +2 -2
- package/dist/admin/components/AdminSelect.js.map +1 -1
- package/dist/admin/components/AdminSwitch.d.ts +20 -0
- package/dist/admin/components/AdminSwitch.d.ts.map +1 -0
- package/dist/admin/components/AdminSwitch.js +9 -0
- package/dist/admin/components/AdminSwitch.js.map +1 -0
- package/dist/admin/components/AdminTopBar.d.ts +1 -1
- package/dist/admin/components/AdminTopBar.d.ts.map +1 -1
- package/dist/admin/components/AdminTopBar.js +5 -21
- package/dist/admin/components/AdminTopBar.js.map +1 -1
- package/dist/admin/components/AdminUserMenu.js +1 -1
- package/dist/admin/components/BrandingAssetUpload.d.ts.map +1 -1
- package/dist/admin/components/BrandingAssetUpload.js +3 -3
- package/dist/admin/components/BrandingAssetUpload.js.map +1 -1
- package/dist/admin/components/CategoryForm.d.ts.map +1 -1
- package/dist/admin/components/CategoryForm.js +7 -3
- package/dist/admin/components/CategoryForm.js.map +1 -1
- package/dist/admin/components/CategorySelect.js +2 -2
- package/dist/admin/components/CategorySelect.js.map +1 -1
- package/dist/admin/components/CustomerAddressPanel.d.ts.map +1 -1
- package/dist/admin/components/CustomerAddressPanel.js +15 -7
- package/dist/admin/components/CustomerAddressPanel.js.map +1 -1
- package/dist/admin/components/CustomerDetails.d.ts.map +1 -1
- package/dist/admin/components/CustomerDetails.js +8 -14
- package/dist/admin/components/CustomerDetails.js.map +1 -1
- package/dist/admin/components/CustomerGroupsManager.d.ts.map +1 -1
- package/dist/admin/components/CustomerGroupsManager.js +18 -12
- package/dist/admin/components/CustomerGroupsManager.js.map +1 -1
- package/dist/admin/components/CustomerTable.d.ts.map +1 -1
- package/dist/admin/components/CustomerTable.js +24 -15
- package/dist/admin/components/CustomerTable.js.map +1 -1
- package/dist/admin/components/DeleteConfirmDialog.d.ts +5 -5
- package/dist/admin/components/DeleteConfirmDialog.d.ts.map +1 -1
- package/dist/admin/components/DeleteConfirmDialog.js +11 -8
- package/dist/admin/components/DeleteConfirmDialog.js.map +1 -1
- package/dist/admin/components/DiscountsManager.d.ts.map +1 -1
- package/dist/admin/components/DiscountsManager.js +47 -15
- package/dist/admin/components/DiscountsManager.js.map +1 -1
- package/dist/admin/components/EmailsManager.d.ts.map +1 -1
- package/dist/admin/components/EmailsManager.js +18 -20
- package/dist/admin/components/EmailsManager.js.map +1 -1
- package/dist/admin/components/FilesManager.d.ts.map +1 -1
- package/dist/admin/components/FilesManager.js +16 -18
- package/dist/admin/components/FilesManager.js.map +1 -1
- package/dist/admin/components/InventoryEditor.js +1 -1
- package/dist/admin/components/InventoryEditor.js.map +1 -1
- package/dist/admin/components/InviteUserDialog.d.ts.map +1 -1
- package/dist/admin/components/InviteUserDialog.js +12 -16
- package/dist/admin/components/InviteUserDialog.js.map +1 -1
- package/dist/admin/components/LocationsManager.d.ts.map +1 -1
- package/dist/admin/components/LocationsManager.js +18 -8
- package/dist/admin/components/LocationsManager.js.map +1 -1
- package/dist/admin/components/MediaLibraryPicker.d.ts.map +1 -1
- package/dist/admin/components/MediaLibraryPicker.js +22 -15
- package/dist/admin/components/MediaLibraryPicker.js.map +1 -1
- package/dist/admin/components/OrderDetails.d.ts.map +1 -1
- package/dist/admin/components/OrderDetails.js +19 -34
- package/dist/admin/components/OrderDetails.js.map +1 -1
- package/dist/admin/components/OrderStatusChart.js +1 -1
- package/dist/admin/components/OrderStatusChart.js.map +1 -1
- package/dist/admin/components/OrderTable.d.ts.map +1 -1
- package/dist/admin/components/OrderTable.js +27 -14
- package/dist/admin/components/OrderTable.js.map +1 -1
- package/dist/admin/components/PaymentMethodsManager.d.ts.map +1 -1
- package/dist/admin/components/PaymentMethodsManager.js +17 -16
- package/dist/admin/components/PaymentMethodsManager.js.map +1 -1
- package/dist/admin/components/PaymentSettings.d.ts.map +1 -1
- package/dist/admin/components/PaymentSettings.js +2 -2
- package/dist/admin/components/PaymentSettings.js.map +1 -1
- package/dist/admin/components/PermissionsMatrix.js +1 -1
- package/dist/admin/components/PermissionsMatrix.js.map +1 -1
- package/dist/admin/components/PrimaryMetricsRow.d.ts.map +1 -1
- package/dist/admin/components/PrimaryMetricsRow.js +4 -1
- package/dist/admin/components/PrimaryMetricsRow.js.map +1 -1
- package/dist/admin/components/ProductForm.d.ts.map +1 -1
- package/dist/admin/components/ProductForm.js +11 -5
- package/dist/admin/components/ProductForm.js.map +1 -1
- package/dist/admin/components/ProductTable.d.ts.map +1 -1
- package/dist/admin/components/ProductTable.js +22 -9
- package/dist/admin/components/ProductTable.js.map +1 -1
- package/dist/admin/components/RecentOrders.d.ts.map +1 -1
- package/dist/admin/components/RecentOrders.js +3 -16
- package/dist/admin/components/RecentOrders.js.map +1 -1
- package/dist/admin/components/RefundDialog.d.ts +1 -1
- package/dist/admin/components/RefundDialog.d.ts.map +1 -1
- package/dist/admin/components/RefundDialog.js +10 -17
- package/dist/admin/components/RefundDialog.js.map +1 -1
- package/dist/admin/components/RevenueChart.js +1 -1
- package/dist/admin/components/RevenueChart.js.map +1 -1
- package/dist/admin/components/SEOPreview.js +1 -1
- package/dist/admin/components/SEOPreview.js.map +1 -1
- package/dist/admin/components/SecondaryMetricsRow.d.ts.map +1 -1
- package/dist/admin/components/SecondaryMetricsRow.js +6 -1
- package/dist/admin/components/SecondaryMetricsRow.js.map +1 -1
- package/dist/admin/components/ShippingSettings.d.ts.map +1 -1
- package/dist/admin/components/ShippingSettings.js +22 -31
- package/dist/admin/components/ShippingSettings.js.map +1 -1
- package/dist/admin/components/StatsCards.d.ts.map +1 -1
- package/dist/admin/components/StatsCards.js +4 -1
- package/dist/admin/components/StatsCards.js.map +1 -1
- package/dist/admin/components/TagInput.d.ts +1 -1
- package/dist/admin/components/TagInput.js +1 -1
- package/dist/admin/components/TaxSettings.d.ts.map +1 -1
- package/dist/admin/components/TaxSettings.js +20 -19
- 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 +21 -20
- package/dist/admin/components/UsersTable.js.map +1 -1
- package/dist/admin/components/VariantManager.d.ts.map +1 -1
- package/dist/admin/components/VariantManager.js +5 -5
- package/dist/admin/components/VariantManager.js.map +1 -1
- package/dist/admin/components/emails/ColorField.d.ts.map +1 -1
- package/dist/admin/components/emails/ColorField.js +1 -1
- package/dist/admin/components/emails/ColorField.js.map +1 -1
- package/dist/admin/components/emails/EmailPreviewPane.js +1 -1
- package/dist/admin/components/emails/EmailPreviewPane.js.map +1 -1
- package/dist/admin/components/emails/EmailThemePanel.js +1 -1
- package/dist/admin/components/emails/EmailThemePanel.js.map +1 -1
- package/dist/admin/components/emails/FontPicker.js +2 -2
- package/dist/admin/components/emails/FontPicker.js.map +1 -1
- package/dist/admin/components/index.d.ts +15 -0
- package/dist/admin/components/index.d.ts.map +1 -1
- package/dist/admin/components/index.js +9 -0
- package/dist/admin/components/index.js.map +1 -1
- package/dist/admin/components/statusBadges.d.ts +12 -0
- package/dist/admin/components/statusBadges.d.ts.map +1 -0
- package/dist/admin/components/statusBadges.js +50 -0
- package/dist/admin/components/statusBadges.js.map +1 -0
- package/dist/admin/index.d.ts +2 -2
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +4 -2
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/styles/admin-theme.css +289 -0
- package/package.json +1 -1
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rovela/sdk/admin/components/AdminModal
|
|
3
|
+
*
|
|
4
|
+
* THE overlay primitive — every dialog in the admin renders through it, so
|
|
5
|
+
* the behaviors no hand-rolled overlay gets right live exactly once:
|
|
6
|
+
*
|
|
7
|
+
* - React portal to <body> (wrapped in `.rovela-admin-theme` so the theme
|
|
8
|
+
* scope survives the teleport)
|
|
9
|
+
* - the one blurred backdrop (`admin-modal-backdrop`)
|
|
10
|
+
* - Escape closes, click-outside closes — both inert while `busy`
|
|
11
|
+
* (an in-flight submit must never be dismissed out from under itself)
|
|
12
|
+
* - body scroll lock (counter-based, safe for stacked modals)
|
|
13
|
+
* - focus moves into the card on open, Tab wraps inside it, and focus
|
|
14
|
+
* returns to the opener on close
|
|
15
|
+
*
|
|
16
|
+
* Three widths, one anatomy: default 28rem confirms · `width="md"` (30rem)
|
|
17
|
+
* editors · `width="lg"` (46rem) pickers. Header carries the title +
|
|
18
|
+
* optional icon circle + optional X; `footer` is always right-aligned.
|
|
19
|
+
* Errors inside the body are inline `admin-alert` STATES, never toasts.
|
|
20
|
+
*
|
|
21
|
+
* Forms: put the <form id="…"> in children and submit from the footer via
|
|
22
|
+
* <button type="submit" form="…">.
|
|
23
|
+
*/
|
|
24
|
+
import { type ReactNode } from 'react';
|
|
25
|
+
export interface AdminModalProps {
|
|
26
|
+
/** Whether the modal is visible */
|
|
27
|
+
open: boolean;
|
|
28
|
+
/** Called on Escape, backdrop click, or the X button (not while `busy`) */
|
|
29
|
+
onClose: () => void;
|
|
30
|
+
/** Header title. Omit for fully custom children. */
|
|
31
|
+
title?: string;
|
|
32
|
+
/** Muted copy under the title */
|
|
33
|
+
description?: string;
|
|
34
|
+
/** Icon element rendered inside the colored header circle */
|
|
35
|
+
icon?: ReactNode;
|
|
36
|
+
/** Tone of the icon circle (default 'error' — matches the delete confirm) */
|
|
37
|
+
iconTone?: 'error' | 'warning' | 'success' | 'info';
|
|
38
|
+
/** Card width: 28rem confirms (default) · 30rem editors · 46rem pickers */
|
|
39
|
+
width?: 'sm' | 'md' | 'lg';
|
|
40
|
+
/** While true, Escape / backdrop / X are inert and won't close the modal */
|
|
41
|
+
busy?: boolean;
|
|
42
|
+
/** Render an X close button in the header (pickers and form editors) */
|
|
43
|
+
showClose?: boolean;
|
|
44
|
+
/** Right-aligned footer content (action buttons) */
|
|
45
|
+
footer?: ReactNode;
|
|
46
|
+
/** Extra classes on the modal card */
|
|
47
|
+
className?: string;
|
|
48
|
+
children?: ReactNode;
|
|
49
|
+
}
|
|
50
|
+
export declare function AdminModal({ open, onClose, title, description, icon, iconTone, width, busy, showClose, footer, className, children, }: AdminModalProps): import("react").ReactPortal | null;
|
|
51
|
+
//# sourceMappingURL=AdminModal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminModal.d.ts","sourceRoot":"","sources":["../../../src/admin/components/AdminModal.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAQnE,MAAM,WAAW,eAAe;IAC9B,mCAAmC;IACnC,IAAI,EAAE,OAAO,CAAA;IACb,2EAA2E;IAC3E,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,6DAA6D;IAC7D,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAA;IACnD,2EAA2E;IAC3E,KAAK,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;IAC1B,4EAA4E;IAC5E,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,wEAAwE;IACxE,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,oDAAoD;IACpD,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB;AAkCD,wBAAgB,UAAU,CAAC,EACzB,IAAI,EACJ,OAAO,EACP,KAAK,EACL,WAAW,EACX,IAAI,EACJ,QAAkB,EAClB,KAAY,EACZ,IAAY,EACZ,SAAiB,EACjB,MAAM,EACN,SAAc,EACd,QAAQ,GACT,EAAE,eAAe,sCA0HjB"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* @rovela/sdk/admin/components/AdminModal
|
|
5
|
+
*
|
|
6
|
+
* THE overlay primitive — every dialog in the admin renders through it, so
|
|
7
|
+
* the behaviors no hand-rolled overlay gets right live exactly once:
|
|
8
|
+
*
|
|
9
|
+
* - React portal to <body> (wrapped in `.rovela-admin-theme` so the theme
|
|
10
|
+
* scope survives the teleport)
|
|
11
|
+
* - the one blurred backdrop (`admin-modal-backdrop`)
|
|
12
|
+
* - Escape closes, click-outside closes — both inert while `busy`
|
|
13
|
+
* (an in-flight submit must never be dismissed out from under itself)
|
|
14
|
+
* - body scroll lock (counter-based, safe for stacked modals)
|
|
15
|
+
* - focus moves into the card on open, Tab wraps inside it, and focus
|
|
16
|
+
* returns to the opener on close
|
|
17
|
+
*
|
|
18
|
+
* Three widths, one anatomy: default 28rem confirms · `width="md"` (30rem)
|
|
19
|
+
* editors · `width="lg"` (46rem) pickers. Header carries the title +
|
|
20
|
+
* optional icon circle + optional X; `footer` is always right-aligned.
|
|
21
|
+
* Errors inside the body are inline `admin-alert` STATES, never toasts.
|
|
22
|
+
*
|
|
23
|
+
* Forms: put the <form id="…"> in children and submit from the footer via
|
|
24
|
+
* <button type="submit" form="…">.
|
|
25
|
+
*/
|
|
26
|
+
import { useEffect, useRef, useState } from 'react';
|
|
27
|
+
import { createPortal } from 'react-dom';
|
|
28
|
+
import { X } from 'lucide-react';
|
|
29
|
+
// =============================================================================
|
|
30
|
+
// Body scroll lock — counter-based so stacked modals can't unlock early
|
|
31
|
+
// =============================================================================
|
|
32
|
+
let scrollLockCount = 0;
|
|
33
|
+
let previousOverflow = '';
|
|
34
|
+
function lockBodyScroll() {
|
|
35
|
+
if (scrollLockCount === 0) {
|
|
36
|
+
previousOverflow = document.body.style.overflow;
|
|
37
|
+
document.body.style.overflow = 'hidden';
|
|
38
|
+
}
|
|
39
|
+
scrollLockCount++;
|
|
40
|
+
}
|
|
41
|
+
function unlockBodyScroll() {
|
|
42
|
+
scrollLockCount = Math.max(0, scrollLockCount - 1);
|
|
43
|
+
if (scrollLockCount === 0) {
|
|
44
|
+
document.body.style.overflow = previousOverflow;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// =============================================================================
|
|
48
|
+
// Component
|
|
49
|
+
// =============================================================================
|
|
50
|
+
const WIDTH_CLASS = {
|
|
51
|
+
sm: '',
|
|
52
|
+
md: 'admin-modal-md',
|
|
53
|
+
lg: 'admin-modal-lg',
|
|
54
|
+
};
|
|
55
|
+
export function AdminModal({ open, onClose, title, description, icon, iconTone = 'error', width = 'sm', busy = false, showClose = false, footer, className = '', children, }) {
|
|
56
|
+
const cardRef = useRef(null);
|
|
57
|
+
const openerRef = useRef(null);
|
|
58
|
+
// Keep latest onClose/busy without re-binding document listeners.
|
|
59
|
+
// Synced in an effect (render-time ref writes trip the React Compiler
|
|
60
|
+
// lint); effects run before any user event can fire the listeners.
|
|
61
|
+
const onCloseRef = useRef(onClose);
|
|
62
|
+
const busyRef = useRef(busy);
|
|
63
|
+
useEffect(() => {
|
|
64
|
+
onCloseRef.current = onClose;
|
|
65
|
+
busyRef.current = busy;
|
|
66
|
+
}, [onClose, busy]);
|
|
67
|
+
// Portal target only exists in the browser (client components still SSR)
|
|
68
|
+
const [mounted, setMounted] = useState(false);
|
|
69
|
+
useEffect(() => {
|
|
70
|
+
// Pattern B — post-mount hydration to avoid SSR mismatch.
|
|
71
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect
|
|
72
|
+
setMounted(true);
|
|
73
|
+
}, []);
|
|
74
|
+
// Escape + scroll lock + initial focus / focus restore
|
|
75
|
+
useEffect(() => {
|
|
76
|
+
if (!open)
|
|
77
|
+
return;
|
|
78
|
+
const onKeyDown = (e) => {
|
|
79
|
+
if (e.key === 'Escape' && !busyRef.current)
|
|
80
|
+
onCloseRef.current();
|
|
81
|
+
};
|
|
82
|
+
document.addEventListener('keydown', onKeyDown);
|
|
83
|
+
lockBodyScroll();
|
|
84
|
+
openerRef.current = document.activeElement ?? null;
|
|
85
|
+
// Move focus into the card so Escape/Tab work immediately
|
|
86
|
+
cardRef.current?.focus();
|
|
87
|
+
return () => {
|
|
88
|
+
document.removeEventListener('keydown', onKeyDown);
|
|
89
|
+
unlockBodyScroll();
|
|
90
|
+
openerRef.current?.focus?.();
|
|
91
|
+
};
|
|
92
|
+
}, [open]);
|
|
93
|
+
if (!open || !mounted)
|
|
94
|
+
return null;
|
|
95
|
+
// Lightweight Tab wrap — keeps keyboard focus inside the card
|
|
96
|
+
const handleTabWrap = (e) => {
|
|
97
|
+
if (e.key !== 'Tab' || !cardRef.current)
|
|
98
|
+
return;
|
|
99
|
+
const focusables = Array.from(cardRef.current.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])')).filter((el) => !el.hasAttribute('disabled'));
|
|
100
|
+
if (focusables.length === 0)
|
|
101
|
+
return;
|
|
102
|
+
const first = focusables[0];
|
|
103
|
+
const last = focusables[focusables.length - 1];
|
|
104
|
+
if (e.shiftKey && document.activeElement === first) {
|
|
105
|
+
e.preventDefault();
|
|
106
|
+
last.focus();
|
|
107
|
+
}
|
|
108
|
+
else if (!e.shiftKey && document.activeElement === last) {
|
|
109
|
+
e.preventDefault();
|
|
110
|
+
first.focus();
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
const modal = (_jsx("div", { className: "rovela-admin-theme", children: _jsxs("div", { className: "admin-modal-root", children: [_jsx("div", { className: "admin-modal-backdrop admin-modal-backdrop-animate absolute inset-0", onClick: () => !busy && onClose() }), _jsxs("div", { ref: cardRef, role: "dialog", "aria-modal": "true", "aria-label": title, tabIndex: -1, onKeyDown: handleTabWrap, className: `admin-modal admin-modal-animate relative w-full mx-4 ${WIDTH_CLASS[width]} ${className}`
|
|
114
|
+
.replace(/\s+/g, ' ')
|
|
115
|
+
.trim(), children: [(title || showClose) && (_jsxs("div", { className: "admin-modal-header", children: [icon && (_jsx("div", { className: `admin-modal-icon admin-modal-icon-${iconTone}`, children: icon })), _jsxs("div", { className: "flex-1 min-w-0", children: [title && _jsx("h3", { className: "admin-modal-title", children: title }), description && (_jsx("p", { className: "admin-modal-description", children: description }))] }), showClose && (_jsx("button", { type: "button", onClick: () => !busy && onClose(), disabled: busy, "aria-label": "Close", className: "admin-btn admin-btn-ghost admin-btn-icon admin-btn-sm -mt-1 -mr-2 flex-shrink-0", children: _jsx(X, { className: "h-4 w-4" }) }))] })), children, footer && _jsx("div", { className: "admin-modal-footer", children: footer })] })] }) }));
|
|
116
|
+
return createPortal(modal, document.body);
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=AdminModal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminModal.js","sourceRoot":"","sources":["../../../src/admin/components/AdminModal.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rovela/sdk/admin/components/AdminPagination
|
|
3
|
+
*
|
|
4
|
+
* THE pagination row — "Showing X to Y of Z {noun}" on the left, quiet
|
|
5
|
+
* Previous/Next on the right. Replaces the block that was copy-pasted
|
|
6
|
+
* inline across the tables (plus a divergent fourth variant).
|
|
7
|
+
*/
|
|
8
|
+
export interface AdminPaginationProps {
|
|
9
|
+
/** 1-based current page */
|
|
10
|
+
page: number;
|
|
11
|
+
pageSize: number;
|
|
12
|
+
/** Total matching rows across all pages */
|
|
13
|
+
total: number;
|
|
14
|
+
onPageChange: (page: number) => void;
|
|
15
|
+
/** Plural noun for the info line ("products", "orders"). Optional. */
|
|
16
|
+
noun?: string;
|
|
17
|
+
/** Disable the controls while a page is loading */
|
|
18
|
+
disabled?: boolean;
|
|
19
|
+
className?: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function AdminPagination({ page, pageSize, total, onPageChange, noun, disabled, className, }: AdminPaginationProps): import("react/jsx-runtime").JSX.Element | null;
|
|
22
|
+
//# sourceMappingURL=AdminPagination.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminPagination.d.ts","sourceRoot":"","sources":["../../../src/admin/components/AdminPagination.tsx"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAMH,MAAM,WAAW,oBAAoB;IACnC,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,mDAAmD;IACnD,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAMD,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,QAAQ,EACR,KAAK,EACL,YAAY,EACZ,IAAI,EACJ,QAAgB,EAChB,SAAc,GACf,EAAE,oBAAoB,kDAkCtB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
// =============================================================================
|
|
4
|
+
// Component
|
|
5
|
+
// =============================================================================
|
|
6
|
+
export function AdminPagination({ page, pageSize, total, onPageChange, noun, disabled = false, className = '', }) {
|
|
7
|
+
if (total <= 0)
|
|
8
|
+
return null;
|
|
9
|
+
const from = (page - 1) * pageSize + 1;
|
|
10
|
+
const to = Math.min(page * pageSize, total);
|
|
11
|
+
const hasPrev = page > 1;
|
|
12
|
+
const hasNext = to < total;
|
|
13
|
+
return (_jsxs("div", { className: `admin-pagination ${className}`.trim(), children: [_jsxs("span", { className: "admin-pagination-info", children: ["Showing ", from, " to ", to, " of ", total, noun ? ` ${noun}` : ''] }), _jsxs("div", { className: "admin-pagination-controls", children: [_jsx("button", { type: "button", onClick: () => onPageChange(page - 1), disabled: disabled || !hasPrev, className: "admin-btn admin-btn-secondary admin-btn-sm", children: "Previous" }), _jsx("button", { type: "button", onClick: () => onPageChange(page + 1), disabled: disabled || !hasNext, className: "admin-btn admin-btn-secondary admin-btn-sm", children: "Next" })] })] }));
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=AdminPagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminPagination.js","sourceRoot":"","sources":["../../../src/admin/components/AdminPagination.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AA4BZ,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF,MAAM,UAAU,eAAe,CAAC,EAC9B,IAAI,EACJ,QAAQ,EACR,KAAK,EACL,YAAY,EACZ,IAAI,EACJ,QAAQ,GAAG,KAAK,EAChB,SAAS,GAAG,EAAE,GACO;IACrB,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IAE3B,MAAM,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAA;IACtC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,QAAQ,EAAE,KAAK,CAAC,CAAA;IAC3C,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAA;IACxB,MAAM,OAAO,GAAG,EAAE,GAAG,KAAK,CAAA;IAE1B,OAAO,CACL,eAAK,SAAS,EAAE,oBAAoB,SAAS,EAAE,CAAC,IAAI,EAAE,aACpD,gBAAM,SAAS,EAAC,uBAAuB,yBAC5B,IAAI,UAAM,EAAE,UAAM,KAAK,EAC/B,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAClB,EACP,eAAK,SAAS,EAAC,2BAA2B,aACxC,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,CAAC,EACrC,QAAQ,EAAE,QAAQ,IAAI,CAAC,OAAO,EAC9B,SAAS,EAAC,4CAA4C,yBAG/C,EACT,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,CAAC,EACrC,QAAQ,EAAE,QAAQ,IAAI,CAAC,OAAO,EAC9B,SAAS,EAAC,4CAA4C,qBAG/C,IACL,IACF,CACP,CAAA;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminResetPasswordForm.d.ts","sourceRoot":"","sources":["../../../src/admin/components/AdminResetPasswordForm.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AdminResetPasswordForm.d.ts","sourceRoot":"","sources":["../../../src/admin/components/AdminResetPasswordForm.tsx"],"names":[],"mappings":"AAmCA,MAAM,WAAW,2BAA2B;IAC1C,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,wEAAwE;IACxE,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,mEAAmE;IACnE,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAWD,wBAAgB,sBAAsB,CAAC,EACrC,SAAc,EACd,QAAyB,EACzB,iBAA4C,EAC5C,eAAsB,GACvB,EAAE,2BAA2B,2CAqQ7B"}
|
|
@@ -15,14 +15,18 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
15
15
|
* 5. On submit, calls `POST /api/admin/reset-password`. On success, shows
|
|
16
16
|
* a confirmation screen and redirects to `/admin/login` after 2s.
|
|
17
17
|
*
|
|
18
|
-
*
|
|
18
|
+
* Rendered inside the AdminAuthShell (the front-door chrome owns identity:
|
|
19
|
+
* brand tile + store name + card). Meant to be mounted BARE at
|
|
20
|
+
* `/admin/reset-password`. Errors are STATES — inline alerts inside the
|
|
21
|
+
* card, never toasts (LEDGER notification grammar).
|
|
19
22
|
*
|
|
20
23
|
* NOTE: because this component uses `useSearchParams`, the consuming page
|
|
21
24
|
* MUST wrap it in a `<Suspense>` boundary (Next.js App Router requirement).
|
|
22
25
|
*/
|
|
23
26
|
import { useState, useEffect, useCallback } from 'react';
|
|
24
27
|
import { useSearchParams } from 'next/navigation';
|
|
25
|
-
import {
|
|
28
|
+
import { Check, Eye, EyeOff } from 'lucide-react';
|
|
29
|
+
import { AdminAuthShell } from './AdminAuthShell';
|
|
26
30
|
// =============================================================================
|
|
27
31
|
// Component
|
|
28
32
|
// =============================================================================
|
|
@@ -34,6 +38,8 @@ export function AdminResetPasswordForm({ className = '', loginUrl = '/admin/logi
|
|
|
34
38
|
});
|
|
35
39
|
const [password, setPassword] = useState('');
|
|
36
40
|
const [confirmPassword, setConfirmPassword] = useState('');
|
|
41
|
+
const [showPassword, setShowPassword] = useState(false);
|
|
42
|
+
const [showConfirm, setShowConfirm] = useState(false);
|
|
37
43
|
const [formError, setFormError] = useState(null);
|
|
38
44
|
const [isSubmitting, setIsSubmitting] = useState(false);
|
|
39
45
|
const [success, setSuccess] = useState(false);
|
|
@@ -118,17 +124,17 @@ export function AdminResetPasswordForm({ className = '', loginUrl = '/admin/logi
|
|
|
118
124
|
// --- 3. Render states ---------------------------------------------------
|
|
119
125
|
// Loading state — waiting on GET validation
|
|
120
126
|
if (validation.status === 'validating') {
|
|
121
|
-
return (_jsx(
|
|
127
|
+
return (_jsx(AdminAuthShell, { className: className, children: _jsx("div", { className: "flex items-center justify-center py-8", children: _jsx("span", { className: "admin-spinner admin-spinner-lg" }) }) }));
|
|
122
128
|
}
|
|
123
129
|
// Invalid token — offer a new reset link
|
|
124
130
|
if (validation.status === 'invalid') {
|
|
125
|
-
return (_jsxs(
|
|
131
|
+
return (_jsxs(AdminAuthShell, { className: className, children: [_jsx("h1", { className: "admin-auth-title", children: "This link has expired" }), _jsx("p", { className: "admin-auth-sub", children: validation.error }), _jsx("a", { href: forgotPasswordUrl, className: "admin-btn admin-btn-primary w-full inline-flex items-center justify-center", children: "Request a new link" }), _jsx("a", { href: loginUrl, className: "admin-auth-footlink", children: "Back to sign in" })] }));
|
|
126
132
|
}
|
|
127
133
|
// Success — password updated, redirecting
|
|
128
134
|
if (success) {
|
|
129
|
-
return (
|
|
135
|
+
return (_jsxs(AdminAuthShell, { className: className, children: [_jsx("h1", { className: "admin-auth-title", children: "Password updated" }), _jsx("p", { className: "admin-auth-sub", children: "You can now sign in with your new password." }), _jsxs("div", { className: "admin-auth-ok", children: [_jsx(Check, { "aria-hidden": "true" }), "Taking you to sign in\u2026"] })] }));
|
|
130
136
|
}
|
|
131
137
|
// Form — token validated, let the user set a new password
|
|
132
|
-
return (_jsxs(
|
|
138
|
+
return (_jsxs(AdminAuthShell, { className: className, children: [_jsx("h1", { className: "admin-auth-title", children: "Set a new password" }), _jsx("p", { className: "admin-auth-sub", children: "Choose a strong password you don't use anywhere else." }), _jsxs("form", { onSubmit: handleSubmit, className: "space-y-4", children: [formError && (_jsx("div", { className: "admin-alert admin-alert-error", children: _jsx("div", { className: "admin-alert-description", children: formError }) })), _jsxs("div", { children: [_jsx("label", { htmlFor: "new-password", className: "admin-label admin-label-required", children: "New password" }), _jsxs("div", { className: "admin-auth-pw", children: [_jsx("input", { id: "new-password", type: showPassword ? 'text' : 'password', value: password, onChange: (e) => setPassword(e.target.value), required: true, minLength: 8, autoComplete: "new-password", disabled: isSubmitting, className: "admin-input w-full", placeholder: "At least 8 characters" }), _jsx("button", { type: "button", className: "admin-auth-eye", onClick: () => setShowPassword((v) => !v), "aria-label": showPassword ? 'Hide password' : 'Show password', tabIndex: -1, children: showPassword ? _jsx(EyeOff, { "aria-hidden": "true" }) : _jsx(Eye, { "aria-hidden": "true" }) })] })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "confirm-password", className: "admin-label admin-label-required", children: "Confirm password" }), _jsxs("div", { className: "admin-auth-pw", children: [_jsx("input", { id: "confirm-password", type: showConfirm ? 'text' : 'password', value: confirmPassword, onChange: (e) => setConfirmPassword(e.target.value), required: true, minLength: 8, autoComplete: "new-password", disabled: isSubmitting, className: "admin-input w-full", placeholder: "Re-enter your new password" }), _jsx("button", { type: "button", className: "admin-auth-eye", onClick: () => setShowConfirm((v) => !v), "aria-label": showConfirm ? 'Hide password' : 'Show password', tabIndex: -1, children: showConfirm ? _jsx(EyeOff, { "aria-hidden": "true" }) : _jsx(Eye, { "aria-hidden": "true" }) })] })] }), _jsx("button", { type: "submit", disabled: isSubmitting || !password || !confirmPassword, className: "admin-btn admin-btn-primary w-full", children: isSubmitting ? (_jsxs("span", { className: "flex items-center justify-center gap-2", children: [_jsx("span", { className: "admin-spinner admin-spinner-sm" }), "Updating password\u2026"] })) : ('Reset password') })] }), _jsx("a", { href: loginUrl, className: "admin-auth-footlink", children: "Back to sign in" })] }));
|
|
133
139
|
}
|
|
134
140
|
//# sourceMappingURL=AdminResetPasswordForm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminResetPasswordForm.js","sourceRoot":"","sources":["../../../src/admin/components/AdminResetPasswordForm.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ
|
|
1
|
+
{"version":3,"file":"AdminResetPasswordForm.js","sourceRoot":"","sources":["../../../src/admin/components/AdminResetPasswordForm.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface AdminSearchInputProps {
|
|
2
|
+
/** Fires with the trimmed query, debounced */
|
|
3
|
+
onSearch: (query: string) => void;
|
|
4
|
+
placeholder?: string;
|
|
5
|
+
/** Initial text (e.g. restoring a persisted filter) */
|
|
6
|
+
initialValue?: string;
|
|
7
|
+
/** Debounce in ms (default 300; use 0 for client-side filtering) */
|
|
8
|
+
debounceMs?: number;
|
|
9
|
+
ariaLabel?: string;
|
|
10
|
+
autoFocus?: boolean;
|
|
11
|
+
className?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function AdminSearchInput({ onSearch, placeholder, initialValue, debounceMs, ariaLabel, autoFocus, className, }: AdminSearchInputProps): import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
//# sourceMappingURL=AdminSearchInput.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminSearchInput.d.ts","sourceRoot":"","sources":["../../../src/admin/components/AdminSearchInput.tsx"],"names":[],"mappings":"AAqBA,MAAM,WAAW,qBAAqB;IACpC,8CAA8C;IAC9C,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,uDAAuD;IACvD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAMD,wBAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EACR,WAAuB,EACvB,YAAiB,EACjB,UAAgB,EAChB,SAAS,EACT,SAAiB,EACjB,SAAc,GACf,EAAE,qBAAqB,2CAkDvB"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* @rovela/sdk/admin/components/AdminSearchInput
|
|
5
|
+
*
|
|
6
|
+
* THE list search box — icon inside, one markup, one debounce. Replaces
|
|
7
|
+
* the three parallel search constructions (bare input, two icon-wrapper
|
|
8
|
+
* CSS families) and the tables that fetched on every keystroke.
|
|
9
|
+
*
|
|
10
|
+
* `onSearch` fires 300ms after the last keystroke (Enter flushes
|
|
11
|
+
* immediately). The component owns the draft text; the consumer owns the
|
|
12
|
+
* committed query.
|
|
13
|
+
*/
|
|
14
|
+
import { useEffect, useRef, useState } from 'react';
|
|
15
|
+
import { Search } from 'lucide-react';
|
|
16
|
+
// =============================================================================
|
|
17
|
+
// Component
|
|
18
|
+
// =============================================================================
|
|
19
|
+
export function AdminSearchInput({ onSearch, placeholder = 'Search…', initialValue = '', debounceMs = 300, ariaLabel, autoFocus = false, className = '', }) {
|
|
20
|
+
const [draft, setDraft] = useState(initialValue);
|
|
21
|
+
const timerRef = useRef(null);
|
|
22
|
+
// Synced in an effect (render-time ref writes trip the React Compiler
|
|
23
|
+
// lint); the debounce timer always fires after the effect has run.
|
|
24
|
+
const onSearchRef = useRef(onSearch);
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
onSearchRef.current = onSearch;
|
|
27
|
+
}, [onSearch]);
|
|
28
|
+
useEffect(() => {
|
|
29
|
+
return () => {
|
|
30
|
+
if (timerRef.current)
|
|
31
|
+
clearTimeout(timerRef.current);
|
|
32
|
+
};
|
|
33
|
+
}, []);
|
|
34
|
+
const schedule = (value) => {
|
|
35
|
+
if (timerRef.current)
|
|
36
|
+
clearTimeout(timerRef.current);
|
|
37
|
+
if (debounceMs <= 0) {
|
|
38
|
+
onSearchRef.current(value.trim());
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
timerRef.current = setTimeout(() => onSearchRef.current(value.trim()), debounceMs);
|
|
42
|
+
};
|
|
43
|
+
const flush = (value) => {
|
|
44
|
+
if (timerRef.current)
|
|
45
|
+
clearTimeout(timerRef.current);
|
|
46
|
+
onSearchRef.current(value.trim());
|
|
47
|
+
};
|
|
48
|
+
return (_jsxs("div", { className: `admin-input-with-icon ${className}`.trim(), children: [_jsx(Search, { className: "admin-input-with-icon-left h-4 w-4" }), _jsx("input", { type: "search", value: draft, onChange: (e) => {
|
|
49
|
+
setDraft(e.target.value);
|
|
50
|
+
schedule(e.target.value);
|
|
51
|
+
}, onKeyDown: (e) => {
|
|
52
|
+
if (e.key === 'Enter')
|
|
53
|
+
flush(draft);
|
|
54
|
+
}, placeholder: placeholder, autoFocus: autoFocus, "aria-label": ariaLabel ?? placeholder, className: "admin-input w-full" })] }));
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=AdminSearchInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminSearchInput.js","sourceRoot":"","sources":["../../../src/admin/components/AdminSearchInput.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAmBrC,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF,MAAM,UAAU,gBAAgB,CAAC,EAC/B,QAAQ,EACR,WAAW,GAAG,SAAS,EACvB,YAAY,GAAG,EAAE,EACjB,UAAU,GAAG,GAAG,EAChB,SAAS,EACT,SAAS,GAAG,KAAK,EACjB,SAAS,GAAG,EAAE,GACQ;IACtB,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAA;IAChD,MAAM,QAAQ,GAAG,MAAM,CAAuC,IAAI,CAAC,CAAA;IACnE,sEAAsE;IACtE,mEAAmE;IACnE,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA;IACpC,SAAS,CAAC,GAAG,EAAE;QACb,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAA;IAChC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAA;IAEd,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,GAAG,EAAE;YACV,IAAI,QAAQ,CAAC,OAAO;gBAAE,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QACtD,CAAC,CAAA;IACH,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAE,EAAE;QACjC,IAAI,QAAQ,CAAC,OAAO;YAAE,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QACpD,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;YACpB,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;YACjC,OAAM;QACR,CAAC;QACD,QAAQ,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,UAAU,CAAC,CAAA;IACpF,CAAC,CAAA;IAED,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,EAAE;QAC9B,IAAI,QAAQ,CAAC,OAAO;YAAE,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QACpD,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;IACnC,CAAC,CAAA;IAED,OAAO,CACL,eAAK,SAAS,EAAE,yBAAyB,SAAS,EAAE,CAAC,IAAI,EAAE,aACzD,KAAC,MAAM,IAAC,SAAS,EAAC,oCAAoC,GAAG,EACzD,gBACE,IAAI,EAAC,QAAQ,EACb,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;oBACd,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;oBACxB,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;gBAC1B,CAAC,EACD,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;oBACf,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO;wBAAE,KAAK,CAAC,KAAK,CAAC,CAAA;gBACrC,CAAC,EACD,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,SAAS,gBACR,SAAS,IAAI,WAAW,EACpC,SAAS,EAAC,oBAAoB,GAC9B,IACE,CACP,CAAA;AACH,CAAC"}
|
|
@@ -25,6 +25,8 @@ export interface AdminSelectProps {
|
|
|
25
25
|
id?: string;
|
|
26
26
|
/** Name for form association */
|
|
27
27
|
name?: string;
|
|
28
|
+
/** Accessible label when the select has no visible <label> */
|
|
29
|
+
ariaLabel?: string;
|
|
28
30
|
}
|
|
29
31
|
/**
|
|
30
32
|
* Styled dropdown select with admin theme.
|
|
@@ -43,5 +45,5 @@ export interface AdminSelectProps {
|
|
|
43
45
|
* />
|
|
44
46
|
* ```
|
|
45
47
|
*/
|
|
46
|
-
export declare function AdminSelect({ value, onChange, options, placeholder, disabled, size, className, id, name, }: AdminSelectProps): import("react/jsx-runtime").JSX.Element;
|
|
48
|
+
export declare function AdminSelect({ value, onChange, options, placeholder, disabled, size, className, id, name, ariaLabel, }: AdminSelectProps): import("react/jsx-runtime").JSX.Element;
|
|
47
49
|
//# sourceMappingURL=AdminSelect.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminSelect.d.ts","sourceRoot":"","sources":["../../../src/admin/components/AdminSelect.tsx"],"names":[],"mappings":"AAgBA,MAAM,WAAW,iBAAiB;IAChC,mBAAmB;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,kCAAkC;IAClC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,wBAAwB;IACxB,OAAO,EAAE,iBAAiB,EAAE,CAAA;IAC5B,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,mBAAmB;IACnB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;IAClB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,8BAA8B;IAC9B,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,gCAAgC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"AdminSelect.d.ts","sourceRoot":"","sources":["../../../src/admin/components/AdminSelect.tsx"],"names":[],"mappings":"AAgBA,MAAM,WAAW,iBAAiB;IAChC,mBAAmB;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,kCAAkC;IAClC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,wBAAwB;IACxB,OAAO,EAAE,iBAAiB,EAAE,CAAA;IAC5B,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,mBAAmB;IACnB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;IAClB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,8BAA8B;IAC9B,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,gCAAgC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAMD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,OAAO,EACP,WAAuB,EACvB,QAAgB,EAChB,IAAW,EACX,SAAc,EACd,EAAE,EACF,IAAI,EACJ,SAAS,GACV,EAAE,gBAAgB,2CAyGlB"}
|
|
@@ -28,7 +28,7 @@ import { ChevronDown } from 'lucide-react';
|
|
|
28
28
|
* />
|
|
29
29
|
* ```
|
|
30
30
|
*/
|
|
31
|
-
export function AdminSelect({ value, onChange, options, placeholder = 'Select
|
|
31
|
+
export function AdminSelect({ value, onChange, options, placeholder = 'Select…', disabled = false, size = 'md', className = '', id, name, ariaLabel, }) {
|
|
32
32
|
const [isOpen, setIsOpen] = useState(false);
|
|
33
33
|
const containerRef = useRef(null);
|
|
34
34
|
// Find selected option
|
|
@@ -66,6 +66,6 @@ export function AdminSelect({ value, onChange, options, placeholder = 'Select...
|
|
|
66
66
|
const sizeClasses = size === 'sm'
|
|
67
67
|
? 'py-1 px-2 text-sm min-h-[2rem]'
|
|
68
68
|
: 'py-2 px-3 text-sm min-h-[2.5rem]';
|
|
69
|
-
return (_jsxs("div", { ref: containerRef, className: `relative ${className}`, children: [name && _jsx("input", { type: "hidden", name: name, value: value }), _jsxs("button", { type: "button", id: id, onClick: () => !disabled && setIsOpen(!isOpen), onKeyDown: handleKeyDown, disabled: disabled, "aria-haspopup": "listbox", "aria-expanded": isOpen, className: `admin-select-trigger flex w-full items-center justify-between gap-2 rounded-md ${sizeClasses} ${disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer'}`, children: [_jsx("span", { className: selectedOption ? 'admin-text truncate' : 'admin-text-muted truncate', children: selectedOption?.label || placeholder }), _jsx(ChevronDown, { className: `h-4 w-4 flex-shrink-0 admin-icon-muted transition-transform duration-200 ${isOpen ? 'rotate-180' : ''}` })] }), isOpen && (_jsx("div", { className: "admin-select-dropdown absolute z-50 mt-1 w-full min-w-[8rem] rounded-md shadow-lg", role: "listbox", children: _jsx("div", { className: "max-h-60 overflow-auto p-1", children: options.length === 0 ? (_jsx("div", { className: "admin-text-muted px-3 py-2 text-center text-sm", children: "No options available" })) : (options.map((option) => (_jsx("button", { type: "button", role: "option", "aria-selected": option.value === value, disabled: option.disabled, onClick: () => !option.disabled && handleSelect(option.value), className: `admin-select-item flex w-full items-center rounded-md px-3 py-2 text-left text-sm transition-colors ${option.value === value ? 'admin-select-item-selected' : ''} ${option.disabled ? 'opacity-50 cursor-not-allowed' : ''}`, children: option.label }, option.value)))) }) }))] }));
|
|
69
|
+
return (_jsxs("div", { ref: containerRef, className: `relative ${className}`, children: [name && _jsx("input", { type: "hidden", name: name, value: value }), _jsxs("button", { type: "button", id: id, onClick: () => !disabled && setIsOpen(!isOpen), onKeyDown: handleKeyDown, disabled: disabled, "aria-haspopup": "listbox", "aria-expanded": isOpen, "aria-label": ariaLabel, className: `admin-select-trigger flex w-full items-center justify-between gap-2 rounded-md ${sizeClasses} ${disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer'}`, children: [_jsx("span", { className: selectedOption ? 'admin-text truncate' : 'admin-text-muted truncate', children: selectedOption?.label || placeholder }), _jsx(ChevronDown, { className: `h-4 w-4 flex-shrink-0 admin-icon-muted transition-transform duration-200 ${isOpen ? 'rotate-180' : ''}` })] }), isOpen && (_jsx("div", { className: "admin-select-dropdown absolute z-50 mt-1 w-full min-w-[8rem] rounded-md shadow-lg", role: "listbox", children: _jsx("div", { className: "max-h-60 overflow-auto p-1", children: options.length === 0 ? (_jsx("div", { className: "admin-text-muted px-3 py-2 text-center text-sm", children: "No options available" })) : (options.map((option) => (_jsx("button", { type: "button", role: "option", "aria-selected": option.value === value, disabled: option.disabled, onClick: () => !option.disabled && handleSelect(option.value), className: `admin-select-item flex w-full items-center rounded-md px-3 py-2 text-left text-sm transition-colors ${option.value === value ? 'admin-select-item-selected' : ''} ${option.disabled ? 'opacity-50 cursor-not-allowed' : ''}`, children: option.label }, option.value)))) }) }))] }));
|
|
70
70
|
}
|
|
71
71
|
//# sourceMappingURL=AdminSelect.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminSelect.js","sourceRoot":"","sources":["../../../src/admin/components/AdminSelect.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"AdminSelect.js","sourceRoot":"","sources":["../../../src/admin/components/AdminSelect.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rovela/sdk/admin/components/AdminSwitch
|
|
3
|
+
*
|
|
4
|
+
* THE on/off control. A state gets a switch — in Settings AND in managers
|
|
5
|
+
* (Enabled, Active, Charge tax…). Checkboxes only ever mean selection.
|
|
6
|
+
*
|
|
7
|
+
* Renders the existing `.admin-toggle-switch` CSS (track + ::after thumb,
|
|
8
|
+
* driven by data-checked), so old stores' pinned CSS keeps working.
|
|
9
|
+
*/
|
|
10
|
+
export interface AdminSwitchProps {
|
|
11
|
+
checked: boolean;
|
|
12
|
+
onChange: (checked: boolean) => void;
|
|
13
|
+
disabled?: boolean;
|
|
14
|
+
/** Required when the switch has no visible <label> wrapping it */
|
|
15
|
+
'aria-label'?: string;
|
|
16
|
+
id?: string;
|
|
17
|
+
className?: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function AdminSwitch({ checked, onChange, disabled, 'aria-label': ariaLabel, id, className, }: AdminSwitchProps): import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
//# sourceMappingURL=AdminSwitch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminSwitch.d.ts","sourceRoot":"","sources":["../../../src/admin/components/AdminSwitch.tsx"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAMH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAMD,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,QAAQ,EACR,QAAgB,EAChB,YAAY,EAAE,SAAS,EACvB,EAAE,EACF,SAAc,GACf,EAAE,gBAAgB,2CAclB"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
// =============================================================================
|
|
4
|
+
// Component
|
|
5
|
+
// =============================================================================
|
|
6
|
+
export function AdminSwitch({ checked, onChange, disabled = false, 'aria-label': ariaLabel, id, className = '', }) {
|
|
7
|
+
return (_jsx("button", { type: "button", role: "switch", id: id, "aria-checked": checked, "aria-label": ariaLabel, "data-checked": checked ? 'true' : 'false', disabled: disabled, onClick: () => onChange(!checked), className: `admin-toggle-switch flex-shrink-0 ${className}`.trim() }));
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=AdminSwitch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminSwitch.js","sourceRoot":"","sources":["../../../src/admin/components/AdminSwitch.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AA0BZ,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF,MAAM,UAAU,WAAW,CAAC,EAC1B,OAAO,EACP,QAAQ,EACR,QAAQ,GAAG,KAAK,EAChB,YAAY,EAAE,SAAS,EACvB,EAAE,EACF,SAAS,GAAG,EAAE,GACG;IACjB,OAAO,CACL,iBACE,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,QAAQ,EACb,EAAE,EAAE,EAAE,kBACQ,OAAO,gBACT,SAAS,kBACP,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EACxC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EACjC,SAAS,EAAE,qCAAqC,SAAS,EAAE,CAAC,IAAI,EAAE,GAClE,CACH,CAAA;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminTopBar.d.ts","sourceRoot":"","sources":["../../../src/admin/components/AdminTopBar.tsx"],"names":[],"mappings":"AAoBA,OAAO,
|
|
1
|
+
{"version":3,"file":"AdminTopBar.d.ts","sourceRoot":"","sources":["../../../src/admin/components/AdminTopBar.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAStC,MAAM,WAAW,gBAAgB;IAC/B,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,wDAAwD;IACxD,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAMD,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EAAE,aAAuB,EAClC,IAAI,EACJ,QAAc,EACd,SAAc,GACf,EAAE,gBAAgB,2CAiElB"}
|
|
@@ -17,8 +17,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
17
17
|
*/
|
|
18
18
|
import Link from 'next/link';
|
|
19
19
|
import { ExternalLink, Pencil } from 'lucide-react';
|
|
20
|
-
import { useEffect, useState } from 'react';
|
|
21
20
|
import { useStoreSettingsOptional } from '../../core';
|
|
21
|
+
import { AdminBrandTile } from './AdminBrandTile';
|
|
22
22
|
import { AdminUserMenu } from './AdminUserMenu';
|
|
23
23
|
// =============================================================================
|
|
24
24
|
// Component
|
|
@@ -30,23 +30,9 @@ export function AdminTopBar({ storeName: storeNameProp = 'Admin', logo, storeUrl
|
|
|
30
30
|
const storeSettings = useStoreSettingsOptional();
|
|
31
31
|
const settingsLoading = storeNameProp === 'Admin' && !!storeSettings?.isLoading && !storeSettings?.settings;
|
|
32
32
|
const storeName = storeNameProp !== 'Admin' ? storeNameProp : (storeSettings?.storeName || storeNameProp);
|
|
33
|
-
//
|
|
34
|
-
//
|
|
35
|
-
//
|
|
36
|
-
// build-time env var as fallback — the branding write contract keeps the
|
|
37
|
-
// settings mirror fresh, so store-side changes show without a redeploy.
|
|
38
|
-
const faviconUrl = storeSettings?.faviconUrl || process.env.NEXT_PUBLIC_STORE_FAVICON_URL || null;
|
|
39
|
-
const logoUrl = storeSettings?.logoUrl || process.env.NEXT_PUBLIC_STORE_LOGO_URL || null;
|
|
40
|
-
const tileUrl = faviconUrl || logoUrl;
|
|
41
|
-
// A stale pointer (e.g. asset deleted store-side while an env var still
|
|
42
|
-
// carries the fixed URL) must degrade to the monogram, never a broken img.
|
|
43
|
-
const [tileBroken, setTileBroken] = useState(false);
|
|
44
|
-
useEffect(() => {
|
|
45
|
-
// Pattern A — reset internal state on prop change (retry when the URL changes).
|
|
46
|
-
// eslint-disable-next-line react-hooks/set-state-in-effect
|
|
47
|
-
setTileBroken(false);
|
|
48
|
-
}, [tileUrl]);
|
|
49
|
-
const tileSrc = tileBroken ? null : tileUrl;
|
|
33
|
+
// The tile mark (favicon → logo → ink monogram, settings-first with env
|
|
34
|
+
// fallback, broken-img degradation) lives in the shared AdminBrandTile —
|
|
35
|
+
// one source of truth with the auth shell.
|
|
50
36
|
// Deep-link back to the Rovela editor (/generate/[id]) so the merchant has
|
|
51
37
|
// a clean Manage ↔ Edit loop. Only rendered when NEXT_PUBLIC_ROVELA_PROJECT_ID
|
|
52
38
|
// is set (present on every store rebuilt since buildStoreEnvVars started
|
|
@@ -58,8 +44,6 @@ export function AdminTopBar({ storeName: storeNameProp = 'Admin', logo, storeUrl
|
|
|
58
44
|
const editStoreUrl = rovelaProjectId
|
|
59
45
|
? `${rovelaBase.replace(/\/$/, '')}/generate/${rovelaProjectId}`
|
|
60
46
|
: null;
|
|
61
|
-
return (_jsxs("header", { className: `admin-topbar ${className}`.trim(), children: [_jsxs(Link, { href: "/admin", className: "admin-topbar-brand", children: [logo || (_jsx("span", { className:
|
|
62
|
-
// eslint-disable-next-line @next/next/no-img-element
|
|
63
|
-
_jsx("img", { src: tileSrc, alt: "", onError: () => setTileBroken(true) })) : settingsLoading ? (_jsx("span", { className: "admin-skeleton admin-brand-tile-skeleton" })) : (storeName.charAt(0).toUpperCase()) })), settingsLoading ? (_jsx("span", { className: "admin-skeleton admin-topbar-name-skeleton" })) : (_jsx("span", { className: "admin-topbar-store", children: storeName })), _jsx("span", { className: "admin-topbar-tag", children: "Admin" })] }), _jsxs("div", { className: "admin-topbar-actions", children: [_jsxs("a", { href: storeUrl, target: "_blank", rel: "noopener noreferrer", className: "admin-topbar-btn", children: [_jsx(ExternalLink, { className: "h-3.5 w-3.5", strokeWidth: 1.5 }), "View store"] }), editStoreUrl && (_jsxs("a", { href: editStoreUrl, target: "_blank", rel: "noopener noreferrer", className: "admin-topbar-btn", children: [_jsx(Pencil, { className: "h-3.5 w-3.5", strokeWidth: 1.5 }), "Edit store"] })), _jsx("span", { className: "admin-topbar-divider", "aria-hidden": "true" }), _jsx(AdminUserMenu, { compact: true })] })] }));
|
|
47
|
+
return (_jsxs("header", { className: `admin-topbar ${className}`.trim(), children: [_jsxs(Link, { href: "/admin", className: "admin-topbar-brand", children: [logo || _jsx(AdminBrandTile, { storeName: storeName }), settingsLoading ? (_jsx("span", { className: "admin-skeleton admin-topbar-name-skeleton" })) : (_jsx("span", { className: "admin-topbar-store", children: storeName })), _jsx("span", { className: "admin-topbar-tag", children: "Admin" })] }), _jsxs("div", { className: "admin-topbar-actions", children: [_jsxs("a", { href: storeUrl, target: "_blank", rel: "noopener noreferrer", className: "admin-topbar-btn", children: [_jsx(ExternalLink, { className: "h-3.5 w-3.5", strokeWidth: 1.5 }), "View store"] }), editStoreUrl && (_jsxs("a", { href: editStoreUrl, target: "_blank", rel: "noopener noreferrer", className: "admin-topbar-btn", children: [_jsx(Pencil, { className: "h-3.5 w-3.5", strokeWidth: 1.5 }), "Edit store"] })), _jsx("span", { className: "admin-topbar-divider", "aria-hidden": "true" }), _jsx(AdminUserMenu, { compact: true })] })] }));
|
|
64
48
|
}
|
|
65
49
|
//# sourceMappingURL=AdminTopBar.js.map
|