@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.
Files changed (174) hide show
  1. package/dist/admin/components/AdminAcceptInviteForm.d.ts.map +1 -1
  2. package/dist/admin/components/AdminAcceptInviteForm.js +17 -6
  3. package/dist/admin/components/AdminAcceptInviteForm.js.map +1 -1
  4. package/dist/admin/components/AdminAccountPage.d.ts.map +1 -1
  5. package/dist/admin/components/AdminAccountPage.js +7 -10
  6. package/dist/admin/components/AdminAccountPage.js.map +1 -1
  7. package/dist/admin/components/AdminAuthShell.d.ts +32 -0
  8. package/dist/admin/components/AdminAuthShell.d.ts.map +1 -0
  9. package/dist/admin/components/AdminAuthShell.js +17 -0
  10. package/dist/admin/components/AdminAuthShell.js.map +1 -0
  11. package/dist/admin/components/AdminBrandTile.d.ts +10 -0
  12. package/dist/admin/components/AdminBrandTile.d.ts.map +1 -0
  13. package/dist/admin/components/AdminBrandTile.js +46 -0
  14. package/dist/admin/components/AdminBrandTile.js.map +1 -0
  15. package/dist/admin/components/AdminEmptyState.d.ts +33 -0
  16. package/dist/admin/components/AdminEmptyState.d.ts.map +1 -0
  17. package/dist/admin/components/AdminEmptyState.js +12 -0
  18. package/dist/admin/components/AdminEmptyState.js.map +1 -0
  19. package/dist/admin/components/AdminForgotPasswordForm.d.ts.map +1 -1
  20. package/dist/admin/components/AdminForgotPasswordForm.js +8 -6
  21. package/dist/admin/components/AdminForgotPasswordForm.js.map +1 -1
  22. package/dist/admin/components/AdminLoginForm.js +1 -1
  23. package/dist/admin/components/AdminLoginForm.js.map +1 -1
  24. package/dist/admin/components/AdminModal.d.ts +51 -0
  25. package/dist/admin/components/AdminModal.d.ts.map +1 -0
  26. package/dist/admin/components/AdminModal.js +118 -0
  27. package/dist/admin/components/AdminModal.js.map +1 -0
  28. package/dist/admin/components/AdminPagination.d.ts +22 -0
  29. package/dist/admin/components/AdminPagination.d.ts.map +1 -0
  30. package/dist/admin/components/AdminPagination.js +15 -0
  31. package/dist/admin/components/AdminPagination.js.map +1 -0
  32. package/dist/admin/components/AdminResetPasswordForm.d.ts.map +1 -1
  33. package/dist/admin/components/AdminResetPasswordForm.js +12 -6
  34. package/dist/admin/components/AdminResetPasswordForm.js.map +1 -1
  35. package/dist/admin/components/AdminSearchInput.d.ts +14 -0
  36. package/dist/admin/components/AdminSearchInput.d.ts.map +1 -0
  37. package/dist/admin/components/AdminSearchInput.js +56 -0
  38. package/dist/admin/components/AdminSearchInput.js.map +1 -0
  39. package/dist/admin/components/AdminSelect.d.ts +3 -1
  40. package/dist/admin/components/AdminSelect.d.ts.map +1 -1
  41. package/dist/admin/components/AdminSelect.js +2 -2
  42. package/dist/admin/components/AdminSelect.js.map +1 -1
  43. package/dist/admin/components/AdminSwitch.d.ts +20 -0
  44. package/dist/admin/components/AdminSwitch.d.ts.map +1 -0
  45. package/dist/admin/components/AdminSwitch.js +9 -0
  46. package/dist/admin/components/AdminSwitch.js.map +1 -0
  47. package/dist/admin/components/AdminTopBar.d.ts +1 -1
  48. package/dist/admin/components/AdminTopBar.d.ts.map +1 -1
  49. package/dist/admin/components/AdminTopBar.js +5 -21
  50. package/dist/admin/components/AdminTopBar.js.map +1 -1
  51. package/dist/admin/components/AdminUserMenu.js +1 -1
  52. package/dist/admin/components/BrandingAssetUpload.d.ts.map +1 -1
  53. package/dist/admin/components/BrandingAssetUpload.js +3 -3
  54. package/dist/admin/components/BrandingAssetUpload.js.map +1 -1
  55. package/dist/admin/components/CategoryForm.d.ts.map +1 -1
  56. package/dist/admin/components/CategoryForm.js +7 -3
  57. package/dist/admin/components/CategoryForm.js.map +1 -1
  58. package/dist/admin/components/CategorySelect.js +2 -2
  59. package/dist/admin/components/CategorySelect.js.map +1 -1
  60. package/dist/admin/components/CustomerAddressPanel.d.ts.map +1 -1
  61. package/dist/admin/components/CustomerAddressPanel.js +15 -7
  62. package/dist/admin/components/CustomerAddressPanel.js.map +1 -1
  63. package/dist/admin/components/CustomerDetails.d.ts.map +1 -1
  64. package/dist/admin/components/CustomerDetails.js +8 -14
  65. package/dist/admin/components/CustomerDetails.js.map +1 -1
  66. package/dist/admin/components/CustomerGroupsManager.d.ts.map +1 -1
  67. package/dist/admin/components/CustomerGroupsManager.js +18 -12
  68. package/dist/admin/components/CustomerGroupsManager.js.map +1 -1
  69. package/dist/admin/components/CustomerTable.d.ts.map +1 -1
  70. package/dist/admin/components/CustomerTable.js +24 -15
  71. package/dist/admin/components/CustomerTable.js.map +1 -1
  72. package/dist/admin/components/DeleteConfirmDialog.d.ts +5 -5
  73. package/dist/admin/components/DeleteConfirmDialog.d.ts.map +1 -1
  74. package/dist/admin/components/DeleteConfirmDialog.js +11 -8
  75. package/dist/admin/components/DeleteConfirmDialog.js.map +1 -1
  76. package/dist/admin/components/DiscountsManager.d.ts.map +1 -1
  77. package/dist/admin/components/DiscountsManager.js +47 -15
  78. package/dist/admin/components/DiscountsManager.js.map +1 -1
  79. package/dist/admin/components/EmailsManager.d.ts.map +1 -1
  80. package/dist/admin/components/EmailsManager.js +18 -20
  81. package/dist/admin/components/EmailsManager.js.map +1 -1
  82. package/dist/admin/components/FilesManager.d.ts.map +1 -1
  83. package/dist/admin/components/FilesManager.js +16 -18
  84. package/dist/admin/components/FilesManager.js.map +1 -1
  85. package/dist/admin/components/InventoryEditor.js +1 -1
  86. package/dist/admin/components/InventoryEditor.js.map +1 -1
  87. package/dist/admin/components/InviteUserDialog.d.ts.map +1 -1
  88. package/dist/admin/components/InviteUserDialog.js +12 -16
  89. package/dist/admin/components/InviteUserDialog.js.map +1 -1
  90. package/dist/admin/components/LocationsManager.d.ts.map +1 -1
  91. package/dist/admin/components/LocationsManager.js +18 -8
  92. package/dist/admin/components/LocationsManager.js.map +1 -1
  93. package/dist/admin/components/MediaLibraryPicker.d.ts.map +1 -1
  94. package/dist/admin/components/MediaLibraryPicker.js +22 -15
  95. package/dist/admin/components/MediaLibraryPicker.js.map +1 -1
  96. package/dist/admin/components/OrderDetails.d.ts.map +1 -1
  97. package/dist/admin/components/OrderDetails.js +19 -34
  98. package/dist/admin/components/OrderDetails.js.map +1 -1
  99. package/dist/admin/components/OrderStatusChart.js +1 -1
  100. package/dist/admin/components/OrderStatusChart.js.map +1 -1
  101. package/dist/admin/components/OrderTable.d.ts.map +1 -1
  102. package/dist/admin/components/OrderTable.js +27 -14
  103. package/dist/admin/components/OrderTable.js.map +1 -1
  104. package/dist/admin/components/PaymentMethodsManager.d.ts.map +1 -1
  105. package/dist/admin/components/PaymentMethodsManager.js +17 -16
  106. package/dist/admin/components/PaymentMethodsManager.js.map +1 -1
  107. package/dist/admin/components/PaymentSettings.d.ts.map +1 -1
  108. package/dist/admin/components/PaymentSettings.js +2 -2
  109. package/dist/admin/components/PaymentSettings.js.map +1 -1
  110. package/dist/admin/components/PermissionsMatrix.js +1 -1
  111. package/dist/admin/components/PermissionsMatrix.js.map +1 -1
  112. package/dist/admin/components/PrimaryMetricsRow.d.ts.map +1 -1
  113. package/dist/admin/components/PrimaryMetricsRow.js +4 -1
  114. package/dist/admin/components/PrimaryMetricsRow.js.map +1 -1
  115. package/dist/admin/components/ProductForm.d.ts.map +1 -1
  116. package/dist/admin/components/ProductForm.js +11 -5
  117. package/dist/admin/components/ProductForm.js.map +1 -1
  118. package/dist/admin/components/ProductTable.d.ts.map +1 -1
  119. package/dist/admin/components/ProductTable.js +22 -9
  120. package/dist/admin/components/ProductTable.js.map +1 -1
  121. package/dist/admin/components/RecentOrders.d.ts.map +1 -1
  122. package/dist/admin/components/RecentOrders.js +3 -16
  123. package/dist/admin/components/RecentOrders.js.map +1 -1
  124. package/dist/admin/components/RefundDialog.d.ts +1 -1
  125. package/dist/admin/components/RefundDialog.d.ts.map +1 -1
  126. package/dist/admin/components/RefundDialog.js +10 -17
  127. package/dist/admin/components/RefundDialog.js.map +1 -1
  128. package/dist/admin/components/RevenueChart.js +1 -1
  129. package/dist/admin/components/RevenueChart.js.map +1 -1
  130. package/dist/admin/components/SEOPreview.js +1 -1
  131. package/dist/admin/components/SEOPreview.js.map +1 -1
  132. package/dist/admin/components/SecondaryMetricsRow.d.ts.map +1 -1
  133. package/dist/admin/components/SecondaryMetricsRow.js +6 -1
  134. package/dist/admin/components/SecondaryMetricsRow.js.map +1 -1
  135. package/dist/admin/components/ShippingSettings.d.ts.map +1 -1
  136. package/dist/admin/components/ShippingSettings.js +22 -31
  137. package/dist/admin/components/ShippingSettings.js.map +1 -1
  138. package/dist/admin/components/StatsCards.d.ts.map +1 -1
  139. package/dist/admin/components/StatsCards.js +4 -1
  140. package/dist/admin/components/StatsCards.js.map +1 -1
  141. package/dist/admin/components/TagInput.d.ts +1 -1
  142. package/dist/admin/components/TagInput.js +1 -1
  143. package/dist/admin/components/TaxSettings.d.ts.map +1 -1
  144. package/dist/admin/components/TaxSettings.js +20 -19
  145. package/dist/admin/components/TaxSettings.js.map +1 -1
  146. package/dist/admin/components/UsersTable.d.ts.map +1 -1
  147. package/dist/admin/components/UsersTable.js +21 -20
  148. package/dist/admin/components/UsersTable.js.map +1 -1
  149. package/dist/admin/components/VariantManager.d.ts.map +1 -1
  150. package/dist/admin/components/VariantManager.js +5 -5
  151. package/dist/admin/components/VariantManager.js.map +1 -1
  152. package/dist/admin/components/emails/ColorField.d.ts.map +1 -1
  153. package/dist/admin/components/emails/ColorField.js +1 -1
  154. package/dist/admin/components/emails/ColorField.js.map +1 -1
  155. package/dist/admin/components/emails/EmailPreviewPane.js +1 -1
  156. package/dist/admin/components/emails/EmailPreviewPane.js.map +1 -1
  157. package/dist/admin/components/emails/EmailThemePanel.js +1 -1
  158. package/dist/admin/components/emails/EmailThemePanel.js.map +1 -1
  159. package/dist/admin/components/emails/FontPicker.js +2 -2
  160. package/dist/admin/components/emails/FontPicker.js.map +1 -1
  161. package/dist/admin/components/index.d.ts +15 -0
  162. package/dist/admin/components/index.d.ts.map +1 -1
  163. package/dist/admin/components/index.js +9 -0
  164. package/dist/admin/components/index.js.map +1 -1
  165. package/dist/admin/components/statusBadges.d.ts +12 -0
  166. package/dist/admin/components/statusBadges.d.ts.map +1 -0
  167. package/dist/admin/components/statusBadges.js +50 -0
  168. package/dist/admin/components/statusBadges.js.map +1 -0
  169. package/dist/admin/index.d.ts +2 -2
  170. package/dist/admin/index.d.ts.map +1 -1
  171. package/dist/admin/index.js +4 -2
  172. package/dist/admin/index.js.map +1 -1
  173. package/dist/admin/styles/admin-theme.css +289 -0
  174. 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":"AA+BA,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,2CA8P7B"}
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
- * Matches the styling of AdminLoginForm.
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 { KeyRound, CheckCircle2, AlertCircle } from 'lucide-react';
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("div", { className: `w-full max-w-sm admin-animate-in ${className}`, children: _jsx("div", { className: "flex items-center justify-center py-8", children: _jsx("span", { className: "admin-spinner admin-spinner-lg" }) }) }));
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("div", { className: `w-full max-w-sm admin-animate-in ${className}`, children: [_jsxs("div", { className: "mb-6 text-center", children: [_jsx("div", { className: "admin-icon-container-sm mx-auto mb-4", children: _jsx(AlertCircle, { className: "h-6 w-6 admin-icon-primary" }) }), _jsx("h1", { className: "admin-heading-2", children: "Invalid reset link" }), _jsx("p", { className: "mt-2 text-sm admin-text-muted", 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("div", { className: "mt-6 text-center", children: _jsx("a", { href: loginUrl, className: "text-sm admin-text-muted hover:underline", children: "\u2190 Back to sign in" }) })] }));
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 (_jsx("div", { className: `w-full max-w-sm admin-animate-in ${className}`, children: _jsxs("div", { className: "mb-6 text-center", children: [_jsx("div", { className: "admin-icon-container-sm mx-auto mb-4", children: _jsx(CheckCircle2, { className: "h-6 w-6 admin-icon-primary" }) }), _jsx("h1", { className: "admin-heading-2", children: "Password reset" }), _jsx("p", { className: "mt-2 text-sm admin-text-muted", children: "Your password has been updated. Redirecting to sign in..." })] }) }));
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("div", { className: `w-full max-w-sm admin-animate-in ${className}`, children: [_jsxs("div", { className: "mb-8 text-center", children: [_jsx("div", { className: "admin-icon-container-sm mx-auto mb-4", children: _jsx(KeyRound, { className: "h-6 w-6 admin-icon-primary" }) }), _jsx("h1", { className: "admin-heading-2", children: "Set a new password" }), _jsx("p", { className: "mt-2 text-sm admin-text-muted", 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" }), _jsx("input", { id: "new-password", type: "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" })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "confirm-password", className: "admin-label admin-label-required", children: "Confirm password" }), _jsx("input", { id: "confirm-password", type: "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: "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" }), "Resetting..."] })) : ('Reset password') })] }), _jsx("div", { className: "mt-6 text-center", children: _jsx("a", { href: loginUrl, className: "text-sm admin-text-muted hover:underline", children: "\u2190 Back to sign in" }) })] }));
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":"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"}
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;CACd;AAMD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,OAAO,EACP,WAAyB,EACzB,QAAgB,EAChB,IAAW,EACX,SAAc,EACd,EAAE,EACF,IAAI,GACL,EAAE,gBAAgB,2CAwGlB"}
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...', disabled = false, size = 'md', className = '', id, name, }) {
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":"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"}
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,4 +1,4 @@
1
- import { type ReactNode } from 'react';
1
+ import type { ReactNode } from 'react';
2
2
  export interface AdminTopBarProps {
3
3
  /** Store name (falls back to StoreSettingsProvider, then 'Admin'). */
4
4
  storeName?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"AdminTopBar.d.ts","sourceRoot":"","sources":["../../../src/admin/components/AdminTopBar.tsx"],"names":[],"mappings":"AAoBA,OAAO,EAAuB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAQ3D,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,2CA8FlB"}
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
- // Brand tile mark: favicon FIRST (a square mark belongs in a 32px tile;
34
- // wide logo lockups read cramped), then logo, then monogram. Each source
35
- // is settings-first (live store_settings via the provider) with the
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: `admin-brand-tile ${tileSrc ? '' : 'admin-brand-tile-monogram'}`, children: tileSrc ? (
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