@mohasinac/appkit 2.8.4 → 2.8.6
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/_internal/client/features/layout/SidebarCollapseToggle.js +2 -0
- package/dist/_internal/server/features/checkout/actions.js +2 -1
- package/dist/_internal/server/features/grouped/data.js +9 -8
- package/dist/_internal/server/features/products/data.js +2 -1
- package/dist/_internal/server/features/refunds/actions.js +2 -1
- package/dist/_internal/server/features/seo/sitemap.js +2 -1
- package/dist/_internal/server/jobs/core/countersReconcile.js +4 -4
- package/dist/_internal/shared/features/blog/schema.d.ts +4 -4
- package/dist/_internal/shared/features/categories/bundle-schemas.d.ts +8 -8
- package/dist/_internal/shared/listing-types/action-tracker.js +0 -2
- package/dist/constants/field-names.d.ts +3 -0
- package/dist/constants/field-names.js +3 -0
- package/dist/core/unit-of-work.js +0 -1
- package/dist/features/account/components/NotificationBell.js +1 -0
- package/dist/features/account/components/UserOffersPanel.js +1 -0
- package/dist/features/account/components/UserSidebar.js +3 -1
- package/dist/features/admin/components/AdminCarouselEditorView.js +3 -1
- package/dist/features/admin/components/AdminSidebar.js +3 -1
- package/dist/features/admin/components/AdminSiteSettingsView.js +3 -1
- package/dist/features/admin/components/AdminSupportTicketDetailView.js +0 -3
- package/dist/features/admin/components/DashboardStats.js +5 -1
- package/dist/features/admin/components/analytics/AdminAnalyticsCharts.js +3 -1
- package/dist/features/admin/components/analytics/AdminStatCard.js +5 -1
- package/dist/features/admin/hooks/useChat.js +1 -0
- package/dist/features/admin/repository/chat.repository.js +7 -6
- package/dist/features/auctions/components/AuctionBidsTable.js +5 -1
- package/dist/features/auctions/components/AuctionBottomActions.js +3 -4
- package/dist/features/auctions/repository/bid.repository.js +12 -12
- package/dist/features/auth/hooks/useAuth.js +1 -0
- package/dist/features/blog/actions/blog-actions.d.ts +2 -2
- package/dist/features/blog/components/BlogFeaturedCard.js +3 -1
- package/dist/features/blog/components/BlogListView.js +5 -1
- package/dist/features/blog/components/BlogPostView.js +3 -1
- package/dist/features/blog/schemas/index.d.ts +1 -1
- package/dist/features/cart/components/CartDrawer.js +3 -1
- package/dist/features/cart/repository/cart.repository.js +2 -1
- package/dist/features/categories/components/BrandDetailPageView.js +5 -1
- package/dist/features/categories/components/CategoryDetailPageView.js +3 -1
- package/dist/features/categories/components/CategoryGrid.js +5 -1
- package/dist/features/categories/components/CategoryTableColumns.js +6 -2
- package/dist/features/categories/components/CategoryTree.js +3 -1
- package/dist/features/categories/components/ConcernCard.js +3 -1
- package/dist/features/categories/repository/categories.repository.js +26 -25
- package/dist/features/categories/schemas/firestore.d.ts +1 -0
- package/dist/features/categories/schemas/firestore.js +1 -0
- package/dist/features/categories/schemas/index.d.ts +10 -10
- package/dist/features/collections/components/CollectionCard.js +3 -1
- package/dist/features/events/components/EventCard.js +3 -1
- package/dist/features/events/components/EventParticipateView.js +2 -1
- package/dist/features/events/schemas/index.d.ts +3 -3
- package/dist/features/faq/actions/faq-actions.d.ts +6 -6
- package/dist/features/faq/repository/faqs.repository.js +21 -20
- package/dist/features/faq/schemas/index.d.ts +2 -2
- package/dist/features/forms/Slider.js +3 -1
- package/dist/features/history/hooks/useHistory.js +1 -0
- package/dist/features/homepage/components/AdSlot.js +6 -2
- package/dist/features/homepage/components/AdvertisementBanner.js +3 -1
- package/dist/features/homepage/components/BeforeAfterCard.js +5 -1
- package/dist/features/homepage/components/CustomCardsSection.js +5 -1
- package/dist/features/homepage/components/HowItWorksSection.js +3 -1
- package/dist/features/homepage/components/NewsletterBanner.js +6 -2
- package/dist/features/homepage/components/SecurityHighlightsSection.js +3 -1
- package/dist/features/homepage/components/StatsCounterSection.js +3 -1
- package/dist/features/homepage/components/TrustFeaturesSection.js +3 -1
- package/dist/features/homepage/repository/carousel.repository.js +8 -7
- package/dist/features/homepage/repository/carousels.repository.js +2 -1
- package/dist/features/homepage/repository/homepage-sections.repository.js +6 -5
- package/dist/features/layout/AppLayoutShell.js +3 -1
- package/dist/features/layout/BottomActionsContext.js +1 -3
- package/dist/features/layout/BottomNavbar.js +1 -1
- package/dist/features/media/MediaLightbox.js +9 -3
- package/dist/features/media/modals/ImageEditor.js +6 -2
- package/dist/features/media/upload/MediaUploadField.js +1 -1
- package/dist/features/messages/hooks/useConversation.js +2 -0
- package/dist/features/messages/hooks/useConversations.js +1 -0
- package/dist/features/messages/repository/conversations.repository.js +5 -4
- package/dist/features/orders/components/OrdersList.js +3 -1
- package/dist/features/orders/repository/orders.repository.js +13 -13
- package/dist/features/pre-orders/components/PreOrderDetailPageView.js +1 -1
- package/dist/features/products/components/CompareOverlay.js +5 -1
- package/dist/features/products/components/FeatureBadge.js +3 -1
- package/dist/features/products/components/MarketplacePrizeDrawCard.js +1 -1
- package/dist/features/products/components/ProductGrid.js +3 -1
- package/dist/features/products/repository/product-features.repository.js +7 -6
- package/dist/features/products/repository/product-templates.repository.js +4 -3
- package/dist/features/products/repository/products.repository.js +4 -4
- package/dist/features/promotions/repository/claimed-coupons.repository.js +2 -1
- package/dist/features/promotions/repository/coupons.repository.js +4 -4
- package/dist/features/reviews/components/ReviewDetailShell.js +8 -2
- package/dist/features/reviews/components/ReviewModal.js +5 -1
- package/dist/features/reviews/components/ReviewSummary.js +3 -1
- package/dist/features/reviews/components/ReviewsList.js +5 -1
- package/dist/features/reviews/repository/reviews.repository.js +2 -2
- package/dist/features/scams/repository/scammer.repository.js +3 -3
- package/dist/features/search/components/Search.js +14 -1
- package/dist/features/seller/components/PhysicalLocationModal.js +1 -1
- package/dist/features/seller/components/SellerAddressesView.js +2 -1
- package/dist/features/seller/components/SellerBidsView.js +3 -1
- package/dist/features/seller/components/SellerCouponEditorView.js +3 -1
- package/dist/features/seller/components/SellerOffersPanel.js +1 -0
- package/dist/features/seller/components/SellerPayoutMethodsView.js +1 -0
- package/dist/features/seller/components/SellerProductsView.js +5 -1
- package/dist/features/seller/components/SellerReviewsView.js +1 -0
- package/dist/features/seller/components/SellerShippingConfigsView.js +1 -0
- package/dist/features/seller/components/SellerSidebar.js +12 -4
- package/dist/features/seller/components/SellerStoreCategoriesView.js +1 -0
- package/dist/features/seller/components/SellerTemplatesView.js +1 -0
- package/dist/features/shell/FormShell.js +10 -2
- package/dist/features/shell/QuickFormDrawer.js +5 -2
- package/dist/features/stores/components/StoreHeader.js +5 -1
- package/dist/features/support/repository/support.repository.js +8 -7
- package/dist/features/wishlist/components/WishlistPage.js +3 -1
- package/dist/providers/db-firebase/admin.js +0 -1
- package/dist/seed/products-auctions-seed-data.js +107 -0
- package/dist/ui/DataTable.js +6 -2
- package/dist/ui/components/AvatarDisplay.js +3 -1
- package/dist/ui/components/BackgroundRenderer.js +4 -2
- package/dist/ui/components/Card.js +6 -2
- package/dist/ui/components/ImageGallery.js +3 -1
- package/dist/ui/components/ImageLightbox.js +3 -1
- package/dist/ui/components/PasswordStrengthIndicator.js +3 -1
- package/dist/ui/components/Progress.js +6 -2
- package/dist/ui/components/RowActionMenu.js +3 -1
- package/dist/ui/components/SiteLogo.js +7 -1
- package/dist/ui/components/Skeleton.js +3 -1
- package/dist/ui/components/Slider.js +3 -1
- package/dist/ui/components/TabStrip.js +3 -1
- package/package.json +1 -1
|
@@ -113,8 +113,16 @@ export function FormShell({ isOpen, onClose, title, breadcrumb, isDirty = false,
|
|
|
113
113
|
};
|
|
114
114
|
if (!isOpen)
|
|
115
115
|
return null;
|
|
116
|
-
return (_jsxs(_Fragment, { children: [_jsx(Div, { className: "fixed inset-0 bg-black/50 backdrop-blur-[2px]",
|
|
116
|
+
return (_jsxs(_Fragment, { children: [_jsx(Div, { className: "fixed inset-0 bg-black/50 backdrop-blur-[2px]",
|
|
117
|
+
// audit-inline-style-ok: z-index token
|
|
118
|
+
style: { zIndex: "calc(var(--appkit-z-modal) - 1)" }, "aria-hidden": "true", onClick: attemptClose }), _jsxs(Div, { ref: panelRef, role: "dialog", "aria-modal": "true", "aria-label": title, className: "fixed top-0 bottom-0 left-0 right-0 lg:left-[10%] lg:right-[10%] flex flex-col bg-[var(--appkit-color-surface)] shadow-2xl",
|
|
119
|
+
// audit-inline-style-ok: z-index token
|
|
120
|
+
style: { zIndex: "var(--appkit-z-modal)" }, children: [_jsxs(Row, { gap: "sm", className: "flex-shrink-0 sticky top-0 z-10 border-b border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface)] px-5 py-3", children: [previewMode ? (_jsxs("button", { type: "button", onClick: () => setPreviewMode(false), "aria-label": "Back to edit", className: "rounded-lg p-1.5 text-[var(--appkit-color-text-muted)] hover:bg-[var(--appkit-color-border-subtle)] transition-colors flex-shrink-0 flex items-center gap-1.5 text-sm", children: [_jsx(ArrowLeft, { className: "w-4 h-4" }), _jsx(Span, { className: "hidden sm:inline", children: "Back to Edit" })] })) : (_jsx("button", { type: "button", onClick: attemptClose, "aria-label": "Close", className: "rounded-lg p-1.5 text-[var(--appkit-color-text-muted)] hover:bg-[var(--appkit-color-border-subtle)] transition-colors flex-shrink-0", children: _jsx(X, { className: "w-5 h-5" }) })), _jsxs(Div, { className: "flex-1 min-w-0", children: [breadcrumb && (_jsx(Text, { className: "text-xs text-[var(--appkit-color-text-muted)] truncate mb-0.5", children: breadcrumb })), _jsx(Text, { className: "text-sm font-semibold text-[var(--appkit-color-text)] truncate", children: previewMode ? `Preview — ${title}` : title })] }), _jsx(Row, { gap: "xs", className: "flex-shrink-0", children: previewMode ? null : (_jsxs(_Fragment, { children: [previewSlot && (_jsxs("button", { type: "button", onClick: () => setPreviewMode(true), className: "flex items-center gap-1.5 rounded-lg px-3 py-1.5 text-sm text-[var(--appkit-color-text-muted)] hover:bg-[var(--appkit-color-border-subtle)] transition-colors border border-[var(--appkit-color-border)]", children: [_jsx(Eye, { className: "w-4 h-4" }), _jsx(Span, { className: "hidden sm:inline", children: "Preview" })] })), onSaveDraft && (_jsx(Button, { variant: "outline", size: "sm", onClick: handleSaveDraft, disabled: isLoading || savingDraft || publishing, isLoading: savingDraft, children: saveLabel })), onPublish && (_jsx(Button, { variant: "primary", size: "sm", onClick: handlePublish, disabled: isLoading || savingDraft || publishing, isLoading: publishing, children: publishLabel }))] })) })] }), _jsxs(Div, { className: `flex flex-1 ${__O.hidden}`, children: [sections && sections.length > 0 && !previewMode && (_jsx("nav", { "aria-label": "Form sections", className: "hidden lg:flex flex-col flex-shrink-0 w-48 border-r border-[var(--appkit-color-border)] py-4 px-3 gap-1 overflow-y-auto", children: sections.map((sec) => (_jsx("button", { type: "button", onClick: () => scrollToSection(sec.id), className: "text-left text-sm px-3 py-2 rounded-lg text-[var(--appkit-color-text-muted)] hover:text-[var(--appkit-color-text)] hover:bg-[var(--appkit-color-border-subtle)] transition-colors", children: sec.label }, sec.id))) })), sections && sections.length > 0 && !previewMode && (_jsx(Row, { gap: "px", className: `lg:hidden fixed top-[var(--form-shell-topbar-h,57px)] left-0 right-0 z-10 ${__O.xAuto} px-5 py-2 bg-[var(--appkit-color-surface)] border-b border-[var(--appkit-color-border)]`, children: sections.map((sec) => (_jsx("button", { type: "button", onClick: () => scrollToSection(sec.id), className: "flex-shrink-0 text-xs px-3 py-1.5 rounded-full border border-[var(--appkit-color-border)] text-[var(--appkit-color-text-muted)] hover:border-[var(--appkit-color-primary)] hover:text-[var(--appkit-color-primary)] transition-colors whitespace-nowrap", children: sec.label }, sec.id))) })), _jsx(Div, { ref: bodyRef, className: classNames("flex-1 overflow-y-auto", sections && sections.length > 0 && !previewMode ? "pt-0 lg:pt-0" : ""), children: previewMode && previewSlot ? (_jsxs(_Fragment, { children: [_jsxs(Row, { gap: "xs", className: "sticky top-0 z-10 bg-[var(--appkit-color-warning-surface)] border-b border-[var(--appkit-color-warning)] px-4 py-2 text-sm text-[var(--appkit-color-warning-text,var(--appkit-color-warning))]", children: [_jsx(Eye, { className: "w-4 h-4 flex-shrink-0" }), _jsx(Span, { children: "Preview \u2014 not visible to buyers until published" })] }), _jsx(Div, { className: "py-4", children: previewSlot() })] })) : splitPreview && previewSlot ? (
|
|
117
121
|
// S-STORE-3-D — desktop 60/40 split: form left, preview right.
|
|
118
122
|
// Below `lg`, falls back to single-column form (preview-as-modal via existing toggle).
|
|
119
|
-
_jsxs(Div, { className: "lg:grid lg:grid-cols-[3fr_2fr] lg:gap-6 lg:px-6 lg:py-6 lg:max-w-[1400px] lg:mx-auto", children: [_jsx(Div, { className: "max-w-3xl mx-auto px-5 py-6 sm:px-6 lg:max-w-none lg:px-0 lg:py-0", children: children }), _jsxs(Div, { className: `hidden lg:block sticky lg:top-4 lg:self-start lg:max-h-[calc(100vh-6rem)] ${__O.yAuto} border border-[var(--appkit-color-border)] rounded-lg bg-[var(--appkit-color-surface-raised)] ${__P.p4}`, children: [_jsxs(Row, { gap: "xs", className: "mb-3 text-xs font-semibold uppercase tracking-wide text-[var(--appkit-color-text-muted)]", children: [_jsx(Eye, { className: "w-3.5 h-3.5" }), _jsx(Span, { children: "Live preview" })] }), previewSlot()] })] })) : (_jsx(Div, { className: "max-w-3xl mx-auto px-5 py-6 sm:px-6", children: children })) })] }), !previewMode && renderBottomBar ? (renderBottomBar()) : !previewMode && (onSaveDraft || onPublish) ? (_jsxs(Row, { justify: "between", className: "flex-shrink-0 sticky bottom-0 z-10 border-t border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface)] px-5 py-3", children: [_jsx(Button, { variant: "ghost", size: "sm", onClick: attemptClose, disabled: isLoading, children: FORM_ACTION_META[FORM_ACTION_ID.DISCARD].label }), _jsxs(Row, { gap: "xs", children: [onSaveDraft && (_jsx(Button, { variant: "outline", size: "sm", onClick: handleSaveDraft, disabled: isLoading || savingDraft || publishing, isLoading: savingDraft, children: saveLabel })), onPublish && (_jsxs(Button, { variant: "primary", size: "sm", onClick: handlePublish, disabled: isLoading || savingDraft || publishing, isLoading: publishing, children: [publishLabel, " \u2192"] }))] })] })) : null] }), showUnsaved && (_jsxs(_Fragment, { children: [_jsx(Div, { className: "fixed inset-0 bg-black/60",
|
|
123
|
+
_jsxs(Div, { className: "lg:grid lg:grid-cols-[3fr_2fr] lg:gap-6 lg:px-6 lg:py-6 lg:max-w-[1400px] lg:mx-auto", children: [_jsx(Div, { className: "max-w-3xl mx-auto px-5 py-6 sm:px-6 lg:max-w-none lg:px-0 lg:py-0", children: children }), _jsxs(Div, { className: `hidden lg:block sticky lg:top-4 lg:self-start lg:max-h-[calc(100vh-6rem)] ${__O.yAuto} border border-[var(--appkit-color-border)] rounded-lg bg-[var(--appkit-color-surface-raised)] ${__P.p4}`, children: [_jsxs(Row, { gap: "xs", className: "mb-3 text-xs font-semibold uppercase tracking-wide text-[var(--appkit-color-text-muted)]", children: [_jsx(Eye, { className: "w-3.5 h-3.5" }), _jsx(Span, { children: "Live preview" })] }), previewSlot()] })] })) : (_jsx(Div, { className: "max-w-3xl mx-auto px-5 py-6 sm:px-6", children: children })) })] }), !previewMode && renderBottomBar ? (renderBottomBar()) : !previewMode && (onSaveDraft || onPublish) ? (_jsxs(Row, { justify: "between", className: "flex-shrink-0 sticky bottom-0 z-10 border-t border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface)] px-5 py-3", children: [_jsx(Button, { variant: "ghost", size: "sm", onClick: attemptClose, disabled: isLoading, children: FORM_ACTION_META[FORM_ACTION_ID.DISCARD].label }), _jsxs(Row, { gap: "xs", children: [onSaveDraft && (_jsx(Button, { variant: "outline", size: "sm", onClick: handleSaveDraft, disabled: isLoading || savingDraft || publishing, isLoading: savingDraft, children: saveLabel })), onPublish && (_jsxs(Button, { variant: "primary", size: "sm", onClick: handlePublish, disabled: isLoading || savingDraft || publishing, isLoading: publishing, children: [publishLabel, " \u2192"] }))] })] })) : null] }), showUnsaved && (_jsxs(_Fragment, { children: [_jsx(Div, { className: "fixed inset-0 bg-black/60",
|
|
124
|
+
// audit-inline-style-ok: z-index token
|
|
125
|
+
style: { zIndex: "calc(var(--appkit-z-modal) + 5)" }, onClick: () => setShowUnsaved(false) }), _jsxs(Div, { className: "fixed top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[90vw] max-w-sm bg-[var(--appkit-color-surface)] rounded-xl shadow-2xl p-6",
|
|
126
|
+
// audit-inline-style-ok: z-index token
|
|
127
|
+
style: { zIndex: "calc(var(--appkit-z-modal) + 5)" }, children: [_jsxs(Row, { gap: "sm", align: "start", className: "mb-4", children: [_jsx(Span, { className: "flex-shrink-0 w-10 h-10 rounded-full bg-[var(--appkit-color-warning-surface)] flex items-center justify-center", children: _jsx(AlertTriangle, { className: "w-5 h-5 text-[var(--appkit-color-warning)]" }) }), _jsxs(Stack, { gap: "xs", children: [_jsx(Text, { className: "font-semibold text-[var(--appkit-color-text)]", children: "Unsaved changes" }), _jsx(Text, { className: "text-sm text-[var(--appkit-color-text-muted)]", children: "You have unsaved changes. Leave without saving?" })] })] }), _jsxs(Row, { gap: "xs", justify: "end", children: [_jsx(Button, { variant: "outline", size: "sm", onClick: () => setShowUnsaved(false), children: "Stay" }), _jsx(Button, { variant: "danger", size: "sm", onClick: () => { setShowUnsaved(false); onClose(); }, children: "Leave" })] })] })] }))] }));
|
|
120
128
|
}
|
|
@@ -66,7 +66,6 @@ export function QuickFormDrawer({ isOpen, onClose, title, fields, defaultValues,
|
|
|
66
66
|
setValues(initValues(fields, defaultValues));
|
|
67
67
|
setErrors({});
|
|
68
68
|
onClose();
|
|
69
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
70
69
|
}, [fields, defaultValues, onClose]);
|
|
71
70
|
// Keyboard: Esc → close; Tab → trap focus
|
|
72
71
|
useEffect(() => {
|
|
@@ -104,7 +103,11 @@ export function QuickFormDrawer({ isOpen, onClose, title, fields, defaultValues,
|
|
|
104
103
|
if (!isOpen)
|
|
105
104
|
return null;
|
|
106
105
|
const busy = submitting || isLoading;
|
|
107
|
-
return (_jsxs(_Fragment, { children: [_jsx(Div, { className: "fixed inset-0 bg-black/40 backdrop-blur-[2px]",
|
|
106
|
+
return (_jsxs(_Fragment, { children: [_jsx(Div, { className: "fixed inset-0 bg-black/40 backdrop-blur-[2px]",
|
|
107
|
+
// audit-inline-style-ok: z-index token
|
|
108
|
+
style: { zIndex: "calc(var(--appkit-z-modal) + 1)" }, "aria-hidden": "true", onClick: handleClose }), _jsxs("div", { ref: drawerRef, role: "dialog", "aria-modal": "true", "aria-label": title, className: "fixed inset-y-0 right-0 flex flex-col bg-[var(--appkit-color-surface)] shadow-2xl w-full lg:w-[40%]",
|
|
109
|
+
// audit-inline-style-ok: z-index token
|
|
110
|
+
style: { zIndex: "calc(var(--appkit-z-modal) + 2)" }, children: [_jsxs(Div, { className: "flex-shrink-0 flex items-center gap-3 px-4 py-4 border-b border-[var(--appkit-color-border)]", children: [_jsx(Text, { className: "flex-1 text-base font-semibold text-[var(--appkit-color-text)]", children: title }), _jsx("button", { type: "button", onClick: handleClose, "aria-label": "Close", className: "rounded-lg p-1.5 text-[var(--appkit-color-text-muted)] hover:bg-[var(--appkit-color-border-subtle)] transition-colors", children: _jsx(X, { className: "w-5 h-5" }) })] }), _jsxs("form", { className: "flex-1 overflow-y-auto px-4 py-5 space-y-4", onSubmit: handleSubmit, noValidate: true, children: [fields.map((field) => {
|
|
108
111
|
const value = values[field.name];
|
|
109
112
|
if (field.type === "toggle") {
|
|
110
113
|
return (_jsxs(Div, { className: "space-y-1", children: [_jsx(Toggle, { checked: !!value, onChange: (checked) => set(field.name, checked), label: field.label }), field.helperText && (_jsx(Text, { className: "text-xs text-[var(--appkit-color-text-muted)]", children: field.helperText }))] }, field.name));
|
|
@@ -11,7 +11,11 @@ const CLS_STARS = "inline-flex items-center gap-1 text-amber-500";
|
|
|
11
11
|
const CLS_FOLLOW_BTN = "rounded-lg border border-orange-500 px-4 py-2 text-sm font-medium text-orange-500 hover:bg-orange-50 transition-colors";
|
|
12
12
|
const CLS_WARN_BANNER = "mt-3 rounded-lg bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 px-3 py-2 text-sm text-yellow-700 dark:text-yellow-300";
|
|
13
13
|
export function StoreHeader({ store, labels = {}, onFollow, className = "", }) {
|
|
14
|
-
return (_jsxs(Section, { surface: "default", className: `border-b border-gray-200 dark:border-slate-700 ${className}`, children: [store.storeBannerURL && (_jsx(Div, { className: `h-40 md:h-56 ${__O.hidden} bg-gray-100 dark:bg-slate-800`, children: _jsx(Div, { role: "img", "aria-label": `${store.storeName} banner`, className: "h-full w-full bg-center bg-cover",
|
|
14
|
+
return (_jsxs(Section, { surface: "default", className: `border-b border-gray-200 dark:border-slate-700 ${className}`, children: [store.storeBannerURL && (_jsx(Div, { className: `h-40 md:h-56 ${__O.hidden} bg-gray-100 dark:bg-slate-800`, children: _jsx(Div, { role: "img", "aria-label": `${store.storeName} banner`, className: "h-full w-full bg-center bg-cover",
|
|
15
|
+
// audit-inline-style-ok: dynamic image URL
|
|
16
|
+
style: { backgroundImage: `url(${store.storeBannerURL})` } }) })), _jsxs(Div, { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-4", children: [_jsxs(Div, { className: "flex items-end gap-4", children: [store.storeLogoURL ? (_jsx(Div, { role: "img", "aria-label": store.storeName, className: "-mt-8 h-16 w-16 rounded-xl border-2 border-white dark:border-slate-800 bg-center bg-cover shadow-sm",
|
|
17
|
+
// audit-inline-style-ok: dynamic image URL
|
|
18
|
+
style: { backgroundImage: `url(${store.storeLogoURL})` } })) : (_jsx(Div, { className: CLS_AVATAR, children: store.storeName[0]?.toUpperCase() })), _jsxs(Div, { className: "flex-1 min-w-0", children: [_jsxs(Div, { className: "flex flex-wrap items-center gap-2 mb-0.5", children: [_jsx(Heading, { level: 1, className: "text-xl font-bold text-gray-900 dark:text-zinc-100", children: store.storeName }), store.averageRating != null && store.averageRating > 0 && (_jsxs(Span, { size: "sm", weight: "medium", className: CLS_STARS, children: ["\u2605 ", store.averageRating.toFixed(1)] }))] }), _jsxs(Row, { className: "gap-3 text-xs text-gray-500 dark:text-zinc-400 mb-0.5", children: [store.category && _jsx(Span, { className: "capitalize", children: store.category }), store.totalProducts != null && store.totalProducts > 0 && (_jsxs(Span, { children: [store.totalProducts, " ", labels.products ?? "products"] })), store.totalReviews != null && store.totalReviews > 0 && (_jsxs(Span, { children: [store.totalReviews, " ", labels.reviews ?? "reviews"] })), store.itemsSold != null && store.itemsSold > 0 && (_jsxs(Span, { children: [store.itemsSold, " ", labels.sold ?? "sold"] }))] }), store.storeDescription && (_jsx(RichText, { html: normalizeRichTextHtml(store.storeDescription), copyableCode: true, className: "mt-0.5" }))] }), _jsxs(Row, { gap: "sm", align: "center", className: "shrink-0", children: [_jsx(ShareButton, { title: store.storeName }), onFollow && (_jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => onFollow(store.storeSlug), className: CLS_FOLLOW_BTN, children: labels.follow ?? "Follow" }))] })] }), store.isVacationMode && (_jsx(Text, { className: CLS_WARN_BANNER, children: store.vacationMessage ??
|
|
15
19
|
labels.vacationMode ??
|
|
16
20
|
"Store is on vacation mode" })), _jsx(Div, { className: "mt-3", children: _jsx(StoreScopedSearch, { storeId: store.storeSlug, storeName: store.storeName }) })] })] }));
|
|
17
21
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { firebaseFieldOps } from "../../../providers/db-firebase";
|
|
2
2
|
import { BaseRepository, prepareForFirestore, } from "../../../providers/db-firebase";
|
|
3
3
|
import { DatabaseError } from "../../../errors";
|
|
4
|
+
import { SUPPORT_TICKET_FIELDS } from "../../../constants/field-names";
|
|
4
5
|
import { SUPPORT_TICKET_COLLECTION, ACTIVE_TICKET_STATUSES, } from "../schemas/firestore";
|
|
5
6
|
export class SupportRepository extends BaseRepository {
|
|
6
7
|
constructor() {
|
|
@@ -38,8 +39,8 @@ export class SupportRepository extends BaseRepository {
|
|
|
38
39
|
async countActiveTickets(userId) {
|
|
39
40
|
const col = this.db.collection(SUPPORT_TICKET_COLLECTION);
|
|
40
41
|
const snaps = await Promise.all(ACTIVE_TICKET_STATUSES.map((s) => col
|
|
41
|
-
.where(
|
|
42
|
-
.where(
|
|
42
|
+
.where(SUPPORT_TICKET_FIELDS.USER_ID, "==", userId)
|
|
43
|
+
.where(SUPPORT_TICKET_FIELDS.STATUS, "==", s)
|
|
43
44
|
.select()
|
|
44
45
|
.get()));
|
|
45
46
|
return snaps.reduce((total, snap) => total + snap.size, 0);
|
|
@@ -47,9 +48,9 @@ export class SupportRepository extends BaseRepository {
|
|
|
47
48
|
async getActiveOrderTicket(userId, orderId) {
|
|
48
49
|
const col = this.db.collection(SUPPORT_TICKET_COLLECTION);
|
|
49
50
|
const snap = await col
|
|
50
|
-
.where(
|
|
51
|
+
.where(SUPPORT_TICKET_FIELDS.USER_ID, "==", userId)
|
|
51
52
|
.where("orderId", "==", orderId)
|
|
52
|
-
.where(
|
|
53
|
+
.where(SUPPORT_TICKET_FIELDS.STATUS, "in", ACTIVE_TICKET_STATUSES)
|
|
53
54
|
.limit(1)
|
|
54
55
|
.get();
|
|
55
56
|
if (snap.empty)
|
|
@@ -60,9 +61,9 @@ export class SupportRepository extends BaseRepository {
|
|
|
60
61
|
async getActiveCategoryTicket(userId, category) {
|
|
61
62
|
const col = this.db.collection(SUPPORT_TICKET_COLLECTION);
|
|
62
63
|
const snap = await col
|
|
63
|
-
.where(
|
|
64
|
-
.where(
|
|
65
|
-
.where(
|
|
64
|
+
.where(SUPPORT_TICKET_FIELDS.USER_ID, "==", userId)
|
|
65
|
+
.where(SUPPORT_TICKET_FIELDS.CATEGORY, "==", category)
|
|
66
|
+
.where(SUPPORT_TICKET_FIELDS.STATUS, "==", "waiting_on_user")
|
|
66
67
|
.limit(1)
|
|
67
68
|
.get();
|
|
68
69
|
if (snap.empty)
|
|
@@ -6,7 +6,9 @@ const CLS_REMOVE_BTN = "self-start text-zinc-400 dark:text-zinc-400 transition h
|
|
|
6
6
|
export function WishlistCard({ item, onRemove, onProductClick, }) {
|
|
7
7
|
return (_jsxs(Div, { surface: "card", padding: "sm", className: "flex gap-4", children: [_jsx(Div, { role: onProductClick ? "button" : undefined, tabIndex: onProductClick ? 0 : undefined, onClick: onProductClick ? () => onProductClick(item) : undefined, onKeyDown: onProductClick
|
|
8
8
|
? (e) => e.key === "Enter" && onProductClick(item)
|
|
9
|
-
: undefined, className: `h-20 w-20 flex-shrink-0 overflow-hidden rounded-lg bg-neutral-100 dark:bg-slate-800 ${onProductClick ? "cursor-pointer" : ""}`, children: item.productImage && (_jsx(Div, { role: "img", "aria-label": item.productTitle ?? "", className: "h-full w-full bg-center bg-cover",
|
|
9
|
+
: undefined, className: `h-20 w-20 flex-shrink-0 overflow-hidden rounded-lg bg-neutral-100 dark:bg-slate-800 ${onProductClick ? "cursor-pointer" : ""}`, children: item.productImage && (_jsx(Div, { role: "img", "aria-label": item.productTitle ?? "", className: "h-full w-full bg-center bg-cover",
|
|
10
|
+
// audit-inline-style-ok: dynamic image URL
|
|
11
|
+
style: { backgroundImage: `url(${item.productImage})` } })) }), _jsxs(Div, { className: "flex flex-1 flex-col justify-between", children: [_jsx(Text, { className: `font-medium text-neutral-900 dark:text-zinc-100 ${THEME_CONSTANTS.utilities.textClamp2}`, children: item.productTitle }), item.productPrice !== undefined && (_jsx(Text, { className: "text-sm font-semibold text-neutral-900 dark:text-zinc-100", children: formatCurrency(item.productPrice, item.productCurrency) }))] }), onRemove && (_jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => onRemove(item.id), "aria-label": "Remove from wishlist", className: CLS_REMOVE_BTN, children: "\u2715" }))] }));
|
|
10
12
|
}
|
|
11
13
|
export function WishlistPage({ items, isLoading, onRemove, onProductClick, emptyLabel = "Your wishlist is empty", }) {
|
|
12
14
|
if (isLoading) {
|
|
@@ -8,7 +8,6 @@ function nodeCwd() { return module.require("process").cwd(); }
|
|
|
8
8
|
// Lazy loaders — prevents webpack from bundling firebase-admin into browser chunks.
|
|
9
9
|
// (module as any).require() is used because webpack's static analysis does NOT trace
|
|
10
10
|
// module.require() calls, unlike calls to the literal `require` or aliased `require`.
|
|
11
|
-
/* eslint-disable @typescript-eslint/no-require-imports */
|
|
12
11
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
13
12
|
function loadApp() {
|
|
14
13
|
return module.require("firebase-admin/app");
|
|
@@ -676,6 +676,113 @@ const _adminAuctionsSeedData = [
|
|
|
676
676
|
createdAt: new Date("2026-05-05"),
|
|
677
677
|
updatedAt: new Date("2026-05-21"),
|
|
678
678
|
},
|
|
679
|
+
// ===== Category-coverage backfill (BGS / CGC / Raw NM / set-specific era tags) =====
|
|
680
|
+
{
|
|
681
|
+
id: "auction-bgs-blue-eyes-sdk",
|
|
682
|
+
slug: "auction-bgs-blue-eyes-sdk",
|
|
683
|
+
title: "Blue-Eyes White Dragon (SDK BGS 9.5)",
|
|
684
|
+
description: "Starter Deck Kaiba Blue-Eyes White Dragon graded BGS 9.5 (Gem Mint).",
|
|
685
|
+
categorySlugs: ["category-graded-cards", "category-bgs-graded", "category-duel-monsters-era"],
|
|
686
|
+
categoryNames: ["Graded Cards", "BGS Slabs", "Duel Monsters Era"],
|
|
687
|
+
brandSlug: "brand-konami",
|
|
688
|
+
brand: "Konami",
|
|
689
|
+
startingBid: 1899900,
|
|
690
|
+
buyItNowPriceInPaise: 3499900,
|
|
691
|
+
currentBid: 2399900,
|
|
692
|
+
currency: "INR",
|
|
693
|
+
auctionEndDate: new Date(Date.now() + 4 * 24 * 60 * 60 * 1000),
|
|
694
|
+
bidCount: 5,
|
|
695
|
+
bidsHaveStarted: true,
|
|
696
|
+
isSold: false,
|
|
697
|
+
mainImage: `https://images.ygoprodeck.com/images/cards/${CARD_IDS.blueEyesWhiteDragon}.jpg`,
|
|
698
|
+
images: [`https://images.ygoprodeck.com/images/cards/${CARD_IDS.blueEyesWhiteDragon}.jpg`],
|
|
699
|
+
status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
|
|
700
|
+
grading: { service: "BGS", grade: 9.5, certNumber: "BGS-YGO-557788" },
|
|
701
|
+
condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
|
|
702
|
+
storeId: "store-kaiba-corp-cards",
|
|
703
|
+
storeName: "Kaiba Corp Card Vault",
|
|
704
|
+
createdAt: new Date("2026-05-20"),
|
|
705
|
+
updatedAt: new Date("2026-05-22"),
|
|
706
|
+
},
|
|
707
|
+
{
|
|
708
|
+
id: "auction-cgc-jinzo-psv",
|
|
709
|
+
slug: "auction-cgc-jinzo-psv",
|
|
710
|
+
title: "Jinzo (PSV 1st Ed CGC 9)",
|
|
711
|
+
description: "Pharaoh's Servant 1st Edition Jinzo graded CGC 9 (Mint).",
|
|
712
|
+
categorySlugs: ["category-graded-cards", "category-cgc-graded", "category-pharaoh-servant", "category-duel-monsters-era"],
|
|
713
|
+
categoryNames: ["Graded Cards", "CGC Slabs", "Pharaoh's Servant", "Duel Monsters Era"],
|
|
714
|
+
brandSlug: "brand-konami",
|
|
715
|
+
brand: "Konami",
|
|
716
|
+
startingBid: 1199900,
|
|
717
|
+
buyItNowPriceInPaise: 2299900,
|
|
718
|
+
currentBid: 1599900,
|
|
719
|
+
currency: "INR",
|
|
720
|
+
auctionEndDate: new Date(Date.now() + 6 * 24 * 60 * 60 * 1000),
|
|
721
|
+
bidCount: 3,
|
|
722
|
+
bidsHaveStarted: true,
|
|
723
|
+
isSold: false,
|
|
724
|
+
mainImage: `https://images.ygoprodeck.com/images/cards/${CARD_IDS.jinzo}.jpg`,
|
|
725
|
+
images: [`https://images.ygoprodeck.com/images/cards/${CARD_IDS.jinzo}.jpg`],
|
|
726
|
+
status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
|
|
727
|
+
grading: { service: "CGC", grade: 9, certNumber: "CGC-YGO-220033" },
|
|
728
|
+
condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
|
|
729
|
+
storeId: "store-kaiba-corp-cards",
|
|
730
|
+
storeName: "Kaiba Corp Card Vault",
|
|
731
|
+
createdAt: new Date("2026-05-19"),
|
|
732
|
+
updatedAt: new Date("2026-05-22"),
|
|
733
|
+
},
|
|
734
|
+
{
|
|
735
|
+
id: "auction-raw-nm-gate-guardian-mrd",
|
|
736
|
+
slug: "auction-raw-nm-gate-guardian-mrd",
|
|
737
|
+
title: "Gate Guardian (MRD 1st Ed, Raw NM)",
|
|
738
|
+
description: "Metal Raiders 1st Edition Gate Guardian, ungraded, certified near-mint by independent reviewer.",
|
|
739
|
+
categorySlugs: ["category-monster-cards", "category-singles", "category-raw-near-mint", "category-metal-raiders", "category-duel-monsters-era"],
|
|
740
|
+
categoryNames: ["Monster Cards", "Singles", "Raw NM", "Metal Raiders", "Duel Monsters Era"],
|
|
741
|
+
brandSlug: "brand-konami",
|
|
742
|
+
brand: "Konami",
|
|
743
|
+
startingBid: 499900,
|
|
744
|
+
buyItNowPriceInPaise: 999900,
|
|
745
|
+
currentBid: 699900,
|
|
746
|
+
currency: "INR",
|
|
747
|
+
auctionEndDate: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000),
|
|
748
|
+
bidCount: 2,
|
|
749
|
+
bidsHaveStarted: true,
|
|
750
|
+
isSold: false,
|
|
751
|
+
mainImage: `https://images.ygoprodeck.com/images/cards/${CARD_IDS.gateGuardian}.jpg`,
|
|
752
|
+
images: [`https://images.ygoprodeck.com/images/cards/${CARD_IDS.gateGuardian}.jpg`],
|
|
753
|
+
status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
|
|
754
|
+
condition: PRODUCT_FIELDS.CONDITION_VALUES.USED,
|
|
755
|
+
storeId: "store-kaiba-corp-cards",
|
|
756
|
+
storeName: "Kaiba Corp Card Vault",
|
|
757
|
+
createdAt: new Date("2026-05-18"),
|
|
758
|
+
updatedAt: new Date("2026-05-22"),
|
|
759
|
+
},
|
|
760
|
+
{
|
|
761
|
+
id: "auction-soi-rainbow-dragon",
|
|
762
|
+
slug: "auction-soi-rainbow-dragon",
|
|
763
|
+
title: "Rainbow Dragon (SOI 1st Ed)",
|
|
764
|
+
description: "Shadow of Infinity 1st Edition Rainbow Dragon. GX-era ultimate beast.",
|
|
765
|
+
categorySlugs: ["category-extra-deck-cards", "category-singles", "category-shadow-of-infinity", "category-gx-era"],
|
|
766
|
+
categoryNames: ["Extra Deck Cards", "Singles", "Shadow of Infinity", "GX Era"],
|
|
767
|
+
brandSlug: "brand-konami",
|
|
768
|
+
brand: "Konami",
|
|
769
|
+
startingBid: 799900,
|
|
770
|
+
buyItNowPriceInPaise: 1599900,
|
|
771
|
+
currentBid: 1099900,
|
|
772
|
+
currency: "INR",
|
|
773
|
+
auctionEndDate: new Date(Date.now() + 9 * 24 * 60 * 60 * 1000),
|
|
774
|
+
bidCount: 4,
|
|
775
|
+
bidsHaveStarted: true,
|
|
776
|
+
isSold: false,
|
|
777
|
+
mainImage: `https://images.ygoprodeck.com/images/cards/${CARD_IDS.rainbowDragon}.jpg`,
|
|
778
|
+
images: [`https://images.ygoprodeck.com/images/cards/${CARD_IDS.rainbowDragon}.jpg`],
|
|
779
|
+
status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
|
|
780
|
+
condition: PRODUCT_FIELDS.CONDITION_VALUES.USED,
|
|
781
|
+
storeId: "store-kaiba-corp-cards",
|
|
782
|
+
storeName: "Kaiba Corp Card Vault",
|
|
783
|
+
createdAt: new Date("2026-05-17"),
|
|
784
|
+
updatedAt: new Date("2026-05-22"),
|
|
785
|
+
},
|
|
679
786
|
];
|
|
680
787
|
export const productsAuctionsSeedData = [
|
|
681
788
|
..._kaibaAuctionsSeedData.map((a) => withTokens({
|
package/dist/ui/DataTable.js
CHANGED
|
@@ -134,7 +134,9 @@ pageSize: pageSizeProp, stickyHeader: stickyHeaderProp, striped: stripedProp, sh
|
|
|
134
134
|
? "ascending"
|
|
135
135
|
: "descending"
|
|
136
136
|
: "none"
|
|
137
|
-
: undefined, className: `appkit-data-table__th ${col.sortable ? "appkit-data-table__th--sortable" : ""}`,
|
|
137
|
+
: undefined, className: `appkit-data-table__th ${col.sortable ? "appkit-data-table__th--sortable" : ""}`,
|
|
138
|
+
// audit-inline-style-ok: dynamic CSS
|
|
139
|
+
style: { width: col.width }, onClick: () => col.sortable && handleSort(col.key), children: _jsxs(Row, { gap: "sm", children: [col.header, col.sortable && (_jsx(Span, { className: "text-zinc-400 dark:text-zinc-400", "aria-hidden": "true", children: sortKey === col.key ? (sortDirection === "asc" ? ("↑") : ("↓")) : (_jsx(Span, { className: "opacity-30", children: "\u2195" })) }))] }) }, col.key))), actions && (_jsx("th", { scope: "col", className: "appkit-data-table__th appkit-data-table__td--actions", children: labelActions }))] }) }), _jsx("tbody", { className: "appkit-data-table__tbody divide-y divide-zinc-200 dark:divide-slate-700", children: paginatedData.map((item, index) => (_jsxs("tr", { className: [
|
|
138
140
|
"appkit-data-table__row",
|
|
139
141
|
striped && index % 2 === 1
|
|
140
142
|
? "appkit-data-table__row--striped"
|
|
@@ -159,7 +161,9 @@ function DataTableTableView({ columns, paginatedData, keyExtractor, selectable,
|
|
|
159
161
|
? sortKey === col.key
|
|
160
162
|
? sortDirection === "asc" ? "ascending" : "descending"
|
|
161
163
|
: "none"
|
|
162
|
-
: undefined, className: `appkit-data-table__th ${col.sortable ? "appkit-data-table__th--sortable" : ""}`,
|
|
164
|
+
: undefined, className: `appkit-data-table__th ${col.sortable ? "appkit-data-table__th--sortable" : ""}`,
|
|
165
|
+
// audit-inline-style-ok: dynamic CSS
|
|
166
|
+
style: { width: col.width }, onClick: () => col.sortable && onSort(col.key), children: _jsxs(Row, { gap: "sm", children: [col.header, col.sortable && (_jsx(Span, { className: "text-zinc-400 dark:text-zinc-400", "aria-hidden": "true", children: sortKey === col.key ? (sortDirection === "asc" ? "↑" : "↓") : _jsx(Span, { className: "opacity-30", children: "\u2195" }) }))] }) }, col.key))), actions && (_jsx("th", { scope: "col", className: "appkit-data-table__th appkit-data-table__td--actions", children: labelActions }))] }) }), _jsx("tbody", { className: "appkit-data-table__tbody divide-y divide-zinc-200 dark:divide-slate-700", children: paginatedData.map((item, index) => (_jsxs("tr", { className: [
|
|
163
167
|
"appkit-data-table__row",
|
|
164
168
|
striped && index % 2 === 1 ? "appkit-data-table__row--striped" : "",
|
|
165
169
|
onRowClick ? "appkit-data-table__row--clickable" : "",
|
|
@@ -44,7 +44,9 @@ export function AvatarDisplay({ cropData, size = "md", className = "", alt = "Pr
|
|
|
44
44
|
className,
|
|
45
45
|
]
|
|
46
46
|
.filter(Boolean)
|
|
47
|
-
.join(" "), "data-section": "avatardisplay-div-455", children: _jsx("div", { className: UI_AVATAR_DISPLAY.imageInner,
|
|
47
|
+
.join(" "), "data-section": "avatardisplay-div-455", children: _jsx("div", { className: UI_AVATAR_DISPLAY.imageInner,
|
|
48
|
+
// audit-inline-style-ok: dynamic CSS
|
|
49
|
+
style: {
|
|
48
50
|
backgroundImage: `url(${cropData.url})`,
|
|
49
51
|
backgroundSize: "cover",
|
|
50
52
|
width: `${(cropData.zoom || 1) * 100}%`,
|
|
@@ -36,7 +36,9 @@ export function BackgroundRenderer({ mode, lightMode, darkMode, }) {
|
|
|
36
36
|
opacity: config.overlay.opacity,
|
|
37
37
|
}
|
|
38
38
|
: { display: "none" };
|
|
39
|
-
return (_jsxs(_Fragment, { children: [_jsx("div", { className: "appkit-bg-renderer", style: getBackgroundStyle(), "data-section": "backgroundrenderer-div-456", children: config.type === "video" && (_jsxs("video", { ref: videoRef, autoPlay: true, loop: true, muted: true, playsInline: true, onLoadedData: () => setIsVideoLoaded(true), className: `appkit-bg-renderer__video ${isVideoLoaded
|
|
39
|
+
return (_jsxs(_Fragment, { children: ["// audit-inline-style-ok: computed style fn", _jsx("div", { className: "appkit-bg-renderer", style: getBackgroundStyle(), "data-section": "backgroundrenderer-div-456", children: config.type === "video" && (_jsxs("video", { ref: videoRef, autoPlay: true, loop: true, muted: true, playsInline: true, onLoadedData: () => setIsVideoLoaded(true), className: `appkit-bg-renderer__video ${isVideoLoaded
|
|
40
40
|
? "appkit-bg-renderer__video--loaded"
|
|
41
|
-
: "appkit-bg-renderer__video--loading"}`, children: [_jsx("source", { src: config.value, type: "video/mp4" }), "Your browser does not support the video tag."] })) })
|
|
41
|
+
: "appkit-bg-renderer__video--loading"}`, children: [_jsx("source", { src: config.value, type: "video/mp4" }), "Your browser does not support the video tag."] })) })
|
|
42
|
+
// audit-inline-style-ok: pass-through style prop
|
|
43
|
+
, "// audit-inline-style-ok: pass-through style prop", _jsx("div", { className: "appkit-bg-renderer__overlay", style: overlayStyle })] }));
|
|
42
44
|
}
|
|
@@ -53,9 +53,13 @@ export function Card({ children, variant = "flat", padding = "md", hover = false
|
|
|
53
53
|
const whileTap = animate === "pressScale" || animate === "both"
|
|
54
54
|
? { scale: 0.97 }
|
|
55
55
|
: undefined;
|
|
56
|
-
return (_jsx(motion.div, { className: cls,
|
|
56
|
+
return (_jsx(motion.div, { className: cls,
|
|
57
|
+
// audit-inline-style-ok: pass-through style prop
|
|
58
|
+
style: style, onClick: onClick, whileHover: whileHover, whileTap: whileTap, transition: SPRING_SNAPPY, "data-section": "card-div-463", children: children }));
|
|
57
59
|
}
|
|
58
|
-
return (_jsx("div", { className: cls,
|
|
60
|
+
return (_jsx("div", { className: cls,
|
|
61
|
+
// audit-inline-style-ok: pass-through style prop
|
|
62
|
+
style: style, onClick: onClick, "data-section": "card-div-463", children: children }));
|
|
59
63
|
}
|
|
60
64
|
export function CardHeader({ children, className = "" }) {
|
|
61
65
|
return (_jsx("div", { className: ["appkit-card__header", className].filter(Boolean).join(" "), "data-section": "card-div-464", children: children }));
|
|
@@ -91,7 +91,9 @@ export default function ImageGallery({ images, initialIndex = 0, showThumbnails
|
|
|
91
91
|
if (images.length === 0) {
|
|
92
92
|
return (_jsx("div", { className: `appkit-image-gallery ${flex.center} p-8 ${themed.bgTertiary} rounded-lg ${className}`, "data-section": "imagegallery-div-515", children: _jsx(Text, { className: themed.textMuted, children: "No images to display" }) }));
|
|
93
93
|
}
|
|
94
|
-
return (_jsxs("div", { className: `appkit-image-gallery ${className}`, "data-section": "imagegallery-div-516", children: [_jsxs("div", { ref: imageContainerRef, className: `appkit-image-gallery__viewport ${themed.bgSecondary}`, "data-section": "imagegallery-div-517", children: [_jsxs("div", { className: "appkit-image-gallery__image-frame", "data-section": "imagegallery-div-518", children: [_jsx("div", { role: "img", "aria-label": currentImage.alt, className: "appkit-image-gallery__image",
|
|
94
|
+
return (_jsxs("div", { className: `appkit-image-gallery ${className}`, "data-section": "imagegallery-div-516", children: [_jsxs("div", { ref: imageContainerRef, className: `appkit-image-gallery__viewport ${themed.bgSecondary}`, "data-section": "imagegallery-div-517", children: [_jsxs("div", { className: "appkit-image-gallery__image-frame", "data-section": "imagegallery-div-518", children: [_jsx("div", { role: "img", "aria-label": currentImage.alt, className: "appkit-image-gallery__image",
|
|
95
|
+
// audit-inline-style-ok: dynamic CSS
|
|
96
|
+
style: {
|
|
95
97
|
backgroundImage: `url(${currentImage.src})`,
|
|
96
98
|
transform: `scale(${scale})`,
|
|
97
99
|
cursor: allowZoom
|
|
@@ -89,7 +89,9 @@ export function ImageLightbox({ images, activeIndex, onClose, onNavigate, showTh
|
|
|
89
89
|
const image = images[currentIndex];
|
|
90
90
|
const hasMultiple = images.length > 1;
|
|
91
91
|
const iconBtnClass = "w-10 h-10 p-0 !min-h-0 rounded-full bg-white/15 hover:bg-white/30 text-white flex items-center justify-center";
|
|
92
|
-
return createPortal(_jsxs("div", { ref: overlayRef, tabIndex: -1, className: "appkit-lightbox", role: "dialog", "aria-modal": "true", "aria-label": "Image lightbox", onKeyDown: handleKeyDown, onWheel: handleWheel, children: [_jsxs("div", { className: "absolute top-0 left-0 right-0 z-10 flex items-center justify-between px-4 py-3 bg-gradient-to-b from-black/60 to-transparent", children: [_jsx(Span, { size: "sm", weight: "medium", className: "text-white/70", children: hasMultiple ? `${currentIndex + 1} / ${images.length}` : "" }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Button, { variant: "ghost", size: "sm", type: "button", onClick: () => adjustZoom(-ZOOM_STEP), className: iconBtnClass, "aria-label": "Zoom out", disabled: zoom <= MIN_ZOOM, children: _jsx(ZoomOut, { className: "w-4 h-4" }) }), _jsxs("button", { type: "button", onClick: () => { setZoom(100); setRotation(0); }, className: "text-white/70 hover:text-white text-xs font-mono min-w-[3rem] text-center", "aria-label": "Reset zoom", children: [zoom, "%"] }), _jsx(Button, { variant: "ghost", size: "sm", type: "button", onClick: () => adjustZoom(ZOOM_STEP), className: iconBtnClass, "aria-label": "Zoom in", disabled: zoom >= MAX_ZOOM, children: _jsx(ZoomIn, { className: "w-4 h-4" }) }), _jsx(Button, { variant: "ghost", size: "sm", type: "button", onClick: () => setRotation((r) => (r + 90) % 360), className: iconBtnClass, "aria-label": "Rotate 90\u00B0", children: _jsx(RotateCw, { className: "w-4 h-4" }) }), _jsx(Button, { variant: "ghost", size: "sm", type: "button", onClick: () => { setZoom(100); setRotation(0); }, className: iconBtnClass, "aria-label": "Reset", children: _jsx(Maximize2, { className: "w-4 h-4" }) }), _jsx(Button, { variant: "ghost", size: "sm", type: "button", onClick: onClose, className: CLS_CLOSE_BTN, "aria-label": "Close lightbox", children: _jsx(X, { className: "w-5 h-5" }) })] })] }), hasMultiple && (_jsx(Button, { variant: "ghost", size: "sm", type: "button", onClick: () => navigate(-1), className: "absolute left-4 top-1/2 -translate-y-1/2 w-12 h-12 p-0 !min-h-0 rounded-full bg-white/15 hover:bg-white/30 text-white z-10 flex items-center justify-center", "aria-label": "Previous image", children: _jsx(ChevronLeft, { className: "w-7 h-7" }) })), _jsxs("div", { className: "appkit-lightbox__image-wrap", style: { cursor: zoom > 100 ? "grab" : "default" }, children: [_jsx("img", { src: image.src, alt: image.alt ?? "", className: "appkit-lightbox__img", draggable: false,
|
|
92
|
+
return createPortal(_jsxs("div", { ref: overlayRef, tabIndex: -1, className: "appkit-lightbox", role: "dialog", "aria-modal": "true", "aria-label": "Image lightbox", onKeyDown: handleKeyDown, onWheel: handleWheel, children: [_jsxs("div", { className: "absolute top-0 left-0 right-0 z-10 flex items-center justify-between px-4 py-3 bg-gradient-to-b from-black/60 to-transparent", children: [_jsx(Span, { size: "sm", weight: "medium", className: "text-white/70", children: hasMultiple ? `${currentIndex + 1} / ${images.length}` : "" }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Button, { variant: "ghost", size: "sm", type: "button", onClick: () => adjustZoom(-ZOOM_STEP), className: iconBtnClass, "aria-label": "Zoom out", disabled: zoom <= MIN_ZOOM, children: _jsx(ZoomOut, { className: "w-4 h-4" }) }), _jsxs("button", { type: "button", onClick: () => { setZoom(100); setRotation(0); }, className: "text-white/70 hover:text-white text-xs font-mono min-w-[3rem] text-center", "aria-label": "Reset zoom", children: [zoom, "%"] }), _jsx(Button, { variant: "ghost", size: "sm", type: "button", onClick: () => adjustZoom(ZOOM_STEP), className: iconBtnClass, "aria-label": "Zoom in", disabled: zoom >= MAX_ZOOM, children: _jsx(ZoomIn, { className: "w-4 h-4" }) }), _jsx(Button, { variant: "ghost", size: "sm", type: "button", onClick: () => setRotation((r) => (r + 90) % 360), className: iconBtnClass, "aria-label": "Rotate 90\u00B0", children: _jsx(RotateCw, { className: "w-4 h-4" }) }), _jsx(Button, { variant: "ghost", size: "sm", type: "button", onClick: () => { setZoom(100); setRotation(0); }, className: iconBtnClass, "aria-label": "Reset", children: _jsx(Maximize2, { className: "w-4 h-4" }) }), _jsx(Button, { variant: "ghost", size: "sm", type: "button", onClick: onClose, className: CLS_CLOSE_BTN, "aria-label": "Close lightbox", children: _jsx(X, { className: "w-5 h-5" }) })] })] }), hasMultiple && (_jsx(Button, { variant: "ghost", size: "sm", type: "button", onClick: () => navigate(-1), className: "absolute left-4 top-1/2 -translate-y-1/2 w-12 h-12 p-0 !min-h-0 rounded-full bg-white/15 hover:bg-white/30 text-white z-10 flex items-center justify-center", "aria-label": "Previous image", children: _jsx(ChevronLeft, { className: "w-7 h-7" }) })), "// audit-inline-style-ok: dynamic CSS", _jsxs("div", { className: "appkit-lightbox__image-wrap", style: { cursor: zoom > 100 ? "grab" : "default" }, children: [_jsx("img", { src: image.src, alt: image.alt ?? "", className: "appkit-lightbox__img", draggable: false,
|
|
93
|
+
// audit-inline-style-ok: dynamic CSS
|
|
94
|
+
style: {
|
|
93
95
|
transform: `scale(${zoom / 100}) rotate(${rotation}deg)`,
|
|
94
96
|
transition: "transform 0.2s ease",
|
|
95
97
|
} }), image.badge && (_jsx(Div, { className: "absolute left-3 top-3 rounded bg-black/70 px-2 py-1 text-xs font-semibold text-white pointer-events-none", children: image.badge }))] }), (image.caption || image.sub) && (_jsxs("div", { className: "flex-shrink-0 text-center px-8 pb-2", children: [image.caption && (_jsx(Text, { size: "sm", variant: "secondary", className: "!text-white/80", children: image.caption })), image.sub && (_jsx(Text, { size: "sm", variant: "secondary", className: "!text-white/50", children: image.sub }))] })), showThumbnails && images.length > 1 && (_jsx("div", { className: "flex-shrink-0 flex gap-2 overflow-x-auto px-4 pb-3 justify-center", children: images.map((thumb, i) => (_jsx("button", { type: "button", onClick: () => {
|
|
@@ -30,5 +30,7 @@ export function PasswordStrengthIndicator({ password, minLength = 8, showRequire
|
|
|
30
30
|
: strength <= 75
|
|
31
31
|
? "bg-yellow-500"
|
|
32
32
|
: "bg-green-500";
|
|
33
|
-
return (_jsxs("div", { className: "appkit-password-strength", "aria-live": "polite", "aria-atomic": "true", "data-section": "passwordstrengthindicator-div-567", children: [_jsxs(Row, { gap: "sm", className: "mb-2", children: [_jsx("div", { className: "appkit-password-strength__track", "data-section": "passwordstrengthindicator-div-568", children: _jsx("div", { className: `appkit-password-strength__fill ${strengthColor}`,
|
|
33
|
+
return (_jsxs("div", { className: "appkit-password-strength", "aria-live": "polite", "aria-atomic": "true", "data-section": "passwordstrengthindicator-div-567", children: [_jsxs(Row, { gap: "sm", className: "mb-2", children: [_jsx("div", { className: "appkit-password-strength__track", "data-section": "passwordstrengthindicator-div-568", children: _jsx("div", { className: `appkit-password-strength__fill ${strengthColor}`,
|
|
34
|
+
// audit-inline-style-ok: computed percentage
|
|
35
|
+
style: { width: `${strength}%` }, role: "progressbar", "aria-valuenow": Math.round(strength), "aria-valuemin": 0, "aria-valuemax": 100, "aria-label": `Password strength: ${strengthLabel}` }) }), _jsx(Span, { className: "appkit-password-strength__label", children: strengthLabel })] }), showRequirements ? (_jsx(Ul, { className: "appkit-password-strength__requirements", children: requirements.map((req) => (_jsxs(Li, { className: `appkit-password-strength__requirement ${req.met ? "appkit-password-strength__requirement--met" : ""}`, children: [_jsx(Span, { className: "sr-only", children: req.met ? "Met: " : "Not met: " }), req.label] }, req.label))) })) : null] }));
|
|
34
36
|
}
|
|
@@ -13,7 +13,9 @@ export function Progress({ value, max = 100, variant = "primary", size = "md", l
|
|
|
13
13
|
warning: "appkit-progress__bar--warning",
|
|
14
14
|
error: "appkit-progress__bar--error",
|
|
15
15
|
};
|
|
16
|
-
return (_jsxs("div", { className: `appkit-progress ${className}`, "data-section": "progress-div-569", children: [(label || showValue) && (_jsxs("div", { className: "appkit-progress__meta", "data-section": "progress-div-570", children: [label && _jsx(Span, { className: "appkit-progress__label", children: label }), showValue && (_jsxs(Span, { className: "appkit-progress__value", children: [Math.round(percentage), "%"] }))] })), _jsx("div", { className: `appkit-progress__track ${sizeClasses[size]}`, role: "progressbar", "aria-valuenow": value, "aria-valuemin": 0, "aria-valuemax": max, "aria-label": label || `Progress: ${Math.round(percentage)}%`, "data-section": "progress-div-571", children: _jsx("div", { className: `appkit-progress__bar ${variantClasses[variant]}`,
|
|
16
|
+
return (_jsxs("div", { className: `appkit-progress ${className}`, "data-section": "progress-div-569", children: [(label || showValue) && (_jsxs("div", { className: "appkit-progress__meta", "data-section": "progress-div-570", children: [label && _jsx(Span, { className: "appkit-progress__label", children: label }), showValue && (_jsxs(Span, { className: "appkit-progress__value", children: [Math.round(percentage), "%"] }))] })), _jsx("div", { className: `appkit-progress__track ${sizeClasses[size]}`, role: "progressbar", "aria-valuenow": value, "aria-valuemin": 0, "aria-valuemax": max, "aria-label": label || `Progress: ${Math.round(percentage)}%`, "data-section": "progress-div-571", children: _jsx("div", { className: `appkit-progress__bar ${variantClasses[variant]}`,
|
|
17
|
+
// audit-inline-style-ok: computed percentage
|
|
18
|
+
style: { width: `${percentage}%` } }) })] }));
|
|
17
19
|
}
|
|
18
20
|
export function IndeterminateProgress({ variant = "primary", size = "md", label, className = "", }) {
|
|
19
21
|
const sizeClasses = {
|
|
@@ -27,5 +29,7 @@ export function IndeterminateProgress({ variant = "primary", size = "md", label,
|
|
|
27
29
|
warning: "appkit-progress__bar--warning",
|
|
28
30
|
error: "appkit-progress__bar--error",
|
|
29
31
|
};
|
|
30
|
-
return (_jsxs("div", { className: `appkit-progress ${className}`, "data-section": "progress-div-572", children: [label && (_jsx(Span, { className: "appkit-progress__label appkit-progress__label--block", children: label })), _jsx("div", { className: `appkit-progress__track appkit-progress__track--indeterminate ${sizeClasses[size]}`, role: "progressbar", "aria-label": label || "Loading...", "data-section": "progress-div-573", children: _jsx("div", { className: `appkit-progress__bar appkit-progress__bar--indeterminate ${variantClasses[variant]}`,
|
|
32
|
+
return (_jsxs("div", { className: `appkit-progress ${className}`, "data-section": "progress-div-572", children: [label && (_jsx(Span, { className: "appkit-progress__label appkit-progress__label--block", children: label })), _jsx("div", { className: `appkit-progress__track appkit-progress__track--indeterminate ${sizeClasses[size]}`, role: "progressbar", "aria-label": label || "Loading...", "data-section": "progress-div-573", children: _jsx("div", { className: `appkit-progress__bar appkit-progress__bar--indeterminate ${variantClasses[variant]}`,
|
|
33
|
+
// audit-inline-style-ok: dynamic CSS
|
|
34
|
+
style: { width: "40%" } }) })] }));
|
|
31
35
|
}
|
|
@@ -38,7 +38,9 @@ export function RowActionMenu({ actions, align = "right", }) {
|
|
|
38
38
|
setOpen((v) => !v);
|
|
39
39
|
}, [open, align]);
|
|
40
40
|
const dropdown = open && pos && mounted
|
|
41
|
-
? createPortal(_jsx("div", { ref: dropdownRef, role: "menu", className: "appkit-row-action-menu__dropdown",
|
|
41
|
+
? createPortal(_jsx("div", { ref: dropdownRef, role: "menu", className: "appkit-row-action-menu__dropdown",
|
|
42
|
+
// audit-inline-style-ok: dynamic CSS
|
|
43
|
+
style: {
|
|
42
44
|
position: "fixed",
|
|
43
45
|
zIndex: "var(--appkit-z-modal)",
|
|
44
46
|
top: pos.top,
|
|
@@ -14,5 +14,11 @@ export function SiteLogo({ className = "h-7", title = "LetItRip.in", variant = "
|
|
|
14
14
|
_jsx("img", { src: src, alt: title, "data-testid": "site-logo", className: `block w-auto object-contain ${className}` }));
|
|
15
15
|
}
|
|
16
16
|
const fill = variant === "gradient" ? `url(#${GRADIENT_ID})` : "currentColor";
|
|
17
|
-
return (_jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 214 56", role: "img", "aria-label": title, "data-testid": "site-logo", className: `block w-auto ${className}`, children: [_jsx("title", { children: title }), variant === "gradient" && (_jsx("defs", { children: _jsxs("linearGradient", { id: GRADIENT_ID, x1: "0%", y1: "0%", x2: "100%", y2: "0%", children: [_jsx("stop", { offset: "0%",
|
|
17
|
+
return (_jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 214 56", role: "img", "aria-label": title, "data-testid": "site-logo", className: `block w-auto ${className}`, children: [_jsx("title", { children: title }), variant === "gradient" && (_jsx("defs", { children: _jsxs("linearGradient", { id: GRADIENT_ID, x1: "0%", y1: "0%", x2: "100%", y2: "0%", children: [_jsx("stop", { offset: "0%",
|
|
18
|
+
// audit-inline-style-ok: SVG gradient stop
|
|
19
|
+
style: { stopColor: "var(--appkit-color-primary-700, #1343de)" } }), _jsx("stop", { offset: "55%",
|
|
20
|
+
// audit-inline-style-ok: SVG gradient stop
|
|
21
|
+
style: { stopColor: "var(--appkit-color-cobalt, #3570fc)" } }), _jsx("stop", { offset: "100%",
|
|
22
|
+
// audit-inline-style-ok: SVG gradient stop
|
|
23
|
+
style: { stopColor: "var(--appkit-color-secondary-400, #84e122)" } })] }) })), _jsx("text", { x: "0", y: "44", fontFamily: "ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif", fontWeight: "800", fontSize: "44", letterSpacing: "-1.5", fill: fill, children: "LetItRip" }), _jsx("rect", { x: "169", y: "5", width: "43", height: "21", rx: "10.5", fill: fill, opacity: "0.12" }), _jsx("text", { x: "174", y: "21", fontFamily: "ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif", fontWeight: "700", fontSize: "15", letterSpacing: "0.2", fill: fill, children: ".in" })] }));
|
|
18
24
|
}
|
|
@@ -17,5 +17,7 @@ export function Skeleton({ variant = "text", width, height, className = "", anim
|
|
|
17
17
|
width: width ?? defaultSize.width,
|
|
18
18
|
height: height ?? defaultSize.height,
|
|
19
19
|
};
|
|
20
|
-
return (_jsx("div", { className: `appkit-skeleton ${variantClass} ${animationClass} ${className}`,
|
|
20
|
+
return (_jsx("div", { className: `appkit-skeleton ${variantClass} ${animationClass} ${className}`,
|
|
21
|
+
// audit-inline-style-ok: pass-through style prop
|
|
22
|
+
style: style, role: "status", "aria-label": "Loading", "data-section": "skeleton-div-606", children: _jsx("span", { className: "appkit-sr-only", children: "Loading..." }) }));
|
|
21
23
|
}
|
|
@@ -30,7 +30,9 @@ export function Slider({ value: controlledValue, defaultValue = 0, min = 0, max
|
|
|
30
30
|
].join(" "), "data-section": "slider-div-610", children: _jsx("div", { className: [
|
|
31
31
|
"h-full rounded-full bg-lime-600 dark:bg-pink-500",
|
|
32
32
|
SIZE_CLASSES[size],
|
|
33
|
-
].join(" "),
|
|
33
|
+
].join(" "),
|
|
34
|
+
// audit-inline-style-ok: computed percentage
|
|
35
|
+
style: { width: `${Math.max(0, Math.min(100, percentage))}%` } }) }), _jsx("input", { id: inputId, type: "range", min: min, max: max, step: step, value: value, disabled: disabled, onChange: handleChange, onMouseUp: handleChangeEnd, onTouchEnd: handleChangeEnd, className: [
|
|
34
36
|
"appkit-slider relative z-10 bg-transparent",
|
|
35
37
|
disabled ? "appkit-slider--disabled" : "cursor-pointer",
|
|
36
38
|
SIZE_CLASSES[size],
|
|
@@ -42,7 +42,9 @@ export function TabStrip({ tabs, activeKey, onChange, minTabWidth = FLUID_GRID_M
|
|
|
42
42
|
}
|
|
43
43
|
}, [activeKey, scrollOffset, visibleCount, tabs, setScrollOffset]);
|
|
44
44
|
const visible = tabs.slice(scrollOffset, scrollOffset + visibleCount);
|
|
45
|
-
return (_jsxs("div", { ref: containerRef, role: "tablist", className: ["appkit-tab-strip", className ?? ""].join(" ").trim(), children: [hasOverflow && (_jsx("button", { type: "button", onClick: scrollLeft, disabled: !canScrollLeft, "aria-label": "Previous tabs", className: "appkit-tab-strip__arrow", children: "\u2039" })), visible.map((tab) => (_jsxs("button", { type: "button", role: "tab", "aria-selected": tab.key === activeKey, "aria-disabled": tab.disabled, onClick: () => !tab.disabled && onChange(tab.key),
|
|
45
|
+
return (_jsxs("div", { ref: containerRef, role: "tablist", className: ["appkit-tab-strip", className ?? ""].join(" ").trim(), children: [hasOverflow && (_jsx("button", { type: "button", onClick: scrollLeft, disabled: !canScrollLeft, "aria-label": "Previous tabs", className: "appkit-tab-strip__arrow", children: "\u2039" })), visible.map((tab) => (_jsxs("button", { type: "button", role: "tab", "aria-selected": tab.key === activeKey, "aria-disabled": tab.disabled, onClick: () => !tab.disabled && onChange(tab.key),
|
|
46
|
+
// audit-inline-style-ok: computed pixel offset
|
|
47
|
+
style: { minWidth: `${minTabWidth}px` }, className: [
|
|
46
48
|
"appkit-tab-strip__tab",
|
|
47
49
|
tab.key === activeKey
|
|
48
50
|
? "appkit-tab-strip__tab--active"
|